@@ -170,6 +170,129 @@ static inline sva_always_exprt &to_sva_always_expr(exprt &expr)
170170 return static_cast <sva_always_exprt &>(expr);
171171}
172172
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+
173296class sva_cover_exprt : public unary_predicate_exprt
174297{
175298public:
0 commit comments