• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

nickg / nvc / 13174766953

06 Feb 2025 08:30AM UTC coverage: 92.162% (+0.002%) from 92.16%
13174766953

push

github

nickg
Include type name in range_of backtrace message. Issue xxx

64133 of 69587 relevant lines covered (92.16%)

498167.34 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

94.41
/src/lexer.l
1
/* -*- mode: c; c-basic-offset: 3 -*- */
2

3
/*
4
 *  Copyright (C) 2011-2025  Nick Gasson
5
 *
6
 *  This program is free software: you can redistribute it and/or modify
7
 *  it under the terms of the GNU General Public License as published by
8
 *  the Free Software Foundation, either version 3 of the License, or
9
 *  (at your option) any later version.
10
 *
11
 *  This program is distributed in the hope that it will be useful,
12
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 *  GNU General Public License for more details.
15
 *
16
 *  You should have received a copy of the GNU General Public License
17
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
18
 */
19

20

21
%option noyywrap
22
%option nounput
23
%option noinput
24

25
%{
26
#include "util.h"
27
#include "common.h"
28
#include "diag.h"
29
#include "ident.h"
30
#include "option.h"
31
#include "scan.h"
32
#include "tree.h"
33

34
#include <ctype.h>
35
#include <math.h>
36
#include <string.h>
37

38
#define YY_INPUT(buf, result, max_size) {    \
39
      result = get_next_char(buf, max_size); \
40
      if (result <= 0)                       \
41
         result = YY_NULL;                   \
42
   }
43

44
#define YY_USER_ACTION begin_token(yytext, yyleng);
45

46
#define TOKEN(t) return (last_token = (t))
47

48
#define TOKEN_LRM(t, lrm) do {                                          \
49
      if (standard() < lrm && isalnum_iso88591(yytext[0])) {            \
50
         static bool warned = false;                                    \
51
         const token_t token = parse_id(yytext);                        \
52
         if (token == tID && !warned) {                                 \
53
            warn_lrm(lrm, "%s is a reserved word in VHDL-%s",           \
54
                     istr(yylval.ident), standard_text(lrm));           \
55
            warned = true;                                              \
56
         }                                                              \
57
         return token;                                                  \
58
      }                                                                 \
59
      else                                                              \
60
         return (last_token = (t));                                     \
61
   } while (0)
62

63
#define MIN_STD(lrm, what) do {                                         \
64
      static bool warned = false;                                       \
65
      if (!warned && standard() < lrm) {                                \
66
         warn_lrm(lrm, "%s are a VHDL-%s feature", what,                \
67
                  standard_text(lrm));                                  \
68
         warned = true;                                                 \
69
      }                                                                 \
70
   } while (0)
71

72
#define TOKEN_00(t) TOKEN_LRM(t, STD_00)
73
#define TOKEN_08(t) TOKEN_LRM(t, STD_08)
74
#define TOKEN_19(t) TOKEN_LRM(t, STD_19)
75

76
static int parse_id(char *str);
77
static int parse_ex_id(char *str);
78
static int parse_bit_string(const char *str);
79
static int parse_string(const char *str);
80
static int parse_decimal_literal(const char *str);
81
static int parse_verilog_real(const char *str);
82
static int parse_based_literal(const char *str);
83
static int resolve_ir1045(void);
84
static void warn_lrm(vhdl_standard_t std, const char *fmt, ...);
85
static void warn_utf8(const char *str);
86
static bool begin_psl_comment(void);
87
static int escape_verilog_string(const char *str);
88
static int report_unterminated_string(const char *str);
89
static int report_bad_identifier(char *str);
90

91
static int last_token = -1;
92
static int comment_caller = 0;
93
static bool in_psl_comment = false;
94

95
extern loc_t yylloc;
96
extern yylval_t yylval;
97
%}
98

99
LOWER           [a-z\xdf-\xf6\xf8-\xff]
100
UPPER           [A-Z\xc0-\xd6\xd8-\xde]
101
VHDL_ID         ({LOWER}|{UPPER})(_?({LOWER}|{UPPER}|[0-9]))*
102
BAD_ID          ({LOWER}|{UPPER}|_)({LOWER}|{UPPER}|[0-9_])*
103
EXID            \\([^\\\n]|\\\\)*\\
104
VLOG_ID         [a-zA-Z_]([a-zA-Z0-9_$])*
105
/* TODO: Add "escaped_character" handling to SDF ID */
106
/* TODO: According to spec, identifier could even start with number*/
107
SDF_ID          ([a-zA-Z$_])([a-zA-Z$_0-9])*
108
SYSTASK         \$[a-zA-Z_$]([a-zA-Z0-9_$])*
109
STRING          (\"([^\"\n]|\"\")*\")|(\%([^\"\n\%]|\%\%)*\%)
110
BADSTRING       (\"([^\"\n]|\"\")*)|(\%([^\"\n\%]|\%\%)*)
111
VLOG_STRING     "\""[^\n\"]*"\""
112
BITSTRING       [0-9]*[usUS]?(?i:[boxd]\"[^\"\n]*\")|(?i:[boxd]\%[^\n\%]*\%)
113
CHAR            '.'
114
INTEGER         [0-9][0-9_]*
115
EXPONENT        [Ee][+-]?{INTEGER}
116
DECIMAL         {INTEGER}(\.{INTEGER})?{EXPONENT}?
117
HEX             [0-9a-fA-FzZxX][0-9a-fA-FzZxX_]*
118
BASED_HASH      {INTEGER}[#]{HEX}(\.{HEX})?[#]{EXPONENT}?
119
BASED_COLON     {INTEGER}[:]{HEX}(\.{HEX})?[:]{EXPONENT}?
120
BASED           {BASED_HASH}|{BASED_COLON}
121
SPACE           [ \t\r]+
122
TICK            \'
123
PRAGMA          --[ \t]*
124
SYNTH_OFF       {PRAGMA}(?i:synthesis)[ \t]+(?i:translate_off).*
125
SYNTH_ON        {PRAGMA}(?i:synthesis)[ \t]+(?i:translate_on).*
126
COVERAGE_OFF    {PRAGMA}(?i:coverage)[ \t]+(?i:off).*
127
COVERAGE_ON     {PRAGMA}(?i:coverage)[ \t]+(?i:on).*
128
TRANSLATE_OFF   {PRAGMA}(?i:pragma)[ \t]+(?i:translate_off).*
129
TRANSLATE_ON    {PRAGMA}(?i:pragma)[ \t]+(?i:translate_on).*
130
PSL_COMMENT     {PRAGMA}(?i:psl)
131
PSL_CONT        ^{SPACE}*({PSL_COMMENT}|"--")
132
UTF8_MB         [\x80-\xff][\x80-\xbf]{1,3}
133
VLOG_NUMBER     {INTEGER}?\'[bhd]{HEX}
134
VLOG_REAL       {INTEGER}\.{INTEGER}
135
UDP_LEVEL       [01xX?bB]
136
UDP_EDGE        [rRfFpPnN*]
137
UDP_INDICATOR   "("{UDP_LEVEL}{UDP_LEVEL}")"
138
SCALAR_ZERO     ('b0|'B0|1'b0|1'B0)
139
SCALAR_ONE      ('b1|'B1|1'b1|1'B1)
140

141
%x COMMENT C_COMMENT PSL VLOG UDP SDF SDF_EXPR
142

143
ENTITY        ?i:entity
144
IS            ?i:is
145
END           ?i:end
146
GENERIC       ?i:generic
147
PORT          ?i:port
148
CONSTANT      ?i:constant
149
CONFIGURATION ?i:configuration
150
COMPONENT     ?i:component
151
ARCHITECTURE  ?i:architecture
152
OF            ?i:of
153
BEGIN         ?i:begin
154
AND           ?i:and
155
OR            ?i:or
156
XOR           ?i:xor
157
XNOR          ?i:xnor
158
NOR           ?i:nor
159
NAND          ?i:nand
160
ABS           ?i:abs
161
NOT           ?i:not
162
ALL           ?i:all
163
IN            ?i:in
164
OUT           ?i:out
165
BUFFER        ?i:buffer
166
BUS           ?i:bus
167
REGISTER      ?i:register
168
UNAFFECTED    ?i:unaffected
169
SIGNAL        ?i:signal
170
PROCESS       ?i:process
171
WAIT          ?i:wait
172
REPORT        ?i:report
173
INOUT         ?i:inout
174
LINKAGE       ?i:linkage
175
VARIABLE      ?i:variable
176
FOR           ?i:for
177
TYPE          ?i:type
178
RANGE         ?i:range
179
TO            ?i:to
180
DOWNTO        ?i:downto
181
SUBTYPE       ?i:subtype
182
UNITS         ?i:units
183
PACKAGE       ?i:package
184
LIBRARY       ?i:library
185
USE           ?i:use
186
NULL          ?i:null
187
FUNCTION      ?i:function
188
IMPURE        ?i:impure
189
PURE          ?i:pure
190
RETURN        ?i:return
191
ARRAY         ?i:array
192
OTHERS        ?i:others
193
ASSERT        ?i:assert
194
SEVERITY      ?i:severity
195
ON            ?i:on
196
MAP           ?i:map
197
IF            ?i:if
198
THEN          ?i:then
199
ELSE          ?i:else
200
ELSIF         ?i:elsif
201
BODY          ?i:body
202
WHILE         ?i:while
203
LOOP          ?i:loop
204
AFTER         ?i:after
205
ALIAS         ?i:alias
206
MOD           ?i:mod
207
ATTRIBUTE     ?i:attribute
208
PROCEDURE     ?i:procedure
209
EXIT          ?i:exit
210
REM           ?i:rem
211
WHEN          ?i:when
212
CASE          ?i:case
213
TRANSPORT     ?i:transport
214
INERTIAL      ?i:inertial
215
REJECT        ?i:reject
216
BLOCK         ?i:block
217
WITH          ?i:with
218
SELECT        ?i:select
219
GENERATE      ?i:generate
220
ACCESS        ?i:access
221
POSTPONED     ?i:postponed
222
FILE          ?i:file
223
OPEN          ?i:open
224
UNTIL         ?i:until
225
RECORD        ?i:record
226
NEW           ?i:new
227
SHARED        ?i:shared
228
NEXT          ?i:next
229
SLL           ?i:sll
230
SRL           ?i:srl
231
SLA           ?i:sla
232
SRA           ?i:sra
233
ROL           ?i:rol
234
ROR           ?i:ror
235
GROUP         ?i:group
236
LABEL         ?i:label
237
LITERAL       ?i:literal
238
GUARDED       ?i:guarded
239
REVRANGE      ?i:reverse_range
240
PROTECTED     ?i:protected
241
CONTEXT       ?i:context
242
ERROR         ?i:error
243
WARNING       ?i:warning
244
DISCONNECT    ?i:disconnect
245
FORCE         ?i:force
246
RELEASE       ?i:release
247
PARAMETER     ?i:parameter
248
ALWAYS        ?i:always
249
DEFAULT       ?i:default
250
CLOCK         ?i:clock
251
NEVER         ?i:never
252
EVENTUALLY    ?i:eventually
253
NEXT_A        ?i:next_a
254
NEXT_E        ?i:next_e
255
NEXT_EVENT    ?i:next_event
256
ASSUME        ?i:assume
257
ASSUME_G      ?i:assume_guarantee
258
RESTRICT      ?i:restrict
259
RESTRICT_G    ?i:restrict_guarantee
260
STRONG        ?i:strong
261
FAIRNESS      ?i:fairness
262
COVER         ?i:cover
263
PROPERTY      ?i:property
264
SEQUENCE      ?i:sequence
265
CONST         ?i:const
266
MUTABLE       ?i:mutable
267
HDLTYPE       ?i:hdltype
268
BOOLEAN       ?i:boolean
269
BIT           ?i:bit
270
BITVECTOR     ?i:bitvector
271
NUMERIC       ?i:numeric
272
STRING_K      ?i:string
273
WITHIN        ?i:within
274
VIEW          ?i:view
275
PRIVATE       ?i:private
276
PREV          ?i:prev
277
STABLE        ?i:stable
278
ROSE          ?i:rose
279
FELL          ?i:fell
280
ENDED         ?i:ended
281
NONDET        ?i:nondet
282
NONDET_V      ?i:nondet_vector
283
UNION         ?i:union
284
INF           ?i:inf
285
ENDPOINT      ?i:endpoint
286

287
INTERCONNECT      ?i:interconnect
288
DELAYFILE         ?i:delayfile
289
SDFVERSION        ?i:sdfversion
290
DESIGN            ?i:design
291
DATE              ?i:date
292
VENDOR            ?i:vendor
293
PROGRAM           ?i:program
294
VERSION           ?i:version
295
DIVIDER           ?i:divider
296
VOLTAGE           ?i:voltage
297
TEMPERATURE       ?i:temperature
298
TIMESCALE         ?i:timescale
299
CELL              ?i:cell
300
CELLTYPE          ?i:celltype
301
INSTANCE          ?i:instance
302
ABSOLUTE          ?i:absolute
303
PATHPULSE         ?i:pathpulse
304
PATHPULSEP        ?i:pathpulsepercent
305
INCREMENT         ?i:increment
306
IOPATH            ?i:iopath
307
DELAY             ?i:delay
308
SETUP             ?i:setup
309
HOLD              ?i:hold
310
SETUPHOLD         ?i:setuphold
311
RECOVERY          ?i:recovery
312
REMOVAL           ?i:removal
313
RECREM            ?i:recrem
314
WIDTH             ?i:width
315
PERIOD            ?i:period
316
SKEW              ?i:skew
317
BIDIRSKEW         ?i:bidirectskew
318
NOCHANGE          ?i:nochange
319
NETDELAY          ?i:netdelay
320
DEVICE            ?i:device
321
COND              ?i:cond
322
CONDELSE          ?i:condelse
323
PATHCONSTRAINT    ?i:PATHCONSTRAINT
324
PERIODCONSTRAINT  ?i:PERIODCONSTRAINT
325
SUM               ?i:SUM
326
DIFF              ?i:DIFF
327
SKEWCONSTRAINT    ?i:SKEWCONSTRAINT
328
ARRIVAL           ?i:ARRIVAL
329
DEPARTURE         ?i:DEPARTURE
330
SLACK             ?i:SLACK
331
WAVEFORM          ?i:WAVEFORM
332
NAME              ?i:NAME
333
EXCEPTION         ?i:EXCEPTION
334
TIMINGCHECK       ?i:TIMINGCHECK
335
TIMINGENV         ?i:TIMINGENV
336
RETAIN            ?i:RETAIN
337
SCOND             ?i:SCOND
338
CCOND             ?i:CCOND
339
ABORT             ?i:abort
340
ASYNC_ABORT       ?i:async_abort
341
SYNC_ABORT        ?i:sync_abort
342
BEFORE            ?i:before
343

344
%%
345

346
{SYNTH_OFF}              { TOKEN(tSYNTHOFF); }
4✔
347
{SYNTH_ON}               { TOKEN(tSYNTHON); }
3✔
348
{COVERAGE_OFF}           { TOKEN(tCOVERAGEOFF); }
23✔
349
{COVERAGE_ON}            { TOKEN(tCOVERAGEON); }
25✔
350
{TRANSLATE_OFF}          { TOKEN(tTRANSLATEOFF); }
24✔
351
{TRANSLATE_ON}           { TOKEN(tTRANSLATEON); }
22✔
352

1✔
353
<PSL,INITIAL>"--"        { comment_caller = YY_START; BEGIN(COMMENT); }
×
354
<VLOG,UDP>"//"           { comment_caller = YY_START; BEGIN(COMMENT); }
53,152✔
355
{PSL_COMMENT}[^ \t\r\n]  { comment_caller = YY_START; BEGIN(COMMENT); }
259✔
356
{PSL_COMMENT}            { if (begin_psl_comment()) {
650✔
357
                              in_psl_comment = true;
1✔
358
                              BEGIN(PSL);
390✔
359
                              TOKEN(tSTARTPSL);
386✔
360
                           }
361
                           else {
362
                              comment_caller = YY_START;
4✔
363
                              BEGIN(COMMENT);
4✔
364
                           }
365
                         }
366

4✔
367
<COMMENT>\n              { BEGIN(comment_caller); }
106,838✔
368
<COMMENT>.*              { }
53,419✔
369

104,066✔
370
"/*"                     { MIN_STD(STD_08, "delimited comments");
50,650✔
371
                           comment_caller = YY_START;
3✔
372
                           BEGIN(C_COMMENT);
3✔
373
                         }
374
<VLOG,UDP>"/*"           { comment_caller = YY_START; BEGIN(C_COMMENT); }
3✔
375
<C_COMMENT>"*/"          { BEGIN(comment_caller); }
7✔
376
<C_COMMENT>\n            { /* Must match a single character */ }
18✔
377
<C_COMMENT>.             { }
11✔
378

4,980✔
379
<PSL>;                   { TOKEN(tSEMI); }
3,170✔
380
<PSL>{PSL_CONT}          { /* Multi-line PSL comment */
625✔
381
                           if (!in_psl_comment) {
28✔
382
                              comment_caller = YY_START;
28✔
383
                              BEGIN(COMMENT);
2✔
384
                           }
385
                         }
386

387
{ENTITY}                 { TOKEN(tENTITY); }
10,531✔
388
{IS}                     { TOKEN(tIS); }
46,003✔
389
{END}                    { TOKEN(tEND); }
41,676✔
390
{GENERIC}                { TOKEN(tGENERIC); }
37,597✔
391
{PORT}                   { TOKEN(tPORT); }
44,177✔
392
{COMPONENT}              { TOKEN(tCOMPONENT); }
2,952✔
393
{CONFIGURATION}          { TOKEN(tCONFIGURATION); }
2,744✔
394
{ARCHITECTURE}           { TOKEN(tARCHITECTURE); }
10,170✔
395
{OF}                     { TOKEN(tOF); }
8,318✔
396
{BEGIN}                  { TOKEN(tBEGIN); }
29,033✔
397
{IN}                     { TOKEN(tIN); }
19,798✔
398
{OUT}                    { TOKEN(tOUT); }
22,544✔
399
{BUFFER}                 { TOKEN(tBUFFER); }
11,732✔
400
{BUS}                    { TOKEN(tBUS); }
2,883✔
401
{REGISTER}               { TOKEN(tREGISTER); }
12✔
402
{UNAFFECTED}             { TOKEN(tUNAFFECTED); }
45✔
403
{PROCESS}                { TOKEN(tPROCESS); }
9,522✔
404
{WAIT}                   { TOKEN(tWAIT); }
9,329✔
405
{REPORT}                 { TOKEN(tREPORT); }
17,853✔
406
{INOUT}                  { TOKEN(tINOUT); }
10,980✔
407
{LINKAGE}                { TOKEN(tLINKAGE); }
8,341✔
408
{FOR}                    { TOKEN(tFOR); }
10,021✔
409
{TYPE}                   { TOKEN(tTYPE); }
5,451✔
410
{SUBTYPE}                { TOKEN(tSUBTYPE); }
9,895✔
411
{UNITS}                  { TOKEN(tUNITS); }
5,538✔
412
{PACKAGE}                { TOKEN(tPACKAGE); }
6,047✔
413
{LIBRARY}                { TOKEN(tLIBRARY); }
1,154✔
414
{USE}                    { TOKEN(tUSE); }
7,659✔
415
{FUNCTION}               { TOKEN(tFUNCTION); }
19,973✔
416
{IMPURE}                 { TOKEN(tIMPURE); }
3,996✔
417
{PURE}                   { TOKEN(tPURE); }
18,949✔
418
{RETURN}                 { TOKEN(tRETURN); }
27,649✔
419
{ARRAY}                  { TOKEN(tARRAY); }
2,508✔
420
{OTHERS}                 { TOKEN(tOTHERS); }
29,732✔
421
{ASSERT}                 { TOKEN(tASSERT); }
19,851✔
422
{SEVERITY}               { TOKEN(tSEVERITY); }
9,351✔
423
{ON}                     { TOKEN(tON); }
17,716✔
424
{MAP}                    { TOKEN(tMAP); }
8,827✔
425
{IF}                     { TOKEN(tIF); }
17,934✔
426
{THEN}                   { TOKEN(tTHEN); }
12,051✔
427
{ELSE}                   { TOKEN(tELSE); }
20,151✔
428
{ELSIF}                  { TOKEN(tELSIF); }
10,549✔
429
{BODY}                   { TOKEN(tBODY); }
4,376✔
430
{WHILE}                  { TOKEN(tWHILE); }
1,101✔
431
{LOOP}                   { TOKEN(tLOOP); }
7,858✔
432
{AFTER}                  { TOKEN(tAFTER); }
1,075✔
433
{ALIAS}                  { TOKEN(tALIAS); }
7,600✔
434
{ATTRIBUTE}              { TOKEN(tATTRIBUTE); }
1,333✔
435
{PROCEDURE}              { TOKEN(tPROCEDURE); }
6,515✔
436
{POSTPONED}              { TOKEN(tPOSTPONED); }
502✔
437
{EXIT}                   { TOKEN(tEXIT); }
5,267✔
438
{WHEN}                   { TOKEN(tWHEN); }
3,304✔
439
{CASE}                   { TOKEN(tCASE); }
1,422✔
440
{TRANSPORT}              { TOKEN(tTRANSPORT); }
3,324✔
441
{REJECT}                 { TOKEN(tREJECT); }
1,118✔
442
{INERTIAL}               { TOKEN(tINERTIAL); }
89✔
443
{BLOCK}                  { TOKEN(tBLOCK); }
766✔
444
{WITH}                   { TOKEN(tWITH); }
85✔
445
{SELECT}                 { TOKEN(tSELECT); }
813✔
446
{GENERATE}               { TOKEN(tGENERATE); }
751✔
447
{ACCESS}                 { TOKEN(tACCESS); }
378✔
448
{FILE}                   { TOKEN(tFILE); }
973✔
449
{OPEN}                   { TOKEN(tOPEN); }
485✔
450
{RECORD}                 { TOKEN(tRECORD); }
2,665✔
451
{NEW}                    { TOKEN(tNEW); }
1,138✔
452
{SHARED}                 { TOKEN(tSHARED); }
2,561✔
453
{NEXT}                   { TOKEN(tNEXT); }
1,069✔
454
{LITERAL}                { TOKEN(tLITERAL); }
190✔
455
{GROUP}                  { TOKEN(tGROUP); }
101✔
456
{LABEL}                  { TOKEN(tLABEL); }
16✔
457
{GUARDED}                { TOKEN(tGUARDED); }
28✔
458
{DISCONNECT}             { TOKEN(tDISCONNECT); }
17✔
459
{REVRANGE}               { TOKEN(tREVRANGE); }
71✔
460
{PROTECTED}              { TOKEN_00(tPROTECTED); }
839✔
461
{CONTEXT}                { TOKEN_08(tCONTEXT); }
109✔
462
{FORCE}                  { TOKEN_08(tFORCE); }
886✔
463
{RELEASE}                { TOKEN_08(tRELEASE); }
98✔
464
{PARAMETER}              { TOKEN_08(tPARAMETER); }
110✔
465
{DEFAULT}                { TOKEN_08(tDEFAULT); }
64✔
466
{COVER}                  { TOKEN_08(tCOVER); }
51✔
467
{VIEW}                   { TOKEN_19(tVIEW); }
242✔
468
{PRIVATE}                { TOKEN_19(tPRIVATE); }
35✔
469

214✔
470
`{IF}                    { TOKEN(tCONDIF); }
87✔
471
`{ELSE}                  { TOKEN(tCONDELSE); }
66✔
472
`{ELSIF}                 { TOKEN(tCONDELSIF); }
4✔
473
`{END}                   { TOKEN(tCONDEND); }
66✔
474
`{ERROR}                 { TOKEN(tCONDERROR); }
8✔
475
`{WARNING}               { TOKEN(tCONDWARN); }
60✔
476

4✔
477
<INITIAL,PSL>{AND}       { TOKEN(tAND); }
5,874✔
478
<INITIAL,PSL>{OR}        { TOKEN(tOR); }
7,727✔
479
<INITIAL,PSL>{XOR}       { TOKEN(tXOR); }
345✔
480
<INITIAL,PSL>{XNOR}      { TOKEN(tXNOR); }
2,000✔
481
<INITIAL,PSL>{NAND}      { TOKEN(tNAND); }
492✔
482
<INITIAL,PSL>{NOR}       { TOKEN(tNOR); }
292✔
483
<INITIAL,PSL>{ABS}       { TOKEN(tABS); }
395✔
484
<INITIAL,PSL>{NOT}       { TOKEN(tNOT); }
3,220✔
485
<INITIAL,PSL>{ALL}       { TOKEN(tALL); }
4,170✔
486
<INITIAL,PSL>{TICK}      { TOKEN(tTICK); }
29,718✔
487
<INITIAL,PSL>{SLL}       { TOKEN(tSLL); }
3,958✔
488
<INITIAL,PSL>{SRL}       { TOKEN(tSRL); }
26,681✔
489
<INITIAL,PSL>{SLA}       { TOKEN(tSLA); }
62✔
490
<INITIAL,PSL>{SRA}       { TOKEN(tSRA); }
64✔
491
<INITIAL,PSL>{ROL}       { TOKEN(tROL); }
122✔
492
<INITIAL,PSL>{ROR}       { TOKEN(tROR); }
122✔
493
<INITIAL,PSL>{REM}       { TOKEN(tREM); }
247✔
494
<INITIAL,PSL>{MOD}       { TOKEN(tMOD); }
380✔
495
<INITIAL,PSL>{NULL}      { TOKEN(tNULL); }
579✔
496
<INITIAL,PSL>{RANGE}     { TOKEN(tRANGE); }
5,162✔
497
<INITIAL,PSL>{TO}        { TOKEN(tTO); }
7,745✔
498
<INITIAL,PSL>{DOWNTO}    { TOKEN(tDOWNTO); }
12,027✔
499
<INITIAL,PSL>{UNTIL}     { TOKEN(tUNTIL); }
7,603✔
500
<INITIAL,PSL>{CONSTANT}  { TOKEN(tCONSTANT); }
19,053✔
501
<INITIAL,PSL>{SIGNAL}    { TOKEN(tSIGNAL); }
6,857✔
502
<INITIAL,PSL>{VARIABLE}  { TOKEN(tVARIABLE); }
22,832✔
503

6,571✔
504
<UDP>{UDP_LEVEL}         { yylval.i64 = yytext[0]; return tUDPLEVEL; }
11,239✔
505
<UDP>{UDP_EDGE}          { yylval.i64 = yytext[0]; return tUDPEDGE; }
315✔
506
<UDP>{UDP_INDICATOR}     { yylval.str = xstrdup(yytext); return tUDPIND; }
57✔
507

10✔
508
<*>"("                   { TOKEN(tLPAREN); }
105,954✔
509
<*>")"                   { TOKEN(tRPAREN); }
211,791✔
510
<*>"["                   { TOKEN(tLSQUARE); }
830✔
511
<*>"]"                   { TOKEN(tRSQUARE); }
106,780✔
512
<*>"{"                   { TOKEN(tLBRACE); }
1,059✔
513
<*>"}"                   { TOKEN(tRBRACE); }
1,115✔
514
<*>","                   { TOKEN(tCOMMA); }
70,162✔
515
<*>";"                   { TOKEN(tSEMI); }
181,784✔
516
<*>":"                   { TOKEN(tCOLON); }
136,958✔
517
<*>"<"                   { TOKEN(tLT); }
184,040✔
518
<*>">"                   { TOKEN(tGT); }
68,541✔
519
<*>"+"                   { TOKEN(tPLUS); }
6,399✔
520
<*>"-"                   { TOKEN(tMINUS); }
15,691✔
521
<*>"*"                   { TOKEN(tTIMES); }
5,734✔
522
<*>"@"                   { TOKEN(tAT); }
14,257✔
523
<*>"?"                   { TOKEN(tQUESTION); }
1,899✔
524
<*>"{"                   { TOKEN(tLBRACE); }
82✔
525
<*>"}"                   { TOKEN(tRBRACE); }
79✔
526
<*>"/"                   { TOKEN(tOVER); }
931✔
527
<*>"."                   { TOKEN(tDOT); }
19,665✔
528
<*>"&"                   { TOKEN(tAMP); }
3,508✔
529
<*>"|"                   { TOKEN(tBAR); }
20,546✔
530
<*>"["                   { TOKEN(tLSQUARE); }
2,577✔
531
<*>"]"                   { TOKEN(tRSQUARE); }
881✔
532
<*>"="                   { TOKEN(tEQ); }
23,725✔
533
<*>"#"                   { TOKEN(tHASH); }
183✔
534
<*>"~"                   { TOKEN(tTILDE); }
23,749✔
535
<*>"[["                  { TOKEN(t2LSQUARE); }
187✔
536
<*>"]]"                  { TOKEN(t2RSQUARE); }
28✔
537

4✔
538
<INITIAL,PSL>"!"         { TOKEN(tBAR); }
6✔
539
<VLOG>"!"                { TOKEN(tBANG); }
19✔
540

305✔
541
<INITIAL,PSL>"**"        { TOKEN(tPOWER); }
305✔
542
<INITIAL,PSL>":="        { TOKEN(tWALRUS); }
32,023✔
543
<INITIAL,PSL>"<>"        { TOKEN(tBOX); }
2,136✔
544
<INITIAL,PSL>"?<"        { TOKEN_08(tMLT); }
31,793✔
545
<INITIAL,PSL>"?<="       { TOKEN_08(tMLE); }
2,195✔
546
<INITIAL,PSL>"?>"        { TOKEN_08(tMGT); }
114✔
547
<INITIAL,PSL>"?>="       { TOKEN_08(tMGE); }
114✔
548
<INITIAL,PSL>"??"        { TOKEN_08(tCCONV); }
58✔
549
<INITIAL,PSL>"/="        { TOKEN(tNEQ); }
1,156✔
550
<INITIAL,PSL>"?/="       { TOKEN_08(tMNEQ); }
66✔
551
<INITIAL,PSL>"?="        { TOKEN_08(tMEQ); }
1,198✔
552
<INITIAL,PSL>"<<"        { TOKEN(tLTLT); }
247✔
553
<INITIAL,PSL>">>"        { TOKEN(tGTGT); }
280✔
554
<INITIAL,PSL>"^"         { TOKEN(tCARET); }
233✔
555

183✔
556
<INITIAL,PSL,VLOG>"<="   { TOKEN(tLE); }
8,233✔
557
<INITIAL,PSL,VLOG>">="   { TOKEN(tGE); }
9,027✔
558
<INITIAL,PSL,VLOG>"=>"   { TOKEN(tASSOC); }
14,472✔
559

844✔
560
<PSL>{ASSERT}            { TOKEN(tASSERT); }
14,638✔
561
<PSL>{ASSUME}            { TOKEN(tASSUME); }
169✔
562
<PSL>{ASSUME_G}          { TOKEN(tASSUMEG); }
1✔
563
<PSL>{RESTRICT}          { TOKEN(tRESTRICT); }
6✔
564
<PSL>{RESTRICT_G}        { TOKEN(tRESTRICTG); }
2✔
565
<PSL>{STRONG}            { TOKEN(tSTRONG); }
4✔
566
<PSL>{FAIRNESS}          { TOKEN(tFAIRNESS); }
4✔
567
<PSL>{COVER}             { TOKEN(tCOVER); }
120✔
568
<PSL>{PROPERTY}          { TOKEN(tPROPERTY); }
25✔
569
<PSL>{SEQUENCE}          { TOKEN(tSEQUENCE); }
125✔
570
<PSL>{CONST}             { TOKEN(tCONST); }
32✔
571
<PSL>{MUTABLE}           { TOKEN(tMUTABLE); }
12✔
572
<PSL>{HDLTYPE}           { TOKEN(tHDLTYPE); }
17✔
573
<PSL>{BOOLEAN}           { TOKEN(tBOOLEAN); }
8✔
574
<PSL>{BIT}               { TOKEN(tBIT); }
9✔
575
<PSL>{BITVECTOR}         { TOKEN(tBITVECTOR); }
4✔
576
<PSL>{NUMERIC}           { TOKEN(tNUMERIC); }
5✔
577
<PSL>{STRING_K}          { TOKEN(tSTRINGK); }
4✔
578
<PSL>{ALWAYS}            { TOKEN(tALWAYS); }
143✔
579
<PSL>{DEFAULT}           { TOKEN(tDEFAULT); }
64✔
580
<PSL>{CLOCK}             { TOKEN(tCLOCK); }
224✔
581
<PSL>{IS}                { TOKEN(tIS); }
173✔
582
<PSL>{IN}                { TOKEN(tIN); }
85✔
583
<PSL>{FOR}               { TOKEN(tFOR); }
112✔
584
<PSL>"->"                { TOKEN(tIFIMPL); }
112✔
585
<PSL>"<->"               { TOKEN(tIFFIMPL); }
7✔
586
<PSL>{NEXT}              { TOKEN(tPSLNEXT); }
194✔
587
<PSL>{NEXT}!             { TOKEN(tNEXT1); }
7✔
588
<PSL>{NEVER}             { TOKEN(tNEVER); }
93✔
589
<PSL>{EVENTUALLY}!       { TOKEN(tEVENTUALLY); }
9✔
590
<PSL>{NEXT_A}            { TOKEN(tNEXTA); }
12✔
591
<PSL>{NEXT_A}!           { TOKEN(tNEXTA1); }
8✔
592
<PSL>{NEXT_E}            { TOKEN(tNEXTE); }
3✔
593
<PSL>{NEXT_E}!           { TOKEN(tNEXTE1); }
×
594
<PSL>{NEXT_EVENT}        { TOKEN(tNEXTEVENT); }
2✔
595
<PSL>{NEXT_EVENT}!       { TOKEN(tNEXTEVENT1); }
×
596
<PSL>"[*"                { TOKEN(tTIMESRPT); }
33✔
597
<PSL>"[+]"               { TOKEN(tPLUSRPT); }
9✔
598
<PSL>"[="                { TOKEN(tEQRPT); }
48✔
599
<PSL>"[->"               { TOKEN(tGOTORPT); }
18✔
600
<PSL>"&&"                { TOKEN(tDBLAMP); }
26✔
601
<PSL>{WITHIN}            { TOKEN(tWITHIN); }
10✔
602
<PSL>{PREV}              { TOKEN(tPREV); }
41✔
603
<PSL>{STABLE}            { TOKEN(tSTABLE); }
4✔
604
<PSL>{ROSE}              { TOKEN(tROSE); }
36✔
605
<PSL>{FELL}              { TOKEN(tFELL); }
6✔
606
<PSL>{ENDED}             { TOKEN(tENDED); }
6✔
607
<PSL>{NONDET}            { TOKEN(tNONDET); }
3✔
608
<PSL>{NONDET_V}          { TOKEN(tNONDETV); }
1✔
609
<PSL>{UNION}             { TOKEN(tUNION); }
×
610
<PSL>{UNTIL}!            { TOKEN(tUNTIL1); }
2✔
611
<PSL>{UNTIL}_            { TOKEN(tUNTIL_); }
12✔
612
<PSL>{UNTIL}_!           { TOKEN(tUNTIL1_); }
3✔
613
<PSL>{ABORT}             { TOKEN(tABORT); }
15✔
614
<PSL>{ASYNC_ABORT}       { TOKEN(tASYNC_ABORT); }
4✔
615
<PSL>{SYNC_ABORT}        { TOKEN(tSYNC_ABORT); }
6✔
616
<PSL>{BEFORE}            { TOKEN(tBEFORE); }
8✔
617
<PSL>{BEFORE}!           { TOKEN(tBEFORE1); }
4✔
618
<PSL>{BEFORE}_           { TOKEN(tBEFORE_); }
8✔
619
<PSL>{BEFORE}!_          { TOKEN(tBEFORE1_); }
1✔
620
<PSL>"|->"               { TOKEN(tSUFFIXOVR); }
8✔
621
<PSL>"|=>"               { TOKEN(tSUFFIXNON); }
6✔
622
<PSL>{INF}               { TOKEN(tINF); }
11✔
623
<PSL>{ENDPOINT}          { TOKEN(tENDPOINT); }
7✔
624

6✔
625
<VLOG>"module"           { return tMODULE; }
111✔
626
<VLOG>"endmodule"        { return tENDMODULE; }
219✔
627
<VLOG>"input"            { return tINPUT; }
72✔
628
<VLOG>"output"           { return tOUTPUT; }
164✔
629
<VLOG>"inout"            { return tINOUT; }
73✔
630
<VLOG>"reg"              { return tREG; }
180✔
631
<VLOG>"always"           { return tALWAYS; }
74✔
632
<VLOG>"posedge"          { return tPOSEDGE; }
148✔
633
<VLOG>"negedge"          { return tNEGEDGE; }
76✔
634
<VLOG>"initial"          { return tINITIAL; }
101✔
635
<VLOG>"begin"            { return tBEGIN; }
189✔
636
<VLOG>"end"              { return tEND; }
264✔
637
<VLOG>"wire"             { return tWIRE; }
254✔
638
<VLOG>"tri"              { return tTRI; }
187✔
639
<VLOG>"tri0"             { return tTRI0; }
69✔
640
<VLOG>"tri1"             { return tTRI1; }
2✔
641
<VLOG>"wand"             { return tWAND; }
2✔
642
<VLOG>"triand"           { return tTRIAND; }
2✔
643
<VLOG>"wor"              { return tWOR; }
2✔
644
<VLOG>"trior"            { return tTRIOR; }
2✔
645
<VLOG>"trireg"           { return tTRIREG; }
2✔
646
<VLOG>"uwire"            { return tUWIRE; }
2✔
647
<VLOG>"none"             { return tNONE; }
2✔
648
<VLOG>"assign"           { return tASSIGN; }
48✔
649
<VLOG>"if"               { return tIF; }
127✔
650
<VLOG>"else"             { return tELSE; }
88✔
651
<VLOG>"`timescale"       { return tTIMESCALE; }
135✔
652
<VLOG>"`default_nettype" { return tDEFNETTYPE; }
53✔
653
<VLOG>"`celldefine"      { }
9✔
654
<VLOG>"`endcelldefine"   { }
12✔
655
<VLOG>"`begin_keywords"  { return tBEGINKEYWORDS; }
1✔
656
<VLOG>"`end_keywords"    { return tENDKEYWORDS; }
1✔
657
<VLOG>"`__nvc_push"      { return tNVCPUSH; }
12✔
658
<VLOG>"`__nvc_pop"       { return tNVCPOP; }
12✔
659
<VLOG>"supply0"          { return tSUPPLY0; }
21✔
660
<VLOG>"supply1"          { return tSUPPLY1; }
20✔
661
<VLOG>"pulldown"         { return tPULLDOWN; }
17✔
662
<VLOG>"pullup"           { return tPULLUP; }
21✔
663
<VLOG>"forever"          { return tFOREVER; }
10✔
664
<VLOG>"=="               { return tLOGEQ; }
21✔
665
<VLOG>"!="               { return tLOGNEQ; }
3✔
666
<VLOG>"==="              { return tCASEEQ; }
23✔
667
<VLOG>"!=="              { return tCASENEQ; }
87✔
668
<VLOG>"||"               { return tLOGOR; }
31✔
669
<VLOG>"&&"               { return tDBLAMP; }
91✔
670
<VLOG>"<<"               { return tSHIFTLL; }
18✔
671
<VLOG>">>"               { return tSHIFTRL; }
5✔
672
<VLOG>"<<<"              { return tSHIFTLA; }
2✔
673
<VLOG>">>>"              { return tSHIFTRA; }
2✔
674
<VLOG>"(*"               { return tATTRBEGIN; }
7✔
675
<VLOG>"*)"               { return tATTREND; }
7✔
676
<VLOG>"%"                { return tPERCENT; }
7✔
677
<VLOG>"++"               { return tPLUSPLUS; }
7✔
678
<VLOG>"--"               { return tMINUSMINUS; }
2✔
679
<VLOG>"var"              { return tVAR; }
2✔
680
<VLOG>"specify"          { return tSPECIFY; }
2✔
681
<VLOG>"endspecify"       { return tENDSPECIFY; }
2✔
682
<VLOG>"primitive"        { return tPRIMITIVE; }
17✔
683
<VLOG>"endprimitive"     { return tENDPRIMITIVE; }
17✔
684
<VLOG>"table"            { return tTABLE; }
32✔
685
<VLOG,UDP>"endtable"     { return tENDTABLE; }
32✔
686
<VLOG>"and"              { return tAND; }
20✔
687
<VLOG>"nand"             { return tNAND; }
19✔
688
<VLOG>"or"               { return tOR; }
28✔
689
<VLOG>"nor"              { return tNOR; }
3✔
690
<VLOG>"xor"              { return tXOR; }
27✔
691
<VLOG>"xnor"             { return tXNOR; }
×
692
<VLOG>"not"              { return tNOT; }
6✔
693
<VLOG>"buf"              { return tBUF; }
×
694
<VLOG>"struct"           { return tSTRUCT; }
6✔
695
<VLOG>"packed"           { return tPACKED; }
×
696
<VLOG>"void"             { return tVOID; }
3✔
697
<VLOG>"byte"             { return tBYTE; }
1✔
698
<VLOG>"shortint"         { return tSHORTINT; }
×
699
<VLOG>"longint"          { return tLONGINT; }
1✔
700
<VLOG>"int"              { return tSVINT; }
10✔
701
<VLOG>"integer"          { return tINTEGER; }
2✔
702
<VLOG>"real"             { return tSVREAL; }
13✔
703
<VLOG>"shortreal"        { return tSHORTREAL; }
3✔
704
<VLOG>"realtime"         { return tREALTIME; }
4✔
705
<VLOG>"time"             { return tTIME; }
1✔
706
<VLOG>"typedef"          { return tTYPEDEF; }
4✔
707
<VLOG>"bit"              { return tBIT; }
×
708
<VLOG>"logic"            { return tLOGIC; }
7✔
709
<VLOG>"enum"             { return tENUM; }
2✔
710
<VLOG>"union"            { return tUNION; }
6✔
711
<VLOG>"tagged"           { return tTAGGED; }
2✔
712
<VLOG>"while"            { return tWHILE; }
6✔
713
<VLOG>"repeat"           { return tREPEAT; }
2✔
714
<VLOG>"do"               { return tDO; }
6✔
715
<VLOG>"task"             { return tTASK; }
4✔
716
<VLOG>"endtask"          { return tENDTASK; }
4✔
717
<VLOG>"function"         { return tFUNCTION; }
3✔
718
<VLOG>"endfunction"      { return tENDFUNCTION; }
3✔
719
<VLOG>"wait"             { return tWAIT; }
2✔
720
<VLOG>"parameter"        { return tPARAMETER; }
4✔
721
<VLOG>"for"              { return tFOR; }
5✔
722

3✔
723
<VLOG>{SYSTASK}          { yylval.str = xstrdup(yytext); return tSYSTASK; }
434✔
724
<VLOG>{VLOG_ID}          { yylval.str = xstrdup(yytext); return tID; }
2,234✔
725
<VLOG>{INTEGER}          { yylval.str = xstrdup(yytext); return tUNSIGNED; }
717✔
726
<VLOG>{VLOG_STRING}      { return escape_verilog_string(yytext); }
2,103✔
727
<VLOG>{VLOG_NUMBER}      { yylval.str = xstrdup(yytext); return tNUMBER; }
773✔
728
<VLOG>{VLOG_REAL}        { return parse_verilog_real(yytext); };
305✔
729

56✔
730
<INITIAL,PSL>{DECIMAL}   { return parse_decimal_literal(yytext); }
86,831✔
731
<INITIAL,PSL>{BASED}     { return parse_based_literal(yytext); }
86,894✔
732
<INITIAL,PSL>{BITSTRING} { return parse_bit_string(yytext); }
2,283✔
733
<INITIAL,PSL>{STRING}    { return parse_string(yytext); }
30,728✔
734
<INITIAL,PSL>{BADSTRING} { return report_unterminated_string(yytext); }
2,286✔
735
<INITIAL,PSL>{CHAR}      { if (resolve_ir1045()) {
50,115✔
736
                              yylval.ident = ident_new(yytext);
19,443✔
737
                              TOKEN(tID);
38,896✔
738
                           }
739
                           REJECT;
16✔
740
                         }
741

×
742
% /* These PSL tokens must be scanned in VHDL mode for look-ahead */
×
743
"->"                     { TOKEN(tIFIMPL); }
×
744
"<->"                    { TOKEN(tIFFIMPL); }
×
745
"[*"                     { TOKEN(tTIMESRPT); }
×
746
"[+]"                    { TOKEN(tPLUSRPT); }
×
747
"[="                     { TOKEN(tEQRPT); }
×
748
"[->"                    { TOKEN(tGOTORPT); }
×
749
{UNTIL}!                 { TOKEN(tUNTIL1); }
×
750
{UNTIL}_                 { TOKEN(tUNTIL_); }
×
751
{UNTIL}!_                { TOKEN(tUNTIL1_); }
×
752

×
753
% /* These VHDL tokens must be scanned in PSL mode for look-ahead */
×
754
<PSL>{SEVERITY}          { TOKEN(tSEVERITY); }
×
755
<PSL>{REPORT}            { TOKEN(tREPORT); }
94✔
756

×
757

94✔
758
% /* SDF rules separated from rest for better maintainability */
×
759

×
760
% /* SDF hierarchical_identifier may conflict with SDF keywords ->
×
761
     Must be scanned in separate mode! Tokens that may be lookahead
×
762
     after an identifier must be scanned too. */
763
<SDF,SDF_EXPR>"!"       { TOKEN(tBANG); }
3✔
764
<SDF,SDF_EXPR>{TICK}    { TOKEN(tTICK); }
×
765
<SDF,SDF_EXPR>"<<"      { TOKEN(tLTLT); }
4✔
766
<SDF,SDF_EXPR>">>"      { TOKEN(tGTGT); }
1✔
767
<SDF,SDF_EXPR>"<="      { TOKEN(tLE); }
2✔
768
<SDF,SDF_EXPR>">="      { TOKEN(tGE); }
2✔
769
<SDF,SDF_EXPR>"&&"      { TOKEN(tDBLAMP); }
2✔
770
<SDF,SDF_EXPR>"~&"      { TOKEN(tTILDEAMP); }
2✔
771
<SDF,SDF_EXPR>"~|"      { TOKEN(tTILDEBAR); }
2✔
772
<SDF,SDF_EXPR>"^~"      { TOKEN(tTILDECARET); }
3✔
773
<SDF,SDF_EXPR>"~^"      { TOKEN(tTILDECARET); }
3✔
774
<SDF,SDF_EXPR>"%"       { TOKEN(tPERCENT); }
3✔
775
<SDF,SDF_EXPR>"||"      { TOKEN(tLOGOR); }
3✔
776
<SDF,SDF_EXPR>"^"       { TOKEN(tCARET); }
3✔
777
<SDF,SDF_EXPR>"=="      { TOKEN(tLOGEQ); }
6✔
778
<SDF,SDF_EXPR>"!="      { TOKEN(tLOGNEQ); }
4✔
779
<SDF,SDF_EXPR>"==="     { TOKEN(tCASEEQ); }
7✔
780
<SDF,SDF_EXPR>"!=="     { TOKEN(tCASENEQ); }
4✔
781

2✔
782
<SDF,SDF_EXPR>"//"      { comment_caller = YY_START; BEGIN(COMMENT); }
2✔
783
<SDF,SDF_EXPR>"/*"      { comment_caller = YY_START;
1✔
784
                          BEGIN(C_COMMENT);
2✔
785
                        }
1✔
786

1✔
787
<SDF,SDF_EXPR>{SCALAR_ZERO}   { TOKEN(tSCALARZERO); }
2✔
788
<SDF,SDF_EXPR>{SCALAR_ONE}    { TOKEN(tSCALARONE); }
4✔
789

2✔
790
% /* TODO: Crosscheck SDF definition of decimal */
2✔
791
<SDF,SDF_EXPR>{DECIMAL} { return parse_decimal_literal(yytext); }
148✔
792

148✔
793
% /* VLOG_STRING is defined almost equally as SDF qstring */
148✔
794
<SDF>{VLOG_STRING}     { return parse_string(yytext); }
62✔
795

86✔
796
<SDF>{DELAYFILE}        { TOKEN(tDELAYFILE); }
86✔
797
<SDF>{SDFVERSION}       { TOKEN(tSDFVERSION); }
48✔
798
<SDF>{DESIGN}           { TOKEN(tDESIGN); }
2✔
799
<SDF>{DATE}             { TOKEN(tDATE); }
26✔
800
<SDF>{VENDOR}           { TOKEN(tVENDOR); }
3✔
801
<SDF>{PROGRAM}          { TOKEN(tPROGRAM); }
3✔
802
<SDF>{VERSION}          { TOKEN(tVERSION); }
2✔
803
<SDF>{DIVIDER}          { TOKEN(tDIVIDER); }
3✔
804
<SDF>{VOLTAGE}          { TOKEN(tVOLTAGE); }
2✔
805
<SDF>{PROCESS}          { TOKEN(tPROCESS); }
3✔
806
<SDF>{TEMPERATURE}      { TOKEN(tTEMPERATURE); }
2✔
807
<SDF>{TIMESCALE}        { TOKEN(tTIMESCALE); }
2✔
808
<SDF>{CELL}             { TOKEN(tCELL); }
24✔
809
<SDF>{CELLTYPE}         { TOKEN(tCELLTYPE); }
24✔
810
<SDF>{INSTANCE}         { TOKEN(tINSTANCE); }
49✔
811
<SDF>{DELAY}            { TOKEN(tDELAY); }
35✔
812
<SDF>{ABSOLUTE}         { TOKEN(tABSOLUTE); }
38✔
813
<SDF>{PATHPULSE}        { TOKEN(tPATHPULSE); }
15✔
814
<SDF>{PATHPULSEP}       { TOKEN(tPATHPULSEP); }
13✔
815
<SDF>{INCREMENT}        { TOKEN(tINCREMENT); }
5✔
816
<SDF>{IOPATH}           { TOKEN(tIOPATH); }
55✔
817
<SDF>"posedge"          { TOKEN(tPOSEDGE); }
4✔
818
<SDF>"negedge"          { TOKEN(tNEGEDGE); }
56✔
819
<SDF>{SETUP}            { TOKEN(tSETUP); }
3✔
820
<SDF>{HOLD}             { TOKEN(tHOLD); }
3✔
821
<SDF>{SETUPHOLD}        { TOKEN(tSETUPHOLD); }
6✔
822
<SDF>{RECOVERY}         { TOKEN(tRECOVERY); }
2✔
823
<SDF>{REMOVAL}          { TOKEN(tREMOVAL); }
6✔
824
<SDF>{RECREM}           { TOKEN(tRECREM); }
3✔
825
<SDF>{WIDTH}            { TOKEN(tWIDTH); }
3✔
826
<SDF>{PERIOD}           { TOKEN(tPERIOD); }
3✔
827
<SDF>{SKEW}             { TOKEN(tSKEW); }
3✔
828
<SDF>{BIDIRSKEW}        { TOKEN(tBIDIRSKEW); }
2✔
829
<SDF>{NOCHANGE}         { TOKEN(tNOCHANGE); }
2✔
830
<SDF>{PORT}             { TOKEN(tPORT); }
3✔
831
<SDF>{INTERCONNECT}     { TOKEN(tINTERCONNECT); }
3✔
832
<SDF>{NETDELAY}         { TOKEN(tNETDELAY); }
4✔
833
<SDF>{DEVICE}           { TOKEN(tDEVICE); }
6✔
834
<SDF>{COND}             { TOKEN(tSDFCOND); }
45✔
835
<SDF>{CONDELSE}         { TOKEN(tSDFCONDELSE); }
5✔
836
<SDF>{PATHCONSTRAINT}   { TOKEN(tPATHCONSTR); }
45✔
837
<SDF>{PERIODCONSTRAINT} { TOKEN(tPERIODCONSTR); }
3✔
838
<SDF>{SUM}              { TOKEN(tSUM); }
4✔
839
<SDF>{DIFF}             { TOKEN(tDIFF); }
4✔
840
<SDF>{SKEWCONSTRAINT}   { TOKEN(tSKEWCONSTR); }
3✔
841
<SDF>{ARRIVAL}          { TOKEN(tARRIVAL); }
2✔
842
<SDF>{DEPARTURE}        { TOKEN(tDEPARTURE); }
1✔
843
<SDF>{SLACK}            { TOKEN(tSLACK); }
×
844
<SDF>{WAVEFORM}         { TOKEN(tWAVEFORM); }
×
845
<SDF>{NAME}             { TOKEN(tNAME); }
1✔
846
<SDF>{EXCEPTION}        { TOKEN(tEXCEPTION); }
1✔
847
<SDF>{LABEL}            { TOKEN(tLABEL); }
2✔
848
<SDF>{TIMINGCHECK}      { TOKEN(tTIMINGCHECK); }
4✔
849
<SDF>{TIMINGENV}        { TOKEN(tTIMINGENV); }
2✔
850
<SDF>{RETAIN}           { TOKEN(tRETAIN); }
4✔
851
<SDF>{SCOND}            { TOKEN(tSCOND); }
4✔
852
<SDF>{CCOND}            { TOKEN(tCCOND); }
4✔
853

3✔
854
<SDF,SDF_EXPR>{SDF_ID}  { yylval.str = xstrdup(yytext); TOKEN(tID); }
468✔
855

465✔
856

1✔
857
<INITIAL,PSL>{UTF8_MB}   { warn_utf8(yytext); REJECT; }
1✔
858

463,343✔
859
<INITIAL,PSL>{VHDL_ID}   { return parse_id(yytext); }
463,343✔
860
{EXID}                   { return parse_ex_id(yytext); }
463,375✔
861
<INITIAL,PSL>{BAD_ID}    { return report_bad_identifier(yytext); }
5✔
862
<*>{SPACE}               { }
32✔
863
<*>"\n"                  { /* Must match a single character */ }
5✔
864
<*><<EOF>>               { return 0; }
1,085,610✔
865
<*>.                     { TOKEN(tERROR); }
4✔
866

330,030✔
867
%%
4✔
868

×
869
static int resolve_ir1045(void)
19,456✔
870
{
871
   // See here for discussion:
872
   //   http://www.eda-stds.org/isac/IRs-VHDL-93/IR1045.txt
873
   // The set of tokens that may precede a character literal is
874
   // disjoint from that which may precede a single tick token.
875

876
   switch (last_token) {
19,456✔
877
   case tRSQUARE:
878
   case tRPAREN:
879
   case tALL:
880
   case tID:
881
      // Cannot be a character literal
882
      return 0;
883
   default:
19,440✔
884
      return 1;
19,440✔
885
   }
886
}
887

888
static bool begin_psl_comment(void)
390✔
889
{
890
   static bool printed = false;
390✔
891

892
   if (opt_get_int(OPT_PSL_COMMENTS))
390✔
893
      return true;
894
   else if (!printed) {
4✔
895
      // TODO: enable this once PSL support is complete
896
      // note_at(&yylloc, "pass $bold$--psl$$ to enable parsing of PSL "
897
      //   "directives in comments");
898
      printed = true;
2✔
899
      return false;
2✔
900
   }
901
   else
902
      return false;
903
}
904

905
static int parse_id(char *str)
463,350✔
906
{
907
   for (char *p = str; *p; p++)
3,265,259✔
908
      *p = toupper_iso88591(*p);
2,801,909✔
909

910
   yylval.ident = ident_new(str);
463,350✔
911
   TOKEN(tID);
463,350✔
912
}
913

914
static int parse_ex_id(char *str)
32✔
915
{
916
   // Replace double '\\' character by single '\\'
917
   char *p = str + 1;
32✔
918
   for (char *s = p; *s; ) {
198✔
919
      if (*s == '\\' && *(s + 1) == '\\') s++;
166✔
920
      *p++ = *s++;
166✔
921
   }
922
   *p = '\0';
32✔
923

924
   yylval.ident = ident_new(str);
32✔
925
   TOKEN(tID);
32✔
926
}
927

928
static void strip_underscores(char *s)
87,042✔
929
{
930
   bool error = false;
87,042✔
931
   char *p;
87,042✔
932
   for (p = s; *s; s++) {
440,767✔
933
      if (*s != '_')
353,725✔
934
         *p++ = *s;
353,509✔
935
      else if ((s[1] == '\0' || s[1] == '_') && !error) {
216✔
936
         error_at(&yylloc, "a literal may not end with an underscore or "
2✔
937
                  "contain multiple consecutive underscores");
938
         error = true;
2✔
939
      }
940
   }
941
   *p = '\0';
87,042✔
942
}
87,042✔
943

944
static int parse_decimal_literal(const char *str)
86,973✔
945
{
946
   // Transform a string into a literal as specified in LRM 13.4.1
947
   //   decimal_literal ::= integer [.integer] [exponent]
948

949
   int tok = tERROR;
86,973✔
950
   char *tmp LOCAL = xstrdup(str);
86,973✔
951
   strip_underscores(tmp);
86,973✔
952

953
   char *dot = strpbrk(tmp, ".");
86,973✔
954

955
   if (dot == NULL) {
86,973✔
956
      char *sign = strpbrk(tmp, "-");
69,440✔
957
      char *val  = strtok(tmp, "eE");
69,440✔
958
      char *exp  = strtok(NULL, "eE");
69,440✔
959

960
      errno = 0;
69,440✔
961
      yylval.i64 = strtoll(val, NULL, 10);
69,440✔
962
      bool overflow = (errno == ERANGE);
69,440✔
963

964
      long long int e = (exp ? atoll(exp) : 0);
69,440✔
965

966
      if (yylval.i64 == 0)
69,440✔
967
         tok = tINT;
968
      else if (e >= 0) {  // Minus sign forbidden for an integer literal
53,456✔
969
         for (; e > 0; e--) {
53,547✔
970
            if (__builtin_mul_overflow(yylval.i64, INT64_C(10), &yylval.i64)) {
92✔
971
               overflow = true;
972
               break;
973
            }
974
         }
975
         tok = (sign == NULL) ? tINT : tERROR;
53,456✔
976
      }
977

978
      if (overflow)
69,440✔
979
         error_at(&yylloc, "value %s is outside implementation defined range "
2✔
980
                  "of universal_integer", str);
981
   }
982
   else {
983
      yylval.real = strtod(tmp, NULL);
17,533✔
984
      tok = tREAL;
17,533✔
985
   }
986

987
   TOKEN(tok);
86,973✔
988
}
989

990
static int parse_based_literal(const char *str)
69✔
991
{
992
   // Transform a string into a literal as specified in LRM 13.4.2
993
   //   based_literal ::= base [#:] based_integer [.based_integer] [#:]
994
   //     [exponent]
995

996
   int tok = tERROR;
69✔
997
   char *tmp LOCAL = xstrdup(str);
69✔
998
   strip_underscores(tmp);
69✔
999

1000
   char *dot  = strpbrk(tmp, ".");
69✔
1001
   char *sign = strpbrk(tmp, "-");
69✔
1002
   char *base = strtok(tmp, "#:");
69✔
1003
   char *val  = strtok(NULL, "#:");
69✔
1004
   char *exp  = strtok(NULL, "eE");
69✔
1005

1006
   // Base must be at least 2 and at most 16
1007
   if ((2 <= atoi(base)) && (atoi(base) <= 16)) {
69✔
1008
      if (dot == NULL) {
69✔
1009
         char *eptr;
66✔
1010
         yylval.i64 = strtoll(val, &eptr, atoi(base));
66✔
1011

1012
         long long int e = (exp ? atoll(exp) : 0);
66✔
1013

1014
         if (e >= 0) {  // Minus sign forbidden for an integer literal
1✔
1015
            for (; e > 0; e--) yylval.i64 *= atoi(base);
67✔
1016
            tok = ((*eptr == '\0') && (sign == NULL)) ? tINT : tERROR;
66✔
1017
         }
1018
      }
1019
      else {
1020
         char *eptr_integer, *eptr_rational;
3✔
1021
         char *integer  = strtok(val, ".");
3✔
1022
         char *rational = strtok(NULL, ".");
3✔
1023

1024
         yylval.real = (double)strtoll(integer, &eptr_integer, atoi(base));
3✔
1025

1026
         double tmp = (double)strtoll(rational, &eptr_rational, atoi(base));
3✔
1027
         tmp *= pow((double)atoi(base), (double)((long)(0 - strlen(rational))));
3✔
1028

1029
         yylval.real += tmp;
3✔
1030

1031
         long long int e = (exp ? atoll(exp) : 0);
3✔
1032

1033
         if (e != 0)
3✔
1034
            yylval.real *= pow((double) atoi(base), (double) e);
3✔
1035

1036
         if (*eptr_integer == '\0' && *eptr_rational == '\0')
3✔
1037
            tok = tREAL;
1038
         else
1039
            tok = tERROR;
×
1040
      }
1041
   }
1042

1043
   TOKEN(tok);
69✔
1044
}
1045

1046
static int parse_string(const char *str)
30,724✔
1047
{
1048
   // Replaces all double '\"' by single '\"' or all double '%' by
1049
   // single '%'.  In the case when '\%' is used as string brackets, the
1050
   // enclosed senquence of characters should not contain quotation
1051
   // marks!
1052

1053
   char *s = (yylval.str = xstrdup(str));
30,724✔
1054

1055
   // Replacing double '\"' character by single '\"' or double '%'
1056
   // character by single '%'
1057
   // Begins after first character
1058
   s++;
30,724✔
1059
   char *p = s;
30,724✔
1060
   while (*p) {
404,137✔
1061
      if ((*p == *(yylval.str)) && (*(p+1) == *(yylval.str))) p++;
373,413✔
1062
      *s++ = *p++;
373,413✔
1063
   }
1064
   *s = *p;
30,724✔
1065

1066
   TOKEN(tSTRING);
30,724✔
1067
}
1068

1069
static int parse_bit_string(const char *str)
2,283✔
1070
{
1071
   // Copy input, remove all '_' characters and replace all '\%'
1072
   // characters by '\"'.
1073

1074
   char *copy = (yylval.str = xstrdup(str));
2,283✔
1075

1076
   bool error = false;
2,283✔
1077
   for (char *src = copy, *dst = src; *src != '\0'; src++) {
16,735✔
1078
      if (*src == '%')
14,452✔
1079
         *dst++ = '\"';
8✔
1080
      else if (*src != '_')
14,444✔
1081
         *dst++ = *src;
14,324✔
1082
      else if ((src[-1] == '\"' || src[1] == '\"') && !error) {
120✔
1083
         error_at(&yylloc, "a bit string literal may not start or end with "
2✔
1084
                  "an underscore");
1085
         error = true;
2✔
1086
      }
1087
      else if (src[-1] == '_' && !error) {
118✔
1088
         error_at(&yylloc, "a bit string literal may not contain multiple "
1✔
1089
                  "consecutive underscores");
1090
         error = true;
1✔
1091
      }
1092
   }
1093

1094
   TOKEN(tBITSTRING);
2,283✔
1095
}
1096

1097
static int parse_verilog_real(const char *str)
6✔
1098
{
1099
   // unsigned_number [ . unsigned_number ] exp [ sign ] unsigned_number
1100

1101
   yylval.real = strtod(str, NULL);
6✔
1102
   return tREAL;
6✔
1103
}
1104

1105
static int report_unterminated_string(const char *str)
3✔
1106
{
1107
   diag_t *d = diag_new(DIAG_ERROR, &yylloc);
3✔
1108
   diag_printf(d, "unterminated string literal");
3✔
1109
   diag_hint(d, NULL, "a string literal must fit on one line since it "
3✔
1110
             "is a lexical element, longer strings can be formed using "
1111
             "concatenation");
1112
   diag_lrm(d, STD_08, "15.7");
3✔
1113
   diag_emit(d);
3✔
1114

1115
   return parse_string(str);
3✔
1116
}
1117

1118
static int report_bad_identifier(char *str)
5✔
1119
{
1120
   diag_t *d = diag_new(DIAG_ERROR, &yylloc);
5✔
1121
   diag_printf(d, "a VHDL basic identifier must not start or end with an "
5✔
1122
               "underscore, or contain multiple consecutive underscores");
1123
   diag_lrm(d, STD_08, "15.4.2");
5✔
1124
   diag_emit(d);
5✔
1125

1126
   return parse_id(str);
5✔
1127
}
1128

1129
static int escape_verilog_string(const char *str)
299✔
1130
{
1131
   char *s = (yylval.str = xstrdup(str));
299✔
1132
   for (char *p = s; *p; p++) {
4,167✔
1133
      if (*p == '\\') {
3,868✔
1134
         switch (*++p) {
39✔
1135
         case 'n': *s++ = '\n'; break;
39✔
1136
         case 'r': *s++ = '\r'; break;
×
1137
         case 't': *s++ = '\t'; break;
×
1138
         case 'b': *s++ = '\b'; break;
×
1139
         default:
×
1140
            warn_at(&yylloc, "unrecognised escaped character '%c'", *p);
×
1141
            *s++ = *p;
×
1142
         }
1143
      }
1144
      else
1145
         *s++ = *p;
3,829✔
1146
   }
1147
   *s = '\0';
299✔
1148

1149
   return tSTRING;
299✔
1150
}
1151

1152
static void warn_lrm(vhdl_standard_t std, const char *fmt, ...)
1✔
1153
{
1154
   va_list ap;
1✔
1155
   va_start(ap, fmt);
1✔
1156

1157
   diag_t *d = diag_new(DIAG_WARN, &yylloc);
1✔
1158
   diag_vprintf(d, fmt, ap);
1✔
1159
   diag_hint(d, NULL, "pass $bold$--std=%s$$ to enable this feature",
1✔
1160
             standard_text(std));
1161
   diag_emit(d);
1✔
1162

1163
   va_end(ap);
1✔
1164
}
1✔
1165

1166
static void warn_utf8(const char *text)
1✔
1167
{
1168
   static bool warned = false;
1✔
1169

1170
   if (!warned) {
1✔
1171
      diag_t *d = diag_new(DIAG_WARN, &yylloc);
1✔
1172
      diag_printf(d, "possible multi-byte UTF-8 character found in input");
1✔
1173
      diag_hint(d, NULL, "the native encoding of VHDL is ISO-8859-1");
1✔
1174
      diag_emit(d);
1✔
1175

1176
      warned = true;
1✔
1177
   }
1178
}
1✔
1179

1180
void reset_scanner(void)
4,461✔
1181
{
1182
   last_token = -1;
4,461✔
1183
   comment_caller = 0;
4,461✔
1184
   in_psl_comment = false;
4,461✔
1185

1186
   YY_FLUSH_BUFFER;
4,461✔
1187
   BEGIN(INITIAL);
4,461✔
1188
}
4,461✔
1189

1190
void scan_as_psl(void)
576✔
1191
{
1192
   BEGIN(PSL);
576✔
1193
}
576✔
1194

1195
void scan_as_vhdl(void)
17,077✔
1196
{
1197
   BEGIN(INITIAL);
17,077✔
1198
   in_psl_comment = false;
17,077✔
1199
}
17,077✔
1200

1201
void scan_as_verilog(void)
236✔
1202
{
1203
   BEGIN(VLOG);
236✔
1204
}
236✔
1205

1206
void scan_as_udp(void)
16✔
1207
{
1208
   BEGIN(UDP);
16✔
1209
}
16✔
1210

1211
void scan_as_sdf(void)
303✔
1212
{
1213
   BEGIN(SDF);
303✔
1214
}
303✔
1215

1216
void scan_as_sdf_expr(void)
279✔
1217
{
1218
   BEGIN(SDF_EXPR);
279✔
1219
}
279✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc