@@ -213,24 +213,22 @@ static obligationst property_obligations_rec(
213
213
const auto &eventually_expr = to_sva_eventually_expr (property_expr);
214
214
const auto &op = eventually_expr.op ();
215
215
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 ());
219
217
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 ))
222
220
throw " failed to convert sva_eventually index" ;
223
221
224
222
// We rely on NNF.
225
- if (current + lower >= no_timeframes || current + upper >= no_timeframes)
223
+ if (current + from >= no_timeframes || current + to >= no_timeframes)
226
224
{
227
225
DATA_INVARIANT (no_timeframes != 0 , " must have timeframe" );
228
226
return obligationst{no_timeframes - 1 , true_exprt ()};
229
227
}
230
228
231
229
exprt::operandst disjuncts = {};
232
230
233
- for (mp_integer u = current + lower ; u <= current + upper ; ++u)
231
+ for (mp_integer u = current + from ; u <= current + to ; ++u)
234
232
{
235
233
auto obligations_rec = property_obligations_rec (op, u, no_timeframes);
236
234
disjuncts.push_back (obligations_rec.conjunction ().second );
@@ -283,29 +281,24 @@ static obligationst property_obligations_rec(
283
281
}
284
282
else if (property_expr.id () == ID_sva_ranged_s_eventually)
285
283
{
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 ());
289
286
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 )
295
288
throw ebmc_errort () << " SVA s_eventually from index must not be negative" ;
296
289
297
- auto from = std::min (no_timeframes - 1 , current + *from_opt );
290
+ from = std::min (no_timeframes - 1 , current + from );
298
291
299
292
mp_integer to;
300
293
301
- if (upper. id () == ID_infinity )
294
+ if (s_eventually. is_unbounded () )
302
295
{
303
296
throw ebmc_errort ()
304
297
<< " failed to convert SVA s_eventually to index (infinity)" ;
305
298
}
306
299
else
307
300
{
308
- auto to_opt = numeric_cast<mp_integer>(upper );
301
+ auto to_opt = numeric_cast<mp_integer>(s_eventually. to () );
309
302
if (!to_opt.has_value ())
310
303
throw ebmc_errort () << " failed to convert SVA s_eventually to index" ;
311
304
to = std::min (current + *to_opt, no_timeframes - 1 );
@@ -316,7 +309,8 @@ static obligationst property_obligations_rec(
316
309
317
310
for (mp_integer c = from; c <= to; ++c)
318
311
{
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 ();
320
314
time = std::max (time, tmp.first );
321
315
disjuncts.push_back (tmp.second );
322
316
}
@@ -330,14 +324,14 @@ static obligationst property_obligations_rec(
330
324
auto &phi = property_expr.id () == ID_sva_ranged_always
331
325
? to_sva_ranged_always_expr (property_expr).op ()
332
326
: 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 );
341
335
if (!from_opt.has_value ())
342
336
throw ebmc_errort () << " failed to convert SVA always from index" ;
343
337
@@ -348,13 +342,13 @@ static obligationst property_obligations_rec(
348
342
349
343
mp_integer to;
350
344
351
- if (upper .id () == ID_infinity)
345
+ if (to_expr .id () == ID_infinity)
352
346
{
353
347
to = no_timeframes - 1 ;
354
348
}
355
349
else
356
350
{
357
- auto to_opt = numeric_cast<mp_integer>(upper );
351
+ auto to_opt = numeric_cast<mp_integer>(to_expr );
358
352
if (!to_opt.has_value ())
359
353
throw ebmc_errort () << " failed to convert SVA always to index" ;
360
354
to = std::min (current + *to_opt, no_timeframes - 1 );
0 commit comments