Compare commits

...

3 Commits

Author SHA1 Message Date
stefan aebdf9540d pin_name type annotations 3 weeks ago
stefan 9dc58f8c40 dev deps 3 weeks ago
stefan e8a9025c56 fix dot graph construction 3 weeks ago
  1. 4
      pyproject.toml
  2. 6
      src/kyupy/circuit.py
  3. 4
      src/kyupy/techlib.py

4
pyproject.toml

@ -33,8 +33,10 @@ build-backend = "hatchling.build" @@ -33,8 +33,10 @@ build-backend = "hatchling.build"
[dependency-groups]
dev = [
"myst-parser>=4.0.1",
"pytest>=9.0.1",
"sphinx>=8.1.3",
"sphinx-rtd-theme>=3.0.2",
"pytest>=9.0.1",
"ipython>=9.14.1",
"jupyter>=1.1.1",
]

6
src/kyupy/circuit.py

@ -652,11 +652,11 @@ class Circuit: @@ -652,11 +652,11 @@ class Circuit:
region.append(n)
yield stem, region
def dot(self, format='svg', graph_attr={}, line_labels={}):
def dot(self, tlib: 'TechLib', format='svg', graph_attr={}, line_labels={}):
from graphviz import Digraph
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))
s_dict = dict((n, i) for i, n in enumerate(self.s_nodes(tlib)))
node_level = np.zeros(len(self.nodes), dtype=np.uint32)
level_nodes = defaultdict(list)
for n, lv in self.topological_order_with_level():
@ -679,7 +679,7 @@ class Circuit: @@ -679,7 +679,7 @@ class Circuit:
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.node(f'_{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]:

4
src/kyupy/techlib.py

@ -50,13 +50,13 @@ class TechLib: @@ -50,13 +50,13 @@ class TechLib:
assert pin in self.cells[kind][1], f'Unknown pin: {pin} for cell {kind}'
return self.cells[kind][1][pin][0]
def pin_name(self, kind, pos, output=False):
def pin_name(self, kind: str, pos: int, output=False) -> str:
"""Returns the pin name for a given node kind, list position, and direction."""
assert kind in self.cells, f'Unknown cell: {kind}'
for name, (ppos, isout) in self.cells[kind][1].items():
if isout == output and ppos == pos:
return name
return None
raise ValueError(f'Invalid {"output" if output else "input"} pin position {pos} for cell: {kind}')
def pin_is_output(self, kind, pin):
"""Returns True, if given pin name of a node kind is an output."""

Loading…
Cancel
Save