File Coverage

blib/lib/Verilog/Parser.pm
Criterion Covered Total %
statement 105 125 84.0
branch 20 38 52.6
condition 7 13 53.8
subroutine 24 28 85.7
pod 14 20 70.0
total 170 224 75.8


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::Parser;
6 11     11   75410 use Carp;
  11         21  
  11         498  
7 11     11   4323 use Verilog::Getopt;
  11         24  
  11         310  
8 11     11   4757 use Verilog::Language;
  11         28  
  11         415  
9 11     11   3748 use Verilog::Std;
  11         22  
  11         364  
10              
11             require DynaLoader;
12 11     11   54 use base qw(DynaLoader);
  11         19  
  11         680  
13              
14 11     11   50 use strict;
  11         168  
  11         226  
15 11     11   40 use vars qw($VERSION $Debug);
  11         16  
  11         12054  
16              
17             $VERSION = '3.480';
18              
19             #$Debug sets the default value for debug. You're better off with the object method though.
20              
21             our @_Callback_Names = qw(
22             attribute
23             endparse
24             keyword
25             number
26             operator
27             preproc
28             string
29             symbol
30             );
31              
32             ######################################################################
33             #### Configuration Section
34              
35             bootstrap Verilog::Parser;
36              
37             #In Parser.xs:
38             # sub _new (class, sigparser)
39             # sub _open (class)
40             # sub _debug (class, level)
41             # sub _prologe (class, flag)
42             # sub _callback_master_enable
43             # sub _use_cb (class, name, flag)
44             # sub parse (class)
45             # sub eof (class)
46             # sub filename (class, [setit])
47             # sub lineno (class, [setit])
48             # sub unreadback (class, [setit])
49             # sub unreadbackCat (class, add)
50              
51             ######################################################################
52             #### Constructors
53              
54             sub new {
55 490 50   490 1 1261 my $class = shift; $class = ref $class if ref $class;
  490         892  
56 490         3666 my $self = {_sigparser=>0,
57             symbol_table=>[], # .xs will init further for us
58             use_vars => 1,
59             use_unreadback => 1, # Backward compatibility
60             use_protected => 1, # Backward compatibility
61             use_pinselects => 0, # Backward compatibility
62             use_std => undef, # Undef = silent
63             #use_cb_{callback-name} => 0/1
64             #
65             #_debug # Don't set, use debug() accessor to change level
66             @_};
67              
68 490         841 bless $self, $class;
69             # Sets $self->{_cthis}
70             $self->_new($self,
71             # Options go here
72             $self->{symbol_table},
73             $self->{_sigparser},
74             $self->{use_unreadback},
75             $self->{use_protected},
76             $self->{use_pinselects}, # Undocumented as for use in SigParser only
77 490         13939 );
78              
79 490 50       1915 $self->{use_cb_contassign} = $self->{use_vars} if !exists $self->{use_cb_contassign};
80 490 50       1153 $self->{use_cb_defparam} = $self->{use_vars} if !exists $self->{use_cb_defparam};
81 490 50       1032 $self->{use_cb_pin} = $self->{use_vars} if !exists $self->{use_cb_pin};
82 490 50       981 $self->{use_cb_port} = $self->{use_vars} if !exists $self->{use_cb_port};
83 490 50       1019 $self->{use_cb_var} = $self->{use_vars} if !exists $self->{use_cb_var};
84              
85 490         550 foreach my $key (keys %{$self}) {
  490         2706  
86 9994 100       17725 if ($key =~ /^use_cb_(.*)/) {
87 4123         11119 $self->_use_cb($1, $self->{$key});
88             }
89             }
90              
91 490         1820 $self->language(Verilog::Language::language_standard());
92 490 50       963 $self->debug($Debug) if $Debug;
93 490         953 return $self;
94             }
95              
96             sub DESTROY {
97 490     490   72203 my $self = shift;
98 490         36079 $self->_DESTROY;
99             }
100              
101             ######################################################################
102             #### Accessors
103              
104             sub callback_names {
105 2     2 1 5347 my @out = sort @_Callback_Names;
106 2         7 return @out;
107             }
108              
109             sub debug {
110 1447     1447 0 1756 my $self = shift;
111 1447         1534 my $level = shift;
112 1447 100       2376 if (defined $level) {
113 459         1238 $self->{_debug} = $level;
114 459         1670 $self->_debug($level);
115             }
116 1447         2328 return $self->{_debug};
117             }
118              
119             sub fileline {
120 0     0 0 0 my $self = shift;
121 0   0     0 return ($self->filename||"").":".($self->lineno||"");
      0        
122             }
123              
124 0     0 0 0 sub line { return lineno(@_); } # Old, now undocumented
125              
126             #######################################################################
127             #### Methods
128              
129             sub reset {
130 489     489 0 609 my $self = shift;
131 489         1054 $self->std;
132             }
133              
134             sub std {
135 515     515 0 618 my $self = shift;
136 515   66     1957 my $quiet = !defined $self->{use_std} && $self->{_sigparser};
137 515 100 66     2319 if (!$self->{symbol_table}[2]->{std} # Not in the symbol table yet
      100        
138             && ($self->{use_std} || $quiet)
139             ) {
140 459 50       869 print "Including std::\n" if $self->{_debug};
141 459         948 my $olddbg = $self->debug;
142 459 50       798 if ($quiet) {
143 459 50       769 print "Disabling debug during std:: loading\n" if $self->{_debug};
144 459         775 $self->debug(0);
145 459         1045 $self->_callback_master_enable(0); # //verilog-perl callbacks off
146             }
147 459         50447 $self->eof; #Flush user code before callback disable
148 459         1756 $self->parse(Verilog::Std::std);
149 459         205430 $self->eof;
150 459 50       1871 if ($quiet) {
151 459         1432 $self->_callback_master_enable(1); # //verilog-perl callbacks on
152 459         1053 $self->debug($olddbg);
153             }
154             }
155             }
156              
157             sub parse_file {
158             # Read a file and parse
159 0 0   0 1 0 @_ == 2 or croak 'usage: $parser->parse_file($filename)';
160 0         0 my $self = shift;
161 0         0 my $filename = shift;
162              
163 0         0 my $fh = new IO::File;
164 0 0       0 $fh->open($filename) or croak "%Error: $! $filename";
165 0         0 $self->reset();
166 0         0 $self->filename($filename);
167 0         0 $self->lineno(1);
168 0         0 while (defined(my $line = $fh->getline())) {
169 0         0 $self->parse($line);
170             }
171 0         0 $self->eof;
172 0         0 $fh->close;
173 0         0 return $self;
174             }
175              
176             sub parse_preproc_file {
177             # Read a preprocess file and parse
178 463 50   463 1 1848 @_ == 2 or croak 'usage: $parser->parse_file(Verilog::Preproc_object_ref)';
179 463         762 my $self = shift;
180 463         629 my $pp = shift;
181              
182 463 50       1027 ref($pp) or croak "%Error: not passed a Verilog::Preproc object";
183 463         1242 $self->reset();
184              
185             # Chunk size of ~32K determined experimentally with t/49_largeish.t
186 463         205556 while (defined(my $text = $pp->getall(31*1024))) {
187 487         88858 $self->parse($text);
188             }
189 463         31943 $self->eof;
190 463         9150 return $self;
191             }
192              
193             ######################################################################
194             #### Called by the parser
195              
196             sub error {
197 0     0 0 0 my ($self,$text,$token)=@_;
198 0         0 my $fileline = $self->filename.":".$self->lineno;
199 0         0 croak("%Error: $fileline: $text\n"
200             ."Stopped");
201             }
202              
203             sub attribute {
204             # Default Internal callback
205 153     153 1 262 my $self = shift; # Parser invoked
206 153         256 my $token = shift; # What token was parsed
207 153         896 $self->unreadbackCat($token);
208             }
209              
210             sub comment {
211             # Default Internal callback
212 3950     3950 1 4108 my $self = shift; # Parser invoked
213 3950         3843 my $token = shift; # What token was parsed
214 3950         23481 $self->unreadbackCat($token);
215             }
216              
217             sub string {
218             # Default Internal callback
219 1039     1039 1 1439 my $self = shift; # Parser invoked
220 1039         1197 my $token = shift; # What token was parsed
221 1039         4767 $self->unreadbackCat($token);
222             }
223              
224             sub keyword {
225             # Default Internal callback
226 64129     64129 1 123878 my $self = shift; # Parser invoked
227 64129         59459 my $token = shift; # What token was parsed
228 64129         316329 $self->unreadbackCat($token);
229             }
230              
231             sub symbol {
232             # Default Internal callback
233 73618     73618 1 112775 my $self = shift; # Parser invoked
234 73618         70638 my $token = shift; # What token was parsed
235 73618         419917 $self->unreadbackCat($token);
236             }
237              
238             sub operator {
239             # Default Internal callback
240 131317     131317 1 196985 my $self = shift; # Parser invoked
241 131317         118714 my $token = shift; # What token was parsed
242 131317         661546 $self->unreadbackCat($token);
243             }
244              
245             sub preproc {
246             # Default Internal callback
247 1704     1704 1 14251 my $self = shift; # Parser invoked
248 1704         2072 my $token = shift; # What token was parsed
249 1704 50       4670 if (Verilog::Language::is_keyword($token)) {
250 0         0 $self->keyword($token); # Do this for backward compatibility with Version 2.*
251             } else {
252 1704         3075 $self->symbol($token); # Do this for backward compatibility with Version 2.*
253             }
254             }
255             sub number {
256             # Default Internal callback
257 21977     21977 1 26615 my $self = shift; # Parser invoked
258 21977         22399 my $token = shift; # What token was parsed
259 21977         83088 $self->unreadbackCat($token);
260             }
261              
262             sub sysfunc {
263             # Default Internal callback - note the default action
264 1655     1655 1 18111 my $self = shift; # Parser invoked
265 1655         1907 my $token = shift; # What token was parsed
266 1655         2575 $self->symbol($token); # Do this for backward compatibility with Version 2.*
267             }
268              
269             sub endparse {
270             # Default Internal callback
271 486     486 1 2369 my $self = shift; # Parser invoked
272 486         651 my $token = shift; # What token was parsed
273 486         1643 $self->unreadbackCat($token);
274             }
275              
276             ######################################################################
277             #### Package return
278             1;
279             __END__