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