|
|
|
@ -96,10 +96,10 @@ class Node:
@@ -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:
@@ -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 |
|
|
|
|