blob: c755c8f8594a165b505df0c65e7c383bd423ad5e [file] [log] [blame]
#!/bin/bash
#1
trap ctrl_c INT SIGINT SIGTERM
SHELL=/bin/bash
QUIT=0
INPUT=$@
BASE_DIR="regression_test/benchmark"
TEST_DIR_LIST=$(find regression_test/benchmark -mindepth 1 -maxdepth 1 -type d | cut -d '/' -f 3 | tr '\n' ' ')
#include more generic names here for better vector generation
HOLD_LOW_RESET="-L reset rst"
HOLD_HIGH_WE="-H we"
HOLD_PARAM="${HOLD_LOW_RESET} ${HOLD_HIGH_WE}"
#if you want to pass in a new adder definition file
ADDER_DEFINITION="--adder_type default"
#if you want to change the default number of vectors to generate
GENERATE_VECTOR_COUNT="-g 10"
#if you want to change the default number of vectors to generate
REGEN_VECTOR_CMD="--best_coverage -g 100"
DEFAULT_ARCH="../libs/libarchfpga/arch/sample_arch.xml"
MEM_ARCH="../vtr_flow/arch/timing/k6_N10_mem32K_40nm.xml"
SMALL_ARCH_SWEEP="\
../vtr_flow/arch/timing/k6_N10_mem32K_40nm.xml \
../libs/libarchfpga/arch/sample_arch.xml \
../vtr_flow/arch/timing/k6_frac_N10_mem32K_40nm.xml"
FULL_ARCH_SWEEP=$(find ../vtr_flow/arch/timing -maxdepth 1 | grep xml)
DEFAULT_CMD_PARAM="${ADDER_DEFINITION}"
EXEC="./wrapper_odin.sh"
FAILURE=0
new_run=regression_test/run001
NB_OF_PROC=1
REGENERATE_OUTPUT=0
REGENERATE_BENCH=0
TEST_TYPE=""
TIME_LIMIT="1200s"
USING_LOW_RESSOURCE=""
function help() {
printf "
Called program with $INPUT
Usage: ./verify_odin
--test [test name] * test name is one of ( ${TEST_DIR_LIST}full_suite vtr_basic vtr_strong pre_commit )
--generate_bench * generate input and output vector for test
--generate_output * generate output vector for test given its input vector
--clean * clean temporary directory
--nb_of_process [n] * n = nb of process requested to be used
--limit_ressource * force higher nice value and set hard limit for hardware memory to force swap more ***not always respected by system
"
}
function config_help() {
printf "
config.txt expects a single line of argument wich can be one of:
--custom_args_file
--arch_list [list_name]*
*memories use VTR k6_N10_mem32k architecture
*small_sweep use a small set of timing architecture
*full_sweep sweep the whole vtr directory *** WILL FAIL ***
*default use the sample_arch.xml
--simulate request simulation to be ran
--no_threading do not use multithreading for this test ** useful if you have large test **
"
}
function get_current_time() {
echo $(date +%s%3N)
}
#1 start #2 end
function print_time_since() {
BEGIN=$1
NOW=`get_current_time`
TIME_TO_RUN=$(( ${NOW} - ${BEGIN} ))
Mili=$(( ${TIME_TO_RUN} %1000 ))
Sec=$(( ( ${TIME_TO_RUN} /1000 ) %60 ))
Min=$(( ( ( ${TIME_TO_RUN} /1000 ) /60 ) %60 ))
Hour=$(( ( ( ${TIME_TO_RUN} /1000 ) /60 ) /60 ))
echo "ran test in: $Hour:$Min:$Sec.$Mili"
}
function init_temp() {
last_run=$(find regression_test/run* -maxdepth 0 -type d 2>/dev/null | tail -1 )
if [ "_${last_run}" != "_" ]
then
last_run_id=${last_run##regression_test/run}
n=$(echo $last_run_id | awk '{print $0 + 1}')
new_run=regression_test/run$(printf "%03d" $n)
fi
echo "running benchmark @${new_run}"
mkdir -p ${new_run}
}
function cleanup_temp() {
for runs in regression_test/run*
do
rm -Rf ${runs}
done
}
function mv_failed() {
failed_dir=$1
log_file="${failed_dir}.log"
if [ -e ${log_file} ]
then
echo "Failed benchmark have been move to ${failed_dir}"
for failed_benchmark in $(cat ${log_file})
do
parent_dir=$(dirname ${failed_dir}/${failed_benchmark})
mkdir -p ${parent_dir}
mv ${new_run}/${failed_benchmark} ${parent_dir}
FAILURE=$(( ${FAILURE} + 1 ))
done
cat ${log_file} >> ${new_run}/test_failures.log
rm -f ${log_file}
fi
}
function exit_program() {
if [ "_${FAILURE}" != "_0" ]
then
echo "Failed ${FAILURE} benchmarks"
echo "View Failure log in ${new_run}/test_failures.log"
else
echo "no run failure!"
fi
exit ${FAILURE}
}
function ctrl_c() {
QUIT=1
while [ "${QUIT}" != "0" ]
do
echo "** REGRESSION TEST EXITED FORCEFULLY **"
jobs -p | xargs kill &> /dev/null
pkill odin_II &> /dev/null
pkill ${EXEC} &> /dev/null
#should be dead by now
exit 120
done
}
function sim() {
####################################
# parse the function commands passed
with_custom_args="0"
arch_list="no_arch"
with_sim="0"
threads=${NB_OF_PROC}
if [ ! -e "$1" ]; then
echo "invalid benchmark directory passed to simulation function $1"
ctrl_c
fi
benchmark_dir="$1"
shift
while [[ "$#" > 0 ]]
do
case $1 in
--custom_args_file)
with_custom_args=1
;;
--arch_list)
case $2 in
memories)
arch_list="${MEM_ARCH}"
;;
small_sweep)
arch_list="${SMALL_ARCH_SWEEP}"
;;
full_sweep)
arch_list="${FULL_ARCH_SWEEP}"
;;
default)
arch_list="${DEFAULT_ARCH}"
;;
*)
;;
esac
shift
;;
--simulate)
with_sim=1
;;
--no_threading)
echo "This test will not be multithreaded"
threads="1"
;;
*)
echo "Unknown internal parameter passed: $1"
config_help
ctrl_c
;;
esac
shift
done
###########################################
# run custom benchmark
bench_type=${benchmark_dir##*/}
echo " BENCHMARK IS: ${bench_type}"
if [ "_${with_custom_args}" == "_1" ]; then
global_odin_failure="${new_run}/odin_failures"
for dir in ${benchmark_dir}/*
do
if [ -e ${dir}/odin.args ]; then
test_name=${dir##*/}
TEST_FULL_REF="${bench_type}/${test_name}"
DIR="${new_run}/${bench_type}/$test_name"
blif_file="${DIR}/odin.blif"
#build commands
mkdir -p $DIR
wrapper_odin_command="./wrapper_odin.sh
--log_file ${DIR}/odin.log
--test_name ${TEST_FULL_REF}
--failure_log ${global_odin_failure}.log
--time_limit ${TIME_LIMIT}
${USING_LOW_RESSOURCE}
${RUN_WITH_VALGRIND}"
odin_command="${DEFAULT_CMD_PARAM}
$(cat ${dir}/odin.args | tr '\n' ' ')
-o ${blif_file}
-sim_dir ${DIR}"
echo $(echo "${wrapper_odin_command} ${odin_command}" | tr '\n' ' ' | tr -s ' ' ) > ${DIR}/odin_param
fi
done
#run the custon command
echo " ========= Synthesizing Circuits"
find ${new_run}/${bench_type}/ -name odin_param | xargs -n1 -P$threads -I test_cmd ${SHELL} -c '$(cat test_cmd)'
mv_failed ${global_odin_failure}
############################################
# run benchmarks
else
global_synthesis_failure="${new_run}/synthesis_failures"
global_simulation_failure="${new_run}/simulation_failures"
for benchmark in ${benchmark_dir}/*.v
do
basename=${benchmark%.v}
test_name=${basename##*/}
input_vector_file="${basename}_input"
output_vector_file="${basename}_output"
for arches in ${arch_list}
do
arch_cmd=""
if [ -e ${arches} ]
then
arch_cmd="-a ${arches}"
fi
arch_basename=${arches%.xml}
arch_name=${arch_basename##*/}
TEST_FULL_REF="${bench_type}/${test_name}/${arch_name}"
DIR="${new_run}/${TEST_FULL_REF}"
blif_file="${DIR}/odin.blif"
#build commands
mkdir -p $DIR
wrapper_synthesis_command="./wrapper_odin.sh
--log_file ${DIR}/synthesis.log
--test_name ${TEST_FULL_REF}
--failure_log ${global_synthesis_failure}.log
--time_limit ${TIME_LIMIT}
${USING_LOW_RESSOURCE}
${RUN_WITH_VALGRIND}"
synthesis_command="${DEFAULT_CMD_PARAM}
${arch_cmd}
-V ${benchmark}
-o ${blif_file}
-sim_dir ${DIR}"
echo $(echo "${wrapper_synthesis_command} ${synthesis_command}" | tr '\n' ' ' | tr -s ' ') > ${DIR}/cmd_param
if [ "_$with_sim" == "_1" ] || [ -e ${input_vector_file} ]
then
#force trigger simulation if input file exist
with_sim="1"
wrapper_simulation_command="./wrapper_odin.sh
--log_file ${DIR}/simulation.log
--test_name ${TEST_FULL_REF}
--failure_log ${global_simulation_failure}.log
--time_limit ${TIME_LIMIT}
${USING_LOW_RESSOURCE}
${RUN_WITH_VALGRIND}"
simulation_command="${DEFAULT_CMD_PARAM}
${arch_cmd}
-b ${blif_file}
-sim_dir ${DIR}
${HOLD_PARAM}"
if [ "_$REGENERATE_BENCH" == "_1" ]; then
simulation_command="${simulation_command} ${REGEN_VECTOR_CMD}"
elif [ -e ${input_vector_file} ]; then
simulation_command="${simulation_command} -t ${input_vector_file}"
if [ "_$REGENERATE_OUTPUT" != "_1" ] && [ -e ${output_vector_file} ]; then
simulation_command="${simulation_command} -T ${output_vector_file}"
fi
else
simulation_command="${simulation_command} ${GENERATE_VECTOR_COUNT}"
fi
echo $(echo "${wrapper_simulation_command} ${simulation_command}" | tr '\n' ' ' | tr -s ' ') > ${DIR}/sim_param
fi
done
done
#synthesize the circuits
echo " ========= Synthesizing Circuits"
find ${new_run}/${bench_type}/ -name cmd_param | xargs -n1 -P$threads -I test_cmd ${SHELL} -c '$(cat test_cmd)'
mv_failed ${global_synthesis_failure}
if [ "_$with_sim" == "_1" ]
then
#run the simulation
echo " ========= Simulating Circuits"
find ${new_run}/${bench_type}/ -name sim_param | xargs -n1 -P$threads -I sim_cmd ${SHELL} -c '$(cat sim_cmd)'
mv_failed ${global_simulation_failure}
fi
fi
}
function parse_args() {
while [[ "$#" > 0 ]]
do
case $1 in
-h|--help)
help
exit_program
;;
--generate_output)
if [ $REGENERATE_BENCH != "0" ] || [ $REGENERATE_OUTPUT != "0" ]
then
echo "can only specify one of --generate_output or --generate_bench"
help
ctrl_c
fi
REGENERATE_OUTPUT=1
echo "regenerating output vector for test given predefined input"
;;
--generate_bench)
if [ $REGENERATE_BENCH != "0" ] || [ $REGENERATE_OUTPUT != "0" ]
then
echo "can only specify one of --generate_output or --generate_bench"
help
ctrl_c
fi
REGENERATE_BENCH=1
echo "regenerating input and output vector for test"
;;
--limit_ressource)
USING_LOW_RESSOURCE="--limit_ressource"
echo "limiting ressources for benchmark, this can help with small hardware"
;;
--clean)
cleanup_temp
;;
--nb_of_process)
if [ $NB_OF_PROC != "1" ]
then
echo "can only specify the number of processes once"
help
ctrl_c
fi
if [[ "$2" -gt "0" ]]
then
NB_OF_PROC=$2
echo "Running benchmark on $NB_OF_PROC processes"
fi
shift
;;
--valgrind)
RUN_WITH_VALGRIND="--valgrind"
;;
--test)
if [ "_$TEST_TYPE" != "_" ]
then
echo "can only specify one test for this script"
help
ctrl_c
fi
TEST_TYPE=$2
shift
;;
*)
echo "Unknown parameter passed: $1"
help
ctrl_c
;;
esac
shift
done
}
RUN_LIST=(
"operators"
"arch"
"other"
"micro"
"syntax"
"full"
"large"
)
function run_all() {
for test_dir in ${RUN_LIST[@]}; do
sim ${BASE_DIR}/${test_dir} $(cat ${BASE_DIR}/${test_dir}/config.txt)
done
}
#########################################################
# START HERE
START=`get_current_time`
parse_args $INPUT
if [ "_${TEST_TYPE}" == "_" ]; then
echo "No input test!"
help
print_time_since $START
exit_program
fi
echo "Benchmark is: $TEST_TYPE"
init_temp
case $TEST_TYPE in
"full_suite")
run_all
;;
"vtr_basic")
cd ..
/usr/bin/perl run_reg_test.pl -j $NB_OF_PROC vtr_reg_basic
cd ODIN_II
;;
"vtr_strong")
cd ..
/usr/bin/perl run_reg_test.pl -j $NB_OF_PROC vtr_reg_strong
cd ODIN_II
;;
"pre_commit")
run_all
cd ..
/usr/bin/perl run_reg_test.pl -j $NB_OF_PROC vtr_reg_basic
/usr/bin/perl run_reg_test.pl -j $NB_OF_PROC vtr_reg_strong
cd ODIN_II
;;
*)
if [ ! -e ${BASE_DIR}/${TEST_TYPE} ]; then
echo "${BASE_DIR}/${TEST_TYPE} Not Found! exiting."
config_help
ctrl_c
fi
if [ ! -e ${BASE_DIR}/${TEST_TYPE}/config.txt ]; then
echo "no config file found in the directory."
echo "please make sure a config.txt exist"
config_help
ctrl_c
fi
sim ${BASE_DIR}/${TEST_TYPE} $(cat ${BASE_DIR}/${TEST_TYPE}/config.txt)
;;
esac
print_time_since $START
exit_program
### end here