|
|
|
|
@ -38,9 +38,11 @@ class TechLib:
@@ -38,9 +38,11 @@ class TechLib:
|
|
|
|
|
else: |
|
|
|
|
pin_dict[n.name] = (o_idx, True) |
|
|
|
|
o_idx += 1 |
|
|
|
|
has_dff = 'DFF' in set(n.kind for n in c.cells.values()) |
|
|
|
|
has_latch = 'LATCH' in set(n.kind for n in c.cells.values()) |
|
|
|
|
parts = [s[1:-1].split(',') if s[0] == '{' else [s] for s in re.split(r'({[^}]+})', c.name) if len(s) > 0] |
|
|
|
|
for name in [''.join(item) for item in product(*parts)]: |
|
|
|
|
self.cells[name] = (c, pin_dict) |
|
|
|
|
self.cells[name] = (c, pin_dict, has_dff, has_latch) |
|
|
|
|
|
|
|
|
|
def pin_index(self, kind, pin): |
|
|
|
|
"""Returns a pin list position for a given node kind and pin name.""" |
|
|
|
|
@ -61,6 +63,26 @@ class TechLib:
@@ -61,6 +63,26 @@ class TechLib:
|
|
|
|
|
assert kind in self.cells, f'Unknown cell: {kind}' |
|
|
|
|
assert pin in self.cells[kind][1], f'Unknown pin: {pin} for cell {kind}' |
|
|
|
|
return self.cells[kind][1][pin][1] |
|
|
|
|
|
|
|
|
|
def is_dff(self, kind): |
|
|
|
|
"""Returns True, if given node kind is a d-flip-flop.""" |
|
|
|
|
if kind == '__fork__': return False |
|
|
|
|
if kind == '__const0__': return False |
|
|
|
|
if kind == '__const1__': return False |
|
|
|
|
if kind == 'input': return False |
|
|
|
|
if kind == 'output': return False |
|
|
|
|
assert kind in self.cells, f'Unknown cell: {kind}' |
|
|
|
|
return self.cells[kind][2] |
|
|
|
|
|
|
|
|
|
def is_latch(self, kind): |
|
|
|
|
"""Returns True, if given node kind is a latch.""" |
|
|
|
|
if kind == '__fork__': return False |
|
|
|
|
if kind == '__const0__': return False |
|
|
|
|
if kind == '__const1__': return False |
|
|
|
|
if kind == 'input': return False |
|
|
|
|
if kind == 'output': return False |
|
|
|
|
assert kind in self.cells, f'Unknown cell: {kind}' |
|
|
|
|
return self.cells[kind][3] |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
KYUPY = TechLib(r""" |
|
|
|
|
@ -98,6 +120,7 @@ AOI211 input(i0,i1,i2,i3) output(o) o=AOI211(i0,i1,i2,i3) ;
@@ -98,6 +120,7 @@ AOI211 input(i0,i1,i2,i3) output(o) o=AOI211(i0,i1,i2,i3) ;
|
|
|
|
|
OAI211 input(i0,i1,i2,i3) output(o) o=OAI211(i0,i1,i2,i3) ; |
|
|
|
|
MUX21 input(i0,i1,i2) output(o) o=MUX21(i0,i1,i2) ; |
|
|
|
|
DFF input(D,CLK) output(Q) Q=DFF(D,CLK) ; |
|
|
|
|
LATCH input(D,CLK) output(Q) Q=LATCH(D,CLK) ; |
|
|
|
|
""") |
|
|
|
|
"""A synthetic library of all KyuPy simulation primitives. |
|
|
|
|
""" |
|
|
|
|
|