27 size_t input_size = input.size();
29 auto num_perm_events = (input_size / 3) +
static_cast<size_t>(input_size % 3 != 0);
32 intermediate_states.reserve(num_perm_events + 1);
37 std::array<FF, 4> perm_state = { 0, 0, 0, iv };
38 intermediate_states.push_back(perm_state);
43 for (
size_t i = 0; i < num_perm_events; i++) {
45 size_t chunk_size = std::min(input_size,
static_cast<size_t>(3));
47 for (
size_t j = 0; j < chunk_size; j++) {
48 perm_state[j] += input[(i * 3) + j];
51 intermediate_states.push_back(perm_state);
53 input_size -= chunk_size;
57 { .inputs = input, .intermediate_states =
std::move(intermediate_states), .output = perm_state[0] });
71 uint16_t space_id =
memory.get_space_id();
73 auto zero = MemoryValue::from<FF>(0);
81 uint64_t max_read_address =
static_cast<uint64_t
>(
src_address) + 3;
82 uint64_t max_write_address =
static_cast<uint64_t
>(
dst_address) + 3;
87 if (read_out_of_range || write_out_of_range) {
88 throw InternalPoseidon2Exception(
"src or dst address out of range");
92 for (uint32_t i = 0; i < 4; i++) {
98 if (std::ranges::any_of(
99 input.begin(), input.end(), [](
const MemoryValue& val) { return val.get_tag() != MemoryTag::FF; })) {
100 throw InternalPoseidon2Exception(
"An input tag is not FF");
112 for (uint32_t i = 0; i < 4; i++) {
116 .execution_clk = execution_clk,
122 }
catch (
const InternalPoseidon2Exception& e) {
124 .execution_clk = execution_clk,
128 .output = { 0, 0, 0, 0 } });