summaryrefslogtreecommitdiff
path: root/grc/python
diff options
context:
space:
mode:
authorSebastian Koslowski <koslowski@kit.edu>2013-11-26 14:01:20 +0100
committerSebastian Koslowski <koslowski@kit.edu>2013-11-29 12:37:12 +0100
commitac2babe9d2a7992f5fcfc97d8606329e76c1666e (patch)
tree173edcab71c46f1ea728a58c05d670a931cf3baf /grc/python
parent549b060f2d8f7636cd7f9053e93eb279e93c662a (diff)
grc: rewrite of nports code (WIP)
Diffstat (limited to 'grc/python')
-rw-r--r--grc/python/Block.py85
-rw-r--r--grc/python/Port.py48
-rw-r--r--grc/python/flow_graph.tmpl2
3 files changed, 62 insertions, 73 deletions
diff --git a/grc/python/Block.py b/grc/python/Block.py
index d8aabd2867..74011e5f51 100644
--- a/grc/python/Block.py
+++ b/grc/python/Block.py
@@ -97,73 +97,28 @@ class Block(_Block, _GUIBlock):
"""
_Block.rewrite(self)
- def rectify(ports):
- #restore integer contiguity after insertion
- #rectify the port names with the index
- self.back_ofthe_bus(ports);
- current_master_port_name = '' # name of the currently expanded master port
- n = 0 # master port index
- for i, port in enumerate(ports):
- port._key = str(i)
- port._name = port._n['name']
- if port.get_nports() > 1 and not port._type == 'bus':
- n = n + 1 if port._name == current_master_port_name else 0 # next master port --> reset.
- current_master_port_name = port._name # remember last master port name
- port._name += str(n)
-
- def insert_port(get_ports, get_port, key):
- prev_port = get_port(str(int(key)-1))
- get_ports().insert(
- get_ports().index(prev_port)+1,
- prev_port.copy(new_key=key),
- )
- rectify(get_ports())
-
- def remove_port(get_ports, get_port, key):
- port = get_port(key)
- for connection in port.get_connections():
- self.get_parent().remove_element(connection)
- get_ports().remove(port)
- rectify(get_ports())
-
- def get_master_ports(get_ports):
- port_basenames = set()
- master_ports = list()
- for p in get_ports():
- base_n = ''.join([c for c in p._name if not c.isdigit()])
- if not base_n in port_basenames:
- master_ports.append(p)
- port_basenames.add(base_n)
- return master_ports
-
#adjust nports
- for get_ports, get_port in (
- (self.get_sources, self.get_source),
- (self.get_sinks, self.get_sink),
- ):
- master_ports2 = get_master_ports(get_ports)
- master_ports = filter(lambda p: p.get_nports(), get_ports())
- assert master_ports == master_ports2
- for i, master_port in enumerate(master_ports):
- nports = master_port.get_nports()
- if not nports:
- continue
- index_first = get_ports().index(master_port)
- try: index_last = get_ports().index(master_ports[i+1])
- except IndexError: index_last = len(get_ports())
- num_ports = index_last - index_first
- #do nothing if nports is already num ports
- if nports == num_ports: continue
- #remove excess ports and connections
- if nports < num_ports:
- for key in reversed(map(str, range(index_first+nports, index_first+num_ports))):
- remove_port(get_ports, get_port, key);
- continue
- #add more ports
- if nports > num_ports:
- for key in map(str, range(index_first+num_ports, index_first+nports)):
- insert_port(get_ports, get_port, key)
+ for ports in (self.get_sources(), self.get_sinks()):
+ for i, master_port in enumerate(ports):
+ nports = master_port.get_nports() or 1
+ num_ports = 1 + len(master_port.get_clones())
+ if not nports and num_ports == 1: # no/former master port? skip
continue
+ # remove excess ports
+ for port in master_port.get_clones()[nports-1:]:
+ # remove excess connections
+ for connection in port.get_connections():
+ self.get_parent().remove_element(connection)
+ master_port.remove_duplicate(port)
+ ports.remove(port)
+ # add more ports
+ for i in range(num_ports, nports):
+ port = master_port.add_clone()
+ ports.insert(ports.index(master_port) + i, port)
+
+ self.back_ofthe_bus(ports)
+ for i, port in enumerate(filter(lambda p: p.get_key().isdigit(), ports)):
+ port._key = str(i)
def port_controller_modify(self, direction):
"""
diff --git a/grc/python/Port.py b/grc/python/Port.py
index 5f1247ce45..f664204e85 100644
--- a/grc/python/Port.py
+++ b/grc/python/Port.py
@@ -92,6 +92,7 @@ class Port(_Port, _GUIPort):
"""
self._n = n
if n['type'] == 'msg': n['key'] = 'msg'
+ if n['type'] == 'message': n['key'] = n['name']
if dir == 'source' and not n.find('key'):
n['key'] = str(block._source_count)
block._source_count += 1
@@ -109,6 +110,7 @@ class Port(_Port, _GUIPort):
self._nports = n.find('nports') or ''
self._vlen = n.find('vlen') or ''
self._optional = bool(n.find('optional'))
+ self._clones = [] # references to cloned ports (for nports > 1)
def get_types(self): return Constants.TYPE_TO_SIZEOF.keys()
@@ -183,8 +185,8 @@ class Port(_Port, _GUIPort):
the number of ports or 1
"""
nports = self.get_parent().resolve_dependencies(self._nports)
- #return blank if nports is blank
- if not nports: return ''
+ if not nports: # return blank if nports is blank
+ return ''
try:
return max(1, int(self.get_parent().get_parent().evaluate(nports)))
except:
@@ -215,9 +217,41 @@ class Port(_Port, _GUIPort):
return '#%.2x%.2x%.2x'%(r, g, b)
except: return _Port.get_color(self)
- def copy(self, new_key=None):
+ def get_clones(self):
+ """
+ Get clones of this master port
+ """
+ return self._clones
+
+ def add_clone(self):
+ """
+ Create a clone of this (master) port and store it internally
+ This clone will have the same key. The name get an index
+ If this is the first clone, this (master) port will get a 0 appended to its name
+
+ Returns:
+ the newly create clone
+ """
+ if not self._clones: # add index to master port name
+ self._name = self._n['name'] + '0'
+ if not self._key.isdigit():
+ self._n['key'] = self._name
+
+ # Prepare a copy of the odict for the clone
n = self._n.copy()
- #remove nports from the key so the copy cannot be a duplicator
- if n.has_key('nports'): n.pop('nports')
- if new_key: n['key'] = new_key
- return self.__class__(self.get_parent(), n, self._dir)
+ if 'nports' in n: n.pop('nports') # remove nports from the key so the copy cannot be a duplicator
+ n['name'] = self._n['name'] + str(len(self._clones) + 1)
+ n['key'] = '99999' if self._key.isdigit() else n['name']
+
+ port = self.__class__(self.get_parent(), n, self._dir)
+ self._clones.append(port)
+ return port
+
+ def remove_duplicate(self, port):
+ """
+ Remove a cloned port from the internal list
+ Remove to index 0 of the master port name if there are no more clones
+ """
+ self._clones.remove(port)
+ if not self._clones:
+ self._name = self._n['key'] = self._n['name']
diff --git a/grc/python/flow_graph.tmpl b/grc/python/flow_graph.tmpl
index cf13317d1d..c18245e819 100644
--- a/grc/python/flow_graph.tmpl
+++ b/grc/python/flow_graph.tmpl
@@ -216,7 +216,7 @@ gr.io_signaturev($(len($io_sigs)), $(len($io_sigs)), [$(', '.join($size_strs))])
#for $msg in $messages2
#set $sr = $msg.get_source()
#set $source = "self.%s"%($sr.get_parent().get_id())
- #set $source_port = $sr.get_name();
+ #set $source_port = $sr.get_key();
#if $sr.get_parent().get_key() == "pad_source"
#set $source = "self"
#set $source_port = $sr.get_parent().get_param("label").get_value();