From 0747e2bf9c8ff720c080fcf70f753098816583a4 Mon Sep 17 00:00:00 2001
From: Hugo Winbladh <hugwi268@student.liu.se>
Date: Mon, 26 Jun 2023 13:18:32 +0000
Subject: [PATCH] Change connect_external_signals_to_components() to work with
 branching input signals

---
 b_asic/signal_flow_graph.py |  6 ++++++
 test/test_sfg.py            | 15 +++++++++++++++
 2 files changed, 21 insertions(+)

diff --git a/b_asic/signal_flow_graph.py b/b_asic/signal_flow_graph.py
index b4c55607..405681ea 100644
--- a/b_asic/signal_flow_graph.py
+++ b/b_asic/signal_flow_graph.py
@@ -431,6 +431,12 @@ class SFG(AbstractOperation):
                 raise ValueError("Missing destination in signal.")
             destination.clear()
             input_port.signals[0].set_destination(destination)
+            for signal in input_operation.output(0).signals[1:]:
+                other_destination = signal.destination
+                if other_destination is None:
+                    raise ValueError("Missing destination in signal.")
+                other_destination.clear()
+                other_destination.add_signal(Signal(destination.signals[0]))
         # For each output_signal, connect it to the corresponding operation
         for output_port, output_operation in zip(self.outputs, self.output_operations):
             src = output_operation.input(0).signals[0].source
diff --git a/test/test_sfg.py b/test/test_sfg.py
index df775bc8..cf97709c 100644
--- a/test/test_sfg.py
+++ b/test/test_sfg.py
@@ -25,6 +25,7 @@ from b_asic.save_load_structure import python_to_sfg, sfg_to_python
 from b_asic.signal_flow_graph import SFG, GraphID
 from b_asic.simulation import Simulation
 from b_asic.special_operations import Delay
+from b_asic.sfg_generators import wdf_allpass
 
 
 class TestInit:
@@ -814,6 +815,20 @@ class TestConnectExternalSignalsToComponentsSoloComp:
         assert test_sfg.evaluate_output(0, []) == 14
         assert not test_sfg.connect_external_signals_to_components()
 
+    def test_connect_external_signals_to_components_multiple_operations_after_input(
+        self
+    ):
+        """
+        Replaces an SFG with a symmetric two-port adaptor to test when the input
+        port goes to multiple operations
+        """
+        sfg1 = wdf_allpass(0.5)
+        sfg2 = sfg1.replace_operation(sfg1.find_by_id('sym2p0').to_sfg(), 'sym2p0')
+        sfg2.find_by_id('sfg0').connect_external_signals_to_components()
+        test_sfg = SFG(sfg2.input_operations, sfg2.output_operations)
+        assert sfg1.evaluate(1) == -0.5
+        assert test_sfg.evaluate(1) == -0.5
+        assert not test_sfg.connect_external_signals_to_components()
 
 class TestConnectExternalSignalsToComponentsMultipleComp:
     def test_connect_external_signals_to_components_operation_tree(
-- 
GitLab