29 const size_t tables_size = circuit.get_tables_size();
32 size_t min_size_of_execution_trace = circuit.blocks.get_total_content_size();
36 size_t total_num_gates =
37 NUM_DISABLED_ROWS_IN_SUMCHECK + num_zero_rows +
std::max(tables_size, min_size_of_execution_trace);
40 return circuit.get_circuit_subgroup_size(total_num_gates);
60 for (
auto& sigma : polynomials.get_sigmas()) {
63 for (
auto&
id : polynomials.get_ids()) {
68 const size_t z_perm_size =
Flavor::HasZK ? dyadic_size() : trace_active_range_size();
101 BB_BENCH_NAME(
"allocate_table_lookup_and_lookup_read_polynomials");
103 const size_t tables_size = circuit.get_tables_size();
107 for (
auto& table_poly : polynomials.get_tables()) {
108 table_poly =
Polynomial(tables_size, dyadic_size());
113 const size_t counts_and_tags_size =
Flavor::HasZK ? dyadic_size() : tables_size;
114 polynomials.lookup_read_counts =
Polynomial(counts_and_tags_size, dyadic_size());
115 polynomials.lookup_read_tags =
Polynomial(counts_and_tags_size, dyadic_size());
119 const size_t lookup_block_end = circuit.blocks.lookup.trace_offset() + circuit.blocks.lookup.size();
120 const size_t lookup_inverses_end =
std::max(lookup_block_end, tables_size);
122 const size_t lookup_inverses_size = (
Flavor::HasZK ? dyadic_size() : lookup_inverses_end);
123 polynomials.lookup_inverses =
Polynomial(lookup_inverses_size, dyadic_size());
145 BB_BENCH_NAME(
"allocate_databus_and_lookup_inverse_polynomials");
148 const size_t sec_calldata_size = circuit.get_secondary_calldata().size();
149 const size_t return_data_size = circuit.get_return_data().size();
153 const size_t sec_calldata_poly_size =
Flavor::HasZK ? dyadic_size() : sec_calldata_size;
154 const size_t return_data_poly_size =
Flavor::HasZK ? dyadic_size() : return_data_size;
156 polynomials.calldata =
Polynomial(calldata_poly_size, dyadic_size());
157 polynomials.calldata_read_counts =
Polynomial(calldata_poly_size, dyadic_size());
158 polynomials.calldata_read_tags =
Polynomial(calldata_poly_size, dyadic_size());
160 polynomials.secondary_calldata =
Polynomial(sec_calldata_poly_size, dyadic_size());
161 polynomials.secondary_calldata_read_counts =
Polynomial(sec_calldata_poly_size, dyadic_size());
162 polynomials.secondary_calldata_read_tags =
Polynomial(sec_calldata_poly_size, dyadic_size());
164 polynomials.return_data =
Polynomial(return_data_poly_size, dyadic_size());
165 polynomials.return_data_read_counts =
Polynomial(return_data_poly_size, dyadic_size());
166 polynomials.return_data_read_tags =
Polynomial(return_data_poly_size, dyadic_size());
170 const size_t q_busread_end = circuit.blocks.busread.trace_offset() + circuit.blocks.busread.size();
172 size_t sec_calldata_inverses_size =
Flavor::HasZK ? dyadic_size() :
std::max(sec_calldata_size, q_busread_end);
173 size_t return_data_inverses_size =
Flavor::HasZK ? dyadic_size() :
std::max(return_data_size, q_busread_end);
175 polynomials.calldata_inverses =
Polynomial(calldata_inverses_size, dyadic_size());
176 polynomials.secondary_calldata_inverses =
Polynomial(sec_calldata_inverses_size, dyadic_size());
177 polynomials.return_data_inverses =
Polynomial(return_data_inverses_size, dyadic_size());
181 const size_t max_databus_column_size =
std::max({
calldata_size, sec_calldata_size, return_data_size, 2UL });
182 polynomials.databus_id =
Polynomial(max_databus_column_size, dyadic_size());
196 auto& calldata_poly = polynomials.calldata;
197 auto& calldata_read_counts = polynomials.calldata_read_counts;
198 auto& calldata_read_tags = polynomials.calldata_read_tags;
199 auto& secondary_calldata_poly = polynomials.secondary_calldata;
200 auto& secondary_calldata_read_counts = polynomials.secondary_calldata_read_counts;
201 auto& secondary_calldata_read_tags = polynomials.secondary_calldata_read_tags;
202 auto& return_data_poly = polynomials.return_data;
203 auto& return_data_read_counts = polynomials.return_data_read_counts;
204 auto& return_data_read_tags = polynomials.return_data_read_tags;
206 const auto&
calldata = circuit.get_calldata();
207 const auto& secondary_calldata = circuit.get_secondary_calldata();
208 const auto& return_data = circuit.get_return_data();
212 for (
size_t idx = 0; idx <
calldata.size(); ++idx) {
213 calldata_poly.at(idx) = circuit.get_variable(
calldata[idx]);
214 calldata_read_counts.at(idx) =
calldata.get_read_count(idx);
215 calldata_read_tags.at(idx) = calldata_read_counts[idx] > 0 ? 1 : 0;
217 for (
size_t idx = 0; idx < secondary_calldata.size(); ++idx) {
218 secondary_calldata_poly.at(idx) = circuit.get_variable(secondary_calldata[idx]);
219 secondary_calldata_read_counts.at(idx) = secondary_calldata.get_read_count(idx);
220 secondary_calldata_read_tags.at(idx) =
221 secondary_calldata_read_counts[idx] > 0 ? 1 : 0;
223 for (
size_t idx = 0; idx < return_data.size(); ++idx) {
224 return_data_poly.at(idx) = circuit.get_variable(return_data[idx]);
225 return_data_read_counts.at(idx) = return_data.get_read_count(idx);
226 return_data_read_tags.at(idx) = return_data_read_counts[idx] > 0 ? 1 : 0;
229 auto& databus_id = polynomials.databus_id;
231 for (
size_t i = 0; i < databus_id.size(); ++i) {
232 databus_id.at(i) = i;
244 uint32_t ram_rom_offset = circuit.blocks.memory.trace_offset();
245 memory_read_records.reserve(circuit.memory_read_records.size());
246 for (
auto&
index : circuit.memory_read_records) {
247 memory_read_records.emplace_back(
index + ram_rom_offset);
249 memory_write_records.reserve(circuit.memory_write_records.size());
250 for (
auto&
index : circuit.memory_write_records) {
251 memory_write_records.emplace_back(
index + ram_rom_offset);