# Variables information

This page describes configuration variables and list the defaults for skywater130 pdk.

## Required variables

| Variable      | Description                                 |
|---------------|-------------------------------------------------------|
| `DESIGN_NAME`   | The name of the top level module of the design        |
| `VERILOG_FILES` | The path of the design's verilog files |
| `CLOCK_PERIOD`  | The clock period for the design in ns       |
| `CLOCK_PORT`    | The name of the design's clock port    |


## Optional variables

These variables are optional that can be specified in the design configuration file.


### Synthesis

| Variable      | Description                                  |
|---------------|---------------------------------------------------------------|
| `LIB_SYNTH` | The library used for synthesis. <br> (Default: `./platform/skywater130/scs8lp_ss_1.65v_-40C.lib`)|
| `SYNTH_DRIVING_CELL`  | The cell to drive the input ports. <br>(Default: `scs8lp_inv_8`)|
| `SYNTH_CAP_LOAD` | The capacitive load on the output ports in femtofarads. <br> (Default: `24.36` ff)|
| `SYNTH_MAX_FANOUT`  | The max load that the output ports can drive. <br> (Default: `5` cells) |
| `SYNTH_MAX_TRANS` | The max transition time (slew) from high to low or low to high on cell inputs in ns. Used in synthesis <br> (Default: Calculated at runtime as `10%` of the provided clock period)|
| `SYNTH_STRATEGY` | Stratgies for abc logic synthesis and technology mapping <br> Possible values are 0, 1 (delay), 2, and 3 (area)<br> (Default: `0`)|
| `LIB_MIN` | Library used for min delay calculation during STA. <br> (Default:`./platform/skywater130/scs8lp_ss_1.65v_-40C.lib`) |
| `LIB_MAX`  | Library used for max delay calculation during STA. <br> (Default:`./platform/skywater130/scs8lp_ff_1.65v_-40C.lib`) |
| `LIB_TYPICAL` | Library used for typical delay calculation during STA. <br> (Default`./platform/skywater130/scs8lp_ss_1.65v_-40C.lib`:) |


### Floorplanning

| Variable      | Description                               |
|---------------|---------------------------------------------------------------|
| `FP_CORE_UTIL`  | The core utilization percentage. <br> (Default: `50` percent)|
| `FP_ASPECT_RATIO`  | The core's aspect ratio (height / width). <br> (Default: `1`)|
| `FP_CORE_MARGIN`  | The length of the margin surrounding the core area. <br> (Default: `3.36` microns)|
| `FP_IO_HMETAL`  | The metal layer on which to place the io pins horizontally (top and bottom of the die). <br>(Default: `3`)|
| `FP_IO_VMETAL`  | The metal layer on which to place the io pins vertically (sides of the die) <br> (Default: `2`)|
| `FP_WELLTAP_CELL`  | The name of the welltap cell during welltap insertion. <br> (Default: `scs8lp_tap_1`)|
| `FP_ENDCAP_CELL`  | The name of the endcap cell during endcap insertion. <br> (Default: `scs8lp_decap_3`)|
| `FP_PDN_VOFFSET`  | The offset of the vertical power stripes on the metal layer 4 in the power distribution network <br> (Default: `16.32`) |
| `FP_PDN_VPITCH`  | The pitch of the vertical power stripes on the metal layer 4 in the power distribution network <br> (Default: `153.6`) |
| `FP_PDN_HOFFSET`  | The offset of the horizontal power stripes on the metal layer 5 in the power distribution network <br> (Default: `16.65`) |
| `FP_PDN_HPITCH`  | The pitch of the horizontal power stripes on the metal layer 5 in the power distribution network <br> (Default: `153.18`) |

### Placement

| 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 <br> (Default: `0.4`)|
| `PL_TIME_DIRVEN` | Specifies whether the placer should use time driven placement. 0 = false, 1 = true <br> (Default: `0`)|
| `PL_LIB` | Specifies the library for time driven placement <br> (Default: `LIB_TYPICAL`)|


### CTS

| Variable      | Description                               |
|---------------|---------------------------------------------------------------|
| `CTS_TARGET_SKEW` | The target clock skew in picoseconds. <br> (Default: `20` ps)|
| `CTS_ROOT_BUFFER`| The name of cell inserted at the root of the clock tree. <br> (Default: `scs8lp_clkbuf_16`)|
| `CTS_TECH_DIR` | The directory of look-up-tables for tirtonCTS. <br> (Default: `./platforms/skywater130/TritonCTS`)|
| `CTS_TOLERANCE` | an integer value that represents a tradeoff of QoR and runtime. Higher values will produce smaller runtime but worse QoR <br> (Default: `100`) |

### Fillcell Insertion
| Variable      | Description                               |
|---------------|---------------------------------------------------------------|
| `FILL_INSERTION` | enable |

### Routing

| Variable      | Description                               |
|---------------|---------------------------------------------------------------|
| `GLB_RT_MAXLAYER` | The number of highest layer to be used in routing. <br> (Default: `6`)|
| `GLB_RT_ADJUSTMENT` | Reduction in the routing capacity of the edges between the cells in the global routing graph. Values range from 0 to 1. <br> (Default: `0.15`)|
| `GLB_RT_LI1_ADJUSTMENT` | |
| `GLB_RT_MET1_ADJUSTMENT` | |

### Misc
| Variable      | Description                               |
|---------------|---------------------------------------------------------------|
| `PDK` | Specifies the process design kit (pdk). <br> (Default: `skywater130` )|
| `PDK_VARIANT` | Specifies the process design kit (pdk) variant. <br> (Default: `scs8lp` )|
| `CELL_PAD` | Cell padding; increases the width of cells. <br> (Default: `0.96` microns -- 2 sites)|

### Flow control
| Variable      | Description                               |
|---------------|---------------------------------------------------------------|
| `RUN_ROUTING_DETAILED` | Enables detailed routing. 1 = Enabled, 0 = Disabled <br> (Default: `1`)|
| `RUN_MAGIC` | Enables running magic and GDSII streaming.1 = Enabled, 0 = Disabled <br> (Default: `0`)|
| `CLOCK_TREE_SYNTH` | Enables cts.1 = Enabled, 0 = Disabled <br> (Default: `0`)|
| `FILL_INSERTION` | Enables fill cells insertion after cts (if enabled) .1 = Enabled, 0 = Disabled <br> (Default: `0`)|
