Merge pull request #78 from hzeller/master
Have all includes absolute from the built-root.
diff --git a/grammar/SV3_1aLexer.g4 b/grammar/SV3_1aLexer.g4
new file mode 100644
index 0000000..8dc1183
--- /dev/null
+++ b/grammar/SV3_1aLexer.g4
@@ -0,0 +1,992 @@
+/*
+ Copyright 2019 Alain Dargelas
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+lexer grammar SV3_1aLexer;
+
+// ################################## TOKENS ##################################
+
+channels {
+ WHITESPACES,
+ COMMENTS
+}
+
+QMARK : '?' ;
+
+TICK_b0 : '\'b0' ;
+
+TICK_b1 : '\'b1' ;
+
+TICK_B0 : '\'B0' ;
+
+TICK_B1 : '\'B1' ;
+
+TICK_0 : '\'0' ;
+
+TICK_1 : '\'1' ;
+
+ONE_TICK_b0 : '1\'b0' ;
+
+ONE_TICK_b1 : '1\'b1' ;
+
+ONE_TICK_bx : '1\'bx' ;
+
+ONE_TICK_bX : '1\'bX' ;
+
+ONE_TICK_B0 : '1\'B0' ;
+
+ONE_TICK_B1 : '1\'B1' ;
+
+ONE_TICK_Bx : '1\'Bx' ;
+
+ONE_TICK_BX : '1\'BX' ;
+
+Pound_delay : '#' (' ')* [0-9] [0-9_.]* ;
+
+fragment
+Non_zero_unsigned_number : '1'..'9' ( '_' | Decimal_digit )* ;
+
+fragment
+Decimal_number
+ : Unsigned_number
+ | ( Non_zero_unsigned_number ' '* )? Decimal_base ' '* Unsigned_number
+ | ( Non_zero_unsigned_number ' '* )? Decimal_base ' '* X_digit ( '_' )*
+ | ( Non_zero_unsigned_number ' '* )? Decimal_base ' '* Z_digit ( '_' )*
+ ;
+
+/* binary_number ::= [ size ] binary_base binary_value */
+
+fragment
+Binary_number : ( Non_zero_unsigned_number ' '* )? Binary_base ' '* Binary_value ;
+
+/* octal_number ::= [ size ] octal_base octal_value */
+
+fragment
+Octal_number : ( Non_zero_unsigned_number ' '* )? Octal_base ' '* Octal_value ;
+
+/* hex_number ::= [ size ] hex_base hex_value */
+
+fragment
+Hex_number : ( Non_zero_unsigned_number ' '* )? Hex_base ' '* Hex_value ;
+
+Integral_number
+ : Decimal_number
+ | Octal_number
+ | Binary_number
+ | Hex_number
+ ;
+
+/* real_number ::=
+fixed_point_number
+| unsigned_number [ . unsigned_number ] exp [ sign ] unsigned_number */
+
+Real_number
+ : Fixed_point_number
+ | Unsigned_number ( '.' Unsigned_number )? ('e'|'E') ( PLUS | MINUS )? Unsigned_number
+ ;
+
+/* fixed_point_number <<1>> ::= unsigned_number . unsigned_number */
+
+fragment
+Fixed_point_number : Unsigned_number DOT Unsigned_number ;
+
+/* unsigned_number <<1>> ::= decimal_digit { _ | decimal_digit } */
+
+fragment
+Unsigned_number : Decimal_digit ( '_' | Decimal_digit )* ;
+
+/* binary_value <<1>> ::= binary_digit { _ | binary_digit } */
+
+fragment
+Binary_value : ('_')* Binary_digit ( '_' | Binary_digit )* ;
+
+/* octal_value <<1>> ::= octal_digit { _ | octal_digit } */
+
+fragment
+Octal_value : ('_')* Octal_digit ( '_' | Octal_digit )* ;
+
+/* hex_value <<1>> ::= hex_digit { _ | hex_digit } */
+
+fragment
+Hex_value : ('_')* Hex_digit ( '_' | Hex_digit )* ;
+
+/* decimal_base <<1>> ::= [s|S]d | [s|S]D */
+
+fragment
+Decimal_base : '\'' ('s' | 'S')? ('d' | 'D') ;
+
+/* binary_base <<1>> ::= [s|S]b | [s|S]B */
+
+fragment
+Binary_base : '\'' ('s' | 'S')? ('b' | 'B') ;
+
+/* octal_base <<1>> ::= [s|S]o | [s|S]O */
+
+fragment
+Octal_base : '\'' ('s' | 'S')? ( 'o' | 'O') ;
+
+/* hex_base <<1>> ::ps [s|S]h | [s|S]H */
+
+fragment
+Hex_base : '\'' ('s' | 'S')? ('h' | 'H') ;
+
+
+/* decimal_digit ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 */
+
+fragment
+Decimal_digit : '0'..'9' ;
+
+/* binary_digit ::= x_digit | z_digit | 0 | 1 */
+
+fragment
+Binary_digit : X_digit | Z_digit | ('0' | '1') ;
+
+/* octal_digit ::= x_digit | z_digit | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 */
+
+fragment
+Octal_digit : X_digit | Z_digit | '0'..'7' ;
+
+/* hex_digit ::= x_digit | z_digit | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | a | b | c | d | e | f | A | B | C | D | E | F */
+
+fragment
+Hex_digit : X_digit | Z_digit | ('0'..'9' | 'a'..'f' | 'A'..'F') ;
+
+/* x_digit ::= x | X */
+
+fragment
+X_digit : ('x'| 'X') ;
+
+/* z_digit ::= z | Z | ? */
+
+fragment
+Z_digit : ('z'| 'Z' | QMARK) ;
+
+/* edge_descriptor */
+
+/* z_or_x ::= x | X | z | Z */
+
+// A.8.8 Strings
+
+String
+ : '"' // a opening quote
+ ( // start group
+ '\\' ~('\r') // an escaped char other than a line break char
+ | // OR
+ ~('\\' | '"'| '\r' | '\n') // any char other than '"', '\' and line breaks
+ )* // end group and repeat zero or more times
+ '"' // the closing quote
+ ;
+
+// A.9.2 Comments
+
+/* one_line_comment ::= // comment_text \n */
+
+One_line_comment : '//' Comment_text '\r'? ('\n' | EOF) -> channel(COMMENTS);
+
+// block_comment ::= /* comment_text */
+
+Block_comment : '/*' Comment_text '*/' -> channel(COMMENTS);
+
+/* comment_text ::= { Any_ASCII_character } */
+
+fragment Comment_text : .*? ;
+
+SLLINE : 'SLline' ;
+
+ASSOCIATIVE_UNSPECIFIED : '[' [ ]* '*' [ ]* ']' ;
+
+ATSTAR : '@' ' '? '*' ;
+
+AT_PARENS_STAR : '@' ' '? '(' ' '? '*' ' '? ')' ;
+
+// 9.4 White space
+
+White_space : [ \t\n\r]+ -> channel(WHITESPACES) ;
+
+// ######################### LEXER RULES ################################
+
+INCLUDE : 'include';
+
+LIBRARY : 'library' ;
+
+INCDIR : '-incdir' ;
+
+COMMA : ',' ;
+
+SEMICOLUMN : ';' ;
+
+COLUMNCOLUMN : '::' ;
+
+COLUMN : ':' ;
+
+DESIGN : 'design' ;
+
+DOT : '.' ;
+
+DEFAULT : 'default' ;
+
+INSTANCE : 'instance' ;
+
+CELL : 'cell' ;
+
+LIBLIST : 'liblist' ;
+
+USE : 'use' ;
+
+MODULE : 'module';
+
+ENDMODULE : 'endmodule' ;
+
+OPEN_PARENS : '(' ;
+
+CLOSE_PARENS : ')' ;
+
+STAR : '*' ;
+
+EXTERN : 'extern' ;
+
+MACROMODULE : 'macromodule' ;
+
+INTERFACE : 'interface' ;
+
+ENDINTERFACE : 'endinterface' ;
+
+PROGRAM : 'program' ;
+
+ENDPROGRAM : 'endprogram' ;
+
+VIRTUAL : 'virtual' ;
+
+CLASS : 'class' ;
+
+ENDCLASS : 'endclass' ;
+
+EXTENDS : 'extends' ;
+
+PACKAGE : 'package' ;
+
+ENDPACKAGE : 'endpackage' ;
+
+TIMEUNIT : 'timeunit' ;
+
+TIMEPRECISION : 'timeprecision' ;
+
+CHECKER : 'checker' ;
+
+ENDCHECKER : 'endchecker' ;
+
+CONFIG : 'config' ;
+
+ENDCONFIG : 'endconfig' ;
+
+TYPE : 'type' ;
+
+UNTYPED : 'untyped' ;
+
+INPUT : 'input' ;
+
+OUTPUT : 'output' ;
+
+INOUT : 'inout' ;
+
+REF : 'ref' ;
+
+CLOCKING : 'clocking' ;
+
+DEFPARAM : 'defparam' ;
+
+BIND : 'bind' ;
+
+FORKJOIN : 'forkjoin' ;
+
+CONST : 'const' ;
+
+FUNCTION : 'function' ;
+
+NEW : 'new' ;
+
+STATIC : 'static' ;
+
+PROTECTED : 'protected' ;
+
+LOCAL : 'local' ;
+
+RAND : 'rand' ;
+
+RANDC : 'randc' ;
+
+SUPER : 'super' ;
+
+ENDFUNCTION : 'endfunction' ;
+
+CONSTRAINT : 'constraint' ;
+
+OPEN_CURLY : '{' ;
+
+CLOSE_CURLY : '}' ;
+
+SOLVE : 'solve' ;
+
+BEFORE : 'before' ;
+
+IMPLY : '->' ;
+
+IF : 'if' ;
+
+ELSE : 'else';
+
+FOREACH : 'foreach' ;
+
+ASSIGN_VALUE : ':=' ;
+
+/* Replaced by COLUMN DIV : ASSIGN_RANGE : ':/' ; */
+
+AUTOMATIC : 'automatic' ;
+
+LOCALPARAM : 'localparam' ;
+
+PARAMETER : 'parameter' ;
+
+SPECPARAM : 'specparam' ;
+
+IMPORT : 'import' ;
+
+GENVAR : 'genvar' ;
+
+VECTORED : 'vectored' ;
+
+SCALARED : 'scalared' ;
+
+TYPEDEF : 'typedef' ;
+
+ENUM : 'enum';
+
+STRUCT : 'struct' ;
+
+UNION : 'union' ;
+
+PACKED : 'packed' ;
+
+STRING : 'string' ;
+
+CHANDLE : 'chandle' ;
+
+EVENT : 'event' ;
+
+OPEN_BRACKET : '[' ;
+
+CLOSE_BRACKET : ']' ;
+
+BYTE : 'byte' ;
+
+SHORTINT : 'shortint';
+
+INT : 'int' ;
+
+LONGINT : 'longint' ;
+
+INTEGER : 'integer' ;
+
+TIME : 'time' ;
+
+BIT : 'bit' ;
+
+LOGIC : 'logic' ;
+
+REG : 'reg' ;
+
+SHORTREAL : 'shortreal' ;
+
+REAL : 'real' ;
+
+REALTIME : 'realtime' ;
+
+NEXTTIME : 'nexttime' ;
+
+S_NEXTTIME : 's_nexttime' ;
+
+S_ALWAYS : 's_always' ;
+
+UNTIL_WITH : 'until_with' ;
+
+S_UNTIL_WITH : 's_until_with';
+
+ACCEPT_ON : 'accept_on' ;
+
+REJECT_ON : 'reject_on' ;
+
+SYNC_ACCEPT_ON : 'sync_accept_on' ;
+
+SYNC_REJECT_ON : 'sync_reject_on' ;
+
+EVENTUALLY : 'eventually' ;
+
+S_EVENTUALLY : 's_eventually' ;
+
+SUPPLY0 : 'supply0' ;
+
+SUPPLY1 : 'supply1' ;
+
+TRI : 'tri' ;
+
+TRIAND : 'triand' ;
+
+TRIOR : 'trior' ;
+
+TRI0 : 'tri0' ;
+
+TRI1 : 'tri1' ;
+
+WIRE : 'wire' ;
+
+UWIRE : 'uwire' ;
+
+WAND : 'wand' ;
+
+WOR : 'wor' ;
+
+TRIREG : 'trireg' ;
+
+SIGNED : 'signed' ;
+
+UNSIGNED : 'unsigned' ;
+
+INTERCONNECT : 'interconnect' ;
+
+VAR : 'var' ;
+
+VOID : 'void' ;
+
+HIGHZ0 : 'highz0' ;
+
+HIGHZ1 : 'highz1' ;
+
+STRONG : 'strong' ;
+
+WEAK : 'weak' ;
+
+STRONG0 : 'strong0' ;
+
+PULL0 : 'pull0' ;
+
+WEAK0 : 'weak0' ;
+
+STRONG1 : 'strong1' ;
+
+PULL1 : 'pull1' ;
+
+WEAK1 : 'weak1' ;
+
+SMALL : '(small)';
+
+MEDIUM : '(medium)' ;
+
+LARGE : '(large)' ;
+
+PATHPULSE : 'PATHPULSE' ;
+
+DOLLAR : '$' ;
+
+EXPORT : 'export' ;
+
+CONTEXT : 'context' ;
+
+PURE : 'pure' ;
+
+IMPLEMENTS : 'implements' ;
+
+ENDTASK : 'endtask' ;
+
+PLUSPLUS : '++' ;
+
+PLUS : '+' ;
+
+MINUSMINUS : '--' ;
+
+MINUS : '-' ;
+
+STARCOLUMNCOLUMNSTAR : '*::*' ;
+
+STARSTAR : '**' ;
+
+DIV : '/' ;
+
+PERCENT : '%' ;
+
+EQUIV : '==' ;
+
+NOTEQUAL : '!=' ;
+
+LESS : '<' ;
+
+LESS_EQUAL : '<=' ;
+
+GREATER : '>' ;
+
+EQUIVALENCE : '<->' ;
+
+GREATER_EQUAL : '>=' ;
+
+MODPORT : 'modport' ;
+
+DOLLAR_UNIT : DOLLAR 'unit' ;
+
+OPEN_PARENS_STAR : '(*' ;
+
+STAR_CLOSE_PARENS : '*)' ;
+
+ASSERT : 'assert' ;
+
+PROPERTY : 'property' ;
+
+ASSUME : 'assume' ;
+
+COVER : 'cover' ;
+
+EXPECT : 'expect' ;
+
+ENDPROPERTY : 'endproperty' ;
+
+DISABLE : 'disable' ;
+
+IFF : 'iff' ;
+
+OVERLAP_IMPLY : '|->' ;
+
+NON_OVERLAP_IMPLY : '|=>' ;
+
+NOT : 'not' ;
+
+OR : 'or' ;
+
+AND : 'and' ;
+
+SEQUENCE : 'sequence' ;
+
+ENDSEQUENCE : 'endsequence' ;
+
+INTERSECT : 'intersect' ;
+
+FIRST_MATCH : 'first_match' ;
+
+THROUGHOUT : 'throughout' ;
+
+WITHIN : 'within' ;
+
+POUNDPOUND : '##' ;
+
+OVERLAPPED : '#-#' ;
+
+NONOVERLAPPED : '#=#' ;
+
+POUND : '#' ;
+
+CONSECUTIVE_REP : '[*' ;
+
+NON_CONSECUTIVE_REP : '[=' ;
+
+GOTO_REP : '[->' ;
+
+DIST : 'dist' ;
+
+COVERGROUP : 'covergroup' ;
+
+ENDGROUP : 'endgroup' ;
+
+OPTION_DOT : 'option' DOT;
+
+TYPE_OPTION_DOT : 'type_option' DOT;
+
+ATAT : '@@' ;
+
+BEGIN : 'begin' ;
+
+END : 'end' ;
+
+WILDCARD : 'wildcard' ;
+
+BINS : 'bins';
+
+ILLEGAL_BINS : 'illegal_bins' ;
+
+IGNORE_BINS : 'ignore_bins' ;
+
+TRANSITION_OP : '=>' ;
+
+BANG : '!' ;
+
+SOFT : 'soft' ;
+
+UNTIL : 'until' ;
+
+S_UNTIL : 's_until' ;
+
+IMPLIES : 'implies' ;
+
+LOGICAL_AND : '&&' ;
+
+LOGICAL_OR : '||' ;
+
+BINSOF : 'binsof' ;
+
+PULLDOWN : 'pulldown' ;
+
+PULLUP : 'pullup' ;
+
+CMOS : 'cmos' ;
+
+RCMOS : 'rcmos' ;
+
+BUFIF0 : 'bufif0' ;
+
+BUFIF1 : 'bufif1' ;
+
+NOTIF0 : 'notif0' ;
+
+NOTIF1 : 'notif1' ;
+
+NMOS : 'nmos' ;
+
+PMOS : 'pmos' ;
+
+RNMOS : 'rnmos' ;
+
+RPMOS : 'rpmos' ;
+
+NAND : 'nand' ;
+
+NOR : 'nor' ;
+
+XOR : 'xor' ;
+
+XNOR : 'xnor' ;
+
+BUF : 'buf' ;
+
+TRANIF0 : 'tranif0' ;
+
+TRANIF1 : 'tranif1' ;
+
+RTRANIF1 : 'rtranif1' ;
+
+RTRANIF0 : 'rtranif0' ;
+
+TRAN : 'tran' ;
+
+RTRAN : 'rtran' ;
+
+DOTSTAR : '.*' ;
+
+GENERATE : 'generate' ;
+
+ENDGENERATE : 'endgenerate' ;
+
+CASE : 'case' ;
+
+ENDCASE : 'endcase' ;
+
+FOR : 'for' ;
+
+GLOBAL : 'global' ;
+
+PRIMITIVE : 'primitive' ;
+
+ENDPRIMITIVE : 'endprimitive' ;
+
+TABLE : 'table' ;
+
+ENDTABLE : 'endtable' ;
+
+INITIAL : 'initial' ;
+
+ASSIGN : 'assign' ;
+
+ALIAS : 'alias' ;
+
+ALWAYS : 'always' ;
+
+ALWAYS_COMB : 'always_comb' ;
+
+ALWAYS_LATCH : 'always_latch' ;
+
+ALWAYS_FF : 'always_ff' ;
+
+ADD_ASSIGN : '+=' ;
+
+SUB_ASSIGN : '-=' ;
+
+MULT_ASSIGN : '*=' ;
+
+DIV_ASSIGN : '/=' ;
+
+MODULO_ASSIGN : '%=' ;
+
+BITW_AND_ASSIGN : '&=' ;
+
+BITW_OR_ASSIGN : '|=' ;
+
+BITW_XOR_ASSIGN : '^=' ;
+
+BITW_LEFT_SHIFT_ASSIGN : '<<=' ;
+
+BITW_RIGHT_SHIFT_ASSIGN : '>>=' ;
+
+DEASSIGN : 'deassign' ;
+
+FORCE : 'force' ;
+
+RELEASE : 'release' ;
+
+FORK : 'fork' ;
+
+JOIN : 'join' ;
+
+JOIN_ANY : 'join_any' ;
+
+JOIN_NONE : 'join_none' ;
+
+REPEAT : 'repeat' ;
+
+AT : '@' ;
+
+RETURN : 'return' ;
+
+BREAK : 'break' ;
+
+CONTINUE : 'continue' ;
+
+WAIT : 'wait' ;
+
+WAIT_ORDER : 'wait_order' ;
+
+UNIQUE : 'unique' ;
+
+UNIQUE0 : 'unique0' ;
+
+PRIORITY : 'priority' ;
+
+MATCHES : 'matches' ;
+
+CASEZ : 'casez' ;
+
+CASEX : 'casex' ;
+
+RANDCASE : 'randcase' ;
+
+TAGGED : 'tagged' ;
+
+FOREVER : 'forever' ;
+
+WHILE : 'while' ;
+
+DO : 'do' ;
+
+RESTRICT : 'restrict' ;
+
+LET : 'let' ;
+
+TICK : '\'';
+
+ENDCLOCKING : 'endclocking' ;
+
+RANDSEQUENCE : 'randsequence' ;
+
+SHIFT_RIGHT : '>>' ;
+
+SHIFT_LEFT : '<<' ;
+
+WITH : 'with' ;
+
+INC_PART_SELECT_OP : '+:' ;
+
+DEC_PART_SELECT_OP : '-:' ;
+
+INSIDE : 'inside' ;
+
+NULL_KEYWORD : 'null' ;
+
+THIS : 'this' ;
+
+DOLLAR_ROOT : DOLLAR 'root' ;
+
+RANDOMIZE : 'randomize' ;
+
+FINAL : 'final' ;
+
+TASK : 'task' ;
+
+COVERPOINT : 'coverpoint' ;
+
+CROSS : 'cross' ;
+
+POSEDGE : 'posedge' ;
+
+NEGEDGE : 'negedge' ;
+
+SPECIFY : 'specify' ;
+
+ENDSPECIFY : 'endspecify' ;
+
+PULSESTYLE_ONEVENT : 'pulsestyle_onevent' ;
+
+PULSESTYLE_ONDETECT : 'pulsestyle_ondetect' ;
+
+SHOWCANCELLED : 'showcancelled' ;
+
+NOSHOWCANCELLED : 'noshowcancelled' ;
+
+IFNONE : 'ifnone' ;
+
+SAMPLE : 'sample' ;
+
+EDGE : 'edge' ;
+
+NON_BLOCKING_TRIGGER_EVENT_OP : '->>' ;
+
+ARITH_SHIFT_RIGHT : '>>>' ;
+
+ARITH_SHIFT_LEFT : '<<<' ;
+
+ARITH_SHIFT_LEFT_ASSIGN : '<<<=' ;
+
+ARITH_SHIFT_RIGHT_ASSIGN : '>>>=' ;
+
+FOUR_STATE_LOGIC_EQUAL : '===' ;
+
+FOUR_STATE_LOGIC_NOTEQUAL : '!==' ;
+
+BINARY_WILDCARD_EQUAL : '==?' ;
+
+BINARY_WILDCARD_NOTEQUAL : '!=?' ;
+
+FULL_CONN_OP : '*>' ;
+
+COND_PRED_OP : '&&&' ;
+
+BITW_AND : '&' ;
+
+BITW_OR : '|' ;
+
+REDUCTION_NOR : '~|' ;
+
+REDUCTION_NAND : '~&' ;
+
+REDUCTION_XNOR1 : '^~' ;
+
+WILD_EQUAL_OP : '=?=' ;
+
+WILD_NOTEQUAL_OP : '!?=' ;
+
+ASSIGN_OP : '=' ;
+
+NETTYPE : 'nettype' ;
+
+// A.9.3 Identifiers
+
+/* escaped_identifier ::= \ {any_ASCII_character_except_white_space} white_space */
+/* Example: \`~!-_=+\|[]{};:'"",./<>? */
+
+//Escaped_identifier : '^^^' [\\|+a-zA-Z0-9_$:,-/*{}()`~!=;'"<>?.]* '^^^' ;
+
+Escaped_identifier : '#~@' .*? '#~@' ;
+
+TILDA : '~' ;
+
+BITW_XOR : '^';
+
+REDUCTION_XNOR2 : '~^' ;
+
+/* simple_identifier <<2>> ::= [ a-zA-Z_ ] { [ a-zA-Z0-9_$ ] } */
+
+Simple_identifier : [a-zA-Z_] [a-zA-Z0-9_$]* ;
+
+TICK_LINE : '`line' ;
+
+TICK_TIMESCALE : '`timescale' ;
+
+TICK_BEGIN_KEYWORDS : '`begin_keywords' ;
+
+TICK_END_KEYWORDS : '`end_keywords' ;
+
+TICK_UNCONNECTED_DRIVE : '`unconnected_drive' ;
+
+TICK_NOUNCONNECTED_DRIVE : '`nounconnected_drive' ;
+
+TICK_CELLDEFINE : '`celldefine' ;
+
+TICK_ENDCELLDEFINE : '`endcelldefine' ;
+
+TICK_DEFAULT_NETTYPE : '`default_nettype' ;
+
+TICK_DEFAULT_DECAY_TIME : '`default_decay_time' ;
+
+TICK_DEFAULT_TRIREG_STRENGTH : '`default_trireg_strength' ;
+
+TICK_DELAY_MODE_DISTRIBUTED : '`delay_mode_distributed' ;
+
+TICK_DELAY_MODE_PATH : '`delay_mode_path' ;
+
+TICK_DELAY_MODE_UNIT : '`delay_mode_unit' ;
+
+TICK_DELAY_MODE_ZERO : '`delay_mode_zero' ;
+
+TICK_ACCELERATE : '`accelerate';
+
+TICK_NOACCELERATE : '`noaccelerate';
+
+TICK_PROTECT : '`protect' ;
+
+TICK_DISABLE_PORTFAULTS : '`disable_portfaults' ;
+
+TICK_ENABLE_PORTFAULTS : '`enable_portfaults' ;
+
+TICK_NOSUPPRESS_FAULTS : '`nosuppress_faults' ;
+
+TICK_SUPPRESS_FAULTS : '`suppress_faults' ;
+
+TICK_SIGNED : '`signed' ;
+
+TICK_UNSIGNED : '`unsigned' ;
+
+TICK_ENDPROTECT : '`endprotect' ;
+
+TICK_PROTECTED : '`protected' ;
+
+TICK_ENDPROTECTED : '`endprotected' ;
+
+TICK_EXPAND_VECTORNETS : '`expand_vectornets' ;
+
+TICK_NOEXPAND_VECTORNETS : '`noexpand_vectornets' ;
+
+TICK_AUTOEXPAND_VECTORNETS : '`autoexpand_vectornets' ;
+
+TICK_REMOVE_GATENAME : '`remove_gatename' ;
+
+TICK_NOREMOVE_GATENAMES : '`noremove_gatenames' ;
+
+TICK_REMOVE_NETNAME : '`remove_netname' ;
+
+TICK_NOREMOVE_NETNAMES : '`noremove_netnames' ;
+
+ONESTEP : '1step' ;
+
+TICK_USELIB : '`uselib' ;
+
+TICK_PRAGMA : '`pragma' ;
+
+BACK_TICK : '`' ;
+
+SURELOG_MACRO_NOT_DEFINED : 'SURELOG_MACRO_NOT_DEFINED:' Simple_identifier '!!!' ;
+
diff --git a/grammar/SV3_1aParser.g4 b/grammar/SV3_1aParser.g4
new file mode 100644
index 0000000..3af92a2
--- /dev/null
+++ b/grammar/SV3_1aParser.g4
@@ -0,0 +1,3594 @@
+/*
+ Copyright 2019 Alain Dargelas
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+*/
+
+
+parser grammar SV3_1aParser;
+
+options { tokenVocab = SV3_1aLexer; }
+
+top_level_rule : null_rule source_text EOF ; // SV files
+
+top_level_library_rule : null_rule library_text EOF ; // .map files
+
+library_text : ( library_descriptions )* ;
+
+library_descriptions : library_declaration
+ | include_statement
+ | config_declaration
+ | SEMICOLUMN
+ ;
+
+library_declaration :
+LIBRARY identifier file_path_spec ( COMMA file_path_spec )*
+ ( INCDIR file_path_spec ( COMMA file_path_spec )* )? SEMICOLUMN ;
+
+file_path_spec : (Simple_identifier | DIV | DOT | STAR | DOTSTAR | QMARK)+;
+
+include_statement : INCLUDE file_path_spec SEMICOLUMN ;
+
+source_text : ( timeunits_declaration )? ( description )* ;
+
+null_rule : ; // Placeholder rule that create the "0" VObject, DO NOT REMOVE
+
+description
+ : module_declaration
+ | udp_declaration
+ | interface_declaration
+ | program_declaration
+ | package_declaration
+ | surelog_macro_not_defined
+ | ( attribute_instance )* ( package_item
+ | bind_directive )
+ | config_declaration
+ | top_directives
+ ;
+
+module_nonansi_header : ( attribute_instance )* module_keyword ( lifetime )?
+ identifier ( package_import_declaration )* ( parameter_port_list )?
+ list_of_ports SEMICOLUMN ;
+
+module_ansi_header : ( attribute_instance )* module_keyword ( lifetime )?
+ identifier ( package_import_declaration )* ( parameter_port_list )?
+ (list_of_port_declarations )? SEMICOLUMN ;
+
+module_declaration
+ : module_nonansi_header ( timeunits_declaration )? ( module_item )*
+ endmodule ( COLUMN identifier )?
+ | module_ansi_header ( timeunits_declaration )? ( non_port_module_item )*
+ endmodule ( COLUMN identifier )?
+ | ( attribute_instance )* module_keyword ( lifetime )? identifier
+ OPEN_PARENS DOT STAR CLOSE_PARENS SEMICOLUMN
+ ( timeunits_declaration )? ( module_item )* endmodule
+ ( COLUMN identifier )?
+ | EXTERN module_nonansi_header
+ | EXTERN module_ansi_header
+ ;
+
+endmodule : ENDMODULE ;
+
+module_keyword
+ : MODULE
+ | MACROMODULE
+ ;
+
+interface_nonansi_header :
+ ( attribute_instance )* INTERFACE ( lifetime )? interface_identifier
+ ( parameter_port_list )? list_of_ports SEMICOLUMN ;
+
+
+interface_ansi_header :
+ ( attribute_instance )* INTERFACE ( lifetime )? interface_identifier
+ ( parameter_port_list )? ( list_of_port_declarations )? SEMICOLUMN ;
+
+interface_declaration
+: interface_nonansi_header ( timeunits_declaration )? ( interface_item )*
+ endinterface ( COLUMN interface_identifier )?
+| interface_ansi_header ( timeunits_declaration )? ( non_port_interface_item )*
+ endinterface ( COLUMN interface_identifier )?
+| ( attribute_instance )? INTERFACE interface_identifier
+ OPEN_PARENS DOT STAR CLOSE_PARENS SEMICOLUMN
+ ( timeunits_declaration )? ( interface_item )*
+ endinterface ( COLUMN interface_identifier )?
+| EXTERN interface_nonansi_header
+| EXTERN interface_ansi_header
+;
+
+endinterface : ENDINTERFACE ;
+
+program_nonansi_header :
+( attribute_instance ) PROGRAM ( lifetime )? identifier
+( parameter_port_list )? list_of_ports SEMICOLUMN ;
+
+program_ansi_header :
+( attribute_instance )* PROGRAM ( lifetime )? identifier
+( parameter_port_list )? ( list_of_port_declarations )? SEMICOLUMN ;
+
+endchecker : ENDCHECKER ;
+
+checker_declaration :
+ CHECKER identifier ( OPEN_PARENS checker_port_list? CLOSE_PARENS )? SEMICOLUMN
+ ( ( attribute_instance )* checker_or_generate_item )* endchecker ( COLUMN identifier )?
+ ;
+
+program_declaration
+: program_nonansi_header ( timeunits_declaration )? ( program_item )*
+ endprogram ( COLUMN identifier )?
+| program_ansi_header ( timeunits_declaration )? ( non_port_program_item )*
+ endprogram ( COLUMN identifier )?
+| ( attribute_instance )* PROGRAM identifier
+ OPEN_PARENS DOT STAR CLOSE_PARENS SEMICOLUMN
+ ( timeunits_declaration )? ( program_item )*
+ endprogram ( COLUMN identifier )?
+| EXTERN program_nonansi_header
+| EXTERN program_ansi_header
+;
+
+endprogram : ENDPROGRAM ;
+
+
+class_declaration
+ : ( VIRTUAL )? CLASS ( lifetime )? identifier ( parameter_port_list )?
+ ( EXTENDS class_type ( OPEN_PARENS list_of_arguments CLOSE_PARENS )? )?
+ ( IMPLEMENTS interface_class_type ( COMMA interface_class_type )* )?
+ SEMICOLUMN
+ ( class_item )*
+ endclass ( COLUMN identifier )?
+ ;
+
+endclass : ENDCLASS;
+
+interface_class_type :
+ ps_identifier ( parameter_value_assignment )? ;
+
+interface_class_declaration :
+ INTERFACE CLASS identifier ( parameter_port_list )?
+ ( EXTENDS interface_class_type ( COMMA interface_class_type )* )? SEMICOLUMN ( interface_class_item )*
+ endclass ( COLUMN identifier )?
+ ;
+
+interface_class_item : type_declaration
+ | ( attribute_instance )* interface_class_method SEMICOLUMN
+ | local_parameter_declaration SEMICOLUMN
+ | parameter_declaration SEMICOLUMN
+ | SEMICOLUMN
+ ;
+
+interface_class_method :
+ PURE VIRTUAL method_prototype ;
+
+endpackage : ENDPACKAGE;
+
+package_declaration
+ : ( attribute_instance )* PACKAGE identifier SEMICOLUMN
+ ( timeunits_declaration )? ( ( attribute_instance )* package_item )*
+ endpackage ( COLUMN identifier )?
+ ;
+
+timeunits_declaration
+ : TIMEUNIT time_literal DIV time_literal SEMICOLUMN # TimeUnitsDecl_TimeUnitDiv
+ | TIMEUNIT time_literal SEMICOLUMN # TimeUnitsDecl_TimeUnit
+ | TIMEPRECISION time_literal SEMICOLUMN # TimeUnitsDecl_TimePrecision
+ | TIMEUNIT time_literal SEMICOLUMN TIMEPRECISION
+ time_literal SEMICOLUMN # TimeUnitsDecl_TimeUnitTimePrecision
+ | TIMEPRECISION time_literal SEMICOLUMN TIMEUNIT
+ time_literal SEMICOLUMN # TimeUnitsDecl_TimePrecisionTimeUnit
+ ;
+
+parameter_port_list
+ : POUND OPEN_PARENS list_of_param_assignments
+ ( COMMA parameter_port_declaration )* CLOSE_PARENS
+ | POUND OPEN_PARENS parameter_port_declaration
+ ( COMMA parameter_port_declaration )* CLOSE_PARENS
+ | POUND OPEN_PARENS CLOSE_PARENS
+ ;
+
+parameter_port_declaration
+ : parameter_declaration
+ | local_parameter_declaration
+ | data_type list_of_param_assignments
+ | TYPE list_of_type_assignments
+ ;
+
+list_of_ports : OPEN_PARENS port ( COMMA port )* CLOSE_PARENS ;
+
+list_of_port_declarations : OPEN_PARENS ( ( attribute_instance )*
+ ansi_port_declaration ( COMMA ( attribute_instance )*
+ ansi_port_declaration )* )? CLOSE_PARENS ;
+
+port_declaration
+ : ( attribute_instance )* ( inout_declaration
+ | input_declaration
+ | output_declaration
+ | ref_declaration
+ | interface_port_declaration );
+
+port
+ : port_expression
+ | DOT identifier OPEN_PARENS port_expression CLOSE_PARENS
+ ;
+
+port_expression
+ : port_reference
+ | ( port_reference ( COMMA port_reference )* )*
+ ;
+
+port_reference : identifier constant_select ;
+
+port_direction
+ : INPUT # PortDir_Inp
+ | OUTPUT # PortDir_Out
+ | INOUT # PortDir_Inout
+ | REF # PortDir_Ref
+ ;
+
+net_port_header : ( port_direction )? net_port_type ;
+
+variable_port_header : ( port_direction )? variable_port_type ;
+
+interface_port_header
+ : interface_identifier ( DOT identifier )?
+ | INTERFACE ( DOT identifier )?
+ ;
+
+ansi_port_declaration
+ : ( net_port_header | interface_port_header ) identifier
+ ( unpacked_dimension )* ( ASSIGN_OP constant_expression )?
+ | ( variable_port_header )? identifier variable_dimension*
+ ( ASSIGN_OP constant_expression )?
+ | ( net_port_header | variable_port_header) DOT identifier OPEN_PARENS
+ ( expression )? CLOSE_PARENS
+ ;
+
+elaboration_system_task
+ : DOLLAR Simple_identifier ( OPEN_PARENS number ( COMMA list_of_arguments )? CLOSE_PARENS )? SEMICOLUMN
+ | DOLLAR Simple_identifier ( OPEN_PARENS list_of_arguments CLOSE_PARENS )? SEMICOLUMN
+ | DOLLAR Simple_identifier ( OPEN_PARENS list_of_arguments CLOSE_PARENS )? SEMICOLUMN
+ | DOLLAR Simple_identifier ( OPEN_PARENS list_of_arguments CLOSE_PARENS )? SEMICOLUMN
+ ;
+
+module_common_item
+ : module_or_generate_item_declaration
+ | interface_instantiation
+ | program_instantiation
+ | assertion_item
+ | bind_directive
+ | continuous_assign
+ | net_alias
+ | initial_construct
+ | final_construct
+ | always_construct
+ | loop_generate_construct
+ | conditional_generate_construct
+ | elaboration_system_task
+ | system_task
+ ;
+
+
+module_item
+ : port_declaration SEMICOLUMN
+ | non_port_module_item
+ ;
+
+
+module_or_generate_item
+ : ( attribute_instance )* ( parameter_override
+ | gate_instantiation
+ | udp_instantiation
+ | module_instantiation
+ | module_common_item
+ ) ;
+
+module_or_generate_item_declaration
+ : package_or_generate_item_declaration
+ | genvar_declaration
+ | clocking_declaration
+ | DEFAULT CLOCKING identifier SEMICOLUMN
+ | DEFAULT DISABLE IFF expression_or_dist SEMICOLUMN
+ ;
+
+non_port_module_item
+ : generated_module_instantiation
+ | module_or_generate_item
+ | specify_block
+ | ( attribute_instance )* specparam_declaration
+ | program_declaration
+ | module_declaration
+ | timeunits_declaration
+ | system_task
+ | surelog_macro_not_defined
+ | pragma_directive
+ ;
+
+
+parameter_override : DEFPARAM list_of_defparam_assignments SEMICOLUMN ;
+
+
+bind_directive : BIND ( dollar_root_keyword )? identifier (( OPEN_BRACKET constant_expression CLOSE_BRACKET )* DOT identifier)* constant_select
+ bind_instantiation ;
+
+
+bind_instantiation
+ : program_instantiation
+ | module_instantiation
+ | interface_instantiation
+ | checker_instantiation
+ ;
+
+
+
+interface_or_generate_item
+ : ( attribute_instance )* ( module_common_item
+ | MODPORT modport_item ( COMMA modport_item )* SEMICOLUMN
+ | extern_tf_declaration )
+ ;
+
+
+extern_tf_declaration
+ : EXTERN method_prototype SEMICOLUMN
+ | EXTERN FORKJOIN task_prototype SEMICOLUMN
+;
+
+interface_item
+ : port_declaration SEMICOLUMN
+ | non_port_interface_item
+ ;
+
+non_port_interface_item
+ : generated_interface_instantiation
+ | ( attribute_instance )* specparam_declaration
+ | interface_or_generate_item
+ | program_declaration
+ | interface_declaration
+ | timeunits_declaration
+ | surelog_macro_not_defined
+ ;
+
+program_item
+ : port_declaration SEMICOLUMN
+ | non_port_program_item
+ ;
+
+non_port_program_item
+ : ( attribute_instance )* continuous_assign
+ | ( attribute_instance )* module_or_generate_item_declaration
+ | ( attribute_instance )* specparam_declaration
+ | ( attribute_instance )* initial_construct
+ | ( attribute_instance )* final_construct
+ | ( attribute_instance )* concurrent_assertion_item
+ | timeunits_declaration
+ | program_generate_item
+ | surelog_macro_not_defined
+ ;
+
+program_generate_item :
+ loop_generate_construct
+ | conditional_generate_construct
+ | generate_region
+ | elaboration_system_task
+ ;
+
+checker_port_list :
+ checker_port_item ( COMMA checker_port_item )? ;
+
+checker_port_item :
+ attribute_instance* (INPUT | OUTPUT)? property_formal_type identifier
+ variable_dimension* ( ASSIGN_OP property_actual_arg )? ;
+
+checker_or_generate_item
+ : checker_or_generate_item_declaration
+ | initial_construct
+ | always_construct
+ | final_construct
+ | assertion_item
+ | continuous_assign
+ | checker_generate_item
+ ;
+
+checker_or_generate_item_declaration
+ : RAND* data_declaration
+ | function_declaration
+ | checker_declaration
+ | assertion_item_declaration
+ | covergroup_declaration
+ | overload_declaration
+ | genvar_declaration
+ | clocking_declaration
+ | DEFAULT CLOCKING identifier SEMICOLUMN
+ | DEFAULT DISABLE IFF expression_or_dist SEMICOLUMN
+ | SEMICOLUMN
+ | surelog_macro_not_defined
+// | slline
+ ;
+
+checker_generate_item
+ : loop_generate_construct
+ | conditional_generate_construct
+ | generate_region
+ | elaboration_system_task
+ ;
+
+class_item
+ : ( attribute_instance )* ( class_property
+ | class_method
+ | class_constraint
+ | type_declaration
+ | class_declaration
+ | covergroup_declaration )
+ | local_parameter_declaration SEMICOLUMN
+ | parameter_declaration SEMICOLUMN
+ | surelog_macro_not_defined
+ | SEMICOLUMN
+ ;
+
+class_property
+ : ( property_qualifier )* data_declaration
+ | CONST ( class_item_qualifier )* data_type identifier
+ ( ASSIGN_OP constant_expression )? SEMICOLUMN
+ ;
+
+pure_virtual_qualifier : PURE VIRTUAL ;
+
+extern_qualifier : EXTERN ;
+
+class_method
+ : ( method_qualifier )* (task_declaration | function_declaration | class_constructor_declaration)
+ | pure_virtual_qualifier ( class_item_qualifier )* method_prototype SEMICOLUMN
+ | extern_qualifier ( method_qualifier )* ( method_prototype SEMICOLUMN | class_constructor_prototype )
+ ;
+
+class_constructor_prototype : FUNCTION NEW ( OPEN_PARENS ( tf_port_list )? CLOSE_PARENS )?;
+
+class_constraint
+ : constraint_prototype
+ | constraint_declaration
+ ;
+
+class_item_qualifier
+ : STATIC # ClassItemQualifier_Static
+ | PROTECTED # ClassItemQualifier_Protected
+ | LOCAL # ClassItemQualifier_Local
+ ;
+
+property_qualifier
+ : RAND # PropQualifier_Rand
+ | RANDC # PropQualifier_Randc
+ | class_item_qualifier # PropQualifier_ClassItem
+ ;
+
+method_qualifier
+ : VIRTUAL # MethodQualifier_Virtual
+ | class_item_qualifier # MethodQualifier_ClassItem
+ ;
+
+method_prototype
+ : task_prototype
+ | function_prototype
+ ;
+
+super_dot_new : SUPER DOT NEW ;
+
+class_constructor_declaration
+ : FUNCTION ( class_scope )? NEW ( OPEN_PARENS ( tf_port_list )? CLOSE_PARENS )? SEMICOLUMN
+ ( block_item_declaration )*
+ ( super_dot_new ( OPEN_PARENS list_of_arguments CLOSE_PARENS )? SEMICOLUMN )?
+ ( function_statement_or_null )*
+ endfunction ( COLUMN NEW )? ;
+
+constraint_declaration : ( STATIC )? CONSTRAINT identifier constraint_block ;
+
+constraint_block : OPEN_CURLY ( constraint_block_item )* CLOSE_CURLY ;
+
+constraint_block_item
+ : SOLVE solve_before_list BEFORE solve_before_list SEMICOLUMN
+ | constraint_expression
+ ;
+
+solve_before_list :
+ constraint_primary ( COMMA constraint_primary )* ;
+
+constraint_primary :
+ ( implicit_class_handle DOT | class_scope )? ( dollar_root_keyword )? identifier (( OPEN_BRACKET constant_expression CLOSE_BRACKET )* DOT identifier)* select ;
+
+
+constraint_expression
+ : SOFT? expression_or_dist SEMICOLUMN
+ | uniqueness_constraint SEMICOLUMN
+ | expression IMPLY constraint_set
+ | IF OPEN_PARENS expression CLOSE_PARENS constraint_set
+ ( ELSE constraint_set )?
+ | FOREACH OPEN_PARENS ps_or_hierarchical_array_identifier OPEN_BRACKET loop_variables
+ CLOSE_BRACKET CLOSE_PARENS constraint_set
+ | DISABLE SOFT constraint_primary SEMICOLUMN
+ ;
+
+uniqueness_constraint :
+ UNIQUE OPEN_CURLY open_range_list CLOSE_CURLY ;
+
+
+constraint_set
+ : constraint_expression
+ | OPEN_CURLY ( constraint_expression )* CLOSE_CURLY
+ ;
+
+
+dist_list : dist_item ( COMMA dist_item )* ;
+
+
+dist_item : value_range ( dist_weight )? ;
+
+/* Replaced by COLUMN DIV : ASSIGN_RANGE : ':/' ; */
+dist_weight
+ : ASSIGN_VALUE expression # DistWeight_AssignValue
+ | COLUMN DIV expression # DistWeight_AssignRange
+ ;
+
+constraint_prototype : (extern_qualifier | pure_keyword )? ( STATIC )? CONSTRAINT identifier SEMICOLUMN ;
+
+
+extern_constraint_declaration :
+ ( STATIC )? CONSTRAINT class_scope identifier constraint_block ;
+
+identifier_list : identifier ( COMMA identifier )* ;
+
+package_item
+ : package_or_generate_item_declaration
+ | specparam_declaration
+ | anonymous_program
+ | package_export_declaration
+ | timeunits_declaration
+// | slline
+ ;
+
+
+package_or_generate_item_declaration
+ : net_declaration
+ | data_declaration
+ | task_declaration
+ | function_declaration
+ | checker_declaration
+ | dpi_import_export
+ | extern_constraint_declaration
+ | class_declaration
+ | interface_class_declaration
+ | class_constructor_declaration
+ | parameter_declaration SEMICOLUMN
+ | local_parameter_declaration SEMICOLUMN
+ | covergroup_declaration
+ | overload_declaration
+ | assertion_item_declaration
+ | SEMICOLUMN
+ ;
+
+anonymous_program : PROGRAM SEMICOLUMN ( anonymous_program_item )* endprogram ;
+
+anonymous_program_item
+ : task_declaration
+ | function_declaration
+ | class_declaration
+ | covergroup_declaration
+ | class_constructor_declaration
+ | SEMICOLUMN
+ | surelog_macro_not_defined
+// | slline
+ ;
+
+local_parameter_declaration
+ : LOCALPARAM data_type_or_implicit list_of_param_assignments
+ | LOCALPARAM TYPE list_of_param_assignments
+ ;
+
+
+parameter_declaration
+ : PARAMETER data_type_or_implicit list_of_param_assignments
+ | PARAMETER TYPE list_of_type_assignments
+ ;
+
+
+specparam_declaration :
+ SPECPARAM ( packed_dimension )? list_of_specparam_assignments SEMICOLUMN ;
+
+
+
+inout_declaration : INOUT net_port_type list_of_port_identifiers ;
+
+
+input_declaration
+ : INPUT net_port_type list_of_port_identifiers
+ | INPUT variable_port_type? list_of_variable_identifiers
+ ;
+
+
+output_declaration
+ : OUTPUT net_port_type list_of_port_identifiers
+ | OUTPUT variable_port_type? list_of_variable_port_identifiers
+ ;
+
+
+interface_port_declaration
+ : interface_identifier list_of_interface_identifiers
+ | interface_identifier DOT identifier
+ list_of_interface_identifiers
+ ;
+
+
+ref_declaration : REF variable_port_type list_of_variable_identifiers ;
+
+
+
+data_declaration
+ : ( CONST )? ( VAR )? ( lifetime )? variable_declaration
+ | type_declaration
+ | package_import_declaration
+ | net_type_declaration
+// | virtual_interface_declaration
+ ;
+
+variable_declaration : ( data_type
+ | signing ( packed_dimension )*
+ | ( packed_dimension )+
+ )
+ list_of_variable_decl_assignments SEMICOLUMN ;
+
+package_import_declaration :
+ IMPORT package_import_item ( COMMA package_import_item )* SEMICOLUMN ;
+
+
+package_import_item
+ : identifier COLUMNCOLUMN identifier
+ | identifier COLUMNCOLUMN STAR
+ ;
+
+package_export_declaration
+ : EXPORT STARCOLUMNCOLUMNSTAR SEMICOLUMN
+ | EXPORT package_import_item ( COMMA package_import_item )? SEMICOLUMN
+ ;
+
+genvar_declaration : GENVAR identifier_list SEMICOLUMN ;
+
+net_declaration
+ : net_type ( drive_strength | charge_strength )? ( VECTORED | SCALARED )?
+ data_type_or_implicit ( delay3 )? list_of_net_decl_assignments SEMICOLUMN
+ | identifier delay_control? list_of_net_decl_assignments SEMICOLUMN
+ | INTERCONNECT implicit_data_type ( pound_delay_value )? identifier unpacked_dimension*
+ ( COMMA identifier unpacked_dimension* )? SEMICOLUMN
+ ;
+
+
+type_declaration
+ : TYPEDEF
+ (
+ ( (data_type | net_type) identifier variable_dimension* )
+ | ( identifier constant_bit_select DOT identifier identifier )
+ | ( ( enum_keyword | struct_keyword | union_keyword | class_keyword | interface_class_keyword )? identifier )
+ )
+ SEMICOLUMN
+ ;
+
+enum_keyword : ENUM;
+
+struct_keyword : STRUCT;
+
+union_keyword : UNION;
+
+class_keyword : CLASS;
+
+interface_class_keyword : INTERFACE CLASS;
+
+net_type_declaration
+ : NETTYPE
+ (
+ ( data_type identifier ( WITH ( package_scope | class_scope )? identifier )? )
+ | ( ( package_scope | class_scope )? identifier identifier )
+ )
+ SEMICOLUMN
+ ;
+
+lifetime
+ : STATIC # Lifetime_Static
+ | AUTOMATIC # Lifetime_Automatic
+ ;
+
+casting_type
+ : simple_type
+ | primary_literal
+// | ( package_scope | class_scope )? identifier constant_select ( OPEN_BRACKET constant_range_expression CLOSE_BRACKET )?
+// | constant_concatenation ( OPEN_BRACKET constant_range_expression CLOSE_BRACKET )?
+// | constant_multiple_concatenation ( OPEN_BRACKET constant_range_expression CLOSE_BRACKET )?
+// | subroutine_call
+ | OPEN_PARENS constant_mintypmax_expression CLOSE_PARENS
+// | casting_type TICK ( OPEN_PARENS constant_expression CLOSE_PARENS | constant_concatenation | constant_multiple_concatenation )
+// | constant_assignment_pattern_expression
+// | type_reference
+ | signing
+ | string_type
+ | const_type
+ | system_task
+ ;
+
+data_type
+ : integer_vector_type ( signing )? ( packed_dimension )*
+ | integer_atom_type ( signing )?
+ | non_integer_type
+ | struct_union ( packed_keyword ( signing )? )? OPEN_CURLY struct_union_member ( struct_union_member )* CLOSE_CURLY ( packed_dimension )*
+ | ENUM ( enum_base_type )? OPEN_CURLY enum_name_declaration ( COMMA enum_name_declaration )* CLOSE_CURLY
+ | string_type
+ | chandle_type
+ | VIRTUAL ( INTERFACE )? interface_identifier ( parameter_value_assignment )? ( DOT identifier )?
+ | ( class_scope | package_scope )? identifier ( ( packed_dimension )+ | (( parameter_value_assignment )? ( COLUMNCOLUMN identifier ( parameter_value_assignment )? )*) )
+ | event_type
+ | type_reference
+ ;
+
+packed_keyword : PACKED;
+
+string_type : STRING ;
+
+string_value : String ;
+
+chandle_type : CHANDLE ;
+
+event_type : EVENT ;
+
+const_type : CONST ;
+
+data_type_or_implicit
+ : data_type
+ | ( signing )? ( packed_dimension )*
+ ;
+
+implicit_data_type :
+ signing? packed_dimension*;
+
+enum_base_type
+ : integer_atom_type ( signing )?
+ | integer_vector_type ( signing )? ( packed_dimension )?
+ | identifier ( packed_dimension )?
+ ;
+
+enum_name_declaration
+ : identifier
+ ( OPEN_BRACKET Integral_number ( COLUMN Integral_number )? CLOSE_BRACKET )?
+ ( ASSIGN_OP constant_expression )?
+ ;
+
+class_scope : class_type COLUMNCOLUMN ;
+
+// identifier was inlined to lexer tokens for parsing speed
+class_type :
+ ( Simple_identifier
+ | Escaped_identifier
+ | THIS
+ | RANDOMIZE
+ | SAMPLE
+ | DOLLAR_UNIT ) ( parameter_value_assignment )? ( COLUMNCOLUMN identifier ( parameter_value_assignment )? )*
+ ;
+
+integer_type
+ : integer_vector_type
+ | integer_atom_type
+ ;
+
+integer_atom_type
+ : BYTE # IntegerAtomType_Byte
+ | SHORTINT # IntegerAtomType_Shortint
+ | INT # IntegerAtomType_Int
+ | LONGINT # IntegerAtomType_LongInt
+ | INTEGER # IntegerAtomType_Int
+ | TIME # IntegerAtomType_Time
+ ;
+
+integer_vector_type
+ : BIT # IntVec_TypeBit
+ | LOGIC # IntVec_TypeLogic
+ | REG # IntVec_TypeReg
+ ;
+
+
+non_integer_type
+ : SHORTREAL # NonIntType_ShortReal
+ | REAL # NonIntType_Real
+ | REALTIME # NonIntType_RealTime
+ ;
+
+
+net_type
+ : SUPPLY0 # NetType_Supply0
+ | SUPPLY1 # NetType_Supply1
+ | TRI # NetType_Tri
+ | TRIAND # NetType_TriAnd
+ | TRIOR # NetType_TriOr
+ | TRIREG # NetType_TriReg
+ | TRI0 # NetType_Tri0
+ | TRI1 # NetType_Tri1
+ | UWIRE # NetType_Uwire
+ | WIRE # NetType_Wire
+ | WAND # NetType_Wand
+ | WOR # NetType_Wor
+ ;
+
+net_port_type :
+ net_type? data_type_or_implicit
+ | identifier
+ | INTERCONNECT implicit_data_type ;
+
+variable_port_type
+ : var_data_type
+ | OPEN_BRACKET constant_range CLOSE_BRACKET
+ ;
+
+var_data_type :
+ data_type
+ | VAR data_type_or_implicit ;
+
+signing
+ : SIGNED # Signing_Signed
+ | UNSIGNED # Signing_Unsigned
+ ;
+
+
+simple_type
+ : integer_type
+ | non_integer_type
+ | ps_type_identifier
+ ;
+
+random_qualifier :
+ RAND # RandomQualifier_Rand
+ | RANDC # RandomQualifier_RandC
+ ;
+
+struct_union_member :
+( attribute_instance )* ( random_qualifier )? data_type_or_void list_of_variable_decl_assignments SEMICOLUMN ;
+
+
+data_type_or_void
+ : data_type
+ | VOID
+ ;
+
+struct_union
+ : struct_keyword
+ | union_keyword ( tagged_keyword )?
+ ;
+
+tagged_keyword : TAGGED;
+
+type_reference :
+ TYPE OPEN_PARENS expression CLOSE_PARENS | TYPE OPEN_PARENS data_type CLOSE_PARENS ;
+
+drive_strength
+ : OPEN_PARENS strength0 COMMA strength1 CLOSE_PARENS
+ | OPEN_PARENS strength1 COMMA strength0 CLOSE_PARENS
+ | OPEN_PARENS strength0 COMMA HIGHZ1 CLOSE_PARENS
+ | OPEN_PARENS strength1 COMMA HIGHZ0 CLOSE_PARENS
+ | OPEN_PARENS HIGHZ0 COMMA strength1 CLOSE_PARENS
+ | OPEN_PARENS HIGHZ1 COMMA strength0 CLOSE_PARENS
+;
+
+strength0
+ : SUPPLY0 # Strength0_Supply0
+ | STRONG0 # Strength0_Strong0
+ | PULL0 # Strength0_Pull0
+ | WEAK0 # Strength0_Weak0
+ ;
+
+strength1
+ : SUPPLY1 # Strength1_Supply1
+ | STRONG1 # Strength1_Strong1
+ | PULL1 # Strength1_Pull1
+ | WEAK1 # Strength1_Weak1
+ ;
+
+charge_strength
+ : SMALL # ChargeStrength_Small
+ | MEDIUM # ChargeStrength_Medium
+ | LARGE # ChargeStrength_Large
+ ;
+
+delay3
+ : pound_delay_value
+ | POUND OPEN_PARENS mintypmax_expression ( COMMA mintypmax_expression
+ ( COMMA mintypmax_expression )? )? CLOSE_PARENS
+ ;
+
+delay2
+ : pound_delay_value
+ | POUND OPEN_PARENS mintypmax_expression
+ ( COMMA mintypmax_expression )? CLOSE_PARENS
+ ;
+
+
+pound_delay_value
+ : Pound_delay (time_unit)?
+ | POUND delay_value ;
+
+delay_value
+ : Integral_number
+ | Real_number
+ | ps_identifier
+ | time_literal
+ | ONESTEP
+ | ps_or_hierarchical_identifier
+//REMOVED | Decimal_number
+ ;
+
+list_of_defparam_assignments : defparam_assignment ( COMMA defparam_assignment )* ;
+
+list_of_interface_identifiers : interface_identifier ( unpacked_dimension )*
+ ( COMMA interface_identifier ( unpacked_dimension )* )* ;
+
+list_of_net_decl_assignments : net_decl_assignment ( COMMA net_decl_assignment )* ;
+
+list_of_param_assignments : param_assignment ( COMMA param_assignment )* ;
+
+list_of_port_identifiers : identifier ( unpacked_dimension )*
+ ( COMMA identifier ( unpacked_dimension )* )* ;
+
+list_of_specparam_assignments : specparam_assignment ( COMMA specparam_assignment )* ;
+
+list_of_tf_variable_identifiers : identifier variable_dimension* ( ASSIGN_OP expression )?
+ ( COMMA identifier variable_dimension* ( ASSIGN_OP expression )? )* ;
+
+list_of_type_assignments : (identifier (ASSIGN_OP data_type)? ) ( COMMA (identifier (ASSIGN_OP data_type)? ) )* ;
+
+list_of_variable_decl_assignments : variable_decl_assignment ( COMMA variable_decl_assignment )* ;
+
+list_of_variable_identifiers : identifier variable_dimension*
+ ( COMMA identifier variable_dimension* )* ;
+
+list_of_variable_port_identifiers : identifier variable_dimension* ( ASSIGN_OP constant_expression )?
+ ( COMMA identifier variable_dimension* ( ASSIGN_OP constant_expression )? )* ;
+
+list_of_virtual_interface_decl :
+ identifier ( ASSIGN_OP identifier )?
+ ( COMMA identifier ( ASSIGN_OP identifier )? )* ;
+
+defparam_assignment : hierarchical_identifier ASSIGN_OP constant_mintypmax_expression ;
+
+net_decl_assignment : identifier ( unpacked_dimension )* ( ASSIGN_OP expression )? ;
+
+param_assignment : identifier ( unpacked_dimension )* (ASSIGN_OP constant_param_expression)? ;
+
+specparam_assignment
+ : identifier ASSIGN_OP constant_mintypmax_expression
+ | pulse_control_specparam
+ ;
+
+pulse_control_specparam
+ : PATHPULSE DOLLAR ASSIGN_OP OPEN_PARENS constant_mintypmax_expression
+ ( COMMA constant_mintypmax_expression )? CLOSE_PARENS SEMICOLUMN
+ | PATHPULSE DOLLAR specify_input_terminal_descriptor
+ DOLLAR specify_output_terminal_descriptor ASSIGN_OP OPEN_PARENS
+ constant_mintypmax_expression ( COMMA constant_mintypmax_expression )? CLOSE_PARENS SEMICOLUMN
+
+ ;
+
+variable_decl_assignment
+ : identifier ( (ASSIGN_OP class_new )
+ | ( unsized_dimension variable_dimension* ( ASSIGN_OP dynamic_array_new )?)
+ | ( ASSIGN_OP NEW ( OPEN_PARENS list_of_arguments CLOSE_PARENS )?)
+ | (variable_dimension* ( ASSIGN_OP expression )?) )
+ // | ASSIGN_OP NEW ( OPEN_PARENS list_of_arguments CLOSE_PARENS )?
+ ;
+
+class_new : (class_scope)? NEW ( OPEN_PARENS list_of_arguments CLOSE_PARENS | expression )? ;
+
+dynamic_array_new : NEW OPEN_BRACKET expression CLOSE_BRACKET ( OPEN_PARENS expression CLOSE_PARENS )? ;
+
+unpacked_dimension
+ : OPEN_BRACKET constant_range CLOSE_BRACKET
+ | OPEN_BRACKET constant_expression CLOSE_BRACKET
+ ;
+
+packed_dimension
+ : OPEN_BRACKET constant_range CLOSE_BRACKET
+ | unsized_dimension
+ ;
+
+
+associative_dimension
+ : OPEN_BRACKET data_type CLOSE_BRACKET
+ | ASSOCIATIVE_UNSPECIFIED
+ ;
+
+
+variable_dimension
+ : unsized_dimension
+ | unpacked_dimension
+ | associative_dimension
+ | queue_dimension
+ ;
+
+queue_dimension : OPEN_BRACKET DOLLAR ( COLUMN constant_expression )? CLOSE_BRACKET ;
+
+unsized_dimension : OPEN_BRACKET CLOSE_BRACKET ;
+
+function_data_type
+ : data_type
+ | VOID
+ ;
+
+function_data_type_or_implicit
+ : function_data_type
+ | ( signing )? ( packed_dimension )*
+ ;
+
+function_declaration : FUNCTION ( lifetime )? function_body_declaration ;
+
+endfunction : ENDFUNCTION ;
+
+function_body_declaration
+ : function_data_type_or_implicit
+ ( interface_identifier DOT | class_scope )? identifier SEMICOLUMN
+ ( tf_item_declaration )*
+ ( function_statement_or_null )*
+ endfunction ( COLUMN identifier )?
+ | function_data_type_or_implicit
+ ( interface_identifier DOT | class_scope )? identifier OPEN_PARENS
+ ( tf_port_list )? CLOSE_PARENS SEMICOLUMN
+ ( block_item_declaration )*
+ ( function_statement_or_null )*
+ endfunction ( COLUMN identifier )?
+ ;
+
+function_prototype : FUNCTION function_data_type_or_implicit identifier ( OPEN_PARENS ( tf_port_list )? CLOSE_PARENS )?;
+
+dpi_import_export
+ : IMPORT string_value ( context_keyword | pure_keyword )? ( Simple_identifier ASSIGN_OP )? function_prototype SEMICOLUMN
+ | IMPORT string_value ( context_keyword )? ( Simple_identifier ASSIGN_OP )? task_prototype SEMICOLUMN
+ | EXPORT string_value ( Simple_identifier ASSIGN_OP )? (function_name_decl | task_name_decl) SEMICOLUMN
+ ;
+
+context_keyword : CONTEXT ;
+
+function_name_decl : FUNCTION identifier;
+
+task_name_decl : TASK identifier;
+
+pure_keyword : PURE;
+
+task_declaration : TASK ( lifetime )? task_body_declaration ;
+
+endtask : ENDTASK ;
+
+task_body_declaration
+ : ( interface_identifier DOT | class_scope )? identifier SEMICOLUMN
+ ( tf_item_declaration )*
+ ( statement_or_null )*
+ endtask ( COLUMN identifier )?
+ | ( interface_identifier DOT | class_scope )? identifier OPEN_PARENS (tf_port_list )? CLOSE_PARENS SEMICOLUMN
+ ( block_item_declaration )*
+ ( statement_or_null )*
+ endtask ( COLUMN identifier )?
+ ;
+
+
+tf_item_declaration
+ : block_item_declaration
+ | tf_port_declaration
+ ;
+
+tf_port_list : tf_port_item ( COMMA tf_port_item )* ;
+
+tf_port_item : ( attribute_instance )*
+ ( tf_port_direction )? ( VAR )? data_type_or_implicit
+ identifier variable_dimension* ( ASSIGN_OP expression )? ;
+
+tf_port_direction
+ : INPUT # TfPortDir_Inp
+ | OUTPUT # TfPortDir_Out
+ | INOUT # TfPortDir_Inout
+ | REF # TfPortDir_Ref
+ | CONST REF # TfPortDir_ConstRef
+ ;
+
+tf_port_declaration : ( attribute_instance )* tf_port_direction ( VAR )?
+ data_type_or_implicit list_of_tf_variable_identifiers SEMICOLUMN ;
+
+
+task_prototype : TASK identifier ( OPEN_PARENS ( tf_port_list )? CLOSE_PARENS )?;
+
+block_item_declaration
+ : ( attribute_instance )* ( data_declaration
+ | local_parameter_declaration
+ | parameter_declaration SEMICOLUMN
+ | overload_declaration )
+ ;
+
+overload_declaration : BIND overload_operator FUNCTION data_type identifier
+ OPEN_PARENS overload_proto_formals CLOSE_PARENS SEMICOLUMN ;
+
+overload_operator
+ : PLUS # OverloadOp_Plus
+ | PLUSPLUS # OverloadOp_PlusPlus
+ | MINUS # OverloadOp_Minus
+ | MINUSMINUS # OverloadOp_MinusMinus
+ | STAR # OverloadOp_Mult
+ | STARSTAR # OverloadOp_StarStar
+ | DIV # OverloadOp_Div
+ | PERCENT # OverloadOp_Percent
+ | EQUIV # OverloadOp_Equiv
+ | NOTEQUAL # OverloadOp_NotEqual
+ | LESS # OverloadOp_Less
+ | LESS_EQUAL # OverloadOp_LessEqual
+ | GREATER # OverloadOp_Greater
+ | GREATER_EQUAL # OverloadOp_GreaterEqual
+ | ASSIGN_OP # OverloadOp_Equal
+ ;
+
+overload_proto_formals : data_type ( COMMA data_type)* ;
+
+virtual_interface_declaration : VIRTUAL ( INTERFACE )? interface_identifier
+ list_of_virtual_interface_decl SEMICOLUMN ;
+
+modport_item : identifier OPEN_PARENS modport_ports_declaration ( COMMA modport_ports_declaration )* CLOSE_PARENS ;
+
+
+modport_ports_declaration
+ : ( attribute_instance )* ( modport_simple_ports_declaration
+ | modport_hierarchical_ports_declaration
+ | modport_tf_ports_declaration
+ | CLOCKING identifier )
+ ;
+
+modport_simple_ports_declaration : port_direction modport_simple_port
+ ( COMMA modport_simple_port )* ;
+
+modport_simple_port
+ : identifier
+ | DOT identifier OPEN_PARENS ( expression )*
+ CLOSE_PARENS
+ ;
+
+modport_hierarchical_ports_declaration : identifier
+ ( OPEN_BRACKET constant_expression CLOSE_BRACKET )?
+ DOT identifier ;
+
+modport_tf_ports_declaration : ( IMPORT | EXPORT ) modport_tf_port ( COMMA modport_tf_port )* ;
+
+modport_tf_port
+ : method_prototype
+ | identifier
+ ;
+
+concurrent_assertion_item
+ : ( identifier COLUMN )? concurrent_assertion_statement
+ | checker_instantiation
+ ;
+
+
+concurrent_assertion_statement
+ : assert_property_statement
+ | assume_property_statement
+ | cover_property_statement
+ | cover_sequence_statement
+ | restrict_property_statement
+ ;
+
+
+assert_property_statement :
+ ASSERT PROPERTY OPEN_PARENS property_spec CLOSE_PARENS action_block ;
+
+
+assume_property_statement :
+ ASSUME PROPERTY OPEN_PARENS property_spec CLOSE_PARENS SEMICOLUMN ;
+
+
+cover_property_statement :
+ COVER PROPERTY OPEN_PARENS property_spec CLOSE_PARENS statement_or_null ;
+
+
+expect_property_statement :
+ EXPECT OPEN_PARENS property_spec CLOSE_PARENS action_block ;
+
+
+cover_sequence_statement :
+ COVER SEQUENCE OPEN_PARENS ( clocking_event )? ( DISABLE IFF OPEN_PARENS expression_or_dist CLOSE_PARENS )?
+ sequence_expr CLOSE_PARENS statement_or_null ;
+
+restrict_property_statement :
+ RESTRICT PROPERTY OPEN_PARENS property_spec CLOSE_PARENS SEMICOLUMN ;
+
+property_instance :
+ ps_or_hierarchical_sequence_identifier ( OPEN_PARENS ( actual_arg_list )? CLOSE_PARENS )? ;
+
+//property_list_of_arguments
+// : (property_actual_arg)? ( COMMA (property_actual_arg)? )* ( COMMA DOT identifier OPEN_PARENS (property_actual_arg)? CLOSE_PARENS )*
+// | DOT identifier OPEN_PARENS (property_actual_arg)? CLOSE_PARENS ( COMMA DOT identifier OPEN_PARENS (property_actual_arg)? CLOSE_PARENS )*
+// ;
+
+property_actual_arg
+ : property_expr
+ | sequence_actual_arg
+ ;
+
+
+concurrent_assertion_item_declaration
+ : property_declaration
+ | sequence_declaration
+ ;
+
+assertion_item_declaration
+ : property_declaration
+ | sequence_declaration
+ | let_declaration
+ ;
+
+endproperty : ENDPROPERTY ;
+
+property_declaration :
+ PROPERTY identifier ( OPEN_PARENS ( list_of_formals )? CLOSE_PARENS )? SEMICOLUMN
+ ( assertion_variable_declaration )*
+ property_spec (SEMICOLUMN)?
+ endproperty ( COLUMN identifier )? ;
+
+property_formal_type
+ : sequence_formal_type
+ | PROPERTY
+ ;
+
+property_spec :
+ ( clocking_event )? ( DISABLE IFF OPEN_PARENS expression_or_dist CLOSE_PARENS )? property_expr ;
+
+endcase : ENDCASE ;
+
+property_expr
+ : sequence_expr
+ | STRONG OPEN_PARENS sequence_expr CLOSE_PARENS
+ | WEAK OPEN_PARENS sequence_expr CLOSE_PARENS
+ | OPEN_PARENS property_expr CLOSE_PARENS
+ | NOT property_expr
+ | property_expr OR property_expr
+ | property_expr AND property_expr
+ | sequence_expr OVERLAP_IMPLY property_expr
+ | sequence_expr NON_OVERLAP_IMPLY property_expr
+ | IF OPEN_PARENS expression_or_dist CLOSE_PARENS property_expr
+ ( ELSE property_expr )?
+ | CASE OPEN_PARENS expression_or_dist CLOSE_PARENS property_case_item property_case_item* endcase
+
+ | sequence_expr OVERLAPPED property_expr
+ | sequence_expr NONOVERLAPPED property_expr
+ | NEXTTIME property_expr
+ | NEXTTIME OPEN_BRACKET constant_expression CLOSE_BRACKET property_expr
+
+ | S_NEXTTIME property_expr
+ | S_NEXTTIME OPEN_BRACKET constant_expression CLOSE_BRACKET property_expr
+
+ | ALWAYS property_expr
+ | ALWAYS OPEN_BRACKET cycle_delay_const_range_expression CLOSE_BRACKET property_expr
+
+ | S_ALWAYS OPEN_BRACKET constant_range CLOSE_BRACKET property_expr
+
+ | S_EVENTUALLY property_expr
+ | EVENTUALLY OPEN_BRACKET constant_range CLOSE_BRACKET property_expr
+
+ | S_EVENTUALLY OPEN_BRACKET cycle_delay_const_range_expression CLOSE_BRACKET property_expr
+
+ | property_expr UNTIL property_expr
+ | property_expr S_UNTIL property_expr
+ | property_expr UNTIL_WITH property_expr
+ | property_expr S_UNTIL_WITH property_expr
+ | property_expr IMPLIES property_expr
+ | property_expr IFF property_expr
+ | ACCEPT_ON OPEN_PARENS expression_or_dist CLOSE_PARENS property_expr
+ | REJECT_ON OPEN_PARENS expression_or_dist CLOSE_PARENS property_expr
+ | SYNC_ACCEPT_ON OPEN_PARENS expression_or_dist CLOSE_PARENS property_expr
+ | SYNC_REJECT_ON OPEN_PARENS expression_or_dist CLOSE_PARENS property_expr
+ | property_instance
+ | clocking_event property_expr
+ ;
+
+property_case_item
+ : expression_or_dist ( COMMA expression_or_dist )* COLUMN property_expr SEMICOLUMN?
+ | DEFAULT COLUMN? property_expr SEMICOLUMN?
+ ;
+
+endsequence : ENDSEQUENCE;
+
+sequence_declaration :
+ SEQUENCE identifier ( OPEN_PARENS ( list_of_formals )? CLOSE_PARENS )? SEMICOLUMN
+ ( assertion_variable_declaration )*
+ sequence_expr (SEMICOLUMN)?
+ endsequence ( COLUMN identifier )?
+ ;
+
+
+sequence_expr
+ : cycle_delay_range sequence_expr ( cycle_delay_range sequence_expr )*
+
+ | sequence_expr cycle_delay_range sequence_expr ( cycle_delay_range sequence_expr )*
+
+ | expression_or_dist ( boolean_abbrev )?
+ | OPEN_PARENS expression_or_dist ( COMMA sequence_match_item )* CLOSE_PARENS ( boolean_abbrev )?
+
+ | sequence_instance ( consecutive_repetition )?
+ | OPEN_PARENS sequence_expr ( COMMA sequence_match_item )* CLOSE_PARENS
+ ( consecutive_repetition )?
+ | sequence_expr AND sequence_expr
+ | sequence_expr INTERSECT sequence_expr
+ | sequence_expr OR sequence_expr
+ | FIRST_MATCH OPEN_PARENS sequence_expr ( COMMA sequence_match_item )*
+ CLOSE_PARENS
+ | expression_or_dist THROUGHOUT sequence_expr
+ | sequence_expr WITHIN sequence_expr
+ | clocking_event sequence_expr
+ ;
+
+
+cycle_delay_range
+ : POUNDPOUND constant_primary
+ | POUNDPOUND OPEN_BRACKET cycle_delay_const_range_expression
+ CLOSE_BRACKET
+ | POUNDPOUND ASSOCIATIVE_UNSPECIFIED
+ | POUNDPOUND OPEN_BRACKET PLUS CLOSE_BRACKET
+ ;
+
+
+sequence_method_call : sequence_instance DOT identifier ;
+
+
+sequence_match_item
+ : operator_assignment
+ | inc_or_dec_expression
+ | subroutine_call
+ ;
+
+sequence_formal_type
+ : data_type_or_implicit # SeqFormatType_Data
+ | SEQUENCE # SeqFormatType_Sequence
+ | UNTYPED # SeqFormatType_Untyped
+ ;
+
+sequence_instance :
+ ps_or_hierarchical_sequence_identifier ( OPEN_PARENS sequence_list_of_arguments CLOSE_PARENS )? ;
+
+sequence_list_of_arguments
+ : sequence_actual_arg? ( COMMA sequence_actual_arg? )*
+ ( COMMA DOT identifier OPEN_PARENS sequence_actual_arg? CLOSE_PARENS )*
+ | DOT identifier OPEN_PARENS sequence_actual_arg? CLOSE_PARENS
+ ( COMMA DOT identifier OPEN_PARENS sequence_actual_arg? CLOSE_PARENS )*
+ ;
+
+sequence_actual_arg
+ : event_expression
+ | sequence_expr
+ ;
+
+
+formal_list_item :
+ identifier ( ASSIGN_OP actual_arg_expr )? ;
+
+
+list_of_formals : formal_list_item ( COMMA formal_list_item )* ;
+
+
+actual_arg_list
+ : actual_arg_expr ( COMMA actual_arg_expr )*
+ | DOT identifier OPEN_PARENS actual_arg_expr CLOSE_PARENS
+ ( COMMA DOT identifier OPEN_PARENS actual_arg_expr CLOSE_PARENS )*
+
+ ;
+
+
+actual_arg_expr
+ : event_expression
+ | dollar_keyword
+ ;
+
+
+boolean_abbrev
+ : consecutive_repetition
+ | non_consecutive_repetition
+ | goto_repetition
+ ;
+
+
+consecutive_repetition : CONSECUTIVE_REP const_or_range_expression CLOSE_BRACKET ;
+
+
+non_consecutive_repetition : NON_CONSECUTIVE_REP const_or_range_expression CLOSE_BRACKET ;
+
+
+goto_repetition : GOTO_REP const_or_range_expression CLOSE_BRACKET ;
+
+
+const_or_range_expression
+ : constant_expression
+ | cycle_delay_const_range_expression
+ ;
+
+
+cycle_delay_const_range_expression
+ : constant_expression COLUMN constant_expression
+ | constant_expression COLUMN DOLLAR
+ ;
+
+
+expression_or_dist : expression ( DIST OPEN_CURLY dist_list CLOSE_CURLY )? ;
+
+
+assertion_variable_declaration :
+ data_type list_of_variable_identifiers SEMICOLUMN ;
+
+
+let_declaration :
+ LET identifier ( OPEN_PARENS ( let_port_list )? CLOSE_PARENS )? ASSIGN_OP expression SEMICOLUMN ;
+
+
+let_port_list :
+ let_port_item ( COMMA let_port_item)* ;
+
+let_port_item :
+ ( attribute_instance )* let_formal_type identifier ( variable_dimension )* ( ASSIGN_OP expression )? ;
+
+let_formal_type :
+ data_type_or_implicit
+ | UNTYPED ;
+
+/*
+let_expression :
+ ( package_scope )? identifier ( OPEN_PARENS list_of_arguments CLOSE_PARENS )? ;
+*/
+
+endgroup : ENDGROUP ;
+
+covergroup_declaration :
+ COVERGROUP identifier ( OPEN_PARENS ( tf_port_list )? CLOSE_PARENS )? ( coverage_event )? SEMICOLUMN
+ ( coverage_spec_or_option )*
+ endgroup ( COLUMN identifier )? ;
+
+
+coverage_spec_or_option
+ : ( attribute_instance )* ( coverage_spec
+ | coverage_option SEMICOLUMN )
+ ;
+
+
+coverage_option
+ : OPTION_DOT identifier ASSIGN_OP expression
+ | TYPE_OPTION_DOT identifier ASSIGN_OP expression
+ ;
+
+
+coverage_spec
+ : cover_point
+ | cover_cross
+ ;
+
+
+coverage_event
+ : clocking_event
+ | WITH FUNCTION SAMPLE OPEN_PARENS tf_port_list? CLOSE_PARENS
+ | ATAT OPEN_PARENS block_event_expression CLOSE_PARENS
+ ;
+
+end : END ;
+
+block_event_expression
+ : block_event_expression OR block_event_expression
+ | BEGIN hierarchical_btf_identifier
+ | end hierarchical_btf_identifier
+ ;
+
+
+hierarchical_btf_identifier
+ : hierarchical_identifier
+ | ( dollar_root_keyword )? identifier (( OPEN_BRACKET constant_expression CLOSE_BRACKET )* DOT identifier)* ( class_scope )? identifier
+ ;
+
+
+cover_point : ( identifier COLUMN )? COVERPOINT expression ( IFF OPEN_PARENS expression CLOSE_PARENS )? bins_or_empty ;
+
+
+bins_or_empty
+ : OPEN_CURLY ( attribute_instance )*
+ ( bins_or_options SEMICOLUMN )* CLOSE_CURLY
+ | SEMICOLUMN
+ ;
+
+
+
+bins_or_options
+ : coverage_option
+ | ( WILDCARD )? bins_keyword identifier ( OPEN_BRACKET ( expression )? CLOSE_BRACKET )?
+ ASSIGN_OP OPEN_CURLY range_list CLOSE_CURLY ( WITH OPEN_PARENS expression CLOSE_PARENS )?
+ ( IFF OPEN_PARENS expression CLOSE_PARENS )?
+ | ( WILDCARD )? bins_keyword identifier ( OPEN_BRACKET ( expression )? CLOSE_BRACKET )? ASSIGN_OP
+ identifier ( WITH OPEN_PARENS expression CLOSE_PARENS )?
+ ( IFF OPEN_PARENS expression CLOSE_PARENS )?
+ | ( WILDCARD )? bins_keyword identifier ( OPEN_BRACKET ( expression )? CLOSE_BRACKET )? ASSIGN_OP
+ expression ( IFF OPEN_PARENS expression CLOSE_PARENS )?
+
+ | ( WILDCARD )? bins_keyword identifier ( unsized_dimension )?
+ ASSIGN_OP trans_list ( IFF OPEN_PARENS expression CLOSE_PARENS )?
+
+ | bins_keyword identifier ( OPEN_BRACKET ( expression )? CLOSE_BRACKET )?
+ ASSIGN_OP DEFAULT ( IFF OPEN_PARENS expression CLOSE_PARENS )?
+
+ | bins_keyword identifier ASSIGN_OP DEFAULT SEQUENCE
+ ( IFF OPEN_PARENS expression CLOSE_PARENS )?
+ ;
+
+
+bins_keyword
+ : BINS # Bins_Bins
+ | ILLEGAL_BINS # Bins_Illegal
+ | IGNORE_BINS # Bins_Ignore
+ ;
+
+range_list : value_range ( COMMA value_range )* ;
+
+
+trans_list : OPEN_PARENS trans_set CLOSE_PARENS ( COMMA OPEN_PARENS trans_set CLOSE_PARENS )* ;
+
+
+trans_set : trans_range_list ( TRANSITION_OP trans_range_list )* ;
+
+
+trans_range_list
+ : range_list
+ | range_list CONSECUTIVE_REP repeat_range CLOSE_BRACKET
+ | range_list GOTO_REP repeat_range CLOSE_BRACKET
+ | range_list NON_CONSECUTIVE_REP repeat_range CLOSE_BRACKET
+ ;
+
+repeat_range
+ : expression
+ | expression COLUMN expression
+ ;
+
+
+cover_cross : ( identifier COLUMN )? CROSS list_of_cross_items ( IFF OPEN_PARENS expression CLOSE_PARENS )? cross_body ;
+
+
+list_of_cross_items : cross_item COMMA cross_item ( COMMA cross_item )* ;
+
+
+cross_item
+ : identifier
+ | identifier
+ ;
+
+
+cross_body
+ : OPEN_CURLY ( cross_body_item SEMICOLUMN )? CLOSE_CURLY
+
+ | SEMICOLUMN
+ ;
+
+cross_body_item
+ : function_declaration
+ | bins_selection_or_option SEMICOLUMN
+ ;
+
+
+bins_selection_or_option
+ : ( attribute_instance )* ( coverage_option
+ | bins_selection )
+ ;
+
+
+bins_selection : bins_keyword identifier ASSIGN_OP select_expression ( IFF OPEN_PARENS expression CLOSE_PARENS )? ;
+
+
+select_expression
+ : select_condition
+ | BANG select_condition
+ | select_expression LOGICAL_AND select_expression
+ | select_expression LOGICAL_OR select_expression
+ | OPEN_PARENS select_expression CLOSE_PARENS
+ | select_expression WITH OPEN_PARENS expression CLOSE_PARENS
+ ( MATCHES expression )?
+ | identifier
+ | expression ( MATCHES expression )?
+ ;
+
+
+select_condition : BINSOF OPEN_PARENS bins_expression CLOSE_PARENS ( INTERSECT OPEN_CURLY open_range_list CLOSE_CURLY )? ;
+
+
+bins_expression
+ : identifier ( DOT identifier )?
+ ;
+
+
+open_range_list : value_range ( COMMA value_range )* ;
+
+gate_instantiation
+ : cmos_switchtype ( delay3 )? cmos_switch_instance ( COMMA cmos_switch_instance )* SEMICOLUMN
+
+ | enable_gatetype ( drive_strength )? ( delay3 )? enable_gate_instance ( COMMA enable_gate_instance )* SEMICOLUMN
+
+ | mos_switchtype ( delay3 )? mos_switch_instance ( COMMA mos_switch_instance )* SEMICOLUMN
+
+ | n_input_gatetype ( drive_strength )? ( delay2 )? n_input_gate_instance ( COMMA n_input_gate_instance )* SEMICOLUMN
+
+ | n_output_gatetype ( drive_strength )? ( delay2 )? n_output_gate_instance
+ ( COMMA n_output_gate_instance )* SEMICOLUMN
+
+ | pass_en_switchtype ( delay2 )? pass_enable_switch_instance ( COMMA pass_enable_switch_instance )* SEMICOLUMN
+
+ | pass_switchtype pass_switch_instance ( COMMA pass_switch_instance )* SEMICOLUMN
+
+ | PULLDOWN ( pulldown_strength )? pull_gate_instance ( COMMA pull_gate_instance )* SEMICOLUMN
+
+ | PULLUP ( pullup_strength )? pull_gate_instance ( COMMA pull_gate_instance )* SEMICOLUMN
+
+ ;
+
+
+cmos_switch_instance : ( name_of_instance )? OPEN_PARENS net_lvalue COMMA expression COMMA
+ expression COMMA expression CLOSE_PARENS ;
+
+
+enable_gate_instance : ( name_of_instance )? OPEN_PARENS net_lvalue COMMA expression COMMA expression CLOSE_PARENS ;
+
+
+mos_switch_instance : ( name_of_instance )? OPEN_PARENS net_lvalue COMMA expression COMMA expression CLOSE_PARENS ;
+
+
+n_input_gate_instance : ( name_of_instance )? OPEN_PARENS net_lvalue COMMA expression ( COMMA expression )* CLOSE_PARENS ;
+
+
+n_output_gate_instance : ( name_of_instance )? OPEN_PARENS net_lvalue ( COMMA net_lvalue )* COMMA
+ expression CLOSE_PARENS ;
+
+
+pass_switch_instance : ( name_of_instance )? OPEN_PARENS net_lvalue COMMA net_lvalue CLOSE_PARENS ;
+
+
+pass_enable_switch_instance : ( name_of_instance )? OPEN_PARENS net_lvalue COMMA net_lvalue COMMA
+ expression CLOSE_PARENS ;
+
+
+pull_gate_instance : ( name_of_instance )? OPEN_PARENS net_lvalue CLOSE_PARENS ;
+
+
+pulldown_strength
+ : OPEN_PARENS strength0 COMMA strength1 CLOSE_PARENS # PulldownStrength_01
+ | OPEN_PARENS strength1 COMMA strength0 CLOSE_PARENS # PulldownStrength_10
+ | OPEN_PARENS strength0 CLOSE_PARENS # PulldownStrength_0
+ ;
+
+
+pullup_strength
+ : OPEN_PARENS strength0 COMMA strength1 CLOSE_PARENS # PullupStrength_01
+ | OPEN_PARENS strength1 COMMA strength0 CLOSE_PARENS # PullupStrength_10
+ | OPEN_PARENS strength1 CLOSE_PARENS # PullupStrength_1
+ ;
+
+cmos_switchtype
+ : CMOS # CmosSwitchType_Cmos
+ | RCMOS # CmosSwitchType_RCmos
+ ;
+
+enable_gatetype
+ : BUFIF0 # EnableGateType_Bufif0
+ | BUFIF1 # EnableGateType_Bufif1
+ | NOTIF0 # EnableGateType_Notif0
+ | NOTIF1 # EnableGateType_Notif1
+ ;
+
+mos_switchtype
+ : NMOS # MosSwitchType_NMos
+ | PMOS # MosSwitchType_PMos
+ | RNMOS # MosSwitchType_RNMos
+ | RPMOS # MosSwitchType_RPMos
+ ;
+
+n_input_gatetype
+ : AND # NInpGate_And
+ | NAND # NInpGate_Nand
+ | OR # NInpGate_Or
+ | NOR # NInpGate_Nor
+ | XOR # NInpGate_Xor
+ | XNOR # NInpGate_Xnor
+ ;
+
+n_output_gatetype
+ : BUF # NOutGate_Buf
+ | NOT # NOutGate_Not
+ ;
+
+pass_en_switchtype
+ : TRANIF0 # PassEnSwitch_Tranif0
+ | TRANIF1 # PassEnSwitch_Tranif1
+ | RTRANIF1 # PassEnSwitch_RTranif1
+ | RTRANIF0 # PassEnSwitch_RTranif0
+ ;
+
+pass_switchtype
+ : TRAN # PassSwitch_Tran
+ | RTRAN # PassSwitch_RTran
+ ;
+
+module_instantiation : identifier ( parameter_value_assignment )?
+ hierarchical_instance ( COMMA hierarchical_instance )* SEMICOLUMN ;
+
+parameter_value_assignment : POUND (OPEN_PARENS list_of_parameter_assignments? CLOSE_PARENS)
+ | Pound_delay
+ | POUND Simple_identifier
+ ;
+
+list_of_parameter_assignments
+ : ordered_parameter_assignment ( COMMA ordered_parameter_assignment )*
+ | named_parameter_assignment ( COMMA named_parameter_assignment )*
+ ;
+
+ordered_parameter_assignment : param_expression ;
+
+
+named_parameter_assignment : DOT identifier OPEN_PARENS ( param_expression )? CLOSE_PARENS ;
+
+
+hierarchical_instance : name_of_instance OPEN_PARENS list_of_port_connections CLOSE_PARENS ;
+
+
+name_of_instance : identifier ( unpacked_dimension )* ;
+
+
+list_of_port_connections
+ : ordered_port_connection ( COMMA ordered_port_connection )*
+ | named_port_connection ( COMMA named_port_connection )*
+ ;
+
+
+ordered_port_connection : ( attribute_instance )* ( expression )? ;
+
+
+named_port_connection
+ : ( attribute_instance )* ( DOT identifier ( OPEN_PARENS ( expression )? CLOSE_PARENS )?
+ | DOTSTAR )
+ ;
+
+interface_instantiation : interface_identifier ( parameter_value_assignment )?
+ hierarchical_instance ( COMMA hierarchical_instance )* SEMICOLUMN ;
+
+program_instantiation : identifier ( parameter_value_assignment )?
+ hierarchical_instance ( COMMA hierarchical_instance )* SEMICOLUMN ;
+
+checker_instantiation :
+ ps_identifier name_of_instance OPEN_PARENS list_of_checker_port_connections CLOSE_PARENS ;
+
+list_of_checker_port_connections
+ : ordered_checker_port_connection ( COMMA ordered_checker_port_connection )?
+ | named_checker_port_connection ( COMMA named_checker_port_connection )?
+ ;
+
+ordered_checker_port_connection :
+ ( attribute_instance )* property_actual_arg? ;
+
+named_checker_port_connection
+ : ( attribute_instance )* ( DOT identifier ( OPEN_PARENS property_actual_arg? CLOSE_PARENS )?
+ | DOTSTAR )
+ ;
+
+endgenerate : ENDGENERATE ;
+
+generated_module_instantiation : GENERATE ( generate_module_item )* endgenerate ;
+
+
+generate_module_item
+ : generate_module_conditional_statement
+ | generate_module_case_statement
+ | generate_module_loop_statement
+ | ( identifier COLUMN )?
+ generate_module_block
+ | module_or_generate_item
+ ;
+
+
+generate_module_conditional_statement :
+ IF OPEN_PARENS constant_expression CLOSE_PARENS generate_module_item
+ ( ELSE generate_module_item )? ;
+
+
+generate_module_case_statement :
+CASE OPEN_PARENS constant_expression CLOSE_PARENS genvar_module_case_item
+ ( genvar_module_case_item )* endcase ;
+
+
+genvar_module_case_item
+ : constant_expression ( COMMA constant_expression )* COLUMN generate_module_item
+
+ | DEFAULT ( COLUMN )? generate_module_item
+
+ ;
+
+
+generate_module_loop_statement :
+ FOR OPEN_PARENS genvar_decl_assignment SEMICOLUMN constant_expression
+ SEMICOLUMN genvar_assignment CLOSE_PARENS
+ generate_module_named_block ;
+
+
+genvar_assignment
+ : identifier assignment_operator constant_expression
+ | inc_or_dec_operator identifier
+ | identifier inc_or_dec_operator
+ ;
+
+
+genvar_decl_assignment :
+ ( GENVAR )? identifier ASSIGN_OP constant_expression ;
+
+
+generate_module_named_block
+ : BEGIN COLUMN identifier ( generate_module_item )*
+ end ( COLUMN identifier )?
+ | identifier COLUMN generate_module_block
+ ;
+
+
+generate_module_block :
+ BEGIN ( COLUMN identifier )? ( generate_module_item )* end ( COLUMN identifier )? ;
+
+
+
+generated_interface_instantiation : GENERATE ( generate_interface_item )* endgenerate ;
+
+
+generate_interface_item
+ : generate_interface_conditional_statement
+ | generate_interface_case_statement
+ | generate_interface_loop_statement
+ | ( identifier COLUMN ) generate_interface_block
+
+ | interface_or_generate_item
+ ;
+
+
+generate_interface_conditional_statement :
+ IF OPEN_PARENS constant_expression CLOSE_PARENS generate_interface_item ( ELSE generate_interface_item )? ;
+
+
+generate_interface_case_statement :
+ CASE OPEN_PARENS constant_expression CLOSE_PARENS
+ genvar_interface_case_item ( genvar_interface_case_item )* endcase ;
+
+
+genvar_interface_case_item
+ : constant_expression ( COMMA constant_expression )* COLUMN generate_interface_item
+
+ | DEFAULT ( COLUMN )? generate_interface_item
+ ;
+
+
+generate_interface_loop_statement :
+ FOR OPEN_PARENS genvar_decl_assignment SEMICOLUMN constant_expression
+ SEMICOLUMN genvar_assignment CLOSE_PARENS
+ generate_interface_named_block ;
+
+
+generate_interface_named_block
+ : BEGIN COLUMN identifier ( generate_interface_item )* end
+ ( COLUMN identifier )?
+ | identifier COLUMN generate_interface_block
+
+ ;
+
+
+generate_interface_block :
+ BEGIN ( COLUMN identifier )?
+ ( generate_interface_item )*
+ end ( COLUMN identifier )? ;
+
+generate_region :
+ GENERATE generate_item* endgenerate;
+
+loop_generate_construct :
+ FOR OPEN_PARENS genvar_initialization SEMICOLUMN constant_expression SEMICOLUMN genvar_iteration CLOSE_PARENS generate_block ;
+
+genvar_initialization :
+ GENVAR? identifier ASSIGN_OP constant_expression ;
+
+genvar_iteration
+ : identifier assignment_operator constant_expression
+ | inc_or_dec_operator identifier
+ | identifier inc_or_dec_operator
+ ;
+
+conditional_generate_construct
+ : if_generate_construct
+ | case_generate_construct
+ ;
+
+if_generate_construct :
+ IF OPEN_PARENS constant_expression CLOSE_PARENS generate_block ( ELSE generate_block )? ;
+
+case_generate_construct :
+ CASE OPEN_PARENS constant_expression CLOSE_PARENS case_generate_item case_generate_item* endcase ;
+
+case_generate_item
+ : constant_expression ( COMMA constant_expression )* COLUMN generate_block
+ | DEFAULT ( COLUMN )? generate_block
+ ;
+
+generate_block
+ : generate_item
+ | ( identifier COLUMN )? BEGIN ( COLUMN identifier )? generate_item* end
+ ( COLUMN identifier )?
+ ;
+
+generate_item
+ : module_or_generate_item
+ | interface_or_generate_item
+ | checker_or_generate_item
+ ;
+
+udp_nonansi_declaration : ( attribute_instance )* PRIMITIVE identifier
+ OPEN_PARENS udp_port_list CLOSE_PARENS SEMICOLUMN ;
+
+udp_ansi_declaration : ( attribute_instance )* PRIMITIVE identifier
+ OPEN_PARENS udp_declaration_port_list CLOSE_PARENS SEMICOLUMN ;
+
+endprimitive : ENDPRIMITIVE ;
+
+udp_declaration
+ : udp_nonansi_declaration udp_port_declaration ( udp_port_declaration )*
+ udp_body
+ endprimitive ( COLUMN identifier )?
+ | udp_ansi_declaration
+ udp_body
+ endprimitive ( COLUMN identifier )?
+ | EXTERN udp_nonansi_declaration
+ | EXTERN udp_ansi_declaration
+ | ( attribute_instance )* PRIMITIVE identifier OPEN_PARENS DOTSTAR
+ CLOSE_PARENS SEMICOLUMN
+ ( udp_port_declaration )*
+ udp_body
+ endprimitive ( COLUMN identifier )?
+ ;
+
+udp_port_list : identifier COMMA identifier ( COMMA identifier )* ;
+
+udp_declaration_port_list : udp_output_declaration COMMA
+ udp_input_declaration ( COMMA udp_input_declaration )* ;
+
+udp_port_declaration
+ : udp_output_declaration SEMICOLUMN
+ | udp_input_declaration SEMICOLUMN
+ | udp_reg_declaration SEMICOLUMN
+ ;
+
+udp_output_declaration
+ : ( attribute_instance )* ( OUTPUT identifier
+ | OUTPUT REG identifier ( ASSIGN_OP constant_expression )?)
+ ;
+
+udp_input_declaration : ( attribute_instance )* INPUT identifier_list ;
+
+udp_reg_declaration : ( attribute_instance )* REG identifier ;
+
+udp_body
+ : combinational_body
+ | sequential_body
+ ;
+
+endtable : ENDTABLE ;
+
+combinational_body : TABLE combinational_entry ( combinational_entry )* endtable ;
+
+combinational_entry : level_input_list COLUMN output_symbol SEMICOLUMN ;
+
+sequential_body : ( udp_initial_statement )? TABLE sequential_entry
+ ( sequential_entry )* endtable ;
+
+udp_initial_statement : INITIAL identifier ASSIGN_OP init_val SEMICOLUMN ;
+
+
+init_val
+ : ONE_TICK_b0 # InitVal_1Tickb0
+ | ONE_TICK_b1 # InitVal_1Tickb1
+ | ONE_TICK_B0 # InitVal_1TickB0
+ | ONE_TICK_B1 # InitVal_1TickB1
+ | ONE_TICK_bx # InitVal_1Tickbx
+ | ONE_TICK_bX # InitVal_1TickbX
+ | ONE_TICK_Bx # InitVal_1TickBx
+ | ONE_TICK_BX # InitVal_1TickBX
+ | Integral_number # InitVal_Integral
+ ;
+
+
+sequential_entry : seq_input_list COLUMN level_symbol COLUMN next_state SEMICOLUMN ;
+
+
+seq_input_list
+ : level_input_list
+ | edge_input_list
+ ;
+
+
+level_input_list : level_symbol ( level_symbol )* ;
+
+
+edge_input_list : ( level_symbol )* edge_indicator ( level_symbol )* ;
+
+
+edge_indicator
+ : OPEN_PARENS /* Will have to check post parse time that there are 2 items (10 becomes one int): */
+ level_symbol+ CLOSE_PARENS
+ | edge_symbol
+ ;
+
+next_state
+ : output_symbol
+ | MINUS
+ ;
+
+output_symbol : Integral_number | Simple_identifier ;
+
+level_symbol : Integral_number | Simple_identifier | QMARK ;
+
+edge_symbol : Simple_identifier | STAR ;
+
+udp_instantiation : identifier ( drive_strength )? ( delay2 )?
+ udp_instance ( COMMA udp_instance )* SEMICOLUMN ;
+
+udp_instance : ( name_of_instance )? OPEN_PARENS net_lvalue COMMA
+ expression ( COMMA expression )* CLOSE_PARENS ;
+
+continuous_assign
+ : ASSIGN ( drive_strength )? ( delay3 )? list_of_net_assignments SEMICOLUMN
+
+ | ASSIGN_OP ( delay_control )? list_of_variable_assignments SEMICOLUMN
+
+ ;
+
+list_of_net_assignments : net_assignment ( COMMA net_assignment )* ;
+
+list_of_variable_assignments : variable_assignment ( COMMA variable_assignment )* ;
+
+net_alias : ALIAS net_lvalue (ASSIGN_OP net_lvalue)+ SEMICOLUMN ;
+
+net_assignment : net_lvalue ASSIGN_OP expression ;
+
+initial_construct : INITIAL statement_or_null ;
+
+always_construct : always_keyword statement ;
+
+always_keyword
+ : ALWAYS # AlwaysKeywd_Always
+ | ALWAYS_COMB # AlwaysKeywd_Comb
+ | ALWAYS_LATCH # AlwaysKeywd_Latch
+ | ALWAYS_FF # AlwaysKeywd_FF
+ ;
+
+blocking_assignment
+ : variable_lvalue ASSIGN_OP delay_or_event_control expression
+ | nonrange_variable_lvalue ASSIGN_OP dynamic_array_new
+
+ | ( implicit_class_handle DOT | class_scope | package_scope )? hierarchical_identifier
+ select ASSIGN_OP class_new
+ | operator_assignment
+ ;
+
+operator_assignment : variable_lvalue assignment_operator expression ;
+
+assignment_operator
+ : ASSIGN_OP # AssignOp_Assign
+ | ADD_ASSIGN # AssignOp_Add
+ | SUB_ASSIGN # AssignOp_Sub
+ | MULT_ASSIGN # AssignOp_Mult
+ | DIV_ASSIGN # AssignOp_Div
+ | MODULO_ASSIGN # AssignOp_Modulo
+ | BITW_AND_ASSIGN # AssignOp_BitwAnd
+ | BITW_OR_ASSIGN # AssignOp_BitwOr
+ | BITW_XOR_ASSIGN # AssignOp_BitwXor
+ | BITW_LEFT_SHIFT_ASSIGN # AssignOp_BitwLeftShift
+ | BITW_RIGHT_SHIFT_ASSIGN # AssignOp_BitwRightShift
+ | ARITH_SHIFT_LEFT_ASSIGN # AssignOp_ArithShiftLeft
+ | ARITH_SHIFT_RIGHT_ASSIGN # AssignOp_ArithShiftRight
+ ;
+
+nonblocking_assignment : variable_lvalue LESS_EQUAL ( delay_or_event_control )? expression ;
+
+procedural_continuous_assignment
+ : ASSIGN variable_assignment
+ | DEASSIGN variable_lvalue
+ | FORCE variable_assignment
+ | FORCE net_assignment
+ | RELEASE variable_lvalue
+ | RELEASE net_lvalue
+ ;
+
+variable_assignment : variable_lvalue ASSIGN_OP expression ;
+
+action_block
+ : statement_or_null
+ | ( statement )? ELSE statement_or_null
+ ;
+
+
+seq_block :
+ BEGIN ( COLUMN identifier )? ( block_item_declaration )* ( statement_or_null )*
+ end ( COLUMN identifier )? ;
+
+
+par_block :
+ FORK ( COLUMN identifier )? ( block_item_declaration )* ( statement_or_null )*
+ (join_keyword | join_any_keyword | join_none_keyword ) ( COLUMN identifier )? ;
+
+
+join_keyword : JOIN ;
+
+join_any_keyword : JOIN_ANY ;
+
+join_none_keyword : JOIN_NONE ;
+
+statement_or_null
+ : statement
+ | ( attribute_instance )* SEMICOLUMN
+ ;
+
+statement : ( identifier COLUMN )? ( attribute_instance )* statement_item ;
+
+statement_item
+ : blocking_assignment SEMICOLUMN
+ | nonblocking_assignment SEMICOLUMN
+ | procedural_continuous_assignment SEMICOLUMN
+ | case_statement
+ | conditional_statement
+ | inc_or_dec_expression SEMICOLUMN
+ | subroutine_call_statement
+ | disable_statement
+ | event_trigger
+ | loop_statement
+ | jump_statement
+ | par_block
+ | procedural_timing_control_statement
+ | seq_block
+ | wait_statement
+ | procedural_assertion_statement
+ | clocking_drive SEMICOLUMN
+ | randsequence_statement
+ | randcase_statement
+ | expect_property_statement
+ | system_task
+ | surelog_macro_not_defined
+ ;
+
+function_statement_or_null
+ : statement
+ | ( attribute_instance )* SEMICOLUMN
+ ;
+
+procedural_timing_control_statement :
+ procedural_timing_control statement_or_null ;
+
+
+delay_or_event_control
+ : delay_control
+ | event_control
+ | REPEAT OPEN_PARENS expression CLOSE_PARENS
+ event_control
+ ;
+
+
+delay_control
+ : pound_delay_value
+ | POUND OPEN_PARENS mintypmax_expression CLOSE_PARENS
+ ;
+
+
+event_control
+ : AT hierarchical_identifier
+ | AT OPEN_PARENS event_expression CLOSE_PARENS
+ | ATSTAR
+ | AT_PARENS_STAR
+ | AT ps_or_hierarchical_sequence_identifier
+ ;
+
+
+event_expression
+ : ( edge_identifier )? expression ( IFF expression )?
+ | sequence_instance ( IFF expression )?
+ | event_expression OR event_expression
+ | event_expression COMMA event_expression
+ | OPEN_PARENS event_expression CLOSE_PARENS
+ ;
+
+
+procedural_timing_control
+ : delay_control
+ | event_control
+ | cycle_delay
+ ;
+
+
+jump_statement
+ : RETURN ( expression )? SEMICOLUMN
+ | BREAK SEMICOLUMN
+ | CONTINUE SEMICOLUMN
+ ;
+
+
+ final_construct : FINAL statement ;
+
+
+wait_statement
+ : WAIT OPEN_PARENS expression CLOSE_PARENS statement_or_null
+ | WAIT FORK SEMICOLUMN
+ | WAIT_ORDER OPEN_PARENS ( dollar_root_keyword )? identifier (( OPEN_BRACKET constant_expression CLOSE_BRACKET )* DOT identifier)*
+ ( COMMA ( dollar_root_keyword )? identifier (( OPEN_BRACKET constant_expression CLOSE_BRACKET )* DOT identifier)* )? CLOSE_PARENS action_block
+ ;
+
+
+event_trigger
+ : IMPLY hierarchical_identifier SEMICOLUMN
+ | NON_BLOCKING_TRIGGER_EVENT_OP ( delay_or_event_control )?
+ hierarchical_identifier SEMICOLUMN
+ ;
+
+
+disable_statement
+ : DISABLE hierarchical_identifier SEMICOLUMN
+ | DISABLE FORK SEMICOLUMN
+ ;
+
+
+conditional_statement :
+ ( unique_priority )? IF OPEN_PARENS cond_predicate CLOSE_PARENS statement_or_null
+ ( ELSE IF OPEN_PARENS cond_predicate CLOSE_PARENS statement_or_null )*
+ ( ELSE statement_or_null )* ;
+
+
+unique_priority : UNIQUE | UNIQUE0 | PRIORITY ;
+
+
+cond_predicate :
+ expression_or_cond_pattern ( COND_PRED_OP expression_or_cond_pattern )* ;
+
+
+expression_or_cond_pattern
+ : expression
+ | expression MATCHES pattern
+ ;
+
+case_statement
+ : ( unique_priority )? case_keyword OPEN_PARENS expression
+ CLOSE_PARENS case_item ( case_item )* endcase
+ | ( unique_priority )? case_keyword OPEN_PARENS expression
+ CLOSE_PARENS MATCHES case_pattern_item ( case_pattern_item )*
+ endcase
+ | ( unique_priority )? case_keyword OPEN_PARENS expression
+ CLOSE_PARENS INSIDE case_inside_item ( case_inside_item )*
+ endcase
+ ;
+
+
+case_keyword
+ : CASE # CaseKeyword_Case
+ | CASEZ # CaseKeyword_CaseZ
+ | CASEX # CaseKeyword_CaseX
+ ;
+
+case_item
+ : expression ( COMMA expression )* COLUMN statement_or_null
+ | DEFAULT ( COLUMN )? statement_or_null
+ ;
+
+case_pattern_item
+ : pattern ( COND_PRED_OP expression )? COLUMN statement_or_null
+ | DEFAULT ( COLUMN )? statement_or_null
+ ;
+
+case_inside_item
+ : open_range_list COLUMN statement_or_null
+ | DEFAULT ( COLUMN )? statement_or_null
+ ;
+
+randcase_statement :
+ RANDCASE randcase_item ( randcase_item )* endcase ;
+
+randcase_item : expression COLUMN statement_or_null ;
+
+
+pattern
+ : DOT identifier
+ | DOTSTAR
+ | constant_expression
+ | TAGGED identifier ( pattern )?
+ | TICK OPEN_CURLY pattern ( COMMA pattern )* CLOSE_CURLY
+ | TICK OPEN_CURLY identifier COLUMN pattern ( COMMA identifier COLUMN pattern )* CLOSE_CURLY
+ ;
+
+assignment_pattern :
+ TICK OPEN_CURLY expression ( COMMA expression )* CLOSE_CURLY
+ | TICK OPEN_CURLY structure_pattern_key COLUMN expression ( COMMA structure_pattern_key COLUMN expression )* CLOSE_CURLY
+ | TICK OPEN_CURLY array_pattern_key COLUMN expression ( COMMA array_pattern_key COLUMN expression )* CLOSE_CURLY
+ // | TICK OPEN_CURLY constant_expression OPEN_CURLY expression ( COMMA expression )* CLOSE_CURLY CLOSE_CURLY
+ | TICK OPEN_CURLY constant_expression OPEN_CURLY expression ( (CLOSE_CURLY ( COMMA expression )*) | (( COMMA expression )* CLOSE_CURLY)) CLOSE_CURLY
+ | TICK OPEN_CURLY CLOSE_CURLY
+ ;
+
+structure_pattern_key : identifier
+ | assignment_pattern_key
+ ;
+
+array_pattern_key
+ : constant_expression
+ | assignment_pattern_key
+ ;
+
+assignment_pattern_key
+ : simple_type
+ | DEFAULT
+ ;
+
+assignment_pattern_expression
+ : ( assignment_pattern_expression_type )? assignment_pattern;
+
+assignment_pattern_expression_type
+ : ps_type_identifier
+ | ps_identifier
+ | integer_atom_type
+ | type_reference
+ ;
+
+constant_assignment_pattern_expression :
+ assignment_pattern_expression ;
+
+assignment_pattern_net_lvalue :
+ TICK OPEN_CURLY net_lvalue ( COMMA net_lvalue )* CLOSE_CURLY;
+
+assignment_pattern_variable_lvalue :
+ TICK OPEN_CURLY variable_lvalue ( COMMA variable_lvalue )* CLOSE_CURLY
+ ;
+
+forever_keyword : FOREVER;
+
+repeat_keyword : REPEAT;
+
+while_keyword : WHILE ;
+
+loop_statement
+ : forever_keyword statement_or_null
+ | (repeat_keyword | while_keyword) OPEN_PARENS expression CLOSE_PARENS statement_or_null
+ | FOR OPEN_PARENS for_initialization? SEMICOLUMN expression? SEMICOLUMN
+ for_step? CLOSE_PARENS statement_or_null
+ | DO statement_or_null WHILE OPEN_PARENS expression CLOSE_PARENS SEMICOLUMN
+ | FOREACH OPEN_PARENS ps_or_hierarchical_array_identifier OPEN_BRACKET loop_variables
+ CLOSE_BRACKET CLOSE_PARENS statement
+ ;
+
+
+for_initialization
+ : list_of_variable_assignments
+ | for_variable_declaration ( COMMA for_variable_declaration )*
+ ;
+
+for_variable_declaration :
+ VAR? data_type identifier ASSIGN_OP expression ( COMMA identifier ASSIGN_OP expression )* ;
+
+for_step : for_step_assignment ( COMMA for_step_assignment )* ;
+
+for_step_assignment
+ : operator_assignment
+ | inc_or_dec_expression
+ | subroutine_call
+ ;
+
+loop_variables : ( identifier )? ( COMMA ( identifier )? )* ;
+
+subroutine_call_statement
+ : subroutine_call SEMICOLUMN
+ | VOID TICK OPEN_PARENS subroutine_call CLOSE_PARENS SEMICOLUMN
+ ;
+
+
+assertion_item
+ : concurrent_assertion_item
+ | deferred_immediate_assertion_item
+ ;
+
+deferred_immediate_assertion_item :
+ ( identifier COLUMN )? deferred_immediate_assertion_statement ;
+
+procedural_assertion_statement
+ : concurrent_assertion_statement
+ | immediate_assertion_statement
+ | checker_instantiation
+ ;
+
+immediate_assertion_statement
+ : simple_immediate_assertion_statement
+ | deferred_immediate_assertion_statement
+ ;
+
+simple_immediate_assertion_statement
+ : simple_immediate_assert_statement
+ | simple_immediate_assume_statement
+ | simple_immediate_cover_statement
+ ;
+
+simple_immediate_assert_statement :
+ ASSERT OPEN_PARENS expression CLOSE_PARENS action_block ;
+
+simple_immediate_assume_statement :
+ ASSUME OPEN_PARENS expression CLOSE_PARENS action_block ;
+
+simple_immediate_cover_statement :
+ COVER OPEN_PARENS expression CLOSE_PARENS statement_or_null ;
+
+deferred_immediate_assertion_statement
+ : deferred_immediate_assert_statement
+ | deferred_immediate_assume_statement
+ | deferred_immediate_cover_statement
+ ;
+
+deferred_immediate_assert_statement
+ : ASSERT Pound_delay OPEN_PARENS expression CLOSE_PARENS action_block
+ | ASSERT FINAL ( expression ) action_block
+ ;
+
+deferred_immediate_assume_statement
+ : ASSUME Pound_delay OPEN_PARENS expression CLOSE_PARENS action_block
+ | ASSUME FINAL OPEN_PARENS expression CLOSE_PARENS action_block
+ ;
+
+deferred_immediate_cover_statement
+ : COVER Pound_delay OPEN_PARENS expression CLOSE_PARENS statement_or_null
+ | COVER FINAL OPEN_PARENS expression CLOSE_PARENS statement_or_null
+ ;
+
+endclocking : ENDCLOCKING;
+
+clocking_declaration : ( DEFAULT )? CLOCKING ( identifier )? clocking_event SEMICOLUMN
+ ( clocking_item )* endclocking ( COLUMN identifier )?
+ | GLOBAL CLOCKING identifier? clocking_event SEMICOLUMN endclocking ( COLUMN identifier )?
+ ;
+
+clocking_event
+ : AT identifier
+ | AT OPEN_PARENS event_expression CLOSE_PARENS
+ ;
+
+clocking_item
+ : DEFAULT default_skew SEMICOLUMN
+ | clocking_direction list_of_clocking_decl_assign SEMICOLUMN
+ | ( attribute_instance )* concurrent_assertion_item_declaration
+ ;
+
+default_skew
+ : INPUT clocking_skew # DefaultSkew_Intput
+ | OUTPUT clocking_skew # DefaultSkew_Output
+ | INPUT clocking_skew OUTPUT clocking_skew # DefaultSkew_IntputOutput
+ ;
+
+clocking_direction
+ : INPUT ( clocking_skew )? # ClockingDir_Input
+ | OUTPUT ( clocking_skew )? # ClockingDir_Output
+ | INPUT ( clocking_skew )? OUTPUT ( clocking_skew )? # ClockingDir_InputOutput
+ | INOUT # ClockingDir_Inout
+ ;
+
+list_of_clocking_decl_assign : clocking_decl_assign ( COMMA clocking_decl_assign )* ;
+
+clocking_decl_assign : identifier ( ASSIGN_OP ( dollar_root_keyword )? identifier (( OPEN_BRACKET constant_expression CLOSE_BRACKET )* DOT identifier)* )? ;
+
+clocking_skew
+ : edge_identifier ( delay_control )?
+ | delay_control
+ ;
+
+
+edge_identifier :
+ POSEDGE # Edge_Posedge
+ | NEGEDGE # Edge_Negedge
+ | EDGE # Edge_Edge
+ ;
+
+
+clocking_drive
+ : clockvar_expression LESS_EQUAL ( cycle_delay )? expression
+
+ | cycle_delay clockvar_expression LESS_EQUAL expression
+
+ ;
+
+cycle_delay
+ : POUNDPOUND Integral_number
+ | POUNDPOUND identifier
+ | POUNDPOUND OPEN_PARENS expression CLOSE_PARENS
+ ;
+
+clockvar : ( dollar_root_keyword )? identifier (( OPEN_BRACKET constant_expression CLOSE_BRACKET )* DOT identifier)* ;
+
+clockvar_expression : clockvar select ;
+
+randsequence_statement : RANDSEQUENCE OPEN_PARENS ( identifier )? CLOSE_PARENS
+ production ( production )*
+ endsequence ;
+
+
+production : ( function_data_type )? identifier ( OPEN_PARENS tf_port_list
+ CLOSE_PARENS )? COLUMN rs_rule ( BITW_OR rs_rule )* SEMICOLUMN ;
+
+
+rs_rule : rs_production_list ( ASSIGN_VALUE expression ( rs_code_block )? )? ;
+
+
+rs_production_list
+ : rs_prod ( rs_prod )*
+ | RAND JOIN ( OPEN_PARENS expression CLOSE_PARENS )? production_item
+ production_item ( production_item )*
+ ;
+
+
+rs_code_block : OPEN_CURLY ( data_declaration )* ( statement_or_null )*
+ CLOSE_CURLY ;
+
+rs_prod
+ : production_item
+ | rs_code_block
+ | rs_if_else
+ | rs_repeat
+ | rs_case
+ ;
+
+production_item : identifier ( OPEN_PARENS list_of_arguments CLOSE_PARENS )? ;
+
+rs_if_else : IF OPEN_PARENS expression CLOSE_PARENS production_item ( ELSE production_item )? ;
+
+rs_repeat : REPEAT OPEN_PARENS expression CLOSE_PARENS production_item ;
+
+rs_case : CASE OPEN_PARENS expression CLOSE_PARENS rs_case_item ( rs_case_item )* endcase ;
+
+rs_case_item
+ : expression ( COMMA expression )* COLUMN production_item
+ | DEFAULT ( COLUMN )? production_item
+ ;
+
+endspecify : ENDSPECIFY ;
+
+specify_block : SPECIFY ( specify_item )* endspecify ;
+
+specify_item
+ : specparam_declaration
+ | pulsestyle_declaration
+ | showcancelled_declaration
+ | path_declaration
+ | system_timing_check
+ ;
+
+
+pulsestyle_declaration
+ : PULSESTYLE_ONEVENT list_of_path_outputs SEMICOLUMN
+ | PULSESTYLE_ONDETECT list_of_path_outputs SEMICOLUMN
+ ;
+
+
+showcancelled_declaration
+ : SHOWCANCELLED list_of_path_outputs SEMICOLUMN
+ | NOSHOWCANCELLED list_of_path_outputs SEMICOLUMN
+ ;
+
+
+
+path_declaration
+ : simple_path_declaration SEMICOLUMN
+ | edge_sensitive_path_declaration SEMICOLUMN
+ | state_dependent_path_declaration SEMICOLUMN
+ ;
+
+
+simple_path_declaration
+ : parallel_path_description ASSIGN_OP path_delay_value
+ | full_path_description ASSIGN_OP path_delay_value
+ ;
+
+
+parallel_path_description :
+ OPEN_PARENS specify_input_terminal_descriptor ( PLUS | MINUS )? TRANSITION_OP
+ specify_output_terminal_descriptor CLOSE_PARENS ;
+
+
+full_path_description :
+ OPEN_PARENS list_of_path_inputs ( PLUS | MINUS )? FULL_CONN_OP
+ list_of_path_outputs CLOSE_PARENS ;
+
+
+list_of_path_inputs : specify_input_terminal_descriptor
+ ( COMMA specify_input_terminal_descriptor )* ;
+
+
+list_of_path_outputs : specify_output_terminal_descriptor
+ ( COMMA specify_output_terminal_descriptor )* ;
+
+specify_input_terminal_descriptor :
+ ( identifier | interface_identifier DOT identifier ) ( OPEN_BRACKET constant_range_expression CLOSE_BRACKET )? ;
+
+
+specify_output_terminal_descriptor :
+ ( identifier | interface_identifier DOT identifier ) ( OPEN_BRACKET constant_range_expression CLOSE_BRACKET )? ;
+
+path_delay_value
+ : list_of_path_delay_expressions
+ | OPEN_PARENS list_of_path_delay_expressions CLOSE_PARENS
+ ;
+
+
+list_of_path_delay_expressions
+ : t_path_delay_expression
+ | trise_path_delay_expression COMMA tfall_path_delay_expression
+ | trise_path_delay_expression COMMA tfall_path_delay_expression COMMA tz_path_delay_expression
+ | t01_path_delay_expression COMMA t10_path_delay_expression COMMA t0z_path_delay_expression COMMA
+ tz1_path_delay_expression COMMA t1z_path_delay_expression COMMA tz0_path_delay_expression
+ | t01_path_delay_expression COMMA t10_path_delay_expression COMMA t0z_path_delay_expression COMMA
+ tz1_path_delay_expression COMMA t1z_path_delay_expression COMMA tz0_path_delay_expression COMMA
+ t0x_path_delay_expression COMMA tx1_path_delay_expression COMMA t1x_path_delay_expression COMMA
+ tx0_path_delay_expression COMMA txz_path_delay_expression COMMA tzx_path_delay_expression
+ ;
+
+t_path_delay_expression : path_delay_expression ;
+trise_path_delay_expression : path_delay_expression ;
+tfall_path_delay_expression : path_delay_expression ;
+tz_path_delay_expression : path_delay_expression ;
+t01_path_delay_expression : path_delay_expression ;
+t10_path_delay_expression : path_delay_expression ;
+t0z_path_delay_expression : path_delay_expression ;
+tz1_path_delay_expression : path_delay_expression ;
+t1z_path_delay_expression : path_delay_expression ;
+tz0_path_delay_expression : path_delay_expression ;
+t0x_path_delay_expression : path_delay_expression ;
+tx1_path_delay_expression : path_delay_expression ;
+t1x_path_delay_expression : path_delay_expression ;
+tx0_path_delay_expression : path_delay_expression ;
+txz_path_delay_expression : path_delay_expression ;
+tzx_path_delay_expression : path_delay_expression ;
+path_delay_expression : constant_mintypmax_expression ;
+
+
+edge_sensitive_path_declaration
+ : parallel_edge_sensitive_path_description ASSIGN_OP path_delay_value
+ | full_edge_sensitive_path_description ASSIGN_OP path_delay_value
+ ;
+
+parallel_edge_sensitive_path_description :
+ OPEN_PARENS ( edge_identifier )? specify_input_terminal_descriptor TRANSITION_OP
+ OPEN_PARENS specify_output_terminal_descriptor ( INC_PART_SELECT_OP | DEC_PART_SELECT_OP | COLUMN )
+ expression CLOSE_PARENS CLOSE_PARENS ;
+
+
+full_edge_sensitive_path_description :
+ OPEN_PARENS ( edge_identifier )? list_of_path_inputs FULL_CONN_OP
+ OPEN_PARENS list_of_path_outputs ( INC_PART_SELECT_OP | DEC_PART_SELECT_OP | COLUMN )
+ expression CLOSE_PARENS CLOSE_PARENS ;
+
+state_dependent_path_declaration
+ : IF OPEN_PARENS module_path_expression CLOSE_PARENS simple_path_declaration
+ | IF OPEN_PARENS module_path_expression CLOSE_PARENS edge_sensitive_path_declaration
+ | IFNONE simple_path_declaration
+ ;
+
+system_timing_check
+ : dollar_setup_timing_check
+ | dollar_hold_timing_check
+ | dollar_setuphold_timing_check
+ | dollar_recovery_timing_check
+ | dollar_removal_timing_check
+ | dollar_recrem_timing_check
+ | dollar_skew_timing_check
+ | dollar_timeskew_timing_check
+ | dollar_fullskew_timing_check
+ | dollar_period_timing_check
+ | dollar_width_timing_check
+ | dollar_nochange_timing_check
+ ;
+
+
+dollar_setup_timing_check :
+ DOLLAR Simple_identifier OPEN_PARENS timing_check_event COMMA reference_event COMMA
+ timing_check_limit ( COMMA ( notifier )? )? CLOSE_PARENS SEMICOLUMN ;
+
+
+dollar_hold_timing_check :
+ DOLLAR Simple_identifier OPEN_PARENS reference_event COMMA timing_check_event COMMA
+ timing_check_limit ( COMMA ( notifier )? )? CLOSE_PARENS SEMICOLUMN ;
+
+
+dollar_setuphold_timing_check :
+ DOLLAR Simple_identifier OPEN_PARENS reference_event COMMA timing_check_event COMMA timing_check_limit COMMA timing_check_limit
+ ( COMMA ( notifier )? ( COMMA ( stamptime_condition )? ( COMMA ( mintypmax_expression )?
+ ( COMMA ( delayed_reference )? ( COMMA ( delayed_data )? )? )? )? )? )? CLOSE_PARENS SEMICOLUMN ;
+
+
+dollar_recovery_timing_check :
+ DOLLAR Simple_identifier OPEN_PARENS reference_event COMMA timing_check_event COMMA
+ timing_check_limit ( COMMA ( notifier )? )? CLOSE_PARENS SEMICOLUMN ;
+
+
+dollar_removal_timing_check :
+ DOLLAR Simple_identifier OPEN_PARENS reference_event COMMA timing_check_event COMMA
+ timing_check_limit ( COMMA ( notifier )? )? CLOSE_PARENS SEMICOLUMN ;
+
+
+dollar_recrem_timing_check :
+ DOLLAR Simple_identifier OPEN_PARENS reference_event COMMA timing_check_event COMMA timing_check_limit COMMA timing_check_limit
+ ( COMMA ( notifier )? ( COMMA ( stamptime_condition )? ( COMMA ( mintypmax_expression )?
+ ( COMMA ( delayed_reference )? ( COMMA ( delayed_data )? )? )? )? )? )? CLOSE_PARENS SEMICOLUMN ;
+
+
+dollar_skew_timing_check :
+ DOLLAR Simple_identifier OPEN_PARENS reference_event COMMA timing_check_event COMMA
+ timing_check_limit ( COMMA ( notifier )? )? CLOSE_PARENS SEMICOLUMN ;
+
+
+dollar_timeskew_timing_check :
+ DOLLAR Simple_identifier OPEN_PARENS reference_event COMMA timing_check_event COMMA timing_check_limit
+ ( COMMA ( notifier )? ( COMMA ( event_based_flag )?
+ ( COMMA ( remain_active_flag )? )? )? )? CLOSE_PARENS SEMICOLUMN ;
+
+
+dollar_fullskew_timing_check :
+ DOLLAR Simple_identifier OPEN_PARENS reference_event COMMA timing_check_event
+ COMMA timing_check_limit COMMA timing_check_limit
+ ( COMMA ( notifier )? ( COMMA ( event_based_flag )?
+ ( COMMA ( remain_active_flag )? )? )? )? CLOSE_PARENS SEMICOLUMN ;
+
+
+dollar_period_timing_check :
+ DOLLAR Simple_identifier OPEN_PARENS controlled_timing_check_event COMMA timing_check_limit
+ ( COMMA ( notifier )? )? CLOSE_PARENS SEMICOLUMN ;
+
+
+dollar_width_timing_check :
+ DOLLAR Simple_identifier OPEN_PARENS controlled_timing_check_event COMMA timing_check_limit
+ COMMA threshold ( COMMA ( notifier )? )? CLOSE_PARENS SEMICOLUMN ;
+
+
+dollar_nochange_timing_check :
+ DOLLAR Simple_identifier OPEN_PARENS reference_event COMMA timing_check_event COMMA start_edge_offset COMMA
+ end_edge_offset ( COMMA ( notifier )? )? CLOSE_PARENS SEMICOLUMN ;
+
+delayed_data
+ : identifier
+ | identifier OPEN_BRACKET constant_mintypmax_expression CLOSE_BRACKET
+ ;
+
+
+delayed_reference
+ : identifier
+ | identifier OPEN_BRACKET constant_mintypmax_expression CLOSE_BRACKET
+ ;
+
+end_edge_offset : mintypmax_expression ;
+
+event_based_flag : constant_expression ;
+
+notifier : identifier ;
+
+reference_event : timing_check_event ;
+
+remain_active_flag : constant_mintypmax_expression ;
+
+stamptime_condition : mintypmax_expression ;
+
+start_edge_offset : mintypmax_expression ;
+
+threshold : constant_expression ;
+
+timing_check_limit : expression ;
+
+timing_check_event :
+ (timing_check_event_control)? specify_terminal_descriptor ( COND_PRED_OP timing_check_condition )? ;
+
+
+controlled_timing_check_event :
+ timing_check_event_control specify_terminal_descriptor ( COND_PRED_OP timing_check_condition )? ;
+
+
+timing_check_event_control
+ : POSEDGE # TimingCheckEventControl_Posedge
+ | NEGEDGE # TimingCheckEventControl_Negedge
+ | edge_control_specifier # TimingCheckEventControl_Edge
+ ;
+
+
+specify_terminal_descriptor
+ : specify_input_terminal_descriptor
+ | specify_output_terminal_descriptor
+ ;
+
+edge_control_specifier : EDGE OPEN_BRACKET edge_descriptor ( COMMA edge_descriptor )* CLOSE_BRACKET ;
+
+edge_descriptor
+ : Integral_number
+ | Simple_identifier Integral_number
+ | Integral_number Simple_identifier
+// | Rising
+// | Falling
+// | Simple_identifier Zero_or_one
+// | Zero_or_one Simple_identifier
+ ;
+
+timing_check_condition
+ : scalar_timing_check_condition
+ | OPEN_PARENS scalar_timing_check_condition CLOSE_PARENS
+ ;
+
+scalar_timing_check_condition
+ : expression
+ | TILDA expression
+ | expression EQUIV scalar_constant
+
+ | expression FOUR_STATE_LOGIC_EQUAL scalar_constant
+
+ | expression NOTEQUAL scalar_constant
+
+ | expression FOUR_STATE_LOGIC_NOTEQUAL scalar_constant
+
+ ;
+
+
+scalar_constant
+ : ONE_TICK_b0 # Scalar_1Tickb0
+ | ONE_TICK_b1 # Scalar_1Tickb1
+ | ONE_TICK_B0 # Scalar_1TickB0
+ | ONE_TICK_B1 # Scalar_1TickB1
+ | TICK_b0 # Scalar_Tickb0
+ | TICK_b1 # Scalar_Tickb1
+ | TICK_B0 # Scalar_TickB0
+ | TICK_B1 # Scalar_TickB1
+ | Integral_number # Scalar_Integral
+ ;
+
+ concatenation
+ : OPEN_CURLY expression ( COMMA expression )* CLOSE_CURLY
+ | OPEN_CURLY array_member_label COLUMN expression
+ ( COMMA array_member_label COLUMN expression )* CLOSE_CURLY
+ ;
+
+
+constant_concatenation
+ : OPEN_CURLY constant_expression ( COMMA constant_expression )* CLOSE_CURLY
+
+ | OPEN_CURLY array_member_label COLUMN constant_expression
+ ( COMMA array_member_label COLUMN constant_expression )* CLOSE_CURLY
+
+ ;
+
+
+array_member_label
+ : DEFAULT
+ | identifier
+ | constant_expression
+ ;
+
+
+constant_multiple_concatenation : OPEN_CURLY constant_expression constant_concatenation CLOSE_CURLY ;
+
+
+module_path_concatenation : OPEN_CURLY module_path_expression ( COMMA module_path_expression )* CLOSE_CURLY ;
+
+
+module_path_multiple_concatenation : OPEN_CURLY constant_expression module_path_concatenation CLOSE_CURLY ;
+
+
+multiple_concatenation : OPEN_CURLY expression concatenation CLOSE_CURLY ;
+
+
+streaming_concatenation : OPEN_CURLY stream_operator ( slice_size )? stream_concatenation CLOSE_CURLY ;
+
+
+stream_operator : SHIFT_RIGHT | SHIFT_LEFT ;
+
+
+ slice_size : simple_type | constant_expression ;
+
+
+stream_concatenation : OPEN_CURLY stream_expression ( COMMA stream_expression )* CLOSE_CURLY ;
+
+
+stream_expression : expression ( WITH OPEN_BRACKET array_range_expression CLOSE_BRACKET )? ;
+
+
+array_range_expression
+ : expression
+ | expression COLUMN expression
+ | expression INC_PART_SELECT_OP expression
+ | expression DEC_PART_SELECT_OP expression
+ ;
+
+empty_queue : OPEN_CURLY CLOSE_CURLY ;
+
+/*
+subroutine_call
+ : tf_call
+ | method_call
+ | randomize_call
+ ;
+*/
+
+subroutine_call : ( implicit_class_handle DOT | class_scope | package_scope | dollar_keyword )?
+ ( dollar_root_keyword )? identifier ( constant_bit_select DOT identifier )* ( attribute_instance )* ( ( OPEN_PARENS list_of_arguments CLOSE_PARENS ) | select) (DOT? method_call_body)?
+ | randomize_call;
+
+
+
+list_of_arguments
+ : ( expression )? (COMMA ( expression )? )* ( COMMA DOT identifier OPEN_PARENS ( expression )? CLOSE_PARENS )*
+ | DOT identifier OPEN_PARENS ( expression )? CLOSE_PARENS ( COMMA DOT identifier OPEN_PARENS ( expression )? CLOSE_PARENS )*
+
+ ;
+
+method_call : method_call_root DOT method_call_body
+ | class_type COLUMNCOLUMN method_call_body
+ ;
+
+
+method_call_body
+ : identifier ( attribute_instance )*
+ ( OPEN_PARENS list_of_arguments CLOSE_PARENS )?
+ | built_in_method_call
+ ;
+
+
+built_in_method_call
+ : array_manipulation_call
+ | randomize_call
+ ;
+
+
+array_manipulation_call : array_method_name ( attribute_instance )*
+ ( OPEN_PARENS list_of_arguments CLOSE_PARENS )?
+ ( WITH OPEN_PARENS expression CLOSE_PARENS )?
+ ;
+
+
+randomize_call :
+ RANDOMIZE ( attribute_instance )*
+ ( OPEN_PARENS ( identifier_list | NULL_KEYWORD )? CLOSE_PARENS )?
+ ( WITH ( OPEN_PARENS ( identifier_list )? CLOSE_PARENS )? constraint_block )? ;
+
+
+method_call_root
+ : implicit_class_handle
+ | ( class_scope | package_scope )?
+ ( dollar_root_keyword )? identifier (( OPEN_BRACKET constant_expression CLOSE_BRACKET )* DOT identifier)* select
+ ;
+
+
+array_method_name
+ : identifier
+ | unique_call
+ | and_call
+ | or_call
+ | xor_call
+ ;
+
+unique_call : UNIQUE ;
+and_call : AND;
+or_call : OR;
+xor_call : XOR;
+
+
+inc_or_dec_expression
+ : inc_or_dec_operator ( attribute_instance )* variable_lvalue
+ | variable_lvalue ( attribute_instance )* inc_or_dec_operator
+
+ ;
+
+constant_expression
+ : constant_primary
+ | unary_operator ( attribute_instance )* constant_primary
+ | constant_expression binary_operator ( attribute_instance )* constant_expression
+ | constant_expression QMARK ( attribute_instance )* constant_expression COLUMN constant_expression
+ | system_task
+ ;
+
+constant_mintypmax_expression
+ : constant_expression
+ | constant_expression COLUMN constant_expression COLUMN constant_expression
+ ;
+
+constant_param_expression
+ : constant_mintypmax_expression
+ | data_type
+ | DOLLAR
+ ;
+
+
+param_expression
+ : mintypmax_expression
+ | data_type
+ | DOLLAR
+ ;
+
+
+constant_range_expression
+ : constant_expression
+ | constant_part_select_range
+ ;
+
+
+constant_part_select_range
+ : constant_range
+ | constant_indexed_range
+ ;
+
+
+constant_range : constant_expression COLUMN constant_expression ;
+
+
+constant_indexed_range
+ : constant_expression INC_PART_SELECT_OP constant_expression
+
+ | constant_expression DEC_PART_SELECT_OP constant_expression
+
+ ;
+
+
+expression
+ : primary
+ | unary_operator ( attribute_instance )* primary
+ | inc_or_dec_expression
+ | OPEN_PARENS operator_assignment CLOSE_PARENS
+ | expression binary_operator ( attribute_instance )* expression
+ | expression ( LOGICAL_AND expression )* QMARK ( attribute_instance )*
+ expression COLUMN expression
+ | expression MATCHES pattern ( LOGICAL_AND expression )* QMARK ( attribute_instance )*
+ expression COLUMN expression
+ | OPEN_PARENS expression MATCHES pattern ( LOGICAL_AND expression )* CLOSE_PARENS QMARK ( attribute_instance )*
+ expression COLUMN expression
+ | expression INSIDE OPEN_CURLY open_range_list CLOSE_CURLY
+ | tagged_union_expression
+ ;
+
+
+tagged_union_expression :
+ TAGGED identifier ( expression )? ;
+
+
+value_range
+ : expression
+ | OPEN_BRACKET expression COLUMN expression CLOSE_BRACKET
+ ;
+
+
+mintypmax_expression
+ : expression
+ | expression COLUMN expression COLUMN expression
+ ;
+
+module_path_expression
+ : module_path_primary
+ | unary_module_path_operator ( attribute_instance )* module_path_primary
+
+ | module_path_expression binary_module_path_operator ( attribute_instance )*
+ module_path_expression
+ | module_path_expression QMARK ( attribute_instance )*
+ module_path_expression COLUMN module_path_expression
+;
+
+module_path_mintypmax_expression
+ : module_path_expression
+ | module_path_expression COLUMN module_path_expression COLUMN module_path_expression
+
+ ;
+
+range_expression
+ : expression
+ | part_select_range
+ ;
+
+part_select_range
+ : constant_range
+ | indexed_range
+ ;
+
+indexed_range
+ : expression INC_PART_SELECT_OP constant_expression
+ | expression DEC_PART_SELECT_OP constant_expression
+ ;
+
+constant_primary
+ : primary_literal
+ | ( package_scope | class_scope )? identifier constant_select ( OPEN_BRACKET constant_range_expression CLOSE_BRACKET )?
+ | constant_concatenation ( OPEN_BRACKET constant_range_expression CLOSE_BRACKET )?
+ | constant_multiple_concatenation ( OPEN_BRACKET constant_range_expression CLOSE_BRACKET )?
+ | subroutine_call
+ | OPEN_PARENS constant_mintypmax_expression CLOSE_PARENS
+ | constant_cast
+ | constant_assignment_pattern_expression
+ | type_reference
+ | dollar_keyword
+ ;
+
+module_path_primary
+ : number
+ | identifier
+ | module_path_concatenation
+ | module_path_multiple_concatenation
+ | subroutine_call
+ | OPEN_PARENS module_path_mintypmax_expression CLOSE_PARENS
+ ;
+
+/*
+ Replaces let_expression, tf_call, method_call
+*/
+complex_func_call : ( implicit_class_handle DOT | class_scope | package_scope | dollar_keyword )?
+ ( dollar_root_keyword )? identifier (( OPEN_BRACKET constant_expression CLOSE_BRACKET )* DOT identifier)* ( attribute_instance )* ( ( OPEN_PARENS (list_of_arguments) CLOSE_PARENS ) | select ) (DOT? method_call_body)? ;
+
+primary
+ : primary_literal
+ | complex_func_call
+ | ( concatenation | multiple_concatenation ) ( OPEN_BRACKET range_expression CLOSE_BRACKET )?
+ | OPEN_PARENS mintypmax_expression CLOSE_PARENS
+ | cast
+ | assignment_pattern_expression
+ | streaming_concatenation
+// | sequence_method_call
+ | system_task
+ | class_type COLUMNCOLUMN method_call_body
+ | this_keyword
+ | dollar_keyword
+ | null_keyword
+ | empty_queue
+ | randomize_call
+ ;
+
+this_keyword : THIS;
+
+super_keyword : SUPER;
+
+dollar_keyword : DOLLAR;
+
+dollar_root_keyword : DOLLAR_ROOT DOT;
+
+this_dot_super : THIS DOT SUPER;
+
+null_keyword : NULL_KEYWORD;
+
+time_literal
+ : Integral_number time_unit
+ | Real_number time_unit
+//REMOVED | Unsigned_number time_unit
+// | Fixed_point_number time_unit
+ ;
+
+time_unit
+ : Simple_identifier
+ ;
+
+implicit_class_handle
+ : this_keyword
+ | super_keyword
+ | this_dot_super
+ ;
+
+bit_select :
+ ( OPEN_BRACKET expression CLOSE_BRACKET )* ;
+
+select : ( ( DOT identifier bit_select )* DOT identifier )? bit_select ( OPEN_BRACKET part_select_range CLOSE_BRACKET )? ;
+
+nonrange_select :
+ ( ( DOT identifier bit_select )* DOT identifier )? bit_select ;
+
+constant_bit_select :
+ ( OPEN_BRACKET constant_expression CLOSE_BRACKET )* ;
+
+constant_select :
+ ( ( DOT identifier constant_bit_select )* DOT identifier )? constant_bit_select
+ ( OPEN_BRACKET constant_part_select_range CLOSE_BRACKET )? ;
+
+primary_literal
+ : number
+ | time_literal
+ | unbased_unsized_literal
+ | string_value
+ | identifier
+ ;
+
+constant_cast
+ : casting_type TICK ( OPEN_PARENS constant_expression CLOSE_PARENS | constant_concatenation | constant_multiple_concatenation )
+ ;
+
+cast
+ : casting_type TICK ( OPEN_PARENS expression CLOSE_PARENS | concatenation | multiple_concatenation)
+ ;
+
+net_lvalue
+ : ps_or_hierarchical_identifier constant_select
+ | OPEN_CURLY net_lvalue ( COMMA net_lvalue )* CLOSE_CURLY
+ | ( assignment_pattern_expression_type )? assignment_pattern_net_lvalue
+ ;
+
+
+variable_lvalue
+ : ( implicit_class_handle DOT | package_scope )?
+ hierarchical_identifier select
+ | OPEN_CURLY variable_lvalue ( COMMA variable_lvalue )* CLOSE_CURLY
+ | ( assignment_pattern_expression_type )? assignment_pattern_variable_lvalue
+ | streaming_concatenation
+ ;
+
+nonrange_variable_lvalue :
+ ( implicit_class_handle DOT | package_scope )? hierarchical_identifier nonrange_select ;
+
+
+unary_operator
+ : PLUS # Unary_Plus
+ | MINUS # Unary_Minus
+ | BANG # Unary_Not
+ | TILDA # Unary_Tilda
+ | BITW_AND # Unary_BitwAnd
+ | REDUCTION_NAND # Unary_ReductNand
+ | BITW_OR # Unary_BitwOr
+ | REDUCTION_NOR # Unary_ReductNor
+ | BITW_XOR # Unary_BitwXor
+ | REDUCTION_XNOR1 # Unary_ReductXnor1
+ | REDUCTION_XNOR2 # Unary_ReductXnor2
+ ;
+
+binary_operator
+ : PLUS # BinOp_Plus
+ | MINUS # BinOp_Minus
+ | STAR # BinOp_Mult
+ | DIV # BinOp_Div
+ | PERCENT # BinOp_Percent
+ | EQUIV # BinOp_Equiv
+ | NOTEQUAL # BinOp_Not
+ | FOUR_STATE_LOGIC_EQUAL # BinOp_FourStateLogicEqual
+ | FOUR_STATE_LOGIC_NOTEQUAL # BinOp_FourStateLogicNotEqual
+ | WILD_EQUAL_OP # BinOp_WildEqual
+ | WILD_NOTEQUAL_OP # BinOp_WildNotEqual
+ | LOGICAL_AND # BinOp_LogicAnd
+ | LOGICAL_OR # BinOp_LogicOr
+ | STARSTAR # BinOp_MultMult
+ | LESS # BinOp_Less
+ | LESS_EQUAL # BinOp_LessEqual
+ | GREATER # BinOp_Great
+ | GREATER_EQUAL # BinOp_GreatEqual
+ | BITW_AND # BinOp_BitwAnd
+ | BITW_OR # BinOp_BitwOr
+ | BITW_XOR # BinOp_BitwXor
+ | REDUCTION_XNOR1 # BinOp_ReductXnor1
+ | REDUCTION_XNOR2 # BinOp_ReductXnor2
+ | REDUCTION_NOR # BinOp_ReductNor
+ | REDUCTION_NAND # BinOp_ReductNand
+ | SHIFT_RIGHT # BinOp_ShiftRight
+ | SHIFT_LEFT # BinOp_ShiftLeft
+ | ARITH_SHIFT_RIGHT # BinOp_ArithShiftRight
+ | ARITH_SHIFT_LEFT # BinOp_ArithShiftLeft
+ | IMPLY # BinOp_Imply
+ | EQUIVALENCE # BinOp_Equivalence
+ | BINARY_WILDCARD_EQUAL # BinOp_WildcardEqual
+ | BINARY_WILDCARD_NOTEQUAL # BinOp_WildcardNotEqual
+ ;
+
+inc_or_dec_operator
+ : PLUSPLUS # IncDec_PlusPlus
+ | MINUSMINUS # IncDec_MinusMinus
+ ;
+
+unary_module_path_operator
+ : BANG # UnaryModOp_Not
+ | TILDA # UnaryModOp_Tilda
+ | BITW_AND # UnaryModOp_BitwAnd
+ | REDUCTION_NAND # UnaryModOp_ReductNand
+ | BITW_OR # UnaryModOp_BitwOr
+ | REDUCTION_NOR # UnaryModOp_ReductNor
+ | BITW_XOR # UnaryModOp_BitwXor
+ | REDUCTION_XNOR1 # UnaryModOp_ReductXNor1
+ | REDUCTION_XNOR2 # UnaryModOp_ReductXnor2
+ ;
+
+binary_module_path_operator
+ : EQUIV # BinModOp_Equiv
+ | NOTEQUAL # BinModOp_NotEqual
+ | LOGICAL_AND # BinModOp_LogicAnd
+ | LOGICAL_OR # BinModOp_LogicOr
+ | BITW_AND # BinModOp_BitwAnd
+ | BITW_OR # BinModOp_BitwOr
+ | BITW_XOR # BinModOp_BitwXor
+ | REDUCTION_XNOR1 # BinModOp_ReductXnor1
+ | REDUCTION_XNOR2 # BinModOp_ReductXnor2
+ ;
+
+number
+ : Integral_number # Number_Integral
+ | Real_number # Number_Real
+ | ONE_TICK_b0 # Number_1Tickb0
+ | ONE_TICK_b1 # Number_1Tickb1
+ | ONE_TICK_B0 # Number_1TickB0
+ | ONE_TICK_B1 # Number_1TickB1
+ | TICK_b0 # Number_Tickb0
+ | TICK_b1 # Number_Tickb1
+ | TICK_B0 # Number_TickB0
+ | TICK_B1 # Number_TickB1
+ | TICK_0 # Number_Tick0
+ | TICK_1 # Number_Tick1
+ | ONE_TICK_bx # Number_1Tickbx
+ | ONE_TICK_bX # Number_1TickbX
+ | ONE_TICK_Bx # Number_1TickBx
+ | ONE_TICK_BX # Number_1TickBX
+ ;
+
+
+unbased_unsized_literal
+ : TICK_0
+ | TICK_1
+ | TICK Simple_identifier
+ ;
+
+
+attribute_instance : OPEN_PARENS_STAR attr_spec ( COMMA attr_spec )* STAR_CLOSE_PARENS ;
+
+attr_spec : attr_name ( ASSIGN_OP constant_expression )? ;
+
+attr_name : identifier ;
+
+hierarchical_identifier : ( dollar_root_keyword )? (
+ Simple_identifier
+ | Escaped_identifier
+ | THIS
+ | RANDOMIZE
+ | SAMPLE
+ | LOGIC
+ | BIT
+ | BYTE
+ | NEW
+ | EXPECT
+ | VAR
+ | DO
+ | SIGNED
+ | UNSIGNED
+ | FINAL
+ | GLOBAL
+ | SOFT
+ | CONTEXT
+ ) (( OPEN_BRACKET constant_expression CLOSE_BRACKET )* DOT (
+ Simple_identifier
+ | Escaped_identifier
+ | THIS
+ | RANDOMIZE
+ | SAMPLE
+ | LOGIC
+ | BIT
+ | BYTE
+ | NEW
+ | EXPECT
+ | VAR
+ | DO
+ | SIGNED
+ | UNSIGNED
+ | FINAL
+ | GLOBAL
+ | SOFT
+ | CONTEXT
+ ))* ;
+
+identifier
+ : Simple_identifier
+ | Escaped_identifier
+ | THIS // System Verilog keyword
+ | RANDOMIZE // System Verilog keyword
+ | SAMPLE // System Verilog keyword
+ | LOGIC // System Verilog keyword
+ | BIT // System Verilog keyword
+ | BYTE // System Verilog keyword
+ | NEW // System Verilog keyword
+ | EXPECT // System Verilog keyword
+ | VAR // System Verilog keyword
+ | DO // System Verilog keyword
+ | SIGNED // System Verilog keyword
+ | UNSIGNED // System Verilog keyword
+ | FINAL // System Verilog keyword
+ | GLOBAL // System Verilog keyowrd
+ | SOFT // System Verilog keyword
+ | CONTEXT // System Verilog keyword
+ ;
+
+interface_identifier : ( dollar_root_keyword )? identifier (( OPEN_BRACKET constant_expression CLOSE_BRACKET )* DOT identifier)* ;
+
+/*
+package_scope
+ : identifier COLUMNCOLUMN
+ | DOLLAR_UNIT COLUMNCOLUMN
+ ;
+*/
+
+package_scope
+ : ( Simple_identifier
+ | Escaped_identifier
+ | THIS
+ | RANDOMIZE
+ | SAMPLE
+ | DOLLAR_UNIT ) COLUMNCOLUMN
+ ;
+
+/*
+ps_identifier : ( package_scope )? identifier ;
+*/
+
+ps_identifier : ( Simple_identifier
+ | Escaped_identifier
+ | THIS
+ | RANDOMIZE
+ | SAMPLE
+ | DOLLAR_UNIT ) (COLUMNCOLUMN (Simple_identifier
+ | Escaped_identifier
+ | THIS
+ | RANDOMIZE
+ | SAMPLE ))?;
+
+
+
+ps_or_hierarchical_identifier : ( package_scope )? identifier | hierarchical_identifier ;
+
+ps_or_hierarchical_array_identifier : ( implicit_class_handle DOT | class_scope | package_scope )? ( dollar_root_keyword )? identifier (( OPEN_BRACKET constant_expression CLOSE_BRACKET )* DOT identifier)* ;
+
+ps_or_hierarchical_sequence_identifier : ( package_scope )? identifier | ( dollar_root_keyword )? identifier (( OPEN_BRACKET constant_expression CLOSE_BRACKET )* DOT identifier)* ;
+
+ps_type_identifier : ( LOCAL COLUMNCOLUMN | package_scope )? identifier ;
+
+system_task : system_task_names (OPEN_PARENS (list_of_arguments | data_type) CLOSE_PARENS)? SEMICOLUMN? ;
+
+system_task_names : DOLLAR Simple_identifier (DOLLAR Simple_identifier)*
+ | DOLLAR TIME
+ | DOLLAR REALTIME
+ | DOLLAR signing
+ | DOLLAR ASSERT
+ ;
+
+top_directives : timescale_directive
+ | uselib_directive
+ | BACK_TICK Simple_identifier ( number | Simple_identifier | Real_number ) ?
+ | begin_keywords_directive
+ | end_keywords_directive
+ | unconnected_drive_directive
+ | nounconnected_drive_directive
+ | default_nettype_directive
+ | default_decay_time_directive
+ | default_trireg_strenght_directive
+ | delay_mode_distributed_directive
+ | delay_mode_path_directive
+ | delay_mode_unit_directive
+ | delay_mode_zero_directive
+ | protect_directive
+ | endprotect_directive
+ | protected_directive
+ | endprotected_directive
+ | expand_vectornets_directive
+ | noexpand_vectornets_directive
+ | autoexpand_vectornets_directive
+ | remove_gatename_directive
+ | noremove_gatenames_directive
+ | remove_netname_directive
+ | noremove_netnames_directive
+ | accelerate_directive
+ | noaccelerate_directive
+ | disable_portfaults_directive
+ | enable_portfaults_directive
+ | nosuppress_faults_directive
+ | suppress_faults_directive
+ | signed_directive
+ | unsigned_directive
+ | celldefine_directive
+ | endcelldefine_directive
+ | pragma_directive
+ ;
+
+pragma_directive : TICK_PRAGMA Simple_identifier (pragma_expression (COMMA pragma_expression)*)? ;
+
+pragma_expression
+ : Simple_identifier
+ | Simple_identifier ASSIGN_OP pragma_value
+ | pragma_value
+ | BEGIN
+ | END
+ ;
+
+pragma_value
+ : OPEN_PARENS pragma_expression ( COMMA pragma_expression)* CLOSE_PARENS
+ | number
+ | string_value
+ | Simple_identifier
+ ;
+
+timescale_directive : TICK_TIMESCALE Integral_number Simple_identifier DIV Integral_number Simple_identifier ;
+
+begin_keywords_directive : TICK_BEGIN_KEYWORDS String ;
+
+end_keywords_directive : TICK_END_KEYWORDS ;
+
+unconnected_drive_directive : TICK_UNCONNECTED_DRIVE ( Simple_identifier | PULL0 | PULL1) ;
+
+nounconnected_drive_directive : TICK_NOUNCONNECTED_DRIVE;
+
+default_nettype_directive : TICK_DEFAULT_NETTYPE ( Simple_identifier | net_type );
+
+uselib_directive : TICK_USELIB ;
+
+celldefine_directive : TICK_CELLDEFINE ;
+endcelldefine_directive : TICK_ENDCELLDEFINE;
+protect_directive : TICK_PROTECT;
+endprotect_directive : TICK_ENDPROTECT;
+protected_directive : TICK_PROTECTED;
+endprotected_directive : TICK_ENDPROTECTED;
+expand_vectornets_directive : TICK_EXPAND_VECTORNETS ;
+noexpand_vectornets_directive : TICK_NOEXPAND_VECTORNETS;
+autoexpand_vectornets_directive : TICK_AUTOEXPAND_VECTORNETS;
+disable_portfaults_directive : TICK_DISABLE_PORTFAULTS;
+enable_portfaults_directive : TICK_ENABLE_PORTFAULTS;
+nosuppress_faults_directive : TICK_NOSUPPRESS_FAULTS;
+suppress_faults_directive : TICK_SUPPRESS_FAULTS;
+signed_directive : TICK_SIGNED;
+unsigned_directive : TICK_UNSIGNED;
+remove_gatename_directive : TICK_REMOVE_GATENAME;
+noremove_gatenames_directive : TICK_NOREMOVE_GATENAMES;
+remove_netname_directive : TICK_REMOVE_NETNAME;
+noremove_netnames_directive : TICK_NOREMOVE_NETNAMES;
+accelerate_directive : TICK_ACCELERATE;
+noaccelerate_directive : TICK_NOACCELERATE;
+default_trireg_strenght_directive : TICK_DEFAULT_TRIREG_STRENGTH number;
+default_decay_time_directive : TICK_DEFAULT_DECAY_TIME ( number | Simple_identifier );
+delay_mode_distributed_directive : TICK_DELAY_MODE_DISTRIBUTED;
+delay_mode_path_directive : TICK_DELAY_MODE_PATH;
+delay_mode_unit_directive : TICK_DELAY_MODE_UNIT;
+delay_mode_zero_directive : TICK_DELAY_MODE_ZERO;
+
+
+surelog_macro_not_defined : SURELOG_MACRO_NOT_DEFINED ;
+
+slline : SLLINE Integral_number String Integral_number ;
+
+endconfig : ENDCONFIG;
+
+config_declaration : CONFIG identifier SEMICOLUMN
+ ( local_parameter_declaration SEMICOLUMN )*
+ design_statement
+ ( config_rule_statement )*
+ endconfig ( COLUMN identifier )? ;
+
+design_statement : DESIGN ( ( identifier DOT )? identifier )*
+ SEMICOLUMN ;
+
+config_rule_statement
+ : default_clause liblist_clause SEMICOLUMN
+ | inst_clause liblist_clause SEMICOLUMN
+ | inst_clause use_clause_config SEMICOLUMN
+ | inst_clause use_clause SEMICOLUMN
+ | cell_clause liblist_clause SEMICOLUMN
+ | cell_clause use_clause_config SEMICOLUMN
+ | cell_clause use_clause SEMICOLUMN
+ ;
+
+default_clause : DEFAULT ;
+
+inst_clause : INSTANCE inst_name ;
+
+inst_name : identifier ( DOT identifier )* ;
+
+cell_clause : CELL ( identifier DOT )? identifier ;
+
+liblist_clause : LIBLIST ( identifier )* ;
+
+
+use_clause_config : USE ( identifier DOT )? identifier COLUMN CONFIG
+ | USE named_parameter_assignment ( COMMA named_parameter_assignment )* COLUMN CONFIG
+ | USE ( identifier DOT )? identifier named_parameter_assignment
+ ( COMMA named_parameter_assignment )* COLUMN CONFIG
+ ;
+
+use_clause : USE ( identifier DOT )? identifier
+ | USE named_parameter_assignment ( COMMA named_parameter_assignment )*
+ | USE ( identifier DOT )? identifier named_parameter_assignment
+ ( COMMA named_parameter_assignment )*
+ | USE parameter_value_assignment
+ ;