summaryrefslogtreecommitdiff
path: root/grc
diff options
context:
space:
mode:
authorSebastian Koslowski <koslowski@kit.edu>2016-06-18 21:16:14 -0700
committerSebastian Koslowski <koslowski@kit.edu>2016-07-13 16:33:29 +0200
commit4b60db7deaa89a998715b45e942fa0c69dd5be1a (patch)
tree304720c369be0bf78aed80fe377fb892794f9fc0 /grc
parent025c19f6a22ab3ed035cbc63787c4dcdba395faf (diff)
grc-refactor: the hopeless cause of bus ports...
Diffstat (limited to 'grc')
-rw-r--r--grc/core/Block.py107
-rw-r--r--grc/core/FlowGraph.py81
-rw-r--r--grc/core/Port.py27
-rw-r--r--grc/gui/FlowGraph.py4
4 files changed, 102 insertions, 117 deletions
diff --git a/grc/core/Block.py b/grc/core/Block.py
index c6d743eaee..743c9de99f 100644
--- a/grc/core/Block.py
+++ b/grc/core/Block.py
@@ -578,26 +578,30 @@ class Block(Element):
Returns:
true for change
"""
- changed = False
+ type_templates = ' '.join(p._type for p in self.get_children())
type_param = None
for key, param in six.iteritems(self.params):
- children = self.get_children()
+ if not param.is_enum():
+ continue
# Priority to the type controller
- if param.key in ' '.join([p._type for p in children]): type_param = param
+ if param.key in type_templates:
+ type_param = param
+ break
# Use param if type param is unset
if not type_param:
type_param = param
- if type_param:
- # Try to increment the enum by direction
- try:
- keys = type_param.get_option_keys()
- old_index = keys.index(type_param.get_value())
- new_index = (old_index + direction + len(keys)) % len(keys)
- type_param.set_value(keys[new_index])
- changed = True
- except:
- pass
- return changed
+ if not type_param:
+ return False
+
+ # Try to increment the enum by direction
+ try:
+ keys = type_param.get_option_keys()
+ old_index = keys.index(type_param.get_value())
+ new_index = (old_index + direction + len(keys)) % len(keys)
+ type_param.set_value(keys[new_index])
+ return True
+ except:
+ return False
def port_controller_modify(self, direction):
"""
@@ -611,7 +615,7 @@ class Block(Element):
"""
changed = False
# Concat the nports string from the private nports settings of all ports
- nports_str = ' '.join([port._nports for port in self.get_ports()])
+ nports_str = ' '.join(port._nports for port in self.get_ports())
# Modify all params whose keys appear in the nports string
for key, param in six.iteritems(self.params):
if param.is_enum() or param.key not in nports_str:
@@ -682,12 +686,9 @@ class Block(Element):
##############################################
def get_bus_structure(self, direction):
- if direction == 'source':
- bus_structure = self._bus_structure_source
- else:
- bus_structure = self._bus_structure_sink
-
- bus_structure = self.resolve_dependencies(bus_structure)
+ bus_structure = self.resolve_dependencies(
+ self._bus_structure_source if direction == 'source' else
+ self._bus_structure_sink)
if not bus_structure:
return '' # TODO: Don't like empty strings. should change this to None eventually
@@ -706,70 +707,66 @@ class Block(Element):
return buslist or ports
def _import_bus_stuff(self, n):
- bussinks = n.get('bus_sink', [])
- if len(bussinks) > 0 and not self._bussify_sink:
+ bus_sinks = n.get('bus_sink', [])
+ if len(bus_sinks) > 0 and not self._bussify_sink:
self.bussify({'name': 'bus', 'type': 'bus'}, 'sink')
- elif len(bussinks) > 0:
+ elif len(bus_sinks) > 0:
self.bussify({'name': 'bus', 'type': 'bus'}, 'sink')
self.bussify({'name': 'bus', 'type': 'bus'}, 'sink')
- bussrcs = n.get('bus_source', [])
- if len(bussrcs) > 0 and not self._bussify_source:
+ bus_sources = n.get('bus_source', [])
+ if len(bus_sources) > 0 and not self._bussify_source:
self.bussify({'name': 'bus', 'type': 'bus'}, 'source')
- elif len(bussrcs) > 0:
+ elif len(bus_sources) > 0:
self.bussify({'name': 'bus', 'type': 'bus'}, 'source')
self.bussify({'name': 'bus', 'type': 'bus'}, 'source')
def form_bus_structure(self, direc):
- if direc == 'source':
- get_p = self.get_sources
- get_p_gui = self.get_sources_gui
- bus_structure = self.get_bus_structure('source')
- else:
- get_p = self.get_sinks
- get_p_gui = self.get_sinks_gui
- bus_structure = self.get_bus_structure('sink')
+ ports = self.sources if direc == 'source' else self.sinks
+ struct = self.get_bus_structure(direc)
- struct = [list(range(len(get_p())))]
- if True in [isinstance(a.get_nports(), int) for a in get_p()]:
- structlet = []
- last = 0
- for j in [i.get_nports() for i in get_p() if isinstance(i.get_nports(), int)]:
- structlet.extend([a+last for a in range(j)])
- last = structlet[-1] + 1
- struct = [structlet]
- if bus_structure:
+ if not struct:
+ struct = [list(range(len(ports)))]
- struct = bus_structure
+ elif any(isinstance(p.get_nports(), int) for p in ports):
+ last = 0
+ structlet = []
+ for port in ports:
+ nports = port.get_nports()
+ if not isinstance(nports, int):
+ continue
+ structlet.extend(a + last for a in range(nports))
+ last += nports
+ struct = [structlet]
self.current_bus_structure[direc] = struct
return struct
def bussify(self, n, direc):
if direc == 'source':
- get_p = self.get_sources
get_p_gui = self.get_sources_gui
else:
- get_p = self.get_sinks
get_p_gui = self.get_sinks_gui
- for elt in get_p():
+ ports = self.sources if direc == 'source' else self.sinks
+
+ for elt in ports:
for connect in elt.get_connections():
self.parent.remove_element(connect)
- if ('bus' not in [a.get_type() for a in get_p()]) and len(get_p()) > 0:
+ if ports and all('bus' != p.get_type() for p in ports):
struct = self.form_bus_structure(direc)
self.current_bus_structure[direc] = struct
- if get_p()[0].get_nports():
- n['nports'] = str(1)
+ if ports[0].get_nports():
+ n['nports'] = '1'
for i in range(len(struct)):
- n['key'] = str(len(get_p()))
+ n['key'] = str(len(ports))
n = dict(n)
port = self.parent.parent.Port(block=self, n=n, dir=direc)
- get_p().append(port)
- elif 'bus' in [a.get_type() for a in get_p()]:
+ ports.append(port)
+ elif any('bus' == p.get_type() for p in ports):
for elt in get_p_gui():
- get_p().remove(elt)
+ ports.remove(elt)
self.current_bus_structure[direc] = ''
def _init_bus_ports(self, n):
diff --git a/grc/core/FlowGraph.py b/grc/core/FlowGraph.py
index 53c4b783b7..16bcb3b9f6 100644
--- a/grc/core/FlowGraph.py
+++ b/grc/core/FlowGraph.py
@@ -461,52 +461,41 @@ class FlowGraph(Element):
##############################################
def bus_ports_rewrite(self):
# todo: move to block.rewrite()
- for block in self.blocks:
- for direc in ['source', 'sink']:
- if direc == 'source':
- get_p = block.get_sources
- get_p_gui = block.get_sources_gui
- bus_structure = block.form_bus_structure('source')
- else:
- get_p = block.get_sinks
- get_p_gui = block.get_sinks_gui
- bus_structure = block.form_bus_structure('sink')
-
- if 'bus' in [a.get_type() for a in get_p_gui()]:
- if len(get_p_gui()) > len(bus_structure):
- times = range(len(bus_structure), len(get_p_gui()))
- for i in times:
- for connect in get_p_gui()[-1].get_connections():
- block.parent.remove_element(connect)
- get_p().remove(get_p_gui()[-1])
- elif len(get_p_gui()) < len(bus_structure):
- n = {'name': 'bus', 'type': 'bus'}
- if any(isinstance(a.get_nports(), int) for a in get_p()):
- n['nports'] = str(1)
-
- times = range(len(get_p_gui()), len(bus_structure))
-
- for i in times:
- n['key'] = str(len(get_p()))
- n = dict(n)
- port = block.parent.parent.Port(
- block=block, n=n, dir=direc)
- get_p().append(port)
-
- if 'bus' in [a.get_type() for a in block.get_sources_gui()]:
- for i in range(len(block.get_sources_gui())):
- if len(block.get_sources_gui()[
- i].get_connections()) > 0:
- source = block.get_sources_gui()[i]
- sink = []
-
- for j in range(len(source.get_connections())):
- sink.append(
- source.get_connections()[j].sink_port)
- for elt in source.get_connections():
- self.remove_element(elt)
- for j in sink:
- self.connect(source, j)
+ def doit(block, ports, ports_gui, direc):
+ bus_structure = block.form_bus_structure(direc)
+
+ if any('bus' == a.get_type() for a in ports_gui):
+ if len(ports_gui) > len(bus_structure):
+ for _ in range(len(bus_structure), len(ports_gui)):
+ for connect in ports_gui[-1].get_connections():
+ block.parent.remove_element(connect)
+ ports.remove(ports_gui[-1])
+ elif len(ports_gui) < len(bus_structure):
+ n = {'name': 'bus', 'type': 'bus'}
+ if any(isinstance(a.get_nports(), int) for a in ports):
+ n['nports'] = str(1)
+ for _ in range(len(ports_gui), len(bus_structure)):
+ n['key'] = str(len(ports))
+ port = block.parent.parent.Port(block=block, n=dict(n), dir=direc)
+ ports.append(port)
+
+ if 'bus' in [a.get_type() for a in block.get_sources_gui()]:
+ for i in range(len(block.get_sources_gui())):
+ if not block.get_sources_gui()[i].get_connections():
+ continue
+ source = block.get_sources_gui()[i]
+ sink = []
+
+ for j in range(len(source.get_connections())):
+ sink.append(source.get_connections()[j].sink_port)
+ for elt in source.get_connections():
+ self.remove_element(elt)
+ for j in sink:
+ self.connect(source, j)
+
+ for blk in self.blocks:
+ doit(blk, blk.sources, blk.get_sources_gui(), 'source')
+ doit(blk, blk.sinks, blk.get_sinks_gui(), 'sinks')
def _update_old_message_port_keys(source_key, sink_key, source_block, sink_block):
diff --git a/grc/core/Port.py b/grc/core/Port.py
index d0362ffd78..bb1e1fa9f2 100644
--- a/grc/core/Port.py
+++ b/grc/core/Port.py
@@ -363,18 +363,17 @@ class Port(Element):
def get_associated_ports(self):
if not self.get_type() == 'bus':
return [self]
+
+ block = self.parent_block
+ if self.is_source:
+ block_ports = block.sources
+ bus_structure = block.current_bus_structure['source']
else:
- flowgraph = self.parent_flowgraph
- if self.is_source:
- get_ports = flowgraph.get_sources
- bus_structure = flowgraph.current_bus_structure['source']
- else:
- 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 = [a for a in ports if ports.index(a) in bus_structure[bus_index]]
- return ports
+ block_ports = block.sinks
+ bus_structure = block.current_bus_structure['sink']
+
+ ports = [i for i in block_ports if not i.get_type() == 'bus']
+ if bus_structure:
+ bus_index = [i for i in block_ports if i.get_type() == 'bus'].index(self)
+ ports = [p for i, p in enumerate(ports) if i in bus_structure[bus_index]]
+ return ports
diff --git a/grc/gui/FlowGraph.py b/grc/gui/FlowGraph.py
index 1c4960fed4..f6a57ef367 100644
--- a/grc/gui/FlowGraph.py
+++ b/grc/gui/FlowGraph.py
@@ -259,7 +259,7 @@ class FlowGraph(Element, _Flowgraph):
Returns:
true for change
"""
- return any([sb.type_controller_modify(direction) for sb in self.get_selected_blocks()])
+ return any(sb.type_controller_modify(direction) for sb in self.get_selected_blocks())
def port_controller_modify_selected(self, direction):
"""
@@ -271,7 +271,7 @@ class FlowGraph(Element, _Flowgraph):
Returns:
true for changed
"""
- return any([sb.port_controller_modify(direction) for sb in self.get_selected_blocks()])
+ return any(sb.port_controller_modify(direction) for sb in self.get_selected_blocks())
def enable_selected(self, enable):
"""