@@ -170,6 +170,129 @@ static inline sva_always_exprt &to_sva_always_expr(exprt &expr)
170
170
return static_cast <sva_always_exprt &>(expr);
171
171
}
172
172
173
+ class sva_ranged_always_exprt : public binary_predicate_exprt
174
+ {
175
+ public:
176
+ explicit sva_ranged_always_exprt (binary_exprt range, exprt op)
177
+ : binary_predicate_exprt(std::move(range), ID_sva_always, std::move(op))
178
+ {
179
+ }
180
+
181
+ // These come with a range, which is binary
182
+ const binary_exprt &range () const
183
+ {
184
+ return static_cast <const binary_exprt &>(op0 ());
185
+ }
186
+
187
+ binary_exprt &range ()
188
+ {
189
+ return static_cast <binary_exprt &>(op0 ());
190
+ }
191
+
192
+ const exprt &op () const
193
+ {
194
+ return op1 ();
195
+ }
196
+
197
+ exprt &op ()
198
+ {
199
+ return op1 ();
200
+ }
201
+
202
+ const exprt &lhs () const = delete;
203
+ exprt &lhs () = delete;
204
+ const exprt &rhs () const = delete;
205
+ exprt &rhs () = delete;
206
+
207
+ static void check (
208
+ const exprt &expr,
209
+ const validation_modet vm = validation_modet::INVARIANT)
210
+ {
211
+ binary_exprt::check (expr, vm);
212
+ binary_exprt::check (to_binary_expr (expr).op0 (), vm);
213
+ }
214
+
215
+ protected:
216
+ using binary_predicate_exprt::op0;
217
+ using binary_predicate_exprt::op1;
218
+ };
219
+
220
+ static inline const sva_ranged_always_exprt &
221
+ to_sva_ranged_always_expr (const exprt &expr)
222
+ {
223
+ PRECONDITION (expr.id () == ID_sva_ranged_always);
224
+ sva_ranged_always_exprt::check (expr, validation_modet::INVARIANT);
225
+ return static_cast <const sva_ranged_always_exprt &>(expr);
226
+ }
227
+
228
+ static inline sva_ranged_always_exprt &to_sva_ranged_always_expr (exprt &expr)
229
+ {
230
+ PRECONDITION (expr.id () == ID_sva_ranged_always);
231
+ sva_ranged_always_exprt::check (expr, validation_modet::INVARIANT);
232
+ return static_cast <sva_ranged_always_exprt &>(expr);
233
+ }
234
+
235
+ class sva_s_always_exprt : public binary_predicate_exprt
236
+ {
237
+ public:
238
+ explicit sva_s_always_exprt (binary_exprt range, exprt op)
239
+ : binary_predicate_exprt(std::move(range), ID_sva_s_always, std::move(op))
240
+ {
241
+ }
242
+
243
+ // These come with a range, which is binary
244
+ const binary_exprt &range () const
245
+ {
246
+ return static_cast <const binary_exprt &>(op0 ());
247
+ }
248
+
249
+ binary_exprt &range ()
250
+ {
251
+ return static_cast <binary_exprt &>(op0 ());
252
+ }
253
+
254
+ const exprt &op () const
255
+ {
256
+ return op1 ();
257
+ }
258
+
259
+ exprt &op ()
260
+ {
261
+ return op1 ();
262
+ }
263
+
264
+ const exprt &lhs () const = delete;
265
+ exprt &lhs () = delete;
266
+ const exprt &rhs () const = delete;
267
+ exprt &rhs () = delete;
268
+
269
+ static void check (
270
+ const exprt &expr,
271
+ const validation_modet vm = validation_modet::INVARIANT)
272
+ {
273
+ binary_exprt::check (expr, vm);
274
+ binary_exprt::check (to_binary_expr (expr).op0 (), vm);
275
+ }
276
+
277
+ protected:
278
+ using binary_predicate_exprt::op0;
279
+ using binary_predicate_exprt::op1;
280
+ };
281
+
282
+ static inline const sva_s_always_exprt &to_sva_s_always_expr (const exprt &expr)
283
+ {
284
+ PRECONDITION (expr.id () == ID_sva_s_always);
285
+ sva_s_always_exprt::check (expr, validation_modet::INVARIANT);
286
+ return static_cast <const sva_s_always_exprt &>(expr);
287
+ }
288
+
289
+ static inline sva_s_always_exprt &to_sva_s_always_expr (exprt &expr)
290
+ {
291
+ PRECONDITION (expr.id () == ID_sva_s_always);
292
+ sva_s_always_exprt::check (expr, validation_modet::INVARIANT);
293
+ return static_cast <sva_s_always_exprt &>(expr);
294
+ }
295
+
173
296
class sva_cover_exprt : public unary_predicate_exprt
174
297
{
175
298
public:
0 commit comments