Skip to content

Commit 3847085

Browse files
authored
Merge pull request #676 from diffblue/restrict1
SystemVerilog: `restrict` statement
2 parents 2e283cc + 04d4dbc commit 3847085

File tree

9 files changed

+78
-3
lines changed

9 files changed

+78
-3
lines changed

regression/verilog/SVA/restrict1.desc

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
CORE
2+
restrict1.sv
3+
--module main --bound 10
4+
^\[main\.p0\] always main\.x != 5: ASSUMED$
5+
^\[main\.p1\] always main\.x != 6: PROVED up to bound 10$
6+
^EXIT=0$
7+
^SIGNAL=0$
8+
--
9+
^warning: ignoring
10+
--

regression/verilog/SVA/restrict1.sv

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
module main(input clk, input en);
2+
3+
reg [31:0] x;
4+
5+
initial x=0;
6+
7+
always @(posedge clk)
8+
if(en)
9+
x<=x+1;
10+
11+
p0: restrict property (x!=5);
12+
13+
p1: assert property (x!=6);
14+
15+
endmodule

src/hw_cbmc_irep_ids.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ IREP_ID_ONE(verilog_assert_property)
135135
IREP_ID_ONE(verilog_assume_property)
136136
IREP_ID_ONE(verilog_cover_property)
137137
IREP_ID_ONE(verilog_covergroup)
138+
IREP_ID_ONE(verilog_restrict_property)
138139
IREP_ID_ONE(verilog_expect_property)
139140
IREP_ID_ONE(verilog_smv_assert)
140141
IREP_ID_ONE(verilog_smv_assume)

src/verilog/parser.y

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2022,6 +2022,7 @@ concurrent_assertion_statement:
20222022
assert_property_statement
20232023
| assume_property_statement
20242024
| cover_property_statement
2025+
| restrict_property_statement
20252026
;
20262027

20272028
/* This one mimicks functionality in Cadence SMV */
@@ -2083,6 +2084,10 @@ cover_property_statement: TOK_COVER TOK_PROPERTY '(' property_spec ')' action_bl
20832084
{ init($$, ID_verilog_cover_property); mto($$, $4); mto($$, $6); }
20842085
;
20852086

2087+
restrict_property_statement: TOK_RESTRICT TOK_PROPERTY '(' property_spec ')' ';'
2088+
{ init($$, ID_verilog_restrict_property); mto($$, $4); mto($$, $6); }
2089+
;
2090+
20862091
expect_property_statement: TOK_EXPECT '(' property_spec ')' action_block
20872092
{ init($$, ID_verilog_expect_property); mto($$, $3); mto($$, $5); }
20882093
;

src/verilog/verilog_elaborate.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -630,6 +630,7 @@ void verilog_typecheckt::collect_symbols(const verilog_statementt &statement)
630630
else if(
631631
statement.id() == ID_verilog_assert_property ||
632632
statement.id() == ID_verilog_assume_property ||
633+
statement.id() == ID_verilog_restrict_property ||
633634
statement.id() == ID_verilog_cover_property ||
634635
statement.id() == ID_verilog_expect_property)
635636
{
@@ -791,6 +792,7 @@ void verilog_typecheckt::collect_symbols(
791792
else if(
792793
module_item.id() == ID_verilog_assert_property ||
793794
module_item.id() == ID_verilog_assume_property ||
795+
module_item.id() == ID_verilog_restrict_property ||
794796
module_item.id() == ID_verilog_cover_property)
795797
{
796798
}

src/verilog/verilog_expr.h

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1798,6 +1798,7 @@ to_verilog_assert_assume_cover_module_item(
17981798
PRECONDITION(
17991799
module_item.id() == ID_verilog_assert_property ||
18001800
module_item.id() == ID_verilog_assume_property ||
1801+
module_item.id() == ID_verilog_restrict_property ||
18011802
module_item.id() == ID_verilog_cover_property);
18021803
binary_exprt::check(module_item);
18031804
return static_cast<const verilog_assert_assume_cover_module_itemt &>(
@@ -1810,6 +1811,7 @@ to_verilog_assert_assume_cover_module_item(verilog_module_itemt &module_item)
18101811
PRECONDITION(
18111812
module_item.id() == ID_verilog_assert_property ||
18121813
module_item.id() == ID_verilog_assume_property ||
1814+
module_item.id() == ID_verilog_restrict_property ||
18131815
module_item.id() == ID_verilog_cover_property);
18141816
binary_exprt::check(module_item);
18151817
return static_cast<verilog_assert_assume_cover_module_itemt &>(module_item);
@@ -1857,6 +1859,7 @@ to_verilog_assert_assume_cover_statement(const verilog_statementt &statement)
18571859
statement.id() == ID_verilog_smv_assert ||
18581860
statement.id() == ID_verilog_immediate_assume ||
18591861
statement.id() == ID_verilog_assume_property ||
1862+
statement.id() == ID_verilog_restrict_property ||
18601863
statement.id() == ID_verilog_smv_assume ||
18611864
statement.id() == ID_verilog_immediate_cover ||
18621865
statement.id() == ID_verilog_cover_property);
@@ -1873,6 +1876,7 @@ to_verilog_assert_assume_cover_statement(verilog_statementt &statement)
18731876
statement.id() == ID_verilog_smv_assert ||
18741877
statement.id() == ID_verilog_immediate_assume ||
18751878
statement.id() == ID_verilog_assume_property ||
1879+
statement.id() == ID_verilog_restrict_property ||
18761880
statement.id() == ID_verilog_smv_assume ||
18771881
statement.id() == ID_verilog_immediate_cover ||
18781882
statement.id() == ID_verilog_cover_property);
@@ -1980,6 +1984,32 @@ to_verilog_assume_statement(verilog_statementt &statement)
19801984
return static_cast<verilog_assume_statementt &>(statement);
19811985
}
19821986

1987+
class verilog_restrict_statementt
1988+
: public verilog_assert_assume_cover_statementt
1989+
{
1990+
public:
1991+
verilog_restrict_statementt()
1992+
: verilog_assert_assume_cover_statementt(ID_verilog_restrict_property)
1993+
{
1994+
}
1995+
};
1996+
1997+
inline const verilog_restrict_statementt &
1998+
to_verilog_restrict_statement(const verilog_statementt &statement)
1999+
{
2000+
PRECONDITION(statement.id() == ID_verilog_restrict_property);
2001+
binary_exprt::check(statement);
2002+
return static_cast<const verilog_restrict_statementt &>(statement);
2003+
}
2004+
2005+
inline verilog_restrict_statementt &
2006+
to_verilog_restrict_statement(verilog_statementt &statement)
2007+
{
2008+
PRECONDITION(statement.id() == ID_verilog_restrict_property);
2009+
binary_exprt::check(statement);
2010+
return static_cast<verilog_restrict_statementt &>(statement);
2011+
}
2012+
19832013
class verilog_module_sourcet : public irept
19842014
{
19852015
public:

src/verilog/verilog_interfaces.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,7 @@ void verilog_typecheckt::interface_module_item(
267267
else if(
268268
module_item.id() == ID_verilog_assert_property ||
269269
module_item.id() == ID_verilog_assume_property ||
270+
module_item.id() == ID_verilog_restrict_property ||
270271
module_item.id() == ID_verilog_cover_property)
271272
{
272273
// done later

src/verilog/verilog_synthesis.cpp

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2561,6 +2561,7 @@ void verilog_synthesist::synth_assert_assume_cover(
25612561
// mark 'assume' and 'cover' properties as such
25622562
if(
25632563
statement.id() == ID_verilog_assume_property ||
2564+
statement.id() == ID_verilog_restrict_property ||
25642565
statement.id() == ID_verilog_immediate_assume ||
25652566
statement.id() == ID_verilog_smv_assume)
25662567
{
@@ -2616,6 +2617,7 @@ void verilog_synthesist::synth_assert_assume_cover(
26162617
// mark 'assume' and 'cover' properties as such
26172618
if(
26182619
statement.id() == ID_verilog_assume_property ||
2620+
statement.id() == ID_verilog_restrict_property ||
26192621
statement.id() == ID_verilog_immediate_assume ||
26202622
statement.id() == ID_verilog_smv_assume)
26212623
{
@@ -2654,7 +2656,8 @@ void verilog_synthesist::synth_assert_assume_cover(
26542656

26552657
if(
26562658
module_item.id() == ID_verilog_assert_property ||
2657-
module_item.id() == ID_verilog_assume_property)
2659+
module_item.id() == ID_verilog_assume_property ||
2660+
module_item.id() == ID_verilog_restrict_property)
26582661
{
26592662
// Concurrent assertions and assumptions come with an implicit 'always'
26602663
// (1800-2017 Sec 16.12.11).
@@ -2681,7 +2684,9 @@ void verilog_synthesist::synth_assert_assume_cover(
26812684
if(cond.id() != ID_sva_always)
26822685
cond = sva_always_exprt{cond};
26832686
}
2684-
else if(module_item.id() == ID_verilog_assume_property)
2687+
else if(
2688+
module_item.id() == ID_verilog_assume_property ||
2689+
module_item.id() == ID_verilog_restrict_property)
26852690
{
26862691
// Concurrent assumptions come with an implicit 'always'
26872692
// (1800-2017 Sec 16.12.11).
@@ -3427,6 +3432,7 @@ void verilog_synthesist::synth_statement(
34273432
else if(
34283433
statement.id() == ID_verilog_immediate_assume ||
34293434
statement.id() == ID_verilog_assume_property ||
3435+
statement.id() == ID_verilog_restrict_property ||
34303436
statement.id() == ID_verilog_smv_assume)
34313437
{
34323438
synth_assert_assume_cover(
@@ -3537,7 +3543,9 @@ void verilog_synthesist::synth_module_item(
35373543
synth_assert_assume_cover(
35383544
to_verilog_assert_assume_cover_module_item(module_item));
35393545
}
3540-
else if(module_item.id() == ID_verilog_assume_property)
3546+
else if(
3547+
module_item.id() == ID_verilog_assume_property ||
3548+
module_item.id() == ID_verilog_restrict_property)
35413549
{
35423550
synth_assert_assume_cover(
35433551
to_verilog_assert_assume_cover_module_item(module_item));

src/verilog/verilog_typecheck.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1484,6 +1484,7 @@ void verilog_typecheckt::convert_statement(
14841484
else if(
14851485
statement.id() == ID_verilog_immediate_assume ||
14861486
statement.id() == ID_verilog_assume_property ||
1487+
statement.id() == ID_verilog_restrict_property ||
14871488
statement.id() == ID_verilog_smv_assume)
14881489
{
14891490
convert_assert_assume_cover(to_verilog_assume_statement(statement));
@@ -1531,6 +1532,7 @@ void verilog_typecheckt::convert_statement(
15311532
if(
15321533
sub_statement.id() == ID_verilog_assert_property ||
15331534
sub_statement.id() == ID_verilog_assume_property ||
1535+
sub_statement.id() == ID_verilog_restrict_property ||
15341536
sub_statement.id() == ID_verilog_cover_property)
15351537
{
15361538
sub_statement.set(ID_identifier, label_statement.label());
@@ -1587,6 +1589,7 @@ void verilog_typecheckt::convert_module_item(
15871589
else if(
15881590
module_item.id() == ID_verilog_assert_property ||
15891591
module_item.id() == ID_verilog_assume_property ||
1592+
module_item.id() == ID_verilog_restrict_property ||
15901593
module_item.id() == ID_verilog_cover_property)
15911594
{
15921595
convert_assert_assume_cover(

0 commit comments

Comments
 (0)