6uint32_t
pow_num(uint32_t base, uint32_t exp)
9 for (uint32_t i = 0; i < exp; i++) {
18 uint32_t BIT_SIZE = 8;
24 for (uint32_t i = 1; i < BIT_SIZE + 1; i++) {
26 auto mask =
pow_num(2, BIT_SIZE - i);
28 auto b = (v0 & mask) >> (BIT_SIZE - i);
29 res = (r2 * two *
b) + (1 -
b) * r2;
36 auto pow2_v1 =
pow2_8(v1, solver);
42 auto pow2_v1 =
pow2_8(v1, solver);
43 auto res = v0 / pow2_v1;
49 auto shifted =
shl(v0, v1, solver);
50 auto res = shifted.truncate(63);
56 auto shifted =
shl(v0, v1, solver);
57 auto res = shifted.truncate(31);
63 auto shifted =
shl(v0, v1, solver);
64 auto res = shifted.truncate(7);
71 auto res_truncated = res.
truncate(bit_size - 1);
77 auto res_truncated = res.
truncate(bit_size - 1);
84 auto res_truncated = res.
truncate(bit_size - 1);
94 auto res_sign_bit = sign_bit_v0 ^ sign_bit_v1;
95 res_sign_bit <<= bit_size - 1;
96 auto abs_value_v0 = v0.
truncate(bit_size - 2);
97 auto abs_value_v1 = v1.
truncate(bit_size - 2);
98 auto abs_res = abs_value_v0 / abs_value_v1;
103 auto condition =
smt_terms::Bool(
static_cast<cvc5::Term
>(abs_value_v0), solver) ==
105 auto eq1 = condition & (
smt_terms::Bool(
static_cast<cvc5::Term
>(res), solver) ==
107 auto eq2 = !condition & (
smt_terms::Bool(
static_cast<cvc5::Term
>(res), solver) ==
108 smt_terms::Bool(
static_cast<cvc5::Term
>(res_sign_bit | abs_res), solver));
110 (eq1 | eq2).assert_term();
Symbolic term element class.
STerm extract_bit(const uint32_t &bit_index)
Returns ith bit of variable.
STerm truncate(const uint32_t &to_size)
Returns last to_size bits of variable.
smt_circuit::STerm shl8(smt_circuit::STerm v0, smt_circuit::STerm v1, smt_solver::Solver *solver)
Left shift operation with 8-bit truncation.
smt_circuit::STerm sub_signed(smt_circuit::STerm v0, smt_circuit::STerm v1, uint32_t bit_size)
Signed subtraction operation: c = a - b + truncate to bit_size bits.
smt_circuit::STerm shr(smt_circuit::STerm v0, smt_circuit::STerm v1, smt_solver::Solver *solver)
Right shift operation.
smt_circuit::STerm idiv(smt_circuit::STerm v0, smt_circuit::STerm v1, uint32_t bit_size, smt_solver::Solver *solver)
Signed division in noir-style.
smt_circuit::STerm add_signed(smt_circuit::STerm v0, smt_circuit::STerm v1, uint32_t bit_size)
smt_circuit::STerm shl(smt_circuit::STerm v0, smt_circuit::STerm v1, smt_solver::Solver *solver)
Left shift operation without truncation.
smt_circuit::STerm mul_signed(smt_circuit::STerm v0, smt_circuit::STerm v1, uint32_t bit_size)
Signed multiplication operation: c = a * b + truncate to bit_size bits.
uint32_t pow_num(uint32_t base, uint32_t exp)
smt_circuit::STerm shl32(smt_circuit::STerm v0, smt_circuit::STerm v1, smt_solver::Solver *solver)
Left shift operation with 32-bit truncation.
smt_circuit::STerm shl64(smt_circuit::STerm v0, smt_circuit::STerm v1, smt_solver::Solver *solver)
Left shift operation with 64-bit truncation.
smt_circuit::STerm pow2_8(smt_circuit::STerm v0, smt_solver::Solver *solver)
Calculates power of 2.
STerm BVVar(const std::string &name, Solver *slv)
STerm BVConst(const std::string &val, Solver *slv, uint32_t base)
std::string to_string(bb::avm2::ValueTag tag)