csci2021/ArchLab/archlab-handout/sim/pipe/correctness.pl
Michael Zhang 1fa36db752
f
2018-01-29 17:45:27 -06:00

139 lines
3.1 KiB
Perl
Executable file

#!/usr/bin/perl
#!/usr/local/bin/perl
#
# correctness.pl - Test ncopy assembly code for correctness
#
use Getopt::Std;
#
# Configuration
#
$blocklen = 64;
$over = 3;
$yas = "../misc/yas";
$yis = "../misc/yis";
$pipe = "./psim";
$gendriver = "./gen-driver.pl";
$fname = "cdriver";
$verbose = 1;
# Maximum allowable code length
$bytelim = 1000;
#
# usage - Print the help message and terminate
#
sub usage {
print STDERR "Usage: $0 [-hqp] [-n N] -f FILE\n";
print STDERR " -h Print help message\n";
print STDERR " -q Quiet mode (default verbose)\n";
print STDERR " -p Run program on pipeline simulator (default ISA sim)\n";
print STDERR " -n N Set max number of elements up to 64 (default $blocklen)\n";
print STDERR " -f FILE Input .ys file is FILE\n";
print STDERR " -b blim set byte limit for function\n";
die "\n";
}
getopts('hqpn:f:b:');
if ($opt_h) {
usage();
}
if ($opt_q) {
$verbose = 0;
}
if ($opt_b) {
$bytelim = $opt_b;
}
$usepipe = 0;
if ($opt_p) {
$usepipe = 1;
print "Simulating with pipeline simulator psim\n";
} else {
print "Simulating with instruction set simulator yis\n";
}
if ($opt_n) {
$blocklen = $opt_n;
if ($blocklen < 0) {
print STDERR "n must be >= 0\n";
die "\n";
}
}
# Filename is required
if (!$opt_f) {
$ncopy = "ncopy";
} else {
$ncopy = $opt_f;
# Strip off .ys
$ncopy =~ s/\.ys//;
}
if ($verbose) {
print "\t$ncopy\n";
}
$goodcnt = 0;
for ($i = 0; $i <= $blocklen+$over; $i++) {
$len = $i;
if ($i > $blocklen) {
# Try some larger values
$len = $blocklen * ($i - $blocklen + 1);
}
!(system "$gendriver -rc -n $len -f $ncopy.ys -b $bytelim > $fname$len.ys") ||
die "Couldn't generate driver file $fname$len.ys\n";
!(system "$yas $fname$len.ys") ||
die "Couldn't assemble file $fname$len.ys\n";
if ($usepipe) {
!(system "$pipe -v 1 $fname$len.yo > $fname$len.pipe") ||
die "Couldn't simulate file $fname$len.yo with pipeline simulator\n";
$stat = `grep "rax:" $fname$len.pipe`;
!(system "rm $fname$len.ys $fname$len.yo $fname$len.pipe") ||
die "Couldn't remove files $fname$len.ys and/or $fname$len.yo and/or $fname$len.pipe\n";
chomp $stat;
} else {
!(system "$yis $fname$len.yo > $fname$len.yis") ||
die "Couldn't simulate file $fname$len.yo with instruction set simulator\n";
$stat = `grep rax $fname$len.yis`;
!(system "rm $fname$len.ys $fname$len.yo $fname$len.yis") ||
die "Couldn't remove files $fname$len.ys and/or $fname$len.yo and/or $fname$len.yis\n";
chomp $stat;
}
$result = "failed";
if ($stat =~ "zzzz") {
$result = "Couldn't run checking code";
}
if ($stat =~ "aaaa") {
$result = "OK";
$goodcnt ++;
}
if ($stat =~ "bbbb") {
$result = "Bad count";
}
if ($stat =~ "cccc") {
$result = "Program too long";
printf "%d\t%s\n", $len, $result;
exit(0);
}
if ($stat =~ "dddd") {
$result = "Incorrect copying";
}
if ($stat =~ "eeee") {
$result = "Corruption before or after destination";
}
if ($verbose) {
printf "%d\t%s\n", $len, $result;
}
}
$bp1 = $blocklen+$over+1;
printf "$goodcnt/$bp1 pass correctness test\n";