From daaf08fbc02c8ec08f8a0fd98aa168eddb0782ac Mon Sep 17 00:00:00 2001
From: angloth <angus.lothian@hotmail.com>
Date: Mon, 27 Apr 2020 14:27:19 +0200
Subject: [PATCH] Add working precedence list where output ports have different
 dependencies

---
 b_asic/signal_flow_graph.py | 22 ++++++++++++++++------
 1 file changed, 16 insertions(+), 6 deletions(-)

diff --git a/b_asic/signal_flow_graph.py b/b_asic/signal_flow_graph.py
index 5eb68ec2..09d276eb 100644
--- a/b_asic/signal_flow_graph.py
+++ b/b_asic/signal_flow_graph.py
@@ -525,7 +525,17 @@ class SFG(AbstractOperation):
         curr_iter_ports = [op.output(i) for op in (
             no_input_ops + reg_ops) for i in range(op.output_count)]
 
-        remaining_inputs = {op: op.input_count for op in self.operations}
+        outports_per_inport = defaultdict(list)
+        remaining_inports_per_outport = dict()
+
+        for op in self.operations:
+            op_inputs = op.inputs
+            for out_i, outport in enumerate(op.outputs):
+                dependendent_indexes = op.inputs_required_for_output(out_i)
+                remaining_inports_per_outport[outport] = len(
+                    dependendent_indexes)
+                for in_i in dependendent_indexes:
+                    outports_per_inport[op_inputs[in_i]].append(outport)
 
         # Traverse output ports for precedence
         while curr_iter_ports:
@@ -536,12 +546,12 @@ class SFG(AbstractOperation):
 
             for outport in curr_iter_ports:
                 for signal in outport.signals:
-                    new_op = signal.destination.operation
+                    new_inport = signal.destination
                     # Don't traverse over Registers
-                    if new_op is not None and not isinstance(new_op, Register):
-                        remaining_inputs[new_op] -= 1
-                        if remaining_inputs[new_op] == 0:
-                            for new_outport in new_op.outputs:
+                    if new_inport is not None and not isinstance(new_inport.operation, Register):
+                        for new_outport in outports_per_inport[new_inport]:
+                            remaining_inports_per_outport[new_outport] -= 1
+                            if remaining_inports_per_outport[new_outport] == 0:
                                 next_iter_ports.append(new_outport)
 
             curr_iter_ports = next_iter_ports
-- 
GitLab