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