2008-06-10 03:25:10 +02:00
|
|
|
/* -*- C++ -*- */
|
2006-08-26 13:35:28 +02:00
|
|
|
/**************************************************************************
|
|
|
|
|
* DESCRIPTION: Verilator: Flex input file
|
|
|
|
|
*
|
2019-11-08 04:33:59 +01:00
|
|
|
* Code available from: https://verilator.org
|
2006-08-26 13:35:28 +02:00
|
|
|
*
|
|
|
|
|
**************************************************************************
|
|
|
|
|
*
|
2023-01-01 16:18:39 +01:00
|
|
|
* Copyright 2003-2023 by Wilson Snyder. Verilator is free software; you
|
2020-03-21 16:24:24 +01:00
|
|
|
* can redistribute it and/or modify it under the terms of either the
|
2009-05-05 19:39:25 +02:00
|
|
|
* GNU Lesser General Public License Version 3 or the Perl Artistic License
|
2009-05-04 23:07:57 +02:00
|
|
|
* Version 2.0.
|
2020-03-21 16:24:24 +01:00
|
|
|
* SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0
|
2006-08-26 13:35:28 +02:00
|
|
|
*
|
2009-05-05 19:39:25 +02:00
|
|
|
*************************************************************************/
|
2020-06-06 14:44:44 +02:00
|
|
|
/* clang-format off */
|
2006-08-26 13:35:28 +02:00
|
|
|
|
|
|
|
|
%option interactive c++ stack noyywrap
|
|
|
|
|
%{
|
|
|
|
|
/* %option nodefault */
|
2020-06-06 14:44:44 +02:00
|
|
|
#ifdef NEVER_JUST_FOR_CLANG_FORMAT
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
// clang-format on
|
2006-08-26 13:35:28 +02:00
|
|
|
|
|
|
|
|
#include "V3Number.h"
|
2009-05-05 03:54:44 +02:00
|
|
|
#include "V3ParseBison.h" // Generated by bison
|
2022-09-28 03:47:45 +02:00
|
|
|
#include "V3ParseImp.h" // Defines YYTYPE; before including bison header
|
2006-08-26 13:35:28 +02:00
|
|
|
|
2020-05-22 01:46:21 +02:00
|
|
|
#define STATE_VERILOG_RECENT S17 // State name for most recent Verilog Version
|
2007-03-05 22:35:49 +01:00
|
|
|
|
2009-10-31 15:08:38 +01:00
|
|
|
#define PARSEP V3ParseImp::parsep()
|
|
|
|
|
|
2020-05-30 19:46:12 +02:00
|
|
|
#define YY_INPUT(buf, result, max_size) \
|
2020-06-06 14:44:44 +02:00
|
|
|
do { result = PARSEP->flexPpInputToLex(buf, max_size); } while (false)
|
2008-01-31 15:49:27 +01:00
|
|
|
|
2006-08-26 13:35:28 +02:00
|
|
|
//======================================================================
|
|
|
|
|
|
2020-06-07 19:45:50 +02:00
|
|
|
#define FL_FWD (PARSEP->lexFileline()->forwardToken(yytext, yyleng, true))
|
2019-07-15 03:42:03 +02:00
|
|
|
// Use this to break between tokens whereever not return'ing a token (e.g. skipping inside lexer)
|
2020-06-07 19:45:50 +02:00
|
|
|
#define FL_BRK (PARSEP->lexFileline()->startToken())
|
2019-07-15 03:42:03 +02:00
|
|
|
|
2020-06-07 19:45:50 +02:00
|
|
|
#define CRELINE() (PARSEP->lexCopyOrSameFileLine())
|
2006-08-26 13:35:28 +02:00
|
|
|
|
2020-06-06 14:44:44 +02:00
|
|
|
#define FL \
|
|
|
|
|
do { \
|
|
|
|
|
FL_FWD; \
|
|
|
|
|
yylval.fl = CRELINE(); \
|
|
|
|
|
} while (false)
|
2009-05-05 19:39:25 +02:00
|
|
|
|
2019-07-12 02:49:35 +02:00
|
|
|
#define ERROR_RSVD_WORD(language) \
|
2020-06-06 14:44:44 +02:00
|
|
|
do { \
|
2020-06-07 16:10:20 +02:00
|
|
|
FL; \
|
2020-06-10 01:20:16 +02:00
|
|
|
yylval.fl->v3warn(E_UNSUPPORTED, "Unsupported: " << language \
|
|
|
|
|
<< " reserved word not implemented: '" \
|
|
|
|
|
<< yytext << "'"); \
|
2020-06-06 14:44:44 +02:00
|
|
|
FL_BRK; \
|
|
|
|
|
} while (0)
|
2019-07-12 02:49:35 +02:00
|
|
|
|
2006-08-26 13:35:28 +02:00
|
|
|
//======================================================================
|
|
|
|
|
|
2020-06-07 16:10:20 +02:00
|
|
|
static double lexParseDouble(FileLine* fl, const char* textp, size_t length) {
|
2021-07-24 18:49:07 +02:00
|
|
|
const string text = std::string{textp, length};
|
2020-06-07 14:21:22 +02:00
|
|
|
bool success = false;
|
2021-07-24 18:49:07 +02:00
|
|
|
const double d = VString::parseDouble(text, &success);
|
2020-06-07 16:10:20 +02:00
|
|
|
if (!success) fl->v3error("Syntax error parsing real: '" << textp << "'");
|
2020-06-07 14:21:22 +02:00
|
|
|
return d;
|
|
|
|
|
}
|
|
|
|
|
|
2020-06-06 14:44:44 +02:00
|
|
|
// clang-format off
|
2009-05-05 19:39:25 +02:00
|
|
|
/**********************************************************************/
|
2006-08-26 13:35:28 +02:00
|
|
|
%}
|
|
|
|
|
|
|
|
|
|
%e 2000
|
|
|
|
|
%p 5000
|
|
|
|
|
%n 2500
|
|
|
|
|
%k 1000
|
|
|
|
|
%a 15000
|
|
|
|
|
%o 25000
|
|
|
|
|
|
2020-12-17 00:40:45 +01:00
|
|
|
%s V95 V01NC V01C V05 S05 S09 S12 S17
|
2022-11-18 02:37:51 +01:00
|
|
|
%s ATTRMODE QQQ STRING TABLE
|
2014-11-22 16:14:14 +01:00
|
|
|
%s VA5 SAX VLT
|
2007-03-05 21:29:05 +01:00
|
|
|
%s SYSCHDR SYSCINT SYSCIMP SYSCIMPH SYSCCTOR SYSCDTOR
|
|
|
|
|
%s IGNORE
|
2006-08-26 13:35:28 +02:00
|
|
|
|
2019-07-11 12:57:49 +02:00
|
|
|
ws [ \t\f\r]+
|
|
|
|
|
wsnr [ \t\f]+
|
|
|
|
|
crnl [\r]*[\n]
|
|
|
|
|
id [a-zA-Z_][a-zA-Z0-9_$]*
|
|
|
|
|
escid \\[^ \t\f\r\n]+
|
|
|
|
|
word [a-zA-Z0-9_]+
|
2019-11-16 15:39:41 +01:00
|
|
|
vnum1 [0-9]*?[''][sS]?[bcodhBCODH][ \t\n]*[A-Fa-f0-9xXzZ_?]*
|
|
|
|
|
vnum2 [0-9]*?[''][sS]?[01xXzZ]
|
|
|
|
|
vnum3 [0-9][_0-9]*[ \t\n]*[''][sS]?[bcodhBCODH]?[ \t\n]*[A-Fa-f0-9xXzZ_?]+
|
|
|
|
|
vnum4 [0-9][_0-9]*[ \t\n]*[''][sS]?[bcodhBCODH]
|
|
|
|
|
vnum5 [0-9][_0-9]*[ \t\n]*[''][sS]
|
2019-07-11 12:57:49 +02:00
|
|
|
vnum {vnum1}|{vnum2}|{vnum3}|{vnum4}|{vnum5}
|
2006-08-26 13:35:28 +02:00
|
|
|
|
|
|
|
|
%%
|
|
|
|
|
|
2021-07-10 13:11:34 +02:00
|
|
|
<INITIAL>.|\n { BEGIN STATE_VERILOG_RECENT; yyless(0); }
|
2007-03-05 21:29:05 +01:00
|
|
|
|
2010-01-21 12:11:30 +01:00
|
|
|
/************************************************************************/
|
|
|
|
|
/* Verilator control files */
|
|
|
|
|
<VLT>{
|
2019-07-15 03:42:03 +02:00
|
|
|
{ws} { FL_FWD; FL_BRK; } /* otherwise ignore white-space */
|
|
|
|
|
{crnl} { FL_FWD; FL_BRK; } /* Count line numbers */
|
2010-01-21 12:11:30 +01:00
|
|
|
|
2020-01-12 10:03:17 +01:00
|
|
|
"clock_enable" { FL; return yVLT_CLOCK_ENABLE; }
|
|
|
|
|
"clocker" { FL; return yVLT_CLOCKER; }
|
|
|
|
|
"coverage_block_off" { FL; return yVLT_COVERAGE_BLOCK_OFF; }
|
2019-07-11 12:57:49 +02:00
|
|
|
"coverage_off" { FL; return yVLT_COVERAGE_OFF; }
|
|
|
|
|
"coverage_on" { FL; return yVLT_COVERAGE_ON; }
|
2021-12-19 20:45:06 +01:00
|
|
|
"forceable" { FL; return yVLT_FORCEABLE; }
|
2020-01-12 10:03:17 +01:00
|
|
|
"full_case" { FL; return yVLT_FULL_CASE; }
|
2020-08-15 15:43:53 +02:00
|
|
|
"hier_block" { FL; return yVLT_HIER_BLOCK; }
|
2020-01-12 10:03:17 +01:00
|
|
|
"inline" { FL; return yVLT_INLINE; }
|
|
|
|
|
"isolate_assignments" { FL; return yVLT_ISOLATE_ASSIGNMENTS; }
|
2019-07-11 12:57:49 +02:00
|
|
|
"lint_off" { FL; return yVLT_LINT_OFF; }
|
|
|
|
|
"lint_on" { FL; return yVLT_LINT_ON; }
|
2020-01-12 10:03:17 +01:00
|
|
|
"no_clocker" { FL; return yVLT_NO_CLOCKER; }
|
|
|
|
|
"no_inline" { FL; return yVLT_NO_INLINE; }
|
|
|
|
|
"parallel_case" { FL; return yVLT_PARALLEL_CASE; }
|
2021-09-27 04:51:11 +02:00
|
|
|
"profile_data" { FL; return yVLT_PROFILE_DATA; }
|
2020-01-12 10:03:17 +01:00
|
|
|
"public" { FL; return yVLT_PUBLIC; }
|
|
|
|
|
"public_flat" { FL; return yVLT_PUBLIC_FLAT; }
|
|
|
|
|
"public_flat_rd" { FL; return yVLT_PUBLIC_FLAT_RD; }
|
|
|
|
|
"public_flat_rw" { FL; return yVLT_PUBLIC_FLAT_RW; }
|
|
|
|
|
"public_module" { FL; return yVLT_PUBLIC_MODULE; }
|
|
|
|
|
"sc_bv" { FL; return yVLT_SC_BV; }
|
|
|
|
|
"sformat" { FL; return yVLT_SFORMAT; }
|
2020-04-03 14:08:23 +02:00
|
|
|
"split_var" { FL; return yVLT_SPLIT_VAR; }
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
"timing_off" { FL; return yVLT_TIMING_OFF; }
|
|
|
|
|
"timing_on" { FL; return yVLT_TIMING_ON; }
|
2019-07-11 12:57:49 +02:00
|
|
|
"tracing_off" { FL; return yVLT_TRACING_OFF; }
|
|
|
|
|
"tracing_on" { FL; return yVLT_TRACING_ON; }
|
2010-01-21 12:11:30 +01:00
|
|
|
|
2020-01-12 10:03:17 +01:00
|
|
|
-?"-block" { FL; return yVLT_D_BLOCK; }
|
2021-09-27 04:51:11 +02:00
|
|
|
-?"-cost" { FL; return yVLT_D_COST; }
|
2019-07-11 12:57:49 +02:00
|
|
|
-?"-file" { FL; return yVLT_D_FILE; }
|
2020-01-12 10:03:17 +01:00
|
|
|
-?"-function" { FL; return yVLT_D_FUNCTION; }
|
2022-05-13 04:27:38 +02:00
|
|
|
-?"-levels" { FL; return yVLT_D_LEVELS; }
|
2019-07-11 12:57:49 +02:00
|
|
|
-?"-lines" { FL; return yVLT_D_LINES; }
|
2020-01-12 10:03:17 +01:00
|
|
|
-?"-match" { FL; return yVLT_D_MATCH; }
|
2021-09-27 04:51:11 +02:00
|
|
|
-?"-model" { FL; return yVLT_D_MODEL; }
|
2020-01-12 10:03:17 +01:00
|
|
|
-?"-module" { FL; return yVLT_D_MODULE; }
|
2021-09-27 04:51:11 +02:00
|
|
|
-?"-mtask" { FL; return yVLT_D_MTASK; }
|
2019-12-30 19:15:43 +01:00
|
|
|
-?"-rule" { FL; return yVLT_D_RULE; }
|
2022-05-13 04:27:38 +02:00
|
|
|
-?"-scope" { FL; return yVLT_D_SCOPE; }
|
2020-01-12 10:03:17 +01:00
|
|
|
-?"-task" { FL; return yVLT_D_TASK; }
|
|
|
|
|
-?"-var" { FL; return yVLT_D_VAR; }
|
|
|
|
|
|
|
|
|
|
/* Reachable by attr_event_control */
|
|
|
|
|
"edge" { FL; return yEDGE; }
|
|
|
|
|
"negedge" { FL; return yNEGEDGE; }
|
|
|
|
|
"or" { FL; return yOR; }
|
|
|
|
|
"posedge" { FL; return yPOSEDGE; }
|
2010-01-21 12:11:30 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/************************************************************************/
|
2007-03-06 18:07:13 +01:00
|
|
|
/* Verilog 1995 */
|
2020-12-17 00:40:45 +01:00
|
|
|
<V95,V01NC,V01C,V05,VA5,S05,S09,S12,S17,SAX>{
|
2019-07-15 03:42:03 +02:00
|
|
|
{ws} { FL_FWD; FL_BRK; } /* otherwise ignore white-space */
|
|
|
|
|
{crnl} { FL_FWD; FL_BRK; } /* Count line numbers */
|
2007-03-06 18:07:13 +01:00
|
|
|
/* Extensions to Verilog set, some specified by PSL */
|
2019-07-15 03:42:03 +02:00
|
|
|
"$c"[0-9]* { FL; return yD_C; } /*Verilator only*/
|
2007-03-06 18:07:13 +01:00
|
|
|
/* System Tasks */
|
2019-07-11 12:57:49 +02:00
|
|
|
"$acos" { FL; return yD_ACOS; }
|
|
|
|
|
"$acosh" { FL; return yD_ACOSH; }
|
|
|
|
|
"$asin" { FL; return yD_ASIN; }
|
|
|
|
|
"$asinh" { FL; return yD_ASINH; }
|
|
|
|
|
"$atan" { FL; return yD_ATAN; }
|
|
|
|
|
"$atan2" { FL; return yD_ATAN2; }
|
|
|
|
|
"$atanh" { FL; return yD_ATANH; }
|
|
|
|
|
"$bitstoreal" { FL; return yD_BITSTOREAL; }
|
2019-11-23 15:16:06 +01:00
|
|
|
"$bitstoshortreal" { FL; return yD_BITSTOSHORTREAL; }
|
2020-06-06 15:30:11 +02:00
|
|
|
"$cast" { FL; return yD_CAST; }
|
2019-07-11 12:57:49 +02:00
|
|
|
"$ceil" { FL; return yD_CEIL; }
|
|
|
|
|
"$cos" { FL; return yD_COS; }
|
|
|
|
|
"$cosh" { FL; return yD_COSH; }
|
|
|
|
|
"$display" { FL; return yD_DISPLAY; }
|
2020-03-06 03:49:25 +01:00
|
|
|
"$displayb" { FL; return yD_DISPLAYB; }
|
|
|
|
|
"$displayh" { FL; return yD_DISPLAYH; }
|
|
|
|
|
"$displayo" { FL; return yD_DISPLAYO; }
|
2022-12-04 23:30:51 +01:00
|
|
|
"$dist_chi_square" { FL; return yD_DIST_CHI_SQUARE; }
|
|
|
|
|
"$dist_erlang" { FL; return yD_DIST_ERLANG; }
|
|
|
|
|
"$dist_exponential" { FL; return yD_DIST_EXPONENTIAL; }
|
|
|
|
|
"$dist_normal" { FL; return yD_DIST_NORMAL; }
|
|
|
|
|
"$dist_poisson" { FL; return yD_DIST_POISSON; }
|
|
|
|
|
"$dist_t" { FL; return yD_DIST_T; }
|
|
|
|
|
"$dist_uniform" { FL; return yD_DIST_UNIFORM; }
|
2020-03-02 03:39:23 +01:00
|
|
|
"$dumpall" { FL; return yD_DUMPALL; }
|
|
|
|
|
"$dumpfile" { FL; return yD_DUMPFILE; }
|
|
|
|
|
"$dumpflush" { FL; return yD_DUMPFLUSH; }
|
|
|
|
|
"$dumplimit" { FL; return yD_DUMPLIMIT; }
|
|
|
|
|
"$dumpoff" { FL; return yD_DUMPOFF; }
|
|
|
|
|
"$dumpon" { FL; return yD_DUMPON; }
|
|
|
|
|
"$dumpports" { FL; return yD_DUMPPORTS; }
|
|
|
|
|
"$dumpportsall" { FL; return yD_DUMPALL; }
|
|
|
|
|
"$dumpportsflush" { FL; return yD_DUMPFLUSH; }
|
|
|
|
|
"$dumpportslimit" { FL; return yD_DUMPLIMIT; }
|
|
|
|
|
"$dumpportsoff" { FL; return yD_DUMPOFF; }
|
|
|
|
|
"$dumpportson" { FL; return yD_DUMPON; }
|
|
|
|
|
"$dumpvars" { FL; return yD_DUMPVARS; }
|
2020-11-11 04:42:45 +01:00
|
|
|
"$exit" { FL; return yD_EXIT; }
|
2019-07-11 12:57:49 +02:00
|
|
|
"$exp" { FL; return yD_EXP; }
|
|
|
|
|
"$fclose" { FL; return yD_FCLOSE; }
|
|
|
|
|
"$fdisplay" { FL; return yD_FDISPLAY; }
|
2020-03-06 03:49:25 +01:00
|
|
|
"$fdisplayb" { FL; return yD_FDISPLAYB; }
|
|
|
|
|
"$fdisplayh" { FL; return yD_FDISPLAYH; }
|
|
|
|
|
"$fdisplayo" { FL; return yD_FDISPLAYO; }
|
2019-07-11 12:57:49 +02:00
|
|
|
"$feof" { FL; return yD_FEOF; }
|
2020-04-05 17:22:05 +02:00
|
|
|
"$ferror" { FL; return yD_FERROR; }
|
2019-07-11 12:57:49 +02:00
|
|
|
"$fflush" { FL; return yD_FFLUSH; }
|
|
|
|
|
"$fgetc" { FL; return yD_FGETC; }
|
|
|
|
|
"$fgets" { FL; return yD_FGETS; }
|
|
|
|
|
"$finish" { FL; return yD_FINISH; }
|
|
|
|
|
"$floor" { FL; return yD_FLOOR; }
|
2020-11-29 17:31:38 +01:00
|
|
|
"$fmonitor" { FL; return yD_FMONITOR; }
|
|
|
|
|
"$fmonitorb" { FL; return yD_FMONITORB; }
|
|
|
|
|
"$fmonitorh" { FL; return yD_FMONITORH; }
|
|
|
|
|
"$fmonitoro" { FL; return yD_FMONITORO; }
|
2019-07-11 12:57:49 +02:00
|
|
|
"$fopen" { FL; return yD_FOPEN; }
|
|
|
|
|
"$fread" { FL; return yD_FREAD; }
|
2020-03-02 03:39:23 +01:00
|
|
|
"$frewind" { FL; return yD_FREWIND; }
|
2019-07-11 12:57:49 +02:00
|
|
|
"$fscanf" { FL; return yD_FSCANF; }
|
2019-09-04 03:28:15 +02:00
|
|
|
"$fseek" { FL; return yD_FSEEK; }
|
2020-11-29 17:31:38 +01:00
|
|
|
"$fstrobe" { FL; return yD_FSTROBE; }
|
|
|
|
|
"$fstrobeb" { FL; return yD_FSTROBEB; }
|
|
|
|
|
"$fstrobeh" { FL; return yD_FSTROBEH; }
|
|
|
|
|
"$fstrobeo" { FL; return yD_FSTROBEO; }
|
2019-09-04 03:28:15 +02:00
|
|
|
"$ftell" { FL; return yD_FTELL; }
|
2019-07-11 12:57:49 +02:00
|
|
|
"$fullskew" { FL; return yaTIMINGSPEC; }
|
|
|
|
|
"$fwrite" { FL; return yD_FWRITE; }
|
2020-03-06 03:49:25 +01:00
|
|
|
"$fwriteb" { FL; return yD_FWRITEB; }
|
|
|
|
|
"$fwriteh" { FL; return yD_FWRITEH; }
|
|
|
|
|
"$fwriteo" { FL; return yD_FWRITEO; }
|
2023-01-28 18:22:23 +01:00
|
|
|
"$global_clock" { FL; return yD_GLOBAL_CLOCK; }
|
2019-07-11 12:57:49 +02:00
|
|
|
"$hold" { FL; return yaTIMINGSPEC; }
|
|
|
|
|
"$hypot" { FL; return yD_HYPOT; }
|
|
|
|
|
"$itor" { FL; return yD_ITOR; }
|
|
|
|
|
"$ln" { FL; return yD_LN; }
|
|
|
|
|
"$log10" { FL; return yD_LOG10; }
|
2020-11-29 17:31:38 +01:00
|
|
|
"$monitor" { FL; return yD_MONITOR; }
|
|
|
|
|
"$monitorb" { FL; return yD_MONITORB; }
|
|
|
|
|
"$monitorh" { FL; return yD_MONITORH; }
|
|
|
|
|
"$monitoro" { FL; return yD_MONITORO; }
|
|
|
|
|
"$monitoroff" { FL; return yD_MONITOROFF; }
|
|
|
|
|
"$monitoron" { FL; return yD_MONITORON; }
|
2019-07-11 12:57:49 +02:00
|
|
|
"$nochange" { FL; return yaTIMINGSPEC; }
|
|
|
|
|
"$period" { FL; return yaTIMINGSPEC; }
|
|
|
|
|
"$pow" { FL; return yD_POW; }
|
2020-04-16 01:39:03 +02:00
|
|
|
"$printtimescale" { FL; return yD_PRINTTIMESCALE; }
|
2019-07-11 12:57:49 +02:00
|
|
|
"$random" { FL; return yD_RANDOM; }
|
|
|
|
|
"$readmemb" { FL; return yD_READMEMB; }
|
|
|
|
|
"$readmemh" { FL; return yD_READMEMH; }
|
|
|
|
|
"$realtime" { FL; return yD_REALTIME; }
|
|
|
|
|
"$realtobits" { FL; return yD_REALTOBITS; }
|
|
|
|
|
"$recovery" { FL; return yaTIMINGSPEC; }
|
|
|
|
|
"$recrem" { FL; return yaTIMINGSPEC; }
|
|
|
|
|
"$removal" { FL; return yaTIMINGSPEC; }
|
2019-11-16 18:21:35 +01:00
|
|
|
"$rewind" { FL; return yD_REWIND; }
|
2019-07-11 12:57:49 +02:00
|
|
|
"$rtoi" { FL; return yD_RTOI; }
|
2020-03-06 03:49:25 +01:00
|
|
|
"$sampled" { FL; return yD_SAMPLED; }
|
2019-07-11 12:57:49 +02:00
|
|
|
"$setup" { FL; return yaTIMINGSPEC; }
|
|
|
|
|
"$setuphold" { FL; return yaTIMINGSPEC; }
|
|
|
|
|
"$sformat" { FL; return yD_SFORMAT; }
|
|
|
|
|
"$sformatf" { FL; return yD_SFORMATF; }
|
2019-11-23 15:16:06 +01:00
|
|
|
"$shortrealtobits" { FL; return yD_SHORTREALTOBITS; }
|
2019-07-11 12:57:49 +02:00
|
|
|
"$sin" { FL; return yD_SIN; }
|
|
|
|
|
"$sinh" { FL; return yD_SINH; }
|
|
|
|
|
"$skew" { FL; return yaTIMINGSPEC; }
|
|
|
|
|
"$sqrt" { FL; return yD_SQRT; }
|
|
|
|
|
"$sscanf" { FL; return yD_SSCANF; }
|
2022-11-18 01:12:54 +01:00
|
|
|
"$stacktrace" { FL; return yD_STACKTRACE; }
|
2019-07-11 12:57:49 +02:00
|
|
|
"$stime" { FL; return yD_STIME; }
|
|
|
|
|
"$stop" { FL; return yD_STOP; }
|
2020-11-29 17:31:38 +01:00
|
|
|
"$strobe" { FL; return yD_STROBE; }
|
|
|
|
|
"$strobeb" { FL; return yD_STROBEB; }
|
|
|
|
|
"$strobeh" { FL; return yD_STROBEH; }
|
|
|
|
|
"$strobeo" { FL; return yD_STROBEO; }
|
2019-07-11 12:57:49 +02:00
|
|
|
"$swrite" { FL; return yD_SWRITE; }
|
2020-03-06 03:49:25 +01:00
|
|
|
"$swriteb" { FL; return yD_SWRITEB; }
|
|
|
|
|
"$swriteh" { FL; return yD_SWRITEH; }
|
|
|
|
|
"$swriteo" { FL; return yD_SWRITEO; }
|
2019-07-11 12:57:49 +02:00
|
|
|
"$system" { FL; return yD_SYSTEM; }
|
|
|
|
|
"$tan" { FL; return yD_TAN; }
|
|
|
|
|
"$tanh" { FL; return yD_TANH; }
|
|
|
|
|
"$test$plusargs" { FL; return yD_TESTPLUSARGS; }
|
|
|
|
|
"$time" { FL; return yD_TIME; }
|
2020-04-16 01:39:03 +02:00
|
|
|
"$timeformat" { FL; return yD_TIMEFORMAT; }
|
2022-11-17 03:10:39 +01:00
|
|
|
"$timeprecision" { FL; return yD_TIMEPRECISION; }
|
2020-08-23 14:42:50 +02:00
|
|
|
"$timeskew" { FL; return yaTIMINGSPEC; }
|
2022-11-17 03:10:39 +01:00
|
|
|
"$timeunit" { FL; return yD_TIMEUNIT; }
|
2020-01-26 19:21:25 +01:00
|
|
|
"$typename" { FL; return yD_TYPENAME; }
|
2019-11-16 18:55:10 +01:00
|
|
|
"$ungetc" { FL; return yD_UNGETC; }
|
2020-08-23 14:42:50 +02:00
|
|
|
"$urandom" { FL; return yD_URANDOM; }
|
|
|
|
|
"$urandom_range" { FL; return yD_URANDOM_RANGE; }
|
2019-07-11 12:57:49 +02:00
|
|
|
"$value$plusargs" { FL; return yD_VALUEPLUSARGS; }
|
|
|
|
|
"$width" { FL; return yaTIMINGSPEC; }
|
|
|
|
|
"$write" { FL; return yD_WRITE; }
|
2020-03-06 03:49:25 +01:00
|
|
|
"$writeb" { FL; return yD_WRITEB; }
|
|
|
|
|
"$writeh" { FL; return yD_WRITEH; }
|
2020-07-01 23:32:15 +02:00
|
|
|
"$writememb" { FL; return yD_WRITEMEMB; }
|
2019-07-11 12:57:49 +02:00
|
|
|
"$writememh" { FL; return yD_WRITEMEMH; }
|
2020-11-29 17:31:38 +01:00
|
|
|
"$writeo" { FL; return yD_WRITEO; }
|
2007-03-06 18:07:13 +01:00
|
|
|
/* Keywords */
|
2019-07-11 12:57:49 +02:00
|
|
|
"always" { FL; return yALWAYS; }
|
|
|
|
|
"and" { FL; return yAND; }
|
|
|
|
|
"assign" { FL; return yASSIGN; }
|
|
|
|
|
"begin" { FL; return yBEGIN; }
|
|
|
|
|
"buf" { FL; return yBUF; }
|
|
|
|
|
"bufif0" { FL; return yBUFIF0; }
|
|
|
|
|
"bufif1" { FL; return yBUFIF1; }
|
|
|
|
|
"case" { FL; return yCASE; }
|
|
|
|
|
"casex" { FL; return yCASEX; }
|
|
|
|
|
"casez" { FL; return yCASEZ; }
|
|
|
|
|
"cmos" { FL; return yCMOS; }
|
|
|
|
|
"deassign" { FL; return yDEASSIGN; }
|
|
|
|
|
"default" { FL; return yDEFAULT; }
|
|
|
|
|
"defparam" { FL; return yDEFPARAM; }
|
|
|
|
|
"disable" { FL; return yDISABLE; }
|
|
|
|
|
"edge" { FL; return yEDGE; }
|
|
|
|
|
"else" { FL; return yELSE; }
|
|
|
|
|
"end" { FL; return yEND; }
|
|
|
|
|
"endcase" { FL; return yENDCASE; }
|
|
|
|
|
"endfunction" { FL; return yENDFUNCTION; }
|
|
|
|
|
"endmodule" { FL; return yENDMODULE; }
|
|
|
|
|
"endprimitive" { FL; return yENDPRIMITIVE; }
|
|
|
|
|
"endspecify" { FL; return yENDSPECIFY; }
|
2022-10-22 18:30:44 +02:00
|
|
|
"endtable" { FL; yylval.fl->v3error("Syntax error: 'endtable' outside of 'table'"); FL_BRK; }
|
2019-07-11 12:57:49 +02:00
|
|
|
"endtask" { FL; return yENDTASK; }
|
|
|
|
|
"event" { FL; return yEVENT; }
|
|
|
|
|
"for" { FL; return yFOR; }
|
|
|
|
|
"force" { FL; return yFORCE; }
|
|
|
|
|
"foreach" { FL; return yFOREACH; }
|
|
|
|
|
"forever" { FL; return yFOREVER; }
|
|
|
|
|
"fork" { FL; return yFORK; }
|
|
|
|
|
"function" { FL; return yFUNCTION; }
|
2022-09-14 13:39:27 +02:00
|
|
|
"highz0" { FL; return yHIGHZ0; }
|
|
|
|
|
"highz1" { FL; return yHIGHZ1; }
|
2019-07-11 12:57:49 +02:00
|
|
|
"if" { FL; return yIF; }
|
|
|
|
|
"initial" { FL; return yINITIAL; }
|
|
|
|
|
"inout" { FL; return yINOUT; }
|
|
|
|
|
"input" { FL; return yINPUT; }
|
|
|
|
|
"integer" { FL; return yINTEGER; }
|
|
|
|
|
"join" { FL; return yJOIN; }
|
|
|
|
|
"large" { FL; return ygenSTRENGTH; }
|
|
|
|
|
"macromodule" { FL; return yMODULE; }
|
|
|
|
|
"medium" { FL; return ygenSTRENGTH; }
|
|
|
|
|
"module" { FL; return yMODULE; }
|
|
|
|
|
"nand" { FL; return yNAND; }
|
|
|
|
|
"negedge" { FL; return yNEGEDGE; }
|
|
|
|
|
"nmos" { FL; return yNMOS; }
|
|
|
|
|
"nor" { FL; return yNOR; }
|
|
|
|
|
"not" { FL; return yNOT; }
|
|
|
|
|
"notif0" { FL; return yNOTIF0; }
|
|
|
|
|
"notif1" { FL; return yNOTIF1; }
|
|
|
|
|
"or" { FL; return yOR; }
|
|
|
|
|
"output" { FL; return yOUTPUT; }
|
|
|
|
|
"parameter" { FL; return yPARAMETER; }
|
|
|
|
|
"pmos" { FL; return yPMOS; }
|
|
|
|
|
"posedge" { FL; return yPOSEDGE; }
|
|
|
|
|
"primitive" { FL; return yPRIMITIVE; }
|
2022-09-14 13:39:27 +02:00
|
|
|
"pull0" { FL; return yPULL0; }
|
|
|
|
|
"pull1" { FL; return yPULL1; }
|
2019-07-11 12:57:49 +02:00
|
|
|
"pulldown" { FL; return yPULLDOWN; }
|
|
|
|
|
"pullup" { FL; return yPULLUP; }
|
|
|
|
|
"rcmos" { FL; return yRCMOS; }
|
|
|
|
|
"real" { FL; return yREAL; }
|
|
|
|
|
"realtime" { FL; return yREALTIME; }
|
|
|
|
|
"reg" { FL; return yREG; }
|
|
|
|
|
"release" { FL; return yRELEASE; }
|
|
|
|
|
"repeat" { FL; return yREPEAT; }
|
|
|
|
|
"rnmos" { FL; return yRNMOS; }
|
|
|
|
|
"rpmos" { FL; return yRPMOS; }
|
|
|
|
|
"rtran" { FL; return yRTRAN; }
|
|
|
|
|
"rtranif0" { FL; return yRTRANIF0; }
|
|
|
|
|
"rtranif1" { FL; return yRTRANIF1; }
|
|
|
|
|
"scalared" { FL; return ySCALARED; }
|
|
|
|
|
"small" { FL; return ygenSTRENGTH; }
|
|
|
|
|
"specify" { FL; return ySPECIFY; }
|
|
|
|
|
"specparam" { FL; return ySPECPARAM; }
|
2022-09-14 13:39:27 +02:00
|
|
|
"strong0" { FL; return ySTRONG0; }
|
|
|
|
|
"strong1" { FL; return ySTRONG1; }
|
2019-07-11 12:57:49 +02:00
|
|
|
"supply0" { FL; return ySUPPLY0; }
|
|
|
|
|
"supply1" { FL; return ySUPPLY1; }
|
2019-07-15 03:42:03 +02:00
|
|
|
"table" { FL; yy_push_state(TABLE); return yTABLE; }
|
2019-07-11 12:57:49 +02:00
|
|
|
"task" { FL; return yTASK; }
|
|
|
|
|
"time" { FL; return yTIME; }
|
|
|
|
|
"tran" { FL; return yTRAN; }
|
|
|
|
|
"tranif0" { FL; return yTRANIF0; }
|
|
|
|
|
"tranif1" { FL; return yTRANIF1; }
|
|
|
|
|
"tri" { FL; return yTRI; }
|
|
|
|
|
"tri0" { FL; return yTRI0; }
|
|
|
|
|
"tri1" { FL; return yTRI1; }
|
|
|
|
|
"triand" { FL; return yTRIAND; }
|
|
|
|
|
"trior" { FL; return yTRIOR; }
|
|
|
|
|
"trireg" { FL; return yTRIREG; }
|
|
|
|
|
"vectored" { FL; return yVECTORED; }
|
|
|
|
|
"wait" { FL; return yWAIT; }
|
|
|
|
|
"wand" { FL; return yWAND; }
|
2022-09-14 13:39:27 +02:00
|
|
|
"weak0" { FL; return yWEAK0; }
|
|
|
|
|
"weak1" { FL; return yWEAK1; }
|
2019-07-11 12:57:49 +02:00
|
|
|
"while" { FL; return yWHILE; }
|
|
|
|
|
"wire" { FL; return yWIRE; }
|
|
|
|
|
"wor" { FL; return yWOR; }
|
|
|
|
|
"xnor" { FL; return yXNOR; }
|
|
|
|
|
"xor" { FL; return yXOR; }
|
2007-03-05 21:29:05 +01:00
|
|
|
}
|
2006-08-26 13:35:28 +02:00
|
|
|
|
|
|
|
|
/* Verilog 2001 */
|
2020-12-17 00:40:45 +01:00
|
|
|
<V01NC,V01C,V05,VA5,S05,S09,S12,S17,SAX>{
|
2007-03-06 18:07:13 +01:00
|
|
|
/* System Tasks */
|
2019-07-11 12:57:49 +02:00
|
|
|
"$signed" { FL; return yD_SIGNED; }
|
|
|
|
|
"$unsigned" { FL; return yD_UNSIGNED; }
|
2007-03-06 18:07:13 +01:00
|
|
|
/* Keywords */
|
2019-07-11 12:57:49 +02:00
|
|
|
"automatic" { FL; return yAUTOMATIC; }
|
|
|
|
|
"endgenerate" { FL; return yENDGENERATE; }
|
|
|
|
|
"generate" { FL; return yGENERATE; }
|
|
|
|
|
"genvar" { FL; return yGENVAR; }
|
|
|
|
|
"ifnone" { FL; return yaTIMINGSPEC; }
|
|
|
|
|
"localparam" { FL; return yLOCALPARAM; }
|
|
|
|
|
"noshowcancelled" { FL; return yaTIMINGSPEC; }
|
|
|
|
|
"pulsestyle_ondetect" { FL; return yaTIMINGSPEC; }
|
|
|
|
|
"pulsestyle_onevent" { FL; return yaTIMINGSPEC; }
|
|
|
|
|
"showcancelled" { FL; return yaTIMINGSPEC; }
|
|
|
|
|
"signed" { FL; return ySIGNED; }
|
|
|
|
|
"unsigned" { FL; return yUNSIGNED; }
|
2020-12-17 00:40:45 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Verilog 2001 Config */
|
|
|
|
|
<V01C,V05,VA5,S05,S09,S12,S17,SAX>{
|
2009-05-05 19:39:25 +02:00
|
|
|
/* Generic unsupported keywords */
|
2019-07-12 02:49:35 +02:00
|
|
|
"cell" { ERROR_RSVD_WORD("Verilog 2001-config"); }
|
|
|
|
|
"config" { ERROR_RSVD_WORD("Verilog 2001-config"); }
|
|
|
|
|
"design" { ERROR_RSVD_WORD("Verilog 2001-config"); }
|
|
|
|
|
"endconfig" { ERROR_RSVD_WORD("Verilog 2001-config"); }
|
|
|
|
|
"incdir" { ERROR_RSVD_WORD("Verilog 2001-config"); }
|
2020-06-10 01:20:16 +02:00
|
|
|
"include" { FL; yylval.fl->v3warn(E_UNSUPPORTED, "Unsupported: Verilog 2001-config reserved word not implemented;"
|
|
|
|
|
" suggest you want `include instead: '" << yytext << "'");
|
2020-06-07 16:10:20 +02:00
|
|
|
FL_BRK; }
|
2019-07-12 02:49:35 +02:00
|
|
|
"instance" { ERROR_RSVD_WORD("Verilog 2001-config"); }
|
|
|
|
|
"liblist" { ERROR_RSVD_WORD("Verilog 2001-config"); }
|
|
|
|
|
"library" { ERROR_RSVD_WORD("Verilog 2001-config"); }
|
|
|
|
|
"use" { ERROR_RSVD_WORD("Verilog 2001-config"); }
|
2007-03-05 21:29:05 +01:00
|
|
|
}
|
|
|
|
|
|
2007-03-06 18:07:13 +01:00
|
|
|
/* Verilog 2005 */
|
2018-03-13 03:26:34 +01:00
|
|
|
<V05,S05,S09,S12,S17,SAX>{
|
2018-06-08 14:01:22 +02:00
|
|
|
/* System Tasks */
|
2019-07-11 12:57:49 +02:00
|
|
|
"$clog2" { FL; return yD_CLOG2; }
|
2007-03-06 18:07:13 +01:00
|
|
|
/* Keywords */
|
2019-07-11 12:57:49 +02:00
|
|
|
"uwire" { FL; return yWIRE; }
|
2007-03-06 18:07:13 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* System Verilog 2005 */
|
2018-03-13 03:26:34 +01:00
|
|
|
<S05,S09,S12,S17,SAX>{
|
2007-03-06 18:07:13 +01:00
|
|
|
/* System Tasks */
|
2019-07-11 12:57:49 +02:00
|
|
|
"$bits" { FL; return yD_BITS; }
|
2020-08-23 17:34:19 +02:00
|
|
|
"$changed" { FL; return yD_CHANGED; }
|
2023-01-28 20:05:26 +01:00
|
|
|
"$changed_gclk" { FL; return yD_CHANGED_GCLK; }
|
2020-05-10 20:27:22 +02:00
|
|
|
"$countbits" { FL; return yD_COUNTBITS; }
|
2019-07-11 12:57:49 +02:00
|
|
|
"$countones" { FL; return yD_COUNTONES; }
|
|
|
|
|
"$dimensions" { FL; return yD_DIMENSIONS; }
|
|
|
|
|
"$error" { FL; return yD_ERROR; }
|
|
|
|
|
"$fatal" { FL; return yD_FATAL; }
|
2020-08-14 13:37:10 +02:00
|
|
|
"$fell" { FL; return yD_FELL; }
|
2023-01-28 20:05:26 +01:00
|
|
|
"$fell_gclk" { FL; return yD_FELL_GCLK; }
|
2019-07-11 12:57:49 +02:00
|
|
|
"$high" { FL; return yD_HIGH; }
|
|
|
|
|
"$increment" { FL; return yD_INCREMENT; }
|
|
|
|
|
"$info" { FL; return yD_INFO; }
|
2020-05-08 03:09:14 +02:00
|
|
|
"$isunbounded" { FL; return yD_ISUNBOUNDED; }
|
2019-07-11 12:57:49 +02:00
|
|
|
"$isunknown" { FL; return yD_ISUNKNOWN; }
|
|
|
|
|
"$left" { FL; return yD_LEFT; }
|
|
|
|
|
"$low" { FL; return yD_LOW; }
|
|
|
|
|
"$onehot" { FL; return yD_ONEHOT; }
|
|
|
|
|
"$onehot0" { FL; return yD_ONEHOT0; }
|
|
|
|
|
"$past" { FL; return yD_PAST; }
|
|
|
|
|
"$right" { FL; return yD_RIGHT; }
|
2020-05-02 14:29:20 +02:00
|
|
|
"$root" { FL; return yD_ROOT; }
|
2020-08-14 13:37:10 +02:00
|
|
|
"$rose" { FL; return yD_ROSE; }
|
2023-01-28 20:05:26 +01:00
|
|
|
"$rose_gclk" { FL; return yD_ROSE_GCLK; }
|
2019-07-11 12:57:49 +02:00
|
|
|
"$size" { FL; return yD_SIZE; }
|
2020-07-29 00:26:24 +02:00
|
|
|
"$stable" { FL; return yD_STABLE; }
|
2023-01-28 20:05:26 +01:00
|
|
|
"$stable_gclk" { FL; return yD_STABLE_GCLK; }
|
2013-01-20 18:19:22 +01:00
|
|
|
"$unpacked_dimensions" { FL; return yD_UNPACKED_DIMENSIONS; }
|
2019-07-11 12:57:49 +02:00
|
|
|
"$warning" { FL; return yD_WARNING; }
|
2009-11-03 04:50:31 +01:00
|
|
|
/* SV2005 Keywords */
|
2020-06-06 15:09:26 +02:00
|
|
|
/* Note assert_strobe was in SystemVerilog 3.1, but removed for SystemVerilog 2005 */
|
2019-07-11 12:57:49 +02:00
|
|
|
"$unit" { FL; return yD_UNIT; } /* Yes, a keyword, not task */
|
|
|
|
|
"alias" { FL; return yALIAS; }
|
|
|
|
|
"always_comb" { FL; return yALWAYS_COMB; }
|
|
|
|
|
"always_ff" { FL; return yALWAYS_FF; }
|
|
|
|
|
"always_latch" { FL; return yALWAYS_LATCH; }
|
|
|
|
|
"assert" { FL; return yASSERT; }
|
2019-12-23 21:03:04 +01:00
|
|
|
"assume" { FL; return yASSUME; }
|
2020-06-06 19:55:15 +02:00
|
|
|
"before" { FL; return yBEFORE; }
|
2019-07-11 12:57:49 +02:00
|
|
|
"bind" { FL; return yBIND; }
|
2020-06-06 15:09:26 +02:00
|
|
|
"bins" { ERROR_RSVD_WORD("SystemVerilog 2005"); }
|
|
|
|
|
"binsof" { ERROR_RSVD_WORD("SystemVerilog 2005"); }
|
2019-07-11 12:57:49 +02:00
|
|
|
"bit" { FL; return yBIT; }
|
|
|
|
|
"break" { FL; return yBREAK; }
|
|
|
|
|
"byte" { FL; return yBYTE; }
|
|
|
|
|
"chandle" { FL; return yCHANDLE; }
|
2019-12-23 21:03:04 +01:00
|
|
|
"class" { FL; return yCLASS; }
|
2019-07-11 12:57:49 +02:00
|
|
|
"clocking" { FL; return yCLOCKING; }
|
|
|
|
|
"const" { FL; return yCONST__LEX; }
|
2020-06-06 18:08:36 +02:00
|
|
|
"constraint" { FL; return yCONSTRAINT; }
|
2019-07-11 12:57:49 +02:00
|
|
|
"context" { FL; return yCONTEXT; }
|
|
|
|
|
"continue" { FL; return yCONTINUE; }
|
|
|
|
|
"cover" { FL; return yCOVER; }
|
2020-06-06 15:09:26 +02:00
|
|
|
"covergroup" { ERROR_RSVD_WORD("SystemVerilog 2005"); }
|
|
|
|
|
"coverpoint" { ERROR_RSVD_WORD("SystemVerilog 2005"); }
|
|
|
|
|
"cross" { ERROR_RSVD_WORD("SystemVerilog 2005"); }
|
2020-06-06 18:08:36 +02:00
|
|
|
"dist" { FL; return yDIST; }
|
2019-07-11 12:57:49 +02:00
|
|
|
"do" { FL; return yDO; }
|
2019-12-23 21:03:04 +01:00
|
|
|
"endclass" { FL; return yENDCLASS; }
|
2019-07-11 12:57:49 +02:00
|
|
|
"endclocking" { FL; return yENDCLOCKING; }
|
2020-06-06 15:09:26 +02:00
|
|
|
"endgroup" { ERROR_RSVD_WORD("SystemVerilog 2005"); }
|
2019-07-11 12:57:49 +02:00
|
|
|
"endinterface" { FL; return yENDINTERFACE; }
|
|
|
|
|
"endpackage" { FL; return yENDPACKAGE; }
|
|
|
|
|
"endprogram" { FL; return yENDPROGRAM; }
|
|
|
|
|
"endproperty" { FL; return yENDPROPERTY; }
|
2023-02-11 19:03:10 +01:00
|
|
|
"endsequence" { FL; return yENDSEQUENCE; }
|
2019-07-11 12:57:49 +02:00
|
|
|
"enum" { FL; return yENUM; }
|
2020-06-06 15:09:26 +02:00
|
|
|
"expect" { ERROR_RSVD_WORD("SystemVerilog 2005"); }
|
2019-07-11 12:57:49 +02:00
|
|
|
"export" { FL; return yEXPORT; }
|
2019-12-23 21:03:04 +01:00
|
|
|
"extends" { FL; return yEXTENDS; }
|
2019-07-11 12:57:49 +02:00
|
|
|
"extern" { FL; return yEXTERN; }
|
|
|
|
|
"final" { FL; return yFINAL; }
|
2020-06-06 15:09:26 +02:00
|
|
|
"first_match" { ERROR_RSVD_WORD("SystemVerilog 2005"); }
|
2019-07-11 12:57:49 +02:00
|
|
|
"forkjoin" { FL; return yFORKJOIN; }
|
|
|
|
|
"iff" { FL; return yIFF; }
|
2020-06-06 15:09:26 +02:00
|
|
|
"ignore_bins" { ERROR_RSVD_WORD("SystemVerilog 2005"); }
|
|
|
|
|
"illegal_bins" { ERROR_RSVD_WORD("SystemVerilog 2005"); }
|
2019-07-11 12:57:49 +02:00
|
|
|
"import" { FL; return yIMPORT; }
|
|
|
|
|
"inside" { FL; return yINSIDE; }
|
|
|
|
|
"int" { FL; return yINT; }
|
|
|
|
|
"interface" { FL; return yINTERFACE; }
|
2023-03-06 01:57:09 +01:00
|
|
|
"intersect" { FL; return yINTERSECT; }
|
2019-12-23 21:19:22 +01:00
|
|
|
"join_any" { FL; return yJOIN_ANY; }
|
|
|
|
|
"join_none" { FL; return yJOIN_NONE; }
|
2019-12-23 21:03:04 +01:00
|
|
|
"local" { FL; return yLOCAL__LEX; }
|
2019-07-11 12:57:49 +02:00
|
|
|
"logic" { FL; return yLOGIC; }
|
|
|
|
|
"longint" { FL; return yLONGINT; }
|
2023-03-06 05:58:54 +01:00
|
|
|
"matches" { FL; return yMATCHES; }
|
2019-07-11 12:57:49 +02:00
|
|
|
"modport" { FL; return yMODPORT; }
|
2019-12-23 21:03:04 +01:00
|
|
|
"new" { FL; return yNEW__LEX; }
|
2019-07-11 12:57:49 +02:00
|
|
|
"null" { FL; return yNULL; }
|
|
|
|
|
"package" { FL; return yPACKAGE; }
|
|
|
|
|
"packed" { FL; return yPACKED; }
|
|
|
|
|
"priority" { FL; return yPRIORITY; }
|
|
|
|
|
"program" { FL; return yPROGRAM; }
|
|
|
|
|
"property" { FL; return yPROPERTY; }
|
2019-12-23 21:03:04 +01:00
|
|
|
"protected" { FL; return yPROTECTED; }
|
2019-07-11 12:57:49 +02:00
|
|
|
"pure" { FL; return yPURE; }
|
|
|
|
|
"rand" { FL; return yRAND; }
|
|
|
|
|
"randc" { FL; return yRANDC; }
|
|
|
|
|
"randcase" { FL; return yRANDCASE; }
|
2020-06-06 17:22:48 +02:00
|
|
|
"randomize" { FL; return yRANDOMIZE; }
|
2023-02-11 19:03:10 +01:00
|
|
|
"randsequence" { FL; return yRANDSEQUENCE; }
|
2019-07-11 12:57:49 +02:00
|
|
|
"ref" { FL; return yREF; }
|
|
|
|
|
"restrict" { FL; return yRESTRICT; }
|
|
|
|
|
"return" { FL; return yRETURN; }
|
2023-03-06 11:12:09 +01:00
|
|
|
"sequence" { FL; return ySEQUENCE; }
|
2019-07-11 12:57:49 +02:00
|
|
|
"shortint" { FL; return ySHORTINT; }
|
|
|
|
|
"shortreal" { FL; return ySHORTREAL; }
|
2020-06-06 18:08:36 +02:00
|
|
|
"solve" { FL; return ySOLVE; }
|
|
|
|
|
"static" { FL; return ySTATIC__LEX; }
|
2019-07-11 12:57:49 +02:00
|
|
|
"string" { FL; return ySTRING; }
|
|
|
|
|
"struct" { FL; return ySTRUCT; }
|
2019-12-23 21:03:04 +01:00
|
|
|
"super" { FL; return ySUPER; }
|
2020-06-06 15:09:26 +02:00
|
|
|
"tagged" { ERROR_RSVD_WORD("SystemVerilog 2005"); }
|
2019-12-23 21:03:04 +01:00
|
|
|
"this" { FL; return yTHIS; }
|
2023-03-06 01:57:09 +01:00
|
|
|
"throughout" { FL; return yTHROUGHOUT; }
|
2019-07-11 12:57:49 +02:00
|
|
|
"timeprecision" { FL; return yTIMEPRECISION; }
|
|
|
|
|
"timeunit" { FL; return yTIMEUNIT; }
|
2023-02-13 02:09:10 +01:00
|
|
|
"type" { FL; return yTYPE__LEX; }
|
2019-07-11 12:57:49 +02:00
|
|
|
"typedef" { FL; return yTYPEDEF; }
|
|
|
|
|
"union" { FL; return yUNION; }
|
|
|
|
|
"unique" { FL; return yUNIQUE; }
|
|
|
|
|
"var" { FL; return yVAR; }
|
2019-12-23 21:03:04 +01:00
|
|
|
"virtual" { FL; return yVIRTUAL__LEX; }
|
2019-07-11 12:57:49 +02:00
|
|
|
"void" { FL; return yVOID; }
|
2019-07-12 02:49:35 +02:00
|
|
|
"wait_order" { ERROR_RSVD_WORD("SystemVerilog 2005"); }
|
|
|
|
|
"wildcard" { ERROR_RSVD_WORD("SystemVerilog 2005"); }
|
2020-06-06 17:11:23 +02:00
|
|
|
"with" { FL; return yWITH__LEX; }
|
2023-03-06 01:57:09 +01:00
|
|
|
"within" { FL; return yWITHIN; }
|
2007-03-05 21:29:05 +01:00
|
|
|
}
|
|
|
|
|
|
2010-01-22 03:58:45 +01:00
|
|
|
/* SystemVerilog 2009 */
|
2018-03-13 03:26:34 +01:00
|
|
|
<S09,S12,S17,SAX>{
|
2010-01-22 03:58:45 +01:00
|
|
|
/* Keywords */
|
2023-03-06 01:42:21 +01:00
|
|
|
"accept_on" { FL; return yACCEPT_ON; }
|
2023-02-11 20:31:28 +01:00
|
|
|
"checker" { FL; return yCHECKER; }
|
|
|
|
|
"endchecker" { FL; return yENDCHECKER; }
|
2023-03-06 01:42:21 +01:00
|
|
|
"eventually" { FL; return yEVENTUALLY; }
|
2020-06-06 15:09:26 +02:00
|
|
|
"global" { FL; return yGLOBAL__LEX; }
|
2023-03-06 01:42:21 +01:00
|
|
|
"implies" { FL; return yIMPLIES; }
|
2019-07-12 02:49:35 +02:00
|
|
|
"let" { ERROR_RSVD_WORD("SystemVerilog 2009"); }
|
2023-03-06 01:42:21 +01:00
|
|
|
"nexttime" { FL; return yNEXTTIME; }
|
|
|
|
|
"reject_on" { FL; return yREJECT_ON; }
|
|
|
|
|
"s_always" { FL; return yS_ALWAYS; }
|
|
|
|
|
"s_eventually" { FL; return yS_EVENTUALLY; }
|
|
|
|
|
"s_nexttime" { FL; return yS_NEXTTIME; }
|
|
|
|
|
"s_until" { FL; return yS_UNTIL; }
|
|
|
|
|
"s_until_with" { FL; return yS_UNTIL_WITH; }
|
|
|
|
|
"strong" { FL; return ySTRONG; }
|
|
|
|
|
"sync_accept_on" { FL; return ySYNC_ACCEPT_ON; }
|
|
|
|
|
"sync_reject_on" { FL; return ySYNC_REJECT_ON; }
|
2020-06-06 15:09:26 +02:00
|
|
|
"unique0" { FL; return yUNIQUE0; }
|
2023-03-06 01:42:21 +01:00
|
|
|
"until" { FL; return yUNTIL; }
|
|
|
|
|
"until_with" { FL; return yUNTIL_WITH; }
|
2022-11-01 23:53:47 +01:00
|
|
|
"untyped" { FL; return yUNTYPED; }
|
2023-03-06 01:42:21 +01:00
|
|
|
"weak" { FL; return yWEAK; }
|
2010-01-22 03:58:45 +01:00
|
|
|
}
|
|
|
|
|
|
2013-02-27 05:01:19 +01:00
|
|
|
/* System Verilog 2012 */
|
2018-03-13 03:26:34 +01:00
|
|
|
<S12,S17,SAX>{
|
2013-02-27 05:01:19 +01:00
|
|
|
/* Keywords */
|
2019-12-23 21:03:04 +01:00
|
|
|
"implements" { FL; return yIMPLEMENTS; }
|
2023-03-03 02:02:14 +01:00
|
|
|
"interconnect" { FL; return yINTERCONNECT; }
|
2023-03-04 16:50:28 +01:00
|
|
|
"nettype" { FL; return yNETTYPE; }
|
2020-06-06 18:08:36 +02:00
|
|
|
"soft" { FL; return ySOFT; }
|
2013-02-27 05:01:19 +01:00
|
|
|
}
|
|
|
|
|
|
2018-03-13 03:26:34 +01:00
|
|
|
/* System Verilog 2017 */
|
|
|
|
|
/* No new keywords */
|
|
|
|
|
|
2007-03-06 18:07:13 +01:00
|
|
|
/* Default PLI rule */
|
2020-12-17 00:40:45 +01:00
|
|
|
<V95,V01NC,V01C,V05,VA5,S05,S09,S12,S17,SAX>{
|
2021-07-24 18:49:07 +02:00
|
|
|
"$"[a-zA-Z_$][a-zA-Z0-9_$]* { const string str (yytext, yyleng);
|
2019-07-11 12:57:49 +02:00
|
|
|
yylval.strp = PARSEP->newString(AstNode::encodeName(str));
|
2020-05-23 17:55:34 +02:00
|
|
|
FL; return yaD_PLI;
|
2019-07-11 12:57:49 +02:00
|
|
|
}
|
2007-03-06 18:07:13 +01:00
|
|
|
}
|
|
|
|
|
|
2011-11-25 06:49:38 +01:00
|
|
|
/************************************************************************/
|
|
|
|
|
/* AMS */
|
|
|
|
|
|
2014-05-11 15:36:39 +02:00
|
|
|
<VA5,SAX>{
|
2011-11-25 06:49:38 +01:00
|
|
|
/* Generic unsupported warnings */
|
2022-12-23 13:34:49 +01:00
|
|
|
"1step" { FL; return ya1STEP; }
|
2019-07-12 02:49:35 +02:00
|
|
|
"above" { ERROR_RSVD_WORD("AMS"); }
|
|
|
|
|
"abs" { ERROR_RSVD_WORD("AMS"); }
|
|
|
|
|
"absdelay" { ERROR_RSVD_WORD("AMS"); }
|
|
|
|
|
"abstol" { ERROR_RSVD_WORD("AMS"); }
|
|
|
|
|
"ac_stim" { ERROR_RSVD_WORD("AMS"); }
|
|
|
|
|
"access" { ERROR_RSVD_WORD("AMS"); }
|
|
|
|
|
"acos" { ERROR_RSVD_WORD("AMS"); }
|
|
|
|
|
"acosh" { ERROR_RSVD_WORD("AMS"); }
|
|
|
|
|
"aliasparam" { ERROR_RSVD_WORD("AMS"); }
|
|
|
|
|
"analog" { ERROR_RSVD_WORD("AMS"); }
|
|
|
|
|
"analysis" { ERROR_RSVD_WORD("AMS"); }
|
2019-07-11 12:57:49 +02:00
|
|
|
"asin" { FL; return yD_ASIN; }
|
|
|
|
|
"asinh" { FL; return yD_ASINH; }
|
2019-07-12 02:49:35 +02:00
|
|
|
"assert" { ERROR_RSVD_WORD("AMS"); }
|
2019-07-11 12:57:49 +02:00
|
|
|
"atan" { FL; return yD_ATAN; }
|
|
|
|
|
"atan2" { FL; return yD_ATAN2; }
|
|
|
|
|
"atanh" { FL; return yD_ATANH; }
|
2019-07-12 02:49:35 +02:00
|
|
|
"branch" { ERROR_RSVD_WORD("AMS"); }
|
2019-07-11 12:57:49 +02:00
|
|
|
"ceil" { FL; return yD_CEIL; }
|
2019-07-12 02:49:35 +02:00
|
|
|
"connect" { ERROR_RSVD_WORD("AMS"); }
|
|
|
|
|
"connectmodule" { ERROR_RSVD_WORD("AMS"); }
|
|
|
|
|
"connectrules" { ERROR_RSVD_WORD("AMS"); }
|
|
|
|
|
"continuous" { ERROR_RSVD_WORD("AMS"); }
|
2019-07-11 12:57:49 +02:00
|
|
|
"cos" { FL; return yD_COS; }
|
|
|
|
|
"cosh" { FL; return yD_COSH; }
|
2019-07-12 02:49:35 +02:00
|
|
|
"cross" { ERROR_RSVD_WORD("AMS"); }
|
|
|
|
|
"ddt" { ERROR_RSVD_WORD("AMS"); }
|
|
|
|
|
"ddt_nature" { ERROR_RSVD_WORD("AMS"); }
|
|
|
|
|
"ddx" { ERROR_RSVD_WORD("AMS"); }
|
|
|
|
|
"discipline" { ERROR_RSVD_WORD("AMS"); }
|
|
|
|
|
"discrete" { ERROR_RSVD_WORD("AMS"); }
|
|
|
|
|
"domain" { ERROR_RSVD_WORD("AMS"); }
|
|
|
|
|
"driver_update" { ERROR_RSVD_WORD("AMS"); }
|
|
|
|
|
"endconnectrules" { ERROR_RSVD_WORD("AMS"); }
|
|
|
|
|
"enddiscipline" { ERROR_RSVD_WORD("AMS"); }
|
|
|
|
|
"endnature" { ERROR_RSVD_WORD("AMS"); }
|
|
|
|
|
"endparamset" { ERROR_RSVD_WORD("AMS"); }
|
|
|
|
|
"exclude" { ERROR_RSVD_WORD("AMS"); }
|
2019-07-11 12:57:49 +02:00
|
|
|
"exp" { FL; return yD_EXP; }
|
2019-07-12 02:49:35 +02:00
|
|
|
"final_step" { ERROR_RSVD_WORD("AMS"); }
|
|
|
|
|
"flicker_noise" { ERROR_RSVD_WORD("AMS"); }
|
2019-07-11 12:57:49 +02:00
|
|
|
"floor" { FL; return yD_FLOOR; }
|
2019-07-12 02:49:35 +02:00
|
|
|
"flow" { ERROR_RSVD_WORD("AMS"); }
|
|
|
|
|
"from" { ERROR_RSVD_WORD("AMS"); }
|
|
|
|
|
"ground" { ERROR_RSVD_WORD("AMS"); }
|
2019-07-11 12:57:49 +02:00
|
|
|
"hypot" { FL; return yD_HYPOT; }
|
2019-07-12 02:49:35 +02:00
|
|
|
"idt" { ERROR_RSVD_WORD("AMS"); }
|
|
|
|
|
"idt_nature" { ERROR_RSVD_WORD("AMS"); }
|
|
|
|
|
"idtmod" { ERROR_RSVD_WORD("AMS"); }
|
|
|
|
|
"inf" { ERROR_RSVD_WORD("AMS"); }
|
|
|
|
|
"initial_step" { ERROR_RSVD_WORD("AMS"); }
|
|
|
|
|
"laplace_nd" { ERROR_RSVD_WORD("AMS"); }
|
|
|
|
|
"laplace_np" { ERROR_RSVD_WORD("AMS"); }
|
|
|
|
|
"laplace_zd" { ERROR_RSVD_WORD("AMS"); }
|
|
|
|
|
"laplace_zp" { ERROR_RSVD_WORD("AMS"); }
|
|
|
|
|
"last_crossing" { ERROR_RSVD_WORD("AMS"); }
|
|
|
|
|
"limexp" { ERROR_RSVD_WORD("AMS"); }
|
2019-07-11 12:57:49 +02:00
|
|
|
"ln" { FL; return yD_LN; }
|
|
|
|
|
"log" { FL; return yD_LOG10; }
|
2019-07-12 02:49:35 +02:00
|
|
|
"max" { ERROR_RSVD_WORD("AMS"); }
|
|
|
|
|
"merged" { ERROR_RSVD_WORD("AMS"); }
|
|
|
|
|
"min" { ERROR_RSVD_WORD("AMS"); }
|
|
|
|
|
"nature" { ERROR_RSVD_WORD("AMS"); }
|
|
|
|
|
"net_resolution" { ERROR_RSVD_WORD("AMS"); }
|
|
|
|
|
"noise_table" { ERROR_RSVD_WORD("AMS"); }
|
|
|
|
|
"paramset" { ERROR_RSVD_WORD("AMS"); }
|
|
|
|
|
"potential" { ERROR_RSVD_WORD("AMS"); }
|
2019-07-11 12:57:49 +02:00
|
|
|
"pow" { FL; return yD_POW; }
|
2019-07-12 02:49:35 +02:00
|
|
|
"resolveto" { ERROR_RSVD_WORD("AMS"); }
|
2019-07-11 12:57:49 +02:00
|
|
|
"sin" { FL; return yD_SIN; }
|
|
|
|
|
"sinh" { FL; return yD_SINH; }
|
2019-07-12 02:49:35 +02:00
|
|
|
"slew" { ERROR_RSVD_WORD("AMS"); }
|
|
|
|
|
"split" { ERROR_RSVD_WORD("AMS"); }
|
2019-07-11 12:57:49 +02:00
|
|
|
"sqrt" { FL; return yD_SQRT; }
|
|
|
|
|
"string" { FL; return ySTRING; }
|
|
|
|
|
"tan" { FL; return yD_TAN; }
|
|
|
|
|
"tanh" { FL; return yD_TANH; }
|
2019-07-12 02:49:35 +02:00
|
|
|
"timer" { ERROR_RSVD_WORD("AMS"); }
|
|
|
|
|
"transition" { ERROR_RSVD_WORD("AMS"); }
|
|
|
|
|
"units" { ERROR_RSVD_WORD("AMS"); }
|
|
|
|
|
"white_noise" { ERROR_RSVD_WORD("AMS"); }
|
2019-07-11 12:57:49 +02:00
|
|
|
"wreal" { FL; return yWREAL; }
|
2019-07-12 02:49:35 +02:00
|
|
|
"zi_nd" { ERROR_RSVD_WORD("AMS"); }
|
|
|
|
|
"zi_np" { ERROR_RSVD_WORD("AMS"); }
|
|
|
|
|
"zi_zd" { ERROR_RSVD_WORD("AMS"); }
|
|
|
|
|
"zi_zp" { ERROR_RSVD_WORD("AMS"); }
|
2011-11-25 06:49:38 +01:00
|
|
|
}
|
|
|
|
|
|
2007-03-06 18:07:13 +01:00
|
|
|
/************************************************************************/
|
|
|
|
|
/* Meta comments */
|
|
|
|
|
|
2007-03-05 21:29:05 +01:00
|
|
|
/* Converted from //{cmt}verilator ...{cmt} by preprocessor */
|
2020-12-17 00:40:45 +01:00
|
|
|
<V95,V01NC,V01C,V05,VA5,S05,S09,S12,S17,SAX>{
|
2019-07-15 03:42:03 +02:00
|
|
|
"/*verilator"{ws}*"*/" { FL_FWD; FL_BRK; } /* Ignore empty comments, may be `endif // verilator */
|
2019-07-11 12:57:49 +02:00
|
|
|
"/*verilator clock_enable*/" { FL; return yVL_CLOCK_ENABLE; }
|
2020-06-06 15:09:26 +02:00
|
|
|
"/*verilator clocker*/" { FL; return yVL_CLOCKER; }
|
2019-07-11 12:57:49 +02:00
|
|
|
"/*verilator coverage_block_off*/" { FL; return yVL_COVERAGE_BLOCK_OFF; }
|
2020-06-07 19:45:50 +02:00
|
|
|
"/*verilator coverage_off*/" { FL_FWD; PARSEP->lexFileline()->coverageOn(false); FL_BRK; }
|
|
|
|
|
"/*verilator coverage_on*/" { FL_FWD; PARSEP->lexFileline()->coverageOn(true); FL_BRK; }
|
2021-12-19 20:45:06 +01:00
|
|
|
"/*verilator forceable*/" { FL; return yVL_FORCEABLE; }
|
2019-07-11 12:57:49 +02:00
|
|
|
"/*verilator full_case*/" { FL; return yVL_FULL_CASE; }
|
2020-08-15 15:43:53 +02:00
|
|
|
"/*verilator hier_block*/" { FL; return yVL_HIER_BLOCK; }
|
2019-07-11 12:57:49 +02:00
|
|
|
"/*verilator inline_module*/" { FL; return yVL_INLINE_MODULE; }
|
|
|
|
|
"/*verilator isolate_assignments*/" { FL; return yVL_ISOLATE_ASSIGNMENTS; }
|
2020-06-07 18:18:23 +02:00
|
|
|
"/*verilator lint_off"[^*]*"*/" { FL; PARSEP->lexVerilatorCmtLint(yylval.fl, yytext, true); FL_BRK; }
|
|
|
|
|
"/*verilator lint_on"[^*]*"*/" { FL; PARSEP->lexVerilatorCmtLint(yylval.fl, yytext, false); FL_BRK; }
|
2020-06-07 19:45:50 +02:00
|
|
|
"/*verilator lint_restore*/" { FL; PARSEP->lexVerilatorCmtLintRestore(PARSEP->lexFileline()); FL_BRK; }
|
|
|
|
|
"/*verilator lint_save*/" { FL; PARSEP->lexVerilatorCmtLintSave(PARSEP->lexFileline()); FL_BRK; }
|
2020-06-06 15:09:26 +02:00
|
|
|
"/*verilator no_clocker*/" { FL; return yVL_NO_CLOCKER; }
|
2019-07-11 12:57:49 +02:00
|
|
|
"/*verilator no_inline_module*/" { FL; return yVL_NO_INLINE_MODULE; }
|
|
|
|
|
"/*verilator no_inline_task*/" { FL; return yVL_NO_INLINE_TASK; }
|
|
|
|
|
"/*verilator parallel_case*/" { FL; return yVL_PARALLEL_CASE; }
|
|
|
|
|
"/*verilator public*/" { FL; return yVL_PUBLIC; }
|
|
|
|
|
"/*verilator public_flat*/" { FL; return yVL_PUBLIC_FLAT; }
|
2023-02-03 14:47:55 +01:00
|
|
|
"/*verilator public_flat_on*/" { FL; return yVL_PUBLIC_FLAT_ON; }
|
2019-07-11 12:57:49 +02:00
|
|
|
"/*verilator public_flat_rd*/" { FL; return yVL_PUBLIC_FLAT_RD; }
|
2023-02-03 14:47:55 +01:00
|
|
|
"/*verilator public_flat_rd_on*/" { FL; return yVL_PUBLIC_FLAT_RD_ON; }
|
2019-07-11 12:57:49 +02:00
|
|
|
"/*verilator public_flat_rw*/" { FL; return yVL_PUBLIC_FLAT_RW; } // The @(edge) is converted by the preproc
|
2023-02-03 14:47:55 +01:00
|
|
|
"/*verilator public_flat_rw_on*/" { FL; return yVL_PUBLIC_FLAT_RW_ON; }
|
|
|
|
|
"/*verilator public_flat_rw_on_sns*/" { FL; return yVL_PUBLIC_FLAT_RW_ON_SNS; }
|
2019-07-11 12:57:49 +02:00
|
|
|
"/*verilator public_module*/" { FL; return yVL_PUBLIC_MODULE; }
|
2023-02-03 14:47:55 +01:00
|
|
|
"/*verilator public_on*/" { FL; return yVL_PUBLIC_ON; }
|
|
|
|
|
"/*verilator public_off*/" { FL; return yVL_PUBLIC_OFF; } // terminates previous 'verilator public*_on'
|
2019-07-11 12:57:49 +02:00
|
|
|
"/*verilator sc_bv*/" { FL; return yVL_SC_BV; }
|
2020-08-29 16:45:47 +02:00
|
|
|
"/*verilator sc_clock*/" { FL; yylval.fl->v3warn(DEPRECATED, "sc_clock is ignored"); FL_BRK; }
|
2019-07-11 12:57:49 +02:00
|
|
|
"/*verilator sformat*/" { FL; return yVL_SFORMAT; }
|
2020-06-06 15:09:26 +02:00
|
|
|
"/*verilator split_var*/" { FL; return yVL_SPLIT_VAR; }
|
2020-06-07 19:09:18 +02:00
|
|
|
"/*verilator tag"[^*]*"*/" { FL; yylval.strp = PARSEP->newString(V3ParseImp::lexParseTag(yytext));
|
|
|
|
|
return yVL_TAG; }
|
Timing support (#3363)
Adds timing support to Verilator. It makes it possible to use delays,
event controls within processes (not just at the start), wait
statements, and forks.
Building a design with those constructs requires a compiler that
supports C++20 coroutines (GCC 10, Clang 5).
The basic idea is to have processes and tasks with delays/event controls
implemented as C++20 coroutines. This allows us to suspend and resume
them at any time.
There are five main runtime classes responsible for managing suspended
coroutines:
* `VlCoroutineHandle`, a wrapper over C++20's `std::coroutine_handle`
with move semantics and automatic cleanup.
* `VlDelayScheduler`, for coroutines suspended by delays. It resumes
them at a proper simulation time.
* `VlTriggerScheduler`, for coroutines suspended by event controls. It
resumes them if its corresponding trigger was set.
* `VlForkSync`, used for syncing `fork..join` and `fork..join_any`
blocks.
* `VlCoroutine`, the return type of all verilated coroutines. It allows
for suspending a stack of coroutines (normally, C++ coroutines are
stackless).
There is a new visitor in `V3Timing.cpp` which:
* scales delays according to the timescale,
* simplifies intra-assignment timing controls and net delays into
regular timing controls and assignments,
* simplifies wait statements into loops with event controls,
* marks processes and tasks with timing controls in them as
suspendable,
* creates delay, trigger scheduler, and fork sync variables,
* transforms timing controls and fork joins into C++ awaits
There are new functions in `V3SchedTiming.cpp` (used by `V3Sched.cpp`)
that integrate static scheduling with timing. This involves providing
external domains for variables, so that the necessary combinational
logic gets triggered after coroutine resumption, as well as statements
that need to be injected into the design eval function to perform this
resumption at the correct time.
There is also a function that transforms forked processes into separate
functions.
See the comments in `verilated_timing.h`, `verilated_timing.cpp`,
`V3Timing.cpp`, and `V3SchedTiming.cpp`, as well as the internals
documentation for more details.
Signed-off-by: Krzysztof Bieganski <kbieganski@antmicro.com>
2022-08-22 14:26:32 +02:00
|
|
|
"/*verilator timing_off*/" { FL_FWD; PARSEP->lexFileline()->timingOn(false); FL_BRK; }
|
|
|
|
|
"/*verilator timing_on*/" { FL_FWD; PARSEP->lexFileline()->timingOn(true); FL_BRK; }
|
2021-11-27 23:07:27 +01:00
|
|
|
"/*verilator trace_init_task*/" { FL; return yVL_TRACE_INIT_TASK; }
|
2020-06-07 19:45:50 +02:00
|
|
|
"/*verilator tracing_off*/" { FL_FWD; PARSEP->lexFileline()->tracingOn(false); FL_BRK; }
|
|
|
|
|
"/*verilator tracing_on*/" { FL_FWD; PARSEP->lexFileline()->tracingOn(true); FL_BRK; }
|
2019-07-15 03:42:03 +02:00
|
|
|
|
|
|
|
|
"/**/" { FL_FWD; FL_BRK; }
|
2020-06-07 18:18:23 +02:00
|
|
|
"/*"[^*]+"*/" { FL; V3ParseImp::lexVerilatorCmtBad(yylval.fl, yytext); FL_BRK; }
|
2007-03-05 21:29:05 +01:00
|
|
|
}
|
|
|
|
|
|
2007-03-06 18:07:13 +01:00
|
|
|
/************************************************************************/
|
2009-05-05 19:39:25 +02:00
|
|
|
|
|
|
|
|
/* Single character operator thingies */
|
2020-12-17 00:40:45 +01:00
|
|
|
<V95,V01NC,V01C,V05,VA5,S05,S09,S12,S17,SAX>{
|
2019-07-11 12:57:49 +02:00
|
|
|
"{" { FL; return yytext[0]; }
|
|
|
|
|
"}" { FL; return yytext[0]; }
|
|
|
|
|
"!" { FL; return yytext[0]; }
|
|
|
|
|
"#" { FL; return yytext[0]; }
|
|
|
|
|
"$" { FL; return yytext[0]; }
|
|
|
|
|
"%" { FL; return yytext[0]; }
|
|
|
|
|
"&" { FL; return yytext[0]; }
|
|
|
|
|
"(" { FL; return yytext[0]; }
|
|
|
|
|
")" { FL; return yytext[0]; }
|
|
|
|
|
"*" { FL; return yytext[0]; }
|
|
|
|
|
"+" { FL; return yytext[0]; }
|
|
|
|
|
"," { FL; return yytext[0]; }
|
|
|
|
|
"-" { FL; return yytext[0]; }
|
|
|
|
|
"." { FL; return yytext[0]; }
|
|
|
|
|
"/" { FL; return yytext[0]; }
|
|
|
|
|
":" { FL; return yytext[0]; }
|
|
|
|
|
";" { FL; return yytext[0]; }
|
|
|
|
|
"<" { FL; return yytext[0]; }
|
|
|
|
|
"=" { FL; return yytext[0]; }
|
|
|
|
|
">" { FL; return yytext[0]; }
|
|
|
|
|
"?" { FL; return yytext[0]; }
|
|
|
|
|
"@" { FL; return yytext[0]; }
|
|
|
|
|
"[" { FL; return yytext[0]; }
|
|
|
|
|
"]" { FL; return yytext[0]; }
|
|
|
|
|
"^" { FL; return yytext[0]; }
|
|
|
|
|
"|" { FL; return yytext[0]; }
|
|
|
|
|
"~" { FL; return yytext[0]; }
|
2009-05-05 19:39:25 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/************************************************************************/
|
|
|
|
|
/* Operators and multi-character symbols */
|
2007-03-06 18:07:13 +01:00
|
|
|
|
2007-03-05 21:29:05 +01:00
|
|
|
/* Verilog 1995 Operators */
|
2020-12-17 00:40:45 +01:00
|
|
|
<V95,V01NC,V01C,V05,VA5,S05,S09,S12,S17,SAX>{
|
2019-07-11 12:57:49 +02:00
|
|
|
"&&" { FL; return yP_ANDAND; }
|
|
|
|
|
"||" { FL; return yP_OROR; }
|
|
|
|
|
"<=" { FL; return yP_LTE; }
|
|
|
|
|
">=" { FL; return yP_GTE; }
|
|
|
|
|
"<<" { FL; return yP_SLEFT; }
|
|
|
|
|
">>" { FL; return yP_SRIGHT; }
|
|
|
|
|
"==" { FL; return yP_EQUAL; }
|
|
|
|
|
"!=" { FL; return yP_NOTEQUAL; }
|
|
|
|
|
"===" { FL; return yP_CASEEQUAL; }
|
|
|
|
|
"!==" { FL; return yP_CASENOTEQUAL; }
|
|
|
|
|
"^~" { FL; return yP_XNOR; }
|
|
|
|
|
"~^" { FL; return yP_XNOR; }
|
|
|
|
|
"~&" { FL; return yP_NAND; }
|
|
|
|
|
"~|" { FL; return yP_NOR; }
|
|
|
|
|
"->" { FL; return yP_MINUSGT; }
|
|
|
|
|
"=>" { FL; return yP_EQGT; }
|
|
|
|
|
"*>" { FL; return yP_ASTGT; }
|
|
|
|
|
"&&&" { FL; return yP_ANDANDAND; }
|
2007-03-05 21:29:05 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Verilog 2001 Operators */
|
2020-12-17 00:40:45 +01:00
|
|
|
<V01NC,V01C,V05,VA5,S05,S09,S12,S17,SAX>{
|
2019-07-11 12:57:49 +02:00
|
|
|
"<<<" { FL; return yP_SLEFT; }
|
|
|
|
|
">>>" { FL; return yP_SSRIGHT; }
|
|
|
|
|
"**" { FL; return yP_POW; }
|
|
|
|
|
"+:" { FL; return yP_PLUSCOLON; }
|
|
|
|
|
"-:" { FL; return yP_MINUSCOLON; }
|
|
|
|
|
".*" { FL; return yP_DOTSTAR; }
|
|
|
|
|
":+" { FL; yyless(1);
|
2020-06-07 16:10:20 +02:00
|
|
|
yylval.fl->v3warn(COLONPLUS, "Perhaps instead of ':+' the intent was '+:'?");
|
2017-11-16 02:19:12 +01:00
|
|
|
return ':'; }
|
2007-03-05 21:29:05 +01:00
|
|
|
}
|
|
|
|
|
|
2007-07-18 17:01:39 +02:00
|
|
|
/* SystemVerilog Operators */
|
2018-03-13 03:26:34 +01:00
|
|
|
<S05,S09,S12,S17,SAX>{
|
2019-07-11 12:57:49 +02:00
|
|
|
"'" { FL; return yP_TICK; }
|
|
|
|
|
"'{" { FL; return yP_TICKBRA; }
|
|
|
|
|
"==?" { FL; return yP_WILDEQUAL; }
|
|
|
|
|
"!=?" { FL; return yP_WILDNOTEQUAL; }
|
|
|
|
|
"++" { FL; return yP_PLUSPLUS; }
|
|
|
|
|
"--" { FL; return yP_MINUSMINUS; }
|
|
|
|
|
"+=" { FL; return yP_PLUSEQ; }
|
|
|
|
|
"-=" { FL; return yP_MINUSEQ; }
|
|
|
|
|
"*=" { FL; return yP_TIMESEQ; }
|
|
|
|
|
"/=" { FL; return yP_DIVEQ; }
|
|
|
|
|
"%=" { FL; return yP_MODEQ; }
|
|
|
|
|
"&=" { FL; return yP_ANDEQ; }
|
|
|
|
|
"|=" { FL; return yP_OREQ; }
|
|
|
|
|
"^=" { FL; return yP_XOREQ; }
|
|
|
|
|
"<<=" { FL; return yP_SLEFTEQ; }
|
|
|
|
|
">>=" { FL; return yP_SRIGHTEQ; }
|
|
|
|
|
"<<<=" { FL; return yP_SLEFTEQ; }
|
|
|
|
|
">>>=" { FL; return yP_SSRIGHTEQ; }
|
|
|
|
|
"->>" { FL; return yP_MINUSGTGT; }
|
|
|
|
|
"##" { FL; return yP_POUNDPOUND; }
|
2023-03-06 01:42:21 +01:00
|
|
|
"#-#" { FL; return yP_POUNDMINUSPD; }
|
|
|
|
|
"#=#" { FL; return yP_POUNDEQPD; }
|
2019-07-11 12:57:49 +02:00
|
|
|
"@@" { FL; return yP_ATAT; }
|
|
|
|
|
"::" { FL; return yP_COLONCOLON; }
|
|
|
|
|
":=" { FL; return yP_COLONEQ; }
|
|
|
|
|
":/"[^\/\*] { FL; return yP_COLONDIV; } /* : then comment is not ":/" */
|
|
|
|
|
"|->" { FL; return yP_ORMINUSGT; }
|
|
|
|
|
"|=>" { FL; return yP_OREQGT; }
|
2009-05-05 19:39:25 +02:00
|
|
|
/* Some simulators allow whitespace here. Grr */
|
2019-07-11 12:57:49 +02:00
|
|
|
"["{ws}*"*" { FL; return yP_BRASTAR; }
|
2023-03-06 05:22:41 +01:00
|
|
|
"["{ws}*"+"{ws}*"]" { FL; return yP_BRAPLUSKET; }
|
2019-07-11 12:57:49 +02:00
|
|
|
"["{ws}*"->" { FL; return yP_BRAMINUSGT; }
|
2023-03-06 05:22:41 +01:00
|
|
|
"["{ws}*"=" { FL; return yP_BRAEQ; }
|
2007-07-18 17:01:39 +02:00
|
|
|
}
|
|
|
|
|
|
2019-06-02 01:40:06 +02:00
|
|
|
/* SystemVerilog 2009 Operators */
|
|
|
|
|
<S09,S12,S17,SAX,VLT>{
|
2019-07-11 12:57:49 +02:00
|
|
|
"<->" { FL; return yP_LTMINUSGT; }
|
2019-06-02 01:40:06 +02:00
|
|
|
}
|
|
|
|
|
|
2007-03-05 21:29:05 +01:00
|
|
|
/* Identifiers and numbers */
|
2020-12-17 00:40:45 +01:00
|
|
|
<V95,V01NC,V01C,V05,VA5,S05,S09,S12,S17,SAX,VLT>{
|
2019-07-11 12:57:49 +02:00
|
|
|
{escid} { FL; yylval.strp = PARSEP->newString
|
2021-07-24 18:49:07 +02:00
|
|
|
(AstNode::encodeName(std::string{yytext+1})); // +1 to skip the backslash
|
2019-07-11 12:57:49 +02:00
|
|
|
return yaID__LEX;
|
|
|
|
|
}
|
2021-07-24 18:49:07 +02:00
|
|
|
{id} { FL; yylval.strp = PARSEP->newString(AstNode::encodeName(std::string{yytext}));
|
2019-07-11 12:57:49 +02:00
|
|
|
return yaID__LEX;
|
|
|
|
|
}
|
|
|
|
|
\"[^\"\\]*\" { FL; yylval.strp = PARSEP->newString(yytext+1, yyleng-2);
|
|
|
|
|
return yaSTRING;
|
|
|
|
|
}
|
|
|
|
|
\" { yy_push_state(STRING); yymore(); }
|
2022-11-18 02:37:51 +01:00
|
|
|
\"\"\" { yy_push_state(QQQ); yymore(); }
|
2019-07-11 12:57:49 +02:00
|
|
|
{vnum} {
|
|
|
|
|
/* "# 1'b0" is a delay value so must lex as "#" "1" "'b0" */
|
2020-06-07 18:18:23 +02:00
|
|
|
if (PARSEP->lexPrevToken()=='#') {
|
2019-07-11 12:57:49 +02:00
|
|
|
int shortlen = 0;
|
2023-02-11 02:32:35 +01:00
|
|
|
while (std::isdigit(yytext[shortlen])) ++shortlen;
|
2019-07-11 12:57:49 +02:00
|
|
|
if (shortlen) {
|
2019-07-15 03:42:03 +02:00
|
|
|
// Push rest past numbers for later parse
|
2021-07-24 18:49:07 +02:00
|
|
|
PARSEP->lexUnputString(yytext + shortlen, yyleng - shortlen);
|
2019-07-11 12:57:49 +02:00
|
|
|
// Return is stuff before the tick
|
2019-07-15 03:42:03 +02:00
|
|
|
yyleng = shortlen;
|
|
|
|
|
yytext[yyleng] = '\0';
|
|
|
|
|
FL; yylval.nump = PARSEP->newNumber(yylval.fl, (char*)yytext);
|
2019-07-11 12:57:49 +02:00
|
|
|
return yaINTNUM;
|
|
|
|
|
}
|
|
|
|
|
}
|
2019-07-15 03:42:03 +02:00
|
|
|
FL; yylval.nump = PARSEP->newNumber(yylval. fl, (char*)yytext);
|
2009-05-05 19:39:25 +02:00
|
|
|
return yaINTNUM;
|
2019-07-11 12:57:49 +02:00
|
|
|
}
|
|
|
|
|
[0-9][_0-9]* {
|
|
|
|
|
FL; yylval.nump = PARSEP->newNumber(yylval.fl, (char*)yytext);
|
2007-05-12 18:29:25 +02:00
|
|
|
return yaINTNUM;
|
2019-07-11 12:57:49 +02:00
|
|
|
}
|
2007-05-18 20:48:22 +02:00
|
|
|
[0-9][_0-9]*(\.[_0-9]+)([eE][-+]?[_0-9]+)? {
|
2020-06-07 16:10:20 +02:00
|
|
|
FL; yylval.cdouble = lexParseDouble(yylval.fl, yytext, yyleng);
|
2007-05-12 18:29:25 +02:00
|
|
|
return yaFLOATNUM;
|
2019-07-11 12:57:49 +02:00
|
|
|
}
|
2007-05-18 20:48:22 +02:00
|
|
|
[0-9][_0-9]*(\.[_0-9]+)?([eE][-+]?[_0-9]+) {
|
2020-06-07 16:10:20 +02:00
|
|
|
FL; yylval.cdouble = lexParseDouble(yylval.fl, yytext, yyleng);
|
2007-05-12 18:29:25 +02:00
|
|
|
return yaFLOATNUM;
|
2019-07-11 12:57:49 +02:00
|
|
|
}
|
2020-04-16 01:39:03 +02:00
|
|
|
[0-9][_0-9]*(\.[_0-9]+)?(fs|ps|ns|us|ms|s) {
|
2020-06-07 18:18:23 +02:00
|
|
|
FL; yylval.cdouble = V3ParseImp::lexParseTimenum(yytext);
|
2020-04-16 01:39:03 +02:00
|
|
|
return yaTIMENUM;
|
|
|
|
|
}
|
|
|
|
|
1step {
|
2022-12-23 13:34:49 +01:00
|
|
|
return ya1STEP;
|
2019-07-11 12:57:49 +02:00
|
|
|
}
|
2007-03-05 21:29:05 +01:00
|
|
|
}
|
2006-08-26 13:35:28 +02:00
|
|
|
|
|
|
|
|
/************************************************************************/
|
|
|
|
|
/* STRINGS */
|
2020-06-07 16:10:20 +02:00
|
|
|
<STRING><<EOF>> { FL; yylval.fl->v3error("EOF in unterminated string");
|
2019-10-01 00:50:27 +02:00
|
|
|
yyleng = 0; yy_pop_state(); FL_BRK; yyterminate(); }
|
2020-06-07 16:10:20 +02:00
|
|
|
<STRING>{crnl} { FL; yylval.fl->v3error("Unterminated string");
|
|
|
|
|
FL_BRK; }
|
2019-07-15 03:42:03 +02:00
|
|
|
<STRING>\\{crnl} { yymore(); }
|
2019-07-11 12:57:49 +02:00
|
|
|
<STRING>\\. { yymore(); }
|
|
|
|
|
<STRING>\" { yy_pop_state();
|
|
|
|
|
FL; yylval.strp = PARSEP->newString(yytext+1, yyleng-2);
|
|
|
|
|
return yaSTRING; }
|
|
|
|
|
<STRING>{word} { yymore(); }
|
|
|
|
|
<STRING>. { yymore(); }
|
2006-08-26 13:35:28 +02:00
|
|
|
|
2007-05-16 20:19:23 +02:00
|
|
|
/************************************************************************/
|
2022-11-18 02:37:51 +01:00
|
|
|
/* """ */
|
|
|
|
|
<QQQ><<EOF>> { FL; yylval.fl->v3error("EOF in unterminated \"\"\" string");
|
|
|
|
|
yyleng = 0; yy_pop_state(); FL_BRK; yyterminate(); }
|
|
|
|
|
<QQQ>\\. { yymore(); }
|
|
|
|
|
<QQQ>\n { yymore(); }
|
|
|
|
|
<QQQ>\"\"\" { yy_pop_state();
|
|
|
|
|
FL; yylval.strp = PARSEP->newString(yytext + 3, yyleng - 6);
|
|
|
|
|
return yaSTRING; }
|
|
|
|
|
<QQQ>\" { yymore(); }
|
|
|
|
|
<QQQ>{word} { yymore(); }
|
|
|
|
|
<QQQ>. { yymore(); }
|
|
|
|
|
|
|
|
|
|
/************************************************************************/
|
2007-05-16 20:19:23 +02:00
|
|
|
/* Attributes */
|
2019-07-15 03:42:03 +02:00
|
|
|
<ATTRMODE>{crnl} { yymore(); }
|
|
|
|
|
<ATTRMODE>"*)" { FL_FWD; yy_pop_state(); FL_BRK; }
|
2019-07-11 12:57:49 +02:00
|
|
|
<ATTRMODE>{word} { yymore(); }
|
|
|
|
|
<ATTRMODE>. { yymore(); }
|
2020-06-07 16:10:20 +02:00
|
|
|
<ATTRMODE><<EOF>> { FL; yylval.fl->v3error("EOF in (*");
|
2019-10-01 00:50:27 +02:00
|
|
|
yyleng = 0; yy_pop_state(); FL_BRK; yyterminate(); }
|
2007-05-16 20:19:23 +02:00
|
|
|
|
|
|
|
|
/************************************************************************/
|
|
|
|
|
/* Attributes */
|
2011-10-26 00:08:24 +02:00
|
|
|
/* Note simulators vary in support for "(* /_*something*_/ foo*)" where _ doesn't exist */
|
2020-12-17 00:40:45 +01:00
|
|
|
<V95,V01NC,V01C,V05,VA5,S05,S09,S12,S17,SAX>{
|
2019-07-11 12:57:49 +02:00
|
|
|
"(*"({ws}|{crnl})*({id}|{escid}) { yymore(); yy_push_state(ATTRMODE); } /* Doesn't match (*), but (* attr_spec */
|
2007-05-16 20:19:23 +02:00
|
|
|
}
|
|
|
|
|
|
2006-08-26 13:35:28 +02:00
|
|
|
/************************************************************************/
|
2009-11-21 01:53:40 +01:00
|
|
|
/* Tables */
|
2019-07-15 03:42:03 +02:00
|
|
|
<TABLE>\\{crnl} { yymore(); }
|
|
|
|
|
<TABLE>{crnl} { yymore(); }
|
2019-07-11 12:57:49 +02:00
|
|
|
<TABLE>";" { FL; yylval.strp = PARSEP->newString(yytext, yyleng); return yaTABLELINE; }
|
|
|
|
|
<TABLE>"endtable" { yy_pop_state(); FL; return yENDTABLE; }
|
2020-06-07 18:18:23 +02:00
|
|
|
<TABLE>"`line"{ws}+[^\n\r]*{crnl} { FL_FWD; PARSEP->lexPpline(yytext); FL_BRK; }
|
2019-07-11 12:57:49 +02:00
|
|
|
<TABLE>. { yymore(); }
|
2022-10-22 18:30:44 +02:00
|
|
|
<TABLE><<EOF>> { FL; yylval.fl->v3error("EOF in 'table'");
|
2019-10-01 00:50:27 +02:00
|
|
|
yyleng = 0; yy_pop_state(); FL_BRK; yyterminate(); }
|
2009-11-21 01:53:40 +01:00
|
|
|
|
|
|
|
|
/************************************************************************/
|
2009-10-31 04:17:56 +01:00
|
|
|
/* Preprocessor */
|
2006-08-26 13:35:28 +02:00
|
|
|
/* Common for all SYSC header states */
|
|
|
|
|
/* OPTIMIZE: we return one per line, make it one for the entire block */
|
2019-07-14 02:30:32 +02:00
|
|
|
/* If add to this list also add to V3LanguageWords.h */
|
2020-12-17 00:40:45 +01:00
|
|
|
<V95,V01NC,V01C,V05,VA5,S05,S09,S12,S17,SAX,VLT,SYSCHDR,SYSCINT,SYSCIMP,SYSCIMPH,SYSCCTOR,SYSCDTOR,IGNORE>{
|
2019-07-15 03:42:03 +02:00
|
|
|
"`accelerate" { FL_FWD; FL_BRK; } // Verilog-XL compatibility
|
|
|
|
|
"`autoexpand_vectornets" { FL_FWD; FL_BRK; } // Verilog-XL compatibility
|
2020-06-07 19:45:50 +02:00
|
|
|
"`celldefine" { FL_FWD; PARSEP->lexFileline()->celldefineOn(true); FL_BRK; }
|
2019-07-15 03:42:03 +02:00
|
|
|
"`default_decay_time"{ws}+[^\n\r]* { FL_FWD; FL_BRK; } // Verilog spec - delays only
|
2020-06-07 19:45:50 +02:00
|
|
|
"`default_nettype"{ws}+"wire" { FL_FWD; PARSEP->lexFileline()->warnOn(V3ErrorCode::I_DEF_NETTYPE_WIRE, true); FL_BRK; }
|
|
|
|
|
"`default_nettype"{ws}+"none" { FL_FWD; PARSEP->lexFileline()->warnOn(V3ErrorCode::I_DEF_NETTYPE_WIRE, false); FL_BRK; }
|
2020-06-10 01:20:16 +02:00
|
|
|
"`default_nettype"{ws}+[a-zA-Z0-9]* { FL; yylval.fl->v3warn(E_UNSUPPORTED, "Unsupported: `default_nettype of other than none or wire: '"
|
|
|
|
|
<< yytext << "'");
|
2020-06-07 16:10:20 +02:00
|
|
|
FL_BRK; }
|
2020-06-10 01:20:16 +02:00
|
|
|
"`default_trireg_strength"{ws}+[^\n\r]* { FL; yylval.fl->v3warn(E_UNSUPPORTED, "Unsupported: Verilog optional directive not implemented: '"
|
|
|
|
|
<< yytext << "'");
|
2020-06-07 16:10:20 +02:00
|
|
|
FL_BRK; }
|
2019-07-15 03:42:03 +02:00
|
|
|
"`delay_mode_distributed" { FL_FWD; FL_BRK; } // Verilog spec - delays only
|
|
|
|
|
"`delay_mode_path" { FL_FWD; FL_BRK; } // Verilog spec - delays only
|
|
|
|
|
"`delay_mode_unit" { FL_FWD; FL_BRK; } // Verilog spec - delays only
|
|
|
|
|
"`delay_mode_zero" { FL_FWD; FL_BRK; } // Verilog spec - delays only
|
|
|
|
|
"`disable_portfaults" { FL_FWD; FL_BRK; } // Verilog-XL compatibility
|
|
|
|
|
"`enable_portfaults" { FL_FWD; FL_BRK; } // Verilog-XL compatibility
|
2020-06-07 19:45:50 +02:00
|
|
|
"`endcelldefine" { FL_FWD; PARSEP->lexFileline()->celldefineOn(false); FL_BRK; }
|
2019-07-15 03:42:03 +02:00
|
|
|
"`endprotect" { FL_FWD; FL_BRK; }
|
|
|
|
|
"`expand_vectornets" { FL_FWD; FL_BRK; } // Verilog-XL compatibility
|
|
|
|
|
"`inline" { FL_FWD; FL_BRK; }
|
2020-06-07 18:18:23 +02:00
|
|
|
"`line"{ws}+[^\n\r]*{crnl} { FL_FWD; PARSEP->lexPpline(yytext); FL_BRK; }
|
2019-07-15 03:42:03 +02:00
|
|
|
"`noaccelerate" { FL_FWD; FL_BRK; } // Verilog-XL compatibility
|
|
|
|
|
"`noexpand_vectornets" { FL_FWD; FL_BRK; } // Verilog-XL compatibility
|
|
|
|
|
"`noremove_gatenames" { FL_FWD; FL_BRK; } // Verilog-XL compatibility
|
|
|
|
|
"`noremove_netnames" { FL_FWD; FL_BRK; } // Verilog-XL compatibility
|
|
|
|
|
"`nosuppress_faults" { FL_FWD; FL_BRK; } // Verilog-XL compatibility
|
2020-06-07 18:08:12 +02:00
|
|
|
"`nounconnected_drive" { FL; return yaT_NOUNCONNECTED; }
|
2019-07-15 03:42:03 +02:00
|
|
|
"`portcoerce" { FL_FWD; FL_BRK; }
|
2020-02-02 04:03:18 +01:00
|
|
|
"`pragma"{ws}*[^\n\r]* { FL_FWD; FL_BRK; } // Verilog 2005
|
2019-07-15 03:42:03 +02:00
|
|
|
"`protect" { FL_FWD; FL_BRK; }
|
|
|
|
|
"`remove_gatenames" { FL_FWD; FL_BRK; } // Verilog-XL compatibility
|
|
|
|
|
"`remove_netnames" { FL_FWD; FL_BRK; } // Verilog-XL compatibility
|
2020-06-07 19:45:50 +02:00
|
|
|
"`resetall" { FL; PARSEP->lexFileline()->warnOn(V3ErrorCode::I_DEF_NETTYPE_WIRE, true);
|
2019-12-15 04:04:58 +01:00
|
|
|
return yaT_RESETALL; } // Rest handled by preproc
|
2019-07-15 03:42:03 +02:00
|
|
|
"`suppress_faults" { FL_FWD; FL_BRK; } // Verilog-XL compatibility
|
2020-06-07 18:18:23 +02:00
|
|
|
"`timescale"{ws}+[^\n\r]* { FL; PARSEP->lexTimescaleParse(yylval.fl,
|
2022-09-15 03:10:19 +02:00
|
|
|
yytext + std::strlen("`timescale"));
|
2020-04-16 01:39:03 +02:00
|
|
|
FL_BRK; }
|
2020-06-07 18:08:12 +02:00
|
|
|
"`unconnected_drive"{ws}+"pull0" { FL; return yaT_UNCONNECTED_PULL0; }
|
|
|
|
|
"`unconnected_drive"{ws}+"pull1" { FL; return yaT_UNCONNECTED_PULL1; }
|
2020-06-07 16:10:20 +02:00
|
|
|
"`unconnected_drive" { FL; yylval.fl->v3error("Bad `unconnected_drive syntax"); FL_BRK; }
|
2019-12-13 02:53:58 +01:00
|
|
|
"`uselib"{ws}+[^\n\r]* { FL_FWD; FL_BRK; } // Verilog-XL compatibility
|
2007-05-16 14:55:25 +02:00
|
|
|
|
2009-10-31 04:17:56 +01:00
|
|
|
/* See also setLanguage below */
|
2020-06-07 18:18:23 +02:00
|
|
|
"`begin_keywords"[ \t]*\"1364-1995\" { FL_FWD; yy_push_state(V95); PARSEP->lexPushKeywords(YY_START); FL_BRK; }
|
2020-12-17 00:40:45 +01:00
|
|
|
"`begin_keywords"[ \t]*\"1364-2001\" { FL_FWD; yy_push_state(V01C); PARSEP->lexPushKeywords(YY_START); FL_BRK; }
|
|
|
|
|
"`begin_keywords"[ \t]*\"1364-2001-noconfig\" { FL_FWD; yy_push_state(V01NC); PARSEP->lexPushKeywords(YY_START); FL_BRK; }
|
2020-06-07 18:18:23 +02:00
|
|
|
"`begin_keywords"[ \t]*\"1364-2005\" { FL_FWD; yy_push_state(V05); PARSEP->lexPushKeywords(YY_START); FL_BRK; }
|
|
|
|
|
"`begin_keywords"[ \t]*\"VAMS[-0-9.]*\" { FL_FWD; yy_push_state(VA5); PARSEP->lexPushKeywords(YY_START); FL_BRK; }
|
|
|
|
|
"`begin_keywords"[ \t]*\"1800-2005\" { FL_FWD; yy_push_state(S05); PARSEP->lexPushKeywords(YY_START); FL_BRK; }
|
|
|
|
|
"`begin_keywords"[ \t]*\"1800-2009\" { FL_FWD; yy_push_state(S09); PARSEP->lexPushKeywords(YY_START); FL_BRK; }
|
|
|
|
|
"`begin_keywords"[ \t]*\"1800-2012\" { FL_FWD; yy_push_state(S12); PARSEP->lexPushKeywords(YY_START); FL_BRK; }
|
|
|
|
|
"`begin_keywords"[ \t]*\"1800-2017\" { FL_FWD; yy_push_state(S17); PARSEP->lexPushKeywords(YY_START); FL_BRK; }
|
|
|
|
|
"`begin_keywords"[ \t]*\"1800[+]VAMS\" { FL_FWD; yy_push_state(SAX); PARSEP->lexPushKeywords(YY_START); FL_BRK; } /*Latest SV*/
|
2022-10-22 18:17:56 +02:00
|
|
|
"`end_keywords" { FL;
|
|
|
|
|
if (!PARSEP->lexPopKeywords()) {
|
|
|
|
|
yylval.fl->v3error("`end_keywords when not inside `begin_keywords block");
|
|
|
|
|
} else { yy_pop_state(); }
|
2019-07-15 03:42:03 +02:00
|
|
|
FL_BRK; }
|
2009-10-31 04:17:56 +01:00
|
|
|
|
|
|
|
|
/* Verilator */
|
2019-07-15 03:42:03 +02:00
|
|
|
"`systemc_ctor" { FL_FWD; BEGIN SYSCCTOR; FL_BRK; }
|
|
|
|
|
"`systemc_dtor" { FL_FWD; BEGIN SYSCDTOR; FL_BRK; }
|
|
|
|
|
"`systemc_header" { FL_FWD; BEGIN SYSCHDR; FL_BRK; }
|
|
|
|
|
"`systemc_imp_header" { FL_FWD; BEGIN SYSCIMPH; FL_BRK; }
|
|
|
|
|
"`systemc_implementation" { FL_FWD; BEGIN SYSCIMP; FL_BRK; }
|
|
|
|
|
"`systemc_interface" { FL_FWD; BEGIN SYSCINT; FL_BRK; }
|
|
|
|
|
"`verilator_config" { FL_FWD; BEGIN VLT; FL_BRK; }
|
2020-06-07 18:18:23 +02:00
|
|
|
"`verilog" { FL_FWD; BEGIN PARSEP->lexKwdLastState(); FL_BRK; }
|
2019-07-14 02:30:32 +02:00
|
|
|
|
2019-12-17 03:54:20 +01:00
|
|
|
/* Errors */
|
2020-06-07 16:10:20 +02:00
|
|
|
"<<<<<<<"[^\n\r]* { FL; yylval.fl->v3error("version control conflict marker in file"); FL_BRK; }
|
|
|
|
|
"======="[^\n\r]* { FL; yylval.fl->v3error("version control conflict marker in file"); FL_BRK; }
|
|
|
|
|
">>>>>>>"[^\n\r]* { FL; yylval.fl->v3error("version control conflict marker in file"); FL_BRK; }
|
2019-12-17 03:54:20 +01:00
|
|
|
|
2019-07-14 02:30:32 +02:00
|
|
|
/* If add to this list also add to V3LanguageWords.h */
|
2006-08-30 19:27:53 +02:00
|
|
|
}
|
2006-08-26 13:35:28 +02:00
|
|
|
|
2019-07-15 03:42:03 +02:00
|
|
|
<SYSCHDR>[ \t]*[^` \t\n\r][^\n\r]*{crnl} { FL; yylval.strp = PARSEP->newString(yytext); return yaSCHDR; }
|
|
|
|
|
<SYSCINT>[ \t]*[^` \t\n\r][^\n\r]*{crnl} { FL; yylval.strp = PARSEP->newString(yytext); return yaSCINT; }
|
|
|
|
|
<SYSCIMP>[ \t]*[^` \t\n\r][^\n\r]*{crnl} { FL; yylval.strp = PARSEP->newString(yytext); return yaSCIMP; }
|
|
|
|
|
<SYSCIMPH>[ \t]*[^` \t\n\r][^\n\r]*{crnl} { FL; yylval.strp = PARSEP->newString(yytext); return yaSCIMPH; }
|
|
|
|
|
<SYSCCTOR>[ \t]*[^` \t\n\r][^\n\r]*{crnl} { FL; yylval.strp = PARSEP->newString(yytext); return yaSCCTOR; }
|
|
|
|
|
<SYSCDTOR>[ \t]*[^` \t\n\r][^\n\r]*{crnl} { FL; yylval.strp = PARSEP->newString(yytext); return yaSCDTOR; }
|
|
|
|
|
<IGNORE>[ \t]*[^` \t\n\r][^\n\r]*{crnl} { FL_FWD; FL_BRK; }
|
2006-08-26 13:35:28 +02:00
|
|
|
|
2007-03-05 21:29:05 +01:00
|
|
|
/* Pick up text-type data */
|
|
|
|
|
<SYSCHDR,SYSCINT,SYSCIMP,SYSCIMPH,SYSCCTOR,SYSCDTOR,IGNORE>{
|
2019-07-11 12:57:49 +02:00
|
|
|
{wsnr}* { yymore(); }
|
2019-07-15 03:42:03 +02:00
|
|
|
{crnl} { yymore(); }
|
2007-03-05 21:29:05 +01:00
|
|
|
}
|
2006-08-26 13:35:28 +02:00
|
|
|
|
|
|
|
|
/************************************************************************/
|
|
|
|
|
/* Default rules - leave last */
|
|
|
|
|
|
2020-12-17 00:40:45 +01:00
|
|
|
<V95,V01NC,V01C,V05,VA5,S05,S09,S12,S17,SAX,VLT>{
|
2020-06-07 18:18:23 +02:00
|
|
|
"`"[a-zA-Z_0-9]+ { FL; V3ParseImp::lexErrorPreprocDirective(yylval.fl, yytext); FL_BRK; }
|
2019-07-15 03:42:03 +02:00
|
|
|
"//"[^\n]* { FL_FWD; FL_BRK; } /* throw away single line comments */
|
2019-07-11 12:57:49 +02:00
|
|
|
. { FL; return yytext[0]; } /* return single char ops. */
|
2007-03-05 21:29:05 +01:00
|
|
|
}
|
2006-08-26 13:35:28 +02:00
|
|
|
|
2007-03-05 21:29:05 +01:00
|
|
|
/* Catch all - absolutely last */
|
2022-10-22 18:17:56 +02:00
|
|
|
<*>.|\n { FL; yylval.fl->v3error( // LCOV_EXCL_LINE
|
|
|
|
|
"Missing verilog.l rule: Default rule invoked in state "
|
|
|
|
|
<< YY_START << " '" << yytext << "'");
|
2020-06-07 16:10:20 +02:00
|
|
|
FL_BRK; }
|
2006-08-26 13:35:28 +02:00
|
|
|
%%
|
2020-06-06 14:44:44 +02:00
|
|
|
// Avoid code here as cl format misindents
|
|
|
|
|
// For implementation functions see V3ParseImp.cpp
|
2020-05-22 01:46:21 +02:00
|
|
|
|
2009-10-31 15:08:38 +01:00
|
|
|
int V3ParseImp::stateVerilogRecent() { return STATE_VERILOG_RECENT; }
|