Skip to content

Commit 87c8f5a

Browse files
committed
Verilog: grammar for unique case and unique if
This adds the Verilog grammar rules for unique case and unique if.
1 parent 2a129e6 commit 87c8f5a

File tree

6 files changed

+73
-13
lines changed

6 files changed

+73
-13
lines changed
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
CORE
2+
unique_case1.sv
3+
4+
^no properties$
5+
^EXIT=10$
6+
^SIGNAL=0$
7+
--
8+
^warning: ignoring
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
module main(input x);
2+
3+
always_comb // unique
4+
unique casex (x)
5+
0:;
6+
1:;
7+
endcase
8+
9+
always_comb // not unique
10+
unique casex (x)
11+
0:;
12+
'b1?:;
13+
endcase
14+
15+
endmodule

regression/verilog/if/unique_if1.desc

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
CORE
2+
unique_if1.sv
3+
4+
^no properties$
5+
^EXIT=10$
6+
^SIGNAL=0$
7+
--
8+
^warning: ignoring

regression/verilog/if/unique_if1.sv

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
module main(input x);
2+
3+
always_comb // unique
4+
unique if (x == 0)
5+
;
6+
else if(x == 1)
7+
;
8+
9+
always_comb // not unique
10+
unique if (x == 0)
11+
;
12+
else if(x&'b10 == 1)
13+
;
14+
15+
endmodule

src/hw_cbmc_irep_ids.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ IREP_ID_ONE(inst)
3737
IREP_ID_ONE(Verilog)
3838
IREP_ID_ONE(verilog_explicit_cast)
3939
IREP_ID_ONE(verilog_implicit_typecast)
40+
IREP_ID_ONE(verilog_unique)
41+
IREP_ID_ONE(verilog_unique0)
42+
IREP_ID_ONE(verilog_priority)
4043
IREP_ID_ONE(verilog_non_indexed_part_select)
4144
IREP_ID_ONE(verilog_indexed_part_select_plus)
4245
IREP_ID_ONE(verilog_indexed_part_select_minus)

src/verilog/parser.y

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2785,27 +2785,38 @@ disable_statement: TOK_DISABLE hierarchical_task_or_block_identifier ';'
27852785
// A.6.6 Conditional statements
27862786

27872787
conditional_statement:
2788-
TOK_IF '(' expression ')' statement_or_null %prec LT_TOK_ELSE
2789-
{ init($$, ID_if); mto($$, $3); mto($$, $5); }
2790-
| TOK_IF '(' expression ')' statement_or_null TOK_ELSE statement_or_null
2791-
{ init($$, ID_if); mto($$, $3); mto($$, $5); mto($$, $7); }
2788+
unique_priority_opt TOK_IF '(' expression ')' statement_or_null %prec LT_TOK_ELSE
2789+
{ init($$, ID_if); mto($$, $4); mto($$, $6); }
2790+
| unique_priority_opt TOK_IF '(' expression ')' statement_or_null TOK_ELSE statement_or_null
2791+
{ init($$, ID_if); mto($$, $4); mto($$, $6); mto($$, $8); }
2792+
;
2793+
2794+
unique_priority_opt:
2795+
/* Optional */
2796+
{ init($$); }
2797+
| TOK_UNIQUE
2798+
{ init($$, ID_verilog_unique); }
2799+
| TOK_UNIQUE0
2800+
{ init($$, ID_verilog_unique0); }
2801+
| TOK_PRIORITY
2802+
{ init($$, ID_verilog_priority); }
27922803
;
27932804

27942805
// System Verilog standard 1800-2017
27952806
// A.6.7 Case statements
27962807

27972808
case_statement:
2798-
TOK_CASE '(' expression ')' case_item_brace TOK_ENDCASE
2799-
{ init($$, ID_case); mto($$, $3);
2800-
Forall_operands(it, stack_expr($5))
2809+
unique_priority_opt TOK_CASE '(' expression ')' case_item_brace TOK_ENDCASE
2810+
{ init($$, ID_case); mto($$, $4);
2811+
Forall_operands(it, stack_expr($6))
28012812
stack_expr($$).add_to_operands(std::move(*it)); }
2802-
| TOK_CASEX '(' expression ')' case_item_brace TOK_ENDCASE
2803-
{ init($$, ID_casex); mto($$, $3);
2804-
Forall_operands(it, stack_expr($5))
2813+
| unique_priority_opt TOK_CASEX '(' expression ')' case_item_brace TOK_ENDCASE
2814+
{ init($$, ID_casex); mto($$, $4);
2815+
Forall_operands(it, stack_expr($6))
28052816
stack_expr($$).add_to_operands(std::move(*it)); }
2806-
| TOK_CASEZ '(' expression ')' case_item_brace TOK_ENDCASE
2807-
{ init($$, ID_casez); mto($$, $3);
2808-
Forall_operands(it, stack_expr($5))
2817+
| unique_priority_opt TOK_CASEZ '(' expression ')' case_item_brace TOK_ENDCASE
2818+
{ init($$, ID_casez); mto($$, $4);
2819+
Forall_operands(it, stack_expr($6))
28092820
stack_expr($$).add_to_operands(std::move(*it)); }
28102821
;
28112822

0 commit comments

Comments
 (0)