From 17ff7b4104dfb415193ae961093498d451be4682 Mon Sep 17 00:00:00 2001 From: angloth <angus.lothian@hotmail.com> Date: Wed, 8 Apr 2020 22:33:34 +0200 Subject: [PATCH] Add code that allows for constructing from directly connected input to output sfg --- b_asic/signal_flow_graph.py | 62 ++++++++++++++++++++----------------- 1 file changed, 34 insertions(+), 28 deletions(-) diff --git a/b_asic/signal_flow_graph.py b/b_asic/signal_flow_graph.py index 6aedd296..2ce74725 100644 --- a/b_asic/signal_flow_graph.py +++ b/b_asic/signal_flow_graph.py @@ -67,44 +67,56 @@ class SFG(AbstractOperation): self._original_input_signals_indexes = {} self._original_output_signals_indexes = {} - # Setup input operations and signals. - for i, s in enumerate(input_signals): + # Setup input signals. + for sig_ind, sig in enumerate(input_signals): self._input_operations.append( self._add_component_copy_unconnected(Input())) - self._original_input_signals_indexes[s] = i - for i, op in enumerate(inputs, len(input_signals)): + self._original_input_signals_indexes[sig] = sig_ind + # Setup input operations, starting from indexes ater input signals. + for sig_ind, op in enumerate(inputs, len(input_signals)): self._input_operations.append( self._add_component_copy_unconnected(op)) - for s in op.output(0).signals: - self._original_input_signals_indexes[s] = i + for sig in op.output(0).signals: + self._original_input_signals_indexes[sig] = sig_ind - # Setup output operations and signals. - for i, s in enumerate(output_signals): + # Setup output signals. + for sig_ind, sig in enumerate(output_signals): self._output_operations.append( self._add_component_copy_unconnected(Output())) - self._original_output_signals_indexes[s] = i - for i, op in enumerate(outputs, len(output_signals)): + self._original_output_signals_indexes[sig] = sig_ind + # Setup output operations, starting from indexes after output signals. + for sig_ind, op in enumerate(outputs, len(output_signals)): self._output_operations.append( self._add_component_copy_unconnected(op)) - for s in op.input(0).signals: - self._original_output_signals_indexes[s] = i + for sig in op.input(0).signals: + self._original_output_signals_indexes[sig] = sig_ind + + output_operations_set = set(outputs) # Search the graph inwards from each input signal. - for s, i in self._original_input_signals_indexes.items(): - if s.destination is None: + for sig, sig_ind in self._original_input_signals_indexes.items(): + if sig.destination is None: raise ValueError( - f"Input signal #{i} is missing destination in SFG") - if s.destination.operation not in self._added_components_mapping: + f"Input signal #{sig_ind} is missing destination in SFG") + if sig.destination.operation not in self._added_components_mapping: self._copy_structure_from_operation_bfs( - s.destination.operation) + sig.destination.operation) + elif sig.destination.operation in output_operations_set: + # Add direct signal between the input and output. + new_signal = self._add_component_copy_unconnected(sig) + new_signal.set_source( + self._input_operations[sig_ind].output(0)) + new_signal.set_destination( + self._output_operations[ + self._original_output_signals_indexes[sig]].input(0)) # Search the graph inwards from each output signal. - for s, i in self._original_output_signals_indexes.items(): - if s.source is None: + for sig, sig_ind in self._original_output_signals_indexes.items(): + if sig.source is None: raise ValueError( - f"Output signal #{i} is missing source in SFG") - if s.source.operation not in self._added_components_mapping: - self._copy_structure_from_operation_bfs(s.source.operation) + f"Output signal #{sig_ind} is missing source in SFG") + if sig.source.operation not in self._added_components_mapping: + self._copy_structure_from_operation_bfs(sig.source.operation) @property def type_name(self) -> TypeName: @@ -176,7 +188,6 @@ class SFG(AbstractOperation): while op_queue: original_op = op_queue.popleft() - print("CURRENT:", original_op.name, "-------------------") # Add a copy of the operation without any connections. new_op = None if original_op not in self._added_components_mapping: @@ -271,11 +282,6 @@ class SFG(AbstractOperation): new_signal.set_destination(new_connected_op.input( original_signal.destination.index)) - print("Adding signal:", new_signal.name, - "to op:", new_connected_op.name) - print( - [inport.signals for inport in new_connected_op.inputs]) - # Add connected operation to the queue of operations to visist op_queue.append(original_connected_op) -- GitLab