summaryrefslogtreecommitdiff
path: root/grc/core/Port.py
diff options
context:
space:
mode:
Diffstat (limited to 'grc/core/Port.py')
-rw-r--r--grc/core/Port.py107
1 files changed, 56 insertions, 51 deletions
diff --git a/grc/core/Port.py b/grc/core/Port.py
index 6a8f484082..9a33c5c506 100644
--- a/grc/core/Port.py
+++ b/grc/core/Port.py
@@ -17,7 +17,10 @@ along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
"""
-from .Constants import DEFAULT_DOMAIN, GR_STREAM_DOMAIN, GR_MESSAGE_DOMAIN
+from __future__ import absolute_import
+
+from six.moves import filter
+
from .Element import Element
from . import Constants
@@ -30,7 +33,7 @@ def _get_source_from_virtual_sink_port(vsp):
"""
try:
return _get_source_from_virtual_source_port(
- vsp.get_enabled_connections()[0].get_source())
+ vsp.get_enabled_connections()[0].source_port)
except:
raise Exception('Could not resolve source for virtual sink port {}'.format(vsp))
@@ -40,20 +43,20 @@ 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.get_parent().is_virtual_source():
+ if not vsp.parent.is_virtual_source():
return vsp
if vsp in traversed:
raise Exception('Loop found when resolving virtual source {}'.format(vsp))
try:
return _get_source_from_virtual_source_port(
_get_source_from_virtual_sink_port(
- 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( # Get all enabled blocks that are also virtual sinks
+ list(filter( # Get all virtual sinks with a matching stream id
+ lambda vs: vs.get_param('stream_id').get_value() == vsp.parent.get_param('stream_id').get_value(),
+ list(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_sinks()[0]
+ vsp.parent.parent.get_enabled_blocks(),
+ )),
+ ))[0].get_sinks()[0]
), traversed + [vsp],
)
except:
@@ -68,7 +71,7 @@ def _get_sink_from_virtual_source_port(vsp):
try:
# Could have many connections, but use first
return _get_sink_from_virtual_sink_port(
- vsp.get_enabled_connections()[0].get_sink())
+ vsp.get_enabled_connections()[0].sink_port)
except:
raise Exception('Could not resolve source for virtual source port {}'.format(vsp))
@@ -78,7 +81,7 @@ def _get_sink_from_virtual_sink_port(vsp, traversed=[]):
Recursively resolve sink ports over the virtual connections.
Keep track of traversed sinks to avoid recursive loops.
"""
- if not vsp.get_parent().is_virtual_sink():
+ if not vsp.parent.is_virtual_sink():
return vsp
if vsp in traversed:
raise Exception('Loop found when resolving virtual sink {}'.format(vsp))
@@ -86,11 +89,11 @@ def _get_sink_from_virtual_sink_port(vsp, traversed=[]):
return _get_sink_from_virtual_sink_port(
_get_sink_from_virtual_source_port(
filter( # Get all virtual source with a matching stream id
- lambda vs: vs.get_param('stream_id').get_value() == vsp.get_parent().get_param('stream_id').get_value(),
- filter( # Get all enabled blocks that are also virtual sinks
+ lambda vs: vs.get_param('stream_id').get_value() == vsp.parent.get_param('stream_id').get_value(),
+ list(filter( # Get all enabled blocks that are also virtual sinks
lambda b: b.is_virtual_source(),
- vsp.get_parent().get_parent().get_enabled_blocks(),
- ),
+ vsp.parent.parent.get_enabled_blocks(),
+ )),
)[0].get_sources()[0]
), traversed + [vsp],
)
@@ -113,31 +116,32 @@ class Port(Element):
"""
self._n = n
if n['type'] == 'message':
- n['domain'] = GR_MESSAGE_DOMAIN
+ n['domain'] = Constants.GR_MESSAGE_DOMAIN
if 'domain' not in n:
- n['domain'] = DEFAULT_DOMAIN
- elif n['domain'] == GR_MESSAGE_DOMAIN:
+ n['domain'] = Constants.DEFAULT_DOMAIN
+ elif n['domain'] == Constants.GR_MESSAGE_DOMAIN:
n['key'] = n['name']
n['type'] = 'message' # For port color
if n['type'] == 'msg':
n['key'] = 'msg'
- if not n.find('key'):
- n['key'] = str(next(block.port_counters[dir == 'source']))
+
+ n.setdefault('key', str(next(block.port_counters[dir == 'source'])))
# Build the port
- Element.__init__(self, block)
+ Element.__init__(self, parent=block)
# Grab the data
self._name = n['name']
self._key = n['key']
- self._type = n['type'] or ''
- self._domain = n['domain']
- self._hide = n.find('hide') or ''
+ self._type = n.get('type', '')
+ self._domain = n.get('domain')
+ self._hide = n.get('hide', '')
self._dir = dir
self._hide_evaluated = False # Updated on rewrite()
- self._nports = n.find('nports') or ''
- self._vlen = n.find('vlen') or ''
- self._optional = bool(n.find('optional'))
+ self._nports = n.get('nports', '')
+ self._vlen = n.get('vlen', '')
+ self._optional = bool(n.get('optional'))
+ self.di_optional = bool(n.get('optional'))
self._clones = [] # References to cloned ports (for nports > 1)
def __str__(self):
@@ -147,7 +151,7 @@ class Port(Element):
return 'Sink - {}({})'.format(self.get_name(), self.get_key())
def get_types(self):
- return Constants.TYPE_TO_SIZEOF.keys()
+ return list(Constants.TYPE_TO_SIZEOF.keys())
def is_type_empty(self):
return not self._n['type']
@@ -156,7 +160,7 @@ class Port(Element):
Element.validate(self)
if self.get_type() not in self.get_types():
self.add_error_message('Type "{}" is not a possible type.'.format(self.get_type()))
- platform = self.get_parent().get_parent().get_parent()
+ platform = self.parent.parent.parent
if self.get_domain() not in platform.domains:
self.add_error_message('Domain key "{}" is not registered.'.format(self.get_domain()))
if not self.get_enabled_connections() and not self.get_optional():
@@ -184,22 +188,22 @@ class Port(Element):
self._vlen = ''
Element.rewrite(self)
- hide = self.get_parent().resolve_dependencies(self._hide).strip().lower()
+ hide = self.parent.resolve_dependencies(self._hide).strip().lower()
self._hide_evaluated = False if hide in ('false', 'off', '0') else bool(hide)
# Update domain if was deduced from (dynamic) port type
type_ = self.get_type()
- if self._domain == GR_STREAM_DOMAIN and type_ == "message":
- self._domain = GR_MESSAGE_DOMAIN
+ if self._domain == Constants.GR_STREAM_DOMAIN and type_ == "message":
+ self._domain = Constants.GR_MESSAGE_DOMAIN
self._key = self._name
- if self._domain == GR_MESSAGE_DOMAIN and type_ != "message":
- self._domain = GR_STREAM_DOMAIN
+ if self._domain == Constants.GR_MESSAGE_DOMAIN and type_ != "message":
+ self._domain = Constants.GR_STREAM_DOMAIN
self._key = '0' # Is rectified in rewrite()
def resolve_virtual_source(self):
- if self.get_parent().is_virtual_sink():
+ if self.parent.is_virtual_sink():
return _get_source_from_virtual_sink_port(self)
- if self.get_parent().is_virtual_source():
+ if self.parent.is_virtual_source():
return _get_source_from_virtual_source_port(self)
def resolve_empty_type(self):
@@ -232,9 +236,9 @@ class Port(Element):
Returns:
the vector length or 1
"""
- vlen = self.get_parent().resolve_dependencies(self._vlen)
+ vlen = self.parent.resolve_dependencies(self._vlen)
try:
- return int(self.get_parent().get_parent().evaluate(vlen))
+ return int(self.parent.parent.evaluate(vlen))
except:
return 1
@@ -250,9 +254,9 @@ class Port(Element):
if self._nports == '':
return ''
- nports = self.get_parent().resolve_dependencies(self._nports)
+ nports = self.parent.resolve_dependencies(self._nports)
try:
- return max(1, int(self.get_parent().get_parent().evaluate(nports)))
+ return max(1, int(self.parent.parent.evaluate(nports)))
except:
return 1
@@ -321,7 +325,7 @@ class Port(Element):
n['key'] = '99999' if self._key.isdigit() else n['name']
# Clone
- port = self.__class__(self.get_parent(), n, self._dir)
+ port = self.__class__(self.parent, n, self._dir)
self._clones.append(port)
return port
@@ -341,7 +345,7 @@ class Port(Element):
def get_name(self):
number = ''
if self.get_type() == 'bus':
- busses = filter(lambda a: a._dir == self._dir, self.get_parent().get_ports_gui())
+ busses = [a for a in self.parent.get_ports_gui() if a._dir == self._dir]
number = str(busses.index(self)) + '#' + str(len(self.get_associated_ports()))
return self._name + number
@@ -357,7 +361,7 @@ class Port(Element):
return self._dir == 'source'
def get_type(self):
- return self.get_parent().resolve_dependencies(self._type)
+ return self.parent_block.resolve_dependencies(self._type)
def get_domain(self):
return self._domain
@@ -372,8 +376,8 @@ class Port(Element):
Returns:
a list of connection objects
"""
- connections = self.get_parent().get_parent().connections
- connections = filter(lambda c: c.get_source() is self or c.get_sink() is self, connections)
+ connections = self.parent_flowgraph.connections
+ connections = [c for c in connections if c.source_port is self or c.sink_port is self]
return connections
def get_enabled_connections(self):
@@ -383,22 +387,23 @@ class Port(Element):
Returns:
a list of connection objects
"""
- return filter(lambda c: c.get_enabled(), self.get_connections())
+ return [c for c in self.get_connections() if c.get_enabled()]
def get_associated_ports(self):
if not self.get_type() == 'bus':
return [self]
else:
+ flowgraph = self.parent_flowgraph
if self.is_source:
- get_ports = self.get_parent().get_sources
- bus_structure = self.get_parent().current_bus_structure['source']
+ get_ports = flowgraph.get_sources
+ bus_structure = flowgraph.current_bus_structure['source']
else:
- get_ports = self.get_parent().get_sinks
- bus_structure = self.get_parent().current_bus_structure['sink']
+ get_ports = flowgraph.get_sinks
+ bus_structure = flowgraph.current_bus_structure['sink']
ports = [i for i in get_ports() if not i.get_type() == 'bus']
if bus_structure:
busses = [i for i in get_ports() if i.get_type() == 'bus']
bus_index = busses.index(self)
- ports = filter(lambda a: ports.index(a) in bus_structure[bus_index], ports)
+ ports = [a for a in ports if ports.index(a) in bus_structure[bus_index]]
return ports