fix: wrong pin in loadCap during hold repair#10092
fix: wrong pin in loadCap during hold repair#10092eder-matheus merged 1 commit intoThe-OpenROAD-Project:masterfrom
Conversation
36137ad to
3175d6f
Compare
|
clang-tidy review says "All clean, LGTM! 👍" |
|
Hi @eder-matheus @maliberty, |
|
clang-tidy review says "All clean, LGTM! 👍" |
1 similar comment
|
clang-tidy review says "All clean, LGTM! 👍" |
maliberty
left a comment
There was a problem hiding this comment.
@eder-matheus please run a secure CI
@precisionmoon FYI
|
sky130he/aes will need a metrics update |
|
Secure-CI started. |
2ea6484 to
c5f1102
Compare
|
clang-tidy review says "All clean, LGTM! 👍" |
2 similar comments
|
clang-tidy review says "All clean, LGTM! 👍" |
|
clang-tidy review says "All clean, LGTM! 👍" |
c5f1102 to
71e719d
Compare
71e719d to
02a4fd2
Compare
02a4fd2 to
d7e69f9
Compare
|
clang-tidy review says "All clean, LGTM! 👍" |
In repairEndHold(), the buffer delay guard used loadCap() on the wrong pin (end_vertex, a sink) to estimate the inserted buffer's load capacitance. This returned near-zero cap, making the guard trivially permissive and relying entirely on the post-insertion journal rollback. Replacing it with loadCap() on the driver pin (path_vertex) is semantically more correct but overestimates the buffer load: it includes the full pre-split net parasitics, which are absent on the shorter post-split net. This causes buffer_delays to be overestimated, valid hold buffer insertions to be rejected by the guard, and consequently worse slew and capacitance slack. Fix: compute load_cap directly as the sum of pin capacitances of load_pins — the exact set of pins the inserted buffer will drive. This avoids counting parasitics from net segments that will not exist after splitting, giving an accurate and non-pessimistic guard estimate. Signed-off-by: Suhrid Marwah <suhridmarwah07@gmail.com>
d7e69f9 to
efe551e
Compare
|
clang-tidy review says "All clean, LGTM! 👍" |
|
All CI's are passing now. |
|
@eder-matheus did private pass? |
Yes, all private designs are passing. Only nangate45/swerv_wrapper failed, but I believe this is due to the Yosys non-determinism. This should be safe to merge. |
SUMMARY
This PR fixes a wrong pin being used in hold repair, which caused incorrect load capacitance calculation and unsafe buffer insertion. The issue is in
RepairHold::repairEndHold()(src/rsz/src/RepairHold.cc) and could introduce setup violations during hold fixing.FIX
Before
After
VERIFICATION
Running
repair_timing -holdbefore this fix could insert buffers on paths without enough setup slack, causing new violations. After the fix, capacitance is computed correctly, so buffer insertion respects setup constraints and avoids breaking clean paths.