#!/bin/bash

# Copyright lowRISC contributors.
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
# SPDX-License-Identifier: Apache-2.0

# Script to run fpv (formal property verification) using Jasper Gold
#
# Usage: To run fpv on module foo, type
#   fpv foo
#
# Here are some examples:
#   fpv rv_plic_fpv
#   fpv gpio
#
# More options:
# -p:  provide core file path
# -gui: run JasperGold GUI
# -cov: run coverage
# -chk: run checks for assumptions: deadlock, conflict, live chks
# -t: choose which formal tool to use, default using jaspergold, also support
# vcf(VC Formal)
#
# Example:
#   fpv pinmux_fpv -p vip:pinmux_fpv -gui -cov -t jg
#
# Note that the module to be tested needs to have an _fpv testbench
# and a corresponding core file for this to work.

export FPV_TOP=$1
shift
gui=0
tool="jg"
flag="fileset_top"
export COV=0
export CHECK=0

while [ "$1" != "" ]; do
  case "$1" in
    "-p")
      shift
      CORE_PATH=$1
      ;;
    "-gui")
      gui=1
      echo "using jasper gold GUI"
      ;;
    "-cov")
      COV=1
      echo "enable FPV coverage"
      ;;
    "-chk")
      CHECK=1
      echo "enable assumption checks"
      ;;
    "-t")
      shift
      tool=$1
      echo "running in tool: $tool"
      ;;
    "-flag")
      shift
      flag=$1
      echo "flag is set to: $flag"
      ;;
  esac
  shift
done

echo "-------------------------------------------------------------------------"
echo "-- Generate file list using FuseSoC"
echo "-------------------------------------------------------------------------"
echo ""
echo "Top: $FPV_TOP"
echo ""

\rm -Rf build jgproject
# we just run the setup for the default target in order to generate the filelist
if [ "${CORE_PATH}" == "" ]; then
  if [[ $FPV_TOP == *"_fpv" ]]; then
    CORE_PATH="fpv:${FPV_TOP}"
  else
    CORE_PATH="dv:${FPV_TOP}_sva"
  fi
fi
echo "core_file path: lowrisc:${CORE_PATH}"

fusesoc --cores-root ../.. run --tool=icarus --target=formal --flag=${flag} --setup "lowrisc:${CORE_PATH}"

echo "-------------------------------------------------------------------------"
echo "-- Run JasperGold"
echo "-------------------------------------------------------------------------"

cd build/*${FPV_TOP}*/formal-icarus

if [ "${tool}" == "jg" ]; then
  if [ "${gui}" == "1" ]; then
    jg ../../../tools/jaspergold/fpv.tcl \
       -proj ../../../jgproject \
       -allow_unsupported_OS \
       | tee ../../../fpv.log
  else
    jg -batch \
      ../../../tools/jaspergold/fpv.tcl \
      -proj ../../../jgproject \
      -allow_unsupported_OS \
      -command exit \
      | tee ../../../fpv.log
  fi
elif [ "${tool}" == "vcf" ]; then
  vcf -f fpv_vcf.tcl
fi
cd -

echo "-------------------------------------------------------------------------"
echo "-- Done"
echo "-------------------------------------------------------------------------"
