rustproof_libsmt/logics/
qf_abv.rs1use std::fmt;
2
3use theories::{array_ex, bitvec, core};
4use backends::backend::{Logic, SMTNode};
5
6define_sorts_for_logic!(QF_ABV_Sorts,
7 BV -> bitvec::Sorts,
8 Core -> core::Sorts,
9 ArrayEx -> array_ex::Sorts<QF_ABV_Sorts, QF_ABV_Sorts>
10 );
11
12define_fns_for_logic!(QF_ABV_Fn,
13 BVOps -> bitvec::OpCodes,
14 CoreOps -> core::OpCodes,
15 ArrayOps -> array_ex::OpCodes<QF_ABV_Sorts, QF_ABV_Sorts, QF_ABV_Fn>
16 );
17
18define_logic!(QF_ABV,
19 QF_ABV_Fn,
20 QF_ABV_Sorts,
21 map { QF_ABV_Sorts::BV(_) => bitvec::OpCodes::FreeVar,
22 QF_ABV_Sorts::ArrayEx(_) => array_ex::OpCodes::FreeVar
23 }
24 );
25
26
27pub fn array_sort<T: Into<QF_ABV_Sorts>, P: Into<QF_ABV_Sorts>>(idx: T, data: P) -> QF_ABV_Sorts {
29 QF_ABV_Sorts::ArrayEx(array_ex::Sorts::new(idx.into(), data.into()))
30}
31
32pub fn bv_sort(size: usize) -> QF_ABV_Sorts {
33 QF_ABV_Sorts::BV(bitvec::Sorts::BitVector(size))
34}
35
36pub fn bv_const(val: u64, size: usize) -> QF_ABV_Fn {
37 QF_ABV_Fn::BVOps(bitvec::OpCodes::Const(val, size))
38}
39
40pub fn array_const<T, P, Q>(idx_ty: T, val_ty: P, val: Q) -> QF_ABV_Fn
41 where T: Into<QF_ABV_Sorts>,
42 P: Into<QF_ABV_Sorts>,
43 Q: Into<QF_ABV_Fn>
44{
45 let arr_ty = array_ex::Sorts::Array(Box::new(idx_ty.into()), Box::new(val_ty.into()));
46 let arr_const = array_ex::OpCodes::Const(arr_ty, Box::new(val.into()));
47 QF_ABV_Fn::ArrayOps(arr_const)
48}