1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150
|
#!/usr/bin/perl -w
# DESCRIPTION: Perl ExtUtils: Type 'make test' to test this package
#
# Copyright 2000-2024 by Wilson Snyder. This program is free software;
# you can redistribute it and/or modify it under the terms of either the GNU
# Lesser General Public License Version 3 or the Perl Artistic License Version 2.0.
######################################################################
# VERILOG_TEST_FILES="$V4/test_regress/t/t_case*.v" VERILOG_TEST_DEBUGIF=1 t/36_sigmany.t
# (delete-matching-lines "^#\\|^ok \\|^1\\.\\.\\|^not ok")
use strict;
use Test; # Not Test::More due to skip usage
use Data::Dumper; $Data::Dumper::Indent = 1;
BEGIN { plan tests => 3 }
BEGIN { require "./t/test_utils.pl"; }
our $Any_Error;
our $Got_Eof_Module;
######################################################################
package MyParser;
use Verilog::SigParser;
use strict;
use base qw(Verilog::SigParser);
sub module {
my ($self,$kwd,$name)=@_;
$Got_Eof_Module = 1 if $name eq '_GOT_EOF_MODULE';
}
sub error {
my ($self,$text,$token)=@_;
my $fileline = $self->filename.":".$self->lineno;
if ($text !~ /\`math/) {
if (!$ENV{VERILOG_TEST_SILENT}) {
warn ("%Warning: $fileline: $text\n");
$self->{_errored} = 1;
$::Any_Error = 1;
} else {
warn ("-Silent-Warning: $fileline: $text\n");
}
# Try to print source line
if (my $fh=IO::File->new("<".$self->filename)) {
my @lines = $fh->getlines;
my $line = $lines[$self->lineno-1] || "";
$line =~ s/^\s+//;
warn ("\t".$line) if $line;
$fh->close();
}
}
}
######################################################################
package main;
use Verilog::SigParser;
use Verilog::Preproc;
use Verilog::Getopt;
ok(1);
my @files;
if ($ENV{VERILOG_TEST_FILES}) {
ok(1);
@files = split(/:/,$ENV{VERILOG_TEST_FILES});
@files = map {glob $_} @files;
}
else {
skip("VERILOG_TEST_FILES not set (harmless)",1);
# export VERILOG_TEST_FILES="$V4/test_regress/t/t_case*.v"
@files = glob("verilog/*.v");
@files = grep {!m!/inc!} @files;
}
check_series(@files);
######################################################################
sub check_series {
my @files = @_;
$Any_Error = 0;
foreach my $file (@files) {
read_test($file);
}
ok(!$Any_Error);
}
sub read_test {
my $filename = shift;
my $parser = one_parse($filename, 0);
if ($ENV{VERILOG_TEST_DEBUGIF} && $parser->{_errored}) {
print "======== REPARSING w/debug\n";
one_parse($filename, 9);
}
}
sub one_parse {
my $filename = shift;
my $debug = shift;
$Got_Eof_Module = undef;
print "="x70,"\n";
print "read $filename\n";
my $opt = new Verilog::Getopt;
# Used to do this so we can read pre-vpassert'ed files,
# but now we require a `include std_defines in all sources
# even though a lint run may not indicate it's needed
# (since lint runs pre-vpassert.)
# $opt->define('__message_on',"1'b0");
if ($filename =~ m!(.*)/!) {
# Allow includes in same dir as the test
my $fdir = $1;
$opt->incdir($fdir);
$opt->module_dir ($fdir);
}
my $pp = Verilog::Preproc->new(keep_comments=>0,
include_open_nonfatal=>0,
options=>$opt);
my $parser = new MyParser();
# Suck in std:: before enabling debug dumps
$parser->std;
$parser->debug($debug || $ENV{VERILOG_TEST_DEBUG});
$pp->open($filename);
if ($ENV{VERILOG_TEST_KEYWORDS}) {
$parser->parse("`begin_keywords \"1364-2001\" ");
}
$parser->reset;
# Similar to $parser->parse_preproc_file($pp);
# but we want to stuff a module before the EOF
while (defined(my $line = $pp->getline())) {
$parser->parse ($line);
}
$parser->parse("module _GOT_EOF_MODULE; endmodule\n");
$parser->eof;
if (!$Any_Error && !$Got_Eof_Module) {
warn "%Warning: $filename: Never parsed fake module at EOF\n";
$parser->{_errored} = 1;
$::Any_Error = 1;
}
print Dumper($parser->{symbol_table}) if $parser->debug;
return $parser;
}
|