| #!/bin/bash |
| # |
| ################################################################################################################## |
| ##DO NOT CHANGE ANY OF THE BELOW BETWEEN THE TWO DO NOT CHANGE LINES ############################################# |
| ################################################################################################################## |
| |
| if [ -z "$MGLS_LICENSE_FILE" ]; then |
| echo "Missing MGLS_LICENSE_FILE" |
| exit 1 |
| fi |
| if [ -z "$LM_LICENSE_FILE" ]; then |
| echo "Missing LM_LICENSE_FILE" |
| exit 1 |
| fi |
| 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} |
| # |
| if [ -z $VERSION ];then |
| echo "Missing VERSION" |
| exit 1 |
| fi |
| export TEST_DIR=/usr/local/google/home/tansell/work/openflow-drc-tests/ |
| export JOB_HOME=$TEST_DIR/torture_tests/$VERSION/ |
| export PDK_HOME=$TEST_DIR/pdk/skywater/s130/V2.1.302 |
| if [ ! -d "$JOB_HOME" ]; then |
| echo "$JOB_HOME doesn't exist?" |
| exit 1 |
| fi |
| |
| for GDS_FILE in $JOB_HOME/gds/*.gds; do |
| export JOB_NAME="$(basename -s .gds $GDS_FILE)" |
| echo |
| echo |
| echo |
| echo "export JOB_HOME='$JOB_HOME'" |
| echo "export JOB_NAME='$JOB_NAME'" |
| echo "=====================================" |
| if [ ! -e $JOB_HOME/gds/$JOB_NAME.gds ]; then |
| echo "Did not find '$JOB_HOME/gds/$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/V1.3.0 |
| |
| ################################################################################################################## |
| ##DO NOT CHANGE ANY OF THE ABOVE ################################################################################# |
| ################################################################################################################## |
| |
| ################################################################################################################## |
| # Directories |
| ################################################################################################################## |
| |
| mkdir -p $JOB_HOME/logs |
| mkdir -p $JOB_HOME/lvs |
| mkdir -p $JOB_HOME/spef |
| mkdir -p $JOB_HOME/cdl |
| |
| ################################################################################################################## |
| # Variables needed by $TEST_DIR/runsets/local_xrc_rules.2 |
| ################################################################################################################## |
| |
| export JOB_HOME=$JOB_HOME |
| export JOB_NAME=$JOB_NAME |
| export LAYOUT_NAME=$JOB_NAME.gds |
| export LAYOUT_EXTRACTED=$JOB_NAME.extracted.cdl |
| export SOURCE_NAME=$JOB_NAME.source.cdl |
| export LVS_REPORT=$JOB_NAME.lvs.report |
| export PEX_NETLIST=$JOB_NAME.spef |
| |
| export LAYOUT_PATH=$JOB_HOME/gds/$LAYOUT_NAME |
| export SOURCE_PATH=$JOB_HOME/cdl/$SOURCE_NAME |
| export LVS_REPORT_PATH=$JOB_HOME/lvs/$LVS_REPORT |
| export PEX_NETLIST_PATH=$JOB_HOME/spef/$PEX_NETLIST |
| export SVDB_PATH=$JOB_HOME/svdb |
| |
| ################################################################################################################## |
| # Runset |
| ################################################################################################################## |
| |
| export RUNSET_DIR=$TEST_DIR/runsets/s130/V2.1.302 |
| export RUNSET=$RUNSET_DIR/base |
| export HCELLS=$RUNSET_DIR/hcells.txt |
| export XCELLS=$RUNSET_DIR/xcells.txt |
| |
| ################################################################################################################## |
| # V2LVS flow |
| ################################################################################################################## |
| |
| if [ -e $JOB_HOME/verilog/$JOB_NAME.v ] ; then |
| if [ ! -z "$(ls -A $JOB_HOME/cdl/)" ] ; then |
| echo "Found cdls under $JOB_HOME/cdl/" |
| cat $JOB_HOME/cdl/*.cdl > $JOB_HOME/cdl/libraries-merged.cdl |
| fi |
| cat $TEST_DIR/libraries/cdl/*.cdl >> $JOB_HOME/cdl/libraries-merged.cdl |
| |
| |
| ## merge all verilog netlist |
| for verilog_module in $JOB_HOME/verilog/*; do |
| echo "" >> $verilog_module |
| done |
| for verilog_module in $JOB_HOME/verilog/box/*; do |
| echo "" >> $verilog_module |
| done |
| touch $JOB_HOME/cdl/box.cdl |
| mkdir -p $JOB_HOME/verilog/box |
| cat $JOB_HOME/verilog/box/* >> $JOB_HOME/verilog/box/merged.v |
| ##converts a verilog structural netlist to a SPICE-like netlist for LVS |
| |
| verilog_input=$JOB_HOME/verilog/$JOB_NAME.v |
| # verilog to spice with bus delimeter = "<>" |
| v2lvs -v $JOB_HOME/verilog/box/merged.v -o $JOB_HOME/cdl/box.cdl -e |
| v2lvs -a "<>" -w 2 -v $verilog_input -o $JOB_HOME/cdl/$JOB_NAME.busworkaround.source.cdl \ |
| -s $JOB_HOME/cdl/libraries-merged.cdl -s $JOB_HOME/cdl/box.cdl \ |
| 2>&1 | tee $JOB_HOME/logs/$JOB_NAME.busworkaround.v2lvs.log || true |
| |
| # -e Specifies that empty .SUBCKT definitions are generated for all modules (no |
| # instances are translated). This is useful for generating “black box” subcircuits |
| # from library files. See Using the –e Switch to Create LVS Box Subcircuits |
| # later in this chapter. |
| # v2lvs -e -a "<>" -w 2 -v $verilog_input -o $JOB_HOME/cdl/$JOB_NAME.busworkaround.source.cdl \ |
| # | tee $JOB_HOME/logs/$JOB_NAME.busworkaround.v2lvs.log || true |
| |
| ## escape square brackets that are not buses |
| ## then replace <> buses with [] |
| sed 's/\[/\\[/g' -i $JOB_HOME/cdl/$JOB_NAME.busworkaround.source.cdl |
| sed 's/\]/\\]/g' -i $JOB_HOME/cdl/$JOB_NAME.busworkaround.source.cdl |
| sed 's/</\[/g' -i $JOB_HOME/cdl/$JOB_NAME.busworkaround.source.cdl |
| sed 's/>/\]/g' -i $JOB_HOME/cdl/$JOB_NAME.busworkaround.source.cdl |
| |
| export SOURCE_NAME=$JOB_NAME.busworkaround.source.cdl |
| export SOURCE_PATH=$JOB_HOME/cdl/$SOURCE_NAME |
| |
| # just keep this to compare with the workaround |
| v2lvs -w 2 -v $verilog_input -o $JOB_HOME/cdl/$JOB_NAME.source.cdl \ |
| -s $JOB_HOME/cdl/libraries-merged.cdl 2>&1 | tee $JOB_HOME/logs/$JOB_NAME.v2lvs.log || true |
| #cp $JOB_HOME/cdl/$JOB_NAME.source.cdl $JOB_HOME/cdl/${SOURCE_NAME} |
| |
| |
| else |
| if [ ! -z "$(ls -A $JOB_HOME/cdl/$JOB_NAME.cdl)" ] ; then |
| echo ".INCLUDE $JOB_HOME/cdl/libraries-merged.cdl" >> $JOB_HOME/cdl/${SOURCE_NAME} |
| cat $JOB_HOME/cdl/$JOB_NAME.cdl >> $JOB_HOME/cdl/${SOURCE_NAME} |
| fi |
| cat $TEST_DIR/libraries/cdl/*.cdl >> $JOB_HOME/cdl/libraries-merged.cdl |
| fi |
| |
| ## end V2LVS flow |
| |
| ################################################################################################################## |
| # Remove fill cells and tap cells from the source netlist before LVS |
| ################################################################################################################## |
| |
| # [ -f $JOB_HOME/cdl/$JOB_NAME.source.cdl ] && \ |
| # cp $JOB_HOME/cdl/$JOB_NAME.source.cdl $JOB_HOME/cdl/$JOB_NAME.v2lvs.unfiltered.cdl |
| # python3 $TEST_DIR/scripts/remove_spice_instances.py $JOB_HOME/cdl/$JOB_NAME.source.cdl \ |
| # sky130_fd_sc_hd__fill_1 \ |
| # sky130_fd_sc_hd__fill_2 \ |
| # sky130_fd_sc_hd__tapvpwrvgnd_1 \ |
| # > $JOB_HOME/logs/$JOB_NAME.remove_spice_instances.log 2>&1 |
| |
| # extra runset rules per JOB_HOME |
| mkdir -p $JOB_HOME/runset |
| touch $JOB_HOME/runset/custom |
| |
| ################################################################################################################## |
| # Run Calibre LVS/XRC |
| ################################################################################################################## |
| |
| ##calibre -hier -64 -hyper -turbo -hcell $TEST_DIR/runsets/hcells.sky130_fd_sc_hd.txt -spice $JOB_HOME/cdl/$JOB_NAME.extracted.cdl $TEST_DIR/runsets/local_xrc_rules.2 |
| calibre -lvs -hier -hcell $HCELLS -spice \ |
| $JOB_HOME/cdl/$LAYOUT_EXTRACTED $RUNSET \ |
| | tee $JOB_HOME/logs/lvs.log |
| calibre -xrc -phdb -hcell $HCELLS -rc \ |
| $RUNSET \ |
| | tee $JOB_HOME/logs/phdb.log |
| calibre -xrc -pdb -xcell $XCELLS -rc \ |
| $RUNSET \ |
| | tee $JOB_HOME/logs/pdb.log |
| calibre -xrc -fmt -fmt_info -fmt_warnings $RUNSET \ |
| | tee $JOB_HOME/logs/fmt.log |
| |
| sed 's#//#DOUBLE_BACKSLASH#g' -i $PEX_NETLIST_PATH |
| sed 's#DIVIDER /#DIVIDER DIVIDER_BACKSLASH#g' -i $PEX_NETLIST_PATH |
| sed 's#/#\\/#g' -i $PEX_NETLIST_PATH |
| sed 's#DOUBLE_BACKSLASH#//#g' -i $PEX_NETLIST_PATH |
| sed 's#DIVIDER_BACKSLASH#/#g' -i $PEX_NETLIST_PATH |
| |
| |
| |
| |
| # calibre -lvs -hier -spice $JOB_HOME/cdl/$JOB_NAME.extracted.cdl $TEST_DIR/runsets/local_xrc_rules.2 |
| # calibre -xrc -phdb -rc $TEST_DIR/runsets/local_xrc_rules.2 |
| # calibre -xrc -pdb -rc $TEST_DIR/runsets/local_xrc_rules.2 |
| # calibre -xrc -fmt $TEST_DIR/runsets/local_xrc_rules.2 |
| |
| # calibre -gui -lvs -runset $TEST_DIR/runsets/s8_lvs_runset -batch > $JOB_HOME/$JOB_NAME.lvs_runset.log 2>&1 |
| |
| |
| #calibre -xrc -phdb -hcell $JOB_HOME/hcells.txt $PDK_HOME/LVS/Calibre/extLvsRules_s8_5lm |
| #calibre -gui -pex -runset $TEST_DIR/runsets/s8_xRC_runset -batch > $JOB_HOME/$JOB_NAME.xRC_runset.log 2>&1 |
| #calibre -gui -lvs -runset $TEST_DIR/runsets/s8_lvs_runset -batch > $JOB_HOME/$JOB_NAME.lvs_runset.log 2>&1 |
| #calibre --help > $JOB_HOME/$JOB_NAME.calibre--help.txt 2>&1 |
| |
| ################################################################################################################## |
| # No-PEX extraction then using it as an LVS source to pass before running extraction |
| ################################################################################################################## |
| |
| # 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 |
| # |
| # calibre -spice $JOB_HOME/$JOB_NAME.extracted.cdlX 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 $JOB_HOME/$JOB_NAME.extracted.cdlX $JOB_HOME/extract/$JOB_NAME.extracted.cdlX |
| # cp spice_runset $JOB_HOME |
| |
| ################################################################################################################## |
| # Run Calibre DRC |
| ################################################################################################################## |
| |
| # 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 |
| |
| ################################################################################################################## |
| |
| 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 |
| |
| |
| |