File Coverage

blib/lib/Verilog/Preproc.pm
Criterion Covered Total %
statement 93 101 92.0
branch 20 28 71.4
condition 0 4 0.0
subroutine 18 22 81.8
pod 12 16 75.0
total 143 171 83.6


line stmt bran cond sub pod time code
1             # Verilog - Verilog Perl Interface
2             # See copyright, etc in below POD section.
3             ######################################################################
4              
5             package Verilog::Preproc;
6 14     14   93612 use Carp;
  14         33  
  14         936  
7 14     14   556 use Verilog::Getopt;
  14         26  
  14         445  
8              
9             require DynaLoader;
10 14     14   68 use base qw(DynaLoader);
  14         24  
  14         1218  
11 14     14   98 use strict;
  14         38  
  14         466  
12 14     14   74 use vars qw($VERSION);
  14         27  
  14         17075  
13              
14             $VERSION = '3.476';
15              
16             ######################################################################
17             #### Configuration Section
18              
19             bootstrap Verilog::Preproc;
20              
21             #In Preproc.xs:
22             # sub _new (class, keepcmt, linedir, pedantic, synthesis)
23             # sub _open (class)
24             # sub getall (class)
25             # sub getline (class)
26             # sub eof (class)
27             # sub filename (class)
28             # sub lineno (class)
29             # sub unreadback (class, text)
30              
31             ######################################################################
32             #### Accessors
33              
34             sub new {
35 499 50   499 1 11605 my $class = shift; $class = ref $class if ref $class;
  499         1309  
36 499         1847 my $self = {keep_comments=>1,
37             keep_whitespace=>1,
38             line_directives=>1,
39             ieee_predefined=>1,
40             pedantic=>0,
41             synthesis=>0,
42             options=>Verilog::Getopt->new(), # If the user didn't give one, still work!
43             parent => undef,
44             #include_open_nonfatal=>0,
45             @_};
46 499         1135 bless $self, $class;
47             # Sets $self->{_cthis}
48 499 100       1770 $self->{keep_comments} = 2 if ($self->{keep_comments} eq 'sub');
49 499 50       1164 $self->{keep_comments} = 3 if ($self->{keep_comments} eq 'expand'); #TBD
50             $self->_new($self,
51             $self->{keep_comments},
52             $self->{keep_whitespace},
53             $self->{line_directives},
54             $self->{pedantic},
55             $self->{synthesis},
56 499         34807 );
57 499 100       2403 if ($self->{synthesis}) {
58             # Fourth argument 1 for cmdline - no `undefineall effect
59 2         6 $self->define('SYNTHESIS',1,undef,1);
60             }
61 499 50       1149 if ($self->{ieee_predefined}) {
62 499         1692 $self->define('SV_COV_START', 0,undef,1);
63 499         1259 $self->define('SV_COV_STOP', 1,undef,1);
64 499         1184 $self->define('SV_COV_RESET', 2,undef,1);
65 499         1278 $self->define('SV_COV_CHECK', 3,undef,1);
66 499         1385 $self->define('SV_COV_MODULE', 10,undef,1);
67 499         1244 $self->define('SV_COV_HIER', 11,undef,1);
68 499         1350 $self->define('SV_COV_ASSERTION', 20,undef,1);
69 499         1289 $self->define('SV_COV_FSM_STATE', 21,undef,1);
70 499         1268 $self->define('SV_COV_STATEMENT', 22,undef,1);
71 499         1315 $self->define('SV_COV_TOGGLE', 23,undef,1);
72 499         1436 $self->define('SV_COV_OVERFLOW', -2,undef,1);
73 499         1256 $self->define('SV_COV_ERROR', -1,undef,1);
74 499         1276 $self->define('SV_COV_NOCOV', 0,undef,1);
75 499         1176 $self->define('SV_COV_OK', 1,undef,1);
76 499         1144 $self->define('SV_COV_PARTIAL', 2,undef,1);
77             }
78             #use Data::Dumper; print Dumper($self);
79 499         1250 return $self;
80             }
81              
82             sub DESTROY {
83 463     463   29282 my $self = shift;
84 463         37954 $self->_DESTROY;
85             }
86              
87             sub STORABLE_freeze {
88 1     1 0 1120 my ($self, $cloning) = @_;
89             # Prevent crash on Storable::store then retrieve
90 1         6 delete $self->{_cthis};
91 1         139 return;
92             }
93              
94             sub open {
95 555     555 1 4327 my $self = shift;
96 555         942 my %params = (
97             # filename =>
98             # open_nonfatal => 0,
99             );
100 555 100       1374 if ($#_ > 0) { %params=(@_); } else { $params{filename}=shift; }
  33         151  
  522         1078  
101             # We allow either open(name) or open(filename=>name);
102              
103             # Allow user to put `defined names on the command line instead of filenames,
104              
105             # then convert them properly.
106 555         976 my $filename = $params{filename};
107 555         1413 $filename = $self->remove_defines($filename);
108 555 50       1347 printf ("Perl open $filename\n") if $self->{debug};
109 555         1573 $filename = $self->{options}->file_path($filename);
110 555 50       1391 printf ("Perl openfp $filename\n") if $self->{debug};
111 555 100       8460 if (!-r $filename) {
112 3 100       11 if (!$params{open_nonfatal}) {
113 1         5 $self->error("Cannot open $filename");
114             }
115 2         37 return undef;
116             } else {
117 552         53877 $self->_open($filename);
118             }
119 552         3603 return $self;
120             }
121              
122             sub debug {
123 0     0 0 0 my $self = shift;
124 0         0 my $level = shift;
125 0         0 $self->{debug} = $level;
126 0         0 $self->_debug($level);
127             }
128              
129             sub parent {
130 0     0 1 0 my $self = shift;
131 0         0 return $self->{parent};
132             }
133              
134             ######################################################################
135             #### Utilities
136              
137             sub remove_defines {
138 555     555 0 755 my $self = shift;
139 555         728 my $sym = shift;
140 555         787 my $val = "x";
141 555         1279 while (defined $val) {
142 555 50       1263 last if $sym eq $val;
143 555         1126 (my $xsym = $sym) =~ s/^\`//;
144 555         1615 $val = $self->{options}->defvalue_nowarn($xsym); #Undef if not found
145 555 50       1633 $sym = $val if defined $val;
146             }
147 555         996 return $sym;
148             }
149              
150             sub fileline {
151 0     0 0 0 my $self = shift;
152 0   0     0 return ($self->filename||"").":".($self->lineno||"");
      0        
153             }
154              
155             ######################################################################
156             #### Called by the parser
157              
158             sub error {
159 1     1 1 3 my ($self,$text,$token)=@_;
160 1         9 my $fileline = $self->filename.":".$self->lineno;
161 1         222 croak ("%Error: $fileline: $text\n"
162             ."Stopped");
163             }
164              
165       0 1   sub comment {}
166              
167             sub def_substitute {
168 20     20 1 66 my ($self, $out) = @_;
169 20         2186 return $out;
170             }
171             sub include {
172 33     33 1 4077 my ($self,$filename)=@_;
173 33 50       116 print "INCLUDE $filename\n" if $self->{debug};
174 33         286 $self->{options}->includes($self->filename, $filename);
175             $self->open(filename => $filename,
176             open_nonfatal => $self->{include_open_nonfatal},
177 33         228 );
178             }
179              
180             # Note rather than overriding these, a derived Verilog::Getopt class can
181             # accomplish the same thing.
182              
183             sub undef {
184 140     140 1 5143 my $self = shift;
185 140         336 $self->{options}->undef(@_);
186             }
187             sub undefineall {
188 19     19 1 1842 my $self = shift;
189 19         59 $self->{options}->undefineall(@_);
190             }
191             sub define {
192 8519     8519 1 61780 my $self = shift;
193             #print "DEFINE @_\n";
194 8519         39063 $self->{options}->fileline($self->filename.":".$self->lineno);
195 8519         17401 $self->{options}->define(@_);
196             }
197             sub def_params {
198             # Return define parameters
199 2529     2529 1 77140 my $self = shift;
200 2529         6236 my $val = $self->{options}->defparams(@_);
201             #printf "DEFPARAMS @_ -> %s\n", $val if $self->{debug};
202 2529 100       4696 $val = "" if !defined $val;
203 2529         182332 return $val;
204             }
205             sub def_value {
206             # Return value
207 1716     1716 1 3430 my $self = shift;
208             #printf "DEFVALUE @_ -> %s\n", $self->{options}->defvalue_nowarn(@_);
209 1716         3536 return $self->{options}->defvalue(@_);
210             }
211              
212             ######################################################################
213             #### Package return
214             1;
215             __END__