28 vinfo(
"Constructing ProverInstance");
32 BB_ASSERT(circuit.pairing_points_tagging.has_single_pairing_point_tag(),
33 "Pairing points must all be aggregated together. Either no pairing points should be created, or "
34 "all created pairing points must be aggregated into a single pairing point. Found "
35 << circuit.pairing_points_tagging.num_unique_pairing_points() <<
" different pairing points.");
37 BB_ASSERT(circuit.pairing_points_tagging.has_public_pairing_points() ||
38 !circuit.pairing_points_tagging.has_pairing_points(),
39 "Pairing points must be set to public in the circuit before constructing the ProverInstance.");
44 if (!circuit.circuit_finalized) {
45 circuit.finalize_circuit();
48 circuit.blocks.compute_offsets(TRACE_OFFSET);
49 metadata.dyadic_size = compute_dyadic_size(circuit);
52 for (
auto& block : circuit.blocks.get()) {
53 if (block.size() > 0) {
54 final_active_wire_idx = block.trace_end() - 1;
61 vinfo(
"allocating polynomials object in prover instance...");
63 populate_memory_records(circuit);
65 allocate_permutation_argument_polynomials();
66 allocate_selectors(circuit);
67 if constexpr (Flavor::HasLogDerivLookup) {
68 allocate_table_lookup_polynomials(circuit);
70 allocate_lagrange_polynomials();
72 if constexpr (Flavor::HasEccOpQueue) {
73 allocate_ecc_op_polynomials(circuit);
75 if constexpr (Flavor::HasDataBus) {
76 allocate_databus_polynomials(circuit);
80 polynomials.set_shifted();
88 vinfo(
"populating trace...");
91 if constexpr (Flavor::HasDataBus) {
93 construct_databus_polynomials(circuit);
97 polynomials.lagrange_first().at(TRACE_OFFSET) = 1;
98 polynomials.lagrange_last().at(final_active_wire_idx) = 1;
100 if constexpr (Flavor::HasLogDerivLookup) {
101 construct_lookup_polynomials(circuit);
105 metadata.num_public_inputs = circuit.blocks.pub_inputs.size();
106 metadata.pub_inputs_offset = circuit.blocks.pub_inputs.trace_offset();
107 for (
size_t i = 0; i < metadata.num_public_inputs; ++i) {
108 size_t idx = i + metadata.pub_inputs_offset;
109 public_inputs.emplace_back(polynomials.w_r()[idx]);
113 ipa_proof = circuit.ipa_proof;
135 const size_t tables_size = circuit.get_tables_size();
138 size_t min_size_of_execution_trace = circuit.blocks.get_total_content_size();
141 const size_t tables_end = circuit.blocks.lookup.trace_offset() + tables_size;
142 const size_t trace_end = TRACE_OFFSET + NUM_ZERO_ROWS + min_size_of_execution_trace;
143 size_t total_num_gates =
std::max(tables_end, trace_end);
146 return circuit.get_circuit_subgroup_size(total_num_gates);
153 const size_t wire_size = trace_active_range_size();
155 for (
auto& wire : polynomials.get_wires()) {
167 for (
auto& sigma : polynomials.get_sigmas()) {
170 for (
auto&
id : polynomials.get_ids()) {
182 1, dyadic_size(), TRACE_OFFSET);
185 1, dyadic_size(), final_active_wire_idx);
194 for (
auto [selector, block] :
195 zip_view(polynomials.get_gate_selectors(), Flavor::Generated::get_gate_blocks(circuit.blocks))) {
196 selector =
Polynomial(block.size(), dyadic_size(), block.trace_offset());
200 for (
auto& selector : polynomials.get_non_gate_selectors()) {
201 selector =
Polynomial(trace_active_range_size(), dyadic_size());
205template <
typename Flavor>
207 requires(Flavor::HasLogDerivLookup)
209 BB_BENCH_NAME(
"allocate_table_lookup_and_lookup_read_polynomials");
211 const size_t tables_size = circuit.get_tables_size();
212 const size_t table_offset = circuit.blocks.lookup.trace_offset();
213 const size_t tables_end = table_offset + tables_size;
222 for (
auto& table_poly : polynomials.get_tables()) {
223 table_poly =
Polynomial(tables_end - TRACE_OFFSET, dyadic_size(), TRACE_OFFSET);
227 polynomials.lookup_read_counts() =
Polynomial(tables_end, dyadic_size());
228 polynomials.lookup_read_tags() =
Polynomial(tables_end, dyadic_size());
232 const size_t lookup_block_end = circuit.blocks.lookup.trace_end();
233 const size_t lookup_inverses_end =
std::max(lookup_block_end, tables_end);
235 polynomials.lookup_inverses() =
Polynomial(lookup_inverses_end, dyadic_size());
238 polynomials.lookup_read_counts().add_masking();
239 polynomials.lookup_read_tags().add_masking();
240 polynomials.lookup_inverses().add_masking();
244template <
typename Flavor>
246 requires Flavor::HasEccOpQueue
252 const size_t ecc_op_end = circuit.blocks.ecc_op.trace_end();
253 for (
auto& wire : polynomials.get_ecc_op_wires()) {
256 polynomials.lagrange_ecc_op() = Polynomial(ecc_op_end, dyadic_size());
259template <
typename Flavor>
260void ProverInstance_<Flavor>::allocate_databus_polynomials(
const Circuit& circuit)
261 requires Flavor::HasDataBus
263 BB_BENCH_NAME(
"allocate_databus_and_lookup_inverse_polynomials");
269 const auto offset_size = [](
size_t content) ->
size_t {
return NUM_DISABLED_ROWS_IN_SUMCHECK + content; };
272 const size_t q_busread_end = circuit.blocks.busread.trace_end();
274 size_t max_databus_column_size = 0;
276 auto bus_data = polynomials.get_databus_entities();
277 auto bus_inverses = polynomials.get_databus_inverses();
278 auto bus_indicators = polynomials.get_databus_indicators();
279 bb::constexpr_for<0, Flavor::NUM_BUS_COLUMNS, 1>([&]<
size_t bus_idx>() {
284 constexpr size_t builder_bus_idx = Flavor::BUILDER_BUS_INDICES[bus_idx];
285 const size_t bus_size = circuit.get_bus_vector(builder_bus_idx).size();
286 max_databus_column_size =
std::max(max_databus_column_size, bus_size);
288 auto& values_poly = bus_data[2 * bus_idx];
289 auto& read_counts_poly = bus_data[(2 * bus_idx) + 1];
290 auto& inverse_poly = bus_inverses[bus_idx];
291 auto& indicator_poly = bus_indicators[bus_idx];
294 values_poly = Polynomial(offset_size(bus_size), dyadic_size());
295 read_counts_poly = Polynomial(offset_size(bus_size), dyadic_size());
298 inverse_poly = Polynomial(
std::max(offset_size(bus_size), q_busread_end), dyadic_size());
301 indicator_poly = Polynomial(offset_size(bus_size), dyadic_size());
306 if constexpr (bus_idx != 0) {
307 values_poly.add_masking();
309 read_counts_poly.add_masking();
310 inverse_poly.add_masking();
314 polynomials.databus_id() = Polynomial(offset_size(max_databus_column_size), dyadic_size());
317template <
typename Flavor>
319 requires(Flavor::HasLogDerivLookup)
323 construct_lookup_table_polynomials<Flavor>(polynomials.get_tables(), circuit);
327 construct_lookup_read_counts<Flavor>(polynomials.lookup_read_counts(), polynomials.lookup_read_tags(), circuit);
334template <
typename Flavor>
335void ProverInstance_<Flavor>::construct_databus_polynomials(Circuit& circuit)
336 requires Flavor::HasDataBus
340 size_t max_bus_size = 0;
341 auto bus_data = polynomials.get_databus_entities();
342 bb::constexpr_for<0, Flavor::NUM_BUS_COLUMNS, 1>([&]<
size_t bus_idx>() {
343 constexpr size_t builder_bus_idx = Flavor::BUILDER_BUS_INDICES[bus_idx];
344 const auto& bus_vec = circuit.get_bus_vector(builder_bus_idx);
345 max_bus_size =
std::max(max_bus_size, bus_vec.size());
346 auto& values_poly = bus_data[2 * bus_idx];
347 auto& read_counts_poly = bus_data[(2 * bus_idx) + 1];
348 for (
size_t idx = 0; idx < bus_vec.size(); ++idx) {
349 values_poly.at(NUM_DISABLED_ROWS_IN_SUMCHECK + idx) = circuit.get_variable(bus_vec[idx]);
350 read_counts_poly.at(NUM_DISABLED_ROWS_IN_SUMCHECK + idx) = bus_vec.get_read_count(idx);
355 auto& databus_id = polynomials.databus_id();
356 for (
size_t i = 0; i < max_bus_size; ++i) {
357 databus_id.at(NUM_DISABLED_ROWS_IN_SUMCHECK + i) = i;
361 auto indicators = polynomials.get_databus_indicators();
362 for (
size_t bus_idx = 0; bus_idx < Flavor::NUM_BUS_COLUMNS; ++bus_idx) {
363 const size_t builder_bus_idx = Flavor::BUILDER_BUS_INDICES[bus_idx];
364 const size_t bus_size = circuit.get_bus_vector(builder_bus_idx).size();
365 auto& indicator = indicators[bus_idx];
366 for (
size_t i = 0; i < bus_size; ++i) {
367 indicator.at(NUM_DISABLED_ROWS_IN_SUMCHECK + i) = 1;
381 uint32_t ram_rom_offset = circuit.blocks.memory.trace_offset();
382 memory_read_records.reserve(circuit.memory_read_records.size());
383 for (
auto&
index : circuit.memory_read_records) {
384 memory_read_records.emplace_back(
index + ram_rom_offset);
386 memory_write_records.reserve(circuit.memory_write_records.size());
387 for (
auto&
index : circuit.memory_write_records) {
388 memory_write_records.emplace_back(
index + ram_rom_offset);
390 rom_logup_records.reserve(circuit.rom_logup_records.size());
391 for (
auto&
index : circuit.rom_logup_records) {
392 rom_logup_records.emplace_back(
index + ram_rom_offset);
396template class ProverInstance_<UltraFlavor>;
397template class ProverInstance_<UltraZKFlavor>;
398template class ProverInstance_<UltraKeccakFlavor>;
399#ifdef STARKNET_GARAGA_FLAVORS
400template class ProverInstance_<UltraStarknetFlavor>;
401template class ProverInstance_<UltraStarknetZKFlavor>;
403template class ProverInstance_<UltraKeccakZKFlavor>;
404template class ProverInstance_<MegaFlavor>;
405template class ProverInstance_<MegaZKFlavor>;
406template class ProverInstance_<MegaAvmFlavor>;
407template class ProverInstance_<MegaAppFlavor>;
408template class ProverInstance_<MegaKernelFlavor>;
#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 allocate_lagrange_polynomials()
size_t compute_dyadic_size(Circuit &)
Compute the minimum dyadic (power-of-2) circuit size.
void allocate_table_lookup_polynomials(const Circuit &)
void populate_memory_records(const Circuit &circuit)
void allocate_permutation_argument_polynomials()
typename Flavor::CircuitBuilder Circuit
typename Flavor::Polynomial Polynomial
void allocate_ecc_op_polynomials(const Circuit &) void allocate_databus_polynomials(const Circuit &) Flavor void construct_databus_polynomials(Circuit &) Flavor void construct_lookup_polynomials(Circuit &circuit)
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)