From 6bd0658916ae8489efd381e08586d4c24e73f2e5 Mon Sep 17 00:00:00 2001 From: Daniel Kroening Date: Sun, 3 Dec 2023 13:52:46 -0800 Subject: [PATCH] Verilog: allow parentheses in property expressions The 1800-2017 grammar has an ambiguity where '(' expression ')' can either be an expression or a property_expr, which yields a reduce/reduce conflict. Hence, we split the rules for property_expr into property_expr and property_expr_proper. --- .../system_verilog_assertion4.sv | 1 + src/verilog/parser.y | 12 +++++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/regression/verilog/system_verilog_assertion/system_verilog_assertion4.sv b/regression/verilog/system_verilog_assertion/system_verilog_assertion4.sv index af2bc7f36..2dfe5b32d 100644 --- a/regression/verilog/system_verilog_assertion/system_verilog_assertion4.sv +++ b/regression/verilog/system_verilog_assertion/system_verilog_assertion4.sv @@ -20,5 +20,6 @@ module main(input clk); p10: assert property (x==0 |-> ##1 x==1 and ##2 x==2); p11: assert property (x==0 |-> ##1 x==1 and not ##2 x==3); p12: assert property (x==0 |-> ##1 x==1 && y==2); + p13: assert property ((x==0 |-> y==0) |=> y != 0); endmodule diff --git a/src/verilog/parser.y b/src/verilog/parser.y index c433e9538..89549ca0d 100644 --- a/src/verilog/parser.y +++ b/src/verilog/parser.y @@ -1552,8 +1552,18 @@ property_declaration: TOK_PROPERTY property_identifier TOK_ENDPROPERTY ; +// The 1800-2017 grammar has an ambiguity where +// '(' expression ')' can either be an expression or a property_expr, +// which yields a reduce/reduce conflict. Hence, we split the rules +// for property_expr into property_expr and property_expr_proper. + property_expr: - sequence_expr + sequence_expr + | property_expr_proper + ; + +property_expr_proper: + '(' property_expr_proper ')' { $$ = $2; } | "not" property_expr { init($$, ID_not); mto($$, $2); } | property_expr "or" property_expr { init($$, ID_or); mto($$, $1); mto($$, $3); } | property_expr "and" property_expr { init($$, ID_and); mto($$, $1); mto($$, $3); }