blob: a44ab5383960abf020f2cd3b9d9556e9452522c6 [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.
*/
parser grammar SV3_1aPpParser;
options { tokenVocab = SV3_1aPpLexer; }
source_text : ( description ) *;
description :
unterminated_string
| string
| number
| macro_definition
| comments
| celldefine_directive_one_line
| endcelldefine_directive_one_line
| default_nettype_directive_one_line
| undef_directive
| ifdef_directive
| ifndef_directive
| else_directive
| elsif_directive
| elseif_directive
| endif_directive
| include_directive_one_line
| include_directive
| resetall_directive_one_line
| begin_keywords_directive_one_line
| begin_keywords_directive
| end_keywords_directive_one_line
| timescale_directive_one_line
| unconnected_drive_directive_one_line
| nounconnected_drive_directive_one_line
| line_directive_one_line
| default_decay_time_directive_one_line
| default_trireg_strenght_directive_one_line
| delay_mode_distributed_directive_one_line
| delay_mode_path_directive_one_line
| delay_mode_unit_directive_one_line
| delay_mode_zero_directive_one_line
| protect_directive_one_line
| endprotect_directive_one_line
| protected_directive_one_line
| endprotected_directive_one_line
| expand_vectornets_directive_one_line
| noexpand_vectornets_directive_one_line
| autoexpand_vectornets_directive_one_line
| remove_gatename_directive_one_line
| noremove_gatenames_directive_one_line
| remove_netname_directive_one_line
| noremove_netnames_directive_one_line
| accelerate_directive_one_line
| noaccelerate_directive_one_line
| undefineall_directive
| uselib_directive_one_line
| disable_portfaults_directive_one_line
| enable_portfaults_directive_one_line
| nosuppress_faults_directive_one_line
| suppress_faults_directive_one_line
| signed_directive_one_line
| unsigned_directive_one_line
| pragma_directive_one_line
| sv_file_directive
| sv_line_directive
| macro_instance
| module
| endmodule
| sv_interface
| endinterface
| program
| endprogram
| primitive
| endprimitive
| sv_package
| endpackage
| checker
| endchecker
| config
| endconfig
| text_blob
| escaped_identifier
| pound_delay
;
macro_instance : (Macro_identifier | Macro_Escaped_identifier) Spaces* PARENS_OPEN macro_actual_args PARENS_CLOSE # MacroInstanceWithArgs
| (Macro_identifier | Macro_Escaped_identifier) # MacroInstanceNoArgs
;
unterminated_string : DOUBLE_QUOTE (string_blob)* CR;
macro_actual_args : (macro_arg)* (COMMA macro_arg*)* ;
comments : One_line_comment
| Block_comment
;
number : Number ;
pound_delay : Pound_delay ;
macro_definition :
define_directive
| multiline_args_macro_definition
| simple_no_args_macro_definition
| multiline_no_args_macro_definition
| simple_args_macro_definition
;
include_directive_one_line : include_directive Spaces* CR;
include_directive : TICK_INCLUDE Spaces (String | Simple_identifier | Escaped_identifier | macro_instance);
line_directive_one_line : line_directive Spaces* CR ;
line_directive : TICK_LINE Spaces number String Spaces number;
default_nettype_directive_one_line : default_nettype_directive Spaces* CR ;
default_nettype_directive : TICK_DEFAULT_NETTYPE Spaces Simple_identifier;
sv_file_directive : TICK_FILE__ ;
sv_line_directive : TICK_LINE__ ;
timescale_directive_one_line : timescale_directive Spaces* CR ;
timescale_directive : TICK_TIMESCALE TIMESCALE ;
undef_directive : TICK_UNDEF Spaces (Simple_identifier | Escaped_identifier | macro_instance);
ifdef_directive : TICK_IFDEF Spaces (Simple_identifier | Escaped_identifier | macro_instance) ;
ifdef_directive_in_macro_body : TICK_IFDEF Spaces (identifier_in_macro_body | Escaped_identifier | macro_instance) ;
ifndef_directive : TICK_IFNDEF Spaces (Simple_identifier | Escaped_identifier | macro_instance);
ifndef_directive_in_macro_body : TICK_IFNDEF Spaces (identifier_in_macro_body | Escaped_identifier | macro_instance);
elsif_directive : TICK_ELSIF Spaces (Simple_identifier | Escaped_identifier | macro_instance);
elsif_directive_in_macro_body : TICK_ELSIF Spaces (identifier_in_macro_body | Escaped_identifier | macro_instance);
elseif_directive : TICK_ELSEIF Spaces (Simple_identifier | Escaped_identifier | macro_instance);
elseif_directive_in_macro_body : TICK_ELSEIF Spaces (identifier_in_macro_body | Escaped_identifier | macro_instance);
else_directive : TICK_ELSE;
endif_directive : TICK_ENDIF Spaces* One_line_comment
| TICK_ENDIF ;
resetall_directive_one_line : resetall_directive Spaces* CR ;
resetall_directive : TICK_RESETALL;
begin_keywords_directive_one_line : begin_keywords_directive Spaces* CR ;
begin_keywords_directive : TICK_BEGIN_KEYWORDS Spaces String;
end_keywords_directive_one_line : end_keywords_directive Spaces* CR ;
end_keywords_directive : TICK_END_KEYWORDS;
pragma_directive_one_line : pragma_directive Spaces* CR ;
pragma_directive : TICK_PRAGMA Spaces Simple_identifier ( pragma_expression ( Special pragma_expression )* )* ;
celldefine_directive_one_line : celldefine_directive Spaces* CR ;
celldefine_directive : TICK_CELLDEFINE ;
endcelldefine_directive_one_line : endcelldefine_directive Spaces* CR ;
endcelldefine_directive : TICK_ENDCELLDEFINE;
protect_directive_one_line : protect_directive Spaces* CR ;
protect_directive : TICK_PROTECT;
endprotect_directive_one_line : endprotect_directive Spaces* CR ;
endprotect_directive : TICK_ENDPROTECT;
protected_directive_one_line : protected_directive Spaces* CR ;
protected_directive : TICK_PROTECTED;
endprotected_directive_one_line : endprotected_directive Spaces* CR ;
endprotected_directive : TICK_ENDPROTECTED;
expand_vectornets_directive_one_line : expand_vectornets_directive Spaces* CR ;
expand_vectornets_directive : TICK_EXPAND_VECTORNETS ;
noexpand_vectornets_directive_one_line : noexpand_vectornets_directive Spaces* CR ;
noexpand_vectornets_directive : TICK_NOEXPAND_VECTORNETS;
autoexpand_vectornets_directive_one_line : autoexpand_vectornets_directive Spaces* CR ;
autoexpand_vectornets_directive : TICK_AUTOEXPAND_VECTORNETS;
uselib_directive_one_line : uselib_directive CR ;
uselib_directive : TICK_USELIB ( text_blob )+;
disable_portfaults_directive_one_line : disable_portfaults_directive Spaces* CR ;
disable_portfaults_directive : TICK_DISABLE_PORTFAULTS;
enable_portfaults_directive_one_line : enable_portfaults_directive Spaces* CR ;
enable_portfaults_directive : TICK_ENABLE_PORTFAULTS;
nosuppress_faults_directive_one_line : nosuppress_faults_directive Spaces* CR ;
nosuppress_faults_directive : TICK_NOSUPPRESS_FAULTS;
suppress_faults_directive_one_line : suppress_faults_directive Spaces* CR ;
suppress_faults_directive : TICK_SUPPRESS_FAULTS;
signed_directive_one_line : signed_directive Spaces* CR ;
signed_directive : TICK_SIGNED;
unsigned_directive_one_line : unsigned_directive Spaces* CR ;
unsigned_directive : TICK_UNSIGNED;
remove_gatename_directive_one_line : remove_gatename_directive Spaces* CR ;
remove_gatename_directive : TICK_REMOVE_GATENAME;
noremove_gatenames_directive_one_line : noremove_gatenames_directive Spaces* CR ;
noremove_gatenames_directive : TICK_NOREMOVE_GATENAMES;
remove_netname_directive_one_line : remove_netname_directive Spaces* CR ;
remove_netname_directive : TICK_REMOVE_NETNAME;
noremove_netnames_directive_one_line : noremove_netnames_directive Spaces* CR ;
noremove_netnames_directive : TICK_NOREMOVE_NETNAMES;
accelerate_directive_one_line : accelerate_directive Spaces* CR ;
accelerate_directive : TICK_ACCELERATE;
noaccelerate_directive_one_line : noaccelerate_directive Spaces* CR ;
noaccelerate_directive : TICK_NOACCELERATE;
default_trireg_strenght_directive_one_line : default_trireg_strenght_directive Spaces* CR ;
default_trireg_strenght_directive : TICK_DEFAULT_TRIREG_STRENGTH Spaces number;
default_decay_time_directive_one_line : default_decay_time_directive Spaces* CR ;
default_decay_time_directive : TICK_DEFAULT_DECAY_TIME Spaces ( number | Simple_identifier | Fixed_point_number );
unconnected_drive_directive_one_line : unconnected_drive_directive Spaces* CR ;
unconnected_drive_directive : TICK_UNCONNECTED_DRIVE Spaces Simple_identifier;
nounconnected_drive_directive_one_line : nounconnected_drive_directive Spaces* CR ;
nounconnected_drive_directive : TICK_NOUNCONNECTED_DRIVE;
delay_mode_distributed_directive_one_line : delay_mode_distributed_directive Spaces* CR ;
delay_mode_distributed_directive : TICK_DELAY_MODE_DISTRIBUTED;
delay_mode_path_directive_one_line : delay_mode_path_directive Spaces* CR ;
delay_mode_path_directive : TICK_DELAY_MODE_PATH;
delay_mode_unit_directive_one_line : delay_mode_unit_directive Spaces* CR ;
delay_mode_unit_directive : TICK_DELAY_MODE_UNIT;
delay_mode_zero_directive_one_line : delay_mode_zero_directive Spaces* CR ;
delay_mode_zero_directive : TICK_DELAY_MODE_ZERO;
undefineall_directive : TICK_UNDEFINEALL;
module : MODULE ;
endmodule : ENDMODULE ;
sv_interface : INTERFACE ;
endinterface : ENDINTERFACE ;
program : PROGRAM ;
endprogram : ENDPROGRAM ;
primitive : PRIMITIVE ;
endprimitive : ENDPRIMITIVE ;
sv_package : PACKAGE ;
endpackage : ENDPACKAGE ;
checker : CHECKER ;
endchecker : ENDCHECKER ;
config : CONFIG ;
endconfig : ENDCONFIG ;
define_directive : TICK_DEFINE Spaces (Simple_identifier | Escaped_identifier) Spaces* CR ;
multiline_no_args_macro_definition : TICK_DEFINE Spaces (Simple_identifier | Escaped_identifier) Spaces* escaped_macro_definition_body ;
multiline_args_macro_definition : TICK_DEFINE Spaces (Simple_identifier | Escaped_identifier) macro_arguments Spaces* escaped_macro_definition_body;
simple_no_args_macro_definition :
TICK_DEFINE Spaces (Simple_identifier | Escaped_identifier) Spaces simple_macro_definition_body (CR | One_line_comment)
| TICK_DEFINE Spaces (Simple_identifier | Escaped_identifier) Spaces* CR
;
simple_args_macro_definition :
TICK_DEFINE Spaces (Simple_identifier | Escaped_identifier) macro_arguments Spaces simple_macro_definition_body (CR | One_line_comment)
| TICK_DEFINE Spaces (Simple_identifier | Escaped_identifier) macro_arguments Spaces* CR
;
identifier_in_macro_body : (Simple_identifier TICK_TICK?)* ;
simple_no_args_macro_definition_in_macro_body :
TICK_DEFINE Spaces (identifier_in_macro_body | Escaped_identifier) Spaces simple_macro_definition_body_in_macro_body
| TICK_DEFINE Spaces (identifier_in_macro_body | Escaped_identifier) Spaces*
| TICK_DEFINE Spaces (identifier_in_macro_body | Escaped_identifier) TICK_VARIABLE simple_macro_definition_body_in_macro_body
;
simple_args_macro_definition_in_macro_body :
TICK_DEFINE Spaces (identifier_in_macro_body | Escaped_identifier) macro_arguments Spaces simple_macro_definition_body_in_macro_body
| TICK_DEFINE Spaces (identifier_in_macro_body | Escaped_identifier) macro_arguments
;
directive_in_macro :
celldefine_directive
| endcelldefine_directive
| default_nettype_directive
| undef_directive
| ifdef_directive
| ifndef_directive
| else_directive
| elsif_directive
| elseif_directive
| endif_directive
| include_directive
| resetall_directive
| timescale_directive
| unconnected_drive_directive
| nounconnected_drive_directive
| line_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
| undefineall_directive
| uselib_directive
| disable_portfaults_directive
| enable_portfaults_directive
| nosuppress_faults_directive
| suppress_faults_directive
| signed_directive
| unsigned_directive
| sv_file_directive
| sv_line_directive
| sv_package
| endpackage
| module
| endmodule
| sv_interface
| endinterface
| program
| endprogram
| primitive
| endprimitive
| checker
| endchecker
| config
| endconfig
| simple_args_macro_definition_in_macro_body //(ESCAPED_CR | CR) Adds long runtime on Verilator t_preproc.v case but fixes Syntax Error
| simple_no_args_macro_definition_in_macro_body //(ESCAPED_CR | CR)
| pound_delay
;
macro_arguments : PARENS_OPEN ((Simple_identifier Spaces* (EQUAL_OP default_value*)*)
(COMMA Spaces* (Simple_identifier Spaces* (EQUAL_OP default_value*)*))*)* PARENS_CLOSE ;
escaped_macro_definition_body : escaped_macro_definition_body_alt1
| escaped_macro_definition_body_alt2;
escaped_macro_definition_body_alt1 : ( unterminated_string | Macro_identifier | Macro_Escaped_identifier |
escaped_identifier | Simple_identifier |
number | TEXT_CR | pound_delay | ESCAPED_CR | PARENS_OPEN | PARENS_CLOSE | COMMA |
EQUAL_OP | DOUBLE_QUOTE | TICK_VARIABLE | directive_in_macro | Spaces |
Fixed_point_number | String | comments | TICK_QUOTE | TICK_BACKSLASH_TICK_QUOTE |
TICK_TICK | Special | CURLY_OPEN | CURLY_CLOSE | SQUARE_OPEN |
SQUARE_CLOSE)*? ESCAPED_CR Spaces* (CR | EOF);
escaped_macro_definition_body_alt2 : ( unterminated_string | Macro_identifier | Macro_Escaped_identifier |
escaped_identifier |
Simple_identifier | number | TEXT_CR | pound_delay | ESCAPED_CR | PARENS_OPEN |
PARENS_CLOSE | COMMA | EQUAL_OP | DOUBLE_QUOTE | TICK_VARIABLE |
directive_in_macro | Spaces | Fixed_point_number | String | comments |
TICK_QUOTE | TICK_BACKSLASH_TICK_QUOTE | TICK_TICK | Special | CURLY_OPEN |
CURLY_CLOSE | SQUARE_OPEN | SQUARE_CLOSE)*? (CR Spaces* | EOF) ;
simple_macro_definition_body : ( unterminated_string | Macro_identifier | Macro_Escaped_identifier |
escaped_identifier |
Simple_identifier | number | pound_delay | TEXT_CR | PARENS_OPEN |
PARENS_CLOSE | COMMA | EQUAL_OP | DOUBLE_QUOTE | TICK_VARIABLE |
Spaces | Fixed_point_number | String | comments |
TICK_QUOTE | TICK_BACKSLASH_TICK_QUOTE | TICK_TICK | Special |
CURLY_OPEN | CURLY_CLOSE | SQUARE_OPEN | SQUARE_CLOSE | TICK_INCLUDE | directive_in_macro )*? ;
simple_macro_definition_body_in_macro_body : ( unterminated_string | Macro_identifier | Macro_Escaped_identifier |
escaped_identifier |
Simple_identifier | number | pound_delay | TEXT_CR |
PARENS_OPEN | PARENS_CLOSE | COMMA | EQUAL_OP | DOUBLE_QUOTE | TICK_VARIABLE |
Spaces | Fixed_point_number | String | comments |
TICK_QUOTE | TICK_BACKSLASH_TICK_QUOTE | TICK_TICK | Special | CURLY_OPEN |
CURLY_CLOSE | SQUARE_OPEN | SQUARE_CLOSE )*? ;
pragma_expression : Simple_identifier
| number
| Spaces
| Fixed_point_number
| String
| Special
| CURLY_OPEN
| CURLY_CLOSE
| SQUARE_OPEN
| SQUARE_CLOSE
| PARENS_OPEN
| PARENS_CLOSE
| COMMA
| EQUAL_OP
| DOUBLE_QUOTE
| ANY
| escaped_identifier
| pound_delay
;
macro_arg : Simple_identifier
| number
| Spaces
| Fixed_point_number
| String
| Special
| paired_parens
| EQUAL_OP
| DOUBLE_QUOTE
| macro_instance
| CR
| TEXT_CR
| ANY
| escaped_identifier
| simple_args_macro_definition_in_macro_body
| simple_no_args_macro_definition_in_macro_body
| comments
;
paired_parens : ( PARENS_OPEN ( Simple_identifier | number
| Spaces | Fixed_point_number | String | Special | COMMA | EQUAL_OP
| DOUBLE_QUOTE | macro_instance | TEXT_CR | CR | ANY | paired_parens | escaped_identifier | comments )* PARENS_CLOSE )
| ( CURLY_OPEN ( Simple_identifier | number
| Spaces | Fixed_point_number | String | Special | COMMA | EQUAL_OP
| DOUBLE_QUOTE | macro_instance | CR | ANY | paired_parens | escaped_identifier | comments )* CURLY_CLOSE )
| ( SQUARE_OPEN ( Simple_identifier | number
| Spaces | Fixed_point_number | String | Special | COMMA | EQUAL_OP
| DOUBLE_QUOTE | macro_instance | CR | ANY | paired_parens | escaped_identifier | comments )* SQUARE_CLOSE ) ;
text_blob : Simple_identifier
| number
| CR
| Spaces
| Fixed_point_number
| ESCAPED_CR
| String
| PARENS_OPEN
| PARENS_CLOSE
| COMMA
| EQUAL_OP
| DOUBLE_QUOTE
| Special
| CURLY_OPEN
| CURLY_CLOSE
| SQUARE_OPEN
| SQUARE_CLOSE
| TICK_TICK
| TICK_VARIABLE
| TIMESCALE
| ANY
| pound_delay
| TICK_QUOTE
| TICK_BACKSLASH_TICK_QUOTE
| TEXT_CR
;
string : String ;
escaped_identifier : Escaped_identifier;
default_value : Simple_identifier
| number
| Spaces
| Fixed_point_number
| String
| Special
| CURLY_OPEN
| CURLY_CLOSE
| SQUARE_OPEN
| SQUARE_CLOSE
| ANY
| escaped_identifier
| macro_instance
;
string_blob : Simple_identifier
| number
| Spaces
| Fixed_point_number
| ESCAPED_CR
| PARENS_OPEN
| PARENS_CLOSE
| COMMA
| EQUAL_OP
| DOUBLE_QUOTE
| Special
| CURLY_OPEN
| CURLY_CLOSE
| SQUARE_OPEN
| SQUARE_CLOSE
| ANY
| escaped_identifier
| TIMESCALE
| pound_delay
| TEXT_CR
;