Skip to content

Commit 4a8f099

Browse files
committed
use sva_sequence_repetition_exprt for [*] and [+]
The base class sva_sequence_repetition_exprt is now also used for the SVA consecutive sequence repetition operators [*] and [+].
1 parent 0a1c5ce commit 4a8f099

File tree

9 files changed

+215
-95
lines changed

9 files changed

+215
-95
lines changed

regression/verilog/SVA/sequence_repetition2.desc

+9-9
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
CORE
22
sequence_repetition2.sv
33
--bound 10
4-
^\[main\.p0\] main\.x == 0\[\*\]: PROVED up to bound 10$
5-
^\[main\.p1\] main\.x == 1\[\*\]: PROVED up to bound 10$
6-
^\[main\.p2\] \(main\.x == 0\[\+\]\) #=# main\.x == 1: PROVED up to bound 10$
7-
^\[main\.p3\] main\.x == 0\[\+\]: PROVED up to bound 10$
8-
^\[main\.p4\] main\.half_x == 0\[\*\]: PROVED up to bound 10$
9-
^\[main\.p5\] 0\[\*\]: PROVED up to bound 10$
10-
^\[main\.p6\] main\.x == 1\[\+\]: REFUTED$
11-
^\[main\.p7\] \(main\.x == 0\[\+\]\) #-# main\.x == 1: REFUTED$
12-
^\[main\.p8\] 0\[\+\]: REFUTED$
4+
^\[main\.p0\] main\.x == 0 \[\*\]: PROVED up to bound 10$
5+
^\[main\.p1\] main\.x == 1 \[\*\]: PROVED up to bound 10$
6+
^\[main\.p2\] \(main\.x == 0 \[\+\]\) #=# main\.x == 1: PROVED up to bound 10$
7+
^\[main\.p3\] main\.x == 0 \[\+\]: PROVED up to bound 10$
8+
^\[main\.p4\] main\.half_x == 0 \[\*\]: PROVED up to bound 10$
9+
^\[main\.p5\] 0 \[\*\]: PROVED up to bound 10$
10+
^\[main\.p6\] main\.x == 1 \[\+\]: REFUTED$
11+
^\[main\.p7\] \(main\.x == 0 \[\+\]\) #-# main\.x == 1: REFUTED$
12+
^\[main\.p8\] 0 \[\+\]: REFUTED$
1313
^EXIT=10$
1414
^SIGNAL=0$
1515
--

src/hw_cbmc_irep_ids.h

-1
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,6 @@ IREP_ID_ONE(sva_cycle_delay_star)
6060
IREP_ID_ONE(sva_cycle_delay_plus)
6161
IREP_ID_ONE(sva_disable_iff)
6262
IREP_ID_ONE(sva_sequence_concatenation)
63-
IREP_ID_ONE(sva_sequence_consecutive_repetition)
6463
IREP_ID_ONE(sva_sequence_first_match)
6564
IREP_ID_ONE(sva_sequence_goto_repetition)
6665
IREP_ID_ONE(sva_sequence_intersect)

src/temporal-logic/temporal_logic.cpp

-1
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,6 @@ bool is_SVA_sequence_operator(const exprt &expr)
111111
id == ID_sva_sequence_intersect || id == ID_sva_sequence_first_match ||
112112
id == ID_sva_sequence_throughout || id == ID_sva_sequence_within ||
113113
id == ID_sva_sequence_goto_repetition ||
114-
id == ID_sva_sequence_consecutive_repetition ||
115114
id == ID_sva_sequence_non_consecutive_repetition ||
116115
id == ID_sva_sequence_repetition_star ||
117116
id == ID_sva_sequence_repetition_plus;

src/trans-word-level/sequence.cpp

+40-30
Original file line numberDiff line numberDiff line change
@@ -307,44 +307,54 @@ sequence_matchest instantiate_sequence(
307307

308308
return result;
309309
}
310-
else if(expr.id() == ID_sva_sequence_consecutive_repetition)
310+
else if(expr.id() == ID_sva_sequence_repetition_star)
311311
{
312-
// x[*n] is syntactic sugar for x ##1 ... ##1 x, with n repetitions
313-
auto &repetition = to_sva_sequence_consecutive_repetition_expr(expr);
314-
return instantiate_sequence(
315-
repetition.lower(), semantics, t, no_timeframes);
316-
}
317-
else if(
318-
expr.id() == ID_sva_sequence_repetition_plus ||
319-
expr.id() == ID_sva_sequence_repetition_star)
320-
{
321-
// x[+] and x[*]
322-
auto &op = to_unary_expr(expr).op();
312+
auto &repetition = to_sva_sequence_repetition_star_expr(expr);
313+
if(repetition.is_unbounded() && repetition.repetitions_given())
314+
{
315+
// [*x:$]
316+
auto from = numeric_cast_v<mp_integer>(repetition.from());
317+
auto &op = repetition.op();
323318

324-
// Is x a sequence or a state predicate?
325-
if(is_SVA_sequence_operator(op))
326-
PRECONDITION(false); // no support
319+
// Is op a sequence or a state predicate?
320+
if(is_SVA_sequence_operator(op))
321+
PRECONDITION(false); // no support
327322

328-
sequence_matchest result;
323+
sequence_matchest result;
329324

330-
// we incrementally add conjuncts to the condition
331-
exprt::operandst conjuncts;
325+
// we incrementally add conjuncts to the condition
326+
exprt::operandst conjuncts;
332327

333-
for(mp_integer u = t; u < no_timeframes; ++u)
334-
{
335-
// does x hold in state u?
336-
auto cond_u = instantiate(op, u, no_timeframes);
337-
conjuncts.push_back(cond_u);
338-
result.push_back({u, conjunction(conjuncts)});
339-
}
328+
for(mp_integer u = t; u < no_timeframes; ++u)
329+
{
330+
// does op hold in timeframe u?
331+
auto cond_u = instantiate(op, u, no_timeframes);
332+
conjuncts.push_back(cond_u);
340333

341-
// In addition to the above, x[*] allows an empty match.
342-
if(expr.id() == ID_sva_sequence_repetition_star)
343-
result.push_back({t, true_exprt{}});
334+
if(conjuncts.size() >= from)
335+
result.push_back({u, conjunction(conjuncts)});
336+
}
344337

345-
return result;
338+
// Empty match allowed?
339+
if(from == 0)
340+
result.push_back({t, true_exprt{}});
341+
342+
return result;
343+
}
344+
else
345+
{
346+
// [*], [*n], [*x:y]
347+
return instantiate_sequence(
348+
repetition.lower(), semantics, t, no_timeframes);
349+
}
350+
}
351+
else if(expr.id() == ID_sva_sequence_repetition_plus) // [+]
352+
{
353+
auto &repetition = to_sva_sequence_repetition_plus_expr(expr);
354+
return instantiate_sequence(
355+
repetition.lower(), semantics, t, no_timeframes);
346356
}
347-
else if(expr.id() == ID_sva_sequence_goto_repetition)
357+
else if(expr.id() == ID_sva_sequence_goto_repetition) // [->...]
348358
{
349359
// The 'op' is a Boolean condition, not a sequence.
350360
auto &op = to_sva_sequence_goto_repetition_expr(expr).op();

src/verilog/expr2verilog.cpp

+14-17
Original file line numberDiff line numberDiff line change
@@ -628,17 +628,20 @@ expr2verilogt::resultt expr2verilogt::convert_sva_sequence_repetition(
628628

629629
std::string dest = op.s + " [" + name;
630630

631-
if(expr.is_range())
631+
if(expr.repetitions_given())
632632
{
633-
dest += convert_rec(expr.from()).s;
633+
if(expr.is_range())
634+
{
635+
dest += convert_rec(expr.from()).s;
634636

635-
if(expr.is_unbounded())
636-
dest += ":$";
637+
if(expr.is_unbounded())
638+
dest += ":$";
639+
else
640+
dest += ":" + convert_rec(expr.to()).s;
641+
}
637642
else
638-
dest += ":" + convert_rec(expr.to()).s;
643+
dest += convert_rec(expr.repetitions()).s;
639644
}
640-
else
641-
dest += convert_rec(expr.repetitions()).s;
642645

643646
dest += ']';
644647

@@ -1848,23 +1851,17 @@ expr2verilogt::resultt expr2verilogt::convert_rec(const exprt &src)
18481851
return precedence = verilog_precedencet::MIN,
18491852
convert_sva_unary("always", to_sva_always_expr(src));
18501853

1851-
else if(src.id() == ID_sva_sequence_repetition_star)
1852-
return precedence = verilog_precedencet::MIN,
1853-
convert_sva_unary(to_unary_expr(src), "[*]");
1854-
// not sure about precedence
1855-
18561854
else if(src.id() == ID_sva_sequence_repetition_plus)
1857-
return precedence = verilog_precedencet::MIN,
1858-
convert_sva_unary(to_unary_expr(src), "[+]");
1859-
// not sure about precedence
1855+
return convert_sva_sequence_repetition(
1856+
"+", to_sva_sequence_repetition_plus_expr(src));
18601857

18611858
else if(src.id() == ID_sva_sequence_non_consecutive_repetition)
18621859
return convert_sva_sequence_repetition(
18631860
"=", to_sva_sequence_non_consecutive_repetition_expr(src));
18641861

1865-
else if(src.id() == ID_sva_sequence_consecutive_repetition)
1862+
else if(src.id() == ID_sva_sequence_repetition_star)
18661863
return convert_sva_sequence_repetition(
1867-
"*", to_sva_sequence_consecutive_repetition_expr(src));
1864+
"*", to_sva_sequence_repetition_star_expr(src));
18681865

18691866
else if(src.id() == ID_sva_sequence_goto_repetition)
18701867
return convert_sva_sequence_repetition(

src/verilog/parser.y

+7-3
Original file line numberDiff line numberDiff line change
@@ -2690,7 +2690,7 @@ sequence_abbrev:
26902690

26912691
consecutive_repetition:
26922692
"[*" const_or_range_expression ']'
2693-
{ init($$, ID_sva_sequence_consecutive_repetition);
2693+
{ init($$, ID_sva_sequence_repetition_star);
26942694
if(stack_expr($2).id() == ID_sva_cycle_delay)
26952695
swapop($$, $2);
26962696
else
@@ -2700,9 +2700,13 @@ consecutive_repetition:
27002700
}
27012701
}
27022702
| "[*" ']'
2703-
{ init($$, ID_sva_sequence_repetition_star); }
2703+
{ init($$, ID_sva_sequence_repetition_star);
2704+
stack_expr($$).add_to_operands(nil_exprt{}, nil_exprt{});
2705+
}
27042706
| "[+" ']'
2705-
{ init($$, ID_sva_sequence_repetition_plus); }
2707+
{ init($$, ID_sva_sequence_repetition_plus);
2708+
stack_expr($$).add_to_operands(nil_exprt{}, nil_exprt{});
2709+
}
27062710
;
27072711

27082712
non_consecutive_repetition:

src/verilog/sva_expr.cpp

+17-5
Original file line numberDiff line numberDiff line change
@@ -57,12 +57,25 @@ exprt sva_case_exprt::lowering() const
5757
disjunction(disjuncts), case_items.front().result(), reduced_rec};
5858
}
5959

60-
exprt sva_sequence_consecutive_repetition_exprt::lower() const
60+
exprt sva_sequence_repetition_plus_exprt::lower() const
61+
{
62+
// [+] is the same as [*1:$]
63+
return sva_sequence_repetition_star_exprt{
64+
op(), from_integer(1, integer_typet{}), infinity_exprt{integer_typet{}}};
65+
}
66+
67+
exprt sva_sequence_repetition_star_exprt::lower() const
6168
{
6269
PRECONDITION(
6370
op().type().id() == ID_bool || op().type().id() == ID_verilog_sva_sequence);
6471

65-
if(!is_range())
72+
if(!repetitions_given())
73+
{
74+
// op[*] is the same as op[*0:$]
75+
return sva_sequence_repetition_star_exprt{
76+
op(), from_integer(0, integer_typet{}), infinity_exprt{integer_typet{}}};
77+
}
78+
else if(!is_range())
6679
{
6780
// expand x[*n] into x ##1 x ##1 ...
6881
auto n = numeric_cast_v<mp_integer>(repetitions());
@@ -94,14 +107,13 @@ exprt sva_sequence_consecutive_repetition_exprt::lower() const
94107
DATA_INVARIANT(
95108
to_int >= from_int, "number of repetitions must be interval");
96109

97-
exprt result = sva_sequence_consecutive_repetition_exprt{op(), from()};
110+
exprt result = sva_sequence_repetition_star_exprt{op(), from()};
98111

99112
for(mp_integer n = from_int + 1; n <= to_int; ++n)
100113
{
101114
auto n_expr = from_integer(n, integer_typet{});
102115
result = sva_or_exprt{
103-
std::move(result),
104-
sva_sequence_consecutive_repetition_exprt{op(), n_expr}};
116+
std::move(result), sva_sequence_repetition_star_exprt{op(), n_expr}};
105117
}
106118

107119
return result;

0 commit comments

Comments
 (0)