2#include "barretenberg/polynomials/polynomial.hpp"
3#include "barretenberg/proof_system/arithmetization/arithmetization.hpp"
4#include "barretenberg/proof_system/op_queue/ecc_op_queue.hpp"
5#include "barretenberg/proof_system/plookup_tables/plookup_tables.hpp"
6#include "barretenberg/proof_system/plookup_tables/types.hpp"
7#include "barretenberg/proof_system/types/merkle_hash_type.hpp"
8#include "barretenberg/proof_system/types/pedersen_commitment_type.hpp"
9#include "ultra_circuit_builder.hpp"
12namespace proof_system {
18 static constexpr std::string_view NAME_STRING =
"GoblinUltraArithmetization";
19 static constexpr CircuitType CIRCUIT_TYPE = CircuitType::ULTRA;
20 static constexpr size_t DEFAULT_NON_NATIVE_FIELD_LIMB_BITS =
23 size_t num_vars_added_in_constructor = 0;
25 size_t num_ecc_op_gates = 0;
28 std::shared_ptr<ECCOpQueue> op_queue;
32 uint32_t add_accum_op_idx;
33 uint32_t mul_accum_op_idx;
34 uint32_t equality_op_idx;
36 using WireVector = std::vector<uint32_t, ContainerSlabAllocator<uint32_t>>;
37 using SelectorVector = std::vector<FF, ContainerSlabAllocator<FF>>;
40 std::array<WireVector, arithmetization::UltraHonk<FF>::NUM_WIRES> ecc_op_wires;
42 WireVector& ecc_op_wire_1() {
return std::get<0>(ecc_op_wires); };
43 WireVector& ecc_op_wire_2() {
return std::get<1>(ecc_op_wires); };
44 WireVector& ecc_op_wire_3() {
return std::get<2>(ecc_op_wires); };
45 WireVector& ecc_op_wire_4() {
return std::get<3>(ecc_op_wires); };
47 const WireVector& ecc_op_wire_1()
const {
return std::get<0>(ecc_op_wires); };
48 const WireVector& ecc_op_wire_2()
const {
return std::get<1>(ecc_op_wires); };
49 const WireVector& ecc_op_wire_3()
const {
return std::get<2>(ecc_op_wires); };
50 const WireVector& ecc_op_wire_4()
const {
return std::get<3>(ecc_op_wires); };
52 SelectorVector& q_busread() {
return this->selectors.q_busread(); };
53 SelectorVector& q_poseidon2_external() {
return this->selectors.q_poseidon2_external(); };
54 SelectorVector& q_poseidon2_internal() {
return this->selectors.q_poseidon2_internal(); };
56 const SelectorVector& q_busread()
const {
return this->selectors.q_busread(); };
57 const SelectorVector& q_poseidon2_external()
const {
return this->selectors.q_poseidon2_external(); };
58 const SelectorVector& q_poseidon2_internal()
const {
return this->selectors.q_poseidon2_internal(); };
61 std::vector<uint32_t> public_calldata;
62 std::vector<uint32_t> calldata_read_counts;
63 std::vector<uint32_t> public_return_data;
76 std::shared_ptr<ECCOpQueue> op_queue_in = std::make_shared<ECCOpQueue>())
78 , op_queue(op_queue_in)
81 null_op_idx = this->zero_idx;
82 add_accum_op_idx = this->put_constant_variable(FF(EccOpCode::ADD_ACCUM));
83 mul_accum_op_idx = this->put_constant_variable(FF(EccOpCode::MUL_ACCUM));
84 equality_op_idx = this->put_constant_variable(FF(EccOpCode::EQUALITY));
85 num_vars_added_in_constructor = this->variables.size();
91 void finalize_circuit();
94 size_t get_num_constant_gates()
const override {
return 0; }
109 return num_ultra_gates + num_ecc_op_gates;
119 size_t rangecount = 0;
124 count, rangecount, romcount, ramcount, nnfcount);
126 size_t total = count + romcount + ramcount + rangecount + num_ecc_op_gates;
127 std::cout <<
"gates = " << total <<
" (arith " << count <<
", rom " << romcount <<
", ram " << ramcount
128 <<
", range " << rangecount <<
", non native field gates " << nnfcount <<
", goblin ecc op gates "
129 << num_ecc_op_gates <<
"), pubinp = " << this->public_inputs.size() << std::endl;
139 for (
const uint32_t calldata : public_calldata) {
140 if (calldata == witness_index) {
141 if (!this->failed()) {
142 this->failure(
"Attempted to redundantly set a public calldata!");
147 public_calldata.emplace_back(witness_index);
152 FF compute_poseidon2_external_identity(FF q_poseidon2_external_value,
161 FF w_1_shifted_value,
162 FF w_2_shifted_value,
163 FF w_3_shifted_value,
164 FF w_4_shifted_value,
168 FF compute_poseidon2_internal_identity(FF q_poseidon2_internal_value,
174 FF w_1_shifted_value,
175 FF w_2_shifted_value,
176 FF w_3_shifted_value,
177 FF w_4_shifted_value,
181 bool check_circuit();
183extern template class GoblinUltraCircuitBuilder_<barretenberg::fr>;
184using GoblinUltraCircuitBuilder = GoblinUltraCircuitBuilder_<barretenberg::fr>;
Definition: affine_element.hpp:11
Definition: goblin_ultra_circuit_builder.hpp:16
void add_gates_to_ensure_all_polys_are_non_zero()
Ensure all polynomials have at least one non-zero coefficient to avoid commiting to the zero-polynomi...
Definition: goblin_ultra_circuit_builder.cpp:26
ecc_op_tuple queue_ecc_eq()
Add point equality gates based on the current value of the accumulator internal to the op queue and a...
Definition: goblin_ultra_circuit_builder.cpp:162
ecc_op_tuple queue_ecc_mul_accum(const g1::affine_element &point, const FF &scalar)
Add gates for point mul-then-accumulate and add the raw operation data to the op queue.
Definition: goblin_ultra_circuit_builder.cpp:143
size_t get_num_gates() const override
Get the final number of gates in a circuit, which consists of the sum of: 1) Current number number of...
Definition: goblin_ultra_circuit_builder.hpp:106
void set_public_calldata(const uint32_t witness_index)
Definition: goblin_ultra_circuit_builder.hpp:137
ecc_op_tuple queue_ecc_add_accum(const g1::affine_element &point)
Add gates for simple point addition (no mul) and add the raw operation data to the op queue.
Definition: goblin_ultra_circuit_builder.cpp:122
virtual void print_num_gates() const override
Print the number and composition of gates in the circuit.
Definition: goblin_ultra_circuit_builder.hpp:116
Definition: ultra_circuit_builder.hpp:31
void get_num_gates_split_into_components(size_t &count, size_t &rangecount, size_t &romcount, size_t &ramcount, size_t &nnfcount) const
Get the final number of gates in a circuit, which consists of the sum of: 1) Current number number of...
Definition: ultra_circuit_builder.hpp:801
constexpr_utils defines some helper methods that perform some stl-equivalent operations but in a cons...
Definition: constexpr_utils.hpp:16
Definition: gate_data.hpp:64
Definition: gate_data.hpp:136
Definition: gate_data.hpp:144