diff options
-rw-r--r-- | grc/base/Block.py | 4 | ||||
-rw-r--r-- | grc/blocks/pad_sink.xml | 21 | ||||
-rw-r--r-- | grc/blocks/pad_source.xml | 31 | ||||
-rw-r--r-- | grc/python/flow_graph.tmpl | 17 | ||||
-rw-r--r-- | grc/todo.txt | 2 |
5 files changed, 67 insertions, 8 deletions
diff --git a/grc/base/Block.py b/grc/base/Block.py index 82d276567..349e71f76 100644 --- a/grc/base/Block.py +++ b/grc/base/Block.py @@ -47,7 +47,9 @@ class TemplateArg(UserDict): return self._param.get_evaluated() def _get_keys(lst): return [elem.get_key() for elem in lst] -def _get_elem(lst, key): return lst[_get_keys(lst).index(key)] +def _get_elem(lst, key): + try: return lst[_get_keys(lst).index(key)] + except ValueError: raise ValueError, 'Key "%s" not found in %s.'%(key, _get_keys(lst)) class Block(Element): diff --git a/grc/blocks/pad_sink.xml b/grc/blocks/pad_sink.xml index 477f2ad13..999de315d 100644 --- a/grc/blocks/pad_sink.xml +++ b/grc/blocks/pad_sink.xml @@ -9,6 +9,20 @@ <key>pad_sink</key> <make></make> <param> + <name>Mode</name> + <key>mode</key> + <value>hb</value> + <type>enum</type> + <option> + <name>Hierarchical</name> + <key>hb</key> + </option> + <option> + <name>Continuation</name> + <key>cont</key> + </option> + </param> + <param> <name>Num Inputs</name> <key>nports</key> <value>1</value> @@ -59,10 +73,11 @@ <nports>$nports</nports> </sink> <doc> -This is a sink pad block for creating hierarchical flow graphs. \ +Continuation Mode: +The inputs of this block can be aliased by one or more pad source blocks. + +Hierarchical Mode: The inputs of this block will become the outputs to this flow graph when it is instantiated as a hierarchical block. \ Limit one sink pad block per flow graph. - -Remember to set the generate options to hier block. </doc> </block> diff --git a/grc/blocks/pad_source.xml b/grc/blocks/pad_source.xml index b6ef2c55d..26491adb3 100644 --- a/grc/blocks/pad_source.xml +++ b/grc/blocks/pad_source.xml @@ -9,6 +9,20 @@ <key>pad_source</key> <make></make> <param> + <name>Mode</name> + <key>mode</key> + <value>hb</value> + <type>enum</type> + <option> + <name>Hierarchical</name> + <key>hb</key> + </option> + <option> + <name>Continuation</name> + <key>cont</key> + </option> + </param> + <param> <name>Num Outputs</name> <key>nports</key> <value>1</value> @@ -50,6 +64,13 @@ <value>1</value> <type>int</type> </param> + <param> + <name>Pad Sink ID</name> + <key>pad_sink_id</key> + <value>pad_sink_0</value> + <type>string</type> + <hide>#if $mode() == 'cont' then 'none' else 'all'#</hide> + </param> <check>$vlen > 0</check> <check>0 < $nports</check> <source> @@ -59,10 +80,12 @@ <nports>$nports</nports> </source> <doc> -This is a source pad block for creating hierarchical flow graphs. \ -The outputs of this block will become the inputs to this flow graph when it is instantiated as a hierarchical block. \ -Limit one source pad block per flow graph. +Continuation Mode: +The outputs of this block will alias the inputs of the pad sink specified by "pad sink id". -Remember to set the generate options to hier block. +Hierarchical Mode: +The outputs of this block will become the inputs to this flow graph when it is instantiated as a hierarchical block. \ +Limit one source pad block per flow graph. \ +The "pad sink id" will be ignored in this mode. </doc> </block> diff --git a/grc/python/flow_graph.tmpl b/grc/python/flow_graph.tmpl index df346dd16..32139636a 100644 --- a/grc/python/flow_graph.tmpl +++ b/grc/python/flow_graph.tmpl @@ -161,8 +161,20 @@ class $(class_name)(gr.hier_block2): $DIVIDER #end if #for $con in $connections + #################################################################### + ## Logic to extract source and sink + ## Special resolution logic for pad source in continuation mode + #################################################################### #set $source = $con.get_source() #set $sink = $con.get_sink() + #if $source.get_parent().get_key() == 'pad_source' and $source.get_parent().get_param('mode').get_value() == 'cont' + #set $pad_sink_id = $source.get_parent().get_param('pad_sink_id').get_evaluated() + #set $pad_sink = filter(lambda b: b.get_id() == pad_sink_id, $blocks)[0] + #set $source = $pad_sink.get_sink($source.get_key()).get_connections()[0].get_source() + #end if + #################################################################### + ## Logic to extract source and sink names + #################################################################### #if $source.get_parent().get_key() == 'pad_source' #set $source_name = 'self' #else @@ -173,7 +185,12 @@ class $(class_name)(gr.hier_block2): #else #set $sink_name = 'self.' + $sink.get_parent().get_id() #end if + #################################################################### + ## Dont make a connection for continuation pad sinks!!! + #################################################################### + #if not ($sink.get_parent().get_key() == 'pad_sink' and $sink.get_parent().get_param('mode').get_value() == 'cont') self.connect(($source_name, $source.get_key()), ($sink_name, $sink.get_key())) + #end if #end for ######################################################## diff --git a/grc/todo.txt b/grc/todo.txt index bb40e1f16..577e4c330 100644 --- a/grc/todo.txt +++ b/grc/todo.txt @@ -59,6 +59,8 @@ ################################################## # Problems ################################################## +* need a way to make an id param in the xml that will override the default + * ex: display pad sink id in continuation mode using hide tag for id param * hier block generation * auto generate hier library on changes * auto clean hier library when block removed |