CI #2196
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: CI | |
# Variables | |
env: | |
IP_ROOT: ./test/designs/.ip-root | |
# Events that trigger workflow | |
on: | |
# Runs on all pushes to branches | |
push: | |
# Runs on all PRs | |
pull_request: | |
# Runs every day at midnight UTC | |
schedule: | |
- cron: "0 0 * * *" | |
# Manual Dispatch | |
workflow_dispatch: | |
jobs: | |
prepare-test-matrices: | |
name: Prepare Test Matrices and Cache PDKs | |
runs-on: ubuntu-22.04 | |
outputs: | |
design_matrix: ${{ steps.set-matrix.outputs.design_matrix }} | |
opdks_rev: ${{ steps.set-rev.outputs.opdks_rev }} | |
steps: | |
- uses: actions/checkout@v3 | |
- name: Python Dependencies | |
run: | | |
python3 -m pip install -r ./requirements.txt | |
- name: Determine If Running Extended Test Set | |
run: | | |
export EVENT_NAME=${{ github.event_name }}; | |
python3 ./.github/scripts/determine_test_set.py | |
- name: Set Matrix | |
id: set-matrix | |
run: | | |
python3 ./.github/test_sets/get_test_matrix.py --scl sky130A/sky130_fd_sc_hd --scl gf180mcuD/gf180mcu_fd_sc_mcu7t5v0 $TEST_SETS | |
echo "design_matrix=$(python3 ./.github/test_sets/get_test_matrix.py --scl sky130A/sky130_fd_sc_hd --scl gf180mcuD/gf180mcu_fd_sc_mcu7t5v0 $TEST_SETS)" >> $GITHUB_OUTPUT | |
- name: Get Open PDKs Revision | |
id: set-rev | |
run: | | |
echo "opdks_rev=$(cat ./openlane/open_pdks_rev)" >> $GITHUB_OUTPUT | |
- name: Cache PDKs | |
uses: actions/cache@v3 | |
with: | |
path: ~/.volare | |
key: cache-pdks-${{ steps.set-rev.outputs.opdks_rev }} | |
- name: Enable PDKs | |
run: | | |
export GITHUB_TOKEN=${{ secrets.GITHUB_TOKEN }} | |
volare enable --pdk sky130 ${{ steps.set-rev.outputs.opdks_rev }} | |
volare enable --pdk gf180mcu ${{ steps.set-rev.outputs.opdks_rev }} | |
- name: Download IPM | |
run: | | |
python3 -m pip install git+https://github.com/efabless/IPM | |
- name: Checkout submodules | |
uses: actions/checkout@v3 | |
with: | |
submodules: true | |
- name: Cache IPM designs | |
uses: actions/cache@v3 | |
with: | |
path: ~/.ipm | |
key: cache-ipm-designs-${{ steps.download-ipm-design.outputs.dependencies_sha256sum }} | |
- name: Download IPM designs | |
id: download-ipm-design | |
run: | | |
export GITHUB_TOKEN=${{ secrets.GITHUB_TOKEN }} | |
ipm install-dep --ip-root $(realpath $IP_ROOT) --ipm-root ~/.ipm | |
echo "dependencies_sha256sum=$(sha256sum $IP_ROOT/dependencies.json | cut -d ' ' -f1)" >> $GITHUB_OUTPUT | |
lint: | |
name: Lint | |
runs-on: ubuntu-22.04 | |
steps: | |
- name: Check out repo | |
uses: actions/checkout@v3 | |
- name: Set Up Python | |
uses: actions/setup-python@v4 | |
with: | |
python-version: "3.8" | |
- name: Install Linters | |
run: make venv | |
- name: Lint | |
run: make lint | |
build-linux-amd64: | |
needs: lint | |
runs-on: ubuntu-22.04 | |
name: Build (Nix on Linux/amd64) | |
steps: | |
- uses: actions/checkout@v3 | |
- name: Initialize Step Unit Test Submodule | |
run: | | |
git submodule update --init test/steps/all | |
- name: Set up GITHUB_TOKEN | |
run: | | |
echo "GITHUB_TOKEN=${{ secrets.GITHUB_TOKEN }}" >> $GITHUB_ENV | |
- name: Build with Nix | |
uses: ./.github/actions/build_nix | |
with: | |
cachix_cache: ${{ vars.CACHIX_CACHE || 'openlane' }} | |
cachix_token: "${{ secrets.CACHIX_TOKEN }}" | |
- name: Derivation to Cache | |
uses: ./.github/actions/derivation_to_cache | |
with: | |
key: derivation-amd64-${{ github.run_id }} | |
build-linux-aarch64: | |
needs: lint | |
runs-on: ubuntu-22.04 | |
name: Build (Nix on Linux/aarch64) | |
steps: | |
- uses: actions/checkout@v3 | |
- uses: docker/setup-qemu-action@v1 | |
- name: Initialize Step Unit Test Submodule | |
run: | | |
git submodule update --init test/steps/all | |
- name: Set up GITHUB_TOKEN | |
run: | | |
echo "GITHUB_TOKEN=${{ secrets.GITHUB_TOKEN }}" >> $GITHUB_ENV | |
- name: Build with Nix | |
uses: ./.github/actions/build_nix | |
with: | |
cachix_cache: ${{ vars.CACHIX_CACHE || 'openlane' }} | |
cachix_token: "${{ secrets.CACHIX_TOKEN }}" | |
nix_build_args: --option system aarch64-linux --extra-platforms aarch64-linux | |
- name: Derivation to Cache | |
uses: ./.github/actions/derivation_to_cache | |
with: | |
key: derivation-aarch64-${{ github.run_id }} | |
build-mac-amd64: | |
needs: lint | |
runs-on: macos-12 | |
name: Build (Nix on macOS/amd64) | |
steps: | |
- uses: actions/checkout@v3 | |
- name: Initialize Step Unit Test Submodule | |
run: | | |
git submodule update --init test/steps/all | |
- name: Set up GITHUB_TOKEN | |
run: | | |
echo "GITHUB_TOKEN=${{ secrets.GITHUB_TOKEN }}" >> $GITHUB_ENV | |
- name: Build with Nix | |
uses: ./.github/actions/build_nix | |
with: | |
cachix_cache: ${{ vars.CACHIX_CACHE || 'openlane' }} | |
cachix_token: "${{ secrets.CACHIX_TOKEN }}" | |
shell: "zsh {0}" | |
build-py: | |
runs-on: ubuntu-22.04 | |
needs: lint | |
strategy: | |
matrix: | |
python-version: ["3.8", "3.9", "3.10"] | |
fail-fast: false | |
name: Build and Unit Test (Python ${{ matrix.python-version }}) | |
steps: | |
- name: Check out repo | |
uses: actions/checkout@v3 | |
- name: Set Up Python | |
uses: actions/setup-python@v4 | |
with: | |
python-version: ${{ matrix.python-version }} | |
- name: Run Unit Tests | |
run: | | |
make test | |
build-docker: | |
runs-on: ubuntu-22.04 | |
strategy: | |
matrix: | |
arch: ["amd64", "aarch64"] | |
needs: [build-linux-amd64, build-linux-aarch64] | |
name: Build Docker Image (${{ matrix.arch }}) | |
steps: | |
- name: Check out repo | |
uses: actions/checkout@v3 | |
- uses: docker/setup-qemu-action@v1 | |
- name: Setup Nix | |
uses: ./.github/actions/setup_nix | |
with: | |
cachix_cache: ${{ vars.CACHIX_CACHE || 'openlane' }} | |
- name: Derivation from Cache | |
uses: ./.github/actions/derivation_from_cache | |
with: | |
key: derivation-${{ matrix.arch }}-${{ github.run_id }} | |
other-substituters: "https://${{ vars.CACHIX_CACHE || 'openlane' }}.cachix.org" | |
- name: Build Docker Image | |
run: | | |
if [ "${{ matrix.arch }}" == "aarch64" ]; then | |
arch_flags="--option system aarch64-linux --extra-platforms aarch64-linux" | |
fi | |
IMAGE_PATH=$(nix-build --argstr name openlane --argstr tag-override tmp-${{ matrix.arch }} $arch_flags docker.nix) | |
echo "IMAGE_PATH=$IMAGE_PATH" >> $GITHUB_ENV | |
cat $IMAGE_PATH | docker load | |
- name: Set Up Python | |
uses: actions/setup-python@v4 | |
with: | |
python-version: "3.8" | |
- name: Install Dependencies | |
run: make venv | |
- name: Smoke-Test Docker Image | |
run: | | |
mkdir -p $HOME/.volare | |
chmod -R 755 $HOME/.volare | |
OPENLANE_IMAGE_OVERRIDE=openlane:tmp-${{ matrix.arch }}\ | |
./venv/bin/python3 -m openlane\ | |
--docker-no-tty\ | |
--dockerized\ | |
--smoke-test | |
- name: Upload Docker Artifact | |
uses: actions/upload-artifact@v3 | |
with: | |
name: docker-image-${{ matrix.arch }} | |
path: ${{ env.IMAGE_PATH }} | |
test: | |
runs-on: ubuntu-22.04 | |
needs: [build-linux-amd64, prepare-test-matrices] | |
name: Test Design ${{ matrix.design.name }} (${{ matrix.design.pdk }}/${{matrix.design.scl}}) | |
strategy: | |
fail-fast: false | |
matrix: ${{ fromJSON(needs.prepare-test-matrices.outputs.design_matrix) }} | |
steps: | |
- uses: actions/checkout@v3 | |
with: | |
submodules: recursive | |
- name: Setup Nix | |
uses: ./.github/actions/setup_nix | |
with: | |
cachix_cache: ${{ vars.CACHIX_CACHE || 'openlane' }} | |
- name: Derivation from Cache | |
uses: ./.github/actions/derivation_from_cache | |
with: | |
key: derivation-amd64-${{ github.run_id }} | |
other-substituters: "https://${{ vars.CACHIX_CACHE || 'openlane' }}.cachix.org" | |
- name: Cache PDKs | |
id: cache-pdks | |
uses: actions/cache@v3 | |
with: | |
path: ~/.volare | |
key: cache-pdks-${{ needs.prepare-test-matrices.outputs.opdks_rev }} | |
- name: Enable PDKs | |
if: steps.cache-pdks.outputs.cache-hit != 'true' | |
run: | | |
pip3 install -r ./requirements.txt | |
volare enable --pdk sky130 ${{ needs.prepare-test-matrices.outputs.opdks_rev }} | |
volare enable --pdk gf180mcu ${{ needs.prepare-test-matrices.outputs.opdks_rev }} | |
- name: Cache IPM designs | |
uses: actions/cache@v3 | |
with: | |
path: ~/.ipm | |
key: cache-ipm-designs-${{ needs.prepare-test-matrice.outputsteps.dependencies_sha256sum }} | |
- name: Setup IPM designs | |
run: | | |
python3 -m pip install git+https://github.com/efabless/IPM | |
ipm install-dep --ip-root $(realpath $IP_ROOT) --ipm-root ~/.ipm | |
- name: Run Test | |
run: | | |
if test ${{matrix.design.script}} = "None" | |
then | |
nix-shell --run "\ | |
python3 -m openlane\ | |
--run-tag CI\ | |
--pdk ${{ matrix.design.pdk }}\ | |
--scl ${{matrix.design.scl}}\ | |
${{ matrix.design.config }}\ | |
" | |
else | |
nix-shell --run "\ | |
${{matrix.design.script}}\ | |
" | |
fi | |
- name: Upload Run Folder | |
if: ${{ always() }} | |
uses: actions/upload-artifact@v3 | |
with: | |
name: ${{ matrix.design.name }}-${{ matrix.design.pdk }}-${{ matrix.design.scl }} | |
path: ${{ matrix.design.run_folder }} | |
publish: | |
runs-on: ubuntu-22.04 | |
needs: [build-linux-amd64, build-mac-amd64, build-docker, build-py] | |
name: Publish (If Applicable) | |
steps: | |
- name: Check out repo | |
uses: actions/checkout@v3 | |
with: | |
fetch-depth: 0 | |
- name: Setup Environment | |
uses: ./.github/actions/setup_env | |
- name: Auth (Docker) | |
if: ${{ env.PUBLISH == '1' }} | |
uses: docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9 | |
with: | |
registry: ghcr.io | |
username: ${{ github.actor }} | |
password: ${{ secrets.GH_TOKEN }} | |
- name: Download Image (Docker/amd64) | |
uses: actions/download-artifact@v3 | |
with: | |
name: docker-image-amd64 | |
path: /tmp/docker | |
- name: Download Image (Docker/aarch64) | |
uses: actions/download-artifact@v3 | |
with: | |
name: docker-image-aarch64 | |
path: /tmp/docker | |
- name: Load Images (Docker) | |
run: | | |
for file in /tmp/docker/*; do | |
cat $file | docker load | |
done | |
- name: Push (Docker) | |
if: ${{ env.PUBLISH == '1' }} | |
run: | | |
docker tag openlane:tmp-amd64 ghcr.io/${{ github.repository }}:$NEW_TAG-amd64 | |
docker push ghcr.io/${{ github.repository }}:$NEW_TAG-amd64 | |
docker tag openlane:tmp-aarch64 ghcr.io/${{ github.repository }}:$NEW_TAG-aarch64 | |
docker push ghcr.io/${{ github.repository }}:$NEW_TAG-aarch64 | |
docker manifest create\ | |
ghcr.io/${{ github.repository }}:$NEW_TAG\ | |
ghcr.io/${{ github.repository }}:$NEW_TAG-amd64\ | |
ghcr.io/${{ github.repository }}:$NEW_TAG-aarch64 | |
docker manifest push ghcr.io/${{ github.repository }}:$NEW_TAG | |
- name: Set Up Python | |
if: ${{ env.PUBLISH == '1' }} | |
uses: actions/setup-python@v4 | |
with: | |
python-version: "3.8" | |
- name: Build Distribution | |
if: ${{ env.PUBLISH == '1' }} | |
run: | | |
make dist | |
- name: Publish | |
if: ${{ env.PUBLISH == '1' }} | |
uses: pypa/gh-action-pypi-publish@master | |
with: | |
password: ${{ secrets.PYPI_API_TOKEN }} | |
- name: Tag Commit | |
if: ${{ env.PUBLISH == '1' }} | |
uses: tvdias/[email protected] | |
with: | |
tag: "${{ env.NEW_TAG }}" | |
repo-token: "${{ secrets.GH_TOKEN }}" |