diff options
author | Sebastian Koslowski <koslowski@kit.edu> | 2013-11-26 14:01:20 +0100 |
---|---|---|
committer | Sebastian Koslowski <koslowski@kit.edu> | 2013-11-29 12:37:12 +0100 |
commit | ac2babe9d2a7992f5fcfc97d8606329e76c1666e (patch) | |
tree | 173edcab71c46f1ea728a58c05d670a931cf3baf /grc/python | |
parent | 549b060f2d8f7636cd7f9053e93eb279e93c662a (diff) |
grc: rewrite of nports code (WIP)
Diffstat (limited to 'grc/python')
-rw-r--r-- | grc/python/Block.py | 85 | ||||
-rw-r--r-- | grc/python/Port.py | 48 | ||||
-rw-r--r-- | grc/python/flow_graph.tmpl | 2 |
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(); |