3#include "barretenberg/plonk/proof_system/proving_key/proving_key.hpp"
4#include "barretenberg/srs/factories/crs_factory.hpp"
7namespace proof_system {
16template <
typename Flavor>
17void construct_selector_polynomials(
const typename Flavor::CircuitBuilder& circuit_constructor,
21 const size_t zero_row_offset = Flavor::has_zero_row ? 1 : 0;
22 size_t gate_offset = zero_row_offset + circuit_constructor.public_inputs.size();
29 if constexpr (IsGoblinFlavor<Flavor>) {
30 const size_t num_ecc_op_gates = circuit_constructor.num_ecc_op_gates;
31 gate_offset += num_ecc_op_gates;
32 const size_t op_gate_offset = zero_row_offset;
35 for (
size_t i = 0; i < num_ecc_op_gates; ++i) {
36 ecc_op_selector[i + op_gate_offset] = 1;
38 proving_key->lagrange_ecc_op = ecc_op_selector.share();
42 if constexpr (IsHonkFlavor<Flavor>) {
43 for (
auto [poly, selector_values] :
zip_view(ZipAllowDifferentSizes::FLAG,
44 proving_key->get_precomputed_polynomials(),
45 circuit_constructor.selectors.get())) {
46 ASSERT(proving_key->circuit_size >= selector_values.size());
51 for (
size_t i = 0; i < selector_values.size(); ++i) {
52 selector_poly_lagrange[i + gate_offset] = selector_values[i];
54 poly = selector_poly_lagrange.share();
56 }
else if constexpr (IsPlonkFlavor<Flavor>) {
57 size_t selector_idx = 0;
58 for (
auto& selector_values : circuit_constructor.selectors.get()) {
59 ASSERT(proving_key->circuit_size >= selector_values.size());
64 for (
size_t i = 0; i < selector_values.size(); ++i) {
65 selector_poly_lagrange[i + gate_offset] = selector_values[i];
68 proving_key->polynomial_store.put(circuit_constructor.selector_names[selector_idx] +
"_lagrange",
69 std::move(selector_poly_lagrange));
91template <
typename Flavor>
92std::vector<typename Flavor::Polynomial> construct_wire_polynomials_base(
93 const typename Flavor::CircuitBuilder& circuit_constructor,
const size_t dyadic_circuit_size)
96 const size_t num_zero_rows = Flavor::has_zero_row ? 1 : 0;
97 const size_t num_gates = circuit_constructor.num_gates;
98 std::span<const uint32_t> public_inputs = circuit_constructor.public_inputs;
99 const size_t num_public_inputs = public_inputs.size();
100 size_t num_ecc_op_gates = 0;
101 if constexpr (IsGoblinFlavor<Flavor>) {
102 num_ecc_op_gates = circuit_constructor.num_ecc_op_gates;
106 size_t op_gate_offset = num_zero_rows;
107 size_t pub_input_offset = num_zero_rows + num_ecc_op_gates;
108 size_t gate_offset = num_zero_rows + num_ecc_op_gates + num_public_inputs;
110 std::vector<typename Flavor::Polynomial> wire_polynomials;
113 for (
size_t wire_idx = 0; wire_idx < Flavor::NUM_WIRES; ++wire_idx) {
119 for (
size_t i = 0; i < num_zero_rows; ++i) {
120 w_lagrange[i] = circuit_constructor.get_variable(circuit_constructor.zero_idx);
124 if constexpr (IsGoblinFlavor<Flavor>) {
125 for (
size_t i = 0; i < num_ecc_op_gates; ++i) {
126 auto& op_wire = circuit_constructor.ecc_op_wires[wire_idx];
127 w_lagrange[i + op_gate_offset] = circuit_constructor.get_variable(op_wire[i]);
133 for (
size_t i = 0; i < num_public_inputs; ++i) {
134 w_lagrange[i + pub_input_offset] = circuit_constructor.get_variable(public_inputs[i]);
139 for (
size_t i = 0; i < num_gates; ++i) {
140 auto& wire = circuit_constructor.wires[wire_idx];
141 w_lagrange[i + gate_offset] = circuit_constructor.get_variable(wire[i]);
144 wire_polynomials.push_back(std::move(w_lagrange));
146 return wire_polynomials;
Definition: AvmMini_flavor.hpp:231
Definition: zip_view.hpp:159
Base class templates for structures that contain data parameterized by the fundamental polynomials of...