# MPW Precheck

## Prerequisites

- Docker

## Setup

### Docker

You can either build the docker locally or fetch it from dockerhub.

#### Build Docker Locally

To build the necessary docker locally, run:

```bash
    cd dependencies
    sh build-docker.sh
```

#### Pull Docker from Dockerhub

To pull the necessary docker from [dockerhub](https://hub.docker.com/repository/docker/efabless/mpw_precheck/tags?page=1&ordering=last_updated), run:

```bash
    docker pull efabless/mpw_precheck:latest
```

### Install the PDK

If you don't have the skywater-pdk installed, run:

```bash
    export PDK_ROOT=<absolute path to where skywater-pdk and open_pdks will reside>
    cd dependencies
    sh build-pdk.sh
```

## Before Using

- Before you run the precheck tool, make sure you go through https://opensource.google/docs/releasing/preparing/ and cover the requirements.

- Overwrite `verilog/gl/user_project_wrapper.v` with your synthesized netlist **make sure the netlist includes power information**. Otherwise, point to it properly in your `info.yaml`. You can alternatively use spice files for
  both `caravel` and `user_project_wrapper`. Keep on reading for this point to make more sense.

- Make sure you have the top level GDS-II under a directory called `gds/`; thus containing `gds/user_project_wrapper.gds`, this directory should be compressed and the script will use your Makefile to uncompress it.

- Please create a file `./third_party/used_external_repos.csv` and add to it all `repository name,commit hash` for any external github repository that you are using to build this project.

- Please include any useful statistics about your design, i.e. cell count, core utilization, etc. in a `.csv` file under `./signoff/<macro-name>/final_summary_report.csv`. If you're using OpenLANE then, this file should be created
  automatically in `<run path>/reports/final_summary_report.csv`.

## What Does the Script Do?

It runs a sequence of checks and aborts with the appropriate error message(s) if any of them fails.

The steps are as follows:

- **License**:
    - The root directory of the project, submodules and third party libraries contain at least one approved license and does not contain any prohibitted license
    - All source files contain an approved SPDX License and Copyright Headers
- **Manifest**:
    - Caravel version used in development is the latest
- **Makefile**:
    - Makefile targets contain at least compression and uncompression for the user_project_wrapper.gds file
- **Defaults**:
    - Contents of the project are different from the default content in [caravel_user_project](https://github.com/efabless/caravel_user_project.git) for digital projects
      and [caravel_user_project_analog](https://github.com/efabless/caravel_user_project_analog.git)
    - The info.yaml must contain fields that different from the default fields
    - The user_project_wrapper.gds must be different from the default one found in [caravel_user_project](https://github.com/efabless/caravel_user_project.git) for digital projects
      and [caravel_user_project_analog](https://github.com/efabless/caravel_user_project_analog.git) for analog projects
- **Documentation**:
    - Documentation file README.md exists and does not use any non-inclusive language
- **Consistency**:
    - Runs a series of checks on the user netlist (user_project_wrapper/user_analog_project_wrapper), and the top netlist (caravel/caravan) to make sure that both conform to the constraints put by the golden wrapper.
        - Both Netlists share the following checks:
            - Modeling check: check netlist is structural and doesn't contain behavioral constructs
            - Complexity check: check netlist isn't empty and contains at least eight instances
        - Remaining Top Netlist checks:
            - Sub-module hooks: check the user wrapper submodule port connections match the golden wrapper ports
            - Power check: check all submodules in the netlist are connected to power
        - Remaining User Netlist checks:
            - Ports check: check netlist port names match the golden wrapper ports
            - Layout check: check netlist matches the provided user wrapper layout in terms of the number of instances, and the instance names
- **XOR**:
    - No modification in the user_project_wrapper(versus default user_project_wrapper.gds in [caravel_user_project](https://github.com/efabless/caravel_user_project.git) for digital projects
      and [caravel_user_project_analog](https://github.com/efabless/caravel_user_project_analog.git) for analog projects) outside the user defined area lower left corner (0,0) and upper right corner (2920, 3520)
- **MagicDRC**:
    - The user_project_wrapper.gds does not have any DRC violations(using magic vlsi tool)
- **KlayoutFEOLDRC**:
    - The user_project_wrapper.gds does not have any DRC violations(using klayout) in the [_Front End Of Line_ layers](https://skywater-pdk.readthedocs.io/en/latest/rules/summary.html#id3)
- **KlayoutOffgrid**:
    - The user_project_wrapper.gds does not contain any shapes that have offgrid violations(rules [x.1b, x.3a, x.2, x.2c](https://skywater-pdk.readthedocs.io/en/latest/rules/periphery.html))
- **KlayoutMetalMinimumClearAreaDensity**:
    - The user_project_wrapper.gds has metal density (for each of the 5 metal layers) that is the lower than the maximum metal density specified by
      the [li1.pd.ld, m1.pd.ld, m2.pd.ld, m3.pd.ld, m4.pd.ld, m5.pd.ld rules](https://skywater-pdk.readthedocs.io/en/latest/rules/periphery.html)

## Current Assumptions

- The user module name is `user_project_wrapper` (or `user_analog_project_wrapper' for caravel_user_project_analog)
- Caravel is submoduled inside the user project or installed at a different path specified by CARAVEL_ROOT.

## How To Run

Mount the docker file:

```bash
export PDK_ROOT=<Absolute path to parent of sky130A. Installed PDK root.>
export INPUT_DIRECTORY=<Absolute path to the user project path>
# if caravel is submoduled under the user project, run "export CARAVEL_ROOT=$INPUT_DIRECTORY/caravel"
export CARAVEL_ROOT=<Absolute path to caravel>
sh docker-mount.sh
```

Run the following command:

```
usage: mpw_precheck.py [-h] --input_directory INPUT_DIRECTORY --caravel_root CARAVEL_ROOT --pdk_root PDK_ROOT 
                       [--output_directory OUTPUT_DIRECTORY] [--private] [check [check ...]]

Runs the precheck tool by calling the various checks in order.

positional arguments:

  check                 Checks to be ran by the precheck (default: None)

optional arguments:

  -h, --help            show this help message and exit
  
  --input_directory INPUT_DIRECTORY, -i INPUT_DIRECTORY
                        INPUT_DIRECTORY Absolute Path to the project. (default: None)
  
  --caravel_root CARAVEL_ROOT, -cr CARAVEL_ROOT
                        CARAVEL_ROOT Absolute Path to caravel. (default: None)
  
  --pdk_root PDK_ROOT, -p PDK_ROOT
                        PDK_ROOT, points to pdk installation path (default: None)
  
  --output_directory OUTPUT_DIRECTORY, -o OUTPUT_DIRECTORY
                        Output Directory,
                        default=<input_directory>/precheck_results. (default:None)
  
  --private             If provided, precheck skips [License, Defaults, Documentation] 
                        checks used to qualify the project to as an Open Source Project (default: False)
```

## How to Troubleshoot Issues with Precheck

See the following [document](./debug_precheck.md) for guidance on troubleshooting issues with precheck.