summaryrefslogtreecommitdiff
path: root/grc/python/Generator.py
diff options
context:
space:
mode:
Diffstat (limited to 'grc/python/Generator.py')
-rw-r--r--grc/python/Generator.py62
1 files changed, 57 insertions, 5 deletions
diff --git a/grc/python/Generator.py b/grc/python/Generator.py
index 98b671dde5..98fbd0c360 100644
--- a/grc/python/Generator.py
+++ b/grc/python/Generator.py
@@ -128,14 +128,19 @@ class TopBlockGenerator(object):
# if self._generate_options == 'wx_gui' and 'darwin' in sys.platform.lower():
# python_exe = 'pythonw'
+ def args_to_string(args):
+ """Accounts for spaces in args"""
+ return ' '.join(repr(arg) if ' ' in arg else arg for arg in args)
+
# setup the command args to run
cmds = [python_exe, '-u', self.get_file_path()] # -u is unbuffered stdio
# when in no gui mode on linux, use a graphical terminal (looks nice)
xterm_executable = find_executable(XTERM_EXECUTABLE)
if self._generate_options == 'no_gui' and xterm_executable:
- cmds = [xterm_executable, '-e'] + cmds
+ cmds = [xterm_executable, '-e', args_to_string(cmds)]
+ Messages.send_start_exec(args_to_string(cmds))
p = subprocess.Popen(
args=cmds, stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
shell=False, universal_newlines=True)
@@ -166,18 +171,65 @@ class TopBlockGenerator(object):
except:
pass
return code
+
blocks = expr_utils.sort_objects(
- self._flow_graph.get_enabled_blocks(),
+ filter(lambda b: b.get_enabled() and not b.get_bypassed(), self._flow_graph.get_blocks()),
lambda b: b.get_id(), _get_block_sort_text
)
- # list of regular blocks (all blocks minus the special ones)
+ # List of regular blocks (all blocks minus the special ones)
blocks = filter(lambda b: b not in (imports + parameters), blocks)
- # list of connections where each endpoint is enabled (sorted by domains, block names)
- connections = filter(lambda c: not (c.is_bus() or c.is_msg()), self._flow_graph.get_enabled_connections())
+
+ # Filter out virtual sink connections
+ cf = lambda c: not (c.is_bus() or c.is_msg() or c.get_sink().get_parent().is_virtual_sink())
+ connections = filter(cf, self._flow_graph.get_enabled_connections())
+
+ # Get the virtual blocks and resolve their conenctions
+ virtual = filter(lambda c: c.get_source().get_parent().is_virtual_source(), connections)
+ for connection in virtual:
+ source = connection.get_source().resolve_virtual_source()
+ sink = connection.get_sink()
+ resolved = self._flow_graph.get_parent().Connection(flow_graph=self._flow_graph, porta=source, portb=sink)
+ connections.append(resolved)
+ # Remove the virtual connection
+ connections.remove(connection)
+
+ # Bypassing blocks: Need to find all the enabled connections for the block using
+ # the *connections* object rather than get_connections(). Create new connections
+ # that bypass the selected block and remove the existing ones. This allows adjacent
+ # bypassed blocks to see the newly created connections to downstream blocks,
+ # allowing them to correctly construct bypass connections.
+ bypassed_blocks = self._flow_graph.get_bypassed_blocks()
+ for block in bypassed_blocks:
+ # Get the upstream connection (off of the sink ports)
+ # Use *connections* not get_connections()
+ get_source_connection = lambda c: c.get_sink() == block.get_sinks()[0]
+ source_connection = filter(get_source_connection, connections)
+ # The source connection should never have more than one element.
+ assert (len(source_connection) == 1)
+
+ # Get the source of the connection.
+ source_port = source_connection[0].get_source()
+
+ # Loop through all the downstream connections
+ get_sink_connections = lambda c: c.get_source() == block.get_sources()[0]
+ for sink in filter(get_sink_connections, connections):
+ if not sink.get_enabled():
+ # Ignore disabled connections
+ continue
+ sink_port = sink.get_sink()
+ connection = self._flow_graph.get_parent().Connection(flow_graph=self._flow_graph, porta=source_port, portb=sink_port)
+ connections.append(connection)
+ # Remove this sink connection
+ connections.remove(sink)
+ # Remove the source connection
+ connections.remove(source_connection[0])
+
+ # List of connections where each endpoint is enabled (sorted by domains, block names)
connections.sort(key=lambda c: (
c.get_source().get_domain(), c.get_sink().get_domain(),
c.get_source().get_parent().get_id(), c.get_sink().get_parent().get_id()
))
+
connection_templates = self._flow_graph.get_parent().get_connection_templates()
msgs = filter(lambda c: c.is_msg(), self._flow_graph.get_enabled_connections())
# list of variable names