Treating every coupled neighbour as switching against the victim is safe but wildly pessimistic. Most neighbours switch at other times. STA already computes the earliest and latest times each net can switch, called its timing window, and uses them to discard aggressors that cannot overlap.
victim = (1.00, 1.30) # earliest and latest switching time of the victim, ns
aggressors = { # name: (window, delta delay it would cause if it overlaps, ps)
"A1": ((0.20, 0.50), 6.0),
"A2": ((1.20, 1.60), 5.0),
"A3": ((1.25, 1.28), 4.0),
"A4": ((1.35, 1.45), 3.0),
}
def overlaps(w1, w2):
return w1[0] <= w2[1] and w2[0] <= w1[1]
active = {n: d for n, (w, d) in aggressors.items() if overlaps(victim, w)}
assert sorted(active) == ["A2", "A3"]
pessimistic = sum(d for _, d in aggressors.values())
windowed = sum(active.values())
assert (pessimistic, windowed) == (18.0, 9.0)
print("PASS: aggressors that can overlap", sorted(active), "; delta with all", pessimistic, "ps, with windows", windowed, "ps")Aggressor | Window (ns) | Overlaps victim 1.00 to 1.30? | Counted delta (ps) |
|---|---|---|---|
A1 | 0.20 to 0.50 | No: finished before the victim can switch | 0 |
A2 | 1.20 to 1.60 | Yes | 5 |
A3 | 1.25 to 1.28 | Yes | 4 |
A4 | 1.35 to 1.45 | No: starts after the victim's latest time | 0 |
Four aggressors could add 18 ps if all were assumed to hit. Only A2 and A3 have windows that overlap the victim's window, so 9 ps is counted. Windows come from the timing analysis itself, so they depend on the delays, and the delays depend on the deltas: tools iterate until the windows settle. Windows are conservative by design: a window is the full range of times, not the times that actually happen together. Real filtering compares the aggressor's transition interval (arrival plus slew) with the victim's, a further reason windows stay conservative.
Window-based filtering is on, and the windows come from the same view and analysis as the victim.
Aggressors from asynchronous clocks are treated as overlapping, because no window relationship exists.
A change that moves a net's arrival time (an ECO, a different clock tree) triggers a rerun, since windows move with it.
A2 (1.20-1.60), A3 (1.25-1.28) and A4 (1.35-1.45): all start before the victim's latest time 1.50 ns and end after its earliest, so the counted delta would be 12 ps.