162 std::vector<FF> input = { 1, 2, 3, 4 };
166 EXPECT_EQ(result, bb_result);
170 EXPECT_EQ(result, bb_result);
173 { .precomputed_first_row = 1 },
181 check_relation<poseidon2_hash>(
trace);
186 std::vector<FF> input = { 1, 2, 3, 4 };
191 { .precomputed_first_row = 1 },
197 check_interaction<Poseidon2TraceBuilder, lookup_poseidon2_hash_poseidon2_perm_settings>(
trace);
201 check_relation<poseidon2_hash>(
trace);
202 check_relation<poseidon2_perm>(
trace);
203 check_all_interactions<Poseidon2TraceBuilder>(
trace);
254 .WillOnce(ReturnRef(inputs[0]))
255 .WillOnce(ReturnRef(inputs[1]))
256 .WillOnce(ReturnRef(inputs[2]))
257 .WillOnce(ReturnRef(inputs[3]));
258 EXPECT_CALL(
memory, set).Times(4);
264 check_relation<poseidon2_mem>(
trace);
271 .WillOnce(ReturnRef(inputs[0]))
272 .WillOnce(ReturnRef(inputs[1]))
273 .WillOnce(ReturnRef(inputs[2]))
274 .WillOnce(ReturnRef(inputs[3]));
275 EXPECT_CALL(
memory, set).Times(4);
278 std::vector<FF> outputs = {
FF(
"0x224785a48a72c75e2cbb698143e71d5d41bd89a2b9a7185871e39a54ce5785b1"),
279 FF(
"0x225bb800db22c4f4b09ace45cb484d42b0dd7dfe8708ee26aacde6f2c1fb2cb8"),
280 FF(
"0x1180f4260e60b4264c987b503075ea8374b53ed06c5145f8c21c2aadb5087d21"),
281 FF(
"0x16c877b5b9c04d873218804ccbf65d0eeb12db447f66c9ca26fec380055df7e9") };
288 { C::execution_sel, 1 },
289 { C::execution_sel_execute_poseidon2_perm, 1 },
290 { C::execution_rop_0_, src_address },
291 { C::execution_rop_1_, dst_address },
294 { C::gt_input_a, dst_address + 3 },
301 { C::gt_input_a, src_address + 3 },
308 for (uint32_t i = 0; i < inputs.size(); ++i) {
310 trace.
set(C::memory_address, i, src_address + i);
311 trace.
set(C::memory_value, i, inputs[i]);
312 trace.
set(C::memory_tag, i,
static_cast<uint32_t
>(inputs[i].get_tag()));
315 uint32_t write_index = i +
static_cast<uint32_t
>(inputs.size());
316 trace.
set(C::memory_address, write_index, dst_address + i);
317 trace.
set(C::memory_value, write_index, outputs[i]);
318 trace.
set(C::memory_sel, write_index, 1);
319 trace.
set(C::memory_rw, write_index, 1);
327 check_all_interactions<Poseidon2TraceBuilder>(
trace);
328 check_relation<poseidon2_mem>(
trace);
335 MemoryValue::from<FF>(1), MemoryValue::from<FF>(2), MemoryValue::from<uint64_t>(3), MemoryValue::from<FF>(4)
340 .WillOnce(ReturnRef(inputs[0]))
341 .WillOnce(ReturnRef(inputs[1]))
342 .WillOnce(ReturnRef(inputs[2]))
343 .WillOnce(ReturnRef(inputs[3]));
350 { C::execution_sel, 1 },
351 { C::execution_sel_execute_poseidon2_perm, 1 },
352 { C::execution_rop_0_, src_address },
353 { C::execution_rop_1_, dst_address },
354 { C::execution_sel_opcode_error, 1 },
357 { C::gt_input_a, dst_address + 3 },
364 { C::gt_input_a, src_address + 3 },
371 for (uint32_t i = 0; i < inputs.size(); ++i) {
373 trace.
set(C::memory_address, i, src_address + i);
374 trace.
set(C::memory_value, i, inputs[i]);
375 trace.
set(C::memory_tag, i,
static_cast<uint32_t
>(inputs[i].get_tag()));
380 "Poseidon2Exception.* input tag is not FF");
387 check_relation<poseidon2_mem>(
trace);
388 check_all_interactions<Poseidon2TraceBuilder>(
trace);
399 { C::execution_sel, 1 },
400 { C::execution_sel_execute_poseidon2_perm, 1 },
401 { C::execution_rop_0_, src_address },
402 { C::execution_rop_1_, dst_address },
403 { C::execution_sel_opcode_error, 1 },
406 { C::gt_input_a, dst_address + 3 },
413 { C::gt_input_a,
static_cast<uint64_t
>(src_address) + 3 },
420 "Poseidon2Exception.* src or dst address out of range");
428 check_relation<poseidon2_mem>(
trace);
429 check_all_interactions<Poseidon2TraceBuilder>(
trace);