summaryrefslogtreecommitdiff
path: root/grc/python/Block.py
diff options
context:
space:
mode:
Diffstat (limited to 'grc/python/Block.py')
-rw-r--r--grc/python/Block.py85
1 files changed, 20 insertions, 65 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):
"""