circuit objects and nodes/lines of different circuits are not quivalent.
This commit is contained in:
1 parent
88a5c79161
commit
21439e3595
1 file changed
+16
-15
+16
-15
@@ -134,10 +134,10 @@ class Node:
|
||||
|
||||
This is ok, because (name, kind) is unique within a circuit.
|
||||
"""
|
||||
return self.name == other.name and self.kind == other.kind
|
||||
return self.name == other.name and self.kind == other.kind and self.circuit == other.circuit
|
||||
|
||||
def __hash__(self):
|
||||
return hash((self.name, self.kind))
|
||||
return hash((self.name, self.kind, id(self.circuit)))
|
||||
|
||||
|
||||
class Line:
|
||||
@@ -539,9 +539,6 @@ class Circuit:
|
||||
for n in state['io_nodes']:
|
||||
self.io_nodes.append(self.nodes[n])
|
||||
|
||||
def __eq__(self, other):
|
||||
return self.nodes == other.nodes and self.lines == other.lines and self.io_nodes == other.io_nodes
|
||||
|
||||
def __repr__(self):
|
||||
return f'{{name: "{self.name}", cells: {len(self.cells)}, forks: {len(self.forks)}, lines: {len(self.lines)}, io_nodes: {len(self.io_nodes)}}}'
|
||||
|
||||
@@ -651,9 +648,9 @@ class Circuit:
|
||||
region.append(n)
|
||||
yield stem, region
|
||||
|
||||
def dot(self, format='svg'):
|
||||
def dot(self, format='svg', graph_attr={}, line_labels={}):
|
||||
from graphviz import Digraph
|
||||
dot = Digraph(format=format, graph_attr={'rankdir': 'LR', 'splines': 'true'})
|
||||
dot = Digraph(format=format, graph_attr={'rankdir': 'LR', 'splines': 'true', 'size': '10', 'ranksep': '0.1'} | graph_attr)
|
||||
|
||||
s_dict = dict((n, i) for i, n in enumerate(self.s_nodes))
|
||||
node_level = np.zeros(len(self.nodes), dtype=np.uint32)
|
||||
@@ -666,20 +663,24 @@ class Circuit:
|
||||
with dot.subgraph() as s:
|
||||
s.attr(rank='same')
|
||||
for n in level_nodes[lv]:
|
||||
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))])
|
||||
ins = '{' + '|'.join([f'<i{i}>{i}' for i in range(len(n.ins))]) + '}|' if len(n.ins) > 1 else ''
|
||||
outs = '|{' + '|'.join([f'<o{i}>{i}' for i in range(len(n.outs))]) + '}' if len(n.outs) > 1 else ''
|
||||
io = f' [{s_dict[n]}]' if n in s_dict else ''
|
||||
s.node(name=str(n.index), label = fr'{{{{{ins}}}|{n.index}{io}\n{n.kind}\n{n.name}|{{{outs}}}}}', shape='record')
|
||||
color = '#f5f5f5' if n.kind == '__fork__' else '#cccccc'
|
||||
kind = '' if n.kind == '__fork__' else fr'\n{n.kind}'
|
||||
s.node(name=str(n.index), label = fr'{{{ins}{n.index}{io}{kind}\n{n.name}{outs}}}', shape='record', style='filled', fillcolor=color)
|
||||
|
||||
for l in self.lines:
|
||||
driver, reader = f'{l.driver.index}:o{l.driver_pin}', f'{l.reader.index}:i{l.reader_pin}'
|
||||
driver = f'{l.driver.index}:o{l.driver_pin}' if len(l.driver.outs)>1 else f'{l.driver.index}'
|
||||
reader = f'{l.reader.index}:i{l.reader_pin}' if len(l.reader.ins)>1 else f'{l.reader.index}'
|
||||
label = str(line_labels.get(l, l.index))
|
||||
if node_level[l.driver] == node_level[l.reader]:
|
||||
s.node(f'_{l.index}_')
|
||||
dot.edge(driver, f'_{l.index}_', style='dotted', label=str(l.index))
|
||||
dot.edge(f'_{l.index}_', reader, style='dotted', label=str(l.index))
|
||||
dot.edge(driver, f'_{l.index}_', style='dotted', label=label)
|
||||
dot.edge(f'_{l.index}_', reader, style='dotted', label=label)
|
||||
elif node_level[l.driver] > node_level[l.reader]:
|
||||
dot.edge(driver, reader, style='dotted', label=str(l.index))
|
||||
dot.edge(driver, reader, style='dotted', label=label)
|
||||
else:
|
||||
dot.edge(driver, reader, label=str(l.index))
|
||||
dot.edge(driver, reader, label=label)
|
||||
|
||||
return dot
|
||||
Reference in new issue
Block a user