From 4766320f72f505b5fe2c7f79afdd7cc583c30ee1 Mon Sep 17 00:00:00 2001 From: TheZoq2 <frans.skarman@protonmail.com> Date: Thu, 16 Feb 2023 15:48:15 +0100 Subject: [PATCH] Avoid duplicate inputs with fanout --- b_asic/signal_flow_graph.py | 5 +++-- test/test_operation.py | 2 +- test/test_sfg.py | 22 ++++++++++++++++++++++ 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/b_asic/signal_flow_graph.py b/b_asic/signal_flow_graph.py index ddeb8db7..2044a2aa 100644 --- a/b_asic/signal_flow_graph.py +++ b/b_asic/signal_flow_graph.py @@ -565,7 +565,7 @@ class SFG(AbstractOperation): @property def operations(self) -> List[Operation]: """Get all operations of this graph in depth-first order.""" - return self._operations_dfs_order + return list(self._operations_dfs_order) def find_by_type_name( self, type_name: TypeName @@ -1137,7 +1137,8 @@ class SFG(AbstractOperation): self._components_dfs_order.extend( [new_signal, source.operation] ) - self._operations_dfs_order.append(source.operation) + if not source.operation in self._operations_dfs_order: + self._operations_dfs_order.append(source.operation) # Check if the signal has not been added before. elif ( diff --git a/test/test_operation.py b/test/test_operation.py index ae7c2949..b73c6780 100644 --- a/test/test_operation.py +++ b/test/test_operation.py @@ -156,7 +156,7 @@ class TestToSfg: assert but1.evaluate(1, 1)[0] == but1_sfg.evaluate(1, 1)[0] assert but1.evaluate(1, 1)[1] == but1_sfg.evaluate(1, 1)[1] - assert len(but1_sfg.operations) == 8 + assert len(but1_sfg.operations) == 6 def test_add_to_sfg(self): add1 = Addition() diff --git a/test/test_sfg.py b/test/test_sfg.py index e31df451..4dcb1d97 100644 --- a/test/test_sfg.py +++ b/test/test_sfg.py @@ -24,6 +24,7 @@ from b_asic.core_operations import ( SymmetricTwoportAdaptor, ) from b_asic.save_load_structure import python_to_sfg, sfg_to_python +from b_asic.special_operations import Delay class TestInit: @@ -1563,6 +1564,27 @@ class TestSFGErrors: sfg.inputs_required_for_output(1) +class TestInputDuplicationBug: + def test_input_is_not_duplicated_in_operation_list(self): + # Inputs: + in1 = Input(name="in1") + out1 = Output(name="out1") + + # Operations: + t1 = Delay(initial_value=0, name="") + t1.inputs[0].connect(in1) + add1 = t1 + in1 + + out1.inputs[0].connect(add1) + + twotapfir = SFG(inputs=[in1], outputs=[out1], name='twotapfir') + + assert ( + len([op for op in twotapfir.operations if isinstance(op, Input)]) + == 1 + ) + + class TestCriticalPath: def test_single_accumulator(self, sfg_simple_accumulator: SFG): sfg_simple_accumulator.set_latency_of_type(Addition.type_name(), 5) -- GitLab