#!/bin/bash -f

export CASE_NAME=$1
export PDK_ROOT=`readlink -f $2`
export PDK=$3
export TESTCASES_DIR=`readlink -f $4`
export RUN_FOLDER=`readlink -f $5`
export COND=$6
export GND=$7
export LIB=$8
export TYPE=$9

if [ "$TYPE" == "SC" ]
then

    gds_file=${TESTCASES_DIR}/${LIB}/${CASE_NAME}.gds
    cdl_file=${TESTCASES_DIR}/${LIB}/${CASE_NAME}.cdl
    cp $gds_file $RUN_FOLDER
    cp $cdl_file $RUN_FOLDER
    gds_file=$RUN_FOLDER/${CASE_NAME}.gds
    cdl_file=$RUN_FOLDER/${CASE_NAME}.cdl
    sed -E 's/w=([0-9]\.[0-9]+) l=([0-9]\.[0-9]+)/w=$1U l=$2U/gm;t;d' $cdl_file
    sed -E 's/topography=normal //gm;t;d' $cdl_file

    if [ -f $gds_file ]
    then
        if [ -f $cdl_file ]
        then
            python3 $PDK_ROOT/$PDK/run_lvs.py --design=$gds_file --net=$cdl_file --output_netlist=$RUN_FOLDER/${CASE_NAME}_pass_ext.cir --report=$RUN_FOLDER/${CASE_NAME}_pass --lvs_sub=${GND-sky130_gnd} > $RUN_FOLDER/${CASE_NAME}_pass_lvs.log 2>&1
            return_code=$?
            if [ "$return_code" != "0" ]
            then
                echo "## Pass test case $CASE_NAME didn't pass as expected."
                echo "$CASE_NAME,No" >> $RUN_FOLDER/sc_test.csv
                if [ "$COND" == "GHA" ]
                then
                    exit 1
                fi
            else
                echo "## Pass test case $CASE_NAME passed successfully."
                echo "$CASE_NAME,Yes" >> $RUN_FOLDER/sc_test.csv
            fi
        else
            echo "## Can't find pass CDL for case: $cdl_file"
            exit 1
        fi
    else
        echo "## Can't find pass GDS for case: $gds_file"
        exit 1
    fi

else

    pass_gds=$TESTCASES_DIR/pass_cases/${CASE_NAME}.gds
    pass_cdl=$TESTCASES_DIR/pass_cases/${CASE_NAME}.cdl

    fail_dim_gds=$TESTCASES_DIR/fail_cases/${CASE_NAME}_dim_fail.gds
    fail_dim_cdl=$TESTCASES_DIR/fail_cases/${CASE_NAME}_dim_fail.cdl

    fail_lay_gds=$TESTCASES_DIR/fail_cases/${CASE_NAME}_lyr_fail.gds
    fail_lay_cdl=$TESTCASES_DIR/fail_cases/${CASE_NAME}_lyr_fail.cdl

    fail_net_gds=$TESTCASES_DIR/fail_cases/${CASE_NAME}_net_fail.gds
    fail_net_cdl=$TESTCASES_DIR/fail_cases/${CASE_NAME}_net_fail.cdl


    if [ -f $pass_gds ]
    then
        if [ -f $pass_cdl ]
        then
            python3 $PDK_ROOT/$PDK/run_lvs.py --design=$pass_gds --net=$pass_cdl --output_netlist=$RUN_FOLDER/${CASE_NAME}_pass_ext.cir --report=$RUN_FOLDER/${CASE_NAME}_pass > $RUN_FOLDER/${CASE_NAME}_pass_lvs.log 2>&1
            return_code=$?
            if [ "$return_code" != "0" ]
            then
                echo "## Pass test case $CASE_NAME didn't pass as expected."
                echo "$CASE_NAME,No" >> $RUN_FOLDER/pass_results.csv
                if [ "$COND" == "GHA" ]
                then
                    exit 1
                fi
            else
                echo "## Pass test case $CASE_NAME passed successfully."
                echo "$CASE_NAME,Yes" >> $RUN_FOLDER/pass_results.csv
            fi
        else
            echo "## Can't find pass CDL for case: $pass_cdl"
            exit 1
        fi
    else
        echo "## Can't find pass GDS for case: $pass_gds"
        exit 1
    fi


    if [ -f $fail_dim_gds ]
    then
        if [ -f $fail_dim_cdl ]
        then
            python3 $PDK_ROOT/$PDK/run_lvs.py --design=$fail_dim_gds --net=$fail_dim_cdl --output_netlist=$RUN_FOLDER/${CASE_NAME}_fail_dim_ext.cir --report=$RUN_FOLDER/${CASE_NAME}_fail_dim > $RUN_FOLDER/${CASE_NAME}_fail_dim_lvs.log 2>&1
            return_code=$?
            if [ "$return_code" != "1" ]
            then
                echo "## Fail dimension test case $CASE_NAME didn't fail as expected."
                echo "$CASE_NAME,No" >> $RUN_FOLDER/dim_fail_results.csv
                if [ "$COND" == "GHA" ]
                then
                    exit 1
                fi
            else
                echo "## Fail dimension test case $CASE_NAME failed as expected."
                echo "$CASE_NAME,Yes" >> $RUN_FOLDER/dim_fail_results.csv
            fi
        else
            echo "## Can't find fail dimension CDL for case: $fail_dim_cdl"
            if [ "$COND" == "GHA" ]
            then
                exit 1
            fi
        fi
    else
        echo "## Can't find fail dimension GDS for case: $fail_dim_gds"
        if [ "$COND" == "GHA" ]
        then
            exit 1
        fi
    fi

    if [ -f $fail_lay_gds ]
    then
        if [ -f $fail_lay_cdl ]
        then
            python3 $PDK_ROOT/$PDK/run_lvs.py --design=$fail_lay_gds --net=$fail_lay_cdl --output_netlist=$RUN_FOLDER/${CASE_NAME}_fail_lay_ext.cir --report=$RUN_FOLDER/${CASE_NAME}_fail_lay > $RUN_FOLDER/${CASE_NAME}_fail_lay_lvs.log 2>&1
            return_code=$?
            if [ "$return_code" != "1" ]
            then
                echo "## Fail layer test case $CASE_NAME didn't fail as expected."
                echo "$CASE_NAME,No" >> $RUN_FOLDER/lyr_fail_results.csv
                if [ "$COND" == "GHA" ]
                then
                    exit 1
                fi
            else
                echo "## Fail layer test case $CASE_NAME failed as expected."
                echo "$CASE_NAME,Yes" >> $RUN_FOLDER/lyr_fail_results.csv
            fi
        else
            echo "## Can't find fail layer for case: $fail_lay_cdl"
            if [ "$COND" == "GHA" ]
            then
                exit 1
            fi
        fi
    else
        echo "## Can't find fail layer GDS for case: $fail_lay_gds"
        if [ "$COND" == "GHA" ]
        then
            exit 1
        fi
    fi

    if [ -f $fail_net_gds ]
    then
        if [ -f $fail_net_cdl ]
        then
            python3 $PDK_ROOT/$PDK/run_lvs.py --design=$fail_net_gds --net=$fail_net_cdl --output_netlist=$RUN_FOLDER/${CASE_NAME}_fail_net_ext.cir --report=$RUN_FOLDER/${CASE_NAME}_fail_net > $RUN_FOLDER/${CASE_NAME}_fail_net_lvs.log 2>&1
            return_code=$?
            if [ "$return_code" != "1" ]
            then
                echo "## Fail netlist test case $CASE_NAME didn't fail as expected."
                echo "$CASE_NAME,No" >> $RUN_FOLDER/net_fail_results.csv
                if [ "$COND" == "GHA" ]
                then
                    exit 1
                fi
            else
                echo "## Fail netlist test case $CASE_NAME failed as expected."
                echo "$CASE_NAME,Yes" >> $RUN_FOLDER/net_fail_results.csv
            fi
        else
            echo "## Can't find fail netlist CDL for case: $fail_net_cdl"
            if [ "$COND" == "GHA" ]
            then
                exit 1
            fi
        fi
    else
        echo "## Can't find fail netlist GDS for case: $fail_net_gds"
        if [ "$COND" == "GHA" ]
        then
            exit 1
        fi
    fi
fi
