Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
poseidon2_trace.cpp
Go to the documentation of this file.
2
3#include <cstdint>
4#include <memory>
5
14
16
17namespace bb::avm2::tracegen {
18
19namespace {
20
21using StateCols = std::array<Column, 4>;
22// This absolute monstrosity is a mapping of the intermediate round columns (round & state) to the "flattened" columns
23// in the trace.
24constexpr std::array<StateCols, 64> intermediate_round_cols = { {
25 // Full rounds
26 { Column::poseidon2_perm_T_0_6,
27 Column::poseidon2_perm_T_0_5,
28 Column::poseidon2_perm_T_0_7,
29 Column::poseidon2_perm_T_0_4 },
30 { Column::poseidon2_perm_T_1_6,
31 Column::poseidon2_perm_T_1_5,
32 Column::poseidon2_perm_T_1_7,
33 Column::poseidon2_perm_T_1_4 },
34 { Column::poseidon2_perm_T_2_6,
35 Column::poseidon2_perm_T_2_5,
36 Column::poseidon2_perm_T_2_7,
37 Column::poseidon2_perm_T_2_4 },
38 { Column::poseidon2_perm_T_3_6,
39 Column::poseidon2_perm_T_3_5,
40 Column::poseidon2_perm_T_3_7,
41 Column::poseidon2_perm_T_3_4 },
42 // Partial rounds
43 { Column::poseidon2_perm_B_4_0,
44 Column::poseidon2_perm_B_4_1,
45 Column::poseidon2_perm_B_4_2,
46 Column::poseidon2_perm_B_4_3 },
47 { Column::poseidon2_perm_B_5_0,
48 Column::poseidon2_perm_B_5_1,
49 Column::poseidon2_perm_B_5_2,
50 Column::poseidon2_perm_B_5_3 },
51 { Column::poseidon2_perm_B_6_0,
52 Column::poseidon2_perm_B_6_1,
53 Column::poseidon2_perm_B_6_2,
54 Column::poseidon2_perm_B_6_3 },
55 { Column::poseidon2_perm_B_7_0,
56 Column::poseidon2_perm_B_7_1,
57 Column::poseidon2_perm_B_7_2,
58 Column::poseidon2_perm_B_7_3 },
59 { Column::poseidon2_perm_B_8_0,
60 Column::poseidon2_perm_B_8_1,
61 Column::poseidon2_perm_B_8_2,
62 Column::poseidon2_perm_B_8_3 },
63 { Column::poseidon2_perm_B_9_0,
64 Column::poseidon2_perm_B_9_1,
65 Column::poseidon2_perm_B_9_2,
66 Column::poseidon2_perm_B_9_3 },
67 { Column::poseidon2_perm_B_10_0,
68 Column::poseidon2_perm_B_10_1,
69 Column::poseidon2_perm_B_10_2,
70 Column::poseidon2_perm_B_10_3 },
71 { Column::poseidon2_perm_B_11_0,
72 Column::poseidon2_perm_B_11_1,
73 Column::poseidon2_perm_B_11_2,
74 Column::poseidon2_perm_B_11_3 },
75 { Column::poseidon2_perm_B_12_0,
76 Column::poseidon2_perm_B_12_1,
77 Column::poseidon2_perm_B_12_2,
78 Column::poseidon2_perm_B_12_3 },
79 { Column::poseidon2_perm_B_13_0,
80 Column::poseidon2_perm_B_13_1,
81 Column::poseidon2_perm_B_13_2,
82 Column::poseidon2_perm_B_13_3 },
83 { Column::poseidon2_perm_B_14_0,
84 Column::poseidon2_perm_B_14_1,
85 Column::poseidon2_perm_B_14_2,
86 Column::poseidon2_perm_B_14_3 },
87 { Column::poseidon2_perm_B_15_0,
88 Column::poseidon2_perm_B_15_1,
89 Column::poseidon2_perm_B_15_2,
90 Column::poseidon2_perm_B_15_3 },
91 { Column::poseidon2_perm_B_16_0,
92 Column::poseidon2_perm_B_16_1,
93 Column::poseidon2_perm_B_16_2,
94 Column::poseidon2_perm_B_16_3 },
95 { Column::poseidon2_perm_B_17_0,
96 Column::poseidon2_perm_B_17_1,
97 Column::poseidon2_perm_B_17_2,
98 Column::poseidon2_perm_B_17_3 },
99 { Column::poseidon2_perm_B_18_0,
100 Column::poseidon2_perm_B_18_1,
101 Column::poseidon2_perm_B_18_2,
102 Column::poseidon2_perm_B_18_3 },
103 { Column::poseidon2_perm_B_19_0,
104 Column::poseidon2_perm_B_19_1,
105 Column::poseidon2_perm_B_19_2,
106 Column::poseidon2_perm_B_19_3 },
107 { Column::poseidon2_perm_B_20_0,
108 Column::poseidon2_perm_B_20_1,
109 Column::poseidon2_perm_B_20_2,
110 Column::poseidon2_perm_B_20_3 },
111 { Column::poseidon2_perm_B_21_0,
112 Column::poseidon2_perm_B_21_1,
113 Column::poseidon2_perm_B_21_2,
114 Column::poseidon2_perm_B_21_3 },
115 { Column::poseidon2_perm_B_22_0,
116 Column::poseidon2_perm_B_22_1,
117 Column::poseidon2_perm_B_22_2,
118 Column::poseidon2_perm_B_22_3 },
119 { Column::poseidon2_perm_B_23_0,
120 Column::poseidon2_perm_B_23_1,
121 Column::poseidon2_perm_B_23_2,
122 Column::poseidon2_perm_B_23_3 },
123 { Column::poseidon2_perm_B_24_0,
124 Column::poseidon2_perm_B_24_1,
125 Column::poseidon2_perm_B_24_2,
126 Column::poseidon2_perm_B_24_3 },
127 { Column::poseidon2_perm_B_25_0,
128 Column::poseidon2_perm_B_25_1,
129 Column::poseidon2_perm_B_25_2,
130 Column::poseidon2_perm_B_25_3 },
131 { Column::poseidon2_perm_B_26_0,
132 Column::poseidon2_perm_B_26_1,
133 Column::poseidon2_perm_B_26_2,
134 Column::poseidon2_perm_B_26_3 },
135 { Column::poseidon2_perm_B_27_0,
136 Column::poseidon2_perm_B_27_1,
137 Column::poseidon2_perm_B_27_2,
138 Column::poseidon2_perm_B_27_3 },
139 { Column::poseidon2_perm_B_28_0,
140 Column::poseidon2_perm_B_28_1,
141 Column::poseidon2_perm_B_28_2,
142 Column::poseidon2_perm_B_28_3 },
143 { Column::poseidon2_perm_B_29_0,
144 Column::poseidon2_perm_B_29_1,
145 Column::poseidon2_perm_B_29_2,
146 Column::poseidon2_perm_B_29_3 },
147 { Column::poseidon2_perm_B_30_0,
148 Column::poseidon2_perm_B_30_1,
149 Column::poseidon2_perm_B_30_2,
150 Column::poseidon2_perm_B_30_3 },
151 { Column::poseidon2_perm_B_31_0,
152 Column::poseidon2_perm_B_31_1,
153 Column::poseidon2_perm_B_31_2,
154 Column::poseidon2_perm_B_31_3 },
155 { Column::poseidon2_perm_B_32_0,
156 Column::poseidon2_perm_B_32_1,
157 Column::poseidon2_perm_B_32_2,
158 Column::poseidon2_perm_B_32_3 },
159 { Column::poseidon2_perm_B_33_0,
160 Column::poseidon2_perm_B_33_1,
161 Column::poseidon2_perm_B_33_2,
162 Column::poseidon2_perm_B_33_3 },
163 { Column::poseidon2_perm_B_34_0,
164 Column::poseidon2_perm_B_34_1,
165 Column::poseidon2_perm_B_34_2,
166 Column::poseidon2_perm_B_34_3 },
167 { Column::poseidon2_perm_B_35_0,
168 Column::poseidon2_perm_B_35_1,
169 Column::poseidon2_perm_B_35_2,
170 Column::poseidon2_perm_B_35_3 },
171 { Column::poseidon2_perm_B_36_0,
172 Column::poseidon2_perm_B_36_1,
173 Column::poseidon2_perm_B_36_2,
174 Column::poseidon2_perm_B_36_3 },
175 { Column::poseidon2_perm_B_37_0,
176 Column::poseidon2_perm_B_37_1,
177 Column::poseidon2_perm_B_37_2,
178 Column::poseidon2_perm_B_37_3 },
179 { Column::poseidon2_perm_B_38_0,
180 Column::poseidon2_perm_B_38_1,
181 Column::poseidon2_perm_B_38_2,
182 Column::poseidon2_perm_B_38_3 },
183 { Column::poseidon2_perm_B_39_0,
184 Column::poseidon2_perm_B_39_1,
185 Column::poseidon2_perm_B_39_2,
186 Column::poseidon2_perm_B_39_3 },
187 { Column::poseidon2_perm_B_40_0,
188 Column::poseidon2_perm_B_40_1,
189 Column::poseidon2_perm_B_40_2,
190 Column::poseidon2_perm_B_40_3 },
191 { Column::poseidon2_perm_B_41_0,
192 Column::poseidon2_perm_B_41_1,
193 Column::poseidon2_perm_B_41_2,
194 Column::poseidon2_perm_B_41_3 },
195 { Column::poseidon2_perm_B_42_0,
196 Column::poseidon2_perm_B_42_1,
197 Column::poseidon2_perm_B_42_2,
198 Column::poseidon2_perm_B_42_3 },
199 { Column::poseidon2_perm_B_43_0,
200 Column::poseidon2_perm_B_43_1,
201 Column::poseidon2_perm_B_43_2,
202 Column::poseidon2_perm_B_43_3 },
203 { Column::poseidon2_perm_B_44_0,
204 Column::poseidon2_perm_B_44_1,
205 Column::poseidon2_perm_B_44_2,
206 Column::poseidon2_perm_B_44_3 },
207 { Column::poseidon2_perm_B_45_0,
208 Column::poseidon2_perm_B_45_1,
209 Column::poseidon2_perm_B_45_2,
210 Column::poseidon2_perm_B_45_3 },
211 { Column::poseidon2_perm_B_46_0,
212 Column::poseidon2_perm_B_46_1,
213 Column::poseidon2_perm_B_46_2,
214 Column::poseidon2_perm_B_46_3 },
215 { Column::poseidon2_perm_B_47_0,
216 Column::poseidon2_perm_B_47_1,
217 Column::poseidon2_perm_B_47_2,
218 Column::poseidon2_perm_B_47_3 },
219 { Column::poseidon2_perm_B_48_0,
220 Column::poseidon2_perm_B_48_1,
221 Column::poseidon2_perm_B_48_2,
222 Column::poseidon2_perm_B_48_3 },
223 { Column::poseidon2_perm_B_49_0,
224 Column::poseidon2_perm_B_49_1,
225 Column::poseidon2_perm_B_49_2,
226 Column::poseidon2_perm_B_49_3 },
227 { Column::poseidon2_perm_B_50_0,
228 Column::poseidon2_perm_B_50_1,
229 Column::poseidon2_perm_B_50_2,
230 Column::poseidon2_perm_B_50_3 },
231 { Column::poseidon2_perm_B_51_0,
232 Column::poseidon2_perm_B_51_1,
233 Column::poseidon2_perm_B_51_2,
234 Column::poseidon2_perm_B_51_3 },
235 { Column::poseidon2_perm_B_52_0,
236 Column::poseidon2_perm_B_52_1,
237 Column::poseidon2_perm_B_52_2,
238 Column::poseidon2_perm_B_52_3 },
239 { Column::poseidon2_perm_B_53_0,
240 Column::poseidon2_perm_B_53_1,
241 Column::poseidon2_perm_B_53_2,
242 Column::poseidon2_perm_B_53_3 },
243 { Column::poseidon2_perm_B_54_0,
244 Column::poseidon2_perm_B_54_1,
245 Column::poseidon2_perm_B_54_2,
246 Column::poseidon2_perm_B_54_3 },
247 { Column::poseidon2_perm_B_55_0,
248 Column::poseidon2_perm_B_55_1,
249 Column::poseidon2_perm_B_55_2,
250 Column::poseidon2_perm_B_55_3 },
251 { Column::poseidon2_perm_B_56_0,
252 Column::poseidon2_perm_B_56_1,
253 Column::poseidon2_perm_B_56_2,
254 Column::poseidon2_perm_B_56_3 },
255 { Column::poseidon2_perm_B_57_0,
256 Column::poseidon2_perm_B_57_1,
257 Column::poseidon2_perm_B_57_2,
258 Column::poseidon2_perm_B_57_3 },
259 { Column::poseidon2_perm_B_58_0,
260 Column::poseidon2_perm_B_58_1,
261 Column::poseidon2_perm_B_58_2,
262 Column::poseidon2_perm_B_58_3 },
263 { Column::poseidon2_perm_B_59_0,
264 Column::poseidon2_perm_B_59_1,
265 Column::poseidon2_perm_B_59_2,
266 Column::poseidon2_perm_B_59_3 },
267 // Full rounds
268 { Column::poseidon2_perm_T_60_6,
269 Column::poseidon2_perm_T_60_5,
270 Column::poseidon2_perm_T_60_7,
271 Column::poseidon2_perm_T_60_4 },
272 { Column::poseidon2_perm_T_61_6,
273 Column::poseidon2_perm_T_61_5,
274 Column::poseidon2_perm_T_61_7,
275 Column::poseidon2_perm_T_61_4 },
276 { Column::poseidon2_perm_T_62_6,
277 Column::poseidon2_perm_T_62_5,
278 Column::poseidon2_perm_T_62_7,
279 Column::poseidon2_perm_T_62_4 },
280 { Column::poseidon2_perm_T_63_6,
281 Column::poseidon2_perm_T_63_5,
282 Column::poseidon2_perm_T_63_7,
283 Column::poseidon2_perm_T_63_4 },
284} };
285
286} // namespace
287
291{
292 using C = Column;
293 uint32_t row = 1; // We start from row 1 because this trace contains shifted columns.
294 for (const auto& event : hash_events) {
295 auto input_size = event.inputs.size();
296 auto num_perm_events = (input_size / 3) + static_cast<size_t>(input_size % 3 != 0);
297 auto padded_size = 3 * ((event.inputs.size() + 2) / 3);
298
299 for (size_t i = 0; i < num_perm_events; i++) {
300 std::array<FF, 3> perm_input = { 0, 0, 0 };
301 auto perm_state = event.intermediate_states[i];
302 auto perm_output = event.intermediate_states[i + 1];
303 size_t chunk_size = std::min(input_size, static_cast<size_t>(3));
304 // Mix the input chunk into the previous permutation output state
305 for (size_t j = 0; j < chunk_size; j++) {
306 // Build up the input for the permutation
307 perm_input[j] = event.inputs[(i * 3) + j];
308 // Mix the input chunk into the previous permutation output state
309 perm_state[j] += perm_input[j];
310 }
311 trace.set(row,
312 { {
313 { C::poseidon2_hash_sel, 1 },
314 { C::poseidon2_hash_start, i == 0 },
315 { C::poseidon2_hash_end, (num_perm_events - 1) == i },
316 { C::poseidon2_hash_input_len, event.inputs.size() },
317 { C::poseidon2_hash_padding, padded_size - event.inputs.size() },
318 { C::poseidon2_hash_input_0, perm_input[0] },
319 { C::poseidon2_hash_input_1, perm_input[1] },
320 { C::poseidon2_hash_input_2, perm_input[2] },
321
322 { C::poseidon2_hash_num_perm_rounds_rem, num_perm_events - i },
323 { C::poseidon2_hash_num_perm_rounds_rem_inv,
324 num_perm_events - i - 1 == 0 ? 0 : FF(num_perm_events - i - 1).invert() },
325
326 { C::poseidon2_hash_a_0, perm_state[0] },
327 { C::poseidon2_hash_a_1, perm_state[1] },
328 { C::poseidon2_hash_a_2, perm_state[2] },
329 { C::poseidon2_hash_a_3, perm_state[3] },
330
331 { C::poseidon2_hash_b_0, perm_output[0] },
332 { C::poseidon2_hash_b_1, perm_output[1] },
333 { C::poseidon2_hash_b_2, perm_output[2] },
334 { C::poseidon2_hash_b_3, perm_output[3] },
335 { C::poseidon2_hash_output, event.output },
336 } });
337 input_size -= chunk_size;
338 row++;
339 }
340 }
341}
342
346{
347 using C = Column;
348 // Our current state
349 std::array<FF, 4> current_state;
350 // These are where we will store the intermediate values of current_state in the trace.
351 std::array<Column, 4> round_state_cols;
352
353 uint32_t row = 0;
354
355 for (const auto& event : perm_events) {
356 // The bulk of this code is a copy of the Poseidon2Permutation::permute function from bb
357 // Note that the functions mutate current_state in place.
358 current_state = event.input;
359
360 // Apply 1st linear layer
362 trace.set(row,
363 { {
364 { C::poseidon2_perm_sel, 1 },
365 { C::poseidon2_perm_a_0, event.input[0] },
366 { C::poseidon2_perm_a_1, event.input[1] },
367 { C::poseidon2_perm_a_2, event.input[2] },
368 { C::poseidon2_perm_a_3, event.input[3] },
369
370 { C::poseidon2_perm_EXT_LAYER_6, current_state[0] },
371 { C::poseidon2_perm_EXT_LAYER_5, current_state[1] },
372 { C::poseidon2_perm_EXT_LAYER_7, current_state[2] },
373 { C::poseidon2_perm_EXT_LAYER_4, current_state[3] },
374
375 } });
376
377 // Perform rounds of the permutation algorithm
378 // Initial external (full) rounds
379 constexpr size_t rounds_f_beginning = Poseidon2Perm::rounds_f / 2;
380 for (size_t i = 0; i < rounds_f_beginning; ++i) {
382 Poseidon2Perm::apply_sbox(current_state);
384 // Store end of round state
385 round_state_cols = intermediate_round_cols[i];
386 trace.set(row,
387 { { { round_state_cols[0], current_state[0] },
388 { round_state_cols[1], current_state[1] },
389 { round_state_cols[2], current_state[2] },
390 { round_state_cols[3], current_state[3] } } });
391 }
392
393 // Internal (partial) rounds
394 const size_t p_end = rounds_f_beginning + Poseidon2Perm::rounds_p;
395 for (size_t i = rounds_f_beginning; i < p_end; ++i) {
396 current_state[0] += Poseidon2Perm::round_constants[i][0];
397 Poseidon2Perm::apply_single_sbox(current_state[0]);
399 // Store end of round state
400 round_state_cols = intermediate_round_cols[i];
401 trace.set(row,
402 { { { round_state_cols[0], current_state[0] },
403 { round_state_cols[1], current_state[1] },
404 { round_state_cols[2], current_state[2] },
405 { round_state_cols[3], current_state[3] } } });
406 }
407
408 // Remaining external (full) rounds
409 for (size_t i = p_end; i < Poseidon2Perm::NUM_ROUNDS; ++i) {
411 Poseidon2Perm::apply_sbox(current_state);
413 round_state_cols = intermediate_round_cols[i];
414 trace.set(row,
415 { { { round_state_cols[0], current_state[0] },
416 { round_state_cols[1], current_state[1] },
417 { round_state_cols[2], current_state[2] },
418 { round_state_cols[3], current_state[3] } } });
419 }
420 // Set the output
421 trace.set(row,
422 { {
423 { C::poseidon2_perm_b_0, current_state[0] },
424 { C::poseidon2_perm_b_1, current_state[1] },
425 { C::poseidon2_perm_b_2, current_state[2] },
426 { C::poseidon2_perm_b_3, current_state[3] },
427
428 } });
429 row++;
430 }
431}
432
436{
437 using C = Column;
438 uint32_t row = 0;
439
440 for (const auto& event : perm_mem_events) {
441 // Addresses cast to uint64_t to capture overflows
442 uint64_t src_addr = static_cast<uint64_t>(event.src_address);
443 uint64_t dst_addr = static_cast<uint64_t>(event.dst_address);
444 // Error Handling, check that the addresses are within the valid range
445 // The max read address is src_addr + 3 since 4 input elements are read
446 // The max write address is dst_addr + 3 since 4 output elements are written
447 bool src_out_of_range_err = src_addr + 3 > AVM_HIGHEST_MEM_ADDRESS;
448 bool dst_out_of_range_err = dst_addr + 3 > AVM_HIGHEST_MEM_ADDRESS;
449 bool should_read_mem = !(src_out_of_range_err || dst_out_of_range_err);
450
451 // Error Handling, check that the input tags are valid
452 bool invalid_tag =
453 std::ranges::any_of(event.input, [](const auto& input) { return input.get_tag() != MemoryTag::FF; });
454 uint32_t target_tag = static_cast<uint32_t>(MemoryTag::FF);
455 uint32_t batched_tag_check = 0;
456 // Performs the batched tag check described in the circuit.
457 // see https://hackmd.io/moq6viBpRJeLpWrHAogCZw#Batching-comparison-of-n-bit-numbers
458 for (uint32_t i = 0; i < event.input.size(); i++) {
459 uint32_t exponent = 3 * i;
460 uint32_t current_tag = static_cast<uint32_t>(event.input[i].get_tag());
461 batched_tag_check += (current_tag - target_tag) * (1 << exponent);
462 }
463 FF batch_tag_inv = invalid_tag ? FF(batched_tag_check).invert() : 0;
464
465 bool err = src_out_of_range_err || dst_out_of_range_err || invalid_tag;
466
467 trace.set(row,
468 { {
469 { C::poseidon2_perm_mem_sel, 1 },
470 { C::poseidon2_perm_mem_execution_clk, event.execution_clk },
471 { C::poseidon2_perm_mem_space_id, event.space_id },
472 { C::poseidon2_perm_mem_max_mem_addr, AVM_HIGHEST_MEM_ADDRESS },
473 // Error Handling
474 { C::poseidon2_perm_mem_sel_src_out_of_range_err, src_out_of_range_err ? 1 : 0 },
475 { C::poseidon2_perm_mem_sel_dst_out_of_range_err, dst_out_of_range_err ? 1 : 0 },
476 { C::poseidon2_perm_mem_sel_invalid_tag_err, invalid_tag ? 1 : 0 },
477 { C::poseidon2_perm_mem_batch_tag_inv, batch_tag_inv },
478 { C::poseidon2_perm_mem_err, err ? 1 : 0 },
479 // Mem Ops
480 { C::poseidon2_perm_mem_sel_should_read_mem, should_read_mem ? 1 : 0 },
481 // Read Addresses
482 { C::poseidon2_perm_mem_read_address_0_, src_addr },
483 { C::poseidon2_perm_mem_read_address_1_, src_addr + 1 },
484 { C::poseidon2_perm_mem_read_address_2_, src_addr + 2 },
485 { C::poseidon2_perm_mem_read_address_3_, src_addr + 3 },
486 // Write Addresses
487 { C::poseidon2_perm_mem_write_address_0_, dst_addr },
488 { C::poseidon2_perm_mem_write_address_1_, dst_addr + 1 },
489 { C::poseidon2_perm_mem_write_address_2_, dst_addr + 2 },
490 { C::poseidon2_perm_mem_write_address_3_, dst_addr + 3 },
491 // Inputs
492 { C::poseidon2_perm_mem_input_0_, event.input[0].as_ff() },
493 { C::poseidon2_perm_mem_input_1_, event.input[1].as_ff() },
494 { C::poseidon2_perm_mem_input_2_, event.input[2].as_ff() },
495 { C::poseidon2_perm_mem_input_3_, event.input[3].as_ff() },
496 // Input Tags
497 { C::poseidon2_perm_mem_input_tag_0_, static_cast<uint8_t>(event.input[0].get_tag()) },
498 { C::poseidon2_perm_mem_input_tag_1_, static_cast<uint8_t>(event.input[1].get_tag()) },
499 { C::poseidon2_perm_mem_input_tag_2_, static_cast<uint8_t>(event.input[2].get_tag()) },
500 { C::poseidon2_perm_mem_input_tag_3_, static_cast<uint8_t>(event.input[3].get_tag()) },
501 // Outputs
502 { C::poseidon2_perm_mem_sel_should_exec, !err ? 1 : 0 },
503 { C::poseidon2_perm_mem_output_0_, event.output[0] },
504 { C::poseidon2_perm_mem_output_1_, event.output[1] },
505 { C::poseidon2_perm_mem_output_2_, event.output[2] },
506 { C::poseidon2_perm_mem_output_3_, event.output[3] },
507 } });
508 row++;
509 }
510}
511
515 // Poseidon2 Memory to Permutation Subtrace
516 .add<lookup_poseidon2_mem_input_output_poseidon2_perm_settings, InteractionType::LookupSequential>()
517 // Lookups to Greater Than Subtrace
519 .add<lookup_poseidon2_mem_check_dst_addr_in_range_settings, InteractionType::LookupGeneric>(Column::gt_sel);
520
521} // namespace bb::avm2::tracegen
#define AVM_HIGHEST_MEM_ADDRESS
InteractionDefinition & add(auto &&... args)
static const InteractionDefinition interactions
void process_permutation(const simulation::EventEmitterInterface< simulation::Poseidon2PermutationEvent >::Container &perm_events, TraceContainer &trace)
void process_permutation_with_memory(const simulation::EventEmitterInterface< simulation::Poseidon2PermutationMemoryEvent >::Container &perm_mem_events, TraceContainer &trace)
void process_hash(const simulation::EventEmitterInterface< simulation::Poseidon2HashEvent >::Container &hash_events, TraceContainer &trace)
Applies the Poseidon2 permutation function from https://eprint.iacr.org/2023/323 ....
static constexpr void apply_single_sbox(FF &input)
static constexpr void matrix_multiplication_internal(State &input)
static constexpr void matrix_multiplication_external(State &input)
static constexpr void add_round_constants(State &input, const RoundConstants &rc)
static constexpr void apply_sbox(State &input)
static constexpr RoundConstantsContainer round_constants
uint32_t dst_addr
TestTraceContainer trace
lookup_settings< lookup_poseidon2_hash_poseidon2_perm_settings_ > lookup_poseidon2_hash_poseidon2_perm_settings
AvmFlavorSettings::FF FF
Definition field.hpp:10
lookup_settings< lookup_poseidon2_mem_check_src_addr_in_range_settings_ > lookup_poseidon2_mem_check_src_addr_in_range_settings
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
simulation::PublicDataTreeReadWriteEvent event