Flat OCV is the simplest model and the baseline against which the others are judged. It is easy to apply, easy to audit and pessimistic by construction. Seeing its arithmetic once makes every later improvement concrete.
Check | Launch clock and data path | Capture clock path |
|---|---|---|
Setup | Late derate (multiply by a factor above 1) | Early derate (multiply by a factor below 1) |
Hold | Early derate | Late derate |
Derate | Factor | Applies to |
|---|---|---|
Late (above 1) | 1.10 | Launch clock and data delays for setup |
Early (below 1) | 0.90 | Capture clock delays for setup |
# Period 2.0 ns; launch and capture clock paths 1.00 ns each, of which 0.60 ns is shared (common).
T, setup = 2.0, 0.08
launch, capture, common, data = 1.00, 1.00, 0.60, 1.40 # data includes clock-to-Q
late, early = 1.10, 0.90
slack_ideal = (T + capture - setup) - (launch + data)
arrival = (launch + data) * late
required = T + capture * early - setup
slack_flat = required - arrival
credit = common * (late - early) # pessimism on the shared clock segment
slack_crpr = slack_flat + credit
assert round(slack_ideal, 3) == 0.52
assert round(slack_flat, 3) == 0.18
assert round(credit, 3) == 0.12 and round(slack_crpr, 3) == 0.30
print("PASS: slack ideal", round(slack_ideal, 3), "flat OCV", round(slack_flat, 3), "after CRPR", round(slack_crpr, 3))The ideal slack is 0.52 ns. The flat derates cut it to 0.18 ns. But 0.60 ns of the clock path is shared by launch and capture, and a physical gate cannot be both slow and fast at once; removing the 0.12 ns of pessimism on the shared segment gives 0.30 ns. The derates therefore cost 0.22 ns in this example, not 0.34 ns. The removal is explained in Common Path Pessimism Removal.
The late and early factors are recorded per scenario and per delay type (cell, net, clock, data) with their source.
Common path pessimism removal is on, and its total credit is reported.
Hold uses the opposite assignment from setup; a copy-paste of the setup values is a classic mistake.
0.80 × (1.10 - 0.90) = 0.16 ns, so slack after removal would be 0.34 ns.