#!/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_HOME="/data/pdks/skywater/s8/V1.3.0"

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/
if [ ! -d "$JOB_HOME" ]; then
	echo "$JOB_HOME doesn't exist?"
	exit 1
fi

# drcmr runset file uses export PDK_HOME2 for local (to this repo) rules-file:
# $PDK_HOME2/DRC/Calibre/s8_drcRules_MR (aka $TEST_DIR/pdk/skywater/s8/V1.3.0-mr/DRC/Calibre/s8_drcRules_MR)
export PDK_HOME2="$TEST_DIR/pdk/skywater/s8/V1.3.0-mr"

for GDS_FILE in $JOB_HOME/*.gds{,.gz,.xz}; do
	if [ ! -e "$GDS_FILE" ]; then
		continue # above brace-expansion keeps non-existent star forms: '.../*.gds.gz'
	fi

	# check for ambiguity(error); and optionally decompress.
	# Keep source & decompress to a .gds in parallel; and afterwards delete .gds.
	# This due to suspicion TEST_DIR or JOB_HOME elsewhere/later subject to a 'git add --all',
	# which would commit (intended temporary) uncompressed files. Better would be decompress
	# to a scratch-dir that is git-ignored or outside of TEST_DIR; but without visibility
	# into rest of system not clear if works to restructure use of (exports)JOB_HOME,JOB_NAME.
	GDS_BASE=${GDS_FILE%.xz}
	GDS_BASE=${GDS_BASE%.gz}
	GDS_FILEX=${GDS_BASE}.xz
	GDS_FILEG=${GDS_BASE}.gz
	GDS_DEL=""
	nbr=0
	[ -e "$GDS_BASE"  ] && (( nbr++ ))
	[ -e "$GDS_FILEX" ] && (( nbr++ ))
	[ -e "$GDS_FILEG" ] && (( nbr++ ))
	if [[ $nbr != 1 ]]; then
		echo "$GDS_FILE ambiguous, $nbr variants"
		continue
	fi

	if [ -e "$GDS_FILEX" ]; then
		unxz -c <"$GDS_FILE" >"$GDS_BASE"
		stat=$?
		if [[ "$stat" != 0 ]]; then
		    echo "Failed($stat) to: unxz --force $GDS_FILE"
		    continue
		fi
		echo "completed: unxz --force $GDS_FILE"
		GDS_FILE="$GDS_BASE"
		GDS_DEL="$GDS_BASE"
	fi
	if [ -e "$GDS_FILEG" ]; then
		gunzip -c <"$GDS_FILE" >"$GDS_BASE"
		stat=$?
		if [[ "$stat" != 0 ]]; then
		    echo "Failed($stat) to: gunzip --force $GDS_FILE"
		    continue
		fi
		echo "completed: gunzip --force $GDS_FILE"
		GDS_FILE="$GDS_BASE"
		GDS_DEL="$GDS_BASE"
	fi

	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/V1.3.0
# temp. disable all but the drcMR deck:
#	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 -lvs -runset $TEST_DIR/runsets/s8_lvs_runset     -batch > $JOB_HOME/$JOB_NAME.lvs_runset.log     2>&1
#	calibre -gui -pex -runset $TEST_DIR/runsets/s8_xRC_runset     -batch > $JOB_HOME/$JOB_NAME.xRC_runset.log     2>&1
	# drcmr runset file uses export PDK_HOME2 for local rules-file:
	# $PDK_HOME2/DRC/Calibre/s8_drcRules_MR (aka $TEST_DIR/pdk/skywater/s8/V1.3.0-mr/DRC/Calibre/s8_drcRules_MR)
	calibre -gui -drc -runset $TEST_DIR/runsets/s8_drcmr_runset   -batch > $JOB_HOME/$JOB_NAME.drcmr_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.../' \{\} \+

	if [ -n       "$GDS_DEL" ]; then
		rm -f "$GDS_DEL"
		echo "completed: rm -f $GDS_DEL"
	fi

done
exit 0
