# Flow Configuration Variables
This page is the comprehensive manual for user-configurable flow variables
and their default values.
Variables that are defined by the PDK configuration support files and not the
flow itself are listed [in this chapter](./pdk_configuration.md).
:::{admonition} A couple things to keep in mind
* This is a comprehesive list- there are many variables here you would never
need to touch. If you want just a brief list of variables you should be
using, see the usage guide [Hardening Macros](../usage/hardening_macros.md).
* Deprecated variables are automatically translated to their new names for at
least 6 months. Removed variables will be entirely ignored by the flow.
* Variables prefixed `RUN_` enable or disable a certain step as part of the
larger OpenLane flow, not when calling the relevant function standalone.
For example, if RUN_DRT is set 0, but calling `detailed_routing` in
interactive mode will still run detailed routing.
:::
## General
```{warning}
The `` `include `` directive is *not* supported in Verilog files. List all the
files you may be depending on, including headers, in `VERILOG_FILES`.
```
|Variable|Description|
|-|-|
| `PDK` | Specifies the process design kit (PDK).
(Default: `sky130A`)|
| `DESIGN_NAME` | The name of the top level module of the design |
| `VERILOG_FILES` | The path of the design's Verilog files, provided as an array of files in JSON or a whitespace-delimited list of files in Tcl. The files are evaluated in order, i.e., if file B depends on file A, file A must be listed first. |
| `CLOCK_PERIOD` | The clock period used for clocks in the design, in nanoseconds. |
| `CLOCK_PORT` | The name of the design's clock port. |
| `CLOCK_NET` | The name of the net input to root clock buffer.
(Default: `CLOCK_PORT`) |
| `STD_CELL_LIBRARY` | Specifies the standard cell library to be used under the specified PDK.
(Default: `sky130_fd_sc_hd`)|
| `STD_CELL_LIBRARY_OPT` | Specifies the standard cell library to be used during resizer optimizations.
(Default: `STD_CELL_LIBRARY`)|
| `PDK_ROOT` | Specifies the folder path of the PDK. It searches for a `config.tcl` in `$::env(PDK_ROOT)/$::env(PDK)/libs.tech/openlane/` directory and at least have one standard cell library config defined in `$::env(PDK_ROOT)/$::env(PDK)/libs.tech/openlane/$::env(STD_CELL_LIBRARY)`. |
| `DIODE_PADDING` | Number of sites to left pad `DIODE_CELL` during detailed placement.
(Default: `2` sites)|
| `MERGED_LEF` | Points to `merged.lef`, which is a merger of various LEF files, including the technology lef, cells lef, any custom lefs, and IO lefs. |
| `NO_SYNTH_CELL_LIST` | Specifies the file that contains the don't-use-cell-list to be excluded from the liberty file during synthesis. If it's not defined, this path is searched `$::env(PDK_ROOT)/$::env(PDK)/libs.tech/openlane/$::env(STD_CELL_LIBRARY)/no_synth.cells` and if it's not found, then the original liberty will be used as is. |
| `DRC_EXCLUDE_CELL_LIST` | Specifies the file that contains the don't-use-cell-list to be excluded from the liberty file during synthesis and timing optimizations. If it's not defined, this path is searched `$::env(PDK_ROOT)/$::env(PDK)/libs.tech/openlane/$::env(STD_CELL_LIBRARY)/drc_exclude.cells` and if it's not found, then the original liberty will be used as is. In other words, `DRC_EXCLUDE_CELL_LIST` contain the only excluded cell list in timing optimizations. |
| `BASE_SDC_FILE` | Specifies the base SDC file using during the flow. It is the default SDC file used for `PNR_SDC_FILE` and `SIGNOFF_SDC_FILE`
(Default: `$::env(OPENLANE_ROOT)/scripts/base.SDC`) |
| `PNR_SDC_FILE` | Specifies the SDC file used during all implementation (PnR) stages. It is used by tools in the flow and during STA done at these stages. It is *not* used during signoff stage.
(Default: `$::env(BASE_SDC_FILE)`) |
### Macros/Chip Integration
|Variable|Description|
|-|-|
| `VERILOG_FILES_BLACKBOX` | Black-boxed, Verilog files where the implementation is ignored. Useful for pre-hardened macros you incorporate into your design, used during synthesis and OpenSTA. `/// sta-blackbox` can be added to a file in order to skip that file while doing STA. This will blackbox all the modules defined inside that file. It is recommended to provide a gatelevel netlist whenever possible to do full STA. |
| `EXTRA_LEFS` | Specifies LEF files of pre-hardened macros used in the current design, used in placement and routing. |
| `EXTRA_LIBS` | Specifies LIB files of pre-hardened macros used in the current design, used during timing analysis. (Optional) |
| `EXTRA_GDS_FILES` | Specifies GDS files of pre-hardened macros used in the current design, used during tape-out. |
## Linting
* If you're running a hierarchical design (i.e. one that incorporates Macros
or directly instantiates SCLs), Linting may not work correctly. You have two
options:
1. Provide blackboxes for all gate-level models instantiated by the top level
design or any of its macros.
* Files in `VERILOG_FILES_BLACKBOX` will not be included by default.
*
2. Disable linting altogether.
|Variable|Description|
|-|-|
| `RUN_LINTER` | Enable linter (currently Verilator)
(Default: `1`)
| `LINTER_RELATIVE_INCLUDES` ‡ | When a file references an include file, resolve the filename relative to the path of the referencing file, instead of relative to the current directory.
(Default: `1`) |
| `LINTER_DEFINES` | A list of defines that are passed to the linter. The syntax for each item in the list is as follows `(=)`. `(=value)` is optional. Both `PnR=1` or `PnR` are accepted
(Default: `SYNTH_DEFINES`) |
| `LINTER_INCLUDE_PDK_MODELS` | Enables including verilog models of the pdk with the linter. This is useful when the design has hand instantiated macros. This variable has no effect if the PDK/STD_CELL_LIBRARY aren't supported. Currently, sky130A/sky130_fd_sc_hd and sky130B/sky130_fd_sc_hd are the only ones supported
(Default: `1`) |
> **‡** Variable previously prefixed `VERILATOR_` have had their prefix changed to `LINTER_`. The replaced variable is deprecated and will be translated to its new form automatically by the flow.
## Synthesis
|Variable|Description|
|-|-|
| `SYNTH_AUTONAME` | Add a synthesis step to generate names for instances. This results in instance names that can be very long, but may be more useful than the internal names that are six digit numbers.
Enabled = 1, Disabled = 0
(Default: `0`)|
| `SYNTH_BIN` | The yosys binary used in the flow.
(Default: `yosys`) |
| `SYNTH_DEFINES` | Specifies verilog defines. Variable should be provided as a json/tcl list.
(Default: None) |
| `SYNTH_CLOCK_UNCERTAINTY` | Specifies a value for the clock uncertainty/jitter for timing analysis.
(Default: `0.25`) |
| `SYNTH_CLOCK_TRANSITION` | Specifies a value for the clock transition /slew for timing analysis.
(Default: `0.15`) |
| `SYNTH_TIMING_DERATE` | Specifies a derating factor to multiply the path delays with. It specifies the upper and lower ranges of timing.
(Default: `+5%/-5%`) |
| `SYNTH_STRATEGY` | Strategies for abc logic synthesis and technology mapping
Possible values are `DELAY/AREA 0-4/0-3`; the first part refers to the optimization target of the synthesis strategy (area vs. delay) and the second one is an index.
(Default: `AREA 0`)|
| `SYNTH_BUFFERING` | Enables abc cell buffering
Enabled = 1, Disabled = 0
(Default: `1`)|
| `SYNTH_SIZING` | Enables abc cell sizing (instead of buffering)
Enabled = 1, Disabled = 0
(Default: `0`)|
| `SYNTH_NO_FLAT` | A flag that disables flattening the hierarchy during synthesis, only flattening it after synthesis, mapping and optimizations.
Enabled = 1, Disabled = 0
(Default: `0`)|
| `SYNTH_SHARE_RESOURCES` | A flag that enables yosys to reduce the number of cells by determining shareable resources and merging them.
Enabled = 1, Disabled = 0
(Default: `1`)|
| `SYNTH_ABC_LEGACY_REFACTOR` | Replaces the ABC command `drf -l` with `refactor` which matches older versions of OpenLane but is more unstable.
Enabled = 1, Disabled = 0
(Default: `0`) |
| `SYNTH_ABC_LEGACY_REWRITE` | Replaces the ABC command `drw -l` with `rewrite` which matches older versions of OpenLane but is more unstable.
Enabled = 1, Disabled = 0
(Default: `0`) |
| `SYNTH_ADDER_TYPE` | Adder type to which the $add and $sub operators are mapped to.
Possible values are `YOSYS/FA/RCA/CSA`; where `YOSYS` refers to using Yosys internal adder definition, `FA` refers to full-adder structure, `RCA` refers to ripple carry adder structure, and `CSA` refers to carry select adder.
(Default: `YOSYS`)|
| `SYNTH_EXTRA_MAPPING_FILE` | Points to extra techmap file for yosys that runs right after yosys `synth` before generic techmap.
(Default: `""`)|
| `SYNTH_PARAMETERS` | Whitespace-delimited key value pairs to be `chparam`ed in Yosys. In the format `key1=value1 key2=value2`
(Default: None) |
| `SYNTH_ELABORATE_ONLY` | "Elaborate" the design only without attempting any logic mapping. Useful when dealing with structural Verilog netlists.
(Default: `0`) |
| `VERILOG_INCLUDE_DIRS` | Specifies the verilog includes directories.
Optional. |
| `SYNTH_FLAT_TOP` | Specifies whether or not the top level should be flattened during elaboration. 1 = True, 0= False
(Default: `0`)|
| `IO_PCT` | Specifies the percentage of the clock period used in the input/output delays. Ranges from 0 to 1.0.
(Default: `0.2`) |
| `SYNTH_BUFFER_DIRECT_WIRES` | Insert buffer cells into the design for directly connected wires.
(Default: `1`) |
| `SYNTH_SPLITNETS` | Splits multi-bit nets into single-bit nets.
(Default: `1`) |
| `SYNTH_TOP_LEVEL` | **Deprecated: Use `SYNTH_ELABORATE_ONLY`**: "Elaborate" the design only without attempting any logic mapping. Useful when dealing with structural Verilog netlists. |
| `SYNTH_MAX_FANOUT` | **Deprecated: Use the PDK's `MAX_FANOUT_CONSTRAINT` value**: The max load that the output ports can drive. |
| `SYNTH_MAX_TRAN` | **Deprecated: Use the PDK's `MAX_TRANSITION_CONSTRAINT` value**: The max transition time (slew) from high to low or low to high on cell inputs in ns. If unset, the library's default maximum transition time will be used. |
| `SYNTH_READ_BLACKBOX_LIB` | **Removed: The liberty file is always read now. A flag that enable reading the full(untrimmed) liberty file as a blackbox for synthesis. Please note that this is not used in technology mapping. This should only be used when trying to preserve gate instances in the rtl of the design.
Enabled = 1, Disabled = 0
(Default: `0`)|
## Static Timing Analysis (STA)
| Variable | Description |
|-|-|
| `STA_REPORT_POWER` | Enables reporting power in sta.
(Default: `1`) |
| `EXTRA_SPEFS` | Specifies min, nom, max spef files for modules(s). Variable should be provided as a json/tcl list or a space delimited tcl string. Note that a module name is provided not an instance name. A module may have multiple instances. Each module must have define 3 files, one for each corner. For example: `module1 min1 nom1 max1 module2 min2 nom2 max2`. A file can be used multiple time in case of absence of other corner files. For example: `module nom nom nom`. In this case, the nom file will be used in all corners of sta. At all times a module must specify 3 files.
(Default: None) |
| `STA_WRITE_LIB` | Controls whether a timing model is written using OpenROAD OpenSTA after static timing analysis. This is an option as it in its current state, the timing model generation (and the model itself) can be quite buggy.
(Default: `1`) |
## Floorplanning (FP)
|Variable|Description|
|-|-|
| `RUN_TAP_DECAP_INSERTION` | Enables tap and decap cells insertion after floorplanning. 1 = Enabled, 0 = Disabled
(Default: `1`) |
| `FP_CORE_UTIL` | The core utilization percentage.
(Default: `50` percent)|
| `FP_ASPECT_RATIO` | The core's aspect ratio (height / width).
(Default: `1`)|
| `FP_SIZING` | Whether to use relative sizing by making use of `FP_CORE_UTIL` or absolute one using `DIE_AREA`.
(Default: `"relative"` - accepts `"absolute"` as well)|
| `DIE_AREA` | Specific die area to be used in floorplanning when `FP_SIZING` is set to `absolute`. Specified as a 4-corner rectangle "x0 y0 x1 y1". Units in μm
(Default: unset)|
| `CORE_AREA` | Specific core area (i.e. die area minus margins) to be used in floorplanning when `FP_SIZING` is set to `absolute`. Specified as a 4-corner rectangle "x0 y0 x1 y1". Units in μm
(Default: unset)|
| `FP_IO_MODE` | Decides the mode of the random IO placement option. 0=matching mode, 1=random equidistant mode. Matching mode attempts to optimize pin and cell placement. Random equidistant mode places equidistant pins with a random order
(Default: `0`)|
| `FP_WELLTAP_CELL` | The name of the welltap cell during welltap insertion. |
| `FP_ENDCAP_CELL` | The name of the endcap cell during endcap insertion. |
| `FP_PDN_CFG` | Points to a PDN configuration file that describes how to construct the PDN in detail.
(Default: `scripts/openroad/common/pdn_cfg.tcl`) |
| `FP_PDN_AUTO_ADJUST` | Decides whether or not the flow should attempt to re-adjust the power grid, in order for it to fit inside the core area of the design, if needed. 1 = Enabled, 0 = Disabled.
(Default: `1`) |
| `FP_PDN_SKIPTRIM` | Enables `-skip_trim` option during pdngen which skips the metal trim step, which attempts to remove metal stubs. 1 = Enabled, 0 = Disabled.
(Default: `1`) |
| `FP_TAPCELL_DIST` | The horizontal distance between two tapcell columns
(Default: `14`) |
| `FP_IO_VEXTEND` | Extends the vertical io pins outside of the die by the specified units
(Default: `0` Disabled) |
| `FP_IO_HEXTEND` | Extends the horizontal io pins outside of the die by the specified units
(Default: `0` Disabled) |
| `FP_IO_VLENGTH` | The length of the vertical IOs in microns.
(Default: `4`) |
| `FP_IO_HLENGTH` | The length of the horizontal IOs in microns.
(Default: `4`) |
| `FP_IO_VTHICKNESS_MULT` | A multiplier for vertical pin thickness. Base thickness is the pins layer minwidth
(Default: `2`) |
| `FP_IO_HTHICKNESS_MULT` | A multiplier for horizontal pin thickness. Base thickness is the pins layer minwidth
(Default: `2`) |
| `FP_IO_UNMATCHED_ERROR` | Exit on unmatched pins in a provided `FP_PIN_ORDER_CFG` file. 1 = Enabled, 0 = Disabled.
(Default: `1`) |
| `BOTTOM_MARGIN_MULT` | The core margin, in multiples of site heights, from the bottom boundary. If `FP_SIZING` is absolute and `CORE_AREA` is set, this variable has no effect.
(Default: `4`) |
| `TOP_MARGIN_MULT` | The core margin, in multiples of site heights, from the top boundary. If `FP_SIZING` is absolute and `CORE_AREA` is set, this variable has no effect.
(Default: `4`) |
| `LEFT_MARGIN_MULT` | The core margin, in multiples of site widths, from the left boundary. If `FP_SIZING` is absolute and `CORE_AREA` is set, this variable has no effect.
(Default: `12`) |
| `RIGHT_MARGIN_MULT` | The core margin, in multiples of site widths, from the right boundary. If `FP_SIZING` is absolute and `CORE_AREA` is set, this variable has no effect.
(Default: `12`) |
| `FP_PDN_CORE_RING` | Enables adding a core ring around the design. More details on the control variables in the pdk configurations documentation. 1 = Enabled, 0 = Disabled.
(Default: `0`) |
| `FP_PDN_ENABLE_GLOBAL_CONNECTIONS` | Enables power connection to std cells. It is rare that this variable needs to be disabled
(Default: `1`) |
| `FP_PDN_ENABLE_RAILS` | Enables the creation of rails in the power grid. 1 = Enabled, 0 = Disabled.
(Default: `1`) |
| `FP_PDN_ENABLE_MACROS_GRID` | Enables the connection of macros to the top level power grid. 1 = Enabled, 0 = Disabled.
(Default: `1`) |
| `FP_PDN_MACRO_HOOKS` | Specifies explicit power connections of internal macros to the top level power grid as a list of macro instance names, power domain vdd and ground net names, and macro vdd and ground pin names: ` `. In JSON, declare it as an array of strings, and in Tcl, use commas as a delimiter. |
| `FP_PDN_CHECK_NODES` | Enables checking for unconnected nodes in the power grid. 1 = Enabled, 0 = Disabled.
(Default: `1`) |
| `FP_TAP_HORIZONTAL_HALO` | Specify the horizontal halo size around macros during tap insertion. The value provided is in microns.
(Default: `10`) |
| `FP_TAP_VERTICAL_HALO` | Specify the vertical halo size around macros during tap insertion. The value provided is in microns.
(Default: set to the value of `FP_TAP_HORIZONTAL_HALO`) |
| `FP_PDN_HORIZONTAL_HALO` | Sets the horizontal halo around the macros during power grid insertion. The value provided is in microns.
(Default: `10`) |
| `FP_PDN_VERTICAL_HALO` | Sets the vertical halo around the macros during power grid insertion. The value provided is in microns.
(Default: set to the value of `FP_PDN_HORIZONTAL_HALO`) |
| `FP_PDN_MULTILAYER` | Controls the layers used in the power grid. If set to `0` (Tcl)/`false` (JSON), only the lower, vertical layer will be used, which is useful when hardening a macro for integrating into a larger top-level design.
(Default: `1`)|
| `FP_PIN_ORDER_CFG` | Points to the pin order configuration file to set the pins in specific directions (S, W, E, N). If not set, then the IO pins will be placed based on one of the other methods depending on the rest of the configurations. `$` i.e. `$1` can be used to place a virtual pin where `` is the count of virtual pins. This can create separation between pins. You can also use `@min_distance=` i.e. `@min_distance=0.8` to set preferred min distance between pins in a specific direction. See spm configuration file as an example.
(Default: None)|
| `FP_CONTEXT_DEF` | Points to the parent DEF file that includes this macro/design and uses this DEF file to determine the best locations for the pins. It must be used with `FP_CONTEXT_LEF`, otherwise it's considered non-existing. If not set, then the IO pins will be placed based on one of the other methods depending on the rest of the configurations.
(Default: None)|
| `FP_CONTEXT_LEF` | Points to the parent LEF file that includes this macro/design and uses this LEF file to determine the best locations for the pins. It must be used with `FP_CONTEXT_DEF`, otherwise it's considered non-existing. If not set, then the IO pins will be placed based on one of the other methods depending on the rest of the configurations.
(Default: None)|
| `FP_DEF_TEMPLATE` | Points to the DEF file to be used as a template when running `apply_def_template`. This will be used to exctract pin names, locations, shapes -excluding power and ground pins- as well as the die area and replicate all this information in the `CURRENT_DEF`. |
| `VDD_NETS` | Specifies the power nets/pins to be used when creating the power grid for the design. |
| `GND_NETS` | Specifies the ground nets/pins to be used when creating the power grid for the design. |
| `SYNTH_USE_PG_PINS_DEFINES` | Specifies the power guard used in the verilog source code to specify the power and ground pins. This is used to automatically extract `VDD_NETS` and `GND_NET` variables from the verilog, with the assumption that they will be order `inout vdd1, inout gnd1, inout vdd2, inout gnd2, ...`. |
| `FP_IO_MIN_DISTANCE` | The minmimum distance between the IOs in microns.
(Default: `3`) |
| `FP_PADFRAME_CFG` | A configuration file passed to padringer, a padframe generator.
(Default: None) |
| `PDN_CFG` | **Deprecated: Use `FP_PDN_CFG`**: Points to a PDN configuration file that describes how to construct the PDN in detail. |
| `FP_HORIZONTAL_HALO` | **Deprecated: Use `FP_PDN_HORIZONTAL_HALO`**: Sets the horizontal halo around the macros during power grid insertion. The value provided is in microns.|
| `FP_PDN_VERTICAL_HALO` | **Deprecated: Use `FP_PDN_VERTICAL_HALO`**: Sets the vertical halo around the macros during power grid insertion. The value provided is in microns. |
| `DESIGN_IS_CORE` | **Deprecated as even macros can have a full-stack PDN if core rings are used: New variable is `FP_PDN_MULTILAYER`** Controls the layers used in the power grid. Depending on whether the design is the core of the chip or a macro inside the core. 1=Is a Core, 0=Is a Macro
(Default: `1`)|
| `FP_PDN_IRDROP` | **Removed: No point running it this early in the flow**: Enable calculation of power grid IR drop during PDN generation. |
### Deprecated I/O Layer variables
These variables worked initially, but they were too sky130 specific and will be removed. Currently, if you define them in your design, they'll be used, but it's recommended to update your configuration to use `FP_IO_HLAYER` and `FP_IO_VLAYER`, which are defined in the PDK.
|Variable|Description|
|-|-|
| `FP_IO_HMETAL` | The metal layer on which to place the io pins horizontally (top and bottom of the die).
(Default: `4`)|
| `FP_IO_VMETAL` | The metal layer on which to place the io pins vertically (sides of the die)
(Default: `3`)|
## All Resizer (RSZ) Steps
|Variable|Description|
|-|-|
| `RSZ_LIB` | Points to one or more lib files, corresponding to the typical corner, that is used during resizer optimizations.
(Default: set to the value of PDK's `LIB_SYNTH`) |
| `RSZ_LIB_FASTEST` | Points to one or more lib files, corresponding to the fastest corner, that is used during resizer optimizations.
(Default: set to the value of PDK's `LIB_FASTEST`) |
| `RSZ_LIB_SLOWEST` | Points to one or more lib files, corresponding to the slowest corner, that is used during resizer optimizations.
(Default: set to the value of PDK's `LIB_SLOWEST`) |
| `RSZ_MULTICORNER_LIB` | A flag for reading fastest and slowest corner during resizer optimizations.
(Default: `1`) |
| `RSZ_DONT_TOUCH_RX` | A single regular expression designating nets as "don't touch" by resizer optimizations.
(Default: `$^` (matches nothing)) |
| `RSZ_DONT_TOUCH` | A list of nets or instances to set as "don't touch".
(Default: Empty) |
| `LIB_RESIZER_OPT` | **Deprecated: Use `RSZ_LIB`**: Points to the lib file, corresponding to the typical corner, that is used during resizer optimizations. This is copy of `LIB_SYNTH`.|
## Global and Detailed Placement (GPL/DPL)
|Variable|Description|
|-|-|
| `PL_TARGET_DENSITY` | The desired placement density of cells. It reflects how spread the cells would be on the core area. 1 = closely dense. 0 = widely spread
(Default: `($::env(FP_CORE_UTIL) + 10 + (5 * $::env(GPL_CELL_PADDING)) ) / 100.0`)|
| `PL_TIME_DRIVEN` | Specifies whether the placer should use time driven placement. 0 = false, 1 = true
(Default: `1`)|
| `PL_BASIC_PLACEMENT` | Specifies whether the placer should run basic placement. Basic placement is used for extremely simple, low-density designs of only a few dozens of gates, and should be disabled for most designs. 0 = false, 1 = true
(Default: `0`) |
| `PL_SKIP_INITIAL_PLACEMENT` | Specifies whether the placer should run initial placement or not. 0 = false, 1 = true
(Default: `0`) |
| `PL_RANDOM_GLB_PLACEMENT` | Specifies whether the placer should run random placement or not. This is useful if the design is tiny (less than 100 cells). 0 = false, 1 = true
(Default: `0`) |
| `PL_RANDOM_INITIAL_PLACEMENT` | Specifies whether the placer should run random placement or not followed by replace's initial placement. This is useful if the design is tiny (less than 100 cells). 0 = false, 1 = true
(Default: `0`) |
| `PL_ROUTABILITY_DRIVEN` | Specifies whether the placer should use routability driven placement. 0 = false, 1 = true
(Default: `1`) |
| `PL_RESIZER_TIE_SEPERATION` | Distance between load and an inserted tie cell in microns.
(Default: `0`)|
| `PL_RESIZER_DESIGN_OPTIMIZATIONS` | Specifies whether resizer design optimizations should be performed or not. 0 = false, 1 = true
(Default: `1`) |
| `PL_RESIZER_TIMING_OPTIMIZATIONS` | Specifies whether resizer timing optimizations should be performed or not. 0 = false, 1 = true
(Default: `1`) |
| `PL_RESIZER_MAX_WIRE_LENGTH` | Specifies the maximum wire length cap used by resizer to insert buffers. If set to 0, no buffers will be inserted. Value in microns.
(Default: `0`)|
| `PL_RESIZER_MAX_SLEW_MARGIN` | Specifies a margin for the slews in percentage.
(Default: `20`)|
| `PL_RESIZER_MAX_CAP_MARGIN` | Specifies a margin for the capacitances in percentage.
(Default: `20`)|
| `PL_RESIZER_HOLD_SLACK_MARGIN` | Specifies a time margin for the slack when fixing hold violations. Normally the resizer will stop when it reaches zero slack. This option allows you to overfix.
(Default: `0.1ns`.)|
| `PL_RESIZER_SETUP_SLACK_MARGIN` | Specifies a time margin for the slack when fixing setup violations.
(Default: `0.05ns`)|
| `PL_RESIZER_HOLD_MAX_BUFFER_PERCENT` | Specifies a max number of buffers to insert to fix hold violations. This number is calculated as a percentage of the number of instances in the design.
(Default: `50`)|
| `PL_RESIZER_SETUP_MAX_BUFFER_PERCENT` | Specifies a max number of buffers to insert to fix setup violations. This number is calculated as a percentage of the number of instances in the design.
(Default: `50`)|
| `PL_RESIZER_ALLOW_SETUP_VIOS` | Allows setup violations when fixing hold.
(Default: `0`)|
| `PL_WIRELENGTH_COEF` | Global placement initial wirelength coefficient. Decreasing the variable will modify the initial placement of the standard cells to reduce the wirelengths.
(Default: `0.25`).|
| `DONT_USE_CELLS` | The list of cells to not use during resizer optimizations.
(Default: the contents of `DRC_EXCLUDE_CELL_LIST`) |
| `PL_ESTIMATE_PARASITICS` | Specifies whether or not to run STA after global placement using OpenROAD's estimate_parasitics -placement and generates reports under `logs/placement`. 1 = Enabled, 0 = Disabled.
(Default: `1`) |
| `PL_OPTIMIZE_MIRRORING` | Specifies whether or not to run an optimize_mirroring pass whenever detailed placement happens. This pass will mirror the cells whenever possible to optimize the design. 1 = Enabled, 0 = Disabled.
(Default: `1`) |
| `PL_RESIZER_BUFFER_INPUT_PORTS` | Specifies whether or not to insert buffers on input ports whenever resizer optimizations are run. For this to be used, `PL_RESIZER_DESIGN_OPTIMIZATIONS` must be set to 1. 1 = Enabled, 0 = Disabled.
(Default: `1`) |
| `PL_RESIZER_BUFFER_OUTPUT_PORTS` | Specifies whether or not to insert buffers on output ports whenever resizer optimizations are run. For this to be used, `PL_RESIZER_DESIGN_OPTIMIZATIONS` must be set to 1. 1 = Enabled, 0 = Disabled.
(Default: `1`) |
| `PL_RESIZER_REPAIR_TIE_FANOUT` | Specifies whether or not to repair tie cells fanout whenever resizer optimizations are run. For this to be used, `PL_RESIZER_DESIGN_OPTIMIZATIONS` must be set to 1. 1 = Enabled, 0 = Disabled.
(Default: `1`) |
| `PL_MAX_DISPLACEMENT_X` | Specifies how far an instance can be moved along the X-axis when finding a site where it can be placed during detailed placement.
(Default: `500`μm) |
| `PL_MAX_DISPLACEMENT_Y` | Specifies how far an instance can be moved along the Y-axis when finding a site where it can be placed during detailed placement.
(Default: `100`μm) |
| `PL_MACRO_HALO` | Macro placement halo. Format: `{Horizontal} {Vertical}`
(Default: `0 0`μm). |
| `PL_MACRO_CHANNEL` | Channel widths between macros. Format: `{Horizontal} {Vertical}`
(Default: `0 0`μm). |
| `MACRO_PLACEMENT_CFG` | Specifies the path to a file that instructs OpenLane how and where to place certain macros. For information about the format of this file, see [Macro placement configuration](#macro-placement-configuration). |
| `UNBUFFER_NETS` | **Deprecated: Use `RSZ_DONT_TOUCH_RX`**: A regular expression used to match nets from which to remove buffers after every resizer run. Useful for analog ports in mixed-signal designs where OpenROAD may sometimes add a buffer. |
| `DONT_BUFFER_PORTS` | **Removed: Use `RSZ_DONT_TOUCH_RX`**: Semicolon;delimited list of nets from which to remove buffers. |
### Macro placement configuration
`MACRO_PLACEMENT_CFG` specifies a file (often called `macro.cfg` or `macro_placement.cfg`) listing macros (i.e. already-hardened design layouts) to be placed as submodules within the layout being hardened. For example, using JSON configuration:
```json
"MACRO_PLACEMENT_CFG": "dir::macro.cfg",
```
In that specified `macro.cfg` file each non-blank/non-comment line declares: a single macro to be included; where it is to be placed; and whether it is to be rotated or mirrored. This example places 3 macros:
```bash
# Some macros:
my_controller 100 150 N
your_device 1200 1400 FS # Face south by flipping upside-down.
# Another macro of some kind:
our_bridge 200 800 S
```
Each line comprises 4 parameters (separated by *any* amount of whitespace but formatted as columns in this example for readability), and they are as follows:
1. Name of the macro (e.g. `my_controller`).
2. Horizontal placement of the macro (e.g. `100`, which is 100µm). This is the horizontal offset from the parent layout's left edge, to the macro's left edge.
3. Vertical placement (e.g. `150`, or 150µm). Vertical offset from the parent's bottom edge to the macro's bottom edge.
4. Orientation specifier (e.g. `N`, meaning the macro's own North or *top* edge points in the North direction, and hence is not rotated).
The `N` orientation is used most often, but sometimes it is necessary to rotate and/or flip macros. The orientation specifier follows the LEF/DEF language reference, and can be one of the following:
| Orientation | Effect | Result |
|-----------------|-----------------------------------------------|-------------------------------------------------------------|
| `N` or `R0` | No rotation | Macro's "top" faces North. |
| `S` or `R180` | Rotate 180° | Macro's "top" faces South, by rotation. |
| `W` or `R90` | Rotate 90° anti-clockwise | Macro's "top" faces West, by rotation. |
| `E` or `R270` | Rotate 90° clockwise | Macro's "top" faces East, by rotation. |
| `FN` or `MY` | Mirror about the Y axis | Macro's "top" faces North and is *flipped* left-to-right. |
| `FS` or `MX` | Mirror about the X axis | Macro's "top" faces South by being *flipped* top-to-bottom. |
| `FW` or `MXR90` | Mirror about X, rotate 90° anti-clockwise | Macro's "top" faces **East** by flipping `W` left-to-right. |
| `FE` or `MYR90` | Mirror about Y, rotate 90° anti-clockwise | Macro's "top" faces **West** by flipping `E` right-to-left. |
:::{note}
The alternative names (`R0`, `MXR90`, etc.) follow the OpenAccess database format, and specifically these 8 alternatives are also supported by OpenLane.
:::
:::{note}
Be careful if using East/West orientations: Ensure the macro's PDN is still able to properly intersect/connect with the parent layout's PDN.
:::
For more information on integrating macros and other relevant configuration variables, see:
* [Macros/Chip Integration](#macroschip-integration)
* [`FP_PDN_MACRO_HOOKS`](#FP_PDN_MACRO_HOOKS)
* [`EXTRA_SPEFS`](#EXTRA_SPEFS)
* [`CLOCK_NET`](#CLOCK_NET) (which can be an array to specify multiple clock nets if needed) and [`CLOCK_PORT`](#CLOCK_PORT)
## Clock Tree Synthesis (CTS)
|Variable|Description|
|-|-|
| `RUN_CTS` | Enable clock tree synthesis.
(Default: `1`)|
| `RUN_FILL_INSERTION` | Enables fill cells insertion after cts (if enabled). 1 = Enabled, 0 = Disabled
(Default: `1`)|
| `CTS_SINK_CLUSTERING_SIZE` | Specifies the maximum number of sinks per cluster.
(Default: `25`) |
| `CTS_SINK_CLUSTERING_MAX_DIAMETER` | Specifies maximum diameter (in micron) of sink cluster.
(Default: `50`) |
| `CTS_REPORT_TIMING` | Specifies whether or not to run STA after clock tree synthesis using OpenROAD's estimate_parasitics -placement and generates reports under `logs/cts`. 1 = Enabled, 0 = Disabled.
(Default: `1`) |
| `CTS_CLK_MAX_WIRE_LENGTH` | Specifies the maximum wire length on the clock net. Value in microns.
(Default: `0`) |
| `CTS_DISABLE_POST_PROCESSING` | Specifies whether or not to disable post cts processing for outlier sinks.
(Default: `0`) |
| `CTS_DISTANCE_BETWEEN_BUFFERS` | Specifies the distance (in microns) between buffers when creating the clock tree (Default: `0`) |
| `LIB_CTS` | The liberty file used for CTS for typical corner. By default, this is the `LIB_SYNTH` minus the cells with drc errors as specified by the drc exclude list.
(Default: `$::env(cts_tmpfiles)/cts.lib`) |
| `LIB_CTS_SLOWEST` | The liberty file used for CTS for slowest corner. By default, this is the `LIB_SLOWEST` minus the cells with drc errors as specified by the drc exclude list.
(Default: `$::env(cts_tmpfiles)/cts-slowest.lib`) |
| `LIB_CTS_FASTEST` | The liberty file used for CTS for fastest corner. By default, this is the `LIB_FASTEST` minus the cells with drc errors as specified by the drc exclude list.
(Default: `$::env(cts_tmpfiles)/cts-fastest.lib`) |
| `CTS_MULTICORNER_LIB` | A flag for reading fastest and slowest corner during CTS.
(Default: `1`) |
| `CLOCK_TREE_SYNTH` | **Deprecated: Use `RUN_CTS`**: Enable clock tree synthesis. 1 = Enabled, 0 = Disabled. |
| `FILL_INSERTION` | **Removed: Use `RUN_FILL_INSERTION`**: Enables fill cells insertion after CTS. 1 = Enabled, 0 = Disabled. |
| `RUN_SIMPLE_CTS` | **Removed: TritonCTS is always run**: Run an alternative simple clock tree synthesis after synthesis instead of TritonCTS. 1 = Enabled, 0 = Disabled. |
| `CTS_TARGET_SKEW` | **Removed: No longer supported by underlying utility**: The target clock skew in picoseconds.
(Default: `200`ps)|
| `CLOCK_BUFFER_FANOUT` | **Removed: Unused**: Fanout of clock tree buffers.
(Default: `16`) |
| `CTS_TOLERANCE` | **Removed: Unused**: An integer value that represents a tradeoff of QoR and runtime. Higher values will produce smaller runtime but worse QoR
(Default: `100`) |
## Global and Detailed Routing (GRT/DRT)
|Variable|Description|
|-|-|
| `RUN_DRT` | Enables detailed routing. 1 = Enabled, 0 = Disabled
(Default: `1`)|
| `GLOBAL_ROUTER` | Specifies which global router to use. Values: `fastroute`. (`cugr` is deprecated and fastroute will be used instead.)
(Default: `fastroute`) |
| `DETAILED_ROUTER` | Specifies which detailed router to use. Values: `tritonroute`. (`drcu`/`tritonroute_or` are both deprecated and tritonroute will be used instead.)
(Default: `tritonroute`)|
| `ROUTING_CORES` | Specifies the number of threads to be used in TritonRoute. Can be overriden via environment variable.
(Default: `2`) |
| `RT_CLOCK_MIN_LAYER` | The name of lowest layer to be used in routing the clock net.
(Default: `RT_MIN_LAYER`)|
| `RT_CLOCK_MAX_LAYER` | The name of highest layer to be used in routing the clock net.
(Default: `RT_MAX_LAYER`)|
| `GLB_RESIZER_TIMING_OPTIMIZATIONS` | Specifies whether resizer timing optimizations should be performed after global routing or not. 1 = Enabled, 0 = Disabled.
(Default: `1`)
| `GLB_RESIZER_DESIGN_OPTIMIZATIONS` | Specifies whether resizer design optimizations should be performed after global routing or not. 1 = Enabled, 0 = Disabled.
(Default: `1`)
| `GLB_RESIZER_MAX_WIRE_LENGTH` | Specifies the maximum wire length cap used by resizer to insert buffers. If set to 0, no buffers will be inserted. Value in microns.
(Default: `0`)|
| `GLB_RESIZER_MAX_SLEW_MARGIN` | Specifies a margin for the slews.
(Default: `10`)|
| `GLB_RESIZER_MAX_CAP_MARGIN` | Specifies a margin for the capacitances.
(Default: `10`)|
| `GLB_RESIZER_HOLD_SLACK_MARGIN` | Specifies a time margin for the slack when fixing hold violations. Normally the resizer will stop when it reaches zero slack. This option allows you to overfix.
(Default: `0.05ns`)|
| `GLB_RESIZER_SETUP_SLACK_MARGIN` | Specifies a time margin for the slack when fixing setup violations.
(Default: `0.025ns`)|
| `GLB_RESIZER_HOLD_MAX_BUFFER_PERCENT` | Specifies a max number of buffers to insert to fix hold violations. This number is calculated as a percentage of the number of instances in the design.
(Default: `50`)|
| `GLB_RESIZER_SETUP_MAX_BUFFER_PERCENT` | Specifies a max number of buffers to insert to fix setup violations. This number is calculated as a percentage of the number of instances in the design.
(Default: `50`)|
| `GLB_RESIZER_ALLOW_SETUP_VIOS` | Allows setup violations when fixing hold.
(Default: `0`)|
| `GLB_OPTIMIZE_MIRRORING` | Specifies whether or not to run an optimize_mirroring pass whenever detailed placement happens after Routing timing optimization. This pass will mirror the cells whenever possible to optimize the design. 1 = Enabled, 0 = Disabled.
(Default: `1`) |
| `GRT_ALLOW_CONGESTION` ‡ | Allow congestion in the resulting guides. 0 = false, 1 = true
(Default: `0`)
| `GRT_OVERFLOW_ITERS` ‡ | The maximum number of iterations waiting for the overflow to reach the desired value.
(Default: `50`) |
| `GRT_ANT_ITERS` ‡ | The maximum number of iterations for global router repair_antenna. This option is only available when `GRT_REPAIR_ANTENNAS` is enabled.
(Default: `15`) |
| `GRT_ANT_MARGIN` ‡ | The margin to over fix antenna violations in global routing as a percentage. This option is only available when `GRT_REPAIR_ANTENNAS` is enabled.
(Default: `10`) |
| `GRT_ESTIMATE_PARASITICS` ‡ | Specifies whether or not to run STA after global routing using OpenROAD's estimate_parasitics -global_routing and generates reports under `logs/routing`. 1 = Enabled, 0 = Disabled.
(Default: `1`) |
| `GRT_MAX_DIODE_INS_ITERS` ‡ | Controls the maximum number of iterations at which re-running Fastroute for diode insertion stops. Each iteration ARC detects the violations and FastRoute fixes them by inserting diodes, then producing the new DEF. The number of antenna violations is compared with the previous iteration and if they are equal or the number is greater the iterations stop and the DEF from the previous iteration is used in the rest of the flow. If the current antenna violations reach zero, the current def will be used and the iterations will not continue. This option is only available in when `GRT_REPAIR_ANTENNAS` is enabled.
(Default: `1`) |
| `GRT_REPAIR_ANTENNAS` ‡ | Enables OpenROAD's antenna avoidance flow.
(Default: `1`) |
| `GRT_OBS` ‡ | Specifies custom obstruction to be added prior to global routing as of layer and coordinates in the format `layer llx lly urx ury`, where `ll` and `ur` stand for "lower left" and "upper right" respectively. In JSON, declare it as an array of strings, and in Tcl, use commas as a delimiter. (Example: `li1 0 100 1000 300, met5 0 0 1000 500`)
(Default: unset) |
| `GRT_ADJUSTMENT` ‡ | Reduction in the routing capacity of the edges between the cells in the global routing graph. Values range from 0 to 1.
1 = most reduction, 0 = least reduction
(Default: `0.3`)|
| `GRT_MACRO_EXTENSION` ‡ | Sets the number of GCells added to the blockages boundaries from macros. A GCell is typically defined in terms of Mx routing tracks. The default GCell size is 15 M3 pitches.
(Default: `0`) |
| `DRT_MIN_LAYER` | An optional override to the lowest layer used in detailed routing. For example, in sky130, you may want global routing to avoid li1, but let detailed routing use li1 if it has to.
(Default: `RT_MIN_LAYER`)|
| `DRT_MAX_LAYER` | An optional override to the highest layer used in detailed routing.
(Default: `RT_MAX_LAYER`)|
| `DRT_OPT_ITERS` | Specifies the maximum number of optimization iterations during Detailed Routing in TritonRoute. Values allowed are integers from `1` to `64`.
(Default: `64`) |
| `ROUTING_OPT_ITERS` |**Removed: Use `DRT_OPT_ITERS`**: Specifies the maximum number of optimization iterations during Detailed Routing in TritonRoute.|
| `GLB_RT_MINLAYER` | **Removed: Use `RT_MIN_LAYER`**: The number of lowest layer to be used in routing.|
| `GLB_RT_MAXLAYER` | **Removed: Use `RT_MAX_LAYER`**: The number of highest layer to be used in routing.|
| `GLB_RT_CLOCK_MINLAYER` | **Removed: Use `RT_CLOCK_MIN_LAYER`**: The number of lowest layer to be used in routing the clock net.|
| `GLB_RT_CLOCK_MAXLAYER` | **Removed: Use `RT_CLOCK_MIN_LAYER`**: The number of highest layer to be used in routing the clock net.|
| `GLB_RT_L{1/2/3/4/5/6}_ADJUSTMENT` | **Removed: See PDK variable `GRT_LAYER_ADJUSTMENTS` instead**: Reduction in the routing capacity of the edges between the cells in the global routing graph but specific to a metal layer in sky130A. Values ranged from 0 to 1 |
| `GLB_RT_UNIDIRECTIONAL` | **Removed**: Allow unidirectional routing. 1 = Enabled, 0 = Disabled. |
| `GLB_RT_TILES` | **Removed**: The size of the GCELL used by Fastroute during global routing. |
> **‡** Variable previously prefixed `GLB_RT_` have had its prefix changed to `GRT_`. The replaced variable is deprecated and will be translated to its new form automatically by the flow.
### Custom Diode Insertion Scripts
|Variable|Description|
|-|-|
| `RUN_HEURISTIC_DIODE_INSERTION` | Runs a script by [Sylvain Munaut](https://github.com/smunaut) that inserts diodes heuristically based on . 1 = Enabled, 0 = Disabled
(Default: `0`)|
| `HEURISTIC_ANTENNA_THRESHOLD` | Minimum manhattan distance of a net to insert a diode in microns. Only applicable for `RUN_HEURISTIC_DIODE_INSERTION` is enabled.
(Default: `90`)
| `DIODE_ON_PORTS` | Insert diodes on ports with the specified polarities. Available options are `none`, `in`, `out` and `both`.
(Default: `none`) |
## Parasitic Resistance/Capacitance Extraction (RCX)
|Variable|Description|
|-|-|
| `RUN_SPEF_EXTRACTION` | Specifies whether or not to run SPEF extraction on the routed DEF. 1=enabled 0=disabled
(Default: `1`) |
| `SPEF_EXTRACTOR` | Specifies which spef extractor to use. Values: `openrcx` or (**removed:** `def2spef`).
(Default: `openrcx`) |
| `RCX_MERGE_VIA_WIRE_RES` | Specifies whether to merge the via resistance with the wire resistance or separate it from the wire resistance. 1 = Merge via resistance, 0 = Separate via resistance
(Default: `1`)|
| `RCX_SDC_FILE` | **Deprecated: Use `SIGNOFF_SDC_FILE`**: Specifies SDC file to be used for RCX-based STA, which can be different from the one used for implementation.
(Default: `BASE_SDC_FILE`) |
| `SPEF_WIRE_MODEL` | **Removed:** Specifies the wire model used in SPEF extraction. Options are `L` or `Pi` |
| `SPEF_EDGE_CAP_FACTOR` | **Removed:** Specifies the edge capacitance factor used in SPEF extraction. Ranges from 0 to 1 |
## IR Drop Analysis
|Variable|Description|
|-|-|
| `RUN_IRDROP_REPORT` | Creates an IR Drop report using OpenROAD PSM. 1 = Enabled, 0 = Disabled.
(Default: `1`) |
| `VSRC_LOC_FILES` | Map of voltage source nets to OpenROAD PSM location files. Variable should be provided as a Tcl dict, i.e.: `net1 file1 net2 file2`. See [this](https://github.com/The-OpenROAD-Project/OpenROAD/tree/master/src/psm#commands) for more info.
(Default: None) |
## Signoff
|Variable|Description|
|-|-|
| `PRIMARY_GDSII_STREAMOUT_TOOL` | Determines whether `magic` or `klayout` is the primary signoff tool.
(Default: `magic`) |
| `USE_ARC_ANTENNA_CHECK` | Specifies whether to use the openroad ARC antenna checker or magic antenna checker. 0=magic antenna checker, 1=ARC OR antenna checker
(Default: `1`)
| `RUN_CVC` | Runs CVC on the output spice, which is a Circuit Validity Checker. Voltage aware ERC checker for CDL netlists. 1 = Enabled, 0 = Disabled.
(Default: `1`) |
| `SIGNOFF_SDC_FILE` | Specifies SDC file used by multicorner STA during signoff stage, which can be different from the one used for implementation.
(Default: `BASE_SDC_FILE`) |
### Magic
|Variable|Description|
|-|-|
| `RUN_MAGIC` | Enables running magic and GDSII streaming. 1 = Enabled, 0 = Disabled
(Default: `1`)|
| `RUN_MAGIC_DRC` | Enables running magic DRC on either GDSII produced by `PRIMARY_GDSII_STREAMOUT_TOOL` or final produced DEF file depending on `MAGIC_DRC_USE_GDS`. 1 = Enabled, 0 = Disabled
(Default: `1`)|
| `MAGIC_PAD` | A flag to pad the views generated by magic (.mag, .lef, .gds) with one site. 1 = Enabled, 0 = Disabled
(Default: `0`)|
| `MAGIC_ZEROIZE_ORIGIN` | A flag to move the layout such that it's origin in the lef generated by magic is 0,0. 1 = Enabled, 0 = Disabled
(Default: `1`)|
| `MAGIC_GENERATE_GDS` | A flag to generate gds view via magic. 1 = Enabled, 0 = Disabled
(Default: `1`)|
| `MAGIC_GENERATE_LEF` | A flag to generate lef view via magic. 1 = Enabled, 0 = Disabled
(Default: `1`)|
| `MAGIC_GENERATE_MAGLEF` | A flag to generate maglef view via magic. Requires `MAGIC_GENERATE_LEF` to be also set. 1 = Enabled, 0 = Disabled
(Default: `1`)|
| `MAGIC_WRITE_FULL_LEF` | A flag to specify whether or not the output LEF should include all shapes inside the macro or an abstracted view of the macro lef view via magic. 1 = Full View, 0 = Abstracted View
(Default: `0`)|
| `MAGIC_DRC_USE_GDS` | A flag to choose whether to run the magic DRC checks on GDS or not. If not, then the checks will be done on the DEF/LEF. 1 = GDS, 0 = DEF/LEF
(Default: `1`)|
| `MAGIC_EXT_USE_GDS` | A flag to choose whether to run the magic extractions on GDS or DEF/LEF. If GDS was used Device Level LVS will be run. Otherwise, blackbox LVS will be run. 1 = GDS, 0 = DEF/LEF
(Default: `0`)|
| `MAGIC_LEF_WRITE_USE_GDS` | A flag to choose whether to run the magic lef write on GDS or DEF/LEF. 1 = GDS, 0 = DEF/LEF
(Default: `0`)|
| `MAGIC_INCLUDE_GDS_POINTERS` | A flag to choose whether to include GDS pointers in the generated mag files or not. 1 = Enabled, 0 = Disabled
(Default: `0`)|
| `MAGIC_DISABLE_HIER_GDS` | A flag to disable cif hier and array during GDSII writing.* 1=Enabled ``, 0=Disabled ``.
(Default: `1`)|
| `MAGIC_DEF_NO_BLOCKAGES` | A flag to choose whether blockages are read with DEF files or not (they are read as a sheet of metal by Magic). 1 = No Blockages, 0 = Blockages as Metal Sheets
(Default: `1`)|
| `MAGIC_DEF_LABELS` | A flag to choose whether labels are read with DEF files or not. From magic docs: "The '-labels' option to the 'def read' command causes each net in the NETS and SPECIALNETS sections of the DEF file to be annotated with a label having the net name as the label text." 1 = Labels, 0 = Unlabeled
(Default: `1`)|
| `MAGIC_GDS_ALLOW_ABSTRACT` | A flag to allow abstract view of macros during magic gds generation. 1 = Allow, 0 = Disallow
(Default: `0`)|
| `MAGIC_GDS_POLYGON_SUBCELLS` | A flag to enable polygon subcells in magic for gds read potentially speeding up magic. From magic docs: "Put non-Manhattan polygons. This prevents interations with other polygons on the same plane and so reduces tile splitting" 1 = Allow, 0 = Disallow
(Default: `0`)|
> * Tim Edwards's Explanation on disabling hier gds: The following is an explanation by Tim Edwards, provided in a slack thread, on how this affects the GDS writing process: "Magic can take a very long time writing out GDS while checking hierarchical interactions in a standard cell layout. If your design is all digital, I recommend using "gds *hier write disable" before "gds write" so that it does not try to resolve hierarchical interactions (since by definition, standard cells are designed to just sit next to each other without creating DRC issues). That can actually make the difference between a 20 hour GDS write and a 2 minute GDS write. For a standard cell design that takes up the majority of the user space, a > 24 hour write time (without disabling the hierarchy checks) would not surprise me."
### KLayout
|Variable|Description|
|-|-|
| `RUN_KLAYOUT` | Enables running KLayout and GDSII streaming. 1 = Enabled, 0 = Disabled
(Default: `1`)|
| `RUN_KLAYOUT_XOR` | Enables running KLayout XOR on 2 GDSIIs, the defaults are the one produced by magic vs the one produced by klayout. 1 = Enabled, 0 = Disabled
(Default: `1`)|
| `RUN_KLAYOUT_DRC` | Enables running KLayout DRC on GDSII produced by `PRIMARY_GDSII_STREAMOUT_TOOL`. 1 = Enabled, 0 = Disabled
(Default: `1`)|
| `KLAYOUT_DRC_KLAYOUT_GDS` | Enables running KLayout DRC on GDSII produced by KLayout. 1 = Enabled, 0 = Disabled
(Default: `0`)|
| `KLAYOUT_XOR_THREADS` | Specifies number of threads used in klayout xor check
(Default: `1`)|
| `KLAYOUT_DRC_THREADS` | Specifies number of threads used in klayout drc check
(Default: `1`)|
| `TAKE_LAYOUT_SCROT` | Enables running KLayout to take a PNG screenshot of the produced layout (currently configured to run on the results of each stage).1 = Enabled, 0 = Disabled
(Default: `0`)|
## Layout vs. Schematic (LVS)
|Variable|Description|
|-|-|
| `RUN_LVS` | Enables running LVS. 1 = Enabled, 0 = Disabled
(Default: `1`)|
| `LVS_INSERT_POWER_PINS` | Enables power pins insertion before running lvs. 1 = Enabled, 0 = Disabled
(Default: `1`)|
| `LVS_CONNECT_BY_LABEL` | Enables connections by label in LVS by skipping `extract unique` in magic extractions.
(Default: `0`) |
| `YOSYS_REWRITE_VERILOG` | Enables yosys to rewrite the verilog before LVS producing a canonical verilog netlist with verbose wire declarations. 1 = Enabled, 0 = Disabled
(Default: `0`) |
## Checkers
|Variable|Description|
|-|-|
| `QUIT_ON_SYNTH_CHECKS` | Quit if any of the following conditions are met: (1) `check -assert` in yosys. This checks for combinational loops, conflicting drivers and wires with no drivers. (2) Using a signal that doesn't match a module port size in the RTL. For instance, given such a module `module example(x); input x; endmodule` it gets instantiated like that `example y(2'b11);` (3) Found Latches in the design. (4) Out of bound(range) errors in the RTL. e.g. `wire [10:0] x; assign x[13] = 1'b1`. 1 = Enabled, 0 = Disabled
(Default: `1`)|
| `SYNTH_CHECKS_ALLOW_TRISTATE` | Allow tristate logic in `QUIT_ON_SYNTH_CHECKS`. 1 = Enabled, 0 = Disabled
(Default: `1`)|
| `QUIT_ON_UNMAPPED_CELLS` | Checks if there are unmapped cells after synthesis and aborts if any was found. 1 = Enabled, 0 = Disabled
(Default: `1`)|
| `QUIT_ON_ASSIGN_STATEMENTS` | Checks for assign statement in the generated gate level netlist and aborts of any was found.1 = Enabled, 0 = Disabled
(Default: `0`)|
| `QUIT_ON_TR_DRC` | Checks for DRC violations after routing and exits the flow if any was found. 1 = Enabled, 0 = Disabled
(Default: `1`)|
| `QUIT_ON_LONG_WIRE` | Exits the flow if any wire length exceeds the threshold set in the PDK. 1 = Enabled, 0 = Disabled
(Default: `0`)|
| `QUIT_ON_MAGIC_DRC` | Checks for DRC violations after magic DRC is executed and exits the flow if any was found. 1 = Enabled, 0 = Disabled
(Default: `1`)|
| `QUIT_ON_ILLEGAL_OVERLAPS` | Checks for illegal overlaps during magic extraction. In some cases, these imply existing undetected shorts in the design. It also exits the flow if any was found. 1 = Enabled, 0 = Disabled
(Default: `1`)|
| `QUIT_ON_LVS_ERROR` | Checks for LVS errors after netgen LVS is executed and exits the flow if any was found. 1 = Enabled, 0 = Disabled
(Default: `1`)|
| `QUIT_ON_HOLD_VIOLATIONS` | Exits the flow on hold violations at the typical corner
(Default: `1`)|
| `QUIT_ON_SETUP_VIOLATIONS` | Exits the flow on setup violations at the typical corner
(Default: `1`)|
| `QUIT_ON_TIMING_VIOLATIONS` | Controls `QUIT_ON_HOLD_VIOLATIONS` and `QUIT_ON_SETUP_VIOLATIONS`
(Default: `1`)|
| `QUIT_ON_LINTER_WARNINGS` | Quit on warnings generated by linter (currently Verilator)
(Default: `0`)|
| `QUIT_ON_LINTER_ERRORS` | Quit on errors generated by linter (currently Verilator)
(Default: `1`)|
| `QUIT_ON_XOR_ERROR` | Quit on XOR differences between GDSII generated by Magic and KLayout
(Default: `1`)|
| `QUIT_ON_KLAYOUT_DRC` | Checks for DRC violations after KLayout DRC is executed and exits the flow if any was found. 1 = Enabled, 0 = Disabled
(Default: `1`)|
## Misc.
|Variable|Description|
|-|-|
| `GENERATE_FINAL_SUMMARY_REPORT` | Specifies whether or not to generate a final summary report after the run is completed. Check command `generate_final_summary_report`. 1 = Enabled, 0 = Disabled.
(Default: `1`) |
| `USE_GPIO_PADS` | Decides whether or not to use the gpio pads in routing by merging their LEF file set in `::env(USE_GPIO_ROUTING_LEF)` and blackboxing their verilog modules set in `::env(GPIO_PADS_VERILOG)`. 1 = Enabled, 0 = Disabled.
(Default: `0`) |
| `TAP_DECAP_INSERTION` | **Deprecated: Use `RUN_TAP_DECAP_INSERTION`**: Enables tap and decap cells insertion after floorplanning. 1 = Enabled, 0 = Disabled. |
| `RUN_ROUTING_DETAILED` | **Deprecated: Use `RUN_DRT`**: Enables detailed routing. 1 = Enabled, 0 = Disabled.
(Default: `1`)|
| `DIODE_INSERTION_STRATEGY` | **Deprecated: Update replacement variables `GRT_REPAIR_ANTENNAS` and `RUN_HEURISTIC_DIODE_INSERTION` as per the instructions below**: Specifies the insertion strategy of diodes to be used in the flow. |
| | 0: No diode insertion. Equivalent to replacement variables being set to `0`. |
| | 1: **Removed**: Spray diodes. |
| | 2: **Removed**: Insert fake diodes and replace them with real diodes if needed. |
| | 3: Use OpenROAD's Antenna Avoidance flow. Equivalent to replacement variables being set to `1` and `0` respectively. |
| | 4: Use Sylvain Minaut's custom script for diode insertion. Equivalent to replacement variables being set to `0` and `1` respectively. |
| | 5: **Removed**: A combination of strategies 2 and 4. |
| | 6: A combination of strategies 3 and 4. Equivalent to replacement variables being set to `1`. |
| `MAGIC_CONVERT_DRC_TO_RDB` | **Removed: Will always run**: Specifies whether or not generate a Calibre RDB out of the magic.drc report. Result is saved in `/results/magic/`. 1 = Enabled, 0 = Disabled. |
| `TEST_MISMATCHES` | **Removed: See `./flow.tcl -test_mismatches`**: Test for mismatches between the OpenLane tool versions and the current environment. `all` tests all mismatches. `tools` tests all except the PDK. `pdk` only tests the PDK. `none` disables the check. |
| `QUIT_ON_MISMATCHES` | **Removed: See `./flow.tcl -ignore_mismatches`**: Whether to halt the flow execution or not if `TEST_MISMATCHES` is enabled and any mismatches are found. |
| `KLAYOUT_XOR_GDS` | **Removed: GDS always generated**: If `RUN_KLAYOUT_XOR` is enabled, this will enable producing a GDS output from the XOR along with it's PNG export. 1 = Enabled, 0 = Disabled.|
| `KLAYOUT_XOR_XML` | **Removed: XML always generated**: If `RUN_KLAYOUT_XOR` is enabled, this will enable producing an XML output from the XOR. 1 = Enabled, 0 = Disabled. |
| `LEC_ENABLE` | **Removed: buggy** Enables logic verification using yosys, for comparing each netlist at each stage of the flow with the previous netlist and verifying that they are logically equivalent. Warning: this will increase the runtime significantly. 1 = Enabled, 0 = Disabled
(Default: `0`)|