Useful ECO Commands
Useful ECO Commands
The very first command to analyze any cell's size/variant change behavior is estimate_eco. It is available
only in pt_shell. We can estimate what the trans/cap/timing will be if we change a particular cell's
size/variant.
estimate_eco gtfavdecpak11/aitunit1/U90 -lib_c e08nanb02ad2n01x3
The default estimate_eco cmd does not show the trans and cap of the cells, if you are fixing trans/cap,
make sure you enable them using the following cmd.
set eco_estimation_output_columns "transition max_transition area stage_delay arrival slack
max_capacitance"
Once we decide on any cell's size change or variant, we can use following cmd to actually change it. It
is used for both upsizing/downsizing and VT swaps.
size_cell gtlscbanktop1/lscl1bankunit1/prects_opt_HFSBUF_26651_669982 HDBULTLL06_BUF_CB3Q_6
A Word of caution: Make sure not to change any clock cells' VT variant while sizing the clock cell.
Following insert buffer command is used for hold fixing or inserting a buffer in LV HSD.
insert_buffer
lscsbusxlator2/xlator_core1/autovector_ex_read_xpose_addr1_reg[7]_MBIT_ex_read_xpose_addr1_re
g[6]/SI HDBLVTLL06_BUF_1 \
-new_net_names ww31p5_lv_net1 \
-new_cell_names ww31p5_lv_cell_1 \
-location {20.1960 152.0400}
TIP: If you are writing an stcl to fix hold in next man eco, as this cmd inserts the buffer on specified pin
location, you can skip the -location switch and the tool will try to place the buffer on nearby legal
location.
A word of caution: this command disturbs the net's (which is connected to the specified pin) routing as
it does not add the buffer by splitting existing net. Instead, it adds the buffer at the end of current net.
Hence, it is not preferred for setup/trans fixing.
The set cell location cmd is used to specify the correct orientation of the new cell on the specified
location. If the orientation is wrong, we will end up with PG shorts.
The M0 grid, where power pins of a std cell are connected, is generally alternating between VCC-VSS-
VCC-VSS M0 horizontal metal layers. The orientation of the cell comes into play in deciding where the
power pins of the cell will fall. If VCC pin falls on VSS M0 track, we will end up shorting the VCC of the
cell with VSS of the circuit.
Adding a buffer on a net at specified intervals: Used in trans fixing of a net or improve setup delay by
splitting high-delay long nets.
Please avoid giving this cmd to LV HSD, instead use insert_buffer cmd.
add_buffer_on_route [get_nets gtlscpar_rptunit1/ropt_net_1265494] \
-punch_port \
-lib_cell HDBULT06_BUF_CAQDCY2_10 \
-repeater_distance_length_ratio 0.34 \
-first_distance_length_ratio 0.34
TIP: There are more number of ways with which we can provide the repeater distance spec in this
command, do man on this command to know the same.
A word of caution: In case of filing LV HSD, always make sure you give the net change commands if
needed or new net stcl along with the new cell locations.
To remove buffers from a path: instead of using remove_cells, this is a much cleaner way of removing
the buffers/inv-pair without disturbing the routing.
remove_buffers { daprssunit1/daprss_arb1/pr_pteco_hold1_PTECO_HOLD_BUF2161 }
To duplicate any cell and split the fanouts use following cmd: this is a generic cmd that can be used
either on clock or data signals. The connect loads is used to connect the existing loads from the original
driver to the new driver.
util::duplicate_cell -ref_cell gtlscbanktop1/lscl1bankunit0/clkgate_rtl_clk_gate_latch_icg_0 \
-location {234.1920 248.4300} \
-ref_name HDBULTLL06_CKGTPLT_CAQV5Y4_16 \
-connect_loads [get_pins
{{gtlscbanktop1/lscl1bankunit0/loop[0].gcl_clk_gate_and1_ctech_lib_clk_and_en_ctech_lib_dt_dcszo/
CK}
{gtlscbanktop1/lscl1bankunit0/loop[1].gcl_clk_gate_and1_ctech_lib_clk_and_en_ctech_lib_dt_dcszo/
CK} {gtlscbanktop1/lscl1bankunit0/pwc_clk_gate_wrdata_f_reg_0_latch_icg_0/CK}}]
A word of Caution: While using the util::duplicate cmd, always give the connect loads list very carefully,
if a wrong pin is given in list, it will result in functional failure of the circuit (Gate2gate FEV will fail).
A word of Caution: eco::split_ctm_drivers may create an extra level in the clock path. Make sure to
check 1_26 and timing margins if using this cmd.
To reroute signal nets using ctm router (very good router but can destroy routing of neighboring nets,
use with caution):
eco::reroute_ctm_nets -nets $all_nets -force
To restrict tool touching any net (useful when manually routed some nets and do not want to fix net
shapes):
set_attribute -class net -name physical_status -value minor_change -objects $nets
To RIP the metal layer routing from any net (A word of caution: Never RIP any spine nets/RP nets/DOP
output net)
remove_routes -nets {gtlscbanktop1/lscl1bankunit0/gclk_refcnt_2546
gtlscbanktop1/lscl1bankunit0/gt_ram_sv_Nwr_strg/ctmn_911} \
-detail_route \
-global_route \
-user_route
2. For lower layer shorts: If there is no track available for reroute, move the cell (avoid moving any
sequential cell) with lower layer shorts out of congested area. RIP all the existing wiring of that
cell if moved very far, else manually reconnect the nets.
2. LVS shorts: Target these separately once ZRT shorts are clean. It becomes easier to clean these
after ZRT shorts are clean.
a. Check and correct any wrong orientation of cells causing PG shorts by using
set_cell_location cmd. Specify orientation using -orientation switch.
b. Check and incrementally correct any signal/clock nets causing shorts with PG grid. This
generally occurs due to the signal/clock net has fixed attribute and hence tool is not able
to move the shape by its own.
A word of caution: Many times, the router may fix the shorts but create opens in order to resolve those.
Please make sure to check all the opens after running route_eco.
Proper way of changing a net's logical connections (Caution: May result in FEV to fail if done
incorrectly):
set vpin [get_pins gtdssmpar3_rptunit1/gt_repeater_put_inf_16c70b0c062813e8e21eac1e807f5b08/
odata_reg[290]/SI]
set drvpin [get_pins
gtdssmpar3_rptunit1/gt_repeater_put_inf_16c70b0c062813e8e21eac1e807f5b08/
autovector_odata_reg[302]_MBIT_odata_reg[301]/Q2]
disconnect_net [get_nets -of_objects $vpin] $vpin
connect_pins -incremental $vpin -driver $drvpin
1. For 1st hold iteration, dump the setup and hold slack for the worst min corner
along with the unique endpoint in xls.
2. Prepare a tcl by inserting the appropriate buffer.
3. Leave out any paths with min-max conflict at endpoint. Also leave out any
violations while blind fixing which belong to a fub/unit which is congested. See
step 7 for their fixing strategy.
4. Fix them at and by analyzing the full path from violating startpoint.
5. This will fix most of the violations.
6. For second iteration, carefully check and fix the left out violations considering
start-endpoint pair to avoid setup degradation.
7. For the violations which were intentionally left out that belonged to a congested
fub/unit, try to downsize/backswap the buffers/cells already present in the timing
path which have enough trans & cap margins. You can also intentionally degrade
a net's routing to increase its delay, but do it with caution and do not violate any
other parameters like trans/DRCs while doing it. You may also find available
white space and manually insert hold buffers there without disturbing any other
cells.
8. Do not do blind fixing in 2nd iteration unless absolutely necessary. Try to
downsize/backswap the buffers/cells already present in the timing path which
have enough trans & cap margins. Else, Insert hold buffers very carefully.
RV fixing strategies
1. To fix IR,
a. space out the violating combo cells if there is a cluster
b. downsize the violating flops/clock-gates/latches, even if not in cluster.
c. maybe you have to then duplicate the cell after downsizing to meet the
trans/cap requirements (you can use the util::duplicate_cell or
eco::split_ctm_drivers to do the same)
d. make sure duplicated and original cells are not sharing the same M1 PG
track.
e. we can also make use of the metal densification script to densify M1 layer,
if not already densified.
f. If still it does not help, we can try for M2/M3 densification as a last resort.
(Caution: this may result in additional shorts)
2. To fix SIGEM,
a. we need to add a parallel stripe to the violating net
b. make sure we do not end up in same net VIA2VIA spacing DRCs or diff-net
VIA2VIA spacing DRCs - check with your LV team for exact spacing rules.
c. make sure not to degrade the source pin's grid structure. An example of
source pin grid structure is shown below. One pin has at least two parallel
lower layer tracks (M1-M4) to support higher current capacity.
3. To fix DIs,
a. check the orientation.
b. It should generally fix the orientation based PG LVS shorts.
Caliber fixing
1. 1_38 fixing strategies:
a. if cell is a low drive strength cell or has high fanouts:
i. upsize if size is available and cap/IR-RV is not degrading
ii. if upsize is not available or not possible due to above factors, split
b. if net's routing quality is bad (either routed on lower metal layers or has
zig-zag routing):
i. net improvement with manual routings
ii. if net is v long, insert a buffer to split the net but make sure to
check 1_26 and timing margins
2. 5_9 fixing strategies:
a. same as 1_38 strategies, only make sure not to use a clock buffer while
sizing/inserting.
3. 1_26 caliber rule:
a. This rule defines the extra min margins that must be met if you are
deviating from 3 levels of clock from DOP to Flop. This rule generally
violates only when PEO adds extra buffer(s) or removes existing buffer(s)
in a clock path.
b. The fix is to increase the hold margin on the violating endpoints based on
project specific hold margin requirements in each hold-convergence-
corner. The more the deviation from 3 levels of logic, greater is the min-
margin requirement.
4. 6_10: 6_* rule does not run at section level, so make sure you check your partition level
caliber reports to view the 6_* violations.
6_10 rule generally violates when,
i. ssb not driven by scanparisolshiften_cfg_reg, when data pins are driven by ports (fixed without -
shadowing switch)
ii. ssb not driven by scanshiften_cfg_reg, when data pins are not driven by ports (fixed without -
shadowing switch)
iii. ssb has unknown driver (waiver/tfm issue)
iv. si tied off when ssb is connected (fixed with -shadowing switch/waiver)
v. ssb signal not inverted from startpoint (waiver/tfm issue)
vi. incorrect si/ssb case values (waiver/tfm issue)
6_10 generally violates in following 2 cases, where fixes must be done by PEOs.
Case1: If SI pin is connected properly and SSB pin is connected to incorrect driver, you
can use following utility to fix the violations.
Case2: If SI pin is tied off and is violating in 6_10 xml, you can use -shadowing switch in
the "scan::scan_flop_checker" cmd to fix these type of violations. But please check
with your SQO before using this switch.
To fix ssb pins and shadow flops, we have the following utility:
scan::scan_flop_checker.
By default, the command will fix any ssb pin violation provided.
Examples of use:
scan::scan_flop_checker -flop <list of flops> : Fixes ssb pins only.
scan::scan_flop_checker -shadowing -flop <list of flops> : Fixes ssb pins and
shadow flops.
scan::scan_flop_checker -check -flop <list of flops> : Performs a high level check
of the cells (no fixes).
scan::scan_flop_checker -check -shadowing -flop <list of flops> : Performs a high
level check of the cells (no fixes).
Please note that the command may not have 100% hit rate, so left out violations must be
cleaned up either manually (as mentioned below) or iteratively running the utility.
Example:
disconnect_net -net [get_nets -of [get_pins maunit2/fifout_pre_reg[167]/SE]]
[get_pins maunit2/fifout_pre_reg[167]/SE]
connect_pin -driver maunit2/Buf2009047/X [get_pins
maunit2/fifout_pre_reg[167]/SE] -incremental
size_cell maunit2/Buf2009047 HDBULT06_BUF_CAQM_9
iMET Tool:
iMET is an ECO tool used for manual routing of nets. It eases PEO's manual efforts of net
routings.
To enable iMET plugin, source following script inside your ICC2/FC shell where you have opened
your DB.
source $env(GTKIT_PATH)/rally/tools/iMet/bin/imet.tcl
To draw shapes (via will be automatically inserted if u draw on same net), in case if short is getting
created it will not draw the shape:
To draw a shape of a particular metal layer, you can use following key shortcuts:
alt+0 to alt+9 (m0-m9)
ctrl+0 to ctrl+3 (m10-13)
To write outputs:
set va_nets [get_nets {names of nets whose routing has been changed and needs to be
preserved}]
source /nfs/site/disks/gmd_user_scripts/apaturka/scripts/tclscripts/write_routes_va.tcl
It will dump va_write_routes.tcl. You can source this tcl directly in your main ECO tcl at
appropriate location.
In case, you are changing some routes of existing net (and not creating new nets), you must
remove the earlier existing routes of that net (called as rip) and then source the
va_write_routes.tcl in the main eco.tcl.
remove_routes -detail_route -global_route -user_route -nets { names of nets
whose routing has been changed and needs to be preserved}
source va_write_routes.tcl
Add to the above list any other lib cells that must be excluded as per
caliber/setup/hold requirement.
legalize_placement -post_route
fill::insert_base_fill
route::eco -loops 10
route::search_and_repair -loops 30
#set ::route::params(adr_max_loops) 2 (ADR viz. Automatic DRC repair is used for sign-off DRC
checks and fixes which are not addressed by the router)
#route::adr
place::swap_cell_variants (to resolve orientation issues)
process::stdcell_power_hookup (this cmd is not required in TSMC process, please check with you
LV owner for the same in intel process)
common::rename_objects (changes the names if net and cell names are same - if they are same, it
causes issues in FEV)
upf::derive_pg_connections
upf::cleanup
fill::insert_metal_fill
kit::outputs
Example:
report_timing -nets -input_pins -thr
gtveboxpar11/veounit1/place_opt_fc_ZINV_inst_1159138/X
report_bottleneck : use to get worst cells in a timing path. A bottleneck is a common point in the
design that contributes to multiple violations.
report_bottleneck -cost <path_count | path_cost | fanout_endpoint_cost>
path_count (the default) - Uses the number of violating paths through the cell.
path_cost - Uses the total slack of violating paths through the cell.
fanout_endpoint_cost - Uses the total cost of violating endpoints in the fanout of the
cell.
e.g. >>