Skip to content

Commit 5fd4feb

Browse files
authored
Merge pull request #644 from diffblue/add_attributes
Verilog: add attributes into parse tree
2 parents 7491a72 + 9f744af commit 5fd4feb

File tree

2 files changed

+90
-33
lines changed

2 files changed

+90
-33
lines changed

src/hw_cbmc_irep_ids.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,7 @@ IREP_ID_ONE(pullup)
164164
IREP_ID_ONE(inst_builtin)
165165
IREP_ID_ONE(pulldown)
166166
IREP_ID_ONE(verilog_attribute)
167+
IREP_ID_ONE(verilog_attributes)
167168
IREP_ID_ONE(task)
168169
IREP_ID_ONE(trior)
169170
IREP_ID_ONE(wor)

src/verilog/parser.y

Lines changed: 89 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
160179
Function: 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

771791
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; }
775798
;
776799

777800
ansi_port_initializer_opt:
@@ -858,13 +881,22 @@ module_item_brace:
858881
;
859882

860883
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; }
868900
;
869901

870902
module_or_generate_item_declaration:
@@ -873,16 +905,21 @@ module_or_generate_item_declaration:
873905
;
874906

875907
non_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
908946
class_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

13571403
enum_base_type_opt:
@@ -1867,9 +1913,12 @@ tf_item_declaration_brace:
18671913

18681914
tf_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

18751924
function_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

19552005
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; }
19602014
;
19612015

19622016
// System Verilog standard 1800-2017
@@ -2933,7 +2987,9 @@ block_item_declaration_or_statement_or_null:
29332987

29342988
statement_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

29392995
statement_or_null_brace:
@@ -3431,13 +3487,13 @@ event_trigger: TOK_MINUSGREATER hierarchical_event_identifier ';'
34313487

34323488
inc_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

34433499
constant_param_expression:
@@ -3475,7 +3531,7 @@ expression_brace:
34753531
expression:
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
36713727
attribute_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
36923748
attr_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
37013757
attr_name: identifier

0 commit comments

Comments
 (0)