|
|
@ -103,6 +103,7 @@ class DelayFile: |
|
|
|
|
|
|
|
|
|
|
|
delays = np.zeros((len(circuit.lines), 2, 2, 3)) # dataset last during construction. |
|
|
|
delays = np.zeros((len(circuit.lines), 2, 2, 3)) # dataset last during construction. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
nonfork_annotations = 0 |
|
|
|
for n1, n2, *delvals in self._interconnects: |
|
|
|
for n1, n2, *delvals in self._interconnects: |
|
|
|
delvals = [d if len(d) > 0 else [0, 0, 0] for d in delvals] |
|
|
|
delvals = [d if len(d) > 0 else [0, 0, 0] for d in delvals] |
|
|
|
if max(max(delvals)) == 0: continue |
|
|
|
if max(max(delvals)) == 0: continue |
|
|
@ -120,19 +121,27 @@ class DelayFile: |
|
|
|
log.warn(f'No line to annotate pin {pn2} of {c2}') |
|
|
|
log.warn(f'No line to annotate pin {pn2} of {c2}') |
|
|
|
continue |
|
|
|
continue |
|
|
|
f1, f2 = c1.outs[p1].reader, c2.ins[p2].driver # find the forks between cells. |
|
|
|
f1, f2 = c1.outs[p1].reader, c2.ins[p2].driver # find the forks between cells. |
|
|
|
assert f1.kind == '__fork__' |
|
|
|
if f1 == c2 and f2 == c1: |
|
|
|
assert f2.kind == '__fork__' |
|
|
|
nonfork_annotations += 1 |
|
|
|
if f1 != f2: # at least two forks, make sure f2 is a branchfork connected to f1 |
|
|
|
if nonfork_annotations < 10: |
|
|
|
assert len(f2.outs) == 1 |
|
|
|
log.warn(f'No fork between {c1.name}/{p1} and {c2.name}/{p2}, using {c2.name}/{p2}') |
|
|
|
assert f1.outs[f2.ins[0].driver_pin] == f2.ins[0] |
|
|
|
line = c2.ins[p2] |
|
|
|
line = f2.ins[0] |
|
|
|
|
|
|
|
elif len(f2.outs) == 1: # f1==f2, only OK when there is no fanout. |
|
|
|
|
|
|
|
line = f2.ins[0] |
|
|
|
|
|
|
|
else: |
|
|
|
else: |
|
|
|
log.warn(f'No branchfork to annotate interconnect delay {c1.name}/{p1}->{c2.name}/{p2}') |
|
|
|
assert f1.kind == '__fork__' |
|
|
|
continue |
|
|
|
assert f2.kind == '__fork__' |
|
|
|
|
|
|
|
if len(f2.outs) == 1: |
|
|
|
|
|
|
|
assert f1 == f2 or f1.outs[f2.ins[0].driver_pin] == f2.ins[0] |
|
|
|
|
|
|
|
line = f2.ins[0] |
|
|
|
|
|
|
|
else: |
|
|
|
|
|
|
|
nonfork_annotations += 1 |
|
|
|
|
|
|
|
if nonfork_annotations < 10: |
|
|
|
|
|
|
|
log.warn(f'No branchfork between {c1.name}/{p1} and {c2.name}/{p2}, using {c2.name}/{p2}') |
|
|
|
|
|
|
|
line = c2.ins[p2] |
|
|
|
delays[line, :] = delvals |
|
|
|
delays[line, :] = delvals |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if nonfork_annotations > 0: |
|
|
|
|
|
|
|
log.warn(f'{nonfork_annotations} interconnect annotations were moved to gate inputs due to missing forks.') |
|
|
|
|
|
|
|
|
|
|
|
return np.moveaxis(delays, -1, 0) |
|
|
|
return np.moveaxis(delays, -1, 0) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|