#!/bin/sh

#
#        Example Script to run tests and check results.
#
#        This is an example script for running QA tests on a
#        model and then checking the simulated results against
#        reference results. A separate target is defined for each
#        variant of the model. The program runQaTests.pl runs the
#        tests, and that program expects a perl module SIMULATOR.pm
#        to be provided for each simulator that is tested.
#        Examples of these are provided.
#

qaSpecFile="qaSpec"
qaResultsDirectory="results"
testProgramName="$(dirname $0)/runQaTests.pl"
if [ -z "$testProgramFlags" ] ; then
    testProgramFlags="-nw"
fi

#testProgramFlags="-d -V"


help() {
    cat <<-EOF
        Valid targets are:

        all                run tests and compare results for all simulators

        ngspice            run tests and compare results ngspice

        hspice             run tests and compare results hspice

        clean              remove all previously generated simulation results

        NOTE: if test results exist they are not resimulated
        NOTE: to force resimulation run "make clean" first
EOF
}


run_test() {

    simname="$1"

    for i in $(${testProgramName} ${testProgramFlags} -s ${simname} --tuple) ; do
        case "${i%%=*}" in
            platform)  localPlatform="${i#*=}";;
            version)   localVersion="${i#*=}";;
            vaVersion) localVaVersion="${i#*=}";;
        esac
    done

    echo ""
    echo "******"
    echo "****** ${qaSpecFile} tests for ${simname}"
    echo "****** (for version ${localVersion} on platform ${localPlatform})"
    echo "******"

    for test in `${testProgramName} -lt -s ${simname} ${qaSpecFile}` ; do

        echo ""
        echo "****** Checking test (${simname}): ${test}"

        for variant in `${testProgramName} -lv -s ${simname} ${qaSpecFile}` ; do
            ${testProgramName} \
                ${testProgramFlags} \
                -s ${simname} \
                -r -t ${test} \
                -var ${variant} \
                --version=${localVersion} \
                --vaVersion=${localVaVersion} \
                --platform=${platform} \
                --results=${qaResultsDirectory} \
                ${qaSpecFile}
        done
    done

    for version in `ls -C1 ${qaResultsDirectory}/${simname}` ; do
        for platform in `ls -C1 ${qaResultsDirectory}/${simname}/${version}` ; do

            if [ "${version}" = "${localVersion}" -a "${platform}" = "${localPlatform}" ]
            then
                break
            fi

            echo ""
            echo "******"
            echo "****** Comparing previously run ${qaSpecFile} tests for ${simname}"
            echo "****** (for version ${version} on platform ${platform})"
            echo "******"

            for test in `${testProgramName} -lt -s ${simname} ${qaSpecFile}` ; do

                echo ""
                echo "****** Checking test (${simname}): ${test}"

                for variant in `${testProgramName} -lv -s ${simname} ${qaSpecFile}` ; do
                    ${testProgramName} \
                        -c ${version} ${platform} \
                        -s ${simname} \
                        -t ${test} \
                        -var ${variant} \
                        --version=${localVersion} \
                        --vaVersion=${localVaVersion} \
                        --platform=${platform} \
                        --results=${qaResultsDirectory} \
                        ${qaSpecFile}
                done
            done
        done
    done
}


#####
##### tests
#####

ngspice() {
    run_test ngspice
}

hspice() {
    run_test hspice
}


#####
##### clean
#####

clean() {
    rm -rf ${qaResultsDirectory}/ngspice ngspiceCkt*
    rm -rf ${qaResultsDirectory}/hspice hspiceCkt*
}

clean_ngspice() {
    rm -rf ${qaResultsDirectory}/ngspice ngspiceCkt*
}

clean_hspice() {
    rm -rf ${qaResultsDirectory}/hspice hspiceCkt*
}


all() {
    ngspice hspice
}


while test $# -gt 0; do
  case "$1" in
      --srcdir=* | --executable=*)
          testProgramFlags="$testProgramFlags $1"
          shift
          ;;
      --results)
          qaResultsDirectory="$2"
          shift ; shift
          ;;
      -qa)
          qaSpecFile="$2"
          shift ; shift
          ;;
      *)
          break
          ;;
  esac
done

for arg in $@ ; do
    case "$arg" in
        all | clean | clean_ngspice | ngspice | clean_hspice | hspice)
            "$arg"
            ;;
        *)
            help
            ;;
    esac
done
