#!/usr/bin/perl
|
#!/usr/bin/perl
|
|
|
use strict;
|
use strict;
|
use Cwd;
|
use Cwd;
|
use File::Copy;
|
use File::Copy;
|
use File::Find;
|
use File::Find;
|
use HTTP::Date;
|
use HTTP::Date;
|
use Data::Dumper;
|
use Data::Dumper;
|
|
|
|
|
my $RegressionsDirectory = "../regressions/single_core/";
|
my $RegressionsDirectory = "../regressions/single_core/";
|
my $CompilerDir = "../compiler/bin/";
|
my $CompilerDir = "../compiler/bin/";
|
my $SimulatonResultFile = "test_result.log";
|
my $SimulatonResultFile = "test_result.log";
|
my $Option_Quiet = 1;
|
my $Option_Quiet = 1;
|
my $TestConfig;
|
my $TestConfig;
|
|
my $UserTest = undef;
|
#Set the enviroment variable THEIA_PROJECT_FOLDER
|
#Set the enviroment variable THEIA_PROJECT_FOLDER
|
my $tmp = `pwd`;
|
my $tmp = `pwd`;
|
chomp $tmp;
|
chomp $tmp;
|
$tmp .= "/../";
|
$tmp .= "/../";
|
$ENV{'THEIA_PROJECT_FOLDER'} = $tmp;
|
$ENV{'THEIA_PROJECT_FOLDER'} = $tmp;
|
|
|
#find all the *.vp files
|
#find all the *.vp files
|
|
|
my @Tests = <$RegressionsDirectory/*.vp>;
|
my @Tests;
|
|
if (not defined $ARGV[0])
|
|
{
|
|
@Tests = <$RegressionsDirectory/*.vp>;
|
|
} else {
|
|
|
|
$UserTest = "$RegressionsDirectory/$ARGV[0]";
|
|
die "Test $UserTest not found\n" if (not -e "$UserTest");
|
|
@Tests = ($UserTest);
|
|
}
|
for my $Test (@Tests)
|
for my $Test (@Tests)
|
{
|
{
|
print sprintf("Running test %-60s ",$Test);
|
print sprintf("Running test %-60s ",$Test);
|
#Compile the test
|
#Compile the test
|
my $CompilationOutput = `$CompilerDir/theia_compile $Test`;
|
my $CompilationOutput = `$CompilerDir/theia_compile $Test`;
|
if ($CompilationOutput =~ /ERROR/)
|
if ($CompilationOutput =~ /ERROR/)
|
{
|
{
|
print $CompilationOutput;
|
print $CompilationOutput;
|
print "ERROR: theia_compile failed!\n";
|
print "ERROR: theia_compile failed!\n";
|
`rm *.mem`;
|
`ls *.mem | grep -v tmem.mem | xargs rm `;
|
next;
|
next;
|
}
|
}
|
print $CompilationOutput if ($Option_Quiet == 0);
|
print $CompilationOutput if ($Option_Quiet == 0);
|
#Run the test
|
#Run the test
|
my $SimulationOutput = `make run`;
|
my $SimulationOutput = `make run`;
|
print $SimulationOutput if ($Option_Quiet == 0);
|
print $SimulationOutput if ($Option_Quiet == 0);
|
|
|
|
|
#now check for the existance of the test_config file
|
#now check for the existance of the test_config file
|
my $TestBaseName = `basename $Test .vp`;
|
my $TestBaseName = `basename $Test .vp`;
|
chomp $TestBaseName;
|
chomp $TestBaseName;
|
$TestConfig = $RegressionsDirectory . "/" . $TestBaseName . ".config";
|
$TestConfig = $RegressionsDirectory . "/" . $TestBaseName . ".config";
|
|
|
if (not -e $TestConfig)
|
if (not -e $TestConfig)
|
{
|
{
|
print "ERROR: test configuration file $TestConfig does not exist\n";
|
print "ERROR: test configuration file $TestConfig does not exist\n";
|
`rm *.mem`;
|
`ls *.mem | grep -v tmem.mem | xargs rm `;
|
next;
|
next;
|
}
|
}
|
ParseConfigFile( $TestConfig );
|
ParseConfigFile( $TestConfig );
|
|
|
|
|
|
|
|
|
|
|
}
|
}
|
print "Ran " .@Tests . " tests\n";
|
print "Ran " .@Tests . " tests\n";
|
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
sub ParseConfigFile
|
sub ParseConfigFile
|
{
|
{
|
my $ConfigFile = shift;
|
my $ConfigFile = shift;
|
my $Line = 0;
|
my $Line = 0;
|
my $Failed = 0;
|
my $Failed = 0;
|
my $block, my $vp;
|
my $block, my $vp;
|
my $vpindex;
|
my $vpindex;
|
open CONFIG_FILE , $ConfigFile or die "Could not open $ConfigFile : $!\n";
|
open CONFIG_FILE , $ConfigFile or die "Could not open $ConfigFile : $!\n";
|
|
print "Parsing configuration file $ConfigFile\n" if ($Option_Quiet == 0);
|
while (<CONFIG_FILE>)
|
while (<CONFIG_FILE>)
|
{
|
{
|
$Line++;
|
$Line++;
|
next if m/\/\/.*/; #skip comments
|
next if m/\/\/.*/; #skip comments
|
#print "* $_ \n";
|
|
if (m/==/)
|
if (m/==/)
|
{
|
{
|
(my $left, my $ExpectedValue) = split /==/;
|
(my $left, my $ExpectedValue) = split /==/;
|
$ExpectedValue =~ s/\s+//g;
|
$ExpectedValue =~ s/\s+//g;
|
chomp $ExpectedValue;
|
chomp $ExpectedValue;
|
#print "left $left\n";
|
#print "left $left\n";
|
#print "ExpectedValue $ExpectedValue\n";
|
#print "ExpectedValue $ExpectedValue\n";
|
( $vp, $block) = split (/\./,$left);
|
( $vp, $block) = split (/\./,$left);
|
|
|
if ($vp =~ m/vp\[\s*(\d+)\s*\]/) #get the vp <index>, expr vp[ <index> ]
|
if ($vp =~ m/vp\[\s*(\d+)\s*\]/) #get the vp <index>, expr vp[ <index> ]
|
{ $vpindex = $1; }
|
{ $vpindex = $1; }
|
else
|
else
|
{ die "Error line $Line: Invalid left had side '$vp'\n"; }
|
{ die "Error line $Line: Invalid left had side '$vp'\n"; }
|
#Now get the block type
|
#Now get the block type
|
if ($block =~ m/r\[\s*(\d+)\s*\]/) #get the register <index>, expr r[ <index> ]
|
if ($block =~ m/r\[\s*(\d+)\s*\]/) #get the register <index>, expr r[ <index> ]
|
{
|
{
|
my $index = $1;
|
my $index = $1;
|
my $log_file = "rf.vp." . $vpindex . ".log";
|
my $log_file = "rf.vp." . $vpindex . ".log";
|
die "Could not open $log_file : $!\n" if (not -e $log_file);
|
die "Could not open $log_file : $!\n" if (not -e $log_file);
|
my $RegValue = `grep r$index $log_file| awk '{print \$2 \$3 \$4}'`;
|
my $RegValue = `grep r$index $log_file| awk '{print \$2 \$3 \$4}'`;
|
|
chomp $RegValue;
|
if (not ($RegValue =~ m/$ExpectedValue/))
|
if (not ($RegValue =~ m/$ExpectedValue/))
|
{
|
{
|
$Failed = 1;
|
$Failed = 1;
|
print "\n\t ASSERTION : Expecting vp[ $vpindex ].r[ $index ] == '$ExpectedValue', but simulation has value '$RegValue' \n";
|
print "\n\t ASSERTION : Expecting vp[ $vpindex ].r[ $index ] == '$ExpectedValue', but simulation has value '$RegValue' \n";
|
}
|
}
|
|
|
} elsif ($block =~ m/omem\[\s*(\d+)\s*\]/) { #get the OMEM <index>, expr omem[ <index> ]
|
} elsif ($block =~ m/omem\[\s*(\d+)\s*\]/) { #get the OMEM <index>, expr omem[ <index> ]
|
|
|
my $index = $1;
|
my $index = $1;
|
|
my $log_file = "OMEM.vp." . $vpindex . ".log";
|
|
die "Could not open $log_file : $!\n" if (not -e $log_file);
|
|
print "Expected Value: $ExpectedValue\n" if ($Option_Quiet == 0);
|
|
my $GrepString;
|
|
$GrepString = sprintf("grep @%02d %s| awk '{print $2 }'",$index,$log_file);
|
|
my $OmemValue = `$GrepString`;
|
|
chomp $OmemValue;
|
|
print " $GrepString\n" if ($Option_Quiet == 0);
|
|
if (not ($OmemValue =~ m/$ExpectedValue/))
|
|
{
|
|
$Failed = 1;
|
|
print "\n\t ASSERTION : Expecting vp[ $vpindex ].omem[ $index ] == '$ExpectedValue', but simulation has value '$OmemValue' \n";
|
|
}
|
|
|
} else {
|
} else {
|
die "Error parsing '$ConfigFile' unknown block type '$block'\n";
|
die "Error parsing '$ConfigFile' unknown block type '$block'\n";
|
}
|
}
|
|
|
|
|
}
|
}
|
|
|
|
|
}
|
}
|
if ($Failed == 0)
|
if ($Failed == 0)
|
{
|
{
|
print "Test passed\n";
|
print "Test passed\n";
|
} else {
|
} else {
|
print "Teset failed\n"
|
print "Teset failed\n"
|
}
|
}
|
|
|
close CONFIG_FILE;
|
close CONFIG_FILE;
|
}
|
}
|
#-------------------------------------------------------------------------
|
#-------------------------------------------------------------------------
|
|
|