163 std::vector<FF> input = { 1, 2, 3, 4 };
167 EXPECT_EQ(result, bb_result);
171 EXPECT_EQ(result, bb_result);
174 { { C::precomputed_first_row, 1 } },
182 check_relation<poseidon2_hash>(
trace);
187 std::vector<FF> input = { 1, 2, 3, 4 };
192 { { C::precomputed_first_row, 1 } },
198 check_interaction<Poseidon2TraceBuilder, lookup_poseidon2_hash_poseidon2_perm_settings>(
trace);
202 check_relation<poseidon2_hash>(
trace);
203 check_relation<poseidon2_perm>(
trace);
204 check_all_interactions<Poseidon2TraceBuilder>(
trace);
209 std::vector<FF> input = { 1, 2, 3, 4 };
214 { { C::precomputed_first_row, 1 } },
221 (check_interaction<Poseidon2TraceBuilder, lookup_poseidon2_hash_poseidon2_perm_settings>(
trace)),
222 "Failed.*POSEIDON2_PERM. Could not find tuple in destination.");
226 check_relation<poseidon2_hash>(
trace);
253 .WillOnce(ReturnRef(inputs[0]))
254 .WillOnce(ReturnRef(inputs[1]))
255 .WillOnce(ReturnRef(inputs[2]))
256 .WillOnce(ReturnRef(inputs[3]));
257 EXPECT_CALL(
memory, set).Times(4);
263 check_relation<poseidon2_mem>(
trace);
270 .WillOnce(ReturnRef(inputs[0]))
271 .WillOnce(ReturnRef(inputs[1]))
272 .WillOnce(ReturnRef(inputs[2]))
273 .WillOnce(ReturnRef(inputs[3]));
274 EXPECT_CALL(
memory, set).Times(4);
277 std::vector<FF> outputs = {
FF(
"0x224785a48a72c75e2cbb698143e71d5d41bd89a2b9a7185871e39a54ce5785b1"),
278 FF(
"0x225bb800db22c4f4b09ace45cb484d42b0dd7dfe8708ee26aacde6f2c1fb2cb8"),
279 FF(
"0x1180f4260e60b4264c987b503075ea8374b53ed06c5145f8c21c2aadb5087d21"),
280 FF(
"0x16c877b5b9c04d873218804ccbf65d0eeb12db447f66c9ca26fec380055df7e9") };
287 { C::execution_sel, 1 },
288 { C::execution_sel_exec_dispatch_poseidon2_perm, 1 },
289 { C::execution_rop_0_, src_address },
290 { C::execution_rop_1_, dst_address },
293 { C::gt_input_a, dst_address + 3 },
300 { C::gt_input_a, src_address + 3 },
307 for (uint32_t i = 0; i < inputs.size(); ++i) {
309 trace.
set(C::memory_address, i, src_address + i);
310 trace.
set(C::memory_value, i, inputs[i]);
311 trace.
set(C::memory_tag, i,
static_cast<uint32_t
>(inputs[i].get_tag()));
314 uint32_t write_index = i +
static_cast<uint32_t
>(inputs.size());
315 trace.
set(C::memory_address, write_index, dst_address + i);
316 trace.
set(C::memory_value, write_index, outputs[i]);
317 trace.
set(C::memory_sel, write_index, 1);
318 trace.
set(C::memory_rw, write_index, 1);
326 check_all_interactions<Poseidon2TraceBuilder>(
trace);
327 check_relation<poseidon2_mem>(
trace);
334 MemoryValue::from<FF>(1), MemoryValue::from<FF>(2), MemoryValue::from<uint64_t>(3), MemoryValue::from<FF>(4)
339 .WillOnce(ReturnRef(inputs[0]))
340 .WillOnce(ReturnRef(inputs[1]))
341 .WillOnce(ReturnRef(inputs[2]))
342 .WillOnce(ReturnRef(inputs[3]));
349 { C::execution_sel, 1 },
350 { C::execution_sel_exec_dispatch_poseidon2_perm, 1 },
351 { C::execution_rop_0_, src_address },
352 { C::execution_rop_1_, dst_address },
353 { C::execution_sel_opcode_error, 1 },
356 { C::gt_input_a, dst_address + 3 },
363 { C::gt_input_a, src_address + 3 },
370 for (uint32_t i = 0; i < inputs.size(); ++i) {
372 trace.
set(C::memory_address, i, src_address + i);
373 trace.
set(C::memory_value, i, inputs[i]);
374 trace.
set(C::memory_tag, i,
static_cast<uint32_t
>(inputs[i].get_tag()));
379 "Poseidon2Exception.* input tag is not FF");
386 check_relation<poseidon2_mem>(
trace);
387 check_all_interactions<Poseidon2TraceBuilder>(
trace);
398 { C::execution_sel, 1 },
399 { C::execution_sel_exec_dispatch_poseidon2_perm, 1 },
400 { C::execution_rop_0_, src_address },
401 { C::execution_rop_1_, dst_address },
402 { C::execution_sel_opcode_error, 1 },
405 { C::gt_input_a, dst_address + 3 },
412 { C::gt_input_a,
static_cast<uint64_t
>(src_address) + 3 },
419 "Poseidon2Exception.* src or dst address out of range");
427 check_relation<poseidon2_mem>(
trace);
428 check_all_interactions<Poseidon2TraceBuilder>(
trace);