-
Notifications
You must be signed in to change notification settings - Fork 941
drt: allow NDR auto-taper to be disabled per net #10805
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
base: master
Are you sure you want to change the base?
Changes from 1 commit
6f6803d
f8f9a64
e638dd6
f7364a6
113ff6f
c27572e
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 |
|---|---|---|
|
|
@@ -295,6 +295,40 @@ proc assign_ndr { args } { | |
| } | ||
| } | ||
|
|
||
| sta::define_cmd_args "set_routing_disable_auto_taper" \ | ||
| { (-net name | -all_clocks) [-disable] [-enable] } | ||
|
|
||
| # Per-net control of the detailed router's auto-taper behavior. By default | ||
| # the detailed router tapers NDR (wide) nets down to minimum width near pin | ||
| # connections. Some nets (e.g. wide analog/NDR traces) must keep their full | ||
| # width all the way to the pin; use -disable to suppress auto-taper for those | ||
| # nets without recompiling. Use -enable to restore the default behavior. | ||
| proc set_routing_disable_auto_taper { args } { | ||
| sta::parse_key_args "set_routing_disable_auto_taper" args \ | ||
| keys {-net} flags {-all_clocks -disable -enable} | ||
| if { !([info exists keys(-net)] ^ [info exists flags(-all_clocks)]) } { | ||
| utl::error ORD 1016 "Either -net or -all_clocks need to be defined." | ||
| } | ||
| if { [info exists flags(-disable)] && [info exists flags(-enable)] } { | ||
| utl::error ORD 1017 "Only one of -disable or -enable may be specified." | ||
| } | ||
|
Comment on lines
+309
to
+314
Member
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. Why use two different idioms and different words (Either vs Exactly one) for the same one-hot style check? |
||
| # Default action is to disable auto-taper. | ||
| set disable [expr { ![info exists flags(-enable)] }] | ||
| set block [ord::get_db_block] | ||
| if { [info exists keys(-net)] } { | ||
| set netName $keys(-net) | ||
| set net [$block findNet $netName] | ||
| if { $net == "NULL" } { | ||
| utl::error ORD 1018 "No net named ${netName} found." | ||
| } | ||
| $net setDisableAutoTaper $disable | ||
| } else { | ||
| foreach net [sta::find_all_clk_nets] { | ||
| $net setDisableAutoTaper $disable | ||
| } | ||
| } | ||
| } | ||
|
|
||
| sta::define_cmd_args "set_debug_level" { tool group level } | ||
| proc set_debug_level { args } { | ||
| sta::check_argc_eq3 "set_debug_level" $args | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -167,6 +167,21 @@ bool UniqueInsts::isNDRInst(frInst* inst) const | |
| return false; | ||
| } | ||
|
|
||
| bool UniqueInsts::isNoAutoTaperNDRInst(frInst* inst) const | ||
|
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. I'm not sure about this one. Does that mean that, as soon as an instance is connected to a net with auto-taper disabled, that the entire instance has auto taper disabled? Also, why not use
Author
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.
Here I need that conjunction on one net. Take an instance with net A (NDR, taper enabled) and net B (auto-taper disabled, but no NDR): That's why the loop checks
Author
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. However, the condition was duplicated. I've factored it into
Author
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. To your other question, "Does that mean that, as soon as an instance is connected to a net with auto-taper disabled, that the entire instance has auto taper disabled?":
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. Alright. So as long as you can have instances with both non-NDR nets and NDR nets connected to them, it with tapering individually enabled, this should be fine. |
||
| { | ||
| // An instance whose pin access must be computed without auto-taper: | ||
| // it touches an NDR net for which tapering is suppressed, either | ||
| // globally (!AUTO_TAPER_NDR_NETS) or per-net (disable_auto_taper). | ||
| for (const auto& a : inst->getInstTerms()) { | ||
| auto* net = a->getNet(); | ||
| if (net && net->getNondefaultRule() | ||
| && (!router_cfg_->AUTO_TAPER_NDR_NETS || net->isAutoTaperDisabled())) { | ||
| return true; | ||
| } | ||
| } | ||
| return false; | ||
| } | ||
|
|
||
| UniqueClassKey UniqueInsts::computeUniqueClassKey(frInst* inst) const | ||
| { | ||
| const odb::Point origin = inst->getOrigin(); | ||
|
|
@@ -196,7 +211,7 @@ UniqueClassKey UniqueInsts::computeUniqueClassKey(frInst* inst) const | |
| } | ||
| // Special case for NDR instances, create a separate unique class for them | ||
| frInst* ndr_inst = nullptr; | ||
| if (!router_cfg_->AUTO_TAPER_NDR_NETS && isNDRInst(inst)) { | ||
| if (isNoAutoTaperNDRInst(inst)) { | ||
| ndr_inst = inst; | ||
| } | ||
| std::set<frTerm*> stubborn_terms; | ||
|
|
||
Uh oh!
There was an error while loading. Please reload this page.