From 895c4c97c18674e286514a7662da790df7882bfd Mon Sep 17 00:00:00 2001 From: James Cherry Date: Fri, 3 May 2019 08:07:00 -0700 Subject: [PATCH] Sta::insert_buffer --- doc/ChangeLog.txt | 14 ++ doc/OpenSTA.odt | Bin 75400 -> 75411 bytes network/ConcreteNetwork.cc | 8 ++ network/ConcreteNetwork.hh | 3 + network/Network.hh | 3 + network/SdcNetwork.cc | 8 ++ network/SdcNetwork.hh | 3 + search/Sta.cc | 51 ++++++++ search/Sta.hh | 17 ++- tcl/NetworkEdit.i | 12 ++ tcl/NetworkEdit.tcl | 256 ++++++++++++++++++++----------------- tcl/Sta.tcl | 7 + 12 files changed, 262 insertions(+), 120 deletions(-) diff --git a/doc/ChangeLog.txt b/doc/ChangeLog.txt index 707cc767..6b57282c 100644 --- a/doc/ChangeLog.txt +++ b/doc/ChangeLog.txt @@ -80,6 +80,20 @@ for compatibility in this current release. The read_parasitics command has been renamed read_spef and no longer supports the SPF format. +.... + +The make_net command now takes a single net name argument and returns +the net. + +The delete_instance command deletes a single instance instead of a list +of instances. + +The delete_net command deletes a single net instead of a list +of nets. + +The disconnect_pins command is renamed disconnect_pin and disconnects a +single pin. + Release 1.11.0 2017/08/18 ------------------------- diff --git a/doc/OpenSTA.odt b/doc/OpenSTA.odt index 363af13f859ee0dc28f21634e7d8ff403a3998b4..cf2d1fa64d31569c94f15e6b713d8609d02916f6 100644 GIT binary patch delta 28875 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
~&Lpc{>f%7QG1!k8I3o9&>VXsO%#I4a- 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 delta 28839 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 0d~{S0wTE!evL4 zkdofOux!OWz>mr*Sf}ove|;i}65@!x#=>{xab2p7Cb{Rk7PW(}140e^4ysxA?pS>h zL$5y$9ORqsP8cBmWG0Ub_rGiXO=_M$yhdZo83ygiQb zg$rYckkG60o@1CXx;@(0;)*Bw{g!<_I6`S2n*0QC`FDEXT^yFIb^8Y?6TRcg=rmo~ zR4+1z`f7<7dCx-h0JnRmp5I^lwz?nYGf6hrU$KOrUMJ5#ec$Tl>3Vy}b~f$k^!9u@ z{1Hatu!-j=)ZzQ|>uKp|$akom)jteVEYjYL&p``=066d^-LH7hrM4OiF*+1(DmP#D z<6k6eJpE-#Pod*cD!~wWBxMP`Pbs!BXO3Cb4|KLHJ2W5N$!;F5qg=4)u}OOcBrDG| zGP;vL1@iKD%yl=)>%8K{DwKR`U?y6CpPe%mf9H^Z&+FM%63js$B0<8>`oKgda94(SleOB9| zA!?V*FI*Q(y0So0Yru@;FT2kx#D{s}%%_fo*lWD0b>E)eIJ&Jmfs!xLtn~I5Y3kyh zkYmsfjAfgx+>u;#^b8zO6~9kPF+f_x7F zglgX)D$7>IAb8U(11sg+U)PLu#g`O69f+K57#JQ1j~I99=`S%~C~{RkXbE4t$xM96 z_cHNyiepHLpebRg-4Hir6~H`SJDH3)1Smo&*qb8T@#qufGTQ7yYOV9a#aiVq^DBAK zjzX?|g_!LR3Dj16ziWJ2|15ug;QD~86P3ZD zR0}AcYBDLZN{yYUVVgGskl8d|i62#dR6K8(bd7y z1jZX}RkM@=K*!SjlQ?$B{%YUkx2f6x=|nh3B6k(OpDfL*c>)Iwfkj%PohLo+q;=#F zgQK2WrocY>V{geEvf1FU--aKC9b#Un_zq2_N9PQ)Lv@B8d*cUchyhZTJnOI%L@G@6 z96IjCx?KLc@kRuvE-O+gvQp-33tYCXzCkFM1YT`Tpc)sN9-|>gzE3g0-Wa#8Gr>im zLMKq_TQQn~G7aQdq97JLtN|9&dyb&&$aWxf?0r=6AUOtumzv!y!CQ&%9DE#v<%-C- z)mJ(N8k|w)IwLSfVY)wQ8frbz!sTY#M|cICdAEGXYhGGHH?(;_sPms^j25IOt3okZ zR0mET069$7M6N+c{A)tc6Pj&54Fd!5V{+ySMj{)A0+ihaxFszYig2`%wSf$dZ-S9R zuWMeUi_G!e4iD{f8>O~I0E0QDidHB!hVTy9^2rmmMSP~Im*_S*AA-9z6ZL1*L6Xom z7`Z9;bbRAE*Cyc>T*h}y4x%KpU6#@5>re$xU*vd$?h9L-Vvc_<43@^Lu ziA({jqfRn3Y|PGC@z|PIbv-AlOrd!28K&@$Zt;FTrDvZ{zY{)oM+}ktwe~@Xn#+Pv zU|`;4VE?i9|FO-A&288pv0>g3=H9>WKyzUB=5EH!UiNkZLSD_Xcpx)ya4w$I8Uj!% zA}13&pBgLQ2UgY(oT;jWAWAq^aW!^nHdY1p<}ZXGTo5=fUup­ap}gPbMxl?X)A zyi5d&1^;W%n{7xz?*G{M)Lk;rKh7i-mmDPakFhr(2k{`k4^sSpPARp397IF;AD5)~ zt``{i-{$>8^Dp^NoA;cWLkarFi=>iJfe66wpA(&5iIG6ym|*`GIxp3j0z?2}O;x4@ zVWcinfd27m|1vH9Wxo5gf0=(}fU^E&zWX$6lD}&G_Yq0{`v=&<-;wnHUCb<$G@~V6NtFZq^Q# ru74-@e`NjtZi4@(2zDw9H3;V))n%yPFO5p7IW>qDdW7s(cterm); } +Pin * +ConcreteNetwork::connect(Instance *inst, + LibertyPort *port, + Net *net) +{ + return connect(inst, reinterpret_cast(port), net); +} + Pin * ConcreteNetwork::connect(Instance *inst, Port *port, diff --git a/network/ConcreteNetwork.hh b/network/ConcreteNetwork.hh index 80108f96..4eeb88fe 100644 --- a/network/ConcreteNetwork.hh +++ b/network/ConcreteNetwork.hh @@ -196,6 +196,9 @@ public: virtual Pin *connect(Instance *inst, Port *port, Net *net); + virtual Pin *connect(Instance *inst, + LibertyPort *port, + Net *net); virtual void disconnectPin(Pin *pin); virtual void deletePin(Pin *pin); virtual Net *makeNet(const char *name, diff --git a/network/Network.hh b/network/Network.hh index 681c32cd..a974d1c7 100644 --- a/network/Network.hh +++ b/network/Network.hh @@ -491,6 +491,9 @@ public: virtual Pin *connect(Instance *inst, Port *port, Net *net) = 0; + virtual Pin *connect(Instance *inst, + LibertyPort *port, + Net *net) = 0; // makePin/connectPin replaced by connect. virtual void connectPin(Pin *pin, Net *net) __attribute__ ((deprecated)); diff --git a/network/SdcNetwork.cc b/network/SdcNetwork.cc index 47f0ff55..9c942c69 100644 --- a/network/SdcNetwork.cc +++ b/network/SdcNetwork.cc @@ -943,6 +943,14 @@ NetworkNameAdapter::connect(Instance *inst, return network_edit_->connect(inst, port, net); } +Pin * +NetworkNameAdapter::connect(Instance *inst, + LibertyPort *port, + Net *net) +{ + return network_edit_->connect(inst, port, net); +} + void NetworkNameAdapter::disconnectPin(Pin *pin) { diff --git a/network/SdcNetwork.hh b/network/SdcNetwork.hh index 4e46f7f6..adfa89a5 100644 --- a/network/SdcNetwork.hh +++ b/network/SdcNetwork.hh @@ -130,6 +130,9 @@ public: virtual Pin *connect(Instance *inst, Port *port, Net *net); + virtual Pin *connect(Instance *inst, + LibertyPort *port, + Net *net); virtual void disconnectPin(Pin *pin); virtual void deleteNet(Net *net); virtual void deletePin(Pin *pin); diff --git a/search/Sta.cc b/search/Sta.cc index 96edce7a..381b92ad 100644 --- a/search/Sta.cc +++ b/search/Sta.cc @@ -3673,6 +3673,16 @@ Sta::connectPin(Instance *inst, connectPinAfter(pin); } +void +Sta::connectPin(Instance *inst, + LibertyPort *port, + Net *net) +{ + NetworkEdit *network = networkCmdEdit(); + Pin *pin = network->connect(inst, port, net); + connectPinAfter(pin); +} + void Sta::disconnectPin(Pin *pin) { @@ -3681,6 +3691,47 @@ Sta::disconnectPin(Pin *pin) network->disconnectPin(pin); } +void +Sta::insertBuffer(const char *buffer_name, + LibertyCell *buffer_cell, + Net *net, + PinSeq *load_pins, + const char *buffer_out_net_name) +{ + Instance *parent = network_->topInstance(); + LibertyPort *buffer_in_port = findCellPort(buffer_cell, PortDirection::input()); + LibertyPort *buffer_out_port = findCellPort(buffer_cell, PortDirection::output()); + if (buffer_in_port && buffer_out_port) { + Instance *buffer = makeInstance(buffer_name, buffer_cell, parent); + connectPin(buffer, buffer_in_port, net); + + Net *buffer_out_net = makeNet(buffer_out_net_name, parent); + connectPin(buffer, buffer_out_port, buffer_out_net); + + PinSeq::Iterator pin_iter(load_pins); + while (pin_iter.hasNext()) { + Pin *load_pin = pin_iter.next(); + auto load_inst = network_->instance(load_pin); + auto load_port = network_->port(load_pin); + disconnectPin(load_pin); + connectPin(load_inst, load_port, buffer_out_net); + } + } +} + +LibertyPort * +Sta::findCellPort(LibertyCell *cell, + PortDirection *dir) +{ + LibertyCellPortIterator port_iter(cell); + while (port_iter.hasNext()) { + auto port = port_iter.next(); + if (port->direction() == dir) + return port; + } + return nullptr; +} + //////////////////////////////////////////////////////////////// // // Network edit before/after methods. diff --git a/search/Sta.hh b/search/Sta.hh index 5e11b7fe..95df50be 100644 --- a/search/Sta.hh +++ b/search/Sta.hh @@ -1081,11 +1081,9 @@ public: float elmore); // TCL network edit function support. - // create_cell virtual Instance *makeInstance(const char *name, LibertyCell *cell, Instance *parent); - // remove_cell virtual void deleteInstance(Instance *inst); // replace_cell virtual void replaceCell(Instance *inst, @@ -1097,9 +1095,22 @@ public: virtual void connectPin(Instance *inst, Port *port, Net *net); + virtual void connectPin(Instance *inst, + LibertyPort *port, + Net *net); // disconnect_net virtual void disconnectPin(Pin *pin); + // Insert a buffer_cell instance named inst_name by adding it's input + // pin on net and moving load_pins from net to the output of + // the instance. buffer_cell must have one input and one output port. + // The buffer's parent is the top_instance. + void insertBuffer(const char *buffer_name, + LibertyCell *buffer_cell, + Net *net, + PinSeq *load_pins, + const char *buffer_out_net_name); + // Network edit before/after methods. void makeInstanceAfter(Instance *inst); // Not used by Sta (connectPinAfter). @@ -1292,6 +1303,8 @@ protected: void powerPreamble(); void disableFanoutCrprPruning(Vertex *vertex, int &fanou); + LibertyPort *findCellPort(LibertyCell *cell, + PortDirection *dir); CmdNamespace cmd_namespace_; Instance *current_instance_; diff --git a/tcl/NetworkEdit.i b/tcl/NetworkEdit.i index 0fe381a4..faf7ebc0 100644 --- a/tcl/NetworkEdit.i +++ b/tcl/NetworkEdit.i @@ -93,4 +93,16 @@ disconnect_pin_cmd(Pin *pin) Sta::sta()->disconnectPin(pin); } +void +insert_buffer_cmd(const char *buffer_name, + LibertyCell *buffer_cell, + Net *net, + PinSeq *load_pins, + const char *buffer_out_net_name) +{ + Sta::sta()->insertBuffer(buffer_name, buffer_cell, net, load_pins, + buffer_out_net_name); + delete load_pins; +} + %} // inline diff --git a/tcl/NetworkEdit.tcl b/tcl/NetworkEdit.tcl index 5d9ec0ab..1afb1ecd 100644 --- a/tcl/NetworkEdit.tcl +++ b/tcl/NetworkEdit.tcl @@ -18,7 +18,66 @@ namespace eval sta { +proc connect_pin { net pin } { + set insts_port [parse_connect_pin $pin] + if { $insts_port == 0 } { + return 0 + } + set net [get_net_warn "net" $net] + if { $net == "NULL" } { + return 0 + } + lassign $insts_port inst port + connect_pin_cmd $inst $port $net + return 1 +} + +proc parse_connect_pin { arg } { + set path_regexp [path_regexp] + set insts_port {} + if { [is_object $arg] } { + set object_type [object_type $arg] + if { $object_type == "Pin" } { + set pin $arg + set inst [$pin instance] + set port [$pin port] + } elseif { $object_type == "Port" } { + # Explicit port arg - convert to pin. + set pin [find_pin [get_name $arg]] + set inst [$pin instance] + set port [$pin port] + } else { + sta_error "unsupported object type $object_type." + } + } else { + if {[regexp $path_regexp $arg ignore path_name port_name]} { + set inst [find_instance $path_name] + if { $inst == "NULL" } { + return 0 + } + } else { + set inst [top_instance] + set port_name $arg + } + set cell [$inst cell] + set port [$cell find_port $port_name] + if { $port == "NULL" } { + return 0 + } + set pin [$inst find_pin $port_name] + } + + # Make sure the pin is not currently connected to a net. + if { $pin != "NULL" \ + && ![$pin is_hierarchical] \ + && [$pin net] != "NULL" } { + return 0 + } + return [list $inst $port] +} + proc connect_pins { net pins } { + sta_warn "connect_pins is deprecated. Use connect_pin." # Visit the pins to make sure command will succeed. set insts_ports [parse_connect_pins $pins] if { $insts_ports == 0 } { @@ -36,105 +95,61 @@ proc connect_pins { net pins } { proc parse_connect_pins { arg } { set path_regexp [path_regexp] - set insts_ports {} + set inst_ports {} # Copy backslashes that will be removed by foreach. set arg [string map {\\ \\\\} $arg] foreach obj $arg { - if { [is_object $obj] } { - set object_type [object_type $obj] - if { $object_type == "Pin" } { - set pin $obj - set inst [$pin instance] - set port [$pin port] - } elseif { $object_type == "Port" } { - # Explicit port arg - convert to pin. - set pin [find_pin [get_name $obj]] - set inst [$pin instance] - set port [$pin port] - } else { - sta_error "unsupported object type $object_type." - } - } else { - if {[regexp $path_regexp $obj ignore path_name port_name]} { - set inst [find_instance $path_name] - if { $inst == "NULL" } { - return 0 - } - } else { - set inst [top_instance] - set port_name $obj - } - set cell [$inst cell] - set port [$cell find_port $port_name] - if { $port == "NULL" } { - return 0 - } - set pin [$inst find_pin $port_name] - } - - # Make sure the pin is not currently connected to a net. - if { $pin != "NULL" \ - && ![$pin is_hierarchical] \ - && [$pin net] != "NULL" } { + set inst_port [parse_connect_pin $obj] + if { $inst_port == 0 } { return 0 } - lappend insts_ports $inst $port + set inst_ports [concat $inst_ports $inst_port] } - return $insts_ports + return $inst_ports } ################################################################ -proc delete_instance { instances } { - # Copy backslashes that will be removed by foreach. - set instances1 [string map {\\ \\\\} $instances] - foreach obj $instances1 { - if { [is_object $obj] } { - set object_type [object_type $obj] - if { $object_type == "Instance" } { - set inst $obj - } else { - sta_error "unsupported object type $object_type." - } +proc delete_instance { instance } { + if { [is_object $instance] } { + set object_type [object_type $instance] + if { $object_type == "Instance" } { + set inst $obj } else { - set inst [find_instance $obj] - } - if { $inst != "NULL" } { - delete_instance_cmd $inst + sta_error "unsupported object type $object_type." } + } else { + set inst [find_instance $instance] + } + if { $inst != "NULL" } { + delete_instance_cmd $inst } } ################################################################ -proc delete_net { net_list } { - # Copy backslashes that will be removed by foreach. - set net_list [string map {\\ \\\\} $net_list] - foreach obj $net_list { - if { [is_object $obj] } { - set object_type [object_type $obj] - if { $object_type == "Net" } { - set net $obj - } else { - sta_error "unsupported object type $object_type." - } - } else { - set net [find_net $obj] - } - if { $net != "NULL" } { - delete_net_cmd $net +proc delete_net { net } { + if { [is_object $net] } { + set object_type [object_type $net] + if { $object_type != "Net" } { + sta_error "unsupported object type $object_type." } + } else { + set net [find_net $net] + } + if { $net != "NULL" } { + delete_net_cmd $net } } ################################################################ -proc disconnect_pins { net pins } { +proc disconnect_pin { net pin } { set net [get_net_warn "net" $net] if { $net == "NULL" } { return 0 } - if { $pins == "-all" } { + if { $pin == "-all" } { set iter [$net connected_pin_iterator] while {[$iter has_next]} { set pin [$iter next] @@ -143,46 +158,43 @@ proc disconnect_pins { net pins } { $iter finish return 1 } else { - # Copy backslashes that will be removed by foreach. - set pins [string map {\\ \\\\} $pins] - # Visit the pins to make sure command will succeed. - foreach pin $pins { - set pin1 [get_port_pin_warn "pin" $pin] - if { $pin1 == "NULL" } { - return 0 - } - } - foreach pin $pins { - set pin1 [get_port_pin_warn "pin" $pin] + set pin1 [get_port_pin_warn "pin" $pin] + if { $pin1 == "NULL" } { + return 0 + } else { disconnect_pin_cmd $pin1 + return 1 } - return 1 + } +} + +proc disconnect_pins { net pins } { + sta_warn "disconnect_pins is deprecated. Use disconnect_pin." + foreach pin $pins { + disconnect_pin $net $pins } } ################################################################ -proc make_instance { inst_names lib_cell } { +proc make_instance { inst_path lib_cell } { set lib_cell [get_lib_cell_warn "lib_cell" $lib_cell] if { $lib_cell != "NULL" } { set path_regexp [path_regexp] - foreach inst_path $inst_names { - if {[regexp $path_regexp $inst_path ignore path_name inst_name]} { - set parent [find_instance $path_name] - if { $parent == "NULL" } { - # Parent instance not found. This could be a typo, but since - # SDC does not escape hierarchy dividers it can also be - # an escaped name. - set inst_name $inst_path - set parent [top_instance] - } - } else { + if {[regexp $path_regexp $inst_path ignore path_name inst_name]} { + set parent [find_instance $path_name] + if { $parent == "NULL" } { + # Parent instance not found. This could be a typo, but since + # SDC does not escape hierarchy dividers it can also be + # an escaped name. set inst_name $inst_path set parent [top_instance] } - make_instance_cmd $inst_name $lib_cell $parent + } else { + set inst_name $inst_path + set parent [top_instance] } - return 1 + return [make_instance_cmd $inst_name $lib_cell $parent] } else { return 0 } @@ -190,29 +202,19 @@ proc make_instance { inst_names lib_cell } { ################################################################ -proc make_net { net_list } { - # Visit the net names to make sure command will succeed. - set path_regexp [path_regexp] - foreach net $net_list { - if {[regexp $path_regexp $net ignore path_name net_name]} { - set parent [find_instance $path_name] - if { $parent == "NULL" } { - return 0 - } - } - } +proc make_net { net_name } { # Copy backslashes that will be removed by foreach. - set net_list [string map {\\ \\\\} $net_list] - foreach net $net_list { - if {[regexp $path_regexp $net ignore path_name net_name]} { - set parent [find_instance $path_name] - } else { - set net_name $net - set parent [top_instance] + set net_name [string map {\\ \\\\} $net_name] + set path_regexp [path_regexp] + if {[regexp $path_regexp $net_name ignore path_name net_name]} { + set parent [find_instance $path_name] + if { $parent == "NULL" } { + return 0 } - make_net_cmd $net_name $parent + } else { + set parent [top_instance] } - return 1 + return [make_net_cmd $net_name $parent] } ################################################################ @@ -237,5 +239,23 @@ proc replace_cell { instances lib_cell } { } } +################################################################ + +proc insert_buffer { buffer_name buffer_cell net load_pins buffer_out_net_name } { + set buffer_cell [sta::get_lib_cell_warn "buffer_cell" $buffer_cell] + set net [sta::get_net_warn "net" $net] + + # Copy backslashes that will be removed by foreach. + set load_pins1 [string map {\\ \\\\} $load_pins] + set load_pins {} + foreach pin $load_pins1 { + set pin1 [get_port_pin_warn "pin" $pin] + if { $pin1 != "NULL" } { + lappend load_pins $pin1 + } + } + insert_buffer_cmd $buffer_name $buffer_cell $net $load_pins $buffer_out_net_name +} + # sta namespace end. } diff --git a/tcl/Sta.tcl b/tcl/Sta.tcl index 24907782..96048354 100644 --- a/tcl/Sta.tcl +++ b/tcl/Sta.tcl @@ -677,12 +677,16 @@ proc unset_timing_derate { args } { # ################################################################ +define_sta_cmd_args "connect_pin" {net pins} +# deprecated 2.0.16 05/02/2019 define_sta_cmd_args "connect_pins" {net pins} define_sta_cmd_args "delete_instance" {cell_list} define_sta_cmd_args "delete_net" {net_list} +define_sta_cmd_args "disconnect_pin" {net -all|pin} +# deprecated 2.0.16 05/02/2019 define_sta_cmd_args "disconnect_pins" {net -all|pins} define_sta_cmd_args "make_instance" {inst_names lib_cell} @@ -691,6 +695,9 @@ define_sta_cmd_args "make_net" {} define_sta_cmd_args "replace_cell" {instances lib_cell} +define_sta_cmd_args "insert_buffer" {buffer_name buffer_cell net load_pins\ + buffer_out_net_name} + ################################################################ # # Delay calculation commands