11#include "barretenberg/common/constexpr_utils.hpp"
12#include "barretenberg/ecc/curves/bn254/fq.hpp"
13#include "barretenberg/numeric/uint256/uint256.hpp"
14#include "barretenberg/proof_system/arithmetization/arithmetization.hpp"
15#include "barretenberg/proof_system/op_queue/ecc_op_queue.hpp"
16#include "circuit_builder_base.hpp"
22namespace proof_system {
83 static constexpr size_t NUM_WIRES = Arithmetization::NUM_WIRES;
91 void create_bool_gate(
const uint32_t)
override{};
92 void create_poly_gate(
const poly_triple_<Fr>&)
override{};
93 [[nodiscard]]
size_t get_num_constant_gates()
const override {
return 0; };
104 P_X_LOW_LIMBS_RANGE_CONSTRAINT_0,
105 P_X_LOW_LIMBS_RANGE_CONSTRAINT_1,
106 P_X_LOW_LIMBS_RANGE_CONSTRAINT_2,
107 P_X_LOW_LIMBS_RANGE_CONSTRAINT_3,
108 P_X_LOW_LIMBS_RANGE_CONSTRAINT_4,
109 P_X_LOW_LIMBS_RANGE_CONSTRAINT_TAIL,
111 P_X_HIGH_LIMBS_RANGE_CONSTRAINT_0,
112 P_X_HIGH_LIMBS_RANGE_CONSTRAINT_1,
113 P_X_HIGH_LIMBS_RANGE_CONSTRAINT_2,
114 P_X_HIGH_LIMBS_RANGE_CONSTRAINT_3,
115 P_X_HIGH_LIMBS_RANGE_CONSTRAINT_4,
116 P_X_HIGH_LIMBS_RANGE_CONSTRAINT_TAIL,
118 P_Y_LOW_LIMBS_RANGE_CONSTRAINT_0,
119 P_Y_LOW_LIMBS_RANGE_CONSTRAINT_1,
120 P_Y_LOW_LIMBS_RANGE_CONSTRAINT_2,
121 P_Y_LOW_LIMBS_RANGE_CONSTRAINT_3,
122 P_Y_LOW_LIMBS_RANGE_CONSTRAINT_4,
123 P_Y_LOW_LIMBS_RANGE_CONSTRAINT_TAIL,
125 P_Y_HIGH_LIMBS_RANGE_CONSTRAINT_0,
126 P_Y_HIGH_LIMBS_RANGE_CONSTRAINT_1,
127 P_Y_HIGH_LIMBS_RANGE_CONSTRAINT_2,
128 P_Y_HIGH_LIMBS_RANGE_CONSTRAINT_3,
129 P_Y_HIGH_LIMBS_RANGE_CONSTRAINT_4,
130 P_Y_HIGH_LIMBS_RANGE_CONSTRAINT_TAIL,
132 Z_LOW_LIMBS_RANGE_CONSTRAINT_0,
133 Z_LOW_LIMBS_RANGE_CONSTRAINT_1,
134 Z_LOW_LIMBS_RANGE_CONSTRAINT_2,
135 Z_LOW_LIMBS_RANGE_CONSTRAINT_3,
136 Z_LOW_LIMBS_RANGE_CONSTRAINT_4,
137 Z_LOW_LIMBS_RANGE_CONSTRAINT_TAIL,
139 Z_HIGH_LIMBS_RANGE_CONSTRAINT_0,
140 Z_HIGH_LIMBS_RANGE_CONSTRAINT_1,
141 Z_HIGH_LIMBS_RANGE_CONSTRAINT_2,
142 Z_HIGH_LIMBS_RANGE_CONSTRAINT_3,
143 Z_HIGH_LIMBS_RANGE_CONSTRAINT_4,
144 Z_HIGH_LIMBS_RANGE_CONSTRAINT_TAIL,
145 ACCUMULATORS_BINARY_LIMBS_0,
147 ACCUMULATORS_BINARY_LIMBS_1,
148 ACCUMULATORS_BINARY_LIMBS_2,
149 ACCUMULATORS_BINARY_LIMBS_3,
150 ACCUMULATOR_LOW_LIMBS_RANGE_CONSTRAINT_0,
152 ACCUMULATOR_LOW_LIMBS_RANGE_CONSTRAINT_1,
153 ACCUMULATOR_LOW_LIMBS_RANGE_CONSTRAINT_2,
154 ACCUMULATOR_LOW_LIMBS_RANGE_CONSTRAINT_3,
155 ACCUMULATOR_LOW_LIMBS_RANGE_CONSTRAINT_4,
156 ACCUMULATOR_LOW_LIMBS_RANGE_CONSTRAINT_TAIL,
157 ACCUMULATOR_HIGH_LIMBS_RANGE_CONSTRAINT_0,
158 ACCUMULATOR_HIGH_LIMBS_RANGE_CONSTRAINT_1,
159 ACCUMULATOR_HIGH_LIMBS_RANGE_CONSTRAINT_2,
160 ACCUMULATOR_HIGH_LIMBS_RANGE_CONSTRAINT_3,
161 ACCUMULATOR_HIGH_LIMBS_RANGE_CONSTRAINT_4,
162 ACCUMULATOR_HIGH_LIMBS_RANGE_CONSTRAINT_TAIL,
163 QUOTIENT_LOW_BINARY_LIMBS,
164 QUOTIENT_HIGH_BINARY_LIMBS,
165 QUOTIENT_LOW_LIMBS_RANGE_CONSTRAIN_0,
166 QUOTIENT_LOW_LIMBS_RANGE_CONSTRAIN_1,
167 QUOTIENT_LOW_LIMBS_RANGE_CONSTRAIN_2,
168 QUOTIENT_LOW_LIMBS_RANGE_CONSTRAIN_3,
169 QUOTIENT_LOW_LIMBS_RANGE_CONSTRAIN_4,
170 QUOTIENT_LOW_LIMBS_RANGE_CONSTRAIN_TAIL,
171 QUOTIENT_HIGH_LIMBS_RANGE_CONSTRAIN_0,
172 QUOTIENT_HIGH_LIMBS_RANGE_CONSTRAIN_1,
173 QUOTIENT_HIGH_LIMBS_RANGE_CONSTRAIN_2,
174 QUOTIENT_HIGH_LIMBS_RANGE_CONSTRAIN_3,
175 QUOTIENT_HIGH_LIMBS_RANGE_CONSTRAIN_4,
176 QUOTIENT_HIGH_LIMBS_RANGE_CONSTRAIN_TAIL,
178 RELATION_WIDE_LIMBS_RANGE_CONSTRAINT_0,
179 RELATION_WIDE_LIMBS_RANGE_CONSTRAINT_1,
180 RELATION_WIDE_LIMBS_RANGE_CONSTRAINT_2,
181 RELATION_WIDE_LIMBS_RANGE_CONSTRAINT_3,
191 static constexpr size_t DEFAULT_TRANSLATOR_VM_LENGTH = 2048;
194 static constexpr size_t NUM_LIMB_BITS = 68;
197 static constexpr size_t NUM_LAST_LIMB_BITS = Fq::modulus.get_msb() + 1 - 3 * NUM_LIMB_BITS;
200 static constexpr size_t NUM_Z_LIMBS = 2;
203 static constexpr size_t NUM_QUOTIENT_BITS = 256;
206 static constexpr size_t NUM_LAST_QUOTIENT_LIMB_BITS = 256 - 3 * NUM_LIMB_BITS;
209 static constexpr size_t NUM_Z_BITS = 128;
212 static constexpr size_t MICRO_LIMB_BITS = 14;
215 static constexpr auto MAX_MICRO_LIMB_SIZE = (
uint256_t(1) << MICRO_LIMB_BITS) - 1;
219 static constexpr size_t NUM_MICRO_LIMBS = 6;
222 static constexpr size_t NUM_BINARY_LIMBS = 4;
225 static constexpr size_t NUM_RELATION_WIDE_LIMBS = 2;
228 static constexpr size_t RELATION_WIDE_LIMB_BITS = 84;
231 static constexpr uint256_t MAX_RELATION_WIDE_LIMB_SIZE =
uint256_t(1) << RELATION_WIDE_LIMB_BITS;
234 static constexpr auto MICRO_SHIFT =
uint256_t(1) << MICRO_LIMB_BITS;
237 static constexpr auto MAX_LOW_WIDE_LIMB_SIZE = (
uint256_t(1) << (NUM_LIMB_BITS * 2)) - 1;
240 static constexpr auto MAX_HIGH_WIDE_LIMB_SIZE = (
uint256_t(1) << (NUM_LIMB_BITS + NUM_LAST_LIMB_BITS)) - 1;
243 static constexpr auto SHIFT_1 =
uint256_t(1) << NUM_LIMB_BITS;
246 static constexpr auto SHIFT_2 =
uint256_t(1) << (NUM_LIMB_BITS << 1);
249 static constexpr auto SHIFT_2_INVERSE =
Fr(SHIFT_2).invert();
252 static constexpr auto SHIFT_3 =
uint256_t(1) << (NUM_LIMB_BITS * 3);
255 static constexpr uint512_t MODULUS_U512 = uint512_t(Fq::modulus);
258 static constexpr uint512_t BINARY_BASIS_MODULUS = uint512_t(1) << (NUM_LIMB_BITS << 2);
261 static constexpr uint512_t NEGATIVE_PRIME_MODULUS = BINARY_BASIS_MODULUS - MODULUS_U512;
265 static constexpr std::array<Fr, 5> NEGATIVE_MODULUS_LIMBS = {
266 Fr(NEGATIVE_PRIME_MODULUS.slice(0, NUM_LIMB_BITS).lo),
267 Fr(NEGATIVE_PRIME_MODULUS.slice(NUM_LIMB_BITS, NUM_LIMB_BITS * 2).lo),
268 Fr(NEGATIVE_PRIME_MODULUS.slice(NUM_LIMB_BITS * 2, NUM_LIMB_BITS * 3).lo),
269 Fr(NEGATIVE_PRIME_MODULUS.slice(NUM_LIMB_BITS * 3, NUM_LIMB_BITS * 4).lo),
285 std::array<Fr, NUM_BINARY_LIMBS> P_x_limbs;
286 std::array<std::array<Fr, NUM_MICRO_LIMBS>, NUM_BINARY_LIMBS> P_x_microlimbs;
289 std::array<Fr, NUM_BINARY_LIMBS> P_y_limbs;
290 std::array<std::array<Fr, NUM_MICRO_LIMBS>, NUM_BINARY_LIMBS> P_y_microlimbs;
293 std::array<Fr, NUM_Z_LIMBS> z_1_limbs;
294 std::array<std::array<Fr, NUM_MICRO_LIMBS>, NUM_Z_LIMBS> z_1_microlimbs;
296 std::array<Fr, NUM_Z_LIMBS> z_2_limbs;
297 std::array<std::array<Fr, NUM_MICRO_LIMBS>, NUM_Z_LIMBS> z_2_microlimbs;
299 std::array<Fr, NUM_BINARY_LIMBS> previous_accumulator;
300 std::array<Fr, NUM_BINARY_LIMBS> current_accumulator;
301 std::array<std::array<Fr, NUM_MICRO_LIMBS>, NUM_BINARY_LIMBS> current_accumulator_microlimbs;
302 std::array<Fr, NUM_BINARY_LIMBS> quotient_binary_limbs;
303 std::array<std::array<Fr, NUM_MICRO_LIMBS>, NUM_BINARY_LIMBS> quotient_microlimbs;
304 std::array<Fr, NUM_RELATION_WIDE_LIMBS> relation_wide_limbs;
305 std::array<std::array<Fr, NUM_MICRO_LIMBS>, 2> relation_wide_microlimbs;
308 std::array<Fr, NUM_BINARY_LIMBS> x_limbs;
309 std::array<Fr, NUM_BINARY_LIMBS> v_limbs;
310 std::array<Fr, NUM_BINARY_LIMBS> v_squared_limbs = { 0 };
311 std::array<Fr, NUM_BINARY_LIMBS> v_cubed_limbs = { 0 };
312 std::array<Fr, NUM_BINARY_LIMBS> v_quarted_limbs = { 0 };
315 std::array<Fr, NUM_BINARY_LIMBS> x_limbs;
316 std::array<Fr, NUM_BINARY_LIMBS> v_limbs;
317 std::array<Fr, NUM_BINARY_LIMBS> v_squared_limbs = { 0 };
318 std::array<Fr, NUM_BINARY_LIMBS> v_cubed_limbs = { 0 };
319 std::array<Fr, NUM_BINARY_LIMBS> v_quarted_limbs = { 0 };
321 static constexpr std::string_view NAME_STRING =
"GoblinTranslatorArithmetization";
324 Fq batching_challenge_v;
327 Fq evaluation_input_x;
329 std::array<std::vector<uint32_t, barretenberg::ContainerSlabAllocator<uint32_t>>, NUM_WIRES> wires;
342 , batching_challenge_v(batching_challenge_v_)
343 , evaluation_input_x(evaluation_input_x_)
346 for (
auto& wire : wires) {
347 wire.emplace_back(0);
363 Fq evaluation_input_x_,
364 std::shared_ptr<ECCOpQueue> op_queue)
374 GoblinTranslatorCircuitBuilder& operator=(
const GoblinTranslatorCircuitBuilder& other) =
delete;
375 GoblinTranslatorCircuitBuilder& operator=(GoblinTranslatorCircuitBuilder&& other)
noexcept
377 CircuitBuilderBase::operator=(std::move(other));
380 ~GoblinTranslatorCircuitBuilder()
override =
default;
396 auto base_element_to_limbs = [](
Fq& original) {
398 return std::array<Fr, NUM_BINARY_LIMBS>({
399 Fr(original_uint.
slice(0, NUM_LIMB_BITS)),
400 Fr(original_uint.
slice(NUM_LIMB_BITS, 2 * NUM_LIMB_BITS)),
401 Fr(original_uint.
slice(2 * NUM_LIMB_BITS, 3 * NUM_LIMB_BITS)),
402 Fr(original_uint.
slice(3 * NUM_LIMB_BITS, 4 * NUM_LIMB_BITS)),
405 Fq& v = batching_challenge_v;
406 Fq& x = evaluation_input_x;
411 v_cubed = v_squared * v;
412 v_quarted = v_cubed * v;
414 result.x_limbs = base_element_to_limbs(x);
415 result.v_limbs = base_element_to_limbs(v);
416 result.v_squared_limbs = base_element_to_limbs(v_squared);
417 result.v_cubed_limbs = base_element_to_limbs(v_cubed);
418 result.v_quarted_limbs = base_element_to_limbs(v_quarted);
439 const size_t RESULT_ROW = 1;
440 ASSERT(num_gates > RESULT_ROW);
464template <
typename Fq,
typename Fr>
465GoblinTranslatorCircuitBuilder::AccumulationInput generate_witness_values(
Fr op_code,
472 Fq previous_accumulator,
473 Fq batching_challenge_v,
474 Fq evaluation_input_x);
475extern template GoblinTranslatorCircuitBuilder::AccumulationInput generate_witness_values(
barretenberg::fr,
Definition: arithmetization.hpp:203
Definition: uint256.hpp:25
constexpr uint256_t slice(uint64_t start, uint64_t end) const
Definition: uint256_impl.hpp:157
Definition: circuit_builder_base.hpp:14
FF get_variable(const uint32_t index) const
Definition: circuit_builder_base.hpp:113
virtual uint32_t add_variable(const FF &in)
Definition: circuit_builder_base.hpp:163
GoblinTranslatorCircuitBuilder creates a circuit that evaluates the correctness of the evaluation of ...
Definition: goblin_translator_circuit_builder.hpp:76
void create_accumulation_gate(AccumulationInput acc_step)
Create a single accumulation gate.
Definition: goblin_translator_circuit_builder.cpp:375
GoblinTranslatorCircuitBuilder(Fq batching_challenge_v_, Fq evaluation_input_x_, std::shared_ptr< ECCOpQueue > op_queue)
Construct a new Goblin Translator Circuit Builder object and feed op_queue inside.
Definition: goblin_translator_circuit_builder.hpp:362
bool check_circuit()
Check the witness satisifies the circuit.
Definition: goblin_translator_circuit_builder.cpp:642
WireIds
There are so many wires that naming them has no sense, it is easier to access them with enums.
Definition: goblin_translator_circuit_builder.hpp:98
barretenberg::fq get_computation_result()
Get the result of accumulation.
Definition: goblin_translator_circuit_builder.hpp:437
static RelationInputs compute_relation_inputs_limbs(Fq batching_challenge_v, Fq evaluation_input_x)
Create limb representations of x and powers of v that are needed to compute the witness or check circ...
Definition: goblin_translator_circuit_builder.hpp:390
void create_add_gate(const add_triple_< Fr > &) override
Definition: goblin_translator_circuit_builder.hpp:89
GoblinTranslatorCircuitBuilder(Fq batching_challenge_v_, Fq evaluation_input_x_)
Construct a new Goblin Translator Circuit Builder object.
Definition: goblin_translator_circuit_builder.hpp:340
void feed_ecc_op_queue_into_circuit(std::shared_ptr< ECCOpQueue > ecc_op_queue)
Generate all the gates required to prove the correctness of batched evalution of polynomials represen...
Definition: goblin_translator_circuit_builder.cpp:602
Definition: gate_data.hpp:10
Definition: gate_data.hpp:43