diff --git a/b_asic/signal_flow_graph.py b/b_asic/signal_flow_graph.py index 5eb68ec21e8c1c1a9e614e0652cc0c2b9e7a21ea..09d276ebdcc315ff456f6b2e21246e2169b25f15 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