rcx: fix wire resistance subtraction during neighboring context adjustment pass#10439
rcx: fix wire resistance subtraction during neighboring context adjustment pass#10439AcKoucher wants to merge 3 commits into
Conversation
…tment pass Signed-off-by: Arthur Koucher <arthurkoucher@precisioninno.com>
There was a problem hiding this comment.
Code Review
This pull request modifies the resistance calculation logic in extmeasure_res.cpp to return the baseline resistance instead of nullptr when distances exceed the RESOVER table bounds. It also introduces a new regression test suite, short_resover, including its rules and execution script. Review feedback identifies a missing golden SPEF file necessary for the new test and suggests adjusting a boundary condition from >= to > to improve calculation accuracy at the table limits.
|
clang-tidy review says "All clean, LGTM! 👍" |
|
@codex review |
|
To use Codex here, create a Codex account and connect to github. |
|
@codex review |
|
Codex Review: Didn't find any major issues. 🚀 ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. Codex can also answer questions or update the PR. Try commenting "@codex address that feedback". |
There was a problem hiding this comment.
Why not use sky130hs/sky130hs.rcx_rules ?
There was a problem hiding this comment.
Most of the gcd.def routing is in metal1 and, in sky130hs/sky130hs.rcx_rules, the RESOVER table goes beyond the 4 tracks distance for this layer.
We may have the bug triggered for some of the remaining layers but we'd rely on quite some luck as not only there is less routing, but the gap between the RESOVER limit and 4 * pitch distance is narrow.
The idea of the new rules is to force the gap to be wide enough in every layer so that basically every wire with multiple-track neighbors end up triggering the bug.
Signed-off-by: Arthur Koucher <arthurkoucher@precisioninno.com>
Signed-off-by: Arthur Koucher <arthurkoucher@precisioninno.com>
|
clang-tidy review says "All clean, LGTM! 👍" |
|
Running Secure-CI. |
Context
While working on updating the layers' resistance on the ihp platform using the new segment-based regression, I got non-linear fit i.e., Rsq != 1.0 for all metal layers. Some investigation showed that a few metal shapes had a much smaller resistance than expected based on the sheet value. This unexpected resistance was tracked down to the bug being fixed in this PR. With the changes here, we get a linear fit for resistance on ihp as we should.
Summary
During extraction, RCX first sets each wire shape's resistance from its geometry and sheet-res, then a coupling-extraction pass adjusts it. The adjustment is a
total - baselinesubtraction that should cancel to zero when the PDK table has uniform per-distance resistance.During the adjustment pass, when iterating the sections of a segment and looking at each neighborhood context, there are two physical components being stored at the same time and that should match: the span of the current neighbor (i.e., the length of the neighbor's "overlap") and the resistance contribution of that span.
The problem is that we always register the span, but for a very specific case we fail to register the overlap's resistance contribution (see
extMeasure::computeRes). The mismatch causes thetotal - baselineexpression to go negative, and that negative delta gets added to the odb::RSeg resistance.So what the changes here do is: ensure that the context resistance is correctly registered and the final resistance of the metal segment is left untouched for a case in which:
total_resistance > 0scope inextMeasure::measureRC) .Also ensure that the last table entry is correctly used when the neighbor is at the maximum distance.
Observations
W.r.t. the regression test, most of the gcd.def routing is in metal1 and, in sky130hs/sky130hs.rcx_rules, the RESOVER table goes beyond the 4 tracks distance for this layer. We may have the bug triggered for some of the remaining layers but we'd rely on quite some luck as not only there is less routing, but the gap between the RESOVER limit and 4 * pitch distance is narrow. Based on that I added a new .rules files that should force the gap to be wide enough in every layer so that basically every wire with multiple-track neighbors end up triggering the bug.
Type of Change
Impact
This may have small QoR impact at least on ihp.
Verification
./etc/Build.sh).Related Issues
The-OpenROAD-Project/OpenROAD-flow-scripts#3969