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