diff --git a/src/kyupy/circuit.py b/src/kyupy/circuit.py index b3fd272..aaad109 100644 --- a/src/kyupy/circuit.py +++ b/src/kyupy/circuit.py @@ -96,10 +96,10 @@ class Node: by allocating an array or list :code:`my_data` of length :code:`len(n.circuit.nodes)` and accessing it by :code:`my_data[n.index]` or simply by :code:`my_data[n]`. """ - self.ins: list[Line] = GrowingList() + self.ins: GrowingList[Line] = GrowingList() """A list of input connections (:class:`Line` objects). """ - self.outs: list[Line] = GrowingList() + self.outs: GrowingList[Line] = GrowingList() """A list of output connections (:class:`Line` objects). """ @@ -615,6 +615,21 @@ class Circuit: if marks[n]: yield n + def fanout(self, origin_nodes): + """Generator function to iterate over the fan-out cone of a given list of origin nodes. + + Nodes are yielded in topological order. + """ + marks = [False] * len(self.nodes) + for n in origin_nodes: + marks[n] = True + for n in self.topological_order(): + if not marks[n]: + for line in n.ins.without_nones(): + marks[n] |= marks[line.driver] + if marks[n]: + yield n + def fanout_free_regions(self): for stem in self.reversed_topological_order(): if len(stem.outs) == 1 and 'dff' not in stem.kind.lower(): continue