25 vinfo(
"Constructing ProverInstance");
29 BB_ASSERT(circuit.pairing_points_tagging.has_single_pairing_point_tag(),
30 "Pairing points must all be aggregated together. Either no pairing points should be created, or "
31 "all created pairing points must be aggregated into a single pairing point. Found "
32 << circuit.pairing_points_tagging.num_unique_pairing_points() <<
" different pairing points.");
34 BB_ASSERT(circuit.pairing_points_tagging.has_public_pairing_points() ||
35 !circuit.pairing_points_tagging.has_pairing_points(),
36 "Pairing points must be set to public in the circuit before constructing the ProverInstance.");
41 if (!circuit.circuit_finalized) {
42 circuit.finalize_circuit();
45 circuit.blocks.compute_offsets(TRACE_OFFSET);
46 metadata.dyadic_size = compute_dyadic_size(circuit);
49 for (
auto& block : circuit.blocks.get()) {
50 if (block.size() > 0) {
51 final_active_wire_idx = block.trace_end() - 1;
58 vinfo(
"allocating polynomials object in prover instance...");
60 populate_memory_records(circuit);
62 allocate_permutation_argument_polynomials();
63 allocate_selectors(circuit);
64 allocate_table_lookup_polynomials(circuit);
65 allocate_lagrange_polynomials();
68 allocate_ecc_op_polynomials(circuit);
71 allocate_databus_polynomials(circuit);
75 polynomials.set_shifted();
83 vinfo(
"populating trace...");
88 construct_databus_polynomials(circuit);
92 polynomials.lagrange_first.at(TRACE_OFFSET) = 1;
93 polynomials.lagrange_last.at(final_active_wire_idx) = 1;
95 construct_lookup_polynomials(circuit);
98 metadata.num_public_inputs = circuit.blocks.pub_inputs.size();
99 metadata.pub_inputs_offset = circuit.blocks.pub_inputs.trace_offset();
100 for (
size_t i = 0; i < metadata.num_public_inputs; ++i) {
101 size_t idx = i + metadata.pub_inputs_offset;
102 public_inputs.emplace_back(polynomials.w_r[idx]);
106 ipa_proof = circuit.ipa_proof;
128 const size_t tables_size = circuit.get_tables_size();
131 size_t min_size_of_execution_trace = circuit.blocks.get_total_content_size();
134 const size_t tables_end = circuit.blocks.lookup.trace_offset() + tables_size;
135 const size_t trace_end = TRACE_OFFSET + NUM_ZERO_ROWS + min_size_of_execution_trace;
136 size_t total_num_gates =
std::max(tables_end, trace_end);
139 return circuit.get_circuit_subgroup_size(total_num_gates);
146 const size_t wire_size = trace_active_range_size();
148 for (
auto& wire : polynomials.get_wires()) {
160 for (
auto& sigma : polynomials.get_sigmas()) {
163 for (
auto&
id : polynomials.get_ids()) {
175 1, dyadic_size(), TRACE_OFFSET);
178 1, dyadic_size(), final_active_wire_idx);
186 for (
auto [selector, block] :
zip_view(polynomials.get_gate_selectors(), circuit.blocks.get_gate_blocks())) {
187 selector =
Polynomial(block.size(), dyadic_size(), block.trace_offset());
191 for (
auto& selector : polynomials.get_non_gate_selectors()) {
192 selector =
Polynomial(trace_active_range_size(), dyadic_size());
198 BB_BENCH_NAME(
"allocate_table_lookup_and_lookup_read_polynomials");
200 const size_t tables_size = circuit.get_tables_size();
201 const size_t table_offset = circuit.blocks.lookup.trace_offset();
202 const size_t tables_end = table_offset + tables_size;
208 for (
auto& table_poly : polynomials.get_tables()) {
209 table_poly =
Polynomial(tables_end, dyadic_size());
213 polynomials.lookup_read_counts =
Polynomial(tables_end, dyadic_size());
214 polynomials.lookup_read_tags =
Polynomial(tables_end, dyadic_size());
218 const size_t lookup_block_end = circuit.blocks.lookup.trace_end();
219 const size_t lookup_inverses_end =
std::max(lookup_block_end, tables_end);
221 polynomials.lookup_inverses =
Polynomial(lookup_inverses_end, dyadic_size());
224 polynomials.lookup_read_counts.add_masking();
225 polynomials.lookup_read_tags.add_masking();
226 polynomials.lookup_inverses.add_masking();
230template <
typename Flavor>
238 const size_t ecc_op_end = circuit.blocks.ecc_op.trace_end();
239 for (
auto& wire : polynomials.get_ecc_op_wires()) {
242 polynomials.lagrange_ecc_op =
Polynomial(ecc_op_end, dyadic_size());
245template <
typename Flavor>
249 BB_BENCH_NAME(
"allocate_databus_and_lookup_inverse_polynomials");
255 const auto offset_size = [](
size_t content) ->
size_t {
return NUM_DISABLED_ROWS_IN_SUMCHECK + content; };
258 const size_t q_busread_end = circuit.blocks.busread.trace_end();
260 size_t max_databus_column_size = 0;
262 bb::constexpr_for<0, NUM_BUS_COLUMNS, 1>([&]<
size_t bus_idx>() {
263 const size_t bus_size = circuit.get_bus_vector(bus_idx).size();
264 max_databus_column_size =
std::max(max_databus_column_size, bus_size);
267 auto entities = polynomials.template databus_entities_for_bus<bus_idx>();
268 for (
auto& entity : entities) {
269 entity =
Polynomial(offset_size(bus_size), dyadic_size());
273 auto inverse_ref = polynomials.template databus_inverse_for_bus<bus_idx>();
274 inverse_ref[0] =
Polynomial(
std::max(offset_size(bus_size), q_busread_end), dyadic_size());
279 auto& values_poly = entities[0];
280 auto& read_counts_poly = entities[1];
281 if constexpr (bus_idx != 0) {
282 values_poly.add_masking();
284 read_counts_poly.add_masking();
285 inverse_ref[0].add_masking();
289 polynomials.databus_id =
Polynomial(offset_size(max_databus_column_size), dyadic_size());
296 construct_lookup_table_polynomials<Flavor>(polynomials.get_tables(), circuit);
300 construct_lookup_read_counts<Flavor>(polynomials.lookup_read_counts, polynomials.lookup_read_tags, circuit);
307template <
typename Flavor>
313 size_t max_bus_size = 0;
314 bb::constexpr_for<0, NUM_BUS_COLUMNS, 1>([&]<
size_t bus_idx>() {
315 const auto& bus_vec = circuit.get_bus_vector(bus_idx);
316 max_bus_size =
std::max(max_bus_size, bus_vec.size());
317 auto entities = polynomials.template databus_entities_for_bus<bus_idx>();
318 auto& values_poly = entities[0];
319 auto& read_counts_poly = entities[1];
320 for (
size_t idx = 0; idx < bus_vec.size(); ++idx) {
321 values_poly.at(NUM_DISABLED_ROWS_IN_SUMCHECK + idx) = circuit.get_variable(bus_vec[idx]);
322 read_counts_poly.at(NUM_DISABLED_ROWS_IN_SUMCHECK + idx) = bus_vec.get_read_count(idx);
327 auto& databus_id = polynomials.databus_id;
328 for (
size_t i = 0; i < max_bus_size; ++i) {
329 databus_id.at(NUM_DISABLED_ROWS_IN_SUMCHECK + i) = i;
342 uint32_t ram_rom_offset = circuit.blocks.memory.trace_offset();
343 memory_read_records.reserve(circuit.memory_read_records.size());
344 for (
auto&
index : circuit.memory_read_records) {
345 memory_read_records.emplace_back(
index + ram_rom_offset);
347 memory_write_records.reserve(circuit.memory_write_records.size());
348 for (
auto&
index : circuit.memory_write_records) {
349 memory_write_records.emplace_back(
index + ram_rom_offset);
356#ifdef STARKNET_GARAGA_FLAVORS
#define BB_ASSERT(expression,...)
#define BB_ASSERT_GTE(left, right,...)
#define BB_BENCH_NAME(name)
static constexpr bool HasZK
static Polynomial shiftable(size_t virtual_size, bool masked=false)
Utility to create a shiftable polynomial of given virtual size.
Contains all the information required by a Honk prover to create a proof, constructed from a finalize...
void allocate_selectors(const Circuit &)
ProverInstance_()=default
void construct_lookup_polynomials(Circuit &circuit)
void allocate_lagrange_polynomials()
size_t compute_dyadic_size(Circuit &)
Compute the minimum dyadic (power-of-2) circuit size.
void allocate_ecc_op_polynomials(const Circuit &)
void allocate_permutation_argument_polynomials()
void allocate_table_lookup_polynomials(const Circuit &)
typename Flavor::CircuitBuilder Circuit
void populate_memory_records(const Circuit &circuit)
Copy RAM/ROM record of reads and writes from the circuit to the instance.
void construct_databus_polynomials(Circuit &)
Populate the per-bus databus polynomials (values and read counts) and the identity polynomial.
void allocate_databus_polynomials(const Circuit &)
typename Flavor::Polynomial Polynomial
static void populate(Builder &builder, ProverPolynomials &)
Given a circuit, populate a proving key with wire polys, selector polys, and sigma/id polys.
MemoryProfile GLOBAL_MEMORY_PROFILE
Entry point for Barretenberg command-line interface.
void analyze_prover_polynomials(ProverPolynomials &polynomials)
Analyze prover polynomials and print per-polynomial statistics about value sizes.
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Contains various functions that help construct Honk Sigma and Id polynomials.
void add_checkpoint(const std::string &stage)