From 63c928575c10741ac6a6c3c3c8be9c238e7b8432 Mon Sep 17 00:00:00 2001 From: Josh Blum Date: Mon, 17 Aug 2009 00:54:11 -0700 Subject: Removed Source and Sink classes as Port subclasses. A port can be a source or a sink based on the dir parameter. --- grc/python/Port.py | 34 ++++++++++++---------------------- 1 file changed, 12 insertions(+), 22 deletions(-) (limited to 'grc/python/Port.py') diff --git a/grc/python/Port.py b/grc/python/Port.py index daf8f9ca3..f71c5fa35 100644 --- a/grc/python/Port.py +++ b/grc/python/Port.py @@ -25,17 +25,27 @@ class Port(_Port): ##possible port types TYPES = ['complex', 'float', 'int', 'short', 'byte', 'msg'] - def __init__(self, block, n): + def __init__(self, block, n, dir): """ Make a new port from nested data. @param block the parent element @param n the nested odict + @param dir the direction """ + self._n = n + if n['type'] == 'msg': n['key'] = 'msg' + if dir == 'source' and not n.find('key'): + n['key'] = str(block._source_count) + block._source_count += 1 + if dir == 'sink' and not n.find('key'): + n['key'] = str(block._sink_count) + block._sink_count += 1 #build the port _Port.__init__( self, block=block, n=n, + dir=dir, ) self._nports = n.find('nports') or '' self._vlen = n.find('vlen') or '' @@ -109,24 +119,4 @@ class Port(_Port): def copy(self, new_key=None): n = self._n.copy() if new_key: n['key'] = new_key - return self.__class__(self.get_parent(), n) - -class Source(Port): - - def __init__(self, block, n): - self._n = n #save n - if n['type'] == 'msg': n['key'] = 'msg' - if not n.find('key'): - n['key'] = str(block._source_count) - block._source_count = block._source_count + 1 - Port.__init__(self, block, n) - -class Sink(Port): - - def __init__(self, block, n): - self._n = n #save n - if n['type'] == 'msg': n['key'] = 'msg' - if not n.find('key'): - n['key'] = str(block._sink_count) - block._sink_count = block._sink_count + 1 - Port.__init__(self, block, n) + return self.__class__(self.get_parent(), n, self._dir) -- cgit From 854bed10dfb61e9f9feab5259a75e809941089ab Mon Sep 17 00:00:00 2001 From: Josh Blum Date: Wed, 26 Aug 2009 11:23:23 -0700 Subject: Added virtual sink and logic to clone port. Tweaks to the base validation routines. Validate twice in the update until rewrite functions are implemented. --- grc/python/Port.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'grc/python/Port.py') diff --git a/grc/python/Port.py b/grc/python/Port.py index f71c5fa35..bfbac7237 100644 --- a/grc/python/Port.py +++ b/grc/python/Port.py @@ -57,11 +57,25 @@ class Port(_Port): except AssertionError: self.add_error_message('Port is not connected.') try: assert self.is_source() or len(self.get_enabled_connections()) <= 1 except AssertionError: self.add_error_message('Port has too many connections.') + ################################################################ + # message port logic + ################################################################ if self.get_type() == 'msg': try: assert not self.get_nports() except AssertionError: self.add_error_message('A port of type "msg" cannot have "nports" set.') try: assert self.get_vlen() == 1 except AssertionError: self.add_error_message('A port of type "msg" must have a "vlen" of 1.') + ################################################################ + # virtual sink logic + ################################################################ + if self.get_parent().get_key() == 'virtual_sink': + if self.get_enabled_connections(): #clone type and vlen + source = self.get_enabled_connections()[0].get_source() + self._type = str(source.get_type()) + self._vlen = str(source.get_vlen()) + else: #reset type and vlen + self._type = '' + self._vlen = '' def get_vlen(self): """ -- cgit From dc9e9db16047ec589a7b0488fac04c5bb682903c Mon Sep 17 00:00:00 2001 From: Josh Blum Date: Wed, 26 Aug 2009 13:29:28 -0700 Subject: added rewrite methods to element to separate from validation logic --- grc/python/Port.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) (limited to 'grc/python/Port.py') diff --git a/grc/python/Port.py b/grc/python/Port.py index bfbac7237..dde736dba 100644 --- a/grc/python/Port.py +++ b/grc/python/Port.py @@ -57,17 +57,19 @@ class Port(_Port): except AssertionError: self.add_error_message('Port is not connected.') try: assert self.is_source() or len(self.get_enabled_connections()) <= 1 except AssertionError: self.add_error_message('Port has too many connections.') - ################################################################ - # message port logic - ################################################################ + #message port logic if self.get_type() == 'msg': try: assert not self.get_nports() except AssertionError: self.add_error_message('A port of type "msg" cannot have "nports" set.') try: assert self.get_vlen() == 1 except AssertionError: self.add_error_message('A port of type "msg" must have a "vlen" of 1.') - ################################################################ - # virtual sink logic - ################################################################ + + def rewrite(self): + """ + Handle the port cloning for virtual blocks. + """ + _Port.rewrite(self) + #virtual sink logic if self.get_parent().get_key() == 'virtual_sink': if self.get_enabled_connections(): #clone type and vlen source = self.get_enabled_connections()[0].get_source() -- cgit From 36d1520f0ac73b64bd0541b422552a6d419c7ffd Mon Sep 17 00:00:00 2001 From: Josh Blum Date: Fri, 28 Aug 2009 01:09:08 -0700 Subject: added virtual source and added stream ids, logic to clone in port --- grc/python/Port.py | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) (limited to 'grc/python/Port.py') diff --git a/grc/python/Port.py b/grc/python/Port.py index dde736dba..b386e3f89 100644 --- a/grc/python/Port.py +++ b/grc/python/Port.py @@ -69,13 +69,23 @@ class Port(_Port): Handle the port cloning for virtual blocks. """ _Port.rewrite(self) - #virtual sink logic - if self.get_parent().get_key() == 'virtual_sink': - if self.get_enabled_connections(): #clone type and vlen - source = self.get_enabled_connections()[0].get_source() + if self.get_parent().get_key() in ('virtual_sink', 'virtual_source'): + try: + if self.get_parent().get_key() == 'virtual_sink': + source = self.get_enabled_connections()[0].get_source() + if self.get_parent().get_key() == 'virtual_source': + source = filter( + lambda vs: vs.get_param('stream_id').get_value() == self.get_parent().get_param('stream_id').get_value(), + filter( + lambda b: b.get_key() == 'virtual_sink', + self.get_parent().get_parent().get_enabled_blocks(), + ), + )[0].get_sink('0').get_enabled_connections()[0].get_source() + #clone type and vlen self._type = str(source.get_type()) self._vlen = str(source.get_vlen()) - else: #reset type and vlen + except: + #reset type and vlen self._type = '' self._vlen = '' -- cgit From cadc9548afb7b4a385cea51f48745f0a1c702607 Mon Sep 17 00:00:00 2001 From: Josh Blum Date: Fri, 28 Aug 2009 18:15:49 -0700 Subject: Recursive resolution of virtual sources. Flow graph generation code working. Also, mod to fft window to use clean/nice Db/div. --- grc/python/Port.py | 45 ++++++++++++++++++++++++++++++--------------- 1 file changed, 30 insertions(+), 15 deletions(-) (limited to 'grc/python/Port.py') diff --git a/grc/python/Port.py b/grc/python/Port.py index b386e3f89..2f7af855c 100644 --- a/grc/python/Port.py +++ b/grc/python/Port.py @@ -20,6 +20,26 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA from .. base.Port import Port as _Port import Constants +def _get_source_from_virtual_sink_port(vsp): + try: return _get_source_from_virtual_source_port( + vsp.get_enabled_connections()[0].get_source()) + except: raise Exception, 'Could not resolve source for virtual sink port', vsp + +def _get_source_from_virtual_source_port(vsp): + if not vsp.is_virtual_source(): return vsp + try: return _get_source_from_virtual_source_port( + _get_source_from_virtual_sink_port( + filter( + lambda vs: vs.get_param('stream_id').get_value() == vsp.get_parent().get_param('stream_id').get_value(), + filter( + lambda b: b.get_key() == 'virtual_sink', + vsp.get_parent().get_parent().get_enabled_blocks(), + ), + )[0].get_sink(vsp.get_key()) + ) + ) + except: raise Exception, 'Could not resolve source for virtual source port', vsp + class Port(_Port): ##possible port types @@ -69,26 +89,21 @@ class Port(_Port): Handle the port cloning for virtual blocks. """ _Port.rewrite(self) - if self.get_parent().get_key() in ('virtual_sink', 'virtual_source'): - try: - if self.get_parent().get_key() == 'virtual_sink': - source = self.get_enabled_connections()[0].get_source() - if self.get_parent().get_key() == 'virtual_source': - source = filter( - lambda vs: vs.get_param('stream_id').get_value() == self.get_parent().get_param('stream_id').get_value(), - filter( - lambda b: b.get_key() == 'virtual_sink', - self.get_parent().get_parent().get_enabled_blocks(), - ), - )[0].get_sink('0').get_enabled_connections()[0].get_source() - #clone type and vlen + if self.is_virtual_sink() or self.is_virtual_source(): + try: #clone type and vlen + source = self.resolve_virtual_source() self._type = str(source.get_type()) self._vlen = str(source.get_vlen()) - except: - #reset type and vlen + except: #reset type and vlen self._type = '' self._vlen = '' + def is_virtual_sink(self): return self.get_parent().get_key() == 'virtual_sink' + def is_virtual_source(self): return self.get_parent().get_key() == 'virtual_source' + def resolve_virtual_source(self): + if self.is_virtual_sink(): return _get_source_from_virtual_sink_port(self) + if self.is_virtual_source(): return _get_source_from_virtual_source_port(self) + def get_vlen(self): """ Get the vector length. -- cgit From 5f7bd3f80387ea699649f76bd22d0be5ba08732d Mon Sep 17 00:00:00 2001 From: Josh Blum Date: Fri, 28 Aug 2009 20:39:35 -0700 Subject: avoid loops --- grc/python/Port.py | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) (limited to 'grc/python/Port.py') diff --git a/grc/python/Port.py b/grc/python/Port.py index 2f7af855c..80d9fcaae 100644 --- a/grc/python/Port.py +++ b/grc/python/Port.py @@ -21,12 +21,21 @@ from .. base.Port import Port as _Port import Constants def _get_source_from_virtual_sink_port(vsp): + """ + Resolve the source port that is connected to the given virtual sink port. + Use the get source from virtual source to recursively resolve subsequent ports. + """ try: return _get_source_from_virtual_source_port( vsp.get_enabled_connections()[0].get_source()) - except: raise Exception, 'Could not resolve source for virtual sink port', vsp + except: raise Exception, 'Could not resolve source for virtual sink port %s'%vsp -def _get_source_from_virtual_source_port(vsp): +def _get_source_from_virtual_source_port(vsp, traversed=[]): + """ + Recursively resolve source ports over the virtual connections. + Keep track of traversed sources to avoid recursive loops. + """ if not vsp.is_virtual_source(): return vsp + if vsp in traversed: raise Exception, 'Loop found when resolving virtual source %s'%vsp try: return _get_source_from_virtual_source_port( _get_source_from_virtual_sink_port( filter( @@ -36,9 +45,9 @@ def _get_source_from_virtual_source_port(vsp): vsp.get_parent().get_parent().get_enabled_blocks(), ), )[0].get_sink(vsp.get_key()) - ) + ), traversed + [vsp], ) - except: raise Exception, 'Could not resolve source for virtual source port', vsp + except: raise Exception, 'Could not resolve source for virtual source port %s'%vsp class Port(_Port): -- cgit From cb794a7c8703ea06a9bce110fc1041140f25e8e6 Mon Sep 17 00:00:00 2001 From: Josh Blum Date: Fri, 28 Aug 2009 21:06:19 -0700 Subject: made is_virtual_xxx a block level function, used by port and param classes --- grc/python/Port.py | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) (limited to 'grc/python/Port.py') diff --git a/grc/python/Port.py b/grc/python/Port.py index 80d9fcaae..d6c622c46 100644 --- a/grc/python/Port.py +++ b/grc/python/Port.py @@ -34,14 +34,14 @@ def _get_source_from_virtual_source_port(vsp, traversed=[]): Recursively resolve source ports over the virtual connections. Keep track of traversed sources to avoid recursive loops. """ - if not vsp.is_virtual_source(): return vsp + if not vsp.get_parent().is_virtual_source(): return vsp if vsp in traversed: raise Exception, 'Loop found when resolving virtual source %s'%vsp try: return _get_source_from_virtual_source_port( _get_source_from_virtual_sink_port( - filter( + filter(#get all virtual sinks with a matching stream id lambda vs: vs.get_param('stream_id').get_value() == vsp.get_parent().get_param('stream_id').get_value(), - filter( - lambda b: b.get_key() == 'virtual_sink', + filter(#get all enabled blocks that are also virtual sinks + lambda b: b.is_virtual_sink(), vsp.get_parent().get_parent().get_enabled_blocks(), ), )[0].get_sink(vsp.get_key()) @@ -98,7 +98,7 @@ class Port(_Port): Handle the port cloning for virtual blocks. """ _Port.rewrite(self) - if self.is_virtual_sink() or self.is_virtual_source(): + if self.get_parent().is_virtual_sink() or self.get_parent().is_virtual_source(): try: #clone type and vlen source = self.resolve_virtual_source() self._type = str(source.get_type()) @@ -107,11 +107,9 @@ class Port(_Port): self._type = '' self._vlen = '' - def is_virtual_sink(self): return self.get_parent().get_key() == 'virtual_sink' - def is_virtual_source(self): return self.get_parent().get_key() == 'virtual_source' def resolve_virtual_source(self): - if self.is_virtual_sink(): return _get_source_from_virtual_sink_port(self) - if self.is_virtual_source(): return _get_source_from_virtual_source_port(self) + if self.get_parent().is_virtual_sink(): return _get_source_from_virtual_sink_port(self) + if self.get_parent().is_virtual_source(): return _get_source_from_virtual_source_port(self) def get_vlen(self): """ -- cgit From 576d3978c7fafe5d6727c77281e3aad6d92074d2 Mon Sep 17 00:00:00 2001 From: Josh Blum Date: Sat, 29 Aug 2009 01:04:58 -0700 Subject: Replaced TYPES in Port and Param with types parameter. Replaced odict in options for storing options with a list. Fix virtual port check in flow graph template. --- grc/python/Port.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'grc/python/Port.py') diff --git a/grc/python/Port.py b/grc/python/Port.py index d6c622c46..3214d937a 100644 --- a/grc/python/Port.py +++ b/grc/python/Port.py @@ -49,12 +49,12 @@ def _get_source_from_virtual_source_port(vsp, traversed=[]): ) except: raise Exception, 'Could not resolve source for virtual source port %s'%vsp -class Port(_Port): +##possible port types +TYPES = ['complex', 'float', 'int', 'short', 'byte', 'msg', ''] - ##possible port types - TYPES = ['complex', 'float', 'int', 'short', 'byte', 'msg'] +class Port(_Port): - def __init__(self, block, n, dir): + def __init__(self, block, n, dir, **kwargs): """ Make a new port from nested data. @param block the parent element @@ -75,6 +75,7 @@ class Port(_Port): block=block, n=n, dir=dir, + types=TYPES, ) self._nports = n.find('nports') or '' self._vlen = n.find('vlen') or '' -- cgit From cc13a27310e4ab91ebf90ee2d9cd6e3c659e1bc0 Mon Sep 17 00:00:00 2001 From: Josh Blum Date: Sun, 30 Aug 2009 09:35:55 -0700 Subject: port and param types from an overloaded method --- grc/python/Port.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) (limited to 'grc/python/Port.py') diff --git a/grc/python/Port.py b/grc/python/Port.py index 3214d937a..a714844ef 100644 --- a/grc/python/Port.py +++ b/grc/python/Port.py @@ -49,12 +49,9 @@ def _get_source_from_virtual_source_port(vsp, traversed=[]): ) except: raise Exception, 'Could not resolve source for virtual source port %s'%vsp -##possible port types -TYPES = ['complex', 'float', 'int', 'short', 'byte', 'msg', ''] - class Port(_Port): - def __init__(self, block, n, dir, **kwargs): + def __init__(self, block, n, dir): """ Make a new port from nested data. @param block the parent element @@ -75,12 +72,13 @@ class Port(_Port): block=block, n=n, dir=dir, - types=TYPES, ) self._nports = n.find('nports') or '' self._vlen = n.find('vlen') or '' self._optional = bool(n.find('optional')) + def get_types(self): return ('complex', 'float', 'int', 'short', 'byte', 'msg', '') + def validate(self): _Port.validate(self) try: assert self.get_enabled_connections() or self.get_optional() -- cgit From 152fcbc219cd2e4f6df7b38843844bc85fdf2bc2 Mon Sep 17 00:00:00 2001 From: Josh Blum Date: Sun, 30 Aug 2009 10:34:10 -0700 Subject: Switched the python classes to inherit from the base and gui classes. Use only **kwargs so all contructor parameters must be passed with keys. Moved gui input forms classes from base to gui param module. --- grc/python/Port.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'grc/python/Port.py') diff --git a/grc/python/Port.py b/grc/python/Port.py index a714844ef..33426d905 100644 --- a/grc/python/Port.py +++ b/grc/python/Port.py @@ -18,6 +18,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA """ from .. base.Port import Port as _Port +from .. gui.Port import Port as _GUIPort import Constants def _get_source_from_virtual_sink_port(vsp): @@ -49,7 +50,7 @@ def _get_source_from_virtual_source_port(vsp, traversed=[]): ) except: raise Exception, 'Could not resolve source for virtual source port %s'%vsp -class Port(_Port): +class Port(_Port, _GUIPort): def __init__(self, block, n, dir): """ @@ -73,6 +74,7 @@ class Port(_Port): n=n, dir=dir, ) + _GUIPort.__init__(self) self._nports = n.find('nports') or '' self._vlen = n.find('vlen') or '' self._optional = bool(n.find('optional')) -- cgit From b8f69ad7ba49aa85239f6de611ddfd040344f66b Mon Sep 17 00:00:00 2001 From: Josh Blum Date: Tue, 8 Sep 2009 23:04:38 -0700 Subject: use show signal to perform initial gui update --- grc/python/Port.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'grc/python/Port.py') diff --git a/grc/python/Port.py b/grc/python/Port.py index 33426d905..6965371df 100644 --- a/grc/python/Port.py +++ b/grc/python/Port.py @@ -45,7 +45,7 @@ def _get_source_from_virtual_source_port(vsp, traversed=[]): lambda b: b.is_virtual_sink(), vsp.get_parent().get_parent().get_enabled_blocks(), ), - )[0].get_sink(vsp.get_key()) + )[0].get_sinks()[0] ), traversed + [vsp], ) except: raise Exception, 'Could not resolve source for virtual source port %s'%vsp -- cgit