diff --git a/.github/scripts/get_designs.py b/.github/scripts/get_designs.py new file mode 100644 index 000000000..0bb803f59 --- /dev/null +++ b/.github/scripts/get_designs.py @@ -0,0 +1,29 @@ +import argparse +import json + + +def parse_lvs_config(file_path): + """Parses the LVS config file at the specified path.""" + with open(file_path) as f: + data = json.load(f) + return data['LVS_VERILOG_FILES'] + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("--design", help="The path to the design.") + args = parser.parse_args() + + config_file = f"{args.design}/lvs/user_project_wrapper/lvs_config.json" + data = parse_lvs_config(config_file) + f = open("harden_sequence.txt", "w") + for d in data: + macro_name = d.split('/')[-1].split('.v')[0] + if macro_name.startswith('$'): + macro_name = 'user_project_wrapper' + f.write(f"{macro_name} ") + f.close() + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/.github/workflows/user_project_ci.yml b/.github/workflows/user_project_ci.yml index 01bb46a02..c2aa39489 100644 --- a/.github/workflows/user_project_ci.yml +++ b/.github/workflows/user_project_ci.yml @@ -8,7 +8,7 @@ on: workflow_dispatch: jobs: - pdk: + download_caravel: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 @@ -19,34 +19,117 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v1 - - name: Export PDK ROOT - run: echo "PDK_ROOT=/home/runner/work/pdk" >> $GITHUB_ENV - - - name: Export OPENLANE ROOT - run: echo "OPENLANE_ROOT=/home/runner/work/caravel_user_project/openlane" >> $GITHUB_ENV + - name: Setup Environment Variables + run: | + echo "PDK_ROOT=$GITHUB_WORKSPACE/pdk" >> $GITHUB_ENV + echo "OPENLANE_ROOT=$GITHUB_WORKSPACE/openlane_src" >> $GITHUB_ENV + echo "CARAVEL_ROOT=$GITHUB_WORKSPACE/caravel" >> $GITHUB_ENV + echo "MCW_ROOT=$GITHUB_WORKSPACE/mgmt_core_wrapper" >> $GITHUB_ENV + echo "TIMING_ROOT=$GITHUB_WORKSPACE/timing-scripts" >> $GITHUB_ENV + echo "PRECHECK_ROOT=$GITHUB_WORKSPACE/mpw_precheck" >> $GITHUB_ENV + echo "MPW_TAG=main" >> $GITHUB_ENV - name: Install dependencies run: | sudo mkdir -p ${{ env.PDK_ROOT }} sudo chown -R $USER:$USER ${{ env.PDK_ROOT }} make install - make openlane - make pdk-with-volare + cd ${{ env.CARAVEL_ROOT }} + rm -rf gds maglef openlane spi LICENSE manifest .git - - name: Tarball PDK + - name: Tarball Caravel run: | - tar -cf /tmp/pdk.tar -C $PDK_ROOT . + tar -cf /tmp/caravel.tar -C $CARAVEL_ROOT . - - name: Upload PDK Tarball + - name: Upload Caravel Tarball uses: actions/upload-artifact@v2 with: - name: pdk-tarball - path: /tmp/pdk.tar + name: caravel-tarball + path: /tmp/caravel.tar + + download_deps: + runs-on: ubuntu-latest + strategy: + matrix: + targets: ["pdk-with-volare", "install_mcw", "openlane", "setup-timing-scripts", "precheck"] + needs: [download_caravel] + steps: + - uses: actions/checkout@v2 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v1 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v1 + + - name: Setup Environment Variables + run: | + echo "PDK_ROOT=$GITHUB_WORKSPACE/pdk" >> $GITHUB_ENV + echo "OPENLANE_ROOT=$GITHUB_WORKSPACE/openlane_src" >> $GITHUB_ENV + echo "CARAVEL_ROOT=$GITHUB_WORKSPACE/caravel" >> $GITHUB_ENV + echo "MCW_ROOT=$GITHUB_WORKSPACE/mgmt_core_wrapper" >> $GITHUB_ENV + echo "TIMING_ROOT=$GITHUB_WORKSPACE/timing-scripts" >> $GITHUB_ENV + echo "PRECHECK_ROOT=$GITHUB_WORKSPACE/mpw_precheck" >> $GITHUB_ENV + echo "MPW_TAG=main" >> $GITHUB_ENV + + - name: Get dependencies name + run: | + if [[ "${{ matrix.targets }}" == "install_mcw" ]]; then + echo "dep_name=mgmt_core_wrapper" >> $GITHUB_ENV + echo "dep_root=${{ env.MCW_ROOT }}" >> $GITHUB_ENV + elif [[ "${{ matrix.targets }}" == "openlane" ]]; then + echo "dep_name=openlane" >> $GITHUB_ENV + echo "dep_root=${{ env.OPENLANE_ROOT }}" >> $GITHUB_ENV + elif [[ "${{ matrix.targets }}" == "pdk-with-volare" ]]; then + echo "dep_name=pdk" >> $GITHUB_ENV + echo "dep_root=${{ env.PDK_ROOT }}" >> $GITHUB_ENV + elif [[ "${{ matrix.targets }}" == "setup-timing-scripts" ]]; then + echo "dep_name=timing-scripts" >> $GITHUB_ENV + echo "dep_root=${{ env.TIMING_ROOT }}" >> $GITHUB_ENV + elif [[ "${{ matrix.targets }}" == "precheck" ]]; then + echo "dep_name=precheck" >> $GITHUB_ENV + echo "dep_root=${{ env.PRECHECK_ROOT }}" >> $GITHUB_ENV + fi + + - name: Download caravel Tarball + uses: actions/download-artifact@v2 + with: + name: caravel-tarball + path: /tmp + + - name: Unpack caravel Tarball + run: | + sudo mkdir -p ${{ env.CARAVEL_ROOT }} + sudo chown -R $USER:$USER ${{ env.CARAVEL_ROOT }} + tar -xf /tmp/caravel.tar -C $CARAVEL_ROOT . + + - name: Install dependencies + run: | + sudo mkdir -p ${{ env.PDK_ROOT }} + sudo chown -R $USER:$USER ${{ env.PDK_ROOT }} + make ${{ matrix.targets }} + if [[ "${{ env.dep_name }}" == "mgmt_core_wrapper" ]]; then + cd ${{ env.dep_root }} + rm -rf gds maglef openlane spi LICENSE manifest docs litex lvs .git + fi - user_project_flow_gf180mcuC: + - name: Tarball Dependencies + run: | + tar -cf /tmp/${{ env.dep_name }}.tar -C ${{ env.dep_root }} . + + - name: Upload Dependencies Tarball + uses: actions/upload-artifact@v2 + with: + name: ${{ env.dep_name }}-tarball + path: /tmp/${{ env.dep_name }}.tar + + hardening: timeout-minutes: 720 runs-on: ubuntu-latest - needs: [pdk] + strategy: + matrix: + pdk: ["gf180mcuD"] + needs: [download_deps] steps: - uses: actions/checkout@v2 @@ -56,11 +139,17 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v1 - - name: Export PDK ROOT - run: echo "PDK_ROOT=/home/runner/work/pdk" >> $GITHUB_ENV - - - name: Export OPENLANE ROOT - run: echo "OPENLANE_ROOT=/home/runner/work/caravel_user_project/openlane" >> $GITHUB_ENV + - name: Export ENVIRONMENT VARIABLES + run: | + echo "PDK=${{ matrix.pdk }}" >> $GITHUB_ENV + echo "PDKPATH=$GITHUB_WORKSPACE/pdk/${{ matrix.pdk }}" >> $GITHUB_ENV + echo "PDK_ROOT=$GITHUB_WORKSPACE/pdk" >> $GITHUB_ENV + echo "OPENLANE_ROOT=$GITHUB_WORKSPACE/openlane_src" >> $GITHUB_ENV + echo "CARAVEL_ROOT=$GITHUB_WORKSPACE/caravel" >> $GITHUB_ENV + echo "MCW_ROOT=$GITHUB_WORKSPACE/mgmt_core_wrapper" >> $GITHUB_ENV + echo "TIMING_ROOT=$GITHUB_WORKSPACE/timing-scripts" >> $GITHUB_ENV + echo "PRECHECK_ROOT=$GITHUB_WORKSPACE/mpw_precheck" >> $GITHUB_ENV + echo "MPW_TAG=main" >> $GITHUB_ENV - name: Download PDK Tarball uses: actions/download-artifact@v2 @@ -74,66 +163,233 @@ jobs: sudo chown -R $USER:$USER ${{ env.PDK_ROOT }} tar -xf /tmp/pdk.tar -C $PDK_ROOT . - - name: Install dependencies + - name: Download openlane Tarball + uses: actions/download-artifact@v2 + with: + name: openlane-tarball + path: /tmp + + - name: Unpack openlane Tarball run: | - make install - make install_mcw - make openlane - make simenv - - - name: remove existing generated files - run: | - rm -rf /home/runner/work/caravel_user_project/gds - rm -rf /home/runner/work/caravel_user_project/verilog/gl - rm -rf /home/runner/work/caravel_user_project/mag - rm -rf /home/runner/work/caravel_user_project/maglef - rm -rf /home/runner/work/caravel_user_project/lef - rm -rf /home/runner/work/caravel_user_project/lib - rm -rf /home/runner/work/caravel_user_project/sdf - rm -rf /home/runner/work/caravel_user_project/sdc - rm -rf /home/runner/work/caravel_user_project/spef + sudo mkdir -p ${{ env.OPENLANE_ROOT }} + sudo chown -R $USER:$USER ${{ env.OPENLANE_ROOT }} + tar -xf /tmp/openlane.tar -C $OPENLANE_ROOT . - name: Harden using Openlane run: | - make user_proj_example - make user_project_wrapper + python3 $GITHUB_WORKSPACE/.github/scripts/get_designs.py --design $GITHUB_WORKSPACE + for word in $(cat harden_sequence.txt); do + echo "CURRENT_DESIGN=${word}" >> $GITHUB_ENV + make $word + done + rm -rf openlane/*/runs pdk openlane_src caravel mgmt_core_wrapper timing-scripts mpw_precheck - - name: run precheck + - name: Create reproducible + if: failure() + run: tar -cf $GITHUB_WORKSPACE/issue_reproducible.tar -C $GITHUB_WORKSPACE/openlane/${{ env.CURRENT_DESIGN }}/runs/${{ env.CURRENT_DESIGN }}/issue_reproducible . + + - name: upload failure logs + if: failure() + uses: actions/upload-artifact@v3 + with: + name: openlane-issue-reproducible + path: | + $GITHUB_WORKSPACE/issue_reproducible.tar + + - name: Tarball Design_${{ matrix.pdk }} run: | - export INPUT_DIRECTORY=$(pwd) + tar -cf /tmp/design_${{ matrix.pdk }}.tar -C $GITHUB_WORKSPACE . + + - name: Upload Design_${{ matrix.pdk }} Tarball + uses: actions/upload-artifact@v2 + with: + name: design_${{ matrix.pdk }}-tarball + path: /tmp/design_${{ matrix.pdk }}.tar + + precheck: + timeout-minutes: 720 + runs-on: ubuntu-latest + strategy: + matrix: + pdk: ["gf180mcuD"] + needs: [hardening] + steps: + - uses: actions/checkout@v2 + - name: Set up QEMU + uses: docker/setup-qemu-action@v1 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v1 + + - name: Export ENVIRONMENT VARIABLES + run: | + echo "PDK=${{ matrix.pdk }}" >> $GITHUB_ENV + echo "PDKPATH=$GITHUB_WORKSPACE/pdk/${{ matrix.pdk }}" >> $GITHUB_ENV + echo "PDK_ROOT=$GITHUB_WORKSPACE/pdk" >> $GITHUB_ENV + echo "OPENLANE_ROOT=$GITHUB_WORKSPACE/openlane_src" >> $GITHUB_ENV + echo "CARAVEL_ROOT=$GITHUB_WORKSPACE/caravel" >> $GITHUB_ENV + echo "MCW_ROOT=$GITHUB_WORKSPACE/mgmt_core_wrapper" >> $GITHUB_ENV + echo "TIMING_ROOT=$GITHUB_WORKSPACE/timing-scripts" >> $GITHUB_ENV + echo "PRECHECK_ROOT=$GITHUB_WORKSPACE/mpw_precheck" >> $GITHUB_ENV + echo "MPW_TAG=main" >> $GITHUB_ENV + + - name: Download PDK Tarball + uses: actions/download-artifact@v2 + with: + name: pdk-tarball + path: /tmp + + - name: Unpack PDK Tarball + run: | + sudo mkdir -p ${{ env.PDK_ROOT }} + sudo chown -R $USER:$USER ${{ env.PDK_ROOT }} + tar -xf /tmp/pdk.tar -C $PDK_ROOT . + + - name: Download precheck Tarball + uses: actions/download-artifact@v2 + with: + name: precheck-tarball + path: /tmp + + - name: Unpack precheck Tarball + run: | + sudo mkdir -p ${{ env.PRECHECK_ROOT }} + sudo chown -R $USER:$USER ${{ env.PRECHECK_ROOT }} + tar -xf /tmp/precheck.tar -C $PRECHECK_ROOT . + + - name: Download Design_${{ matrix.pdk }} Tarball + uses: actions/download-artifact@v2 + with: + name: design_${{ matrix.pdk }}-tarball + path: /tmp + + - name: Unpack Design_${{ matrix.pdk }} Tarball + run: | + sudo mkdir -p $GITHUB_WORKSPACE + sudo chown -R $USER:$USER $GITHUB_WORKSPACE + tar -xf /tmp/design_${{ matrix.pdk }}.tar -C $GITHUB_WORKSPACE . + + - name: Run Precheck + run: | + export INPUT_DIRECTORY=$GITHUB_WORKSPACE export PRECHECK_ROOT=$INPUT_DIRECTORY/mpw_precheck export OUTPUT_DIRECTORY=$INPUT_DIRECTORY/mpw_precheck_result export OUTPUT=$OUTPUT_DIRECTORY/logs/precheck.log + export PDKPATH=$PDK_ROOT/sky130A - git clone --depth=1 -b gfmpw-0d https://github.com/efabless/mpw_precheck.git - - docker run -v "$PRECHECK_ROOT":"$PRECHECK_ROOT" -v "$INPUT_DIRECTORY":"$INPUT_DIRECTORY" -v "${{ env.PDK_ROOT }}":"${{ env.PDK_ROOT }}" -e INPUT_DIRECTORY="$INPUT_DIRECTORY" -e PDK_ROOT="${{ env.PDK_ROOT }}" -e PDKPATH="${{ env.PDKPATH }}" -u $(id -u "$USER"):$(id -g "$USER") efabless/mpw_precheck:latest bash -c "cd $PRECHECK_ROOT; python3 mpw_precheck.py --input_directory $INPUT_DIRECTORY --pdk_path ${{ env.PDKPATH }} --output_directory $OUTPUT_DIRECTORY license makefile consistency xor magic_drc klayout_beol klayout_feol klayout_met_min_ca_density klayout_offgrid klayout_pin_label_purposes_overlapping_drawing klayout_zeroarea" + docker run -v "$PRECHECK_ROOT":"$PRECHECK_ROOT" -v "$INPUT_DIRECTORY":"$INPUT_DIRECTORY" -v "${{ env.PDK_ROOT }}":"${{ env.PDK_ROOT }}" -e INPUT_DIRECTORY="$INPUT_DIRECTORY" -e PDK_ROOT="${{ env.PDK_ROOT }}" -e PDKPATH="${{ env.PDKPATH }}" -u $(id -u "$USER"):$(id -g "$USER") efabless/mpw_precheck:latest bash -c "cd $PRECHECK_ROOT; python3 mpw_precheck.py --input_directory $INPUT_DIRECTORY --pdk_path ${{ env.PDKPATH }} --output_directory $OUTPUT_DIRECTORY license makefile consistency xor magic_drc klayout_beol klayout_feol klayout_met_min_ca_density klayout_offgrid klayout_pin_label_purposes_overlapping_drawing klayout_zeroarea lvs" cnt=$(grep -c "All Checks Passed" "$OUTPUT") if ! [[ $cnt ]]; then cnt=0; fi if [[ $cnt -eq 1 ]]; then exit 0; fi exit 2 + + STA: + timeout-minutes: 720 + runs-on: ubuntu-latest + strategy: + matrix: + pdk: ["gf180mcuD"] + needs: [hardening] + steps: + - uses: actions/checkout@v2 + - name: Set up QEMU + uses: docker/setup-qemu-action@v1 - - name: upload failure logs - if: failure() - uses: actions/upload-artifact@v2 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v1 + + - name: Export ENVIRONMENT VARIABLES + run: | + echo "PDK=${{ matrix.pdk }}" >> $GITHUB_ENV + echo "PDKPATH=$GITHUB_WORKSPACE/pdk/${{ matrix.pdk }}" >> $GITHUB_ENV + echo "PDK_ROOT=$GITHUB_WORKSPACE/pdk" >> $GITHUB_ENV + echo "OPENLANE_ROOT=$GITHUB_WORKSPACE/openlane_src" >> $GITHUB_ENV + echo "CARAVEL_ROOT=$GITHUB_WORKSPACE/caravel" >> $GITHUB_ENV + echo "MCW_ROOT=$GITHUB_WORKSPACE/mgmt_core_wrapper" >> $GITHUB_ENV + echo "TIMING_ROOT=$GITHUB_WORKSPACE/timing-scripts" >> $GITHUB_ENV + echo "PRECHECK_ROOT=$GITHUB_WORKSPACE/mpw_precheck" >> $GITHUB_ENV + echo "MPW_TAG=main" >> $GITHUB_ENV + + - name: Download PDK Tarball + uses: actions/download-artifact@v2 with: - name: error - path: | - /home/runner/work/caravel_user_project/caravel_user_project/mpw_precheck_result/logs/* - - # - name: Run DV RTL tests - # run: | - # make verify-io_ports-rtl - # make verify-la_test1-rtl - # make verify-la_test2-rtl - # make verify-mprj_stimulus-rtl - # make verify-wb_port-rtl - - # - name: Run DV GL tests - # run: | - # make verify-io_ports-gl - # make verify-la_test1-gl - # make verify-la_test2-gl - # make verify-mprj_stimulus-gl - # make verify-wb_port-gl + name: pdk-tarball + path: /tmp + + - name: Unpack PDK Tarball + run: | + sudo mkdir -p ${{ env.PDK_ROOT }} + sudo chown -R $USER:$USER ${{ env.PDK_ROOT }} + tar -xf /tmp/pdk.tar -C $PDK_ROOT . + + - name: Download timing-scripts Tarball + uses: actions/download-artifact@v2 + with: + name: timing-scripts-tarball + path: /tmp + + - name: Unpack timing-scripts Tarball + run: | + sudo mkdir -p ${{ env.TIMING_ROOT }} + sudo chown -R $USER:$USER ${{ env.TIMING_ROOT }} + tar -xf /tmp/timing-scripts.tar -C $TIMING_ROOT . + + - name: Download Design_${{ matrix.pdk }} Tarball + uses: actions/download-artifact@v2 + with: + name: design_${{ matrix.pdk }}-tarball + path: /tmp + + - name: Unpack Design_${{ matrix.pdk }} Tarball + run: | + sudo mkdir -p $GITHUB_WORKSPACE + sudo chown -R $USER:$USER $GITHUB_WORKSPACE + tar -xf /tmp/design_${{ matrix.pdk }}.tar -C $GITHUB_WORKSPACE . + + - name: Download Caravel Tarball + uses: actions/download-artifact@v2 + with: + name: caravel-tarball + path: /tmp + + - name: Unpack Caravel Tarball + run: | + sudo mkdir -p ${{ env.CARAVEL_ROOT }} + sudo chown -R $USER:$USER ${{ env.CARAVEL_ROOT }} + tar -xf /tmp/caravel.tar -C ${{ env.CARAVEL_ROOT }} . + + - name: Download mgmt_core_wrapper Tarball + uses: actions/download-artifact@v2 + with: + name: mgmt_core_wrapper-tarball + path: /tmp + + - name: Unpack mgmt_core_wrapper Tarball + run: | + sudo mkdir -p ${{ env.MCW_ROOT }} + sudo chown -R $USER:$USER ${{ env.MCW_ROOT }} + tar -xf /tmp/mgmt_core_wrapper.tar -C ${{ env.MCW_ROOT }} . + + - name: Run STA + run: | + export CUP_ROOT=$GITHUB_WORKSPACE + export PROJECT_ROOT=$GITHUB_WORKSPACE + cd $CUP_ROOT + make extract-parasitics + make create-spef-mapping + make caravel-sta + tar -cf /tmp/timing.tar $CUP_ROOT/signoff/caravel/openlane-signoff/timing + find $CUP_ROOT/signoff/caravel/openlane-signoff/timing/*/ -name "summary.log" | head -n1 \ + | xargs head -n5 | tail -n1 > $CUP_ROOT/signoff/caravel/openlane-signoff/timing/all-summary.rpt + find $CUP_ROOT/signoff/caravel/openlane-signoff/timing/*/ -name "summary.log" \ + | xargs -I {} bash -c "head -n7 {} | tail -n1" >> $CUP_ROOT/signoff/caravel/openlane-signoff/timing/all-summary.rpt + vio=$(grep -c "vio(" $CUP_ROOT/signoff/caravel/openlane-signoff/timing/all-summary.rpt || true) + if [[ $vio -gt 0 ]]; + then + echo "STA violation count: $vio" + exit 2 + else + echo "STA run passed" + exit 0 + fi \ No newline at end of file