Many apparent timing differences are setup differences: a different constraint version, an older library, a changed uncertainty. A checklist and an automatic comparison turn a day of detective work into a minute.
Input | Must match because |
|---|---|
Netlist version | A different netlist is a different design |
Constraint files per mode | Constraints decide which paths exist and their requirements |
Timing libraries per scenario | They supply the delays |
Parasitics (version, corner, format) | They supply the net delays |
Derates and uncertainty | They change every slack |
Scenario list and names | Reports are compared by scenario name |
impl = {"netlist": "r42", "constraints_func": "c17", "libs_ss": "L5", "parasitics": "spef_v3_cworst", "derate_setup": 1.05, "uncertainty": 0.05, "scenarios": 8}
sign = {"netlist": "r42", "constraints_func": "c17", "libs_ss": "L5", "parasitics": "spef_v4_cworst", "derate_setup": 1.05, "uncertainty": 0.08, "scenarios": 8}
diff = sorted(k for k in impl if impl[k] != sign[k])
assert diff == ["parasitics", "uncertainty"]
only_in = sorted(set(impl) ^ set(sign))
assert only_in == []
print("PASS: differences between the two setups:", diff)The two setups differ in two inputs: the parasitics version (v3 against v4) and the uncertainty (0.05 against 0.08 ns). Both can shift many slacks; the parasitics change may move individual paths either way, and the uncertainty change affects only paths where it is applied, so before comparing a single path the team knows why the numbers differ. Running such a comparison as part of every handoff makes the differences visible instead of discovered.
A handoff record lists every input with its version; a comparison against the previous record is part of the sign-off.
Intentional differences (a larger signoff uncertainty) are labelled intentional.
Unintentional differences are fixed before correlation results are interpreted.
The inputs that apply to every path: uncertainty, derates, and the parasitics version or corner.