mirror of
https://github.com/steveicarus/iverilog.git
synced 2026-09-07 11:51:38 +02:00
By adding ivtest to the iverilog source tree, it is easier to keep the regression test synchronized with the source that is being tested. This should be especially helpful for PRs that add a new feature, and have a matching ivtest PR with the regression test for that feature.
238 lines
6.1 KiB
Perl
238 lines
6.1 KiB
Perl
#!/usr/bin/env perl -s
|
|
#
|
|
# Copyright (c) 1999 Guy Hutchison ([email protected])
|
|
#
|
|
# This source code is free software; you can redistribute it
|
|
# and/or modify it in source code form under the terms of the GNU
|
|
# General Public License as published by the Free Software
|
|
# Foundation; either version 2 of the License, or (at your option)
|
|
# any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software
|
|
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
|
|
|
$total_count = 0;
|
|
|
|
$num_opts = $#ARGV ;
|
|
|
|
if($num_opts ne -1) {
|
|
# Got here cuz there is a command line option
|
|
$regress_fn = $ARGV[0];
|
|
if(!( -e "$regress_fn")) {
|
|
print("Error - Command line option file $num_opts doesn't exist.\n");
|
|
exit(1);
|
|
}
|
|
} else {
|
|
$regress_fn = "./elist";
|
|
}
|
|
|
|
|
|
$logdir = "errlog";
|
|
$bindir = "bin"; # not currently used
|
|
$report_fn = "./err_regress.txt";
|
|
|
|
$comp_name = "IVL" ; # Change the name of the compiler in use here.
|
|
# this may change to a command line option after
|
|
# I get things debugged!
|
|
|
|
# Debug variables
|
|
$dbg1 = 0;
|
|
$dbg2 = 0;
|
|
|
|
# Main script
|
|
|
|
print ("Reading/parsing test list\n");
|
|
&read_regression_list;
|
|
&execute_regression;
|
|
print ("Checking logfiles\n");
|
|
&check_results;
|
|
print("Testing $testname ********");
|
|
|
|
#
|
|
# parses the regression list file
|
|
#
|
|
# First line
|
|
# splits the data into a list of names (@testlist), and a
|
|
# number of hashes, indexed by name of test. Hashes are
|
|
# (from left-to-right in regression file):
|
|
#
|
|
# %testtype type of test. compile = compile only
|
|
# normal = compile & run, expect standard
|
|
# PASSED/FAILED message at EOT.
|
|
# %testpath path to test, from root of test directory. No
|
|
# trailing slash on test path.
|
|
#
|
|
# %testmod = main module declaration (optional)
|
|
#
|
|
# Second line
|
|
#
|
|
# The error you expect to find.
|
|
|
|
sub read_regression_list {
|
|
open (REGRESS_LIST, "<$regress_fn");
|
|
local ($found, $testname);
|
|
|
|
while (<REGRESS_LIST>) { # read first line
|
|
chop;
|
|
if (!/^#/) {
|
|
# strip out any comments later in the file
|
|
s/#.*//g;
|
|
@found = split;
|
|
$compare_line = <REGRESS_LIST>; # Read 2nd line
|
|
chop($compare_line);
|
|
|
|
# Now spread things out a bit
|
|
$testname = $found[0];
|
|
$testpath{$testname} = $found[1];
|
|
$testmod{$testname} = $found[2];
|
|
$compare{$testname} = $compare_line;
|
|
push (@testlist, $testname);
|
|
if($dbg1 == 1) {
|
|
print $testname,"-",$testpath{$testname},"-",
|
|
$testmod{$testname},"=",$compare{$testname},"\n";
|
|
}
|
|
}
|
|
}
|
|
close (REGRESS_LIST);
|
|
}
|
|
|
|
#
|
|
# execute_regression sequentially compiles and executes each test in
|
|
# the regression. Regression is done as a two-pass run (execute, check
|
|
# results) so that at some point the execution part can be parallelized.
|
|
#
|
|
|
|
sub execute_regression {
|
|
local ($testname, $rv);
|
|
local ($bpath, $lpath, $vpath);
|
|
|
|
foreach $testname (@testlist) {
|
|
|
|
#
|
|
# First lets clean up the "last" test run.
|
|
#
|
|
if(-e "core") {
|
|
system("rm -f core");
|
|
}
|
|
if(-e "simv") {
|
|
system("rm -f simv");
|
|
}
|
|
if(-e "simv.exe") {
|
|
system("rm -f simv.exe"); # And we support DOS too!!
|
|
}
|
|
|
|
#
|
|
# This is REALLY only an IVL switch...
|
|
#
|
|
# vermod is used to declare the "main module"
|
|
#
|
|
$vermod = "-s ".$testmod{$testname} ;
|
|
$vername = "iverilog ";
|
|
$verout = "-o simv";
|
|
$redir = "&>";
|
|
|
|
print "Test $testname:";
|
|
if ($testpath{$testname} eq "") {
|
|
$vpath = "./$testname.v";
|
|
} else {
|
|
$vpath = "./$testpath{$testname}/$testname.v";
|
|
}
|
|
|
|
$lpath = "./$logdir/$testname.log";
|
|
system("rm -rf $lpath");
|
|
system("rm -rf *.out");
|
|
|
|
|
|
#
|
|
# if we have a logfile - remove it first
|
|
#
|
|
if(-e "$lpath") {
|
|
system("rm $lpath");
|
|
}
|
|
|
|
#
|
|
# Now build the command up
|
|
#
|
|
$cmd = "$vername $versw $verout $vermod $vpath $redir $lpath ";
|
|
print "$cmd\n";
|
|
system("$cmd"); # and execute it.
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
sub check_results {
|
|
local ($testname, $rv);
|
|
local ($bpath, $lpath, $vpath);
|
|
local ($pass_count, $fail_count, $crash_count);
|
|
local ($result);
|
|
|
|
$pass_count = 0;
|
|
$no_sorry = 0;
|
|
$no_parse_err =0;
|
|
$no_run = 0;
|
|
$crash_count = 0;
|
|
$comperr_cnt = 0;
|
|
$comp_err = 0;
|
|
|
|
open (REPORT, ">$report_fn");
|
|
|
|
print REPORT "Test Results:\n";
|
|
|
|
$num_tests = 0;
|
|
foreach $testname (@testlist) {
|
|
$lpath = "$logdir/$testname.log";
|
|
$num_tests++; # count tests
|
|
|
|
# Read in the logfile into infile.
|
|
open(FILE_D,$lpath);
|
|
@infile = <FILE_D>;
|
|
close(FILE_D);
|
|
|
|
$num_lines = $#infile ;
|
|
for($indx=0; $indx <= $num_lines; $indx++) {
|
|
chop($infile[$indx]);
|
|
}
|
|
|
|
if($dbg1 == 1) {
|
|
print "Number lines = ",$num_lines,"\n";
|
|
}
|
|
|
|
#Now scan the log file for the error
|
|
$error_found = 0;
|
|
|
|
for($indx=0; $indx <= $num_lines; $indx++) {
|
|
if($dbg2 == 1) {
|
|
print "Comparing:\n";
|
|
print "read:",$infile[$indx],"\n";
|
|
print "cmpr:",$compare{$testname},"\n";
|
|
}
|
|
if($infile[$indx] eq $compare{$testname}) {
|
|
$error_found = 1;
|
|
}
|
|
}
|
|
|
|
if($error_found == 1) {
|
|
$pass_count++ ;
|
|
print REPORT "$testname\t\tPASSED\n";
|
|
print "$testname\t\tPASSED\n";
|
|
} else {
|
|
print REPORT "$testname\t\tFAILED\n";
|
|
print "$testname\t\tFAILED\n";
|
|
}
|
|
|
|
}
|
|
|
|
$total = $pass_count + $no_compile + $no_run + $crash_count;
|
|
print REPORT "Tests passed: $pass_count of $num_tests total\n";
|
|
print "Tests passed: $pass_count of $num_tests total\n";
|
|
close (REPORT);
|
|
}
|