From 76840e5cafbb12bd78c320955f5edfb127c32f1a Mon Sep 17 00:00:00 2001 From: "chipfoundry-automation-app[bot]" <210245826+chipfoundry-automation-app[bot]@users.noreply.github.com> Date: Sun, 28 Sep 2025 09:40:48 +0000 Subject: [PATCH] Autosync: Update root and openlane Makefiles (b8f53ef56248c123b837c869f58bd7dad57877bd) --- .github/scripts/get_designs.py | 29 ++ .github/workflows/user_project_ci.yml | 563 ++++++++++++++++++++++++++ Makefile | 167 ++++---- openlane/Makefile | 153 +++---- 4 files changed, 756 insertions(+), 156 deletions(-) create mode 100644 .github/scripts/get_designs.py create mode 100644 .github/workflows/user_project_ci.yml diff --git a/.github/scripts/get_designs.py b/.github/scripts/get_designs.py new file mode 100644 index 0000000..0bb803f --- /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 new file mode 100644 index 0000000..71a85d9 --- /dev/null +++ b/.github/workflows/user_project_ci.yml @@ -0,0 +1,563 @@ +name: CI + +on: + # Runs on Every Push + push: + # Runs on Pull Requests + pull_request: + workflow_dispatch: + +jobs: + download_caravel: + runs-on: ubuntu-latest + name: Build and Cache PDK + steps: + - uses: actions/checkout@v4 + + - 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: Install Dependencies + run: | + sudo mkdir -p ${{ env.PDK_ROOT }} + sudo chown -R $USER:$USER ${{ env.PDK_ROOT }} + make install + cd ${{ env.CARAVEL_ROOT }} + rm -rf gds maglef openlane spi LICENSE manifest .git + + - name: Tarball Caravel + run: | + tar -cf /tmp/caravel.tar -C $CARAVEL_ROOT . + + - name: Upload Caravel Tarball + uses: actions/upload-artifact@v4 + with: + name: caravel-tarball + path: /tmp/caravel.tar + + download_deps: + runs-on: ubuntu-latest + strategy: + matrix: + targets: + ["pdk-with-volare", "install_mcw", "setup-timing-scripts", "precheck"] + needs: [download_caravel] + steps: + - uses: actions/checkout@v4 + + - 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 "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 }}" == "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@v4 + 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 + + - name: Tarball Dependencies + run: | + tar -cf /tmp/${{ env.dep_name }}.tar -C ${{ env.dep_root }} . + + - name: Upload Dependencies Tarball + uses: actions/upload-artifact@v4 + with: + name: ${{ env.dep_name }}-tarball + path: /tmp/${{ env.dep_name }}.tar + + hardening: + timeout-minutes: 720 + runs-on: ubuntu-latest + strategy: + matrix: + pdk: ["sky130A", "sky130B"] + needs: [download_deps] + steps: + - uses: actions/checkout@v4 + + - 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 "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@v4 + 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 caravel Tarball + uses: actions/download-artifact@v4 + 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 LibreLane + run: | + sudo apt-get install -y python3 python3-venv python3-tk + cd $GITHUB_WORKSPACE + make openlane + + - name: Harden using LibreLane + run: | + 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/user_proj_example/runs openlane/user_project_wrapper/runs pdk openlane_src caravel mgmt_core_wrapper timing-scripts mpw_precheck + + ## TODO: LibreLane does not do reproducibles. + # - 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@v4 + # with: + # name: openlane-issue-reproducible + # path: | + # $GITHUB_WORKSPACE/issue_reproducible.tar + + - name: Tarball Design_${{ matrix.pdk }} + run: | + tar -cf /tmp/design_${{ matrix.pdk }}.tar -C $GITHUB_WORKSPACE . + + - name: Upload Design_${{ matrix.pdk }} Tarball + uses: actions/upload-artifact@v4 + with: + name: design_${{ matrix.pdk }}-tarball + path: /tmp/design_${{ matrix.pdk }}.tar + + RTL-verification: + timeout-minutes: 720 + runs-on: ubuntu-latest + strategy: + matrix: + pdk: ["sky130A", "sky130B"] + needs: [download_deps] + steps: + - uses: actions/checkout@v4 + + - 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@v4 + 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 caravel Tarball + uses: actions/download-artifact@v4 + 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: Download mgmt_core_wrapper Tarball + uses: actions/download-artifact@v4 + 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 $MCW_ROOT . + + - name: install cocotb + run: | + make setup-cocotb + + - name: run RTL verification + run: | + cd $GITHUB_WORKSPACE/verilog/dv/cocotb && $GITHUB_WORKSPACE/venv-cocotb/bin/caravel_cocotb -tl user_proj_tests/user_proj_tests.yaml -verbosity debug --CI -tag rtl_verification + cnt=$(grep -c "failed" "$GITHUB_WORKSPACE/verilog/dv/cocotb/sim/rtl_verification/runs.log") + if ! [[ $cnt ]]; then cnt=0; fi + if [[ $cnt -eq 1 ]]; then exit 0; fi + exit 2 + + precheck: + timeout-minutes: 720 + runs-on: ubuntu-latest + strategy: + matrix: + pdk: ["sky130A", "sky130B"] + needs: [hardening] + steps: + - uses: actions/checkout@v4 + - 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@v4 + 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@v4 + 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@v4 + 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 + + 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: ["sky130A"] + needs: [hardening] + steps: + - uses: actions/checkout@v4 + - 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@v4 + 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 timing-scripts Tarball + uses: actions/download-artifact@v4 + 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@v4 + 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@v4 + 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@v4 + 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 + + # GL-verification: + # timeout-minutes: 720 + # runs-on: ubuntu-latest + # strategy: + # matrix: + # pdk: ["sky130A", "sky130B"] + # needs: [download_deps] + # steps: + # - uses: actions/checkout@v4 + + # - 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@v4 + # 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 caravel Tarball + # uses: actions/download-artifact@v4 + # 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: Download mgmt_core_wrapper Tarball + # uses: actions/download-artifact@v4 + # 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 $MCW_ROOT . + + # # - name: Download Design Tarball + # # uses: actions/download-artifact@v4 + # # with: + # # name: design-tarball + # # path: /tmp + + # # - name: Unpack Design Tarball + # # run: | + # # sudo mkdir -p $GITHUB_WORKSPACE + # # sudo chown -R $USER:$USER $GITHUB_WORKSPACE + # # tar -xf /tmp/design.tar -C $GITHUB_WORKSPACE . + + # - name: install cocotb + # run: | + # make setup-cocotb + + # - name: run RTL verification + # run: | + # cd $GITHUB_WORKSPACE/verilog/dv/cocotb && $GITHUB_WORKSPACE/venv-cocotb/bin/caravel_cocotb -tl user_proj_tests/user_proj_tests_gl.yaml -verbosity debug --CI -tag gl_verification + # cnt=$(grep -c "failed" "$GITHUB_WORKSPACE/verilog/dv/cocotb/sim/gl_verification/runs.log") + # if ! [[ $cnt ]]; then cnt=0; fi + # if [[ $cnt -eq 1 ]]; then exit 0; fi + # exit 2 diff --git a/Makefile b/Makefile index df947d2..e56b0fe 100644 --- a/Makefile +++ b/Makefile @@ -13,7 +13,10 @@ # limitations under the License. # # SPDX-License-Identifier: Apache-2.0 -MAKEFLAGS+=--warn-undefined-variables +export CUP_ROOT ?= $(shell pwd) +export TIMING_ROOT ?= $(shell pwd)/dependencies/timing-scripts +export PROJECT_ROOT = $(CUP_ROOT) +MAKEFLAGS += --warn-undefined-variables export CARAVEL_ROOT?=$(PWD)/caravel export UPRJ_ROOT?=$(PWD) @@ -25,7 +28,7 @@ SIM?=RTL CARAVEL_LITE?=1 # PDK switch varient -export PDK?=sky130B +export PDK?=sky130A #export PDK?=gf180mcuC export PDKPATH?=$(PDK_ROOT)/$(PDK) @@ -42,52 +45,44 @@ export DISABLE_LVS?=0 export ROOTLESS -ifeq ($(PDK),sky130A) - SKYWATER_COMMIT=f70d8ca46961ff92719d8870a18a076370b85f6c - export OPEN_PDKS_COMMIT?=0fe599b2afb6708d281543108caf8310912f54af - export OPENLANE_TAG?=2024.08.15 - MPW_TAG ?= mpw-9k +export CIEL_DATA_SOURCE=static-web:https://chipfoundry.github.io/ciel-releases +ifeq ($(PDK),sky130A) +export OPEN_PDKS_COMMIT_LVS?=6d4d11780c40b20ee63cc98e645307a9bf2b2ab8 +export OPEN_PDKS_COMMIT?=3e0e31dcce8519a7dbb82590346db16d91b7244f +MPW_TAG ?= CC2509 ifeq ($(CARAVEL_LITE),1) - CARAVEL_NAME := caravel-lite - CARAVEL_REPO := https://github.com/efabless/caravel-lite - CARAVEL_TAG := $(MPW_TAG) +CARAVEL_NAME := caravel-lite +CARAVEL_REPO := https://github.com/chipfoundry/caravel-lite +CARAVEL_TAG := $(MPW_TAG) else - CARAVEL_NAME := caravel - CARAVEL_REPO := https://github.com/efabless/caravel - CARAVEL_TAG := $(MPW_TAG) +CARAVEL_NAME := caravel +CARAVEL_REPO := https://github.com/chipfoundry/caravel +CARAVEL_TAG := $(MPW_TAG) endif - endif ifeq ($(PDK),sky130B) - SKYWATER_COMMIT=f70d8ca46961ff92719d8870a18a076370b85f6c - export OPEN_PDKS_COMMIT?=0fe599b2afb6708d281543108caf8310912f54af - export OPENLANE_TAG?=2024.08.15 - MPW_TAG ?= mpw-9k - +export OPEN_PDKS_COMMIT_LVS?=6d4d11780c40b20ee63cc98e645307a9bf2b2ab8 +export OPEN_PDKS_COMMIT?=3e0e31dcce8519a7dbb82590346db16d91b7244f +MPW_TAG ?= 2024.09.12-1 ifeq ($(CARAVEL_LITE),1) - CARAVEL_NAME := caravel-lite - CARAVEL_REPO := https://github.com/efabless/caravel-lite - CARAVEL_TAG := $(MPW_TAG) +CARAVEL_NAME := caravel-lite +CARAVEL_REPO := https://github.com/chipfoundry/caravel-lite +CARAVEL_TAG := $(MPW_TAG) else - CARAVEL_NAME := caravel - CARAVEL_REPO := https://github.com/efabless/caravel - CARAVEL_TAG := $(MPW_TAG) +CARAVEL_NAME := caravel +CARAVEL_REPO := https://github.com/chipfoundry/caravel +CARAVEL_TAG := $(MPW_TAG) endif - endif ifeq ($(PDK),gf180mcuD) - - MPW_TAG ?= gfmpw-1c - CARAVEL_NAME := caravel - CARAVEL_REPO := https://github.com/efabless/caravel-gf180mcu - CARAVEL_TAG := $(MPW_TAG) - #OPENLANE_TAG=ddfeab57e3e8769ea3d40dda12be0460e09bb6d9 - export OPEN_PDKS_COMMIT?=dd7771c384ed36b91a25e9f8b314355fc26561be - export OPENLANE_TAG?=2023.10.16 - +MPW_TAG ?= gfmpw-1c +CARAVEL_NAME := caravel +CARAVEL_REPO := https://github.com/chipfoundry/caravel-gf180mcu +CARAVEL_TAG := $(MPW_TAG) +export OPEN_PDKS_COMMIT?=78b7bc32ddb4b6f14f76883c2e2dc5b5de9d1cbc endif # Include Caravel Makefile Targets @@ -107,21 +102,17 @@ install: # Install DV setup .PHONY: simenv simenv: - docker pull efabless/dv:latest + docker pull chipfoundry/dv:latest # Install cocotb docker .PHONY: simenv-cocotb simenv-cocotb: - docker pull efabless/dv:cocotb + docker pull chipfoundry/dv:cocotb .PHONY: setup -setup: check_dependencies install check-env install_mcw openlane pdk-with-volare setup-timing-scripts setup-cocotb precheck +setup: check_dependencies install check-env install_mcw openlane pdk-with-ciel setup-timing-scripts setup-cocotb precheck # Openlane -blocks=$(shell cd openlane && find * -maxdepth 0 -type d) -.PHONY: $(blocks) -$(blocks): % : - $(MAKE) -C openlane $* dv_patterns=$(shell cd verilog/dv && find * -maxdepth 0 -type d) cocotb-dv_patterns=$(shell cd verilog/dv/cocotb && find . -name "*.c" | sed -e 's|^.*/||' -e 's/.c//') @@ -149,12 +140,9 @@ docker_run_verify=\ -e CORE_VERILOG_PATH=$(TARGET_PATH)/mgmt_core_wrapper/verilog \ -e CARAVEL_VERILOG_PATH=$(TARGET_PATH)/caravel/verilog \ -e MCW_ROOT=$(MCW_ROOT) \ - efabless/dv:latest \ + chipfoundry/dv:latest \ sh -c $(verify_command) -.PHONY: harden -harden: $(blocks) - .PHONY: verify verify: $(dv-targets-rtl) @@ -179,32 +167,23 @@ $(dv-targets-gl-sdf): SIM=GL_SDF $(dv-targets-gl-sdf): verify-%-gl-sdf: $(dv_base_dependencies) $(docker_run_verify) -clean-targets=$(blocks:%=clean-%) -.PHONY: $(clean-targets) -$(clean-targets): clean-% : - rm -f ./verilog/gl/$*.v - rm -f ./spef/$*.spef - rm -f ./sdc/$*.sdc - rm -f ./sdf/$*.sdf - rm -f ./gds/$*.gds - rm -f ./mag/$*.mag - rm -f ./lef/$*.lef - rm -f ./maglef/*.maglef - make_what=setup $(blocks) $(dv-targets-rtl) $(dv-targets-gl) $(dv-targets-gl-sdf) $(clean-targets) .PHONY: what what: # $(make_what) -# Install Openlane -.PHONY: openlane -openlane: - @if [ "$$(realpath $${OPENLANE_ROOT})" = "$$(realpath $$(pwd)/openlane)" ]; then\ - echo "OPENLANE_ROOT is set to '$$(pwd)/openlane' which contains openlane config files"; \ - echo "Please set it to a different directory"; \ - exit 1; \ - fi - cd openlane && $(MAKE) openlane +# Install LibreLane +.PHONY: librelane openlane librelane-% openlane2-venv openlane2-docker-container +openlane: librelane +librelane: librelane-venv +openlane2-venv: librelane-venv +openlane2-docker-container: librelane-docker-image +librelane-%: + $(MAKE) -C openlane $@ + +# Alias to install with Ciel +pdk-with-volare: + $(MAKE) pdk-with-ciel #### Not sure if the targets following are of any use @@ -241,8 +220,8 @@ precheck: rm -rf $(PRECHECK_ROOT) && sleep 2;\ fi @echo "Installing Precheck.." - @git clone --depth=1 --branch $(MPW_TAG) https://github.com/efabless/mpw_precheck.git $(PRECHECK_ROOT) - @docker pull efabless/mpw_precheck:latest + @git clone --depth=1 --branch $(MPW_TAG) https://github.com/chipfoundry/mpw_precheck.git $(PRECHECK_ROOT) + @docker pull chipfoundry/mpw_precheck:latest .PHONY: run-precheck run-precheck: check-pdk check-precheck @@ -258,7 +237,7 @@ run-precheck: check-pdk check-precheck -e PDK_ROOT=$(PDK_ROOT) \ -e PDKPATH=$(PDKPATH) \ -u $(shell id -u $(USER)):$(shell id -g $(USER)) \ - efabless/mpw_precheck:latest bash -c "cd $(PRECHECK_ROOT) ; python3 mpw_precheck.py --input_directory $(INPUT_DIRECTORY) --pdk_path $(PDK_ROOT)/$(PDK) license makefile default documentation consistency gpio_defines xor magic_drc klayout_feol klayout_beol klayout_offgrid klayout_met_min_ca_density klayout_pin_label_purposes_overlapping_drawing klayout_zeroarea"; \ + chipfoundry/mpw_precheck:latest bash -c "cd $(PRECHECK_ROOT) ; python3 mpw_precheck.py --input_directory $(INPUT_DIRECTORY) --pdk_path $(PDK_ROOT)/$(PDK) license makefile default documentation consistency gpio_defines xor magic_drc klayout_feol klayout_beol klayout_offgrid klayout_met_min_ca_density klayout_pin_label_purposes_overlapping_drawing klayout_zeroarea"; \ else \ $(eval INPUT_DIRECTORY := $(shell pwd)) \ cd $(PRECHECK_ROOT) && \ @@ -271,9 +250,13 @@ run-precheck: check-pdk check-precheck -e PDK_ROOT=$(PDK_ROOT) \ -e PDKPATH=$(PDKPATH) \ -u $(shell id -u $(USER)):$(shell id -g $(USER)) \ - efabless/mpw_precheck:latest bash -c "cd $(PRECHECK_ROOT) ; python3 mpw_precheck.py --input_directory $(INPUT_DIRECTORY) --pdk_path $(PDK_ROOT)/$(PDK)"; \ + chipfoundry/mpw_precheck:latest bash -c "cd $(PRECHECK_ROOT) ; python3 mpw_precheck.py --input_directory $(INPUT_DIRECTORY) --pdk_path $(PDK_ROOT)/$(PDK)"; \ fi +.PHONY: enable-lvs-pdk +enable-lvs-pdk: + $(UPRJ_ROOT)/venv/bin/ciel enable $(OPEN_PDKS_COMMIT_LVS) + BLOCKS = $(shell cd lvs && find * -maxdepth 0 -type d) LVS_BLOCKS = $(foreach block, $(BLOCKS), lvs-$(block)) $(LVS_BLOCKS): lvs-% : ./lvs/%/lvs_config.json check-pdk check-precheck @@ -283,7 +266,7 @@ $(LVS_BLOCKS): lvs-% : ./lvs/%/lvs_config.json check-pdk check-precheck -v $(INPUT_DIRECTORY):$(INPUT_DIRECTORY) \ -v $(PDK_ROOT):$(PDK_ROOT) \ -u $(shell id -u $(USER)):$(shell id -g $(USER)) \ - efabless/mpw_precheck:latest bash -c "export PYTHONPATH=$(PRECHECK_ROOT) ; cd $(PRECHECK_ROOT) ; python3 checks/lvs_check/lvs.py --pdk_path $(PDK_ROOT)/$(PDK) --design_directory $(INPUT_DIRECTORY) --output_directory $(INPUT_DIRECTORY)/lvs --design_name $* --config_file $(INPUT_DIRECTORY)/lvs/$*/lvs_config.json" + chipfoundry/mpw_precheck:latest bash -c "export PYTHONPATH=$(PRECHECK_ROOT) ; cd $(PRECHECK_ROOT) ; python3 checks/lvs_check/lvs.py --pdk_path $(PDK_ROOT)/$(PDK) --design_directory $(INPUT_DIRECTORY) --output_directory $(INPUT_DIRECTORY)/lvs --design_name $* --config_file $(INPUT_DIRECTORY)/lvs/$*/lvs_config.json" .PHONY: clean clean: @@ -319,11 +302,7 @@ check_dependencies: mkdir $(PWD)/dependencies; \ fi - -export CUP_ROOT=$(shell pwd) -export TIMING_ROOT?=$(shell pwd)/dependencies/timing-scripts -export PROJECT_ROOT=$(CUP_ROOT) -timing-scripts-repo=https://github.com/efabless/timing-scripts.git +timing-scripts-repo=https://github.com/chipfoundry/timing-scripts.git $(TIMING_ROOT): @mkdir -p $(CUP_ROOT)/dependencies @@ -354,18 +333,18 @@ cocotb-verify-all-rtl: .PHONY: cocotb-verify-all-gl cocotb-verify-all-gl: - @(cd $(PROJECT_ROOT)/verilog/dv/cocotb && $(PROJECT_ROOT)/venv-cocotb/bin/caravel_cocotb -tl user_proj_tests/user_proj_tests_gl.yaml -verbosity quiet) + @(cd $(PROJECT_ROOT)/verilog/dv/cocotb && $(PROJECT_ROOT)/venv-cocotb/bin/caravel_cocotb -tl user_proj_tests/user_proj_tests_gl.yaml -sim GL) $(cocotb-dv-targets-rtl): cocotb-verify-%-rtl: @(cd $(PROJECT_ROOT)/verilog/dv/cocotb && $(PROJECT_ROOT)/venv-cocotb/bin/caravel_cocotb -t $* ) $(cocotb-dv-targets-gl): cocotb-verify-%-gl: - @(cd $(PROJECT_ROOT)/verilog/dv/cocotb && $(PROJECT_ROOT)/venv-cocotb/bin/caravel_cocotb -t $* -verbosity quiet) + @(cd $(PROJECT_ROOT)/verilog/dv/cocotb && $(PROJECT_ROOT)/venv-cocotb/bin/caravel_cocotb -t $* -sim GL) ./verilog/gl/user_project_wrapper.v: $(error you don't have $@) -./env/spef-mapping.tcl: +./env/spef-mapping.tcl: @echo "run the following:" @echo "make extract-parasitics" @echo "make create-spef-mapping" @@ -382,7 +361,7 @@ create-spef-mapping: ./verilog/gl/user_project_wrapper.v -v $(MCW_ROOT):$(MCW_ROOT) \ -v $(TIMING_ROOT):$(TIMING_ROOT) \ -w $(shell pwd) \ - efabless/timing-scripts:latest \ + chipfoundry/timing-scripts:latest \ python3 $(TIMING_ROOT)/scripts/generate_spef_mapping.py \ -i ./verilog/gl/user_project_wrapper.v \ -o ./env/spef-mapping.tcl \ @@ -402,7 +381,7 @@ extract-parasitics: ./verilog/gl/user_project_wrapper.v -v $(MCW_ROOT):$(MCW_ROOT) \ -v $(TIMING_ROOT):$(TIMING_ROOT) \ -w $(shell pwd) \ - efabless/timing-scripts:latest \ + chipfoundry/timing-scripts:latest \ python3 $(TIMING_ROOT)/scripts/get_macros.py \ -i ./verilog/gl/user_project_wrapper.v \ -o ./tmp-macros-list \ @@ -414,7 +393,7 @@ extract-parasitics: ./verilog/gl/user_project_wrapper.v @$(MAKE) -C $(TIMING_ROOT) -f $(TIMING_ROOT)/timing.mk rcx-user_project_wrapper @cat ./tmp-macros-list @rm ./tmp-macros-list - + .PHONY: caravel-sta caravel-sta: ./env/spef-mapping.tcl @$(MAKE) -C $(TIMING_ROOT) -f $(TIMING_ROOT)/timing.mk caravel-timing-typ -j3 @@ -427,5 +406,25 @@ caravel-sta: ./env/spef-mapping.tcl | xargs -I {} bash -c "head -n7 {} | tail -n1" @echo ================================================================================================= @echo "You can find results for all corners in $(CUP_ROOT)/signoff/caravel/openlane-signoff/timing/" - @echo "Check summary.log of a specific corner to point to reports with reg2reg violations" + @echo "Check summary.log of a specific corner to point to reports with reg2reg violations" @echo "Cap and slew violations are inside summary.log file itself" + +blocks=$(shell cd $(PROJECT_ROOT)/openlane && find * -maxdepth 0 -type d) +.PHONY: $(blocks) +$(blocks): % : + $(MAKE) -C openlane $* + +.PHONY: harden +harden: $(blocks) + +clean-targets=$(blocks:%=clean-%) +.PHONY: $(clean-targets) +$(clean-targets): clean-% : + rm -f ./verilog/gl/$*.v + rm -f ./spef/$*.spef + rm -f ./sdc/$*.sdc + rm -f ./sdf/$*.sdf + rm -f ./gds/$*.gds + rm -f ./mag/$*.mag + rm -f ./lef/$*.lef + rm -f ./maglef/*.maglef diff --git a/openlane/Makefile b/openlane/Makefile index fc9c491..17c488f 100644 --- a/openlane/Makefile +++ b/openlane/Makefile @@ -1,4 +1,9 @@ -# SPDX-FileCopyrightText: 2020 Efabless Corporation +# Copyright 2025 UmbraLogic Technologies LLC +# +# Adapted from Caravel User Project +# +# Copyright 2020-2024 Efabless Corporation +# SPDX-FileCopyrightText: # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at @@ -13,91 +18,95 @@ # # SPDX-License-Identifier: Apache-2.0 -SHELL := /bin/bash -MAKEFLAGS+=--warn-undefined-variables +MAKEFLAGS += --warn-undefined-variables -export OPENLANE_RUN_TAG = $(shell date '+%y_%m_%d_%H_%M') -OPENLANE_TAG ?= 2024.08.15 -OPENLANE_IMAGE_NAME ?= efabless/openlane:$(OPENLANE_TAG) -designs=$(shell find * -maxdepth 0 -type d) +# set shell to bash +SHELL := /bin/bash -ROOTLESS ?= 0 -USER_ARGS = -u $$(id -u $$USER):$$(id -g $$USER) -ifeq ($(ROOTLESS), 1) - USER_ARGS = +ifeq ($(origin LIBRELANE_RUN_TAG), undefined) +export LIBRELANE_RUN_TAG := $(shell date '+%y_%m_%d_%H_%M') endif +ifeq ($(origin CF_LIBRELANE_TAG), undefined) +export CF_LIBRELANE_TAG := CC2509c +endif + +export CARAVEL_ROOT := $(CARAVEL_ROOT) +export PDK := $(PDK) +export PDK_ROOT := $(PDK_ROOT) + +designs = $(shell cd $(PROJECT_ROOT)/openlane && find * -maxdepth 0 -type d) +current_design = null + +LIBRELANE_USE_NIX ?= 0 -openlane_cmd = \ - "flow.tcl \ - -design $$(realpath ./$*) \ - -save_path $$(realpath ..) \ - -save \ - -tag $(OPENLANE_RUN_TAG) \ - -overwrite \ - -ignore_mismatches" -openlane_cmd_interactive = "flow.tcl -it -file $$(realpath ./$*/interactive.tcl)" +librelane_args = \ + --run-tag $(LIBRELANE_RUN_TAG) \ + --manual-pdk \ + --pdk-root $(PDK_ROOT) \ + --pdk $(PDK) docker_mounts = \ - -v $$(realpath $(PWD)/..):$$(realpath $(PWD)/..) \ - -v $(PDK_ROOT):$(PDK_ROOT) \ - -v $(CARAVEL_ROOT):$(CARAVEL_ROOT) \ - -v $(HOME)/.ipm:$(HOME)/.ipm \ - -v $(OPENLANE_ROOT):/openlane - -docker_env = \ - -e PDK_ROOT=$(PDK_ROOT) \ - -e PDK=$(PDK) \ - -e MISMATCHES_OK=1 \ - -e CARAVEL_ROOT=$(CARAVEL_ROOT) \ - -e OPENLANE_RUN_TAG=$(OPENLANE_RUN_TAG) + -m $(PROJECT_ROOT) \ + -m $(PDK_ROOT) \ + -m $(CARAVEL_ROOT) \ + -m $(HOME)/.ipm ifneq ($(MCW_ROOT),) -docker_env += -e MCW_ROOT=$(MCW_ROOT) -docker_mounts += -v $(MCW_ROOT):$(MCW_ROOT) +export MCW_ROOT:=$(MCW_ROOT) +docker_mounts += -m $(MCW_ROOT) endif -docker_startup_mode = $(shell test -t 0 && echo "-it" || echo "--rm" ) -docker_run = \ - docker run $(docker_startup_mode) \ - $(USER_ARGS) \ - $(docker_mounts) \ - $(docker_env) \ +ifeq ($(LIBRELANE_USE_NIX),1) +librelane_run = nix run github:chipfoundry/openlane-2/$(CF_LIBRELANE_TAG) -- +else +librelane_docker_args = $(shell test -t 0 || echo "--docker-no-tty") +librelane_run = $(PROJECT_ROOT)/openlane/.venv/bin/python3 -m librelane $(docker_mounts) $(librelane_docker_args) --dockerized +endif list: @echo $(designs) .PHONY: $(designs) -$(designs) : % : - mkdir -p ./$*/runs/$(OPENLANE_RUN_TAG) - rm -rf ./$*/runs/$* - ln -s $$(realpath ./$*/runs/$(OPENLANE_RUN_TAG)) ./$*/runs/$* - if [[ -f ./$@/interactive.tcl ]]; then \ - $(docker_run) \ - $(OPENLANE_IMAGE_NAME) sh -c $(openlane_cmd_interactive); \ +$(designs) : export current_design=$@ +$(designs): + @config_dir="$(PROJECT_ROOT)/openlane/$@"; \ + config=""; \ + for ext in yaml json tcl; do \ + if [ -f "$$config_dir/config.$$ext" ]; then \ + config="$$config_dir/config.$$ext"; break; \ + fi; \ + done; \ + if [ -n "$$config" ]; then \ + cmd='$(librelane_run) $(librelane_args) --ef-save-views-to $(PROJECT_ROOT) --overwrite "$$config"'; \ + echo "* Running LibreLane on $@ with $$config"; \ + echo $$cmd; \ + eval $$cmd; \ + fi + +librelane: librelane-venv librelane-docker-image + +.PHONY: librelane-docker-image +librelane-docker-image: + @echo "LibreLane will automatically pull the appropriate Docker image as needed." + +librelane-venv: $(PROJECT_ROOT)/openlane/.venv/manifest.txt +$(PROJECT_ROOT)/openlane/.venv/manifest.txt: $(PROJECT_ROOT)/openlane/.version-$(CF_LIBRELANE_TAG) + rm -rf $(PROJECT_ROOT)/openlane/.venv + python3 -m venv $(PROJECT_ROOT)/openlane/.venv + PYTHONPATH= $(PROJECT_ROOT)/openlane/.venv/bin/python3 -m pip install --upgrade pip + PYTHONPATH= $(PROJECT_ROOT)/openlane/.venv/bin/python3 -m pip install "https://github.com/chipfoundry/openlane-2/tarball/$(CF_LIBRELANE_TAG)" + PYTHONPATH= $(PROJECT_ROOT)/openlane/.venv/bin/python3 -m pip freeze > $@ + +$(PROJECT_ROOT)/openlane/.version-$(CF_LIBRELANE_TAG): + echo "$(CF_LIBRELANE_TAG)" > $@ + python3 -c 'import os; [os.remove(f) for f in os.listdir("$(@D)") if f.startswith(".version-") and f != os.path.basename("$@")]' + +.PHONY: librelane-nix +librelane-nix: + @if ! command -v nix > /dev/null; then\ + echo "Nix not found. Please install Nix using the LibreLane documentation:"; \ + echo " https://librelane.readthedocs.io/en/latest/getting_started/common/nix_installation/index.html"; \ else \ - $(docker_run) \ - $(OPENLANE_IMAGE_NAME) sh -c $(openlane_cmd); \ + echo "Activating LibreLane Nix environment…"; \ + nix develop github:chipfoundry/openlane-2/$(CF_LIBRELANE_TAG); \ fi - @mkdir -p ../signoff/$*/ - @cp ./$*/runs/$*/OPENLANE_VERSION ../signoff/$*/ - @cp ./$*/runs/$*/PDK_SOURCES ../signoff/$*/ - @cp ./$*/runs/$*/reports/*.csv ../signoff/$*/ - -.PHONY: openlane -openlane: check-openlane-env - if [ -d "$(OPENLANE_ROOT)" ]; then\ - echo "Deleting exisiting $(OPENLANE_ROOT)" && \ - rm -rf $(OPENLANE_ROOT) && sleep 2; \ - fi - git clone https://github.com/The-OpenROAD-Project/OpenLane -b $(OPENLANE_TAG) --depth=1 $(OPENLANE_ROOT) && \ - cd $(OPENLANE_ROOT) && \ - export OPENLANE_IMAGE_NAME=efabless/openlane:$(OPENLANE_TAG) && \ - export IMAGE_NAME=efabless/openlane:$(OPENLANE_TAG) && \ - $(MAKE) pull-openlane - -.PHONY: check-openlane-env -check-openlane-env: -ifeq ($(OPENLANE_ROOT),) - @echo "Please export OPENLANE_ROOT" - @exit 1 -endif