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  
+           ;