@@ -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 );
0 commit comments