A complete analysis has many inputs, and a difference at the end could come from any of them. Comparing after each stage turns one large mystery into a series of small questions: which stage added the first difference, and how much did each later stage add?
stages = [ # (stage, flow A, flow B); both flows start from the same common libraries
("libraries and netlist (common)", 0.412, 0.412),
("+ constraints", 0.236, 0.236),
("+ library version/corner mapping", 0.198, 0.186),
("+ parasitics", 0.151, 0.092),
("+ derates and uncertainty", 0.103, 0.044),
]
diffs = [(s, round(a - b, 3)) for s, a, b in stages]
first = next(s for s, d in diffs if abs(d) > 1e-9)
assert first == "+ library version/corner mapping"
increments = [round(diffs[i][1] - diffs[i - 1][1], 3) for i in range(1, len(diffs))]
assert [d for _, d in diffs] == [0.0, 0.0, 0.012, 0.059, 0.059]
assert increments == [0.0, 0.012, 0.047, 0.0]
biggest = max(range(len(increments)), key=lambda i: abs(increments[i]))
assert diffs[biggest + 1][0] == "+ parasitics"
print("PASS: first divergence at", first, "; largest single step at", diffs[biggest + 1][0], "(", increments[biggest], "ns )")Stage | Flow A | Flow B | Difference | Added by this stage |
|---|---|---|---|---|
Libraries and netlist (common) | 0.412 | 0.412 | 0.000 | 0.000 |
+ constraints | 0.236 | 0.236 | 0.000 | 0.000 |
+ library version/corner mapping | 0.198 | 0.186 | 0.012 | 0.012 |
+ parasitics | 0.151 | 0.092 | 0.059 | 0.047 |
+ derates and uncertainty | 0.103 | 0.044 | 0.059 | 0.000 |
The flows agree through the common libraries and netlist, and through constraints, so those inputs are identical in effect. The first difference, 12 ps, appears at the library version/corner mapping stage; parasitics add a further 47 ps; derates add nothing. There are two separate causes: a library mapping difference (a different version, or a different model for one cell) and a parasitic difference (a different extraction corner or version). Fixing the first does not remove the second. The order of work follows the stages: resolve the earliest difference first, because a later stage may be affected by it.
A staged comparison table for at least one reference path, with differences after each stage.
Each stage's difference is explained or accepted with a reason before the next is studied.
The same reference path is confirmed to be the same path in both flows at every stage.
The constraint files in each flow: clock definitions, exceptions and case values, diffed semantically, since the common libraries, netlist and constraints up to that stage were otherwise identical.