Margins accumulate quietly: a derate here, an uncertainty there, a legacy margin from an earlier project. Each is reasonable alone; together they can be the difference between closing and not closing. A ledger lists them with owners so the sum is deliberate.
ledger = [
("OCV derates (setup)", 0.18, "signoff lead"),
("clock uncertainty", 0.05, "clock lead"),
("IR-drop margin", 0.03, "power lead"),
("legacy margin", 0.04, None),
]
total = round(sum(m for _, m, _ in ledger), 3)
unowned = [(n, m) for n, m, o in ledger if o is None]
unowned_total = round(sum(m for _, m in unowned), 3)
assert total == 0.30
assert unowned == [("legacy margin", 0.04)] and unowned_total == 0.04
share = unowned_total / total
assert round(share, 3) == 0.133
print("PASS: total margin", total, "ns; unowned", unowned, "which is", round(share * 100, 1), "% of the total")Margin | ns (illustrative) | Owner | Approval evidence |
|---|---|---|---|
OCV derates (setup) | 0.18 | Signoff lead | Variation data and coverage |
Clock uncertainty | 0.05 | Clock lead | Jitter and skew budget |
IR-drop margin | 0.03 | Power lead | Voltage-drop analysis |
Legacy margin | 0.04 | none | none |
The ledger sums to 0.30 ns, of which 0.04 ns (13%) belongs to nobody. The unowned margin is the one to challenge first: if it has a reason, the owner and evidence get recorded; if it does not, it is removed and the 0.04 ns is returned to the paths.
Every margin has an owner, a number, an evidence reference and a review date.
Changes to a margin are approved by its owner and the signoff lead, and recorded.
The total is compared with the previous project or milestone, and increases are explained.
0.30 - 0.04 = 0.26 ns.