#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct Sort {
pub width: u32,
}
impl Sort {
pub const fn new(width: u32) -> Self {
Self { width }
}
}
#[derive(Clone, Debug)]
pub enum BvTerm {
Const { value: u128, sort: Sort },
Var { name: String, sort: Sort },
Add(Box<BvTerm>, Box<BvTerm>),
Sub(Box<BvTerm>, Box<BvTerm>),
Mul(Box<BvTerm>, Box<BvTerm>),
Udiv(Box<BvTerm>, Box<BvTerm>),
And(Box<BvTerm>, Box<BvTerm>),
Or(Box<BvTerm>, Box<BvTerm>),
Xor(Box<BvTerm>, Box<BvTerm>),
Shl(Box<BvTerm>, Box<BvTerm>),
Lshr(Box<BvTerm>, Box<BvTerm>),
Ashr(Box<BvTerm>, Box<BvTerm>),
Rotr(Box<BvTerm>, Box<BvTerm>),
Extract { hi: u32, lo: u32, arg: Box<BvTerm> },
Concat(Box<BvTerm>, Box<BvTerm>),
ZeroExt { by: u32, arg: Box<BvTerm> },
SignExt { by: u32, arg: Box<BvTerm> },
Ite {
cond: Box<BoolTerm>,
then_: Box<BvTerm>,
else_: Box<BvTerm>,
},
}
#[derive(Clone, Debug)]
pub enum BoolTerm {
Eq(Box<BvTerm>, Box<BvTerm>),
Ne(Box<BvTerm>, Box<BvTerm>),
Ult(Box<BvTerm>, Box<BvTerm>),
Ule(Box<BvTerm>, Box<BvTerm>),
Ugt(Box<BvTerm>, Box<BvTerm>),
Uge(Box<BvTerm>, Box<BvTerm>),
Slt(Box<BvTerm>, Box<BvTerm>),
Sle(Box<BvTerm>, Box<BvTerm>),
Sgt(Box<BvTerm>, Box<BvTerm>),
Sge(Box<BvTerm>, Box<BvTerm>),
Not(Box<BoolTerm>),
And(Box<BoolTerm>, Box<BoolTerm>),
Or(Box<BoolTerm>, Box<BoolTerm>),
}