#!/bin/sh

# This runs ebmc in BMC mode on the HWMCC08 benchmarks.

if [ ! -e aiger/. ] ; then
  echo Downloading and building the AIGER tools
  git clone https://github.com/arminbiere/aiger
  (cd aiger ; ./configure.sh ; make aigtosmv )
fi

if [ ! -e hwmcc08/. ] ; then
  echo Downloading HWMCC08 benchmark archive
  wget -q http://fmv.jku.at/hwmcc/hwmcc08public.tar.bz2
  bunzip2 hwmcc08public.tar.bz2
  tar xf hwmcc08public.tar
  rm hwmcc08public.tar
fi

if [ ! -e hwmcc08public-smv/. ] ; then
  echo Converting AIGER to SMV
  mkdir hwmcc08public-smv
  (cd hwmcc08; for FILE in *.aig ; do
    SMV=`echo "$FILE" | sed s/.aig/.smv/`
    ../aiger/aigtosmv -b "$FILE" "../hwmcc08public-smv/$SMV"
  done)
fi

# expected answers
# from the abc result column in https://fmv.jku.at/hwmcc08/hwmcc08results.csv

if [ ! -e hwmcc08results.csv ] ; then
  echo Downloading HWMCC08 result table
  wget -q https://fmv.jku.at/hwmcc08/hwmcc08results.csv
fi

echo Running ebmc on the HWMCC08 benchmarks

(# ignore first three lines of hwmcc08results.csv
read -r line
read -r line
read -r line
# now process the lines
while read -r line; do
  BENCHMARK=` echo "$line" | cut -d ',' -f 1 | tr -d '"'`
  if [ ! -e "hwmcc08public-smv/${BENCHMARK}.smv" ] ; then
    echo benchmark $BENCHMARK not found
  else
    RESULT=` echo "$line" | cut -d ',' -f 3 | tr -d '"'`
    if [ "$RESULT" = "uns" ] ; then
      ebmc --bound 2 "hwmcc08public-smv/${BENCHMARK}.smv" > ebmc.out
      if [ $? = 10 ] ; then
        echo $BENCHMARK: got unexpected counterexample
        exit 1
      else
        echo $BENCHMARK: ok "(UNSAT)"
      fi
    fi
    if [ "$RESULT" = "sat" ] ; then
      LENGTH=` echo "$line" | cut -d ',' -f 2`
      if [ "$LENGTH" = "\"*\"" ] ; then
        echo $BENCHMARK: no counterexample length
      else
        ebmc --bound $LENGTH "hwmcc08public-smv/${BENCHMARK}.smv" > ebmc.out
        if [ $? = 10 ] ; then
          echo $BENCHMARK: ok "(SAT $LENGTH)"
        else
          echo $BENCHMARK: failed to find counterexample at bound $LENGTH
          exit 1
        fi
      fi
    fi
  fi
done ) < hwmcc08results.csv
