62 return std::vector<std::function<void()>>{
112 return std::vector<std::function<void()>>{
120void execute_jobs(std::span<std::function<
void()>> jobs)
122 parallel_for(jobs.size(), [&](
size_t i) { jobs[i](); });
125template <
typename T>
inline void clear_events(T& c)
133 constexpr auto main_relation_names = [] {
136 constexpr_for<0, size, 1>(
137 [&names]<
size_t i> { names[i] = std::tuple_element_t<i, AvmFlavor::MainRelations>::NAME; });
142 uint64_t total_rows = 0;
146 const std::string namespace_name = [&]() {
147 for (
const auto& main_relation_name : main_relation_names) {
148 if (column_name.starts_with(main_relation_name)) {
149 return std::string(main_relation_name);
152 return column_name.substr(0, column_name.find_first_of(
'_'));
154 namespace_column_sizes[namespace_name] =
std::max(namespace_column_sizes[namespace_name], column_rows);
155 total_rows += column_rows;
157 vinfo(
"Column sizes per namespace:");
158 for (
const auto& [namespace_name, column_size] : namespace_column_sizes) {
180 print_trace_stats(
trace);
193 build_precomputed_columns_jobs(
trace),
195 build_public_inputs_columns_jobs(
trace, public_inputs),
197 std::vector<std::function<
void()>>{
201 clear_events(events.tx);
206 clear_events(events.execution);
211 address_derivation_builder.
process(events.address_derivation,
trace));
212 clear_events(events.address_derivation);
217 clear_events(events.alu);
223 clear_events(events.bytecode_decomposition);
229 clear_events(events.bytecode_hashing);
235 clear_events(events.class_id_derivation);
241 clear_events(events.bytecode_retrieval);
247 clear_events(events.instruction_fetching);
252 sha256_builder.
process(events.sha256_compression,
trace));
253 clear_events(events.sha256_compression);
261 clear_events(events.keccakf1600);
266 clear_events(events.ecc_add);
271 clear_events(events.scalar_mul);
277 clear_events(events.ecc_add_mem);
283 clear_events(events.poseidon2_hash);
289 clear_events(events.poseidon2_permutation);
294 "tracegen/poseidon2_permutation_with_memory",
296 clear_events(events.poseidon2_permutation_mem);
301 clear_events(events.to_radix);
307 clear_events(events.to_radix_memory);
312 clear_events(events.field_gt);
317 clear_events(events.merkle_check);
322 clear_events(events.range_check);
327 public_data_tree_trace_builder.
process(events.public_data_tree_check_events,
trace));
328 clear_events(events.public_data_tree_check_events);
333 update_check_trace_builder.
process(events.update_check_events,
trace));
334 clear_events(events.update_check_events);
339 indexed_tree_check_trace_builder.
process(events.indexed_tree_check_events,
trace));
340 clear_events(events.indexed_tree_check_events);
345 clear_events(events.memory);
350 data_copy_trace_builder.
process(events.data_copy_events,
trace));
351 clear_events(events.data_copy_events);
356 clear_events(events.bitwise);
364 clear_events(events.calldata_events);
369 internal_call_stack_builder.
process(events.internal_call_stack_events,
trace));
370 clear_events(events.internal_call_stack_events);
375 context_stack_builder.
process(events.context_stack,
trace));
376 clear_events(events.context_stack);
381 "tracegen/note_hash_tree_check",
382 note_hash_tree_check_trace_builder.
process(events.note_hash_tree_check_events,
trace));
383 clear_events(events.note_hash_tree_check_events);
388 clear_events(events.gt_events);
393 "tracegen/contract_instance_retrieval",
395 clear_events(events.contract_instance_retrieval_events);
400 get_contract_instance_builder.
process(events.get_contract_instance_events,
trace));
401 clear_events(events.get_contract_instance_events);
406 l1_to_l2_message_tree_check_trace_builder.
process(
407 events.l1_to_l2_msg_tree_check_events,
trace));
408 clear_events(events.l1_to_l2_msg_tree_check_events);
413 emit_public_log_builder.
process(events.emit_public_log_events,
trace));
414 clear_events(events.emit_public_log_events);
429 auto jobs_interactions =
464 parallel_for(jobs_interactions.size(), [&](
size_t i) { jobs_interactions[i]->process(trace); }));
471 auto jobs = build_precomputed_columns_jobs(
trace);
Poseidon2TraceBuilder poseidon2_builder
ClassIdDerivationTraceBuilder class_id_builder
ContractInstanceRetrievalTraceBuilder contract_instance_retrieval_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()
static const InteractionDefinition interactions
void process(const simulation::EventEmitterInterface< simulation::AddressDerivationEvent >::Container &events, TraceContainer &trace)
static const InteractionDefinition interactions
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)
static const InteractionDefinition interactions
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
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...
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
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
static const InteractionDefinition interactions
void process(const simulation::EventEmitterInterface< simulation::GetContractInstanceEvent >::Container &events, TraceContainer &trace)
static const InteractionDefinition interactions
static const InteractionDefinition interactions
void process(const simulation::EventEmitterInterface< simulation::IndexedTreeCheckEvent >::Container &events, TraceContainer &trace)
Process generic indexed tree check events and populate the relevant columns in the trace.
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
static const InteractionDefinition interactions
void process(const simulation::EventEmitterInterface< simulation::MemoryEvent >::Container &events, TraceContainer &trace)
Processes memory events into the memory subtrace.
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.
static const InteractionDefinition interactions
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_bitwise(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_power_of_2(TraceContainer &trace)
void process_get_contract_instance_table(TraceContainer &trace)
void process_phase_table(TraceContainer &trace)
void process_addressing_gas(TraceContainer &trace)
void process_sel_range_16(TraceContainer &trace)
void process_tag_parameters(TraceContainer &trace)
void process_sel_range_8(TraceContainer &trace)
static const InteractionDefinition interactions
void process(const simulation::EventEmitterInterface< simulation::PublicDataTreeCheckEvent >::Container &events, 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...
static const InteractionDefinition interactions
void process(const simulation::EventEmitterInterface< simulation::UpdateCheckEvent >::Container &events, TraceContainer &trace)
Process the UpdateCheck events and populate the relevant columns in the trace.
static const InteractionDefinition interactions
RangeCheckTraceBuilder range_check_builder
PrecomputedTraceBuilder precomputed_builder
FieldGreaterThanTraceBuilder field_gt_builder
GreaterThanTraceBuilder gt_builder
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
::ankerl::unordered_dense::map< Key, T > unordered_flat_map
constexpr T get_msb(const T in)
constexpr T round_up_power_2(const T in)
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)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
#define AVM_TRACK_TIME(key, body)
tracegen::PublicInputsTraceBuilder public_inputs_builder