@@ -157,6 +157,25 @@ static void add_as_subtype(typet &dest, typet &what)
157157
158158/* ******************************************************************\
159159
160+ Function: add_attributes
161+
162+ Inputs:
163+
164+ Outputs:
165+
166+ Purpose:
167+
168+ \*******************************************************************/
169+
170+ static void add_attributes (YYSTYPE &dest, YYSTYPE &attributes)
171+ {
172+ PRECONDITION (stack_expr (attributes).id () == ID_verilog_attributes);
173+ if (!stack_expr (attributes).get_sub ().empty ())
174+ addswap (dest, ID_verilog_attributes, attributes);
175+ }
176+
177+ /* ******************************************************************\
178+
160179Function: yyverilogerror
161180
162181 Inputs:
@@ -596,7 +615,8 @@ description:
596615 | program_declaration
597616 | package_declaration
598617 | attribute_instance_brace package_item
599- { PARSER.parse_tree.create_package_item(stack_expr($2 )); }
618+ { add_attributes($2 , $1 );
619+ PARSER.parse_tree.create_package_item(stack_expr($2 )); }
600620 | attribute_instance_brace bind_directive
601621 | config_declaration
602622 ;
@@ -769,9 +789,12 @@ ansi_port_declaration_brace:
769789 ;
770790
771791port_declaration :
772- attribute_instance_brace inout_declaration { $$ =$2 ; }
773- | attribute_instance_brace input_declaration { $$ =$2 ; }
774- | attribute_instance_brace output_declaration { $$ =$2 ; }
792+ attribute_instance_brace inout_declaration
793+ { add_attributes($2 , $1 ); $$ =$2 ; }
794+ | attribute_instance_brace input_declaration
795+ { add_attributes($2 , $1 ); $$ =$2 ; }
796+ | attribute_instance_brace output_declaration
797+ { add_attributes($2 , $1 ); $$ =$2 ; }
775798 ;
776799
777800ansi_port_initializer_opt :
@@ -858,13 +881,22 @@ module_item_brace:
858881 ;
859882
860883module_or_generate_item :
861- attribute_instance_brace parameter_override { $$ =$2 ; }
862- | attribute_instance_brace gate_instantiation { $$ =$2 ; }
863- // | attribute_instance_brace udp_instantiation { $$ =$2 ; }
864- | attribute_instance_brace module_instantiation { $$ =$2 ; }
865- | attribute_instance_brace smv_using { $$ = $2 ; }
866- | attribute_instance_brace smv_assume { $$ = $2 ; }
867- | attribute_instance_brace module_common_item { $$ =$2 ; }
884+ attribute_instance_brace parameter_override
885+ { add_attributes($2 , $1 ); $$ =$2 ; }
886+ | attribute_instance_brace gate_instantiation
887+ { add_attributes($2 , $1 ); $$ =$2 ; }
888+ // UDP instances have the same syntax
889+ // as module instances ; they only differ in the identifier.
890+ // | attribute_instance_brace udp_instantiation
891+ // { add_attributes($2, $1); $$=$2; }
892+ | attribute_instance_brace module_instantiation
893+ { add_attributes($2, $1); $$=$2; }
894+ | attribute_instance_brace smv_using
895+ { add_attributes($2, $1); $$=$2; }
896+ | attribute_instance_brace smv_assume
897+ { add_attributes($2, $1); $$=$2; }
898+ | attribute_instance_brace module_common_item
899+ { add_attributes($2, $1); $$=$2; }
868900 ;
869901
870902module_or_generate_item_declaration :
@@ -873,16 +905,21 @@ module_or_generate_item_declaration:
873905 ;
874906
875907non_port_module_item :
876- attribute_instance_brace generate_region { $$ =$2 ; }
908+ attribute_instance_brace generate_region
909+ { add_attributes($2 , $1 ); $$ =$2 ; }
877910 | module_or_generate_item
878- | attribute_instance_brace specparam_declaration {$$ =$2 ; }
879- | attribute_instance_brace specify_block { $$ =$2 ;}
911+ | attribute_instance_brace specparam_declaration
912+ { add_attributes($2 , $1 ); $$ =$2 ; }
913+ | attribute_instance_brace specify_block
914+ { add_attributes($2 , $1 ); $$ =$2 ; }
880915 ;
881916
882917/*
883918 module_or_generate_item
884- | attribute_instance_brace parameter_declaration { $$=$2; }
885- // | attribute_instance_brace local_parameter_declaration { $$=$2; }
919+ | attribute_instance_brace parameter_declaration
920+ // { add_attributes($2, $1); $$=$2; }
921+ // | attribute_instance_brace local_parameter_declaration
922+ // { add_attributes($2, $1); $$=$2; }
886923 ;
887924*/
888925
@@ -905,12 +942,18 @@ class_item_brace:
905942 | class_item_brace class_item
906943 ;
907944
945+ // classes are yet to be implemented
908946class_item :
909947// attribute_instance_brace class_property
948+ // { add_attributes($2 , $1 ); $$ =$2 ; }
910949// | attribute_instance_brace class_method
950+ // { add_attributes($2 , $1 ); $$ =$2 ; }
911951// | attribute_instance_brace class_constraint
952+ // { add_attributes($2 , $1 ); $$ =$2 ; }
912953 attribute_instance_brace class_declaration
954+ { add_attributes($2 , $1 ); $$ =$2 ; }
913955 | attribute_instance_brace covergroup_declaration
956+ { add_attributes($2 , $1 ); $$ =$2 ; }
914957 | local_parameter_declaration ' ;'
915958 | parameter_declaration ' ;'
916959 | ' ;'
@@ -1351,7 +1394,10 @@ struct_union_member:
13511394 random_qualifier_opt
13521395 data_type_or_void
13531396 list_of_variable_decl_assignments ' ;'
1354- { $$ =$4 ; stack_expr($$ ).id(ID_decl); addswap($$ , ID_type, $3 ); }
1397+ { $$ =$4 ;
1398+ stack_expr ($$).id(ID_decl);
1399+ addswap ($$, ID_type, $3 );
1400+ add_attributes ($$, $1 ); }
13551401 ;
13561402
13571403enum_base_type_opt :
@@ -1867,9 +1913,12 @@ tf_item_declaration_brace:
18671913
18681914tf_item_declaration :
18691915 block_item_declaration
1870- | attribute_instance_brace input_declaration ' ;' { $$ = $2 ; }
1871- | attribute_instance_brace output_declaration ' ;' { $$ = $2 ; }
1872- | attribute_instance_brace inout_declaration ' ;' { $$ = $2 ; }
1916+ | attribute_instance_brace input_declaration ' ;'
1917+ { add_attributes($2 , $1 ); $$ = $2 ; }
1918+ | attribute_instance_brace output_declaration ' ;'
1919+ { add_attributes($2 , $1 ); $$ = $2 ; }
1920+ | attribute_instance_brace inout_declaration ' ;'
1921+ { add_attributes($2 , $1 ); $$ = $2 ; }
18731922 ;
18741923
18751924function_prototype : TOK_FUNCTION data_type_or_void function_identifier
@@ -1936,6 +1985,7 @@ tf_port_item:
19361985 port_identifier
19371986 variable_dimension_brace
19381987 { init($$ , ID_decl);
1988+ add_attributes ($$, $1 );
19391989 addswap ($$, ID_class, $2 );
19401990 addswap ($$, ID_type, $3 );
19411991 stack_expr ($4 ).id(ID_declarator);
@@ -1953,10 +2003,14 @@ tf_port_direction_opt:
19532003// A.2.8 Block item declarations
19542004
19552005block_item_declaration :
1956- attribute_instance_brace data_declaration { $$ =$2 ; }
1957- | attribute_instance_brace local_parameter_declaration ' ;' { $$ =$2 ; }
1958- | attribute_instance_brace parameter_declaration ' ;' { $$ =$2 ; }
1959- | attribute_instance_brace let_declaration { $$ =$2 ; }
2006+ attribute_instance_brace data_declaration
2007+ { add_attributes($2 , $1 ); $$ =$2 ; }
2008+ | attribute_instance_brace local_parameter_declaration ' ;'
2009+ { add_attributes($2 , $1 ); $$ =$2 ; }
2010+ | attribute_instance_brace parameter_declaration ' ;'
2011+ { add_attributes($2 , $1 ); $$ =$2 ; }
2012+ | attribute_instance_brace let_declaration
2013+ { add_attributes($2 , $1 ); $$ =$2 ; }
19602014 ;
19612015
19622016// System Verilog standard 1800-2017
@@ -2933,7 +2987,9 @@ block_item_declaration_or_statement_or_null:
29332987
29342988statement_or_null :
29352989 statement
2936- | attribute_instance_brace ' ;' { init($$ , ID_skip); }
2990+ | attribute_instance_brace ' ;'
2991+ { init($$ , ID_skip);
2992+ add_attributes ($$, $1 ); }
29372993 ;
29382994
29392995statement_or_null_brace :
@@ -3431,13 +3487,13 @@ event_trigger: TOK_MINUSGREATER hierarchical_event_identifier ';'
34313487
34323488inc_or_dec_expression :
34333489 TOK_PLUSPLUS attribute_instance_brace variable_lvalue
3434- { init($$ , ID_preincrement); mto($$ , $3 ); }
3490+ { init($$ , ID_preincrement); mto($$ , $3 ); add_attributes( $$ , $2 ); }
34353491 | TOK_MINUSMINUS attribute_instance_brace variable_lvalue
3436- { init($$ , ID_predecrement); mto($$ , $3 ); }
3492+ { init($$ , ID_predecrement); mto($$ , $3 ); add_attributes( $$ , $2 ); }
34373493 | variable_lvalue attribute_instance_brace TOK_PLUSPLUS
3438- { init($$ , ID_postincrement); mto($$ , $1 ); }
3494+ { init($$ , ID_postincrement); mto($$ , $1 ); add_attributes( $$ , $2 ); }
34393495 | variable_lvalue attribute_instance_brace TOK_MINUSMINUS
3440- { init($$ , ID_postdecrement); mto($$ , $1 ); }
3496+ { init($$ , ID_postdecrement); mto($$ , $1 ); add_attributes( $$ , $2 ); }
34413497 ;
34423498
34433499constant_param_expression :
@@ -3475,7 +3531,7 @@ expression_brace:
34753531expression :
34763532 primary
34773533 | unary_operator attribute_instance_brace primary
3478- { $$ =$1 ; mto($$ , $3 ); }
3534+ { $$ =$1 ; mto($$ , $3 ); add_attributes( $$ , $2 ); }
34793535 | inc_or_dec_expression
34803536 | expression " ->" expression
34813537 { init($$ , ID_implies); mto($$ , $1 ); mto($$ , $3 ); }
@@ -3670,7 +3726,7 @@ number: unsigned_number
36703726
36713727attribute_instance_brace:
36723728 /* Optional */
3673- { init($$, ID_verilog_attribute ); }
3729+ { init($$, ID_verilog_attributes ); }
36743730 | attribute_instance_brace attribute_instance
36753731 { $$=$1;
36763732 for(auto &attr : stack_expr($2).get_sub())
@@ -3690,12 +3746,12 @@ attr_spec_list:
36903746 ;
36913747
36923748attr_spec: attr_name ' =' constant_expression
3693- { init($$, "attribute" );
3749+ { init($$, ID_verilog_attribute );
36943750 stack_expr($$).add(ID_name).swap(stack_expr($1));
36953751 stack_expr($$).add(ID_value).swap(stack_expr($3));
36963752 }
36973753 | attr_name
3698- { init($$, "attribute" ); stack_expr($$).add(ID_name).swap(stack_expr($1)); }
3754+ { init($$, ID_verilog_attribute ); stack_expr($$).add(ID_name).swap(stack_expr($1)); }
36993755 ;
37003756
37013757attr_name: identifier
0 commit comments