Skip to content

Commit e186da3

Browse files
authored
Merge pull request #529 from diffblue/sequence3
Operators `##[*]` and `##[+]`
2 parents 1761f29 + d6e7a43 commit e186da3

File tree

8 files changed

+86
-1
lines changed

8 files changed

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

src/hw_cbmc_irep_ids.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ IREP_ID_ONE(E)
1616
IREP_ID_ONE(G)
1717
IREP_ID_ONE(X)
1818
IREP_ID_ONE(sva_cycle_delay)
19+
IREP_ID_ONE(sva_cycle_delay_star)
20+
IREP_ID_ONE(sva_cycle_delay_plus)
1921
IREP_ID_ONE(sva_sequence_concatenation)
2022
IREP_ID_ONE(sva_sequence_first_match)
2123
IREP_ID_ONE(sva_sequence_intersect)

src/temporal-logic/normalize_property.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,10 @@ exprt normalize_property(exprt expr)
117117
expr = X_exprt{to_sva_s_nexttime_expr(expr).op()};
118118
else if(expr.id() == ID_sva_cycle_delay)
119119
expr = normalize_pre_sva_cycle_delay(to_sva_cycle_delay_expr(expr));
120+
else if(expr.id() == ID_sva_cycle_delay_plus)
121+
expr = F_exprt{X_exprt{to_sva_cycle_delay_plus_expr(expr).op()}};
122+
else if(expr.id() == ID_sva_cycle_delay_star)
123+
expr = X_exprt{to_sva_cycle_delay_star_expr(expr).op()};
120124

121125
// normalize the operands
122126
for(auto &op : expr.operands())

src/temporal-logic/normalize_property.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ Author: Daniel Kroening, dkr@amazon.com
2424
/// ¬¬φ --> φ
2525
/// ¬Gφ --> F¬φ
2626
/// ¬Fφ --> G¬φ
27+
/// [*] φ --> F φ
28+
/// [+] φ --> X F φ
2729
exprt normalize_property(exprt);
2830

2931
#endif

src/verilog/expr2verilog.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1106,6 +1106,12 @@ std::string expr2verilogt::convert(
11061106
else if(src.id()==ID_sva_non_overlapped_implication)
11071107
return precedence = 0, convert_sva_binary("|=>", to_binary_expr(src));
11081108

1109+
else if(src.id() == ID_sva_cycle_delay_star)
1110+
return convert_sva_unary("##[*]", to_unary_expr(src));
1111+
1112+
else if(src.id() == ID_sva_cycle_delay_plus)
1113+
return convert_sva_unary("##[+]", to_unary_expr(src));
1114+
11091115
else if(src.id()==ID_sva_cycle_delay)
11101116
return convert_sva_cycle_delay(to_ternary_expr(src), precedence = 0);
11111117
// not sure about precedence

src/verilog/parser.y

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2106,6 +2106,10 @@ cycle_delay_range:
21062106
{ init($$, ID_sva_cycle_delay); mto($$, $2); stack_expr($$).operands().push_back(nil_exprt()); }
21072107
| "##" '[' cycle_delay_const_range_expression ']'
21082108
{ $$ = $3; }
2109+
| "##" '[' TOK_ASTERIC ']'
2110+
{ init($$, ID_sva_cycle_delay_star); }
2111+
| "##" '[' TOK_PLUS ']'
2112+
{ init($$, ID_sva_cycle_delay_plus); }
21092113
;
21102114

21112115
cycle_delay_const_range_expression:

src/verilog/sva_expr.h

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -521,4 +521,54 @@ static inline sva_cycle_delay_exprt &to_sva_cycle_delay_expr(exprt &expr)
521521
return static_cast<sva_cycle_delay_exprt &>(expr);
522522
}
523523

524+
class sva_cycle_delay_plus_exprt : public unary_exprt
525+
{
526+
public:
527+
explicit sva_cycle_delay_plus_exprt(exprt op)
528+
: unary_exprt(ID_sva_cycle_delay_plus, std::move(op), bool_typet())
529+
{
530+
}
531+
};
532+
533+
static inline const sva_cycle_delay_plus_exprt &
534+
to_sva_cycle_delay_plus_expr(const exprt &expr)
535+
{
536+
PRECONDITION(expr.id() == ID_sva_cycle_delay_plus);
537+
sva_cycle_delay_plus_exprt::check(expr);
538+
return static_cast<const sva_cycle_delay_plus_exprt &>(expr);
539+
}
540+
541+
static inline sva_cycle_delay_plus_exprt &
542+
to_sva_cycle_delay_plus_expr(exprt &expr)
543+
{
544+
PRECONDITION(expr.id() == ID_sva_cycle_delay_plus);
545+
sva_cycle_delay_plus_exprt::check(expr);
546+
return static_cast<sva_cycle_delay_plus_exprt &>(expr);
547+
}
548+
549+
class sva_cycle_delay_star_exprt : public unary_exprt
550+
{
551+
public:
552+
explicit sva_cycle_delay_star_exprt(exprt op)
553+
: unary_exprt(ID_sva_cycle_delay_star, std::move(op), bool_typet())
554+
{
555+
}
556+
};
557+
558+
static inline const sva_cycle_delay_star_exprt &
559+
to_sva_cycle_delay_star_expr(const exprt &expr)
560+
{
561+
PRECONDITION(expr.id() == ID_sva_cycle_delay_star);
562+
sva_cycle_delay_star_exprt::check(expr);
563+
return static_cast<const sva_cycle_delay_star_exprt &>(expr);
564+
}
565+
566+
static inline sva_cycle_delay_star_exprt &
567+
to_sva_cycle_delay_star_expr(exprt &expr)
568+
{
569+
PRECONDITION(expr.id() == ID_sva_cycle_delay_star);
570+
sva_cycle_delay_star_exprt::check(expr);
571+
return static_cast<sva_cycle_delay_star_exprt &>(expr);
572+
}
573+
524574
#endif

src/verilog/verilog_typecheck_expr.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1906,7 +1906,9 @@ exprt verilog_typecheck_exprt::convert_unary_expr(unary_exprt expr)
19061906
}
19071907
else if(
19081908
expr.id() == ID_sva_always || expr.id() == ID_sva_nexttime ||
1909-
expr.id() == ID_sva_s_nexttime || expr.id() == ID_sva_s_eventually)
1909+
expr.id() == ID_sva_s_nexttime || expr.id() == ID_sva_s_eventually ||
1910+
expr.id() == ID_sva_cycle_delay_plus ||
1911+
expr.id() == ID_sva_cycle_delay_star)
19101912
{
19111913
assert(expr.operands().size()==1);
19121914
convert_expr(expr.op());

0 commit comments

Comments
 (0)