added boom and torture | added csmith
This commit is contained in:
188
scripts/csmith/run-csmith.sh
Executable file
188
scripts/csmith/run-csmith.sh
Executable file
@@ -0,0 +1,188 @@
|
||||
# Script to run the csmith random test generator multiple times
|
||||
|
||||
TEST_NAME=test
|
||||
SIM=$1
|
||||
RUN_AMT=-1
|
||||
P_INST=1
|
||||
SEED=-1
|
||||
WDEBUG_EXT=false
|
||||
NDEBUG=false
|
||||
|
||||
# Make output directory
|
||||
OUTPUT_DIR=output
|
||||
SRC_DIR=sources
|
||||
mkdir -p output
|
||||
|
||||
usage(){
|
||||
echo "run-csmith.sh --sim SIM_BINARY [--run RUN_AMT] [--parallel PARALLEL_INSTANCES] [--seed SEED] [--withdebugext] [--nodebug]"
|
||||
echo " --sim -s SIM_BINARY is the simulator to test spike against"
|
||||
echo " --run -r RUN_AMT is the amount of times to run the csmith tests"
|
||||
echo " defaults to infinity"
|
||||
echo " --parallel -p PARALLEL_INSTANCES is the amount of instances to spawn in parallel"
|
||||
echo " defaults to one instance"
|
||||
echo " --seed -e SEED runs a single test with the seed specified"
|
||||
echo " ignores all other parameters"
|
||||
echo " --withdebugext -d run debug version of simulator (used for when"
|
||||
echo " main sim is not debug version)"
|
||||
echo " (just appends -debug to sim name)"
|
||||
echo " --nodebug -n just error when there is a sim mismatch (no vpd)"
|
||||
}
|
||||
|
||||
# Exit everything on one ctrl+c
|
||||
trap kill_group SIGINT
|
||||
kill_group(){
|
||||
echo ""
|
||||
echo "[ALL] Killing instances."
|
||||
kill 0
|
||||
}
|
||||
|
||||
# Run the csmith test once
|
||||
#
|
||||
# Args:
|
||||
# $1 instance that this test is running on
|
||||
# $2 seed to run the test with
|
||||
run_once () {
|
||||
BASE_NAME=$OUTPUT_DIR/$TEST_NAME-$1-$2
|
||||
|
||||
echo "[$1] Running csmith test with seed=$2"
|
||||
csmith --seed $2 > $BASE_NAME.c
|
||||
|
||||
# Build both a RISCV binary and normal binary
|
||||
|
||||
# Test x86-64 first
|
||||
gcc -I$RISCV/include/csmith-2.4.0 -w $BASE_NAME.c -o $BASE_NAME.bin
|
||||
timeout 1s ./$BASE_NAME.bin | awk '{print tolower($0)}' > $BASE_NAME.host.out
|
||||
RV=$?
|
||||
if [ $RV -ne 0 ]; then
|
||||
echo "[$1] x86-64 binary timed out. Discard and start over."
|
||||
rm $BASE_NAME.bin $BASE_NAME.host.out $BASE_NAME.c
|
||||
return 0
|
||||
fi
|
||||
|
||||
# Test RISCV spike version
|
||||
riscv64-unknown-elf-gcc -w -I./$SRC_DIR -DPREALLOCATE=1 -mcmodel=medany -static -std=gnu99 -O2 -ffast-math -fno-common -o $BASE_NAME.riscv $BASE_NAME.c $SRC_DIR/syscalls.c $SRC_DIR/crt.S -static -nostdlib -nostartfiles -lm -lgcc -T $SRC_DIR/link.ld -I$RISCV/include/csmith-2.4.0
|
||||
timeout --foreground 10s spike $BASE_NAME.riscv 1> $BASE_NAME.spike.out 2> $BASE_NAME.spike.log
|
||||
RV=$?
|
||||
if [ $RV -ne 0 ]; then
|
||||
echo "[$1] Spike timed out. Discard and start over."
|
||||
rm $BASE_NAME.bin $BASE_NAME.host.out $BASE_NAME.c $BASE_NAME.riscv $BASE_NAME.spike.out $BASE_NAME.spike.log
|
||||
return 0
|
||||
fi
|
||||
|
||||
# Compare x86-64 and Spike
|
||||
cmp -s $BASE_NAME.spike.out $BASE_NAME.host.out
|
||||
RV=$?
|
||||
if [ $RV -ne 0 ]; then
|
||||
echo "[$1] Spike produces wrong result compared to x86-64 binary. Discard and start over."
|
||||
rm $BASE_NAME.bin $BASE_NAME.host.out $BASE_NAME.c $BASE_NAME.riscv $BASE_NAME.spike.out $BASE_NAME.spike.log
|
||||
return 0
|
||||
fi
|
||||
|
||||
# Compare simulator output versus spike
|
||||
timeout 15m $SIM $BASE_NAME.riscv 1> $BASE_NAME.sim.out
|
||||
RV=$?
|
||||
if [ $RV == 124 ]; then
|
||||
echo "[$1] Simulator timed out. Discard and start over."
|
||||
rm $BASE_NAME.bin $BASE_NAME.host.out $BASE_NAME.c $BASE_NAME.riscv $BASE_NAME.spike.out $BASE_NAME.spike.log $BASE_NAME.sim.out
|
||||
return 0
|
||||
fi
|
||||
|
||||
cmp -s $BASE_NAME.sim.out $BASE_NAME.spike.out
|
||||
RV=$?
|
||||
if [ $RV -ne 0 ]; then
|
||||
echo "[$1] Simulator produced wrong result."
|
||||
if [ $NDEBUG == false ]; then
|
||||
if [ $WDEBUG_EXT == true ]; then
|
||||
${SIM}-debug $BASE_NAME.riscv +verbose +vcdplusfile=$BASE_NAME.vpd 1> $BASE_NAME.sim.out 2> $BASE_NAME.sim.log
|
||||
else
|
||||
$SIM $BASE_NAME.riscv +verbose +vcdplusfile=$BASE_NAME.vpd 1> $BASE_NAME.sim.out 2> $BASE_NAME.sim.log
|
||||
fi
|
||||
echo "[$1] Vpd of error file: $BASE_NAME.vpd"
|
||||
echo "[$1] Simulator output file: $BASE_NAME.sim.out"
|
||||
echo "[$1] Simulator log file: $BASE_NAME.sim.log"
|
||||
fi
|
||||
kill_group
|
||||
else
|
||||
echo "[$1] Simulator and spike agree."
|
||||
rm $BASE_NAME.bin $BASE_NAME.host.out $BASE_NAME.c $BASE_NAME.riscv $BASE_NAME.spike.out $BASE_NAME.spike.log $BASE_NAME.sim.out
|
||||
return 0
|
||||
fi
|
||||
}
|
||||
|
||||
# Run the test for a certain amount of times
|
||||
# Also setup a random seed
|
||||
#
|
||||
# Args:
|
||||
# $1 instance that this is running on
|
||||
run() {
|
||||
if [ $SEED == -1 ]; then
|
||||
if [ $RUN_AMT == -1 ]; then
|
||||
while true;
|
||||
do
|
||||
SEED=$(od -N 4 -t uL -An /dev/urandom | tr -d " ")
|
||||
run_once $1 $SEED
|
||||
done
|
||||
else
|
||||
for j in `seq 1 $RUN_AMT`;
|
||||
do
|
||||
SEED=$(od -N 4 -t uL -An /dev/urandom | tr -d " ")
|
||||
run_once $1 $SEED
|
||||
done
|
||||
fi
|
||||
else
|
||||
run_once $1 $SEED
|
||||
fi
|
||||
}
|
||||
|
||||
# Parse arguments
|
||||
while [ "$1" != "" ];
|
||||
do
|
||||
case $1 in
|
||||
-s | --sim ) shift
|
||||
SIM=$1
|
||||
;;
|
||||
-r | --run ) shift
|
||||
RUN_AMT=$1
|
||||
;;
|
||||
-p | --parallel ) shift
|
||||
P_INST=$1
|
||||
;;
|
||||
-e | --seed ) shift
|
||||
SEED=$1
|
||||
;;
|
||||
--withdebugext | -d ) shift
|
||||
WDEBUG_EXT=true
|
||||
;;
|
||||
--nodebug | -n ) shift
|
||||
NDEBUG=true
|
||||
;;
|
||||
-h | --help ) usage
|
||||
exit 0
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
# Start of script
|
||||
if [ -z "$SIM" ]; then
|
||||
echo "Forgot simulator binary."
|
||||
usage
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ $SEED == -1 ]; then
|
||||
if [ $RUN_AMT == -1 ]; then
|
||||
echo "Spawning $P_INST instance(s), running csmith infinite times"
|
||||
else
|
||||
echo "Spawning $P_INST instance(s), running csmith $RUN_AMT times"
|
||||
fi
|
||||
|
||||
for i in `seq 1 $P_INST`;
|
||||
do
|
||||
run $i &
|
||||
done
|
||||
wait
|
||||
else
|
||||
RUN_AMT=1
|
||||
run 1
|
||||
wait
|
||||
fi
|
||||
Reference in New Issue
Block a user