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
53
54namespace bb::avm2 {
55
56using namespace bb::avm2::simulation;
57using namespace bb::avm2::tracegen;
58
59namespace {
60
61auto build_precomputed_columns_jobs(TraceContainer& trace)
62{
63 return std::vector<std::function<void()>>{
64 [&]() {
66 AVM_TRACK_TIME("tracegen/precomputed/misc", precomputed_builder.process_misc(trace));
67 },
68 [&]() {
70 AVM_TRACK_TIME("tracegen/precomputed/bitwise", precomputed_builder.process_bitwise(trace));
71 },
72 [&]() {
74 AVM_TRACK_TIME("tracegen/precomputed/range_8", precomputed_builder.process_sel_range_8(trace));
75 AVM_TRACK_TIME("tracegen/precomputed/range_16", precomputed_builder.process_sel_range_16(trace));
76 AVM_TRACK_TIME("tracegen/precomputed/power_of_2", precomputed_builder.process_power_of_2(trace));
77 AVM_TRACK_TIME("tracegen/precomputed/sha256_round_constants",
79 AVM_TRACK_TIME("tracegen/precomputed/keccak_round_constants",
81 AVM_TRACK_TIME("tracegen/precomputed/tag_parameters", precomputed_builder.process_tag_parameters(trace));
82 AVM_TRACK_TIME("tracegen/precomputed/operand_dec_selectors",
84 AVM_TRACK_TIME("tracegen/precomputed/exec_instruction_spec",
86 AVM_TRACK_TIME("tracegen/precomputed/memory_tag_ranges",
88 AVM_TRACK_TIME("tracegen/precomputed/addressing_gas", precomputed_builder.process_addressing_gas(trace));
89 AVM_TRACK_TIME("tracegen/precomputed/phase_table", precomputed_builder.process_phase_table(trace));
90 AVM_TRACK_TIME("tracegen/precomputed/get_env_var_table",
92 AVM_TRACK_TIME("tracegen/precomputed/get_contract_instance_table",
94 },
95 [&]() {
96 // ToRadix jobs are relatively expensive, so we process them in a separate job.
98 AVM_TRACK_TIME("tracegen/precomputed/to_radix_safe_limbs",
100 AVM_TRACK_TIME("tracegen/precomputed/to_radix_p_decompositions",
102 },
103 [&]() {
104 // public_inputs.sel is precomputed. Should it be populated by the precomputed builder?
107 },
108 };
109}
110
111auto build_public_inputs_columns_jobs(TraceContainer& trace, const PublicInputs& public_inputs)
112{
113 return std::vector<std::function<void()>>{
114 [&]() {
116 public_inputs_builder.process_public_inputs(trace, public_inputs);
117 },
118 };
119}
120
121void execute_jobs(std::span<std::function<void()>> jobs)
122{
123 parallel_for(jobs.size(), [&](size_t i) { jobs[i](); });
124}
125
126template <typename T> inline void clear_events(T& c)
127{
128 c.clear();
129 c.shrink_to_fit();
130}
131
132void print_trace_stats(const TraceContainer& trace)
133{
134 constexpr auto main_relation_names = [] {
135 constexpr size_t size = std::tuple_size_v<AvmFlavor::MainRelations>;
137 constexpr_for<0, size, 1>(
138 [&names]<size_t i> { names[i] = std::tuple_element_t<i, AvmFlavor::MainRelations>::NAME; });
139 return names;
140 }();
141
142 unordered_flat_map<std::string, uint32_t> namespace_column_sizes;
143 uint64_t total_rows = 0;
144 for (size_t col = 0; col < trace.num_columns(); ++col) {
145 const auto& column_rows = trace.get_column_rows(static_cast<Column>(col));
146 const std::string& column_name = COLUMN_NAMES.at(col);
147 const std::string namespace_name = [&]() {
148 for (const auto& main_relation_name : main_relation_names) {
149 if (column_name.starts_with(main_relation_name)) {
150 return std::string(main_relation_name);
151 }
152 }
153 return column_name.substr(0, column_name.find_first_of('_'));
154 }();
155 namespace_column_sizes[namespace_name] = std::max(namespace_column_sizes[namespace_name], column_rows);
156 total_rows += column_rows;
157 }
158 vinfo("Column sizes per namespace:");
159 for (const auto& [namespace_name, column_size] : namespace_column_sizes) {
160 vinfo(" ",
161 namespace_name,
162 ": ",
163 column_size,
164 " (~2^",
166 ")");
167 }
168 vinfo(
169 "Sum of all column rows: ", total_rows, " (~2^", numeric::get_msb(numeric::round_up_power_2(total_rows)), ")");
170}
171
172} // namespace
173
175{
177
178 fill_trace_columns(trace, std::move(events), public_inputs);
180
181 print_trace_stats(trace);
182
183 return trace;
184}
185
187 EventsContainer&& events,
188 const PublicInputs& public_inputs)
189{
190 // We process the events in parallel. Ideally the jobs should access disjoint column sets.
191 {
192 auto jobs = concatenate(
193 // Precomputed column jobs.
194 build_precomputed_columns_jobs(trace),
195 // Public inputs column jobs.
196 build_public_inputs_columns_jobs(trace, public_inputs),
197 // Subtrace jobs.
198 std::vector<std::function<void()>>{
199 [&]() {
200 TxTraceBuilder tx_builder;
201 AVM_TRACK_TIME("tracegen/tx", tx_builder.process(events.tx, trace));
202 clear_events(events.tx);
203 },
204 [&]() {
205 ExecutionTraceBuilder exec_builder;
206 AVM_TRACK_TIME("tracegen/execution", exec_builder.process(events.execution, trace));
207 clear_events(events.execution);
208 },
209 [&]() {
210 AddressDerivationTraceBuilder address_derivation_builder;
211 AVM_TRACK_TIME("tracegen/address_derivation",
212 address_derivation_builder.process(events.address_derivation, trace));
213 clear_events(events.address_derivation);
214 },
215 [&]() {
216 AluTraceBuilder alu_builder;
217 AVM_TRACK_TIME("tracegen/alu", alu_builder.process(events.alu, trace));
218 clear_events(events.alu);
219 },
220 [&]() {
221 BytecodeTraceBuilder bytecode_builder;
222 AVM_TRACK_TIME("tracegen/bytecode_decomposition",
223 bytecode_builder.process_decomposition(events.bytecode_decomposition, trace));
224 clear_events(events.bytecode_decomposition);
225 },
226 [&]() {
227 BytecodeTraceBuilder bytecode_builder;
228 AVM_TRACK_TIME("tracegen/bytecode_hashing",
229 bytecode_builder.process_hashing(events.bytecode_hashing, trace));
230 clear_events(events.bytecode_hashing);
231 },
232 [&]() {
233 ClassIdDerivationTraceBuilder class_id_builder;
234 AVM_TRACK_TIME("tracegen/class_id_derivation",
235 class_id_builder.process(events.class_id_derivation, trace));
236 clear_events(events.class_id_derivation);
237 },
238 [&]() {
239 BytecodeTraceBuilder bytecode_builder;
240 AVM_TRACK_TIME("tracegen/bytecode_retrieval",
241 bytecode_builder.process_retrieval(events.bytecode_retrieval, trace));
242 clear_events(events.bytecode_retrieval);
243 },
244 [&]() {
245 BytecodeTraceBuilder bytecode_builder;
246 AVM_TRACK_TIME("tracegen/instruction_fetching",
247 bytecode_builder.process_instruction_fetching(events.instruction_fetching, trace));
248 clear_events(events.instruction_fetching);
249 },
250 [&]() {
251 Sha256TraceBuilder sha256_builder;
252 AVM_TRACK_TIME("tracegen/sha256_compression",
253 sha256_builder.process(events.sha256_compression, trace));
254 clear_events(events.sha256_compression);
255 },
256 [&]() {
257 KeccakF1600TraceBuilder keccakf1600_builder;
258 AVM_TRACK_TIME("tracegen/keccak_f1600_permutation",
259 keccakf1600_builder.process_permutation(events.keccakf1600, trace));
260 AVM_TRACK_TIME("tracegen/keccak_f1600_memory_slices",
261 keccakf1600_builder.process_memory_slices(events.keccakf1600, trace));
262 clear_events(events.keccakf1600);
263 },
264 [&]() {
265 EccTraceBuilder ecc_builder;
266 AVM_TRACK_TIME("tracegen/ecc_add", ecc_builder.process_add(events.ecc_add, trace));
267 clear_events(events.ecc_add);
268 },
269 [&]() {
270 EccTraceBuilder ecc_builder;
271 AVM_TRACK_TIME("tracegen/scalar_mul", ecc_builder.process_scalar_mul(events.scalar_mul, trace));
272 clear_events(events.scalar_mul);
273 },
274 [&]() {
275 EccTraceBuilder ecc_builder;
276 AVM_TRACK_TIME("tracegen/ecc_add_memory",
277 ecc_builder.process_add_with_memory(events.ecc_add_mem, trace));
278 clear_events(events.ecc_add_mem);
279 },
280 [&]() {
282 AVM_TRACK_TIME("tracegen/poseidon2_hash",
283 poseidon2_builder.process_hash(events.poseidon2_hash, trace));
284 clear_events(events.poseidon2_hash);
285 },
286 [&]() {
288 AVM_TRACK_TIME("tracegen/poseidon2_permutation",
289 poseidon2_builder.process_permutation(events.poseidon2_permutation, trace));
290 clear_events(events.poseidon2_permutation);
291 },
292 [&]() {
295 "tracegen/poseidon2_permutation_with_memory",
296 poseidon2_builder.process_permutation_with_memory(events.poseidon2_permutation_mem, trace));
297 clear_events(events.poseidon2_permutation_mem);
298 },
299 [&]() {
300 ToRadixTraceBuilder to_radix_builder;
301 AVM_TRACK_TIME("tracegen/to_radix", to_radix_builder.process(events.to_radix, trace));
302 clear_events(events.to_radix);
303 },
304 [&]() {
305 ToRadixTraceBuilder to_radix_builder;
306 AVM_TRACK_TIME("tracegen/to_radix_memory",
307 to_radix_builder.process_with_memory(events.to_radix_memory, trace));
308 clear_events(events.to_radix_memory);
309 },
310 [&]() {
312 AVM_TRACK_TIME("tracegen/field_gt", field_gt_builder.process(events.field_gt, trace));
313 clear_events(events.field_gt);
314 },
315 [&]() {
316 MerkleCheckTraceBuilder merkle_check_builder;
317 AVM_TRACK_TIME("tracegen/merkle_check", merkle_check_builder.process(events.merkle_check, trace));
318 clear_events(events.merkle_check);
319 },
320 [&]() {
322 AVM_TRACK_TIME("tracegen/range_check", range_check_builder.process(events.range_check, trace));
323 clear_events(events.range_check);
324 },
325 [&]() {
326 PublicDataTreeTraceBuilder public_data_tree_trace_builder;
327 AVM_TRACK_TIME("tracegen/public_data_tree_check",
328 public_data_tree_trace_builder.process(events.public_data_tree_check_events, trace));
329 clear_events(events.public_data_tree_check_events);
330 },
331 [&]() {
332 UpdateCheckTraceBuilder update_check_trace_builder;
333 AVM_TRACK_TIME("tracegen/update_check",
334 update_check_trace_builder.process(events.update_check_events, trace));
335 clear_events(events.update_check_events);
336 },
337 [&]() {
338 NullifierTreeCheckTraceBuilder nullifier_tree_check_trace_builder;
340 "tracegen/nullifier_tree_check",
341 nullifier_tree_check_trace_builder.process(events.nullifier_tree_check_events, trace));
342 clear_events(events.nullifier_tree_check_events);
343 },
344 [&]() {
345 MemoryTraceBuilder memory_trace_builder;
346 AVM_TRACK_TIME("tracegen/memory", memory_trace_builder.process(events.memory, trace));
347 clear_events(events.memory);
348 },
349 [&]() {
350 DataCopyTraceBuilder data_copy_trace_builder;
351 AVM_TRACK_TIME("tracegen/data_copy",
352 data_copy_trace_builder.process(events.data_copy_events, trace));
353 clear_events(events.data_copy_events);
354 },
355 [&]() {
356 BitwiseTraceBuilder bitwise_builder;
357 AVM_TRACK_TIME("tracegen/bitwise", bitwise_builder.process(events.bitwise, trace));
358 clear_events(events.bitwise);
359 },
360 [&]() {
361 CalldataTraceBuilder calldata_builder;
362 AVM_TRACK_TIME("tracegen/calldata_hashing",
363 calldata_builder.process_hashing(events.calldata_events, trace));
364 AVM_TRACK_TIME("tracegen/calldata_retrieval",
365 calldata_builder.process_retrieval(events.calldata_events, trace));
366 clear_events(events.calldata_events);
367 },
368 [&]() {
369 InternalCallStackBuilder internal_call_stack_builder;
370 AVM_TRACK_TIME("tracegen/internal_call_stack",
371 internal_call_stack_builder.process(events.internal_call_stack_events, trace));
372 clear_events(events.internal_call_stack_events);
373 },
374 [&]() {
375 ContextStackTraceBuilder context_stack_builder;
376 AVM_TRACK_TIME("tracegen/context_stack",
377 context_stack_builder.process(events.context_stack, trace));
378 clear_events(events.context_stack);
379 },
380 [&]() {
381 NoteHashTreeCheckTraceBuilder note_hash_tree_check_trace_builder;
383 "tracegen/note_hash_tree_check",
384 note_hash_tree_check_trace_builder.process(events.note_hash_tree_check_events, trace));
385 clear_events(events.note_hash_tree_check_events);
386 },
387 [&]() {
388 WrittenPublicDataSlotsTreeCheckTraceBuilder written_public_data_slots_tree_check_trace_builder;
389 AVM_TRACK_TIME("tracegen/written_public_data_slots_tree_check",
390 written_public_data_slots_tree_check_trace_builder.process(
391 events.written_public_data_slots_tree_check_events, trace));
392 clear_events(events.written_public_data_slots_tree_check_events);
393 },
394 [&]() {
396 AVM_TRACK_TIME("tracegen/gt", gt_builder.process(events.gt_events, trace));
397 clear_events(events.gt_events);
398 },
399 [&]() {
400 ContractInstanceRetrievalTraceBuilder contract_instance_retrieval_builder;
402 "tracegen/contract_instance_retrieval",
403 contract_instance_retrieval_builder.process(events.contract_instance_retrieval_events, trace));
404 clear_events(events.contract_instance_retrieval_events);
405 },
406 [&]() {
407 GetContractInstanceTraceBuilder get_contract_instance_builder;
408 AVM_TRACK_TIME("tracegen/get_contract_instance",
409 get_contract_instance_builder.process(events.get_contract_instance_events, trace));
410 clear_events(events.get_contract_instance_events);
411 },
412 [&]() {
413 L1ToL2MessageTreeCheckTraceBuilder l1_to_l2_message_tree_check_trace_builder;
414 AVM_TRACK_TIME("tracegen/l1_to_l2_message_tree_check",
415 l1_to_l2_message_tree_check_trace_builder.process(
416 events.l1_to_l2_msg_tree_check_events, trace));
417 clear_events(events.l1_to_l2_msg_tree_check_events);
418 },
419 [&]() {
420 EmitUnencryptedLogTraceBuilder emit_unencrypted_log_builder;
421 AVM_TRACK_TIME("tracegen/emit_unencrypted_log",
422 emit_unencrypted_log_builder.process(events.emit_unencrypted_log_events, trace));
423 clear_events(events.emit_unencrypted_log_events);
424 },
425 [&]() {
426 RetrievedBytecodesTreeCheckTraceBuilder retrieved_bytecodes_tree_check_builder;
427 AVM_TRACK_TIME("tracegen/retrieved_bytecodes_tree_check",
428 retrieved_bytecodes_tree_check_builder.process(
429 events.retrieved_bytecodes_tree_check_events, trace));
430 clear_events(events.retrieved_bytecodes_tree_check_events);
431 } });
432
433 AVM_TRACK_TIME("tracegen/traces", execute_jobs(jobs));
434 }
435}
436
438{
439 // Now we can compute lookups and permutations.
440 {
441 // We use a shared index cache so that lookups targeting the same destination columns
442 // can share the same index, avoiding redundant computation and memory usage.
443 SharedIndexCache index_cache;
444
445 auto jobs_interactions =
446 concatenate_jobs(MemoryTraceBuilder::interactions.get_all_jobs(index_cache),
447 TxTraceBuilder::interactions.get_all_jobs(index_cache),
448 ExecutionTraceBuilder::interactions.get_all_jobs(index_cache),
449 AluTraceBuilder::interactions.get_all_jobs(index_cache),
450 Poseidon2TraceBuilder::interactions.get_all_jobs(index_cache),
451 RangeCheckTraceBuilder::interactions.get_all_jobs(index_cache),
452 BitwiseTraceBuilder::interactions.get_all_jobs(index_cache),
453 Sha256TraceBuilder::interactions.get_all_jobs(index_cache),
454 KeccakF1600TraceBuilder::interactions.get_all_jobs(index_cache),
455 BytecodeTraceBuilder::interactions.get_all_jobs(index_cache),
456 ClassIdDerivationTraceBuilder::interactions.get_all_jobs(index_cache),
457 EccTraceBuilder::interactions.get_all_jobs(index_cache),
458 ToRadixTraceBuilder::interactions.get_all_jobs(index_cache),
459 AddressDerivationTraceBuilder::interactions.get_all_jobs(index_cache),
460 FieldGreaterThanTraceBuilder::interactions.get_all_jobs(index_cache),
461 MerkleCheckTraceBuilder::interactions.get_all_jobs(index_cache),
462 PublicDataTreeTraceBuilder::interactions.get_all_jobs(index_cache),
463 UpdateCheckTraceBuilder::interactions.get_all_jobs(index_cache),
464 NullifierTreeCheckTraceBuilder::interactions.get_all_jobs(index_cache),
465 DataCopyTraceBuilder::interactions.get_all_jobs(index_cache),
466 CalldataTraceBuilder::interactions.get_all_jobs(index_cache),
467 NoteHashTreeCheckTraceBuilder::interactions.get_all_jobs(index_cache),
469 GreaterThanTraceBuilder::interactions.get_all_jobs(index_cache),
471 GetContractInstanceTraceBuilder::interactions.get_all_jobs(index_cache),
472 L1ToL2MessageTreeCheckTraceBuilder::interactions.get_all_jobs(index_cache),
473 EmitUnencryptedLogTraceBuilder::interactions.get_all_jobs(index_cache),
475
476 // Order jobs to minimize index building contention:
477 // Jobs with unique destination columns come first, then jobs that share destinations with earlier ones.
478 AVM_TRACK_TIME("tracegen/order_jobs_by_destination_columns",
479 order_jobs_by_destination_columns(jobs_interactions));
480
481 AVM_TRACK_TIME("tracegen/interactions",
482 parallel_for(jobs_interactions.size(), [&](size_t i) { jobs_interactions[i]->process(trace); }));
483 }
484}
485
487{
489 auto jobs = build_precomputed_columns_jobs(trace);
490 execute_jobs(jobs);
491 return trace;
492}
493
494} // namespace bb::avm2
Poseidon2TraceBuilder poseidon2_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.
void process(const simulation::EventEmitterInterface< simulation::BitwiseEvent >::Container &events, TraceContainer &trace)
static const InteractionDefinition interactions
void process_retrieval(const simulation::EventEmitterInterface< simulation::BytecodeRetrievalEvent >::Container &events, TraceContainer &trace)
static const InteractionDefinition interactions
void process_decomposition(const simulation::EventEmitterInterface< simulation::BytecodeDecompositionEvent >::Container &events, TraceContainer &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::ClassIdDerivationEvent >::Container &events, TraceContainer &trace)
void process(const simulation::EventEmitterInterface< simulation::ContextStackEvent >::Container &ctx_stack_events, TraceContainer &trace)
void process(const simulation::EventEmitterInterface< simulation::ContractInstanceRetrievalEvent >::Container &events, TraceContainer &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)
void process_add(const simulation::EventEmitterInterface< simulation::EccAddEvent >::Container &events, TraceContainer &trace)
Definition ecc_trace.cpp:50
void process_scalar_mul(const simulation::EventEmitterInterface< simulation::ScalarMulEvent >::Container &events, TraceContainer &trace)
static const InteractionDefinition interactions
Definition ecc_trace.hpp:23
void process(const simulation::EventEmitterInterface< simulation::EmitUnencryptedLogEvent >::Container &events, TraceContainer &trace)
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:18
void process(const simulation::EventEmitterInterface< simulation::InternalCallStackEvent >::Container &events, TraceContainer &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)
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)
void process(const simulation::EventEmitterInterface< simulation::NullifierTreeCheckEvent >::Container &events, TraceContainer &trace)
static const InteractionDefinition interactions
void process_sha256_round_constants(TraceContainer &trace)
void process_to_radix_p_decompositions(TraceContainer &trace)
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_misc(TraceContainer &trace, const uint32_t num_rows=MAX_AVM_TRACE_SIZE)
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::RetrievedBytecodesTreeCheckEvent >::Container &events, TraceContainer &trace)
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)
static const InteractionDefinition interactions
void process_with_memory(const simulation::EventEmitterInterface< simulation::ToRadixMemoryEvent >::Container &events, TraceContainer &trace)
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:546
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
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:47
constexpr T round_up_power_2(const T in)
Definition get_msb.hpp:52
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