Fix_Eco
Fix_Eco
Fixes or improves design rule constraint (DRC) violations (noise violations, large delta delays, or cell electromigration violations) by
sizing cells or inserting buffers or inverter pairs.
SYNTAX
Status fix_eco_drc
-type max_transition | max_capacitance | max_fanout | noise | delta_delay | cell_em [-methods method_list]
[-buffer_list list] [-verbose] [-current_library]
[-physical_mode none | open_site | occupied_site | freeze_silicon]
[-hold_margin margin] [-setup_margin margin]
[-cell_type combinational | clock_network]
[-slack_lesser_than slack_limit]
[-unfixable_reasons_format text | csv]
[-unfixable_reasons_prefix string]
[-delta_delay_threshold threshold]
[-timeout seconds] [object_list]
If both the size_cell and insert_buffer methods are being used, the command can insert a buffer from the list and then size it to a
different buffer, even if the sized library cell is not explicitly included in the -buffer_list list.
DESCRIPTION
The fix_eco_drc command fixes or improves design rule constraint (DRC) violations, noise violations, large delta delays, or cell
electromigation violations by sizing cells and inserting buffers or inverter pairs.
You can report existing violations by using the report_constraint, report_noise, report_si_bottleneck -cost_type delta_delay, or
report_cell_em_violation command. The fix_eco_drc command attempts to fix the violations while minimizing the impact on area. By
default, the command performs fixing without considering the effects on timing.
After the violations are fixed, you can write out the design changes as a script by using the write_changes command. You can use the
script to implement the same changes in another PrimeTime session or another tool (Design Compiler, IC Compiler, or IC Compiler II).
A list of design changes created in this flow is called an engineering change order (ECO).
The fix_eco_drc command has options to specify the following fixing parameters:
The type of violation to fix (maximum transition time, maximum total net capacitance, maximum fanout, noise, delta delays,
or cell electromigration that exceed a specified threshold and contribute to negative slack)
The scope of the design to be fixed (a list of pins or ports, or the whole design)
The fixing methods (cell sizing, buffer insertion, or inverter pair insertion)
The list of library cells that can be used for buffer or inverter pair insertion
The types of cells to be modified (cells in data paths or cells in clock networks
Whether to consider timing constraints during fixing, and if so, the required setup and hold timing margins
The physical placement and sizing mode (none, open site, occupied site, or freeze silicon)
Example 1
The following example fixes maximum transition violations using only the size_cell method.
pt_shell> fix_eco_drc -type max_transition -verbose \ -methods size_cell
Unfixable violations:
A - There are available lib cells outside area limit
C - The violation is in clock network
I - Buffer insertion with given lib cells cannot fix the violation
P - Driver cell of the violation is a port
Q - Driver cell of the violation is a sequential cell
S - Cell sizing with alternative lib cells cannot fix the violation
T - Timing margin is too tight to fix the violation
V - Driver cell of the violation is dont_touched
U - UPF restricts fixing the violation
Violation Reasons
U1/I P
U6/I S
Remaining Violations:
Violation Type Count
Total remaining violations 2
Unfixable violations 2
After fixing, two unfixable violations remain. The unfixable reason "S" shows that U6/I was not fixed because none of the alternative
library cells can fix the maximum transition violation. The reason "P" shows that U1/I was not fixed because its driver is a port, which
cannot be resized.
Example 2
In the next run, you try the buffer insertion method to fix the violation using the three buffer library cells BUFX1, BUFX2, and BUFX3.
pt_shell> fix_eco_drc -type max_transition -verbose \ -methods insert_buffer -buffer_list { BUFX1 BUFX2 BUFX3 }
Example 3
The following example performs physically aware fixing.
pt_shell> fix_eco_drc -type max_transition -verbose \ -methods insert_buffer -buffer_list {BUFX1 BUFX2 BUFX3} \ -physical_mode
open_site
Example 4
The following example fixes noise violations using both the size_cell and insert_buffer methods.
pt_shell> fix_eco_drc -type noise -verbose \ -methods {size_cell insert_buffer} \ -buffer_list { BUFX1 BUFX2 BUFX3 } \ -physical_mode
open_site
Example 5
The following example uses the -insert_inverter_pair method to perform maximum transition fixing in a clock network.
pt_shell> fix_eco_drc -type max_transition -cell_type clock_network \ -buffer_list {INVX1 INVX2 INVX4} \ -methods
insert_inverter_pair
Example 6
The following example uses the -insert_inverter_pair method to perform maximum transition fixing in data paths.
pt_shell> fix_eco_drc -type max_transition -cell_type combinational \ -buffer_list {INVX1 INVX2 INVX4} \ -methods
insert_inverter_pair
Example 7
The following example shows usage of the -slack_lesser_than option to fix large noise violations with slack worse than -0.05, thereby
ignoring violations with slack range between -0.05 and 0.0.
pt_shell> fix_eco_drc -type noise -slack_lesser_than -0.05 \ -buffer_list {BUFX1 BUFX2 BUFX4}
Example 8
The following example optimizes victim nets with delta delay cost of more than 0.05 time units and that belong to a path with
negative timing slack, using both the size_cell and insert_buffer fixing methods.
pt_shell> fix_eco_drc -type delta_delay -verbose \ -delta_delay_threshold 0.05 \ -methods {size_cell insert_buffer} \ -buffer_list {
BUFX1 BUFX2 BUFX3 } \ -physical_mode open_site
fix_eco_timing
Fixes or improves timing violations through engineering change orders (ECOs).
SYNTAX
status fix_eco_timing
-type setup | hold
[-methods method_list]
[-slack_lesser_than slack_limit]
[-slack_greater_than slack_limit]
[-group group_name]
[-pba_mode none | path | exhaustive | ml_exhaustive]
[-from from_list]
[-to to_list]
[-setup_margin margin]
[-hold_margin margin]
[-buffer_list list]
[-verbose]
[-current_library]
[-ignore_drc]
[-cell_type combinational | sequential | clock_network]
[-physical_mode none | open_site | occupied_site | freeze_silicon]
[-path_selection_options option_string]
[-timeout seconds]
[-power_attribute power_attribute_name]
[-clock_fixes_per_change violation_limit]
[-clock_max_level_from_reg level_limit]
[-estimate_unfixable_reasons]
[-power_mode total | dynamic | leakage]
[-leakage_scenario scenario_name]
[-dynamic_scenario scenario_name]
[-load_cell_list list]
[-target_violation_type violation_type]
[-wns_limit wns_value]
[-unfixable_reasons_format text | csv]
[-unfixable_reasons_prefix string]
-methods method_list
Specifies one or more fixing methods from the following list:
size_cell - Replaces cells in the timing path with logically identical cells that have a different drive strength
size_cell_side_load - Same as size_cell, but also replaces cells in the fanout of drivers in the path with logically identical cells
to reduce parasitic load capacitance along the path (used only for -type setup fixing)
insert_buffer - Inserts buffers in the timing path, using the library cells specified by the -buffer_list option
insert_buffer_at_load_pins - Inserts buffers in the timing path only at load pins, not at driver pins
insert_buffer_at_driver_pins - Inserts buffers in the timing path only at driver pins, not at load pins
insert_inverter_pair - Inserts pairs of inverter cells instead of buffer cells; cannot be used together with the insert_buffer
method
bypass_buffer - Bypasses buffers or inverter pairs in a clock network; can be used only when the clock_network cell type is
specified.
remove_buffer - Removes buffers to improve setup timing without introducing or worsening hold timing and DRC violations.
For setup fixing (-type setup), you can specify either size_cell or size_cell_side_load; the default is size_cell_side_load. You can use
the insert_buffer method alone or together with size_cell or size_cell_side_load if the -physical_mode option is set to either
open_site or occupied_site; for the freeze_silicon setting, insert_buffer is the only method allowed.
For hold fixing (-type hold), you can specify one or more of the methods size_cell, insert_buffer, insert_buffer_at_load_pins, and
insert_inverter_pair; the default is {size_cell insert_buffer}. By default, the insert_buffer method inserts buffers at both driver and
load pins. To insert buffers only at load pins, use the insert_buffer_at_load_pins option without the insert_buffer option.
The insert_inverter_pair method inserts inverter pairs both at driver and load pins, choosing from the inverter library cells specified
by the -buffer_list option. This method works well together with size_cell (-methods {size_cell insert_inverter_pair}).
The remove_buffer method has the following restrictions:
It cannot be used with any of the following options: -cell_type, -power_attribute, -current_library, -load_cell_list, -timeout, and -
power_mode.
In setup fixing, it cannot be combined with other methods; it must be used by itself.
It cannot be used in hold fixing.
DESCRIPTION
The fix_eco_timing command fixes or improves timing violations by sizing cells and inserting buffers or inverter pairs. It attempts to
PrimeTime® Suite Tool Commands Version T-2022.03-SP4 fix_eco_timing fix the specified types of violations while minimizing the
impact on area and power.
After the violations are fixed, you can write out the design changes as a script by using the write_changes command. You can use the
script to implement the same changes in another PrimeTime session or another tool (Design Compiler, IC Compiler, or IC Compiler II).
A list of design changes created in this flow is called an engineering change order (ECO).
The fix_eco_timing command has options to specify the following fixing parameters:
The type of timing violations to fix (setup or hold)
The scope of the design to be fixed (from/to startpoints/endpoints, path groups, a path collection, or the whole design) The
fixing methods (cell sizing, buffer insertion, or inverter pair insertion)
The list of library cells that can be used for buffer or inverter pair insertion
The types of cells to be modified (data paths, sequential cells, or clock networks)
The targeted amount of timing margin (slack) to achieve
The graph-based analysis mode (graph-based, path-based, or path-based exhaustive)
The physical placement and sizing mode (none, open site, occupied site, or freeze silicon
Example 1
The following example overfixes setup violations with a slack worse than -0.1 to achieve a positive setup slack of 0.1 (while ignoring
paths with a setup slack better than -0.1):
Example 2
The following example overfixes setup violations with a slack worse than 0.2 to achieve a positive setup slack of 0.2. Note that this
overfixes some positive-slack paths, for example, by increasing the slack from 0.1 to 0.2.
Example 3
The following example overfixes all setup violations to achieve a positive setup slack of 0.2, while preserving a hold slack of at least
0.1:
Example 4
The following example fixes setup violations with slack between -2.0 and 0.0 (while ignoring paths with violations worse than-2.0):
Example 5
The following example fixes hold violations using only cell sizing.
Example 6
The following example fixes a small set of hold violations that have an exhaustive path-based slack of less than zero:
pt_shell> fix_eco_timing -type hold -pba_mode exhaustive \ -buffer_list {BUFX2 DLY1X2 DLY2X2}
Example 7
The following example fixes setup violations only in a selected set of path groups, with verbose reporting of unfixable violations:
Example 9
The following example fixes setup violations by sizing both sequential and combinational cells:
Example 10
The following example applies the pt_dont_use user-defined attribute to a set of library cells. You must define the user-defined
attribute first.
Example 11
You can use the attribute directly with the set_user_attribute command, or for convenience, you can define the following procedure:
Example 12
Now you can use this procedure to apply the attribute:
set_pt_dont_use {lib/CLKBUF* lib/CLKMUX*}
Example 13
In the distributed multi-scenario analysis (DMSA) flow, you must define and apply the attribute at the scenarios using the
remote_execute command.
The following example uses the -physical_mode option to specify the open_site mode.
pt_shell> fix_eco_timing -type hold -physical_mode open_site \ -buffer_list {BUFX2 DLY1X2 DLY2X2}
Example 14
The following example uses the -path_selection_options option to target specific paths for fixing setup violations.
pt_shell> fix_eco_timing -type setup -path_selection_options \ {-through u01/A -to ff0/D -max_paths 10 -nworst 5}
Example 15
The following example uses the -path_selection_options option to target specific paths for fixing hold violations.
pt_shell> fix_eco_timing -type hold -buffer_list {BUFX2 DLY1X2 DLY2X2} \ -path_selection_options {-delay_type min -from ff0/Q \ -
max_paths 100 -nworst 10}
Example 16
In the distributed multi-scenario analysis flow, you must define variables in the worker processes if you want to use them in the -
path_selection_options option. The following example uses the -path_selection_options option in distributed multi-scenario analysis
with a variable.
Example 17
Alternatively, you can define the variable as a list instead of a collection:
pt_shell> remote_exec {set startpoints "{ff0/Q ff1/Q}"} pt_shell> fix_eco_timing -type hold -buffer_list {BUFX2 DLY1X2 DLY2X2} \ -
path_selection_options {-delay_type min -from $startpoints \ -max_paths 100 -nworst 5}
Example 18
The following example performs setup fixing by modifying the clock network.
Example 19
The following example uses the insert_inverter_pair method to perform setup fixing in a clock network.
pt_shell> fix_eco_timing -type setup -methods insert_inverter_pair \ -cell_type clock_network -buffer_list {INVX1 INVX2 INVX4}
Example 20
The following example uses the insert_inverter_pair method to perform hold fixing in data paths.
pt_shell> fix_eco_timing -type hold -methods insert_inverter_pair \ -buffer_list {INVX1 INVX2 INVX4}
Example 21
The following example uses the -estimate_unfixable_reasons option to generate a report of unfixable reasons without actually fixing
the design. The variable eco_report_unfixed_reason_max_endpoints must be set to a positive integer.
In this example, if the command reports unfixable reason code "I: buffer list with given lib cells cannot fix violation," you can modify
the buffer list to include a larger range of buffer library cells and get a quick estimate of the results before you start actual fixing.
Example 22
The following example uses the load_cell_list option to perform hold fixing for violations in order of picoseconds along data path.
pt_shell> fix_eco_timing -type hold -methods insert_buffer \ -load_cell_list {CLOAD1 CLOAD2} -slack_greater_than -0.005
Example 23
The following example uses the -load_cell_list option in single operation along with the -buffer_list option to fix hold violations.
pt_shell> fix_eco_timing -type hold -methods insert_buffer \ -load_cell_list {CLOAD1 CLOAD2} -buffer_list {BUFX1 BUFX2}
Example 24
The following example uses the remove_buffer method to fix setup violations.