blob: 8d8bd4095d83c29f69e4b3b9940599456dd65f4a [file] [log] [blame]
/*
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_1aPpLexer;
// A.9.2 Comments
One_line_comment : '//' Comment_text '\r'? '\n' ;
Block_comment : '/*' Comment_text '*/' ;
fragment Comment_text : (WS | CR | TAB)* | .*? ;
TICK_VARIABLE : '``' [a-zA-Z0-9_]+ '``' ;
TICK_DEFINE : '`define' ;
TICK_CELLDEFINE : '`celldefine' ;
TICK_ENDCELLDEFINE : '`endcelldefine' ;
TICK_DEFAULT_NETTYPE : '`default_nettype' ;
TICK_UNDEF : '`undef' ;
TICK_IFDEF : '`ifdef' ;
TICK_IFNDEF : '`ifndef' ;
TICK_ELSE : '`else' ;
TICK_ELSIF : '`elsif' ;
TICK_ELSEIF : '`elseif' ;
TICK_ENDIF : '`endif' ;
TICK_INCLUDE : '`include' ;
TICK_PRAGMA : '`pragma' ;
TICK_BEGIN_KEYWORDS : '`begin_keywords' ;
TICK_END_KEYWORDS : '`end_keywords' ;
TICK_RESETALL : '`resetall' ;
TICK_TIMESCALE : '`timescale' ;
TICK_UNCONNECTED_DRIVE : '`unconnected_drive' ;
TICK_NOUNCONNECTED_DRIVE : '`nounconnected_drive' ;
TICK_LINE : '`line' ;
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_UNDEFINEALL : '`undefineall' ;
TICK_ACCELERATE : '`accelerate';
TICK_NOACCELERATE : '`noaccelerate';
TICK_PROTECT : '`protect' ;
TICK_USELIB : '`uselib' ;
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' ;
TICK_FILE__ : '`__FILE__' ;
TICK_LINE__ : '`__LINE__' ;
MODULE : 'module';
ENDMODULE : 'endmodule' ;
INTERFACE : 'interface' ;
ENDINTERFACE : 'endinterface' ;
PROGRAM : 'program' ;
ENDPROGRAM : 'endprogram' ;
PRIMITIVE : 'primivite' ;
ENDPRIMITIVE : 'endprimitive' ;
PACKAGE : 'package' ;
ENDPACKAGE : 'endpackage' ;
CHECKER : 'checker' ;
ENDCHECKER : 'endchecker' ;
CONFIG : 'config' ;
ENDCONFIG : 'endconfig' ;
Macro_identifier : '`' [a-zA-Z_] [a-zA-Z0-9_$]* ;
Macro_Escaped_identifier
: '`\\' ~[WS\r\t\n]*? WS
;
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
;
Simple_identifier : [a-zA-Z_] [a-zA-Z0-9_$]* ;
Spaces : (WS | TAB)+;
Pound_delay : '#' WS* [0-9] [0-9_.]*;
TIMESCALE : (WS | TAB)* [0-9]+ (WS | TAB)* ('ms' | 'us' | 'ns' | 'ps' | 'fs' | 's' ) (WS | TAB)* '/' (WS | TAB)* [0-9]+ (WS | TAB)* ('ms' | 'us' | 'ns' | 'ps' | 'fs' | 's') ;
fragment
Non_zero_unsigned_number : '1'..'9' ( '_' | Decimal_digit )* ;
fragment
Decimal_number
: Unsigned_number
| ( Non_zero_unsigned_number WS* )? Decimal_base WS* Unsigned_number*
| ( Non_zero_unsigned_number WS* )? Decimal_base WS* X_digit ( '_' )*
| ( Non_zero_unsigned_number WS* )? Decimal_base WS* Z_digit ( '_' )*
;
/* binary_number ::= [ size ] binary_base binary_value */
fragment
Binary_number : ( Non_zero_unsigned_number WS* )? Binary_base WS* Binary_value ;
/* octal_number ::= [ size ] octal_base octal_value */
fragment
Octal_number : ( Non_zero_unsigned_number WS* )? Octal_base WS* Octal_value ;
/* hex_number ::= [ size ] hex_base hex_value */
fragment
Hex_number : ( Non_zero_unsigned_number WS* )? Hex_base WS* Hex_value ;
Number
: Decimal_number
| Octal_number
| Binary_number
| Hex_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_no_qm )*;
/* octal_value <<1>> ::= octal_digit { _ | octal_digit } */
fragment
Octal_value : ('_')* Octal_digit* ( ' ' | '_' | Octal_digit_no_qm )*;
/* hex_value <<1>> ::= hex_digit { _ | hex_digit } */
fragment
Hex_value : ('_')* Hex_digit* ( ' ' | '_' | Hex_digit_no_qm )*;
/* 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') ;
fragment
Binary_digit_no_qm : X_digit | Z_digit_no_qm | ('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' ;
fragment
Octal_digit_no_qm : X_digit | Z_digit_no_qm | '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') ;
fragment
Hex_digit_no_qm : X_digit | Z_digit_no_qm | ('0'..'9' | 'a'..'f' | 'A'..'F') ;
/* x_digit ::= x | X */
fragment
X_digit : ('x'| 'X') ;
/* z_digit ::= z | Z | ? */
fragment
Z_digit : ('z'| 'Z' | '?') ;
fragment
Z_digit_no_qm : ('z'| 'Z') ;
Fixed_point_number : [0-9]+ '.' [0-9]+ ;
fragment WS : [ ]+ ;
fragment TAB : [\t]+ ;
TEXT_CR : '\\' [nr];
ESCAPED_CR : '\\' [\r\n] ;
CR : [\r\n] ;
TICK_QUOTE : '`"' ;
TICK_BACKSLASH_TICK_QUOTE : '`\\`"' ;
TICK_TICK: '``' ;
PARENS_OPEN : '(' ;
PARENS_CLOSE : ')' ;
COMMA : ',' ;
EQUAL_OP : '=' ;
DOUBLE_QUOTE : '"';
Escaped_identifier
: '\\' ~[WS\r\t\n]*? WS
;
CURLY_OPEN : '{' ;
CURLY_CLOSE : '}' ;
SQUARE_OPEN : '[' ;
SQUARE_CLOSE : ']' ;
Special : [~!@#$%^&*+|:;'<>.?/-]+ ;
ANY : .;