Data paths are not the only paths that vary. The launch and capture clock paths are chains of buffers, and their relative arrival is what skew means. Variation turns a nominal skew into a range. The shared part of the tree is removed from that range by common path pessimism removal; the unshared branches are what remains.
import math
stage = 0.05
common_n, unique_n = 8, 4 # clock tree: 8 shared stages, then 4 unshared stages per branch
common, unique = common_n * stage, unique_n * stage
assert abs(common - 0.40) < 1e-9 and abs(unique - 0.20) < 1e-9
# flat derates 1.10 late / 0.90 early
no_crpr_flat = common * (1.10 - 0.90) # pessimism on the shared part
skew_flat = unique * (1.10 - 0.90) # remaining uncertainty after removal
# depth-based derate for a 12-stage clock path (simplified: same depth used for both branches)
d = 3 * 0.05 / math.sqrt(12)
no_crpr_depth = common * 2 * d
skew_depth = unique * 2 * d
assert round(no_crpr_flat, 3) == 0.080 and round(skew_flat, 3) == 0.040
assert round(no_crpr_depth, 4) == 0.0346 and round(skew_depth, 4) == 0.0173
print("PASS: flat pessimism removed", round(no_crpr_flat, 3), "remaining", round(skew_flat, 3), "; depth-based", round(no_crpr_depth, 4), round(skew_depth, 4))Flat 1.10 / 0.90 | Depth-based (12 stages) | |
|---|---|---|
Pessimism on the shared 0.40 ns | 0.080 ns (removed) | 0.035 ns (removed) |
Remaining uncertainty from the unshared 0.20 ns | 0.040 ns | 0.017 ns |
The clock tree has twelve stages of 0.05 ns, eight shared by launch and capture and four unshared on each side. Applying a flat derate to the whole path would charge 0.080 ns of pessimism on the shared part, which removal credits back; what remains, 0.040 ns, is the real uncertainty from the unshared stages. The depth-based figures are smaller for the same reason as before. The depth used here is a simplification: real tables are indexed by the depth of each portion and by distance.
Common path pessimism removal is enabled for setup and hold and its credit is reported per path.
Deep clock trees with large unshared portions are reviewed: the unshared stages are where skew uncertainty lives.
Clock tree design aims for a long shared trunk and short unshared branches to the sinks that talk to each other.
It falls to 2 × 0.05 × 0.20 = 0.020 ns (half of 0.040), because only the unshared stages contribute.