Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
tracegen_helper.cpp
Go to the documentation of this file.
2
3#include <array>
4#include <functional>
5#include <span>
6#include <string>
7#include <vector>
8
54
55namespace bb::avm2 {
56
57using namespace bb::avm2::simulation;
58using namespace bb::avm2::tracegen;
59
60namespace {
61
62auto build_precomputed_columns_jobs(TraceContainer& trace)
63{
64 return std::vector<std::function<void()>>{
65 [&]() {
67 AVM_TRACK_TIME("tracegen/precomputed/misc", precomputed_builder.process_misc(trace));
68 },
69 [&]() {
71 AVM_TRACK_TIME("tracegen/precomputed/bitwise", precomputed_builder.process_bitwise(trace));
72 },
73 [&]() {
75 AVM_TRACK_TIME("tracegen/precomputed/range_8", precomputed_builder.process_sel_range_8(trace));
76 AVM_TRACK_TIME("tracegen/precomputed/range_16", precomputed_builder.process_sel_range_16(trace));
77 AVM_TRACK_TIME("tracegen/precomputed/power_of_2", precomputed_builder.process_power_of_2(trace));
78 AVM_TRACK_TIME("tracegen/precomputed/sha256_round_constants",
80 AVM_TRACK_TIME("tracegen/precomputed/keccak_round_constants",
82 AVM_TRACK_TIME("tracegen/precomputed/tag_parameters", precomputed_builder.process_tag_parameters(trace));
83 AVM_TRACK_TIME("tracegen/precomputed/operand_dec_selectors",
85 AVM_TRACK_TIME("tracegen/precomputed/exec_instruction_spec",
87 AVM_TRACK_TIME("tracegen/precomputed/memory_tag_ranges",
89 AVM_TRACK_TIME("tracegen/precomputed/addressing_gas", precomputed_builder.process_addressing_gas(trace));
90 AVM_TRACK_TIME("tracegen/precomputed/phase_table", precomputed_builder.process_phase_table(trace));
91 AVM_TRACK_TIME("tracegen/precomputed/get_env_var_table",
93 AVM_TRACK_TIME("tracegen/precomputed/get_contract_instance_table",
95 },
96 [&]() {
97 // ToRadix jobs are relatively expensive, so we process them in a separate job.
99 AVM_TRACK_TIME("tracegen/precomputed/to_radix_safe_limbs",
101 AVM_TRACK_TIME("tracegen/precomputed/to_radix_p_decompositions",
103 },
104 [&]() {
105 // public_inputs.sel is precomputed. Should it be populated by the precomputed builder?
108 },
109 };
110}
111
112auto build_public_inputs_columns_jobs(TraceContainer& trace, const PublicInputs& public_inputs)
113{
114 return std::vector<std::function<void()>>{
115 [&]() {
117 public_inputs_builder.process_public_inputs(trace, public_inputs);
118 },
119 };
120}
121
122void execute_jobs(std::span<std::function<void()>> jobs)
123{
124 parallel_for(jobs.size(), [&](size_t i) { jobs[i](); });
125}
126
127template <typename T> inline void clear_events(T& c)
128{
129 c.clear();
130 c.shrink_to_fit();
131}
132
133void print_trace_stats(const TraceContainer& trace)
134{
135 constexpr auto main_relation_names = [] {
136 constexpr size_t size = std::tuple_size_v<AvmFlavor::MainRelations>;
138 constexpr_for<0, size, 1>(
139 [&names]<size_t i> { names[i] = std::tuple_element_t<i, AvmFlavor::MainRelations>::NAME; });
140 return names;
141 }();
142
143 unordered_flat_map<std::string, uint32_t> namespace_column_sizes;
144 uint64_t total_rows = 0;
145 for (size_t col = 0; col < trace.num_columns(); ++col) {
146 const auto& column_rows = trace.get_column_rows(static_cast<Column>(col));
147 const std::string& column_name = COLUMN_NAMES.at(col);
148 const std::string namespace_name = [&]() {
149 for (const auto& main_relation_name : main_relation_names) {
150 if (column_name.starts_with(main_relation_name)) {
151 return std::string(main_relation_name);
152 }
153 }
154 return column_name.substr(0, column_name.find_first_of('_'));
155 }();
156 namespace_column_sizes[namespace_name] = std::max(namespace_column_sizes[namespace_name], column_rows);
157 total_rows += column_rows;
158 }
159 vinfo("Column sizes per namespace:");
160 for (const auto& [namespace_name, column_size] : namespace_column_sizes) {
161 vinfo(" ",
162 namespace_name,
163 ": ",
164 column_size,
165 " (~2^",
167 ")");
168 }
169 vinfo(
170 "Sum of all column rows: ", total_rows, " (~2^", numeric::get_msb(numeric::round_up_power_2(total_rows)), ")");
171}
172
173} // namespace
174
176{
178
179 fill_trace_columns(trace, std::move(events), public_inputs);
181
182 print_trace_stats(trace);
183
184 return trace;
185}
186
188 EventsContainer&& events,
189 const PublicInputs& public_inputs)
190{
191 // We process the events in parallel. Ideally the jobs should access disjoint column sets.
192 {
193 auto jobs = concatenate(
194 // Precomputed column jobs.
195 build_precomputed_columns_jobs(trace),
196 // Public inputs column jobs.
197 build_public_inputs_columns_jobs(trace, public_inputs),
198 // Subtrace jobs.
199 std::vector<std::function<void()>>{
200 [&]() {
201 TxTraceBuilder tx_builder;
202 AVM_TRACK_TIME("tracegen/tx", tx_builder.process(events.tx, trace));
203 clear_events(events.tx);
204 },
205 [&]() {
206 ExecutionTraceBuilder exec_builder;
207 AVM_TRACK_TIME("tracegen/execution", exec_builder.process(events.execution, trace));
208 clear_events(events.execution);
209 },
210 [&]() {
211 AddressDerivationTraceBuilder address_derivation_builder;
212 AVM_TRACK_TIME("tracegen/address_derivation",
213 address_derivation_builder.process(events.address_derivation, trace));
214 clear_events(events.address_derivation);
215 },
216 [&]() {
217 AluTraceBuilder alu_builder;
218 AVM_TRACK_TIME("tracegen/alu", alu_builder.process(events.alu, trace));
219 clear_events(events.alu);
220 },
221 [&]() {
222 BytecodeTraceBuilder bytecode_builder;
223 AVM_TRACK_TIME("tracegen/bytecode_decomposition",
224 bytecode_builder.process_decomposition(events.bytecode_decomposition, trace));
225 clear_events(events.bytecode_decomposition);
226 },
227 [&]() {
228 BytecodeTraceBuilder bytecode_builder;
229 AVM_TRACK_TIME("tracegen/bytecode_hashing",
230 bytecode_builder.process_hashing(events.bytecode_hashing, trace));
231 clear_events(events.bytecode_hashing);
232 },
233 [&]() {
235 AVM_TRACK_TIME("tracegen/class_id_derivation",
236 class_id_builder.process(events.class_id_derivation, trace));
237 clear_events(events.class_id_derivation);
238 },
239 [&]() {
240 BytecodeTraceBuilder bytecode_builder;
241 AVM_TRACK_TIME("tracegen/bytecode_retrieval",
242 bytecode_builder.process_retrieval(events.bytecode_retrieval, trace));
243 clear_events(events.bytecode_retrieval);
244 },
245 [&]() {
246 BytecodeTraceBuilder bytecode_builder;
247 AVM_TRACK_TIME("tracegen/instruction_fetching",
248 bytecode_builder.process_instruction_fetching(events.instruction_fetching, trace));
249 clear_events(events.instruction_fetching);
250 },
251 [&]() {
252 Sha256TraceBuilder sha256_builder;
253 AVM_TRACK_TIME("tracegen/sha256_compression",
254 sha256_builder.process(events.sha256_compression, trace));
255 clear_events(events.sha256_compression);
256 },
257 [&]() {
258 KeccakF1600TraceBuilder keccakf1600_builder;
259 AVM_TRACK_TIME("tracegen/keccak_f1600_permutation",
260 keccakf1600_builder.process_permutation(events.keccakf1600, trace));
261 AVM_TRACK_TIME("tracegen/keccak_f1600_memory_slices",
262 keccakf1600_builder.process_memory_slices(events.keccakf1600, trace));
263 clear_events(events.keccakf1600);
264 },
265 [&]() {
266 EccTraceBuilder ecc_builder;
267 AVM_TRACK_TIME("tracegen/ecc_add", ecc_builder.process_add(events.ecc_add, trace));
268 clear_events(events.ecc_add);
269 },
270 [&]() {
271 EccTraceBuilder ecc_builder;
272 AVM_TRACK_TIME("tracegen/scalar_mul", ecc_builder.process_scalar_mul(events.scalar_mul, trace));
273 clear_events(events.scalar_mul);
274 },
275 [&]() {
276 EccTraceBuilder ecc_builder;
277 AVM_TRACK_TIME("tracegen/ecc_add_memory",
278 ecc_builder.process_add_with_memory(events.ecc_add_mem, trace));
279 clear_events(events.ecc_add_mem);
280 },
281 [&]() {
283 AVM_TRACK_TIME("tracegen/poseidon2_hash",
284 poseidon2_builder.process_hash(events.poseidon2_hash, trace));
285 clear_events(events.poseidon2_hash);
286 },
287 [&]() {
289 AVM_TRACK_TIME("tracegen/poseidon2_permutation",
290 poseidon2_builder.process_permutation(events.poseidon2_permutation, trace));
291 clear_events(events.poseidon2_permutation);
292 },
293 [&]() {
296 "tracegen/poseidon2_permutation_with_memory",
297 poseidon2_builder.process_permutation_with_memory(events.poseidon2_permutation_mem, trace));
298 clear_events(events.poseidon2_permutation_mem);
299 },
300 [&]() {
301 ToRadixTraceBuilder to_radix_builder;
302 AVM_TRACK_TIME("tracegen/to_radix", to_radix_builder.process(events.to_radix, trace));
303 clear_events(events.to_radix);
304 },
305 [&]() {
306 ToRadixTraceBuilder to_radix_builder;
307 AVM_TRACK_TIME("tracegen/to_radix_memory",
308 to_radix_builder.process_with_memory(events.to_radix_memory, trace));
309 clear_events(events.to_radix_memory);
310 },
311 [&]() {
313 AVM_TRACK_TIME("tracegen/field_gt", field_gt_builder.process(events.field_gt, trace));
314 clear_events(events.field_gt);
315 },
316 [&]() {
317 MerkleCheckTraceBuilder merkle_check_builder;
318 AVM_TRACK_TIME("tracegen/merkle_check", merkle_check_builder.process(events.merkle_check, trace));
319 clear_events(events.merkle_check);
320 },
321 [&]() {
323 AVM_TRACK_TIME("tracegen/range_check", range_check_builder.process(events.range_check, trace));
324 clear_events(events.range_check);
325 },
326 [&]() {
327 PublicDataTreeTraceBuilder public_data_tree_trace_builder;
328 AVM_TRACK_TIME("tracegen/public_data_tree_check",
329 public_data_tree_trace_builder.process(events.public_data_tree_check_events, trace));
330 clear_events(events.public_data_tree_check_events);
331 },
332 [&]() {
333 UpdateCheckTraceBuilder update_check_trace_builder;
334 AVM_TRACK_TIME("tracegen/update_check",
335 update_check_trace_builder.process(events.update_check_events, trace));
336 clear_events(events.update_check_events);
337 },
338 [&]() {
339 NullifierTreeCheckTraceBuilder nullifier_tree_check_trace_builder;
341 "tracegen/nullifier_tree_check",
342 nullifier_tree_check_trace_builder.process(events.nullifier_tree_check_events, trace));
343 clear_events(events.nullifier_tree_check_events);
344 },
345 [&]() {
346 MemoryTraceBuilder memory_trace_builder;
347 AVM_TRACK_TIME("tracegen/memory", memory_trace_builder.process(events.memory, trace));
348 clear_events(events.memory);
349 },
350 [&]() {
351 DataCopyTraceBuilder data_copy_trace_builder;
352 AVM_TRACK_TIME("tracegen/data_copy",
353 data_copy_trace_builder.process(events.data_copy_events, trace));
354 clear_events(events.data_copy_events);
355 },
356 [&]() {
357 BitwiseTraceBuilder bitwise_builder;
358 AVM_TRACK_TIME("tracegen/bitwise", bitwise_builder.process(events.bitwise, trace));
359 clear_events(events.bitwise);
360 },
361 [&]() {
362 CalldataTraceBuilder calldata_builder;
363 AVM_TRACK_TIME("tracegen/calldata_hashing",
364 calldata_builder.process_hashing(events.calldata_events, trace));
365 AVM_TRACK_TIME("tracegen/calldata_retrieval",
366 calldata_builder.process_retrieval(events.calldata_events, trace));
367 clear_events(events.calldata_events);
368 },
369 [&]() {
370 InternalCallStackBuilder internal_call_stack_builder;
371 AVM_TRACK_TIME("tracegen/internal_call_stack",
372 internal_call_stack_builder.process(events.internal_call_stack_events, trace));
373 clear_events(events.internal_call_stack_events);
374 },
375 [&]() {
376 ContextStackTraceBuilder context_stack_builder;
377 AVM_TRACK_TIME("tracegen/context_stack",
378 context_stack_builder.process(events.context_stack, trace));
379 clear_events(events.context_stack);
380 },
381 [&]() {
382 NoteHashTreeCheckTraceBuilder note_hash_tree_check_trace_builder;
384 "tracegen/note_hash_tree_check",
385 note_hash_tree_check_trace_builder.process(events.note_hash_tree_check_events, trace));
386 clear_events(events.note_hash_tree_check_events);
387 },
388 [&]() {
389 WrittenPublicDataSlotsTreeCheckTraceBuilder written_public_data_slots_tree_check_trace_builder;
390 AVM_TRACK_TIME("tracegen/written_public_data_slots_tree_check",
391 written_public_data_slots_tree_check_trace_builder.process(
392 events.written_public_data_slots_tree_check_events, trace));
393 clear_events(events.written_public_data_slots_tree_check_events);
394 },
395 [&]() {
397 AVM_TRACK_TIME("tracegen/gt", gt_builder.process(events.gt_events, trace));
398 clear_events(events.gt_events);
399 },
400 [&]() {
403 "tracegen/contract_instance_retrieval",
404 contract_instance_retrieval_builder.process(events.contract_instance_retrieval_events, trace));
405 clear_events(events.contract_instance_retrieval_events);
406 },
407 [&]() {
408 GetContractInstanceTraceBuilder get_contract_instance_builder;
409 AVM_TRACK_TIME("tracegen/get_contract_instance",
410 get_contract_instance_builder.process(events.get_contract_instance_events, trace));
411 clear_events(events.get_contract_instance_events);
412 },
413 [&]() {
414 L1ToL2MessageTreeCheckTraceBuilder l1_to_l2_message_tree_check_trace_builder;
415 AVM_TRACK_TIME("tracegen/l1_to_l2_message_tree_check",
416 l1_to_l2_message_tree_check_trace_builder.process(
417 events.l1_to_l2_msg_tree_check_events, trace));
418 clear_events(events.l1_to_l2_msg_tree_check_events);
419 },
420 [&]() {
421 EmitPublicLogTraceBuilder emit_public_log_builder;
422 AVM_TRACK_TIME("tracegen/emit_public_log",
423 emit_public_log_builder.process(events.emit_public_log_events, trace));
424 clear_events(events.emit_public_log_events);
425 },
426 [&]() {
428 AVM_TRACK_TIME("tracegen/retrieved_bytecodes_tree_check",
430 events.retrieved_bytecodes_tree_check_events, trace));
431 clear_events(events.retrieved_bytecodes_tree_check_events);
432 } });
433
434 AVM_TRACK_TIME("tracegen/traces", execute_jobs(jobs));
435 }
436}
437
439{
440 // Now we can compute lookups and permutations.
441 {
442 // We use a shared index cache so that lookups targeting the same destination columns
443 // can share the same index, avoiding redundant computation and memory usage.
444 SharedIndexCache index_cache;
445
446 auto jobs_interactions =
447 concatenate_jobs(MemoryTraceBuilder::interactions.get_all_jobs(index_cache),
448 TxTraceBuilder::interactions.get_all_jobs(index_cache),
449 ExecutionTraceBuilder::interactions.get_all_jobs(index_cache),
450 AluTraceBuilder::interactions.get_all_jobs(index_cache),
451 Poseidon2TraceBuilder::interactions.get_all_jobs(index_cache),
452 RangeCheckTraceBuilder::interactions.get_all_jobs(index_cache),
453 BitwiseTraceBuilder::interactions.get_all_jobs(index_cache),
454 Sha256TraceBuilder::interactions.get_all_jobs(index_cache),
455 KeccakF1600TraceBuilder::interactions.get_all_jobs(index_cache),
456 BytecodeTraceBuilder::interactions.get_all_jobs(index_cache),
457 ClassIdDerivationTraceBuilder::interactions.get_all_jobs(index_cache),
458 EccTraceBuilder::interactions.get_all_jobs(index_cache),
459 ToRadixTraceBuilder::interactions.get_all_jobs(index_cache),
460 AddressDerivationTraceBuilder::interactions.get_all_jobs(index_cache),
461 FieldGreaterThanTraceBuilder::interactions.get_all_jobs(index_cache),
462 MerkleCheckTraceBuilder::interactions.get_all_jobs(index_cache),
463 PublicDataTreeTraceBuilder::interactions.get_all_jobs(index_cache),
464 UpdateCheckTraceBuilder::interactions.get_all_jobs(index_cache),
465 NullifierTreeCheckTraceBuilder::interactions.get_all_jobs(index_cache),
466 DataCopyTraceBuilder::interactions.get_all_jobs(index_cache),
467 CalldataTraceBuilder::interactions.get_all_jobs(index_cache),
468 NoteHashTreeCheckTraceBuilder::interactions.get_all_jobs(index_cache),
470 GreaterThanTraceBuilder::interactions.get_all_jobs(index_cache),
472 GetContractInstanceTraceBuilder::interactions.get_all_jobs(index_cache),
473 L1ToL2MessageTreeCheckTraceBuilder::interactions.get_all_jobs(index_cache),
474 EmitPublicLogTraceBuilder::interactions.get_all_jobs(index_cache),
476
477 // Order jobs to minimize index building contention:
478 // Jobs with unique destination columns come first, then jobs that share destinations with earlier ones.
479 AVM_TRACK_TIME("tracegen/order_jobs_by_destination_columns",
480 order_jobs_by_destination_columns(jobs_interactions));
481
482 AVM_TRACK_TIME("tracegen/interactions",
483 parallel_for(jobs_interactions.size(), [&](size_t i) { jobs_interactions[i]->process(trace); }));
484 }
485}
486
488{
490 auto jobs = build_precomputed_columns_jobs(trace);
491 execute_jobs(jobs);
492 return trace;
493}
494
495} // namespace bb::avm2
Poseidon2TraceBuilder poseidon2_builder
ClassIdDerivationTraceBuilder class_id_builder
ContractInstanceRetrievalTraceBuilder contract_instance_retrieval_builder
RetrievedBytecodesTreeCheckTraceBuilder retrieved_bytecodes_tree_check_builder
void fill_trace_columns(tracegen::TraceContainer &trace, simulation::EventsContainer &&events, const PublicInputs &public_inputs)
tracegen::TraceContainer generate_trace(simulation::EventsContainer &&events, const PublicInputs &public_inputs)
void fill_trace_interactions(tracegen::TraceContainer &trace)
tracegen::TraceContainer generate_precomputed_columns()
void process(const simulation::EventEmitterInterface< simulation::AddressDerivationEvent >::Container &events, TraceContainer &trace)
static const InteractionDefinition interactions
Definition alu_trace.hpp:20
void process(const simulation::EventEmitterInterface< simulation::AluEvent >::Container &events, TraceContainer &trace)
Process the ALU events and populate the ALU relevant columns in the trace.
Trace builder for the bitwise subtrace (AND/OR/XOR operations).
void process(const simulation::EventEmitterInterface< simulation::BitwiseEvent >::Container &events, TraceContainer &trace)
Populate the bitwise trace columns from simulation events.
static const InteractionDefinition interactions
Interaction definitions for outbound lookups (BYTE_OPERATIONS, INTEGRAL_TAG_LENGTH).
void process_retrieval(const simulation::EventEmitterInterface< simulation::BytecodeRetrievalEvent >::Container &events, TraceContainer &trace)
Process bytecode retrieval events and populate the relevant columns in the trace. Corresponds to bc_r...
static const InteractionDefinition interactions
void process_decomposition(const simulation::EventEmitterInterface< simulation::BytecodeDecompositionEvent >::Container &events, TraceContainer &trace)
Process bytecode decomposition events and populate the relevant columns in the trace....
void process_hashing(const simulation::EventEmitterInterface< simulation::BytecodeHashingEvent >::Container &events, TraceContainer &trace)
void process_instruction_fetching(const simulation::EventEmitterInterface< simulation::InstructionFetchingEvent >::Container &events, TraceContainer &trace)
void process_hashing(const simulation::EventEmitterInterface< simulation::CalldataEvent >::Container &events, TraceContainer &trace)
static const InteractionDefinition interactions
void process_retrieval(const simulation::EventEmitterInterface< simulation::CalldataEvent >::Container &events, TraceContainer &trace)
void process(const simulation::EventEmitterInterface< simulation::ContextStackEvent >::Container &ctx_stack_events, TraceContainer &trace)
Process the context stack events and populate fields for the context stack sub-trace.
static const InteractionDefinition interactions
void process(const simulation::EventEmitterInterface< simulation::DataCopyEvent >::Container &events, TraceContainer &trace)
Builds the data copy trace.
void process_add_with_memory(const simulation::EventEmitterInterface< simulation::EccAddMemoryEvent >::Container &events, TraceContainer &trace)
Process the ECC add memory events and populate the relevant columns in the trace. Corresponds to the ...
void process_add(const simulation::EventEmitterInterface< simulation::EccAddEvent >::Container &events, TraceContainer &trace)
Process the ECC add events and populate the relevant columns in the trace. Corresponds to the non-mem...
Definition ecc_trace.cpp:71
void process_scalar_mul(const simulation::EventEmitterInterface< simulation::ScalarMulEvent >::Container &events, TraceContainer &trace)
Process the ECC scalar multiplication events and populate the relevant columns in the trace....
static const InteractionDefinition interactions
Definition ecc_trace.hpp:22
void process(const simulation::EventEmitterInterface< simulation::EmitPublicLogEvent >::Container &events, TraceContainer &trace)
Process emit-public-log events into trace rows.
static const InteractionDefinition interactions
static const InteractionDefinition interactions
void process(const simulation::EventEmitterInterface< simulation::ExecutionEvent >::Container &ex_events, TraceContainer &trace)
static const InteractionDefinition interactions
void process(const simulation::EventEmitterInterface< simulation::GetContractInstanceEvent >::Container &events, TraceContainer &trace)
static const InteractionDefinition interactions
Definition gt_trace.hpp:15
void process(const simulation::EventEmitterInterface< simulation::InternalCallStackEvent >::Container &events, TraceContainer &trace)
Process the internal call stack events and populate columns for the internal call stack sub-trace.
void process_memory_slices(const simulation::EventEmitterInterface< simulation::KeccakF1600Event >::Container &events, TraceContainer &trace)
static const InteractionDefinition interactions
void process_permutation(const simulation::EventEmitterInterface< simulation::KeccakF1600Event >::Container &events, TraceContainer &trace)
void process(const simulation::EventEmitterInterface< simulation::L1ToL2MessageTreeCheckEvent >::Container &events, TraceContainer &trace)
Process the L1-to-L2 message tree check events and populate the relevant columns in the trace.
static const InteractionDefinition interactions
void process(const simulation::EventEmitterInterface< simulation::MemoryEvent >::Container &events, TraceContainer &trace)
void process(const simulation::EventEmitterInterface< simulation::MerkleCheckEvent >::Container &events, TraceContainer &trace)
Trace generation for the MerkleCheck gadget. It handles both READ and WRITE MerkleCheck events....
static const InteractionDefinition interactions
void process(const simulation::EventEmitterInterface< simulation::NoteHashTreeCheckEvent >::Container &events, TraceContainer &trace)
Process the note hash tree check events and populate the relevant columns in the trace.
void process(const simulation::EventEmitterInterface< simulation::NullifierTreeCheckEvent >::Container &events, TraceContainer &trace)
Process the nullifier tree check events and populate the relevant columns in the trace.
static const InteractionDefinition interactions
void process_sha256_round_constants(TraceContainer &trace)
void process_to_radix_p_decompositions(TraceContainer &trace)
void process_misc(TraceContainer &trace, const uint32_t num_rows=PRECOMPUTED_TRACE_SIZE)
void process_wire_instruction_spec(TraceContainer &trace)
void process_keccak_round_constants(TraceContainer &trace)
void process_to_radix_safe_limbs(TraceContainer &trace)
void process_memory_tag_range(TraceContainer &trace)
void process_exec_instruction_spec(TraceContainer &trace)
void process_get_env_var_table(TraceContainer &trace)
void process_get_contract_instance_table(TraceContainer &trace)
void process(const simulation::EventEmitterInterface< simulation::PublicDataTreeCheckEvent >::Container &events, TraceContainer &trace)
void process_public_inputs(TraceContainer &trace, const PublicInputs &public_inputs)
void process_public_inputs_aux_precomputed(TraceContainer &trace)
static const InteractionDefinition interactions
void process(const simulation::EventEmitterInterface< simulation::Sha256CompressionEvent >::Container &events, TraceContainer &trace)
static const InteractionDefinition interactions
void process(const simulation::EventEmitterInterface< simulation::ToRadixEvent >::Container &events, TraceContainer &trace)
Processes the non-memory aware to_radix subtrace ingesting ToRadixEvent events. The populated number ...
static const InteractionDefinition interactions
void process_with_memory(const simulation::EventEmitterInterface< simulation::ToRadixMemoryEvent >::Container &events, TraceContainer &trace)
Processes the memory aware to_radix subtrace ingesting ToRadixMemoryEvent events. The populated numbe...
static constexpr size_t num_columns()
uint32_t get_column_rows(Column col) const
void process(const simulation::EventEmitterInterface< simulation::TxEvent >::Container &events, TraceContainer &trace)
Process the TX events and populate the relevant TX columns in the trace. A processed TxEvent is eithe...
Definition tx_trace.cpp:548
static const InteractionDefinition interactions
Definition tx_trace.hpp:15
void process(const simulation::EventEmitterInterface< simulation::UpdateCheckEvent >::Container &events, TraceContainer &trace)
static const InteractionDefinition interactions
void process(const simulation::EventEmitterInterface< simulation::WrittenPublicDataSlotsTreeCheckEvent >::Container &events, TraceContainer &trace)
#define vinfo(...)
Definition log.hpp:94
RangeCheckTraceBuilder range_check_builder
Definition alu.test.cpp:121
PrecomputedTraceBuilder precomputed_builder
Definition alu.test.cpp:120
FieldGreaterThanTraceBuilder field_gt_builder
Definition alu.test.cpp:122
GreaterThanTraceBuilder gt_builder
Definition alu.test.cpp:123
TestTraceContainer trace
AVM range check gadget for witness generation.
void order_jobs_by_destination_columns(std::vector< std::unique_ptr< InteractionBuilderInterface > > &jobs)
std::vector< T > concatenate_jobs(std::vector< T > &&first, auto &&... rest)
const std::vector< std::string > & COLUMN_NAMES
Definition columns.hpp:84
::ankerl::unordered_dense::map< Key, T > unordered_flat_map
Definition map.hpp:15
constexpr T get_msb(const T in)
Definition get_msb.hpp:49
constexpr T round_up_power_2(const T in)
Definition get_msb.hpp:75
RefArray< T,(Ns+...)> constexpr concatenate(const RefArray< T, Ns > &... ref_arrays)
Concatenates multiple RefArray objects into a single RefArray.
void parallel_for(size_t num_iterations, const std::function< void(size_t)> &func)
Definition thread.cpp:111
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
#define AVM_TRACK_TIME(key, body)
Definition stats.hpp:16
tracegen::PublicInputsTraceBuilder public_inputs_builder
Definition tx.test.cpp:81