# DRC Documentation

Explains how to use the runset.

## Folder Structure

```text
📦drc
 ┣ 📦testing
 ┣ 📜README.md
 ┣ 📜gf_018mcu.drc
 ┣ 📜gf_018mcu_antenna.drc
 ┣ 📜gf_018mcu_density.drc
 ┗ 📜run_drc.py
 ```

## Rule Deck Usage

The `run_drc.py` script takes a gds file to run DRC rule decks of GF180 technology with switches to select subsets of all checks.

### **Switches**

1. **FEOL**          : Default is on. Use it for checking Front End Of Line layers (wells, diffusion, polys, contacts).
2. **BEOL**          : Default is on. Use it for checking Back End Of Line layers (metal layers, top metal layer, vias).
3. **BEOL**          : Default is on. Use it for checking Back End Of Line layers (metal layers, top metal layer, vias).
4. **GF180MCU**=A    : combined options of metal_level=3, mim_option=A, metal_top=30K, poly_res=1K, and mim_cap=2
5. **GF180MCU**=B    : combined options of metal_level=4, mim_option=B, metal_top=11K, poly_res=1K, and mim_cap=2
6. **GF180MCU**=C    : combined options of metal_level=5, mim_option=B, metal_top=9K,  poly_res=1K, and mim_cap=2
7. **connectivity**  : Default is off. Use it for check connectivity rules.
8. **DENSITY**       : Default is off. Use it for check density rules.
9. **DENSITY_only**  : Default is off. Use it for check density rules only.
10. **ANTENNA**       : Default is off. Use it to turn on Antenna checks.
11. **ANTENNA_only** : Default is off. Use it to turn on Antenna checks only.
12. **OFFGRID**      : Default is on. Use it for checking off-grid and acute layers (ongrid of 0.005um and angles 45 deg. unless otherwise stated).

### Usage

```bash
    run_drc.py (--help| -h)
    run_drc.py (--path=<file_path>) (--gf180mcu=<combined_options>) [--topcell=<topcell_name>] [--thr=<thr>] [--run_mode=<run_mode>] [--no_feol] [--no_beol] [--connectivity] [--density] [--density_only] [--antenna] [--antenna_only] [--no_offgrid]
```

Example:

```bash
    python3 run_drc.py --path=testing/switch_checking/switch_checking.gds --thr=16 --run_mode=flat --gf180mcu=A --antenna --no_offgrid
```

### Options

`--help -h`                           Print this help message.

`--path=<file_path>`                  The input GDS file path.

`--gf180mcu=<combined_options>`       Select combined options of metal_top, mim_option, and metal_level. Allowed values (A, B, C).
                                      gf180mcu=A: Select  metal_top=30K  mim_option=A  metal_level=3LM
                                      gf180mcu=B: Select  metal_top=11K  mim_option=B  metal_level=4LM
                                      gf180mcu=C: Select  metal_top=9K   mim_option=B  metal_level=5LM

`--topcell=<topcell_name>`            Topcell name to use.

`--thr=<thr>`                         The number of threads used in run.

`--run_mode=<run_mode>`               Select klayout mode Allowed modes (flat , deep, tiling). [default: flat]

`--no_feol`                           Turn off FEOL rules from running.

`--no_beol`                           Turn off BEOL rules from running.

`--connectivity`                      Turn on connectivity rules.

`--density`                           Turn on Density rules.

`--density_only`                      Turn on Density rules only.

`--antenna`                           Turn on Antenna checks.

`--antenna_only`                      Turn on Antenna checks only.

`--no_offgrid`                        Turn off OFFGRID checking rules.

### **DRC Outputs**

Results will appear at the end of the run logs.

The result is a database file (`<your_design_name>.lyrdb`) of all violations in the same directoy of your design. you could view it on your file using klayout.
