Skip to content

Commit 0762b44

Browse files
committed
SVA: use from/to instead of lower/upper
This changes the names of methods and variables for the two end-points of SVA predicate ranges to read "from" for the first endpoint, and "to" for the second, instead of "lower" and "upper". This avoids a collision with the term "lower" for "lowering".
1 parent b97a3e7 commit 0762b44

File tree

9 files changed

+94
-106
lines changed

9 files changed

+94
-106
lines changed

src/ebmc/completeness_threshold.cpp

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,12 @@ bool has_low_completeness_threshold(const exprt &expr)
3939
auto &always_expr = to_sva_ranged_always_expr(expr);
4040
if(has_temporal_operator(always_expr.op()))
4141
return false;
42-
else if(always_expr.upper().is_constant())
42+
else if(always_expr.to().is_constant())
4343
{
44-
auto lower_int = numeric_cast_v<mp_integer>(always_expr.lower());
45-
auto upper_int =
46-
numeric_cast_v<mp_integer>(to_constant_expr(always_expr.upper()));
47-
return lower_int >= 0 && lower_int <= 1 && upper_int >= 0 &&
48-
upper_int <= 1;
44+
auto from_int = numeric_cast_v<mp_integer>(always_expr.from());
45+
auto to_int =
46+
numeric_cast_v<mp_integer>(to_constant_expr(always_expr.to()));
47+
return from_int >= 0 && from_int <= 1 && to_int >= 0 && to_int <= 1;
4948
}
5049
else
5150
return false;
@@ -57,10 +56,9 @@ bool has_low_completeness_threshold(const exprt &expr)
5756
return false;
5857
else
5958
{
60-
auto lower_int = numeric_cast_v<mp_integer>(s_always_expr.lower());
61-
auto upper_int = numeric_cast_v<mp_integer>(s_always_expr.upper());
62-
return lower_int >= 0 && lower_int <= 1 && upper_int >= 0 &&
63-
upper_int <= 1;
59+
auto from_int = numeric_cast_v<mp_integer>(s_always_expr.from());
60+
auto to_int = numeric_cast_v<mp_integer>(s_always_expr.to());
61+
return from_int >= 0 && from_int <= 1 && to_int >= 0 && to_int <= 1;
6462
}
6563
}
6664
else if(

src/temporal-logic/ltl_sva_to_string.cpp

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -161,16 +161,16 @@ ltl_sva_to_stringt::rec(const exprt &expr, modet mode)
161161
{
162162
auto &always = to_sva_ranged_always_expr(expr);
163163
auto new_expr = unary_exprt{ID_sva_ranged_always, always.op()};
164-
auto lower = numeric_cast_v<mp_integer>(always.lower());
164+
auto from = numeric_cast_v<mp_integer>(always.from());
165165
if(!always.is_range())
166-
return prefix("F[" + integer2string(lower) + "]", new_expr, mode);
166+
return prefix("F[" + integer2string(from) + "]", new_expr, mode);
167167
else if(always.is_unbounded())
168-
return prefix("F[" + integer2string(lower) + ":]", new_expr, mode);
168+
return prefix("F[" + integer2string(from) + ":]", new_expr, mode);
169169
else
170170
{
171-
auto upper = numeric_cast_v<mp_integer>(to_constant_expr(always.upper()));
171+
auto to = numeric_cast_v<mp_integer>(to_constant_expr(always.to()));
172172
return prefix(
173-
"F[" + integer2string(lower) + ":" + integer2string(upper) + "]",
173+
"F[" + integer2string(from) + ":" + integer2string(to) + "]",
174174
new_expr,
175175
mode);
176176
}
@@ -189,17 +189,16 @@ ltl_sva_to_stringt::rec(const exprt &expr, modet mode)
189189
PRECONDITION(mode == PROPERTY);
190190
auto &s_eventually = to_sva_ranged_s_eventually_expr(expr);
191191
auto new_expr = unary_exprt{ID_sva_ranged_s_eventually, s_eventually.op()};
192-
auto lower = numeric_cast_v<mp_integer>(s_eventually.lower());
192+
auto from = numeric_cast_v<mp_integer>(s_eventually.from());
193193
if(!s_eventually.is_range())
194-
return prefix("F[" + integer2string(lower) + "]", new_expr, mode);
194+
return prefix("F[" + integer2string(from) + "]", new_expr, mode);
195195
else if(s_eventually.is_unbounded())
196-
return prefix("F[" + integer2string(lower) + ":]", new_expr, mode);
196+
return prefix("F[" + integer2string(from) + ":]", new_expr, mode);
197197
else
198198
{
199-
auto upper =
200-
numeric_cast_v<mp_integer>(to_constant_expr(s_eventually.upper()));
199+
auto to = numeric_cast_v<mp_integer>(to_constant_expr(s_eventually.to()));
201200
return prefix(
202-
"F[" + integer2string(lower) + ":" + integer2string(upper) + "]",
201+
"F[" + integer2string(from) + ":" + integer2string(to) + "]",
203202
new_expr,
204203
mode);
205204
}

src/temporal-logic/nnf.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,14 +79,14 @@ std::optional<exprt> negate_property_node(const exprt &expr)
7979
// not always [x:y] p --> s_eventually [x:y] not p
8080
auto &always = to_sva_ranged_always_expr(expr);
8181
return sva_ranged_s_eventually_exprt{
82-
always.lower(), always.upper(), not_exprt{always.op()}};
82+
always.from(), always.to(), not_exprt{always.op()}};
8383
}
8484
else if(expr.id() == ID_sva_s_always)
8585
{
8686
// not s_always [x:y] p --> eventually [x:y] not p
8787
auto &s_always = to_sva_s_always_expr(expr);
8888
return sva_eventually_exprt{
89-
s_always.lower(), s_always.upper(), not_exprt{s_always.op()}};
89+
s_always.from(), s_always.to(), not_exprt{s_always.op()}};
9090
}
9191
else if(expr.id() == ID_sva_s_eventually)
9292
{
@@ -98,7 +98,7 @@ std::optional<exprt> negate_property_node(const exprt &expr)
9898
// not eventually[i:j] p --> s_always[i:j] not p
9999
auto &eventually = to_sva_eventually_expr(expr);
100100
return sva_s_always_exprt{
101-
eventually.lower(), eventually.upper(), not_exprt{eventually.op()}};
101+
eventually.from(), eventually.to(), not_exprt{eventually.op()}};
102102
}
103103
else if(expr.id() == ID_sva_until)
104104
{

src/temporal-logic/sva_to_ltl.cpp

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -57,28 +57,28 @@ std::optional<exprt> SVA_to_LTL(exprt expr)
5757
if(rec.has_value())
5858
{
5959
// always [l:u] op ---> X ... X (op ∧ X op ∧ ... ∧ X ... X op)
60-
auto lower_int = numeric_cast_v<mp_integer>(ranged_always.lower());
60+
auto from_int = numeric_cast_v<mp_integer>(ranged_always.from());
6161

6262
// Is there an upper end of the range?
63-
if(ranged_always.upper().is_constant())
63+
if(ranged_always.to().is_constant())
6464
{
6565
// upper end set
66-
auto upper_int =
67-
numeric_cast_v<mp_integer>(to_constant_expr(ranged_always.upper()));
68-
PRECONDITION(upper_int >= lower_int);
69-
auto diff = upper_int - lower_int;
66+
auto to_int =
67+
numeric_cast_v<mp_integer>(to_constant_expr(ranged_always.to()));
68+
PRECONDITION(to_int >= from_int);
69+
auto diff = to_int - from_int;
7070

7171
exprt::operandst conjuncts;
7272

7373
for(auto i = 0; i <= diff; i++)
7474
conjuncts.push_back(n_Xes(i, rec.value()));
7575

76-
return n_Xes(lower_int, conjunction(conjuncts));
76+
return n_Xes(from_int, conjunction(conjuncts));
7777
}
78-
else if(ranged_always.upper().id() == ID_infinity)
78+
else if(ranged_always.to().id() == ID_infinity)
7979
{
8080
// always [l:$] op ---> X ... X G op
81-
return n_Xes(lower_int, G_exprt{rec.value()});
81+
return n_Xes(from_int, G_exprt{rec.value()});
8282
}
8383
else
8484
PRECONDITION(false);
@@ -93,17 +93,17 @@ std::optional<exprt> SVA_to_LTL(exprt expr)
9393
if(rec.has_value())
9494
{
9595
// s_always [l:u] op ---> X ... X (op ∧ X op ∧ ... ∧ X ... X op)
96-
auto lower_int = numeric_cast_v<mp_integer>(ranged_always.lower());
97-
auto upper_int = numeric_cast_v<mp_integer>(ranged_always.upper());
98-
PRECONDITION(upper_int >= lower_int);
99-
auto diff = upper_int - lower_int;
96+
auto from_int = numeric_cast_v<mp_integer>(ranged_always.from());
97+
auto to_int = numeric_cast_v<mp_integer>(ranged_always.to());
98+
PRECONDITION(to_int >= from_int);
99+
auto diff = to_int - from_int;
100100

101101
exprt::operandst conjuncts;
102102

103103
for(auto i = 0; i <= diff; i++)
104104
conjuncts.push_back(n_Xes(i, rec.value()));
105105

106-
return n_Xes(lower_int, conjunction(conjuncts));
106+
return n_Xes(from_int, conjunction(conjuncts));
107107
}
108108
else
109109
return {};

src/temporal-logic/trivial_sva.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ exprt trivial_sva(exprt expr)
113113
}
114114
else if(expr.id() == ID_sva_case)
115115
{
116-
expr = to_sva_case_expr(expr).lowering();
116+
expr = to_sva_case_expr(expr).lower();
117117
}
118118

119119
// rewrite the operands, recursively

src/trans-word-level/property.cpp

Lines changed: 23 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -213,24 +213,22 @@ static obligationst property_obligations_rec(
213213
const auto &eventually_expr = to_sva_eventually_expr(property_expr);
214214
const auto &op = eventually_expr.op();
215215

216-
mp_integer lower;
217-
if(to_integer_non_constant(eventually_expr.lower(), lower))
218-
throw "failed to convert sva_eventually index";
216+
mp_integer from = numeric_cast_v<mp_integer>(eventually_expr.from());
219217

220-
mp_integer upper;
221-
if(to_integer_non_constant(eventually_expr.upper(), upper))
218+
mp_integer to;
219+
if(to_integer_non_constant(eventually_expr.to(), to))
222220
throw "failed to convert sva_eventually index";
223221

224222
// We rely on NNF.
225-
if(current + lower >= no_timeframes || current + upper >= no_timeframes)
223+
if(current + from >= no_timeframes || current + to >= no_timeframes)
226224
{
227225
DATA_INVARIANT(no_timeframes != 0, "must have timeframe");
228226
return obligationst{no_timeframes - 1, true_exprt()};
229227
}
230228

231229
exprt::operandst disjuncts = {};
232230

233-
for(mp_integer u = current + lower; u <= current + upper; ++u)
231+
for(mp_integer u = current + from; u <= current + to; ++u)
234232
{
235233
auto obligations_rec = property_obligations_rec(op, u, no_timeframes);
236234
disjuncts.push_back(obligations_rec.conjunction().second);
@@ -283,29 +281,24 @@ static obligationst property_obligations_rec(
283281
}
284282
else if(property_expr.id() == ID_sva_ranged_s_eventually)
285283
{
286-
auto &phi = to_sva_ranged_s_eventually_expr(property_expr).op();
287-
auto &lower = to_sva_ranged_s_eventually_expr(property_expr).lower();
288-
auto &upper = to_sva_ranged_s_eventually_expr(property_expr).upper();
284+
const auto &s_eventually = to_sva_ranged_s_eventually_expr(property_expr);
285+
auto from = numeric_cast_v<mp_integer>(s_eventually.from());
289286

290-
auto from_opt = numeric_cast<mp_integer>(lower);
291-
if(!from_opt.has_value())
292-
throw ebmc_errort() << "failed to convert SVA s_eventually from index";
293-
294-
if(*from_opt < 0)
287+
if(from < 0)
295288
throw ebmc_errort() << "SVA s_eventually from index must not be negative";
296289

297-
auto from = std::min(no_timeframes - 1, current + *from_opt);
290+
from = std::min(no_timeframes - 1, current + from);
298291

299292
mp_integer to;
300293

301-
if(upper.id() == ID_infinity)
294+
if(s_eventually.is_unbounded())
302295
{
303296
throw ebmc_errort()
304297
<< "failed to convert SVA s_eventually to index (infinity)";
305298
}
306299
else
307300
{
308-
auto to_opt = numeric_cast<mp_integer>(upper);
301+
auto to_opt = numeric_cast<mp_integer>(s_eventually.to());
309302
if(!to_opt.has_value())
310303
throw ebmc_errort() << "failed to convert SVA s_eventually to index";
311304
to = std::min(current + *to_opt, no_timeframes - 1);
@@ -316,7 +309,8 @@ static obligationst property_obligations_rec(
316309

317310
for(mp_integer c = from; c <= to; ++c)
318311
{
319-
auto tmp = property_obligations_rec(phi, c, no_timeframes).conjunction();
312+
auto tmp = property_obligations_rec(s_eventually.op(), c, no_timeframes)
313+
.conjunction();
320314
time = std::max(time, tmp.first);
321315
disjuncts.push_back(tmp.second);
322316
}
@@ -330,14 +324,14 @@ static obligationst property_obligations_rec(
330324
auto &phi = property_expr.id() == ID_sva_ranged_always
331325
? to_sva_ranged_always_expr(property_expr).op()
332326
: to_sva_s_always_expr(property_expr).op();
333-
auto &lower = property_expr.id() == ID_sva_ranged_always
334-
? to_sva_ranged_always_expr(property_expr).lower()
335-
: to_sva_s_always_expr(property_expr).lower();
336-
auto &upper = property_expr.id() == ID_sva_ranged_always
337-
? to_sva_ranged_always_expr(property_expr).upper()
338-
: to_sva_s_always_expr(property_expr).upper();
339-
340-
auto from_opt = numeric_cast<mp_integer>(lower);
327+
auto &from_expr = property_expr.id() == ID_sva_ranged_always
328+
? to_sva_ranged_always_expr(property_expr).from()
329+
: to_sva_s_always_expr(property_expr).from();
330+
auto &to_expr = property_expr.id() == ID_sva_ranged_always
331+
? to_sva_ranged_always_expr(property_expr).to()
332+
: to_sva_s_always_expr(property_expr).to();
333+
334+
auto from_opt = numeric_cast<mp_integer>(from_expr);
341335
if(!from_opt.has_value())
342336
throw ebmc_errort() << "failed to convert SVA always from index";
343337

@@ -348,13 +342,13 @@ static obligationst property_obligations_rec(
348342

349343
mp_integer to;
350344

351-
if(upper.id() == ID_infinity)
345+
if(to_expr.id() == ID_infinity)
352346
{
353347
to = no_timeframes - 1;
354348
}
355349
else
356350
{
357-
auto to_opt = numeric_cast<mp_integer>(upper);
351+
auto to_opt = numeric_cast<mp_integer>(to_expr);
358352
if(!to_opt.has_value())
359353
throw ebmc_errort() << "failed to convert SVA always to index";
360354
to = std::min(current + *to_opt, no_timeframes - 1);

src/verilog/expr2verilog.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -460,11 +460,11 @@ expr2verilogt::resultt expr2verilogt::convert_sva_ranged_predicate(
460460
{
461461
std::string range_str;
462462

463-
range_str = "[" + convert(src.lower()) + ':';
464-
if(src.upper().id() == ID_infinity)
463+
range_str = "[" + convert(src.from()) + ':';
464+
if(src.is_unbounded())
465465
range_str += "$";
466466
else
467-
range_str += convert(src.upper());
467+
range_str += convert(src.to());
468468
range_str += "] ";
469469

470470
auto &src_op = src.op();

src/verilog/sva_expr.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ exprt sva_cycle_delay_star_exprt::lower() const
2929
op()};
3030
}
3131

32-
exprt sva_case_exprt::lowering() const
32+
exprt sva_case_exprt::lower() const
3333
{
3434
auto &case_items = this->case_items();
3535

@@ -51,7 +51,7 @@ exprt sva_case_exprt::lowering() const
5151
reduced.case_items().erase(reduced.case_items().begin());
5252

5353
// rec. call
54-
auto reduced_rec = reduced.lowering();
54+
auto reduced_rec = reduced.lower();
5555

5656
return if_exprt{
5757
disjunction(disjuncts), case_items.front().result(), reduced_rec};

0 commit comments

Comments
 (0)