Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
helpers.cpp
Go to the documentation of this file.
4
5// used for base = 2; exp <= 8 so its okay
6uint32_t pow_num(uint32_t base, uint32_t exp)
7{
8 uint32_t res = 1;
9 for (uint32_t i = 0; i < exp; i++) {
10 res *= base;
11 }
12 return res;
13}
14
15// returns 2^v0
17{
18 uint32_t BIT_SIZE = 8;
19 auto one = smt_terms::BVConst("1", solver, 10);
20 auto two = smt_terms::BVConst("2", solver, 10);
21 smt_circuit::STerm res = smt_circuit::BVVar("res", solver);
22 res = one;
23 auto exp = v0;
24 for (uint32_t i = 1; i < BIT_SIZE + 1; i++) {
25 auto r2 = res * res;
26 auto mask = pow_num(2, BIT_SIZE - i);
27 // same thing as taking ith bit in little endian
28 auto b = (v0 & mask) >> (BIT_SIZE - i);
29 res = (r2 * two * b) + (1 - b) * r2;
30 }
31 return res;
32}
33
35{
36 auto pow2_v1 = pow2_8(v1, solver);
37 return v0 * pow2_v1;
38}
39
41{
42 auto pow2_v1 = pow2_8(v1, solver);
43 auto res = v0 / pow2_v1;
44 return res;
45}
46
48{
49 auto shifted = shl(v0, v1, solver);
50 auto res = shifted.truncate(63);
51 return res;
52}
53
55{
56 auto shifted = shl(v0, v1, solver);
57 auto res = shifted.truncate(31);
58 return res;
59}
60
62{
63 // highest bit of v0 and v1 is sign bit
64 smt_circuit::STerm exponent = smt_terms::BVConst(std::to_string(bit_size), solver, 10);
65 auto sign_bit_v0 = v0.extract_bit(bit_size - 1);
66 auto sign_bit_v1 = v1.extract_bit(bit_size - 1);
67 auto res_sign_bit = sign_bit_v0 ^ sign_bit_v1;
68 res_sign_bit <<= bit_size - 1;
69 auto abs_value_v0 = v0.truncate(bit_size - 2);
70 auto abs_value_v1 = v1.truncate(bit_size - 2);
71 auto abs_res = abs_value_v0 / abs_value_v1;
72
73 // if abs_value_v0 == 0 then res = 0
74 // in our context we use idiv only once, so static name for the division result okay.
75 auto res = smt_terms::BVVar("res_signed_division", solver);
76 auto condition = smt_terms::Bool(abs_value_v0, solver) == smt_terms::Bool(smt_terms::BVConst("0", solver, 10));
77 auto eq1 = condition & (smt_terms::Bool(res, solver) == smt_terms::Bool(smt_terms::BVConst("0", solver, 10)));
78 auto eq2 = !condition & (smt_terms::Bool(res, solver) == smt_terms::Bool(res_sign_bit | abs_res, solver));
79
80 (eq1 | eq2).assert_term();
81
82 return res;
83}
Class for the solver.
Definition solver.hpp:80
Bool element class.
Definition bool.hpp:14
Symbolic term element class.
Definition term.hpp:114
STerm extract_bit(const uint32_t &bit_index)
Returns ith bit of variable.
Definition term.cpp:476
STerm truncate(const uint32_t &to_size)
Returns last to_size bits of variable.
Definition term.cpp:461
FF b
smt_circuit::STerm shr(smt_circuit::STerm v0, smt_circuit::STerm v1, smt_solver::Solver *solver)
Right shift operation.
Definition helpers.cpp:40
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.
Definition helpers.cpp:61
smt_circuit::STerm shl(smt_circuit::STerm v0, smt_circuit::STerm v1, smt_solver::Solver *solver)
Left shift operation without truncation.
Definition helpers.cpp:34
uint32_t pow_num(uint32_t base, uint32_t exp)
Definition helpers.cpp:6
smt_circuit::STerm shl32(smt_circuit::STerm v0, smt_circuit::STerm v1, smt_solver::Solver *solver)
Left shift operation with 32-bit truncation.
Definition helpers.cpp:54
smt_circuit::STerm shl64(smt_circuit::STerm v0, smt_circuit::STerm v1, smt_solver::Solver *solver)
Left shift operation with 64-bit truncation.
Definition helpers.cpp:47
smt_circuit::STerm pow2_8(smt_circuit::STerm v0, smt_solver::Solver *solver)
Calculates power of 2.
Definition helpers.cpp:16
STerm BVVar(const std::string &name, Solver *slv)
Definition term.cpp:615
STerm BVConst(const std::string &val, Solver *slv, uint32_t base)
Definition term.cpp:620
std::string to_string(bb::avm2::ValueTag tag)