Add Github Actions CI CI runs the precheck on the repo and runs DV
diff --git a/.github/scripts/dv/dv-check-wrapper.sh b/.github/scripts/dv/dv-check-wrapper.sh new file mode 100644 index 0000000..c677e61 --- /dev/null +++ b/.github/scripts/dv/dv-check-wrapper.sh
@@ -0,0 +1,48 @@ +#!/bin/bash +# SPDX-FileCopyrightText: 2020 Efabless Corporation +# +# 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 +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# SPDX-License-Identifier: Apache-2.0 +export TARGET_PATH=$(pwd) +cd ../ +export PDK_PATH=$(pwd)/pdks/sky130A +cd $TARGET_PATH + +export RUN_WRAPPER=$TARGET_PATH/.github/scripts/utils/run_wrapper.sh + +target_dv=$1 +target_id=$2 + +bash $RUN_WRAPPER "docker pull efabless/dv_setup:latest" + +docker run -v $TARGET_PATH:$TARGET_PATH -v $PDK_PATH:$PDK_PATH \ + -e TARGET_PATH=$TARGET_PATH -e PDK_PATH=$PDK_PATH \ + -u $(id -u $USER):$(id -g $USER) efabless/dv_setup:latest \ + bash -c "bash $TARGET_PATH/.github/scripts/dv/run-dv-$target_dv.sh $PDK_PATH $TARGET_PATH $target_id" + +echo "DONE!" + +VERDICT_FILE=$TARGET_PATH/$target_dv\_verdict.out +cat $VERDICT_FILE +if [ -f $VERDICT_FILE ]; then + cnt=$(grep "PASS" $VERDICT_FILE -s | wc -l) + if ! [[ $cnt ]]; then cnt = 0; fi +else + echo "DV check failed due to subscript failure. Please review the logs"; + exit 2; +fi + +echo "Verdict: $cnt" + +if [[ $cnt -eq 1 ]]; then exit 0; fi +exit 2;
diff --git a/.github/scripts/dv/run-dv-set.sh b/.github/scripts/dv/run-dv-set.sh new file mode 100644 index 0000000..5f757db --- /dev/null +++ b/.github/scripts/dv/run-dv-set.sh
@@ -0,0 +1,65 @@ +#!/bin/bash +# SPDX-FileCopyrightText: 2020 Efabless Corporation +# +# 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 +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# SPDX-License-Identifier: Apache-2.0 + +PDK_PATH=$1; shift +PATTERNS=( "$@" ) +last_idx=$(( ${#PATTERNS[@]} - 1 )) +TARGET_PATH=${PATTERNS[$last_idx]} +unset PATTERNS[$last_idx] +last_idx=$(( ${#PATTERNS[@]} - 1 )) +ID=${PATTERNS[$last_idx]} +unset PATTERNS[$last_idx] +last_idx=$(( ${#PATTERNS[@]} - 1 )) +TARGET_DV=${PATTERNS[$last_idx]} +unset PATTERNS[$last_idx] +last_idx=$(( ${#PATTERNS[@]} - 1 )) +PARENT=${PATTERNS[$last_idx]} +unset PATTERNS[$last_idx] + + +echo "arg1=$PDK_PATH" +echo "arg2=$PARENT" +echo "arg3=$TARGET_DV" +echo "arg4=$ID" +echo "arg5=$TARGET_PATH" +echo "PATTERNS contains:" +printf "%s\n" "${PATTERNS[@]}" + +export RUN_WRAPPER=$TARGET_PATH/.github/scripts/utils/run_wrapper.sh + +OUT_FILE=$TARGET_PATH/$TARGET_DV\_dv.$ID.out +cd $TARGET_PATH/verilog/dv/$PARENT/$TARGET_DV; +touch $OUT_FILE +for PATTERN in ${PATTERNS[*]} +do + echo "Executing DV on $PATTERN"; + cd $PATTERN; + for x in RTL GL + do + export SIM=$x + echo "Running $PATTERN $SIM.." + logFile=$TARGET_PATH/$TARGET_DV\_$PATTERN.$SIM.dv.out + bash $RUN_WRAPPER "make" 2>&1 | tee $logFile + grep "Monitor" $logFile >> $OUT_FILE + make clean + done + echo "Execution Done on $PATTERN!" + cd ..; +done + +cat $OUT_FILE + +exit 0
diff --git a/.github/scripts/dv/run-dv-user_proj_example.sh b/.github/scripts/dv/run-dv-user_proj_example.sh new file mode 100644 index 0000000..ed8995f --- /dev/null +++ b/.github/scripts/dv/run-dv-user_proj_example.sh
@@ -0,0 +1,62 @@ +#!/bin/bash +# SPDX-FileCopyrightText: 2020 Efabless Corporation +# +# 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 +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# SPDX-License-Identifier: Apache-2.0 + +PDK_PATH=$1 +TARGET_PATH=$2 +ID=$3 + +USER_PROJ_EXAMPLE_PATTERNS_1=(io_ports la_test2) +USER_PROJ_EXAMPLE_PATTERNS_2=(la_test1) + + +VERDICT_FILE=$TARGET_PATH/user_proj_example_verdict.out +OUT_FILE=$TARGET_PATH/user_proj_example_dv.$ID.out + +case $ID in + + 1) + bash $TARGET_PATH/.github/scripts/dv/run-dv-set.sh $PDK_PATH "${USER_PROJ_EXAMPLE_PATTERNS_1[@]}" caravel user_proj_example 1 $TARGET_PATH + len=${#USER_PROJ_EXAMPLE_PATTERNS_1[@]} + export TOTAL=$(( 2*(len) )) + ;; + + 2) + bash $TARGET_PATH/.github/scripts/dv/run-dv-set.sh $PDK_PATH "${USER_PROJ_EXAMPLE_PATTERNS_2[@]}" caravel user_proj_example 2 $TARGET_PATH + len=${#USER_PROJ_EXAMPLE_PATTERNS_2[@]} + export TOTAL=$(( 2*(len) )) + ;; + + *) + echo -n "unknown ID $ID" + exit 2 + ;; +esac + +cnt=$(grep -i "Passed" $OUT_FILE | wc -l) + + +echo "total passed expected: $TOTAL" +echo "passed found: $cnt" +if [[ $cnt -eq $TOTAL ]]; then echo "PASS" > $VERDICT_FILE; exit 0; fi + +echo "FAIL" > $VERDICT_FILE + + +echo "Total Verdict File:" +cat $VERDICT_FILE + +exit 0 +
diff --git a/.github/scripts/precheck/precheckBuild.sh b/.github/scripts/precheck/precheckBuild.sh new file mode 100644 index 0000000..d618190 --- /dev/null +++ b/.github/scripts/precheck/precheckBuild.sh
@@ -0,0 +1,36 @@ +#!/bin/bash +# SPDX-FileCopyrightText: 2020 Efabless Corporation +# +# 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 +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# SPDX-License-Identifier: Apache-2.0 + +# By default build pdk since we don't need the other script for the main purpose +export SKIP_PDK_BUILD=${1:-0} + +export TARGET_PATH=$(pwd) +git clone https://github.com/efabless/open_mpw_precheck.git + +docker pull efabless/open_mpw_precheck:latest + + +if [ $SKIP_PDK_BUILD -eq 0 ]; then + cd $TARGET_PATH/.. + export PDK_ROOT=$(pwd)/precheck_pdks + mkdir $PDK_ROOT + cd $TARGET_PATH/open_mpw_precheck/dependencies + sh build-pdk.sh + cd $TARGET_DIR + +fi + +exit 0
diff --git a/.github/scripts/precheck/run-precheck.sh b/.github/scripts/precheck/run-precheck.sh new file mode 100644 index 0000000..569ecc7 --- /dev/null +++ b/.github/scripts/precheck/run-precheck.sh
@@ -0,0 +1,35 @@ +#!/bin/bash +# SPDX-FileCopyrightText: 2020 Efabless Corporation +# +# 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 +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# SPDX-License-Identifier: Apache-2.0 +export TARGET_PATH=$(pwd) +cd .. +export PDK_ROOT=$(pwd)/precheck_pdks +cd $TARGET_PATH/open_mpw_precheck/ + +docker run -v $(pwd):/usr/local/bin -v $TARGET_PATH:$TARGET_PATH -v $PDK_ROOT:$PDK_ROOT -u $(id -u $USER):$(id -g $USER) efabless/open_mpw_precheck:latest bash -c "python3 open_mpw_prechecker.py -p $PDK_ROOT -t $TARGET_PATH" +output=$TARGET_PATH/checks/full_log.log + +gzipped_file=$TARGET_PATH/checks/full_log.log.gz + +if [[ -f $gzipped_file ]]; then + gzip -d $gzipped_file +fi + +grep "Violation Message" $output + +cnt=$(grep -c "All Checks PASSED!" $output) +if ! [[ $cnt ]]; then cnt=0; fi +if [[ $cnt -eq 1 ]]; then exit 0; fi +exit 2
diff --git a/.github/scripts/utils/bash_run_wrapper.sh b/.github/scripts/utils/bash_run_wrapper.sh new file mode 100644 index 0000000..7ab39e0 --- /dev/null +++ b/.github/scripts/utils/bash_run_wrapper.sh
@@ -0,0 +1,26 @@ + +#!/bin/bash +# SPDX-FileCopyrightText: 2020 Efabless Corporation +# +# 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 +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# SPDX-License-Identifier: Apache-2.0 + +# Abort on Error +set -e + +# Test script is provided as a relative path +export WORKDIR=$(pwd) +export TEST_SCRIPT=$WORKDIR/$1 +export TAILING_LINES=${2:-500} + +bash $WORKDIR/.github/scripts/utils/run_wrapper.sh "bash $TEST_SCRIPT" "$TAILING_LINES"
diff --git a/.github/scripts/utils/pdkBuild.sh b/.github/scripts/utils/pdkBuild.sh new file mode 100644 index 0000000..b8f938d --- /dev/null +++ b/.github/scripts/utils/pdkBuild.sh
@@ -0,0 +1,61 @@ +#!/bin/bash +# SPDX-FileCopyrightText: 2020 Efabless Corporation +# +# 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 +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# SPDX-License-Identifier: Apache-2.0 +export RUN_ROOT=$(pwd) + + +# By default skip timing since we don't need the libs in any of the CI tests +export SKIP_TIMING=${1:-1} +export OPENLANE_TAG=rc7 +export IMAGE_NAME=efabless/openlane:$OPENLANE_TAG +docker pull $IMAGE_NAME + +cd $RUN_ROOT/.. +export PDK_ROOT=$(pwd)/pdks +mkdir $PDK_ROOT +echo $PDK_ROOT +echo $RUN_ROOT +cd $RUN_ROOT +make skywater-pdk +make skywater-library +# The following section is for running on the CI. +# If you're running locally you should replace them with: `make skywater-library` +# This is because sometimes while setting up the conda env (skywater's make timing) it fails to fetch something +# Then it exits without retrying. So, here we're retrying, and if something goes wrong it will exit after 5 retries. +# Section Begin +if [ $SKIP_TIMING -eq 0 ]; then + cnt=0 + until make skywater-timing; do + cnt=$((cnt+1)) + if [ $cnt -eq 5 ]; then + exit 2 + fi + rm -rf $PDK_ROOT/skywater-pdk + make skywater-pdk + make skywater-library + done +fi +# Section End + +make open_pdks +docker run -v $RUN_ROOT:/openLANE_flow -v $PDK_ROOT:$PDK_ROOT -e PDK_ROOT=$PDK_ROOT -u $(id -u $USER):$(id -g $USER) $IMAGE_NAME bash -c "make build-pdk" +echo "done installing" +echo "Delete docker image:" +docker rmi $IMAGE_NAME +echo "Cleaning up PDK installation directory" +rm -rf $PDK_ROOT/skywater-pdk/ +rm -rf $PDK_ROOT/open_pdks/ +cd $RUN_ROOT +exit 0
diff --git a/.github/scripts/utils/run_wrapper.sh b/.github/scripts/utils/run_wrapper.sh new file mode 100644 index 0000000..48a9f6a --- /dev/null +++ b/.github/scripts/utils/run_wrapper.sh
@@ -0,0 +1,60 @@ + +#!/bin/bash +# SPDX-FileCopyrightText: 2020 Efabless Corporation +# +# 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 +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# SPDX-License-Identifier: Apache-2.0 + +# Adopted from Chris Snow +# https://stackoverflow.com/questions/26082444/how-to-work-around-travis-cis-4mb-output-limit/26082445#26082445 + +# Abort on Error +set -e + +# Test script is provided as a relative path +export WORKDIR=$(pwd) +export COMMAND=$1 +export TAILING_LINES=${2:-500} +export PING_SLEEP=30s +export BUILD_OUTPUT=$WORKDIR/build.out + +touch $BUILD_OUTPUT + +dump_output() { + echo Tailing the last $TAILING_LINES lines of output: + tail -$TAILING_LINES $BUILD_OUTPUT + rm -f $BUILD_OUTPUT +} +error_handler() { + echo ERROR: An error was encountered with the build. + dump_output + kill $PING_LOOP_PID + exit 1 +} +# If an error occurs, run our error handler to output a tail of the build +trap 'error_handler' ERR + +# Set up a repeating loop to send some output to Travis. + +bash -c "while true; do echo \$(date) - running $COMMAND ...; sleep $PING_SLEEP; done" & +export PING_LOOP_PID=$! + +# your_build_command_1 >> $BUILD_OUTPUT 2>&1 +# your_build_command_2 >> $BUILD_OUTPUT 2>&1 +$COMMAND >> $BUILD_OUTPUT 2>&1 + +# The build finished without returning an error so dump a tail of the output +dump_output + +# nicely terminate the ping output loop +kill $PING_LOOP_PID
diff --git a/.github/workflows/caravel_example_ci.yml b/.github/workflows/caravel_example_ci.yml new file mode 100644 index 0000000..da76702 --- /dev/null +++ b/.github/workflows/caravel_example_ci.yml
@@ -0,0 +1,66 @@ +name: CI + + +on: + # Runs on Every Push + push: + # Runs on Pull Requests + pull_request: + +jobs: + precheck: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + with: + submodules: 'true' + + - name: Set up QEMU + uses: docker/setup-qemu-action@v1 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v1 + + - name: Install The Precheck + run: sh ${GITHUB_WORKSPACE}/.github/scripts/precheck/precheckBuild.sh + + - name: Run The Precheck + run: sh ${GITHUB_WORKSPACE}/.github/scripts/precheck/run-precheck.sh + + simulation-1: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + with: + submodules: 'true' + + - name: Set up QEMU + uses: docker/setup-qemu-action@v1 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v1 + + - name: Install The PDK + run: bash ${GITHUB_WORKSPACE}/.github/scripts/utils/bash_run_wrapper.sh .github/scripts/utils/pdkBuild.sh + + - name: Run The Simulation + run: bash ${GITHUB_WORKSPACE}/.github/scripts/dv/dv-check-wrapper.sh user_proj_example 1 + + simulation-2: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + with: + submodules: 'true' + + - name: Set up QEMU + uses: docker/setup-qemu-action@v1 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v1 + + - name: Install The PDK + run: bash ${GITHUB_WORKSPACE}/.github/scripts/utils/bash_run_wrapper.sh .github/scripts/utils/pdkBuild.sh + + - name: Run The Simulation + run: bash ${GITHUB_WORKSPACE}/.github/scripts/dv/dv-check-wrapper.sh user_proj_example 2