-
Notifications
You must be signed in to change notification settings - Fork 943
rsz: use prev_arc input port to fix repair_timing SIGSEGV (#10210) #10225
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
e985e46
69f0889
2ef3a8a
9add37f
556e68c
178fce5
fc5e258
b07d054
ff573e4
262c312
7963409
79e8cb3
8ad2689
5a31bf9
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,18 @@ | ||
| module top (clk, | ||
| in2, | ||
| out1); | ||
| input clk; | ||
| input in2; | ||
| output out1; | ||
|
|
||
| wire n0; | ||
| wire n1; | ||
|
|
||
| BUF_X1 b1 (.A(clk), | ||
| .Z(n0)); | ||
| INV_X1 inv1 (.A(n0), | ||
| .ZN(n1)); | ||
| NAND2_X1 nd1 (.A1(n1), | ||
| .A2(in2), | ||
| .ZN(out1)); | ||
| endmodule |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -24,6 +24,7 @@ | |
| #include "sta/Mode.hh" | ||
| #include "sta/NetworkClass.hh" | ||
| #include "sta/Path.hh" | ||
| #include "sta/TimingArc.hh" | ||
| #include "sta/Transition.hh" | ||
| #include "utl/Logger.h" | ||
|
|
||
|
|
@@ -99,7 +100,12 @@ bool UnbufferMove::doMove(const sta::Path* drvr_path, float setup_slack_margin) | |
|
|
||
| // Don't remove buffer if new max fanout violations are created | ||
| sta::Vertex* drvr_vertex = graph_->pinDrvrVertex(drvr_pin); | ||
| sta::Pin* drvr_input_pin = drvr_path->prevPath()->pin(sta_); | ||
| const sta::TimingArc* in_arc = drvr_path->prevArc(sta_); | ||
| const sta::LibertyPort* in_lib_port = in_arc ? in_arc->from() : nullptr; | ||
| if (in_lib_port == nullptr) { | ||
| return false; | ||
| } | ||
| sta::Pin* drvr_input_pin = network_->findPin(drvr, in_lib_port); | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. behavior change:
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yes, intentional.
The old
|
||
| sta::Path* prev_drvr_path = drvr_path->prevPath()->prevPath(); | ||
|
maliberty marked this conversation as resolved.
|
||
| sta::Pin* prev_drvr_pin | ||
| = prev_drvr_path ? prev_drvr_path->pin(sta_) : nullptr; | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
early-return on
in_arc == nullptrin all 4 sites (genclk source / latchD->Q roots) means those paths are now skipped by size/swap/unbuffer/recover-power
instead of using whatever the old
prevPath()->pin()returned. Any QoR delta ondesigns with generated clocks or latch-based pipelines
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
No expected QoR delta.
in_arc == nullptronly fires at genuine path startpoints with no upstream arc. Latch D→Q has a realTimingArc→prevArc()returns it, unaffected. Clock-source BTerms are filtered earlier byisTopLevelPort/isLogicStdCell. Generated-clock source pins either go through a divider cell (has input→output arc) or are BTerms (filtered).At those true startpoints the old code wasn't doing useful work anyway —
prevPath()->pin()was either null (crash) or an unrelated pin feeding the wrong port intoupsizeCell(crash or luck-based sizing). New code just skips cleanly.