@@ -137,22 +137,22 @@ static inline sva_s_nexttime_exprt &to_sva_s_nexttime_expr(exprt &expr)
137
137
class sva_indexed_nexttime_exprt : public binary_predicate_exprt
138
138
{
139
139
public:
140
- sva_indexed_nexttime_exprt (exprt index, exprt op)
140
+ sva_indexed_nexttime_exprt (constant_exprt index, exprt op)
141
141
: binary_predicate_exprt(
142
142
std::move (index),
143
143
ID_sva_indexed_nexttime,
144
144
std::move(op))
145
145
{
146
146
}
147
147
148
- const exprt &index () const
148
+ const constant_exprt &index () const
149
149
{
150
- return op0 ();
150
+ return static_cast < const constant_exprt &>( op0 () );
151
151
}
152
152
153
- exprt &index ()
153
+ constant_exprt &index ()
154
154
{
155
- return op0 ();
155
+ return static_cast <constant_exprt &>( op0 () );
156
156
}
157
157
158
158
const exprt &op () const
@@ -190,22 +190,22 @@ to_sva_indexed_nexttime_expr(exprt &expr)
190
190
class sva_indexed_s_nexttime_exprt : public binary_predicate_exprt
191
191
{
192
192
public:
193
- sva_indexed_s_nexttime_exprt (exprt index, exprt op)
193
+ sva_indexed_s_nexttime_exprt (constant_exprt index, exprt op)
194
194
: binary_predicate_exprt(
195
195
std::move (index),
196
196
ID_sva_indexed_s_nexttime,
197
197
std::move(op))
198
198
{
199
199
}
200
200
201
- const exprt &index () const
201
+ const constant_exprt &index () const
202
202
{
203
- return op0 ();
203
+ return static_cast < const constant_exprt &>( op0 () );
204
204
}
205
205
206
- exprt &index ()
206
+ constant_exprt &index ()
207
207
{
208
- return op0 ();
208
+ return static_cast <constant_exprt &>( op0 () );
209
209
}
210
210
211
211
const exprt &op () const
@@ -239,31 +239,34 @@ to_sva_indexed_s_nexttime_expr(exprt &expr)
239
239
return static_cast <sva_indexed_s_nexttime_exprt &>(expr);
240
240
}
241
241
242
+ // / For ranged SVA operators. The lower bound must be a constant
243
+ // / post elaboration. The upper end need not be bounded,
244
+ // / i.e., given as $
242
245
class sva_ranged_predicate_exprt : public ternary_exprt
243
246
{
244
247
public:
245
248
sva_ranged_predicate_exprt (
246
249
irep_idt __id,
247
- exprt __lower,
250
+ constant_exprt __lower,
248
251
exprt __upper,
249
252
exprt __op)
250
253
: ternary_exprt(
251
254
__id,
252
255
std::move (__lower),
253
256
std::move(__upper),
254
257
std::move(__op),
255
- bool_typet() )
258
+ bool_typet{} )
256
259
{
257
260
}
258
261
259
- const exprt &lower () const
262
+ const constant_exprt &lower () const
260
263
{
261
- return op0 ();
264
+ return static_cast < const constant_exprt &>( op0 () );
262
265
}
263
266
264
- exprt &lower ()
267
+ constant_exprt &lower ()
265
268
{
266
- return op0 ();
269
+ return static_cast <constant_exprt &>( op0 () );
267
270
}
268
271
269
272
const exprt &upper () const
@@ -292,11 +295,44 @@ class sva_ranged_predicate_exprt : public ternary_exprt
292
295
using ternary_exprt::op2;
293
296
};
294
297
295
- class sva_eventually_exprt : public sva_ranged_predicate_exprt
298
+ // / A specialisation of sva_ranged_predicate_exprt where both bounds
299
+ // / are constants.
300
+ class sva_bounded_range_predicate_exprt : public sva_ranged_predicate_exprt
296
301
{
297
302
public:
298
- sva_eventually_exprt (exprt __lower, exprt __upper, exprt __op)
303
+ sva_bounded_range_predicate_exprt (
304
+ irep_idt __id,
305
+ constant_exprt __lower,
306
+ constant_exprt __upper,
307
+ exprt __op)
299
308
: sva_ranged_predicate_exprt(
309
+ __id,
310
+ std::move (__lower),
311
+ std::move(__upper),
312
+ std::move(__op))
313
+ {
314
+ }
315
+
316
+ const constant_exprt &upper () const
317
+ {
318
+ return static_cast <const constant_exprt &>(
319
+ sva_ranged_predicate_exprt::upper ());
320
+ }
321
+
322
+ constant_exprt &upper ()
323
+ {
324
+ return static_cast <constant_exprt &>(sva_ranged_predicate_exprt::upper ());
325
+ }
326
+ };
327
+
328
+ class sva_eventually_exprt : public sva_bounded_range_predicate_exprt
329
+ {
330
+ public:
331
+ sva_eventually_exprt (
332
+ constant_exprt __lower,
333
+ constant_exprt __upper,
334
+ exprt __op)
335
+ : sva_bounded_range_predicate_exprt(
300
336
ID_sva_eventually,
301
337
std::move (__lower),
302
338
std::move(__upper),
@@ -347,7 +383,10 @@ static inline sva_s_eventually_exprt &to_sva_s_eventually_expr(exprt &expr)
347
383
class sva_ranged_s_eventually_exprt : public sva_ranged_predicate_exprt
348
384
{
349
385
public:
350
- explicit sva_ranged_s_eventually_exprt (exprt lower, exprt upper, exprt op)
386
+ explicit sva_ranged_s_eventually_exprt (
387
+ constant_exprt lower,
388
+ exprt upper,
389
+ exprt op)
351
390
: sva_ranged_predicate_exprt(
352
391
ID_sva_ranged_s_eventually,
353
392
std::move (lower),
@@ -399,7 +438,7 @@ static inline sva_always_exprt &to_sva_always_expr(exprt &expr)
399
438
class sva_ranged_always_exprt : public sva_ranged_predicate_exprt
400
439
{
401
440
public:
402
- sva_ranged_always_exprt (exprt lower, exprt upper, exprt op)
441
+ sva_ranged_always_exprt (constant_exprt lower, exprt upper, exprt op)
403
442
: sva_ranged_predicate_exprt(
404
443
ID_sva_ranged_always,
405
444
std::move (lower),
@@ -424,11 +463,11 @@ static inline sva_ranged_always_exprt &to_sva_ranged_always_expr(exprt &expr)
424
463
return static_cast <sva_ranged_always_exprt &>(expr);
425
464
}
426
465
427
- class sva_s_always_exprt : public sva_ranged_predicate_exprt
466
+ class sva_s_always_exprt : public sva_bounded_range_predicate_exprt
428
467
{
429
468
public:
430
- sva_s_always_exprt (exprt lower, exprt upper, exprt op)
431
- : sva_ranged_predicate_exprt (
469
+ sva_s_always_exprt (constant_exprt lower, constant_exprt upper, exprt op)
470
+ : sva_bounded_range_predicate_exprt (
432
471
ID_sva_s_always,
433
472
std::move (lower),
434
473
std::move(upper),
@@ -841,7 +880,8 @@ static inline sva_followed_by_exprt &to_sva_followed_by_expr(exprt &expr)
841
880
class sva_cycle_delay_exprt : public ternary_exprt
842
881
{
843
882
public:
844
- sva_cycle_delay_exprt (exprt from, exprt to, exprt op)
883
+ // / The upper bound may be $
884
+ sva_cycle_delay_exprt (constant_exprt from, exprt to, exprt op)
845
885
: ternary_exprt(
846
886
ID_sva_cycle_delay,
847
887
std::move (from),
@@ -851,7 +891,7 @@ class sva_cycle_delay_exprt : public ternary_exprt
851
891
{
852
892
}
853
893
854
- sva_cycle_delay_exprt (exprt cycles, exprt op)
894
+ sva_cycle_delay_exprt (constant_exprt cycles, exprt op)
855
895
: ternary_exprt(
856
896
ID_sva_cycle_delay,
857
897
std::move (cycles),
@@ -861,14 +901,14 @@ class sva_cycle_delay_exprt : public ternary_exprt
861
901
{
862
902
}
863
903
864
- const exprt &from () const
904
+ const constant_exprt &from () const
865
905
{
866
- return op0 ();
906
+ return static_cast < const constant_exprt &>( op0 () );
867
907
}
868
908
869
- exprt &from ()
909
+ constant_exprt &from ()
870
910
{
871
- return op0 ();
911
+ return static_cast <constant_exprt &>( op0 () );
872
912
}
873
913
874
914
// may be nil (just the singleton 'from') or
0 commit comments