| #!/bin/bash |
| export CALIBRE_HOME=/usr/local/google/edatools/mentor/calibre/2018.4.34.26/aoj_cal_2018.4_34.26/ |
| export MGC_TMPDIR=/tmp |
| export MGC_CALIBRE_LAYOUT_TMP_FILE=/tmp/query_results |
| export CALIBRE_DISABLE_RHEL5_WARNING=1 |
| export USE_CALIBRE_VCO=aoj |
| export CALIBRE_VERSION_DASH=2018.4_34.26 |
| export CALIBRE_VERSION_DOT=$(echo $CALIBRE_VERSION_DASH | sed -e's/_/./') |
| export MGC_HOME=/usr/local/google/edatools/mentor/calibre/$CALIBRE_VERSION_DOT/aoj_cal_$CALIBRE_VERSION_DASH/ |
| export PATH=${MGC_HOME}/bin:${PATH} |
| export MGLS_LICENSE_FILE=1817@gchips-licenses.corp.google.com |
| export LM_LICENSE_FILE=1717@gchips-licenses.corp.google.com |
| export PDK_VERSION="V1.3.0" |
| export PDK_HOME="/data/pdks/skywater/s8/$PDK_VERSION" |
| export RUNSET_DIR="$PDK_HOME/DRC/Calibre" |
| if [ -z $VERSION ];then |
| echo "Missing VERSION" |
| exit 1 |
| fi |
| export TEST_DIR=/usr/local/google/home/tansell/work/openflow-drc-tests |
| export VERILOG=$TEST_DIR/verilog |
| export CDL=$TEST_DIR/cdl |
| export JOB_HOME=$TEST_DIR/torture_tests/$VERSION/ |
| if [ ! -d "$JOB_HOME" ]; then |
| echo "$JOB_HOME doesn't exist?" |
| exit 1 |
| fi |
| for GDS_FILE in $JOB_HOME/*.gds; do |
| export JOB_NAME="$(basename -s .gds $GDS_FILE)" |
| # export JOB_NAME=s8pir_10r_vcells_lvs |
| # export JOB_NAME=torture_test_s8 |
| echo |
| echo |
| echo |
| echo "export JOB_HOME='$JOB_HOME'" |
| echo "export JOB_NAME='$JOB_NAME'" |
| echo "=====================================" |
| if [ ! -e $JOB_HOME/$JOB_NAME.gds ]; then |
| echo "Did not find '$JOB_HOME/$JOB_NAME.gds'" |
| exit 1 |
| fi |
| set -x |
| cd $TEST_DIR |
| git checkout HEAD $TEST_DIR/runsets/*_runset |
| #sed -i -e"s@\$JOB_HOME@$JOB_HOME@" $TEST_DIR/runsets/*_runset |
| cd ~/github/google/skywater-pdk/s8/$PDK_VERSION |
| # No-PEX extraction (ugly) |
| export LAYOUT_PRIMARY="$JOB_NAME" |
| export LAYOUT_PATH="$JOB_HOME/$JOB_NAME.gds" |
| export LAYOUT_NAME=$LAYOUT_PRIMARY |
| export LVS_RUNSET_DIR="$PDK_HOME/LVS/Calibre" |
| echo -en "LAYOUT SYSTEM GDSII\nLAYOUT PRIMARY $LAYOUT_PRIMARY\nLAYOUT PATH \"$LAYOUT_PATH\"\nERC RESULTS DATABASE "ercdb"\nINCLUDE $LVS_RUNSET_DIR/lvsRules_s8" > spice_runset |
| # end no-PEX extraction |
| # V2LVS flow |
| if [ -e $VERILOG/$JOB_NAME.v ] ; then |
| if compgen -G "${CDL}/library_*.cdl" > /dev/null; then |
| cat $CDL/library_*.cdl > $JOB_HOME/libraries.cdl |
| else |
| echo "* empty libraries" > $JOB_HOME/libraries.cdl |
| fi |
| # converts a verilog structural netlist to a SPICE-like netlist for LVS |
| v2lvs -v $VERILOG/$JOB_NAME.v -o $JOB_HOME/${JOB_NAME}_v2lvs.spice -s $JOB_HOME/libraries.cdl > $JOB_HOME/$JOB_NAME.v2lvs.log 2>&1 || true |
| cp $JOB_HOME/${JOB_NAME}_v2lvs.spice $JOB_HOME/$JOB_NAME.cdl |
| fi |
| # end V2LVS flow |
| ######################################################### |
| # Disabling those to speed things up for LVS for now: |
| ######################################################### |
| calibre -gui -drc -runset $TEST_DIR/runsets/s8_drc_runset -batch > $JOB_HOME/$JOB_NAME.drc_runset.log 2>&1 |
| calibre -gui -drc -runset $TEST_DIR/runsets/s8_fill_runset -batch > $JOB_HOME/$JOB_NAME.fill_runset.log 2>&1 |
| calibre -gui -drc -runset $TEST_DIR/runsets/s8_latchup_runset -batch > $JOB_HOME/$JOB_NAME.latchup_runset.log 2>&1 |
| calibre -gui -drc -runset $TEST_DIR/runsets/s8_lures_runset -batch > $JOB_HOME/$JOB_NAME.lures_runset.log 2>&1 |
| calibre -gui -drc -runset $TEST_DIR/runsets/s8_soft_runset -batch > $JOB_HOME/$JOB_NAME.soft_runset.log 2>&1 |
| calibre -gui -drc -runset $TEST_DIR/runsets/s8_stress_runset -batch > $JOB_HOME/$JOB_NAME.stress_runset.log 2>&1 |
| calibre -gui -drc -runset $TEST_DIR/runsets/s8_drcmr_runset -batch > $JOB_HOME/$JOB_NAME.drcmr_runset.log 2>&1 |
| |
| |
| # remove fill cells and tap cells from the source netlist before LVS |
| [ -f $JOB_HOME/$JOB_NAME.cdl ] && \ |
| python3 $TEST_DIR/scripts/remove_spice_instances.py \ |
| $JOB_HOME/$JOB_NAME.cdl \ |
| sky130_fd_sc_hd__fill sky130_fd_sc_hvl__fill sky130_fd_sc_hd__tapvpwrvgnd_1 \ |
| > $JOB_HOME/$JOB_NAME.remove_spice_instances.log 2>&1 |
| |
| [ -f $JOB_HOME/$JOB_NAME.cdl ] && cp $JOB_HOME/$JOB_NAME.cdl $JOB_HOME/$JOB_NAME.lvs_source.cdl |
| |
| # patch the LVS rules to avoid the need for polycuts |
| cp $PDK_HOME/LVS/Calibre/lvsRules_s8 $PDK_HOME/LVS/Calibre/lvsRules_s8.bk |
| cp $PDK_HOME/PEX/xRC/extLvsRules_s8_5lm $PDK_HOME/PEX/xRC/extLvsRules_s8_5lm.bk |
| |
| sed -i "/^POLY_cond_nrc =/s/q9xuhrpoly_0p69_sub/xuhrpoly_0p69_sub/g" $PDK_HOME/PEX/xRC/extLvsRules_s8_5lm |
| |
| cp $PDK_HOME/LVS/Calibre/lvsRules_s8 $JOB_HOME |
| cp $PDK_HOME/PEX/xRC/extLvsRules_s8_5lm $JOB_HOME |
| |
| timeout 10800 calibre -gui -lvs -runset $TEST_DIR/runsets/s8_lvs_runset -batch > $JOB_HOME/$JOB_NAME.lvs_runset.log 2>&1 |
| |
| # restore the originals |
| mv $PDK_HOME/LVS/Calibre/lvsRules_s8.bk $PDK_HOME/LVS/Calibre/lvsRules_s8 |
| mv $PDK_HOME/PEX/xRC/extLvsRules_s8_5lm.bk $PDK_HOME/PEX/xRC/extLvsRules_s8_5lm |
| |
| # layout extraction |
| ######################################################### |
| # Disabling those to speed things up for LVS for now: |
| ######################################################### |
| # calibre -spice ${VERSION}.cdl spice_runset > $JOB_HOME/$JOB_NAME.extract.runset.log 2>&1 |
| # mkdir $JOB_HOME/extract |
| # mv lvs.rep.ext $JOB_HOME/extract/ |
| # mv ercdb $JOB_HOME/extract/ |
| # cp ${VERSION}.cdl $JOB_HOME/extract |
| # mv ${VERSION}.cdl $JOB_HOME/ |
| # rm spice_runset |
| |
| # calibre -gui -pex -runset $TEST_DIR/runsets/s8_xRC_runset -batch > $JOB_HOME/$JOB_NAME.xRC_runset.log 2>&1 |
| find $JOB_HOME -type f -exec sed -i -e's/... [0-9][0-9] [0-9 ][0-9]:[0-9][0-9]:[0-9][0-9] 2.../... XX XX:XX:XX 2.../' \{\} \+ |
| done |
| exit 0 |