A policy is only as good as its application. A typo in one scenario's script, a copy-paste from another corner, or an early derate set above one all produce wrong numbers silently. An automatic audit of the applied values takes a minute and catches them.
Rule | Catches |
|---|---|
Late derate is at least 1 and early at most 1 | Swapped or sign-flipped values |
Values lie within the policy bounds for the scenario | Typos and copy-paste from another corner |
Setup and hold values come from the right column of the policy | Setup values used for hold |
Every scenario has a value | Missing derates (silently ideal) |
policy = {"late": (1.05, 1.10), "early": (0.90, 0.95)} # allowed range for data derates
applied = {
"ss_cold_cw": {"late": 1.08, "early": 0.92},
"ss_hot_cw": {"late": 1.08, "early": 0.92},
"ff_hot_cb": {"late": 1.30, "early": 0.92},
"tt_cw": {"late": 1.07, "early": 1.05},
}
required = ["ss_cold_cw", "ss_hot_cw", "ff_hot_cb", "tt_cw", "ss_cold_rcw"]
problems = []
for sc in required:
if sc not in applied:
problems.append((sc, "missing"))
continue
late, early = applied[sc]["late"], applied[sc]["early"]
if late < 1.0 or early > 1.0:
problems.append((sc, "wrong side of 1"))
if not (policy["late"][0] <= late <= policy["late"][1]):
problems.append((sc, "late outside policy"))
if not (policy["early"][0] <= early <= policy["early"][1]):
problems.append((sc, "early outside policy"))
assert sorted(problems) == [("ff_hot_cb", "late outside policy"), ("ss_cold_rcw", "missing"), ("tt_cw", "early outside policy"), ("tt_cw", "wrong side of 1")]
print("PASS: audit findings:", sorted(problems))Of five scenarios, one is missing a derate entirely (it would run ideal), one has a late value of 1.30 far outside the policy range, and one has an early value of 1.05 (above one, so it makes the capture path slower: the wrong side of one and outside the range). Three kinds of error, all invisible in a slack summary, all visible to a twenty-line script.
The audit runs on the applied settings read back from the tool, not on the script that was meant to set them.
Findings are fixed before any timing result is interpreted, and the audit is rerun after the fix.
The audit output is part of the signoff package.
A missing derate means that scenario was timed with ideal variation, so its slacks look better than they are and nothing in the report shows the omission.