blob: 89e7b96263b3f605725d9e4b6d5180adfbb09fd7 [file] [log] [blame] [edit]
#!/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