avoid holes in forks, update intro

This commit is contained in:
Stefan Holst committed 2023-07-12 22:32:22 +09:00
1 parent b3dbe9765a
commit 5be82da49a
2 files changed
+1381 -404

No files matched your search

+1373 -402
View File
File diff suppressed because it is too large. Load diff
+8 -2
View File
@@ -176,7 +176,11 @@ class Line:
To keep the indices consecutive, the line with the highest index within the circuit To keep the indices consecutive, the line with the highest index within the circuit
will be assigned the index of the removed line. will be assigned the index of the removed line.
""" """
if self.driver is not None: self.driver.outs[self.driver_pin] = None if self.driver is not None:
self.driver.outs[self.driver_pin] = None
if self.driver.kind == '__fork__': # squeeze outputs
del self.driver.outs[self.driver_pin]
for i, l in enumerate(self.driver.outs): l.driver_pin = i
if self.reader is not None: self.reader.ins[self.reader_pin] = None if self.reader is not None: self.reader.ins[self.reader_pin] = None
if self.circuit is not None: del self.circuit.lines[self.index] if self.circuit is not None: del self.circuit.lines[self.index]
self.driver = None self.driver = None
@@ -564,6 +568,7 @@ class Circuit:
from graphviz import Digraph from graphviz import Digraph
dot = Digraph(format=format, graph_attr={'rankdir': 'LR', 'splines': 'true'}) dot = Digraph(format=format, graph_attr={'rankdir': 'LR', 'splines': 'true'})
s_dict = dict((n, i) for i, n in enumerate(self.s_nodes))
node_level = np.zeros(len(self.nodes), dtype=np.uint32) node_level = np.zeros(len(self.nodes), dtype=np.uint32)
level_nodes = defaultdict(list) level_nodes = defaultdict(list)
for n, lv in self.topological_order_with_level(): for n, lv in self.topological_order_with_level():
@@ -576,7 +581,8 @@ class Circuit:
for n in level_nodes[lv]: for n in level_nodes[lv]:
ins = '|'.join([f'<i{i}>{i}' for i in range(len(n.ins))]) ins = '|'.join([f'<i{i}>{i}' for i in range(len(n.ins))])
outs = '|'.join([f'<o{i}>{i}' for i in range(len(n.outs))]) outs = '|'.join([f'<o{i}>{i}' for i in range(len(n.outs))])
s.node(name=str(n.index), label = f'{{{{{ins}}}|{n.index}\n{n.kind}\n{n.name}|{{{outs}}}}}', shape='record') io = f' [{s_dict[n]}]' if n in s_dict else ''
s.node(name=str(n.index), label = f'{{{{{ins}}}|{n.index}{io}\n{n.kind}\n{n.name}|{{{outs}}}}}', shape='record')
for l in self.lines: for l in self.lines:
driver, reader = f'{l.driver.index}:o{l.driver_pin}', f'{l.reader.index}:i{l.reader_pin}' driver, reader = f'{l.driver.index}:o{l.driver_pin}', f'{l.reader.index}:i{l.reader_pin}'