28 const size_t tables_size = circuit.get_tables_size();
31 size_t min_size_of_execution_trace = circuit.blocks.get_total_content_size();
35 size_t total_num_gates =
36 NUM_DISABLED_ROWS_IN_SUMCHECK + num_zero_rows +
std::max(tables_size, min_size_of_execution_trace);
39 return circuit.get_circuit_subgroup_size(total_num_gates);
59 for (
auto& sigma : polynomials.get_sigmas()) {
62 for (
auto&
id : polynomials.get_ids()) {
67 const size_t z_perm_size =
Flavor::HasZK ? dyadic_size() : trace_active_range_size();
100 BB_BENCH_NAME(
"allocate_table_lookup_and_lookup_read_polynomials");
102 const size_t tables_size = circuit.get_tables_size();
106 for (
auto& table_poly : polynomials.get_tables()) {
107 table_poly =
Polynomial(tables_size, dyadic_size());
112 const size_t counts_and_tags_size =
Flavor::HasZK ? dyadic_size() : tables_size;
113 polynomials.lookup_read_counts =
Polynomial(counts_and_tags_size, dyadic_size());
114 polynomials.lookup_read_tags =
Polynomial(counts_and_tags_size, dyadic_size());
118 const size_t lookup_block_end = circuit.blocks.lookup.trace_offset() + circuit.blocks.lookup.size();
119 const size_t lookup_inverses_end =
std::max(lookup_block_end, tables_size);
121 const size_t lookup_inverses_size = (
Flavor::HasZK ? dyadic_size() : lookup_inverses_end);
122 polynomials.lookup_inverses =
Polynomial(lookup_inverses_size, dyadic_size());
144 BB_BENCH_NAME(
"allocate_databus_and_lookup_inverse_polynomials");
146 const size_t calldata_size = circuit.get_calldata().size();
147 const size_t sec_calldata_size = circuit.get_secondary_calldata().size();
148 const size_t return_data_size = circuit.get_return_data().size();
151 const size_t calldata_poly_size =
Flavor::HasZK ? dyadic_size() : calldata_size;
152 const size_t sec_calldata_poly_size =
Flavor::HasZK ? dyadic_size() : sec_calldata_size;
153 const size_t return_data_poly_size =
Flavor::HasZK ? dyadic_size() : return_data_size;
155 polynomials.calldata =
Polynomial(calldata_poly_size, dyadic_size());
156 polynomials.calldata_read_counts =
Polynomial(calldata_poly_size, dyadic_size());
157 polynomials.calldata_read_tags =
Polynomial(calldata_poly_size, dyadic_size());
159 polynomials.secondary_calldata =
Polynomial(sec_calldata_poly_size, dyadic_size());
160 polynomials.secondary_calldata_read_counts =
Polynomial(sec_calldata_poly_size, dyadic_size());
161 polynomials.secondary_calldata_read_tags =
Polynomial(sec_calldata_poly_size, dyadic_size());
163 polynomials.return_data =
Polynomial(return_data_poly_size, dyadic_size());
164 polynomials.return_data_read_counts =
Polynomial(return_data_poly_size, dyadic_size());
165 polynomials.return_data_read_tags =
Polynomial(return_data_poly_size, dyadic_size());
169 const size_t q_busread_end = circuit.blocks.busread.trace_offset() + circuit.blocks.busread.size();
170 size_t calldata_inverses_size =
Flavor::HasZK ? dyadic_size() :
std::max(calldata_size, q_busread_end);
171 size_t sec_calldata_inverses_size =
Flavor::HasZK ? dyadic_size() :
std::max(sec_calldata_size, q_busread_end);
172 size_t return_data_inverses_size =
Flavor::HasZK ? dyadic_size() :
std::max(return_data_size, q_busread_end);
174 polynomials.calldata_inverses =
Polynomial(calldata_inverses_size, dyadic_size());
175 polynomials.secondary_calldata_inverses =
Polynomial(sec_calldata_inverses_size, dyadic_size());
176 polynomials.return_data_inverses =
Polynomial(return_data_inverses_size, dyadic_size());
180 const size_t max_databus_column_size =
std::max({ calldata_size, sec_calldata_size, return_data_size, 2UL });
181 polynomials.databus_id =
Polynomial(max_databus_column_size, dyadic_size());
195 auto& calldata_poly = polynomials.calldata;
196 auto& calldata_read_counts = polynomials.calldata_read_counts;
197 auto& calldata_read_tags = polynomials.calldata_read_tags;
198 auto& secondary_calldata_poly = polynomials.secondary_calldata;
199 auto& secondary_calldata_read_counts = polynomials.secondary_calldata_read_counts;
200 auto& secondary_calldata_read_tags = polynomials.secondary_calldata_read_tags;
201 auto& return_data_poly = polynomials.return_data;
202 auto& return_data_read_counts = polynomials.return_data_read_counts;
203 auto& return_data_read_tags = polynomials.return_data_read_tags;
205 const auto&
calldata = circuit.get_calldata();
206 const auto& secondary_calldata = circuit.get_secondary_calldata();
207 const auto& return_data = circuit.get_return_data();
211 for (
size_t idx = 0; idx <
calldata.size(); ++idx) {
212 calldata_poly.at(idx) = circuit.get_variable(
calldata[idx]);
213 calldata_read_counts.at(idx) =
calldata.get_read_count(idx);
214 calldata_read_tags.at(idx) = calldata_read_counts[idx] > 0 ? 1 : 0;
216 for (
size_t idx = 0; idx < secondary_calldata.size(); ++idx) {
217 secondary_calldata_poly.at(idx) = circuit.get_variable(secondary_calldata[idx]);
218 secondary_calldata_read_counts.at(idx) = secondary_calldata.get_read_count(idx);
219 secondary_calldata_read_tags.at(idx) =
220 secondary_calldata_read_counts[idx] > 0 ? 1 : 0;
222 for (
size_t idx = 0; idx < return_data.size(); ++idx) {
223 return_data_poly.at(idx) = circuit.get_variable(return_data[idx]);
224 return_data_read_counts.at(idx) = return_data.get_read_count(idx);
225 return_data_read_tags.at(idx) = return_data_read_counts[idx] > 0 ? 1 : 0;
228 auto& databus_id = polynomials.databus_id;
230 for (
size_t i = 0; i < databus_id.size(); ++i) {
231 databus_id.at(i) = i;
243 uint32_t ram_rom_offset = circuit.blocks.memory.trace_offset();
244 memory_read_records.reserve(circuit.memory_read_records.size());
245 for (
auto&
index : circuit.memory_read_records) {
246 memory_read_records.emplace_back(
index + ram_rom_offset);
248 memory_write_records.reserve(circuit.memory_write_records.size());
249 for (
auto&
index : circuit.memory_write_records) {
250 memory_write_records.emplace_back(
index + ram_rom_offset);