@@ -157,6 +157,25 @@ static void add_as_subtype(typet &dest, typet &what)
157
157
158
158
/* ******************************************************************\
159
159
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
+
160
179
Function: yyverilogerror
161
180
162
181
Inputs:
@@ -596,7 +615,8 @@ description:
596
615
| program_declaration
597
616
| package_declaration
598
617
| 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 )); }
600
620
| attribute_instance_brace bind_directive
601
621
| config_declaration
602
622
;
@@ -769,9 +789,12 @@ ansi_port_declaration_brace:
769
789
;
770
790
771
791
port_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 ; }
775
798
;
776
799
777
800
ansi_port_initializer_opt :
@@ -858,13 +881,20 @@ module_item_brace:
858
881
;
859
882
860
883
module_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
+ // | attribute_instance_brace udp_instantiation
889
+ // { add_attributes($2 , $1 ); $$ =$2 ; }
890
+ | attribute_instance_brace module_instantiation
891
+ { add_attributes($2 , $1 ); $$ =$2 ; }
892
+ | attribute_instance_brace smv_using
893
+ { add_attributes($2 , $1 ); $$ =$2 ; }
894
+ | attribute_instance_brace smv_assume
895
+ { add_attributes($2 , $1 ); $$ =$2 ; }
896
+ | attribute_instance_brace module_common_item
897
+ { add_attributes($2 , $1 ); $$ =$2 ; }
868
898
;
869
899
870
900
module_or_generate_item_declaration :
@@ -873,16 +903,21 @@ module_or_generate_item_declaration:
873
903
;
874
904
875
905
non_port_module_item :
876
- attribute_instance_brace generate_region { $$ =$2 ; }
906
+ attribute_instance_brace generate_region
907
+ { add_attributes($2 , $1 ); $$ =$2 ; }
877
908
| module_or_generate_item
878
- | attribute_instance_brace specparam_declaration {$$ =$2 ; }
879
- | attribute_instance_brace specify_block { $$ =$2 ;}
909
+ | attribute_instance_brace specparam_declaration
910
+ { add_attributes($2 , $1 ); $$ =$2 ; }
911
+ | attribute_instance_brace specify_block
912
+ { add_attributes($2 , $1 ); $$ =$2 ; }
880
913
;
881
914
882
915
/*
883
916
module_or_generate_item
884
- | attribute_instance_brace parameter_declaration { $$=$2; }
885
- // | attribute_instance_brace local_parameter_declaration { $$=$2; }
917
+ | attribute_instance_brace parameter_declaration
918
+ // { add_attributes($2, $1); $$=$2; }
919
+ // | attribute_instance_brace local_parameter_declaration
920
+ // { add_attributes($2, $1); $$=$2; }
886
921
;
887
922
*/
888
923
@@ -907,10 +942,15 @@ class_item_brace:
907
942
908
943
class_item :
909
944
// attribute_instance_brace class_property
945
+ // { add_attributes($2 , $1 ); $$ =$2 ; }
910
946
// | attribute_instance_brace class_method
947
+ // { add_attributes($2 , $1 ); $$ =$2 ; }
911
948
// | attribute_instance_brace class_constraint
949
+ // { add_attributes($2 , $1 ); $$ =$2 ; }
912
950
attribute_instance_brace class_declaration
951
+ { add_attributes($2 , $1 ); $$ =$2 ; }
913
952
| attribute_instance_brace covergroup_declaration
953
+ { add_attributes($2 , $1 ); $$ =$2 ; }
914
954
| local_parameter_declaration ' ;'
915
955
| parameter_declaration ' ;'
916
956
| ' ;'
@@ -1351,7 +1391,10 @@ struct_union_member:
1351
1391
random_qualifier_opt
1352
1392
data_type_or_void
1353
1393
list_of_variable_decl_assignments ' ;'
1354
- { $$ =$4 ; stack_expr($$ ).id(ID_decl); addswap($$ , ID_type, $3 ); }
1394
+ { $$ =$4 ;
1395
+ stack_expr ($$).id(ID_decl);
1396
+ addswap ($$, ID_type, $3 );
1397
+ add_attributes ($$, $1 ); }
1355
1398
;
1356
1399
1357
1400
enum_base_type_opt :
@@ -1867,9 +1910,12 @@ tf_item_declaration_brace:
1867
1910
1868
1911
tf_item_declaration :
1869
1912
block_item_declaration
1870
- | attribute_instance_brace input_declaration ' ;' { $$ = $2 ; }
1871
- | attribute_instance_brace output_declaration ' ;' { $$ = $2 ; }
1872
- | attribute_instance_brace inout_declaration ' ;' { $$ = $2 ; }
1913
+ | attribute_instance_brace input_declaration ' ;'
1914
+ { add_attributes($2 , $1 ); $$ = $2 ; }
1915
+ | attribute_instance_brace output_declaration ' ;'
1916
+ { add_attributes($2 , $1 ); $$ = $2 ; }
1917
+ | attribute_instance_brace inout_declaration ' ;'
1918
+ { add_attributes($2 , $1 ); $$ = $2 ; }
1873
1919
;
1874
1920
1875
1921
function_prototype : TOK_FUNCTION data_type_or_void function_identifier
@@ -1936,6 +1982,7 @@ tf_port_item:
1936
1982
port_identifier
1937
1983
variable_dimension_brace
1938
1984
{ init($$ , ID_decl);
1985
+ add_attributes ($$, $1 );
1939
1986
addswap ($$, ID_class, $2 );
1940
1987
addswap ($$, ID_type, $3 );
1941
1988
stack_expr ($4 ).id(ID_declarator);
@@ -1953,10 +2000,14 @@ tf_port_direction_opt:
1953
2000
// A.2.8 Block item declarations
1954
2001
1955
2002
block_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 ; }
2003
+ attribute_instance_brace data_declaration
2004
+ { add_attributes($2 , $1 ); $$ =$2 ; }
2005
+ | attribute_instance_brace local_parameter_declaration ' ;'
2006
+ { add_attributes($2 , $1 ); $$ =$2 ; }
2007
+ | attribute_instance_brace parameter_declaration ' ;'
2008
+ { add_attributes($2 , $1 ); $$ =$2 ; }
2009
+ | attribute_instance_brace let_declaration
2010
+ { add_attributes($2 , $1 ); $$ =$2 ; }
1960
2011
;
1961
2012
1962
2013
// System Verilog standard 1800-2017
@@ -2933,7 +2984,9 @@ block_item_declaration_or_statement_or_null:
2933
2984
2934
2985
statement_or_null :
2935
2986
statement
2936
- | attribute_instance_brace ' ;' { init($$ , ID_skip); }
2987
+ | attribute_instance_brace ' ;'
2988
+ { init($$ , ID_skip);
2989
+ add_attributes ($$, $1 ); }
2937
2990
;
2938
2991
2939
2992
statement_or_null_brace :
@@ -3431,13 +3484,13 @@ event_trigger: TOK_MINUSGREATER hierarchical_event_identifier ';'
3431
3484
3432
3485
inc_or_dec_expression :
3433
3486
TOK_PLUSPLUS attribute_instance_brace variable_lvalue
3434
- { init($$ , ID_preincrement); mto($$ , $3 ); }
3487
+ { init($$ , ID_preincrement); mto($$ , $3 ); add_attributes( $$ , $2 ); }
3435
3488
| TOK_MINUSMINUS attribute_instance_brace variable_lvalue
3436
- { init($$ , ID_predecrement); mto($$ , $3 ); }
3489
+ { init($$ , ID_predecrement); mto($$ , $3 ); add_attributes( $$ , $2 ); }
3437
3490
| variable_lvalue attribute_instance_brace TOK_PLUSPLUS
3438
- { init($$ , ID_postincrement); mto($$ , $1 ); }
3491
+ { init($$ , ID_postincrement); mto($$ , $1 ); add_attributes( $$ , $2 ); }
3439
3492
| variable_lvalue attribute_instance_brace TOK_MINUSMINUS
3440
- { init($$ , ID_postdecrement); mto($$ , $1 ); }
3493
+ { init($$ , ID_postdecrement); mto($$ , $1 ); add_attributes( $$ , $2 ); }
3441
3494
;
3442
3495
3443
3496
constant_param_expression :
@@ -3475,7 +3528,7 @@ expression_brace:
3475
3528
expression :
3476
3529
primary
3477
3530
| unary_operator attribute_instance_brace primary
3478
- { $$ =$1 ; mto($$ , $3 ); }
3531
+ { $$ =$1 ; mto($$ , $3 ); add_attributes( $$ , $2 ); }
3479
3532
| inc_or_dec_expression
3480
3533
| expression " ->" expression
3481
3534
{ init($$ , ID_implies); mto($$ , $1 ); mto($$ , $3 ); }
@@ -3670,7 +3723,7 @@ number: unsigned_number
3670
3723
3671
3724
attribute_instance_brace:
3672
3725
/* Optional */
3673
- { init($$, ID_verilog_attribute ); }
3726
+ { init($$, ID_verilog_attributes ); }
3674
3727
| attribute_instance_brace attribute_instance
3675
3728
{ $$=$1;
3676
3729
for(auto &attr : stack_expr($2).get_sub())
@@ -3690,12 +3743,12 @@ attr_spec_list:
3690
3743
;
3691
3744
3692
3745
attr_spec: attr_name ' =' constant_expression
3693
- { init($$, "attribute" );
3746
+ { init($$, ID_verilog_attribute );
3694
3747
stack_expr($$).add(ID_name).swap(stack_expr($1));
3695
3748
stack_expr($$).add(ID_value).swap(stack_expr($3));
3696
3749
}
3697
3750
| attr_name
3698
- { init($$, "attribute" ); stack_expr($$).add(ID_name).swap(stack_expr($1)); }
3751
+ { init($$, ID_verilog_attribute ); stack_expr($$).add(ID_name).swap(stack_expr($1)); }
3699
3752
;
3700
3753
3701
3754
attr_name: identifier
0 commit comments