@@ -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,22 @@ 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
+ // 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; }
868
900
;
869
901
870
902
module_or_generate_item_declaration :
@@ -873,16 +905,21 @@ module_or_generate_item_declaration:
873
905
;
874
906
875
907
non_port_module_item :
876
- attribute_instance_brace generate_region { $$ =$2 ; }
908
+ attribute_instance_brace generate_region
909
+ { add_attributes($2 , $1 ); $$ =$2 ; }
877
910
| 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 ; }
880
915
;
881
916
882
917
/*
883
918
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; }
886
923
;
887
924
*/
888
925
@@ -905,12 +942,18 @@ class_item_brace:
905
942
| class_item_brace class_item
906
943
;
907
944
945
+ // classes are yet to be implemented
908
946
class_item :
909
947
// attribute_instance_brace class_property
948
+ // { add_attributes($2 , $1 ); $$ =$2 ; }
910
949
// | attribute_instance_brace class_method
950
+ // { add_attributes($2 , $1 ); $$ =$2 ; }
911
951
// | attribute_instance_brace class_constraint
952
+ // { add_attributes($2 , $1 ); $$ =$2 ; }
912
953
attribute_instance_brace class_declaration
954
+ { add_attributes($2 , $1 ); $$ =$2 ; }
913
955
| attribute_instance_brace covergroup_declaration
956
+ { add_attributes($2 , $1 ); $$ =$2 ; }
914
957
| local_parameter_declaration ' ;'
915
958
| parameter_declaration ' ;'
916
959
| ' ;'
@@ -1351,7 +1394,10 @@ struct_union_member:
1351
1394
random_qualifier_opt
1352
1395
data_type_or_void
1353
1396
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 ); }
1355
1401
;
1356
1402
1357
1403
enum_base_type_opt :
@@ -1867,9 +1913,12 @@ tf_item_declaration_brace:
1867
1913
1868
1914
tf_item_declaration :
1869
1915
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 ; }
1873
1922
;
1874
1923
1875
1924
function_prototype : TOK_FUNCTION data_type_or_void function_identifier
@@ -1936,6 +1985,7 @@ tf_port_item:
1936
1985
port_identifier
1937
1986
variable_dimension_brace
1938
1987
{ init($$ , ID_decl);
1988
+ add_attributes ($$, $1 );
1939
1989
addswap ($$, ID_class, $2 );
1940
1990
addswap ($$, ID_type, $3 );
1941
1991
stack_expr ($4 ).id(ID_declarator);
@@ -1953,10 +2003,14 @@ tf_port_direction_opt:
1953
2003
// A.2.8 Block item declarations
1954
2004
1955
2005
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 ; }
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 ; }
1960
2014
;
1961
2015
1962
2016
// System Verilog standard 1800-2017
@@ -2933,7 +2987,9 @@ block_item_declaration_or_statement_or_null:
2933
2987
2934
2988
statement_or_null :
2935
2989
statement
2936
- | attribute_instance_brace ' ;' { init($$ , ID_skip); }
2990
+ | attribute_instance_brace ' ;'
2991
+ { init($$ , ID_skip);
2992
+ add_attributes ($$, $1 ); }
2937
2993
;
2938
2994
2939
2995
statement_or_null_brace :
@@ -3431,13 +3487,13 @@ event_trigger: TOK_MINUSGREATER hierarchical_event_identifier ';'
3431
3487
3432
3488
inc_or_dec_expression :
3433
3489
TOK_PLUSPLUS attribute_instance_brace variable_lvalue
3434
- { init($$ , ID_preincrement); mto($$ , $3 ); }
3490
+ { init($$ , ID_preincrement); mto($$ , $3 ); add_attributes( $$ , $2 ); }
3435
3491
| TOK_MINUSMINUS attribute_instance_brace variable_lvalue
3436
- { init($$ , ID_predecrement); mto($$ , $3 ); }
3492
+ { init($$ , ID_predecrement); mto($$ , $3 ); add_attributes( $$ , $2 ); }
3437
3493
| variable_lvalue attribute_instance_brace TOK_PLUSPLUS
3438
- { init($$ , ID_postincrement); mto($$ , $1 ); }
3494
+ { init($$ , ID_postincrement); mto($$ , $1 ); add_attributes( $$ , $2 ); }
3439
3495
| variable_lvalue attribute_instance_brace TOK_MINUSMINUS
3440
- { init($$ , ID_postdecrement); mto($$ , $1 ); }
3496
+ { init($$ , ID_postdecrement); mto($$ , $1 ); add_attributes( $$ , $2 ); }
3441
3497
;
3442
3498
3443
3499
constant_param_expression :
@@ -3475,7 +3531,7 @@ expression_brace:
3475
3531
expression :
3476
3532
primary
3477
3533
| unary_operator attribute_instance_brace primary
3478
- { $$ =$1 ; mto($$ , $3 ); }
3534
+ { $$ =$1 ; mto($$ , $3 ); add_attributes( $$ , $2 ); }
3479
3535
| inc_or_dec_expression
3480
3536
| expression " ->" expression
3481
3537
{ init($$ , ID_implies); mto($$ , $1 ); mto($$ , $3 ); }
@@ -3670,7 +3726,7 @@ number: unsigned_number
3670
3726
3671
3727
attribute_instance_brace:
3672
3728
/* Optional */
3673
- { init($$, ID_verilog_attribute ); }
3729
+ { init($$, ID_verilog_attributes ); }
3674
3730
| attribute_instance_brace attribute_instance
3675
3731
{ $$=$1;
3676
3732
for(auto &attr : stack_expr($2).get_sub())
@@ -3690,12 +3746,12 @@ attr_spec_list:
3690
3746
;
3691
3747
3692
3748
attr_spec: attr_name ' =' constant_expression
3693
- { init($$, "attribute" );
3749
+ { init($$, ID_verilog_attribute );
3694
3750
stack_expr($$).add(ID_name).swap(stack_expr($1));
3695
3751
stack_expr($$).add(ID_value).swap(stack_expr($3));
3696
3752
}
3697
3753
| 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)); }
3699
3755
;
3700
3756
3701
3757
attr_name: identifier
0 commit comments