From a421532a8088ab67d242839061d98a933ed68334 Mon Sep 17 00:00:00 2001 From: IlyasRidhuan Date: Tue, 8 Oct 2024 08:30:50 +0000 Subject: [PATCH] feat(avm): full poseidon2 --- .../cpp/pil/avm/gadgets/poseidon2.pil | 47 +- .../cpp/pil/avm/gadgets/poseidon2_full.pil | 87 +++ barretenberg/cpp/pil/avm/main.pil | 1 + .../crypto/poseidon2/poseidon2.cpp | 2 +- .../vm/avm/generated/circuit_builder.cpp | 28 + .../barretenberg/vm/avm/generated/flavor.cpp | 466 ++++++++------ .../barretenberg/vm/avm/generated/flavor.hpp | 18 +- .../vm/avm/generated/full_row.cpp | 48 ++ .../vm/avm/generated/full_row.hpp | 26 +- .../relations/perm_pos2_fixed_pos2_perm.hpp | 83 +++ .../relations/perm_pos_mem_read_a.hpp | 10 +- .../relations/perm_pos_mem_read_b.hpp | 10 +- .../relations/perm_pos_mem_read_c.hpp | 10 +- .../relations/perm_pos_mem_read_d.hpp | 10 +- .../relations/perm_pos_mem_write_a.hpp | 10 +- .../relations/perm_pos_mem_write_b.hpp | 10 +- .../relations/perm_pos_mem_write_c.hpp | 10 +- .../relations/perm_pos_mem_write_d.hpp | 10 +- .../vm/avm/generated/relations/poseidon2.hpp | 606 +++++++++--------- .../generated/relations/poseidon2_full.hpp | 176 +++++ .../vm/avm/tests/full_poseidon2.test.cpp | 106 +++ .../vm/avm/tests/fuzz_skippable.test.cpp | 2 + .../vm/avm/trace/gadgets/poseidon2.cpp | 111 +++- .../vm/avm/trace/gadgets/poseidon2.hpp | 20 +- .../src/barretenberg/vm/aztec_constants.hpp | 2 +- .../crates/types/src/constants.nr | 2 +- yarn-project/circuits.js/src/constants.gen.ts | 2 +- 27 files changed, 1359 insertions(+), 554 deletions(-) create mode 100644 barretenberg/cpp/pil/avm/gadgets/poseidon2_full.pil create mode 100644 barretenberg/cpp/src/barretenberg/vm/avm/generated/relations/perm_pos2_fixed_pos2_perm.hpp create mode 100644 barretenberg/cpp/src/barretenberg/vm/avm/generated/relations/poseidon2_full.hpp create mode 100644 barretenberg/cpp/src/barretenberg/vm/avm/tests/full_poseidon2.test.cpp diff --git a/barretenberg/cpp/pil/avm/gadgets/poseidon2.pil b/barretenberg/cpp/pil/avm/gadgets/poseidon2.pil index 58f14498eb9..d1af83f9e7e 100644 --- a/barretenberg/cpp/pil/avm/gadgets/poseidon2.pil +++ b/barretenberg/cpp/pil/avm/gadgets/poseidon2.pil @@ -9,9 +9,20 @@ namespace poseidon2(256); // Selector is boolean sel_poseidon_perm * (1 - sel_poseidon_perm) = 0; + // Selector for if values are read from memory or already loaded in registers + pol commit sel_poseidon_perm_mem_op; + sel_poseidon_perm_mem_op * (1 - sel_poseidon_perm_mem_op) = 0; + pol commit sel_poseidon_perm_immediate; + sel_poseidon_perm_immediate * (1 - sel_poseidon_perm_immediate) = 0; + + // If poseidon perm is active, it must be either a mem op or immediate but not both + sel_poseidon_perm * (1 - sel_poseidon_perm_mem_op + sel_poseidon_perm_immediate) = 0; + // If inactive the mem op or immediate selectors must be 0 + (1 - sel_poseidon_perm) * (sel_poseidon_perm_mem_op + sel_poseidon_perm_immediate) = 0; + // No relations will be checked if this identity is satisfied. #[skippable_if] - sel_poseidon_perm = 0; + sel_poseidon_perm * sel_poseidon_perm_mem_op * sel_poseidon_perm_immediate = 0; // The initial mem address for inputs or output pol commit input_addr; @@ -28,16 +39,16 @@ namespace poseidon2(256); pol commit mem_addr_write_c; pol commit mem_addr_write_d; - // Accessed read / write addresses are contiguous blocks - sel_poseidon_perm * (mem_addr_read_a - input_addr) = 0; - sel_poseidon_perm * (mem_addr_read_b - (input_addr + 1)) = 0; - sel_poseidon_perm * (mem_addr_read_c - (input_addr + 2)) = 0; - sel_poseidon_perm * (mem_addr_read_d - (input_addr + 3)) = 0; + // Accessed read / write addresses are contiguous blocks ( would be nice if we could use sel_poseidon * sel_mem_op) + sel_poseidon_perm_mem_op * (mem_addr_read_a - input_addr) = 0; + sel_poseidon_perm_mem_op * (mem_addr_read_b - (input_addr + 1)) = 0; + sel_poseidon_perm_mem_op * (mem_addr_read_c - (input_addr + 2)) = 0; + sel_poseidon_perm_mem_op * (mem_addr_read_d - (input_addr + 3)) = 0; - sel_poseidon_perm * (mem_addr_write_a - output_addr) = 0; - sel_poseidon_perm * (mem_addr_write_b - (output_addr + 1)) = 0; - sel_poseidon_perm * (mem_addr_write_c - (output_addr + 2)) = 0; - sel_poseidon_perm * (mem_addr_write_d - (output_addr + 3)) = 0; + sel_poseidon_perm_mem_op * (mem_addr_write_a - output_addr) = 0; + sel_poseidon_perm_mem_op * (mem_addr_write_b - (output_addr + 1)) = 0; + sel_poseidon_perm_mem_op * (mem_addr_write_c - (output_addr + 2)) = 0; + sel_poseidon_perm_mem_op * (mem_addr_write_d - (output_addr + 3)) = 0; // The input values are represented by a_0, a_1, a_2, a_3 pol commit a_0; @@ -53,43 +64,43 @@ namespace poseidon2(256); // ==== READ MEM OPS ===== #[PERM_POS_MEM_READ_A] - sel_poseidon_perm {clk, main.space_id, mem_addr_read_a, a_0, main.zeroes} + sel_poseidon_perm_mem_op {clk, main.space_id, mem_addr_read_a, a_0, main.zeroes} is mem.sel_op_poseidon_read_a {mem.clk, mem.space_id, mem.addr, mem.val, mem.rw}; #[PERM_POS_MEM_READ_B] - sel_poseidon_perm {clk, main.space_id, mem_addr_read_b, a_1, main.zeroes} + sel_poseidon_perm_mem_op {clk, main.space_id, mem_addr_read_b, a_1, main.zeroes} is mem.sel_op_poseidon_read_b {mem.clk, mem.space_id, mem.addr, mem.val, mem.rw}; #[PERM_POS_MEM_READ_C] - sel_poseidon_perm {clk, main.space_id, mem_addr_read_c, a_2, main.zeroes} + sel_poseidon_perm_mem_op {clk, main.space_id, mem_addr_read_c, a_2, main.zeroes} is mem.sel_op_poseidon_read_c {mem.clk, mem.space_id, mem.addr, mem.val, mem.rw}; #[PERM_POS_MEM_READ_D] - sel_poseidon_perm {clk, main.space_id, mem_addr_read_d, a_3, main.zeroes} + sel_poseidon_perm_mem_op {clk, main.space_id, mem_addr_read_d, a_3, main.zeroes} is mem.sel_op_poseidon_read_d {mem.clk, mem.space_id, mem.addr, mem.val, mem.rw}; //// ==== WRITE MEM OPS ===== #[PERM_POS_MEM_WRITE_A] - sel_poseidon_perm {clk, main.space_id, mem_addr_write_a, b_0, sel_poseidon_perm} + sel_poseidon_perm_mem_op {clk, main.space_id, mem_addr_write_a, b_0, sel_poseidon_perm} is mem.sel_op_poseidon_write_a {mem.clk, mem.space_id, mem.addr, mem.val, mem.rw}; #[PERM_POS_MEM_WRITE_B] - sel_poseidon_perm {clk, main.space_id, mem_addr_write_b, b_1, sel_poseidon_perm} + sel_poseidon_perm_mem_op {clk, main.space_id, mem_addr_write_b, b_1, sel_poseidon_perm} is mem.sel_op_poseidon_write_b {mem.clk, mem.space_id, mem.addr, mem.val, mem.rw}; #[PERM_POS_MEM_WRITE_C] - sel_poseidon_perm {clk, main.space_id, mem_addr_write_c, b_2, sel_poseidon_perm} + sel_poseidon_perm_mem_op {clk, main.space_id, mem_addr_write_c, b_2, sel_poseidon_perm} is mem.sel_op_poseidon_write_c {mem.clk, mem.space_id, mem.addr, mem.val, mem.rw}; #[PERM_POS_MEM_WRITE_D] - sel_poseidon_perm {clk, main.space_id, mem_addr_write_d, b_3, sel_poseidon_perm} + sel_poseidon_perm_mem_op {clk, main.space_id, mem_addr_write_d, b_3, sel_poseidon_perm} is mem.sel_op_poseidon_write_d {mem.clk, mem.space_id, mem.addr, mem.val, mem.rw}; diff --git a/barretenberg/cpp/pil/avm/gadgets/poseidon2_full.pil b/barretenberg/cpp/pil/avm/gadgets/poseidon2_full.pil new file mode 100644 index 00000000000..fcfd3f43b32 --- /dev/null +++ b/barretenberg/cpp/pil/avm/gadgets/poseidon2_full.pil @@ -0,0 +1,87 @@ +include "./poseidon2.pil"; + +// Performs the poseidon2 full hash +// It is **mostly** well-constrained +namespace poseidon2_full(256); + pol commit clk; + // These are the inputs to be hashed this round, we hash chunks of 3 + pol commit input_0; + pol commit input_1; + pol commit input_2; + + // Output of the hash it is matched with the result of the last permutation round; + pol commit output; + + pol commit sel_poseidon; + sel_poseidon * (1 - sel_poseidon) = 0; + sel_poseidon = execute_poseidon_perm + end_poseidon; + pol TWOPOW64 = 18446744073709551616; + + pol commit input_len; + // Only used at the start of a new poseidon2 hash + pol IV = TWOPOW64 * input_len; + + // Start of a poseidon2 computation + pol commit start_poseidon; + start_poseidon * (1 - start_poseidon) = 0; + // When we end a poseidon, the next row must naturally have a start_poseidon + sel_poseidon' * (1 - main.sel_first) * (start_poseidon' - end_poseidon) = 0; + + // We track the num of rounds remaining, excluding the first round that has to be performed by the start_poseidon selector. + // We use the padded length to calculate the num of rounds to perform and the unpadded length is used in the IV. + pol commit num_perm_rounds_rem; + pol commit padding; + // Padding can either be 0, 1 or 2 + padding * (padding - 1) * (padding - 2) = 0; + pol PADDED_LEN = input_len + padding; + start_poseidon * ((num_perm_rounds_rem + 1) * 3 - PADDED_LEN) = 0; + + + // The row with the final result of the poseidon computation + pol commit end_poseidon; + // The final result of the output of the hash should match the output from the last permutation (b_0) + end_poseidon * (output - b_0) = 0; + pol commit num_perm_rounds_rem_inv; + // end_poseidon == 1 when the num_perm_rounds_rem == 0 + sel_poseidon * (num_perm_rounds_rem * (end_poseidon * (1 - num_perm_rounds_rem_inv) + num_perm_rounds_rem_inv) - 1 + end_poseidon) = 0; + + // We perform the "squeeze" / perm operation until end_poseidon + pol commit execute_poseidon_perm; + // The squeeze and end_poseidon selector must be mutually exclusive + sel_poseidon * (1 - end_poseidon - execute_poseidon_perm) = 0; + // Need an additional helper that holds the inverse of the num_perm_rounds_rem; + // If we still have rounds to perform, the num_perm_rounds_rem is decremented + execute_poseidon_perm * (num_perm_rounds_rem' - num_perm_rounds_rem + 1) = 0; + + + // The input values are represented by a_0, a_1, a_2, a_3 + // This most definitely could be simplified to a lower degree check + // the next perm input is constrained to be the previous perm output + the new values to be hashed. + // This occurs when we execute_poseidon_perm = 1 and we are not the start or the end of the poseidon perm + pol NEXT_INPUT_IS_PREV_OUTPUT_SEL = execute_poseidon_perm' * (1 - start_poseidon) * (1 - end_poseidon); + pol commit a_0; + start_poseidon * (a_0 - input_0) = 0; + sel_poseidon * NEXT_INPUT_IS_PREV_OUTPUT_SEL * (a_0' - b_0 - input_0') = 0; + pol commit a_1; + start_poseidon * (a_1 - input_1) = 0; + sel_poseidon * NEXT_INPUT_IS_PREV_OUTPUT_SEL * (a_1' - b_1 - input_1') = 0; + pol commit a_2; + start_poseidon * (a_2 - input_2) = 0; + sel_poseidon * NEXT_INPUT_IS_PREV_OUTPUT_SEL * (a_2' - b_2 - input_2') = 0; + pol commit a_3; + start_poseidon * (a_3 - IV) = 0; // IV is placed in the last slot if this is the start + sel_poseidon * NEXT_INPUT_IS_PREV_OUTPUT_SEL * (a_3' - b_3) = 0; + + // Output value represented by b_0 + pol commit b_0; + pol commit b_1; + pol commit b_2; + pol commit b_3; + + #[PERM_POS2_FIXED_POS2_PERM] + sel_poseidon {clk, a_0, a_1, a_2, a_3, b_0, b_1, b_2, b_3} + is + poseidon2.sel_poseidon_perm_immediate + { poseidon2.clk, poseidon2.a_0, poseidon2.a_1, poseidon2.a_2, poseidon2.a_3, + poseidon2.b_0, poseidon2.b_1, poseidon2.b_2, poseidon2.b_3 }; + diff --git a/barretenberg/cpp/pil/avm/main.pil b/barretenberg/cpp/pil/avm/main.pil index 768de4483ec..6075c1d03bf 100644 --- a/barretenberg/cpp/pil/avm/main.pil +++ b/barretenberg/cpp/pil/avm/main.pil @@ -9,6 +9,7 @@ include "fixed/powers.pil"; include "gadgets/conversion.pil"; include "gadgets/sha256.pil"; include "gadgets/poseidon2.pil"; +include "gadgets/poseidon2_full.pil"; include "gadgets/keccakf1600.pil"; include "gadgets/pedersen.pil"; include "gadgets/mem_slice.pil"; diff --git a/barretenberg/cpp/src/barretenberg/crypto/poseidon2/poseidon2.cpp b/barretenberg/cpp/src/barretenberg/crypto/poseidon2/poseidon2.cpp index 635b8dc0896..dad8ea1d3b1 100644 --- a/barretenberg/cpp/src/barretenberg/crypto/poseidon2/poseidon2.cpp +++ b/barretenberg/cpp/src/barretenberg/crypto/poseidon2/poseidon2.cpp @@ -44,4 +44,4 @@ typename Poseidon2::FF Poseidon2::hash_buffer(const std::vector< } template class Poseidon2; -} // namespace bb::crypto \ No newline at end of file +} // namespace bb::crypto diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/generated/circuit_builder.cpp b/barretenberg/cpp/src/barretenberg/vm/avm/generated/circuit_builder.cpp index ed5d12ccac6..31210d508ef 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/generated/circuit_builder.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/generated/circuit_builder.cpp @@ -624,6 +624,30 @@ AvmCircuitBuilder::ProverPolynomials AvmCircuitBuilder::compute_polynomials() co polys.poseidon2_b_2.set_if_valid_index(i, rows[i].poseidon2_b_2); polys.poseidon2_b_3.set_if_valid_index(i, rows[i].poseidon2_b_3); polys.poseidon2_clk.set_if_valid_index(i, rows[i].poseidon2_clk); + polys.poseidon2_full_a_0.set_if_valid_index(i, rows[i].poseidon2_full_a_0); + polys.poseidon2_full_a_1.set_if_valid_index(i, rows[i].poseidon2_full_a_1); + polys.poseidon2_full_a_2.set_if_valid_index(i, rows[i].poseidon2_full_a_2); + polys.poseidon2_full_a_3.set_if_valid_index(i, rows[i].poseidon2_full_a_3); + polys.poseidon2_full_b_0.set_if_valid_index(i, rows[i].poseidon2_full_b_0); + polys.poseidon2_full_b_1.set_if_valid_index(i, rows[i].poseidon2_full_b_1); + polys.poseidon2_full_b_2.set_if_valid_index(i, rows[i].poseidon2_full_b_2); + polys.poseidon2_full_b_3.set_if_valid_index(i, rows[i].poseidon2_full_b_3); + polys.poseidon2_full_clk.set_if_valid_index(i, rows[i].poseidon2_full_clk); + polys.poseidon2_full_end_poseidon.set_if_valid_index(i, rows[i].poseidon2_full_end_poseidon); + polys.poseidon2_full_execute_poseidon_perm.set_if_valid_index( + i, rows[i].poseidon2_full_execute_poseidon_perm); + polys.poseidon2_full_input_0.set_if_valid_index(i, rows[i].poseidon2_full_input_0); + polys.poseidon2_full_input_1.set_if_valid_index(i, rows[i].poseidon2_full_input_1); + polys.poseidon2_full_input_2.set_if_valid_index(i, rows[i].poseidon2_full_input_2); + polys.poseidon2_full_input_len.set_if_valid_index(i, rows[i].poseidon2_full_input_len); + polys.poseidon2_full_num_perm_rounds_rem.set_if_valid_index(i, + rows[i].poseidon2_full_num_perm_rounds_rem); + polys.poseidon2_full_num_perm_rounds_rem_inv.set_if_valid_index( + i, rows[i].poseidon2_full_num_perm_rounds_rem_inv); + polys.poseidon2_full_output.set_if_valid_index(i, rows[i].poseidon2_full_output); + polys.poseidon2_full_padding.set_if_valid_index(i, rows[i].poseidon2_full_padding); + polys.poseidon2_full_sel_poseidon.set_if_valid_index(i, rows[i].poseidon2_full_sel_poseidon); + polys.poseidon2_full_start_poseidon.set_if_valid_index(i, rows[i].poseidon2_full_start_poseidon); polys.poseidon2_input_addr.set_if_valid_index(i, rows[i].poseidon2_input_addr); polys.poseidon2_mem_addr_read_a.set_if_valid_index(i, rows[i].poseidon2_mem_addr_read_a); polys.poseidon2_mem_addr_read_b.set_if_valid_index(i, rows[i].poseidon2_mem_addr_read_b); @@ -635,6 +659,10 @@ AvmCircuitBuilder::ProverPolynomials AvmCircuitBuilder::compute_polynomials() co polys.poseidon2_mem_addr_write_d.set_if_valid_index(i, rows[i].poseidon2_mem_addr_write_d); polys.poseidon2_output_addr.set_if_valid_index(i, rows[i].poseidon2_output_addr); polys.poseidon2_sel_poseidon_perm.set_if_valid_index(i, rows[i].poseidon2_sel_poseidon_perm); + polys.poseidon2_sel_poseidon_perm_immediate.set_if_valid_index( + i, rows[i].poseidon2_sel_poseidon_perm_immediate); + polys.poseidon2_sel_poseidon_perm_mem_op.set_if_valid_index(i, + rows[i].poseidon2_sel_poseidon_perm_mem_op); polys.range_check_alu_rng_chk.set_if_valid_index(i, rows[i].range_check_alu_rng_chk); polys.range_check_clk.set_if_valid_index(i, rows[i].range_check_clk); polys.range_check_cmp_hi_bits_rng_chk.set_if_valid_index(i, rows[i].range_check_cmp_hi_bits_rng_chk); diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/generated/flavor.cpp b/barretenberg/cpp/src/barretenberg/vm/avm/generated/flavor.cpp index 4e2a5a5290f..a084a3be701 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/generated/flavor.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/generated/flavor.cpp @@ -574,192 +574,227 @@ AvmFlavor::AllConstRefValues::AllConstRefValues( , poseidon2_b_2(il[566]) , poseidon2_b_3(il[567]) , poseidon2_clk(il[568]) - , poseidon2_input_addr(il[569]) - , poseidon2_mem_addr_read_a(il[570]) - , poseidon2_mem_addr_read_b(il[571]) - , poseidon2_mem_addr_read_c(il[572]) - , poseidon2_mem_addr_read_d(il[573]) - , poseidon2_mem_addr_write_a(il[574]) - , poseidon2_mem_addr_write_b(il[575]) - , poseidon2_mem_addr_write_c(il[576]) - , poseidon2_mem_addr_write_d(il[577]) - , poseidon2_output_addr(il[578]) - , poseidon2_sel_poseidon_perm(il[579]) - , range_check_alu_rng_chk(il[580]) - , range_check_clk(il[581]) - , range_check_cmp_hi_bits_rng_chk(il[582]) - , range_check_cmp_lo_bits_rng_chk(il[583]) - , range_check_dyn_diff(il[584]) - , range_check_dyn_rng_chk_bits(il[585]) - , range_check_dyn_rng_chk_pow_2(il[586]) - , range_check_gas_da_rng_chk(il[587]) - , range_check_gas_l2_rng_chk(il[588]) - , range_check_is_lte_u112(il[589]) - , range_check_is_lte_u128(il[590]) - , range_check_is_lte_u16(il[591]) - , range_check_is_lte_u32(il[592]) - , range_check_is_lte_u48(il[593]) - , range_check_is_lte_u64(il[594]) - , range_check_is_lte_u80(il[595]) - , range_check_is_lte_u96(il[596]) - , range_check_mem_rng_chk(il[597]) - , range_check_rng_chk_bits(il[598]) - , range_check_sel_lookup_0(il[599]) - , range_check_sel_lookup_1(il[600]) - , range_check_sel_lookup_2(il[601]) - , range_check_sel_lookup_3(il[602]) - , range_check_sel_lookup_4(il[603]) - , range_check_sel_lookup_5(il[604]) - , range_check_sel_lookup_6(il[605]) - , range_check_sel_rng_chk(il[606]) - , range_check_u16_r0(il[607]) - , range_check_u16_r1(il[608]) - , range_check_u16_r2(il[609]) - , range_check_u16_r3(il[610]) - , range_check_u16_r4(il[611]) - , range_check_u16_r5(il[612]) - , range_check_u16_r6(il[613]) - , range_check_u16_r7(il[614]) - , range_check_value(il[615]) - , sha256_clk(il[616]) - , sha256_input(il[617]) - , sha256_output(il[618]) - , sha256_sel_sha256_compression(il[619]) - , sha256_state(il[620]) - , slice_addr(il[621]) - , slice_clk(il[622]) - , slice_cnt(il[623]) - , slice_col_offset(il[624]) - , slice_one_min_inv(il[625]) - , slice_sel_cd_cpy(il[626]) - , slice_sel_mem_active(il[627]) - , slice_sel_return(il[628]) - , slice_sel_start(il[629]) - , slice_space_id(il[630]) - , slice_val(il[631]) - , lookup_rng_chk_pow_2_counts(il[632]) - , lookup_rng_chk_diff_counts(il[633]) - , lookup_rng_chk_0_counts(il[634]) - , lookup_rng_chk_1_counts(il[635]) - , lookup_rng_chk_2_counts(il[636]) - , lookup_rng_chk_3_counts(il[637]) - , lookup_rng_chk_4_counts(il[638]) - , lookup_rng_chk_5_counts(il[639]) - , lookup_rng_chk_6_counts(il[640]) - , lookup_rng_chk_7_counts(il[641]) - , lookup_pow_2_0_counts(il[642]) - , lookup_pow_2_1_counts(il[643]) - , lookup_byte_lengths_counts(il[644]) - , lookup_byte_operations_counts(il[645]) - , lookup_opcode_gas_counts(il[646]) - , kernel_output_lookup_counts(il[647]) - , lookup_into_kernel_counts(il[648]) - , lookup_cd_value_counts(il[649]) - , lookup_ret_value_counts(il[650]) - , incl_main_tag_err_counts(il[651]) - , incl_mem_tag_err_counts(il[652]) - , perm_rng_mem_inv(il[653]) - , perm_rng_cmp_lo_inv(il[654]) - , perm_rng_cmp_hi_inv(il[655]) - , perm_rng_alu_inv(il[656]) - , perm_cmp_alu_inv(il[657]) - , perm_rng_gas_l2_inv(il[658]) - , perm_rng_gas_da_inv(il[659]) - , perm_l2_start_gas_inv(il[660]) - , perm_da_start_gas_inv(il[661]) - , perm_l2_end_gas_inv(il[662]) - , perm_da_end_gas_inv(il[663]) - , perm_pos_mem_read_a_inv(il[664]) - , perm_pos_mem_read_b_inv(il[665]) - , perm_pos_mem_read_c_inv(il[666]) - , perm_pos_mem_read_d_inv(il[667]) - , perm_pos_mem_write_a_inv(il[668]) - , perm_pos_mem_write_b_inv(il[669]) - , perm_pos_mem_write_c_inv(il[670]) - , perm_pos_mem_write_d_inv(il[671]) - , perm_slice_mem_inv(il[672]) - , perm_main_alu_inv(il[673]) - , perm_main_bin_inv(il[674]) - , perm_main_conv_inv(il[675]) - , perm_main_pos2_perm_inv(il[676]) - , perm_main_pedersen_inv(il[677]) - , perm_main_slice_inv(il[678]) - , perm_main_mem_a_inv(il[679]) - , perm_main_mem_b_inv(il[680]) - , perm_main_mem_c_inv(il[681]) - , perm_main_mem_d_inv(il[682]) - , perm_main_mem_ind_addr_a_inv(il[683]) - , perm_main_mem_ind_addr_b_inv(il[684]) - , perm_main_mem_ind_addr_c_inv(il[685]) - , perm_main_mem_ind_addr_d_inv(il[686]) - , lookup_rng_chk_pow_2_inv(il[687]) - , lookup_rng_chk_diff_inv(il[688]) - , lookup_rng_chk_0_inv(il[689]) - , lookup_rng_chk_1_inv(il[690]) - , lookup_rng_chk_2_inv(il[691]) - , lookup_rng_chk_3_inv(il[692]) - , lookup_rng_chk_4_inv(il[693]) - , lookup_rng_chk_5_inv(il[694]) - , lookup_rng_chk_6_inv(il[695]) - , lookup_rng_chk_7_inv(il[696]) - , lookup_pow_2_0_inv(il[697]) - , lookup_pow_2_1_inv(il[698]) - , lookup_byte_lengths_inv(il[699]) - , lookup_byte_operations_inv(il[700]) - , lookup_opcode_gas_inv(il[701]) - , kernel_output_lookup_inv(il[702]) - , lookup_into_kernel_inv(il[703]) - , lookup_cd_value_inv(il[704]) - , lookup_ret_value_inv(il[705]) - , incl_main_tag_err_inv(il[706]) - , incl_mem_tag_err_inv(il[707]) - , binary_acc_ia_shift(il[708]) - , binary_acc_ib_shift(il[709]) - , binary_acc_ic_shift(il[710]) - , binary_mem_tag_ctr_shift(il[711]) - , binary_op_id_shift(il[712]) - , cmp_a_hi_shift(il[713]) - , cmp_a_lo_shift(il[714]) - , cmp_b_hi_shift(il[715]) - , cmp_b_lo_shift(il[716]) - , cmp_cmp_rng_ctr_shift(il[717]) - , cmp_op_gt_shift(il[718]) - , cmp_p_sub_a_hi_shift(il[719]) - , cmp_p_sub_a_lo_shift(il[720]) - , cmp_p_sub_b_hi_shift(il[721]) - , cmp_p_sub_b_lo_shift(il[722]) - , cmp_sel_rng_chk_shift(il[723]) - , main_da_gas_remaining_shift(il[724]) - , main_emit_l2_to_l1_msg_write_offset_shift(il[725]) - , main_emit_note_hash_write_offset_shift(il[726]) - , main_emit_nullifier_write_offset_shift(il[727]) - , main_emit_unencrypted_log_write_offset_shift(il[728]) - , main_internal_return_ptr_shift(il[729]) - , main_l1_to_l2_msg_exists_write_offset_shift(il[730]) - , main_l2_gas_remaining_shift(il[731]) - , main_note_hash_exist_write_offset_shift(il[732]) - , main_nullifier_exists_write_offset_shift(il[733]) - , main_nullifier_non_exists_write_offset_shift(il[734]) - , main_pc_shift(il[735]) - , main_sel_execution_end_shift(il[736]) - , main_sel_execution_row_shift(il[737]) - , main_sload_write_offset_shift(il[738]) - , main_sstore_write_offset_shift(il[739]) - , mem_glob_addr_shift(il[740]) - , mem_rw_shift(il[741]) - , mem_sel_mem_shift(il[742]) - , mem_tag_shift(il[743]) - , mem_tsp_shift(il[744]) - , mem_val_shift(il[745]) - , slice_addr_shift(il[746]) - , slice_clk_shift(il[747]) - , slice_cnt_shift(il[748]) - , slice_col_offset_shift(il[749]) - , slice_sel_cd_cpy_shift(il[750]) - , slice_sel_mem_active_shift(il[751]) - , slice_sel_return_shift(il[752]) - , slice_sel_start_shift(il[753]) - , slice_space_id_shift(il[754]) + , poseidon2_full_a_0(il[569]) + , poseidon2_full_a_1(il[570]) + , poseidon2_full_a_2(il[571]) + , poseidon2_full_a_3(il[572]) + , poseidon2_full_b_0(il[573]) + , poseidon2_full_b_1(il[574]) + , poseidon2_full_b_2(il[575]) + , poseidon2_full_b_3(il[576]) + , poseidon2_full_clk(il[577]) + , poseidon2_full_end_poseidon(il[578]) + , poseidon2_full_execute_poseidon_perm(il[579]) + , poseidon2_full_input_0(il[580]) + , poseidon2_full_input_1(il[581]) + , poseidon2_full_input_2(il[582]) + , poseidon2_full_input_len(il[583]) + , poseidon2_full_num_perm_rounds_rem(il[584]) + , poseidon2_full_num_perm_rounds_rem_inv(il[585]) + , poseidon2_full_output(il[586]) + , poseidon2_full_padding(il[587]) + , poseidon2_full_sel_poseidon(il[588]) + , poseidon2_full_start_poseidon(il[589]) + , poseidon2_input_addr(il[590]) + , poseidon2_mem_addr_read_a(il[591]) + , poseidon2_mem_addr_read_b(il[592]) + , poseidon2_mem_addr_read_c(il[593]) + , poseidon2_mem_addr_read_d(il[594]) + , poseidon2_mem_addr_write_a(il[595]) + , poseidon2_mem_addr_write_b(il[596]) + , poseidon2_mem_addr_write_c(il[597]) + , poseidon2_mem_addr_write_d(il[598]) + , poseidon2_output_addr(il[599]) + , poseidon2_sel_poseidon_perm(il[600]) + , poseidon2_sel_poseidon_perm_immediate(il[601]) + , poseidon2_sel_poseidon_perm_mem_op(il[602]) + , range_check_alu_rng_chk(il[603]) + , range_check_clk(il[604]) + , range_check_cmp_hi_bits_rng_chk(il[605]) + , range_check_cmp_lo_bits_rng_chk(il[606]) + , range_check_dyn_diff(il[607]) + , range_check_dyn_rng_chk_bits(il[608]) + , range_check_dyn_rng_chk_pow_2(il[609]) + , range_check_gas_da_rng_chk(il[610]) + , range_check_gas_l2_rng_chk(il[611]) + , range_check_is_lte_u112(il[612]) + , range_check_is_lte_u128(il[613]) + , range_check_is_lte_u16(il[614]) + , range_check_is_lte_u32(il[615]) + , range_check_is_lte_u48(il[616]) + , range_check_is_lte_u64(il[617]) + , range_check_is_lte_u80(il[618]) + , range_check_is_lte_u96(il[619]) + , range_check_mem_rng_chk(il[620]) + , range_check_rng_chk_bits(il[621]) + , range_check_sel_lookup_0(il[622]) + , range_check_sel_lookup_1(il[623]) + , range_check_sel_lookup_2(il[624]) + , range_check_sel_lookup_3(il[625]) + , range_check_sel_lookup_4(il[626]) + , range_check_sel_lookup_5(il[627]) + , range_check_sel_lookup_6(il[628]) + , range_check_sel_rng_chk(il[629]) + , range_check_u16_r0(il[630]) + , range_check_u16_r1(il[631]) + , range_check_u16_r2(il[632]) + , range_check_u16_r3(il[633]) + , range_check_u16_r4(il[634]) + , range_check_u16_r5(il[635]) + , range_check_u16_r6(il[636]) + , range_check_u16_r7(il[637]) + , range_check_value(il[638]) + , sha256_clk(il[639]) + , sha256_input(il[640]) + , sha256_output(il[641]) + , sha256_sel_sha256_compression(il[642]) + , sha256_state(il[643]) + , slice_addr(il[644]) + , slice_clk(il[645]) + , slice_cnt(il[646]) + , slice_col_offset(il[647]) + , slice_one_min_inv(il[648]) + , slice_sel_cd_cpy(il[649]) + , slice_sel_mem_active(il[650]) + , slice_sel_return(il[651]) + , slice_sel_start(il[652]) + , slice_space_id(il[653]) + , slice_val(il[654]) + , lookup_rng_chk_pow_2_counts(il[655]) + , lookup_rng_chk_diff_counts(il[656]) + , lookup_rng_chk_0_counts(il[657]) + , lookup_rng_chk_1_counts(il[658]) + , lookup_rng_chk_2_counts(il[659]) + , lookup_rng_chk_3_counts(il[660]) + , lookup_rng_chk_4_counts(il[661]) + , lookup_rng_chk_5_counts(il[662]) + , lookup_rng_chk_6_counts(il[663]) + , lookup_rng_chk_7_counts(il[664]) + , lookup_pow_2_0_counts(il[665]) + , lookup_pow_2_1_counts(il[666]) + , lookup_byte_lengths_counts(il[667]) + , lookup_byte_operations_counts(il[668]) + , lookup_opcode_gas_counts(il[669]) + , kernel_output_lookup_counts(il[670]) + , lookup_into_kernel_counts(il[671]) + , lookup_cd_value_counts(il[672]) + , lookup_ret_value_counts(il[673]) + , incl_main_tag_err_counts(il[674]) + , incl_mem_tag_err_counts(il[675]) + , perm_rng_mem_inv(il[676]) + , perm_rng_cmp_lo_inv(il[677]) + , perm_rng_cmp_hi_inv(il[678]) + , perm_rng_alu_inv(il[679]) + , perm_cmp_alu_inv(il[680]) + , perm_rng_gas_l2_inv(il[681]) + , perm_rng_gas_da_inv(il[682]) + , perm_l2_start_gas_inv(il[683]) + , perm_da_start_gas_inv(il[684]) + , perm_l2_end_gas_inv(il[685]) + , perm_da_end_gas_inv(il[686]) + , perm_pos_mem_read_a_inv(il[687]) + , perm_pos_mem_read_b_inv(il[688]) + , perm_pos_mem_read_c_inv(il[689]) + , perm_pos_mem_read_d_inv(il[690]) + , perm_pos_mem_write_a_inv(il[691]) + , perm_pos_mem_write_b_inv(il[692]) + , perm_pos_mem_write_c_inv(il[693]) + , perm_pos_mem_write_d_inv(il[694]) + , perm_pos2_fixed_pos2_perm_inv(il[695]) + , perm_slice_mem_inv(il[696]) + , perm_main_alu_inv(il[697]) + , perm_main_bin_inv(il[698]) + , perm_main_conv_inv(il[699]) + , perm_main_pos2_perm_inv(il[700]) + , perm_main_pedersen_inv(il[701]) + , perm_main_slice_inv(il[702]) + , perm_main_mem_a_inv(il[703]) + , perm_main_mem_b_inv(il[704]) + , perm_main_mem_c_inv(il[705]) + , perm_main_mem_d_inv(il[706]) + , perm_main_mem_ind_addr_a_inv(il[707]) + , perm_main_mem_ind_addr_b_inv(il[708]) + , perm_main_mem_ind_addr_c_inv(il[709]) + , perm_main_mem_ind_addr_d_inv(il[710]) + , lookup_rng_chk_pow_2_inv(il[711]) + , lookup_rng_chk_diff_inv(il[712]) + , lookup_rng_chk_0_inv(il[713]) + , lookup_rng_chk_1_inv(il[714]) + , lookup_rng_chk_2_inv(il[715]) + , lookup_rng_chk_3_inv(il[716]) + , lookup_rng_chk_4_inv(il[717]) + , lookup_rng_chk_5_inv(il[718]) + , lookup_rng_chk_6_inv(il[719]) + , lookup_rng_chk_7_inv(il[720]) + , lookup_pow_2_0_inv(il[721]) + , lookup_pow_2_1_inv(il[722]) + , lookup_byte_lengths_inv(il[723]) + , lookup_byte_operations_inv(il[724]) + , lookup_opcode_gas_inv(il[725]) + , kernel_output_lookup_inv(il[726]) + , lookup_into_kernel_inv(il[727]) + , lookup_cd_value_inv(il[728]) + , lookup_ret_value_inv(il[729]) + , incl_main_tag_err_inv(il[730]) + , incl_mem_tag_err_inv(il[731]) + , binary_acc_ia_shift(il[732]) + , binary_acc_ib_shift(il[733]) + , binary_acc_ic_shift(il[734]) + , binary_mem_tag_ctr_shift(il[735]) + , binary_op_id_shift(il[736]) + , cmp_a_hi_shift(il[737]) + , cmp_a_lo_shift(il[738]) + , cmp_b_hi_shift(il[739]) + , cmp_b_lo_shift(il[740]) + , cmp_cmp_rng_ctr_shift(il[741]) + , cmp_op_gt_shift(il[742]) + , cmp_p_sub_a_hi_shift(il[743]) + , cmp_p_sub_a_lo_shift(il[744]) + , cmp_p_sub_b_hi_shift(il[745]) + , cmp_p_sub_b_lo_shift(il[746]) + , cmp_sel_rng_chk_shift(il[747]) + , main_da_gas_remaining_shift(il[748]) + , main_emit_l2_to_l1_msg_write_offset_shift(il[749]) + , main_emit_note_hash_write_offset_shift(il[750]) + , main_emit_nullifier_write_offset_shift(il[751]) + , main_emit_unencrypted_log_write_offset_shift(il[752]) + , main_internal_return_ptr_shift(il[753]) + , main_l1_to_l2_msg_exists_write_offset_shift(il[754]) + , main_l2_gas_remaining_shift(il[755]) + , main_note_hash_exist_write_offset_shift(il[756]) + , main_nullifier_exists_write_offset_shift(il[757]) + , main_nullifier_non_exists_write_offset_shift(il[758]) + , main_pc_shift(il[759]) + , main_sel_execution_end_shift(il[760]) + , main_sel_execution_row_shift(il[761]) + , main_sload_write_offset_shift(il[762]) + , main_sstore_write_offset_shift(il[763]) + , mem_glob_addr_shift(il[764]) + , mem_rw_shift(il[765]) + , mem_sel_mem_shift(il[766]) + , mem_tag_shift(il[767]) + , mem_tsp_shift(il[768]) + , mem_val_shift(il[769]) + , poseidon2_full_a_0_shift(il[770]) + , poseidon2_full_a_1_shift(il[771]) + , poseidon2_full_a_2_shift(il[772]) + , poseidon2_full_a_3_shift(il[773]) + , poseidon2_full_execute_poseidon_perm_shift(il[774]) + , poseidon2_full_input_0_shift(il[775]) + , poseidon2_full_input_1_shift(il[776]) + , poseidon2_full_input_2_shift(il[777]) + , poseidon2_full_num_perm_rounds_rem_shift(il[778]) + , poseidon2_full_sel_poseidon_shift(il[779]) + , poseidon2_full_start_poseidon_shift(il[780]) + , slice_addr_shift(il[781]) + , slice_clk_shift(il[782]) + , slice_cnt_shift(il[783]) + , slice_col_offset_shift(il[784]) + , slice_sel_cd_cpy_shift(il[785]) + , slice_sel_mem_active_shift(il[786]) + , slice_sel_return_shift(il[787]) + , slice_sel_start_shift(il[788]) + , slice_space_id_shift(il[789]) {} AvmFlavor::ProverPolynomials::ProverPolynomials(ProvingKey& proving_key) @@ -1345,6 +1380,27 @@ AvmFlavor::AllConstRefValues AvmFlavor::ProverPolynomials::get_row(size_t row_id poseidon2_b_2[row_idx], poseidon2_b_3[row_idx], poseidon2_clk[row_idx], + poseidon2_full_a_0[row_idx], + poseidon2_full_a_1[row_idx], + poseidon2_full_a_2[row_idx], + poseidon2_full_a_3[row_idx], + poseidon2_full_b_0[row_idx], + poseidon2_full_b_1[row_idx], + poseidon2_full_b_2[row_idx], + poseidon2_full_b_3[row_idx], + poseidon2_full_clk[row_idx], + poseidon2_full_end_poseidon[row_idx], + poseidon2_full_execute_poseidon_perm[row_idx], + poseidon2_full_input_0[row_idx], + poseidon2_full_input_1[row_idx], + poseidon2_full_input_2[row_idx], + poseidon2_full_input_len[row_idx], + poseidon2_full_num_perm_rounds_rem[row_idx], + poseidon2_full_num_perm_rounds_rem_inv[row_idx], + poseidon2_full_output[row_idx], + poseidon2_full_padding[row_idx], + poseidon2_full_sel_poseidon[row_idx], + poseidon2_full_start_poseidon[row_idx], poseidon2_input_addr[row_idx], poseidon2_mem_addr_read_a[row_idx], poseidon2_mem_addr_read_b[row_idx], @@ -1356,6 +1412,8 @@ AvmFlavor::AllConstRefValues AvmFlavor::ProverPolynomials::get_row(size_t row_id poseidon2_mem_addr_write_d[row_idx], poseidon2_output_addr[row_idx], poseidon2_sel_poseidon_perm[row_idx], + poseidon2_sel_poseidon_perm_immediate[row_idx], + poseidon2_sel_poseidon_perm_mem_op[row_idx], range_check_alu_rng_chk[row_idx], range_check_clk[row_idx], range_check_cmp_hi_bits_rng_chk[row_idx], @@ -1448,6 +1506,7 @@ AvmFlavor::AllConstRefValues AvmFlavor::ProverPolynomials::get_row(size_t row_id perm_pos_mem_write_b_inv[row_idx], perm_pos_mem_write_c_inv[row_idx], perm_pos_mem_write_d_inv[row_idx], + perm_pos2_fixed_pos2_perm_inv[row_idx], perm_slice_mem_inv[row_idx], perm_main_alu_inv[row_idx], perm_main_bin_inv[row_idx], @@ -1522,6 +1581,17 @@ AvmFlavor::AllConstRefValues AvmFlavor::ProverPolynomials::get_row(size_t row_id mem_tag_shift[row_idx], mem_tsp_shift[row_idx], mem_val_shift[row_idx], + poseidon2_full_a_0_shift[row_idx], + poseidon2_full_a_1_shift[row_idx], + poseidon2_full_a_2_shift[row_idx], + poseidon2_full_a_3_shift[row_idx], + poseidon2_full_execute_poseidon_perm_shift[row_idx], + poseidon2_full_input_0_shift[row_idx], + poseidon2_full_input_1_shift[row_idx], + poseidon2_full_input_2_shift[row_idx], + poseidon2_full_num_perm_rounds_rem_shift[row_idx], + poseidon2_full_sel_poseidon_shift[row_idx], + poseidon2_full_start_poseidon_shift[row_idx], slice_addr_shift[row_idx], slice_clk_shift[row_idx], slice_cnt_shift[row_idx], @@ -2104,6 +2174,27 @@ AvmFlavor::CommitmentLabels::CommitmentLabels() Base::poseidon2_b_2 = "POSEIDON2_B_2"; Base::poseidon2_b_3 = "POSEIDON2_B_3"; Base::poseidon2_clk = "POSEIDON2_CLK"; + Base::poseidon2_full_a_0 = "POSEIDON2_FULL_A_0"; + Base::poseidon2_full_a_1 = "POSEIDON2_FULL_A_1"; + Base::poseidon2_full_a_2 = "POSEIDON2_FULL_A_2"; + Base::poseidon2_full_a_3 = "POSEIDON2_FULL_A_3"; + Base::poseidon2_full_b_0 = "POSEIDON2_FULL_B_0"; + Base::poseidon2_full_b_1 = "POSEIDON2_FULL_B_1"; + Base::poseidon2_full_b_2 = "POSEIDON2_FULL_B_2"; + Base::poseidon2_full_b_3 = "POSEIDON2_FULL_B_3"; + Base::poseidon2_full_clk = "POSEIDON2_FULL_CLK"; + Base::poseidon2_full_end_poseidon = "POSEIDON2_FULL_END_POSEIDON"; + Base::poseidon2_full_execute_poseidon_perm = "POSEIDON2_FULL_EXECUTE_POSEIDON_PERM"; + Base::poseidon2_full_input_0 = "POSEIDON2_FULL_INPUT_0"; + Base::poseidon2_full_input_1 = "POSEIDON2_FULL_INPUT_1"; + Base::poseidon2_full_input_2 = "POSEIDON2_FULL_INPUT_2"; + Base::poseidon2_full_input_len = "POSEIDON2_FULL_INPUT_LEN"; + Base::poseidon2_full_num_perm_rounds_rem = "POSEIDON2_FULL_NUM_PERM_ROUNDS_REM"; + Base::poseidon2_full_num_perm_rounds_rem_inv = "POSEIDON2_FULL_NUM_PERM_ROUNDS_REM_INV"; + Base::poseidon2_full_output = "POSEIDON2_FULL_OUTPUT"; + Base::poseidon2_full_padding = "POSEIDON2_FULL_PADDING"; + Base::poseidon2_full_sel_poseidon = "POSEIDON2_FULL_SEL_POSEIDON"; + Base::poseidon2_full_start_poseidon = "POSEIDON2_FULL_START_POSEIDON"; Base::poseidon2_input_addr = "POSEIDON2_INPUT_ADDR"; Base::poseidon2_mem_addr_read_a = "POSEIDON2_MEM_ADDR_READ_A"; Base::poseidon2_mem_addr_read_b = "POSEIDON2_MEM_ADDR_READ_B"; @@ -2115,6 +2206,8 @@ AvmFlavor::CommitmentLabels::CommitmentLabels() Base::poseidon2_mem_addr_write_d = "POSEIDON2_MEM_ADDR_WRITE_D"; Base::poseidon2_output_addr = "POSEIDON2_OUTPUT_ADDR"; Base::poseidon2_sel_poseidon_perm = "POSEIDON2_SEL_POSEIDON_PERM"; + Base::poseidon2_sel_poseidon_perm_immediate = "POSEIDON2_SEL_POSEIDON_PERM_IMMEDIATE"; + Base::poseidon2_sel_poseidon_perm_mem_op = "POSEIDON2_SEL_POSEIDON_PERM_MEM_OP"; Base::range_check_alu_rng_chk = "RANGE_CHECK_ALU_RNG_CHK"; Base::range_check_clk = "RANGE_CHECK_CLK"; Base::range_check_cmp_hi_bits_rng_chk = "RANGE_CHECK_CMP_HI_BITS_RNG_CHK"; @@ -2186,6 +2279,7 @@ AvmFlavor::CommitmentLabels::CommitmentLabels() Base::perm_pos_mem_write_b_inv = "PERM_POS_MEM_WRITE_B_INV"; Base::perm_pos_mem_write_c_inv = "PERM_POS_MEM_WRITE_C_INV"; Base::perm_pos_mem_write_d_inv = "PERM_POS_MEM_WRITE_D_INV"; + Base::perm_pos2_fixed_pos2_perm_inv = "PERM_POS2_FIXED_POS2_PERM_INV"; Base::perm_slice_mem_inv = "PERM_SLICE_MEM_INV"; Base::perm_main_alu_inv = "PERM_MAIN_ALU_INV"; Base::perm_main_bin_inv = "PERM_MAIN_BIN_INV"; diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/generated/flavor.hpp b/barretenberg/cpp/src/barretenberg/vm/avm/generated/flavor.hpp index 5805df2cf50..133b2c64ec0 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/generated/flavor.hpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/generated/flavor.hpp @@ -28,6 +28,7 @@ #include "barretenberg/vm/avm/generated/relations/mem_slice.hpp" #include "barretenberg/vm/avm/generated/relations/pedersen.hpp" #include "barretenberg/vm/avm/generated/relations/poseidon2.hpp" +#include "barretenberg/vm/avm/generated/relations/poseidon2_full.hpp" #include "barretenberg/vm/avm/generated/relations/range_check.hpp" #include "barretenberg/vm/avm/generated/relations/sha256.hpp" @@ -72,6 +73,7 @@ #include "barretenberg/vm/avm/generated/relations/perm_main_pedersen.hpp" #include "barretenberg/vm/avm/generated/relations/perm_main_pos2_perm.hpp" #include "barretenberg/vm/avm/generated/relations/perm_main_slice.hpp" +#include "barretenberg/vm/avm/generated/relations/perm_pos2_fixed_pos2_perm.hpp" #include "barretenberg/vm/avm/generated/relations/perm_pos_mem_read_a.hpp" #include "barretenberg/vm/avm/generated/relations/perm_pos_mem_read_b.hpp" #include "barretenberg/vm/avm/generated/relations/perm_pos_mem_read_c.hpp" @@ -94,10 +96,10 @@ template using tuple_cat_t = decltype(std::tuple_cat(std:: // The entities that will be used in the flavor. // clang-format off #define PRECOMPUTED_ENTITIES byte_lookup_sel_bin, byte_lookup_table_byte_lengths, byte_lookup_table_in_tags, byte_lookup_table_input_a, byte_lookup_table_input_b, byte_lookup_table_op_id, byte_lookup_table_output, gas_base_da_gas_fixed_table, gas_base_l2_gas_fixed_table, gas_dyn_da_gas_fixed_table, gas_dyn_l2_gas_fixed_table, gas_sel_gas_cost, main_clk, main_sel_da_end_gas_kernel_input, main_sel_da_start_gas_kernel_input, main_sel_first, main_sel_l2_end_gas_kernel_input, main_sel_l2_start_gas_kernel_input, main_sel_start_exec, main_zeroes, powers_power_of_2 -#define WIRE_ENTITIES main_kernel_inputs, main_kernel_value_out, main_kernel_side_effect_out, main_kernel_metadata_out, main_calldata, main_returndata, alu_a_hi, alu_a_lo, alu_b_hi, alu_b_lo, alu_b_pow, alu_c_hi, alu_c_lo, alu_cf, alu_clk, alu_cmp_gadget_gt, alu_cmp_gadget_input_a, alu_cmp_gadget_input_b, alu_cmp_gadget_result, alu_cmp_gadget_sel, alu_ff_tag, alu_ia, alu_ib, alu_ic, alu_in_tag, alu_max_bits_sub_b_bits, alu_max_bits_sub_b_pow, alu_op_add, alu_op_cast, alu_op_div, alu_op_eq, alu_op_lt, alu_op_lte, alu_op_mul, alu_op_not, alu_op_shl, alu_op_shr, alu_op_sub, alu_partial_prod_hi, alu_partial_prod_lo, alu_range_check_input_value, alu_range_check_num_bits, alu_range_check_sel, alu_remainder, alu_sel_alu, alu_sel_cmp, alu_sel_shift_which, alu_u128_tag, alu_u16_tag, alu_u1_tag, alu_u32_tag, alu_u64_tag, alu_u8_tag, alu_zero_shift, binary_acc_ia, binary_acc_ib, binary_acc_ic, binary_clk, binary_ia_bytes, binary_ib_bytes, binary_ic_bytes, binary_in_tag, binary_mem_tag_ctr, binary_mem_tag_ctr_inv, binary_op_id, binary_sel_bin, binary_start, cmp_a_hi, cmp_a_lo, cmp_b_hi, cmp_b_lo, cmp_borrow, cmp_clk, cmp_cmp_rng_ctr, cmp_input_a, cmp_input_b, cmp_op_eq, cmp_op_eq_diff_inv, cmp_op_gt, cmp_p_a_borrow, cmp_p_b_borrow, cmp_p_sub_a_hi, cmp_p_sub_a_lo, cmp_p_sub_b_hi, cmp_p_sub_b_lo, cmp_range_chk_clk, cmp_res_hi, cmp_res_lo, cmp_result, cmp_sel_cmp, cmp_sel_rng_chk, cmp_shift_sel, conversion_clk, conversion_input, conversion_num_limbs, conversion_output_bits, conversion_radix, conversion_sel_to_radix_le, keccakf1600_clk, keccakf1600_input, keccakf1600_output, keccakf1600_sel_keccakf1600, main_abs_da_rem_gas, main_abs_l2_rem_gas, main_alu_in_tag, main_base_da_gas_op_cost, main_base_l2_gas_op_cost, main_bin_op_id, main_call_ptr, main_da_gas_remaining, main_da_out_of_gas, main_dyn_da_gas_op_cost, main_dyn_gas_multiplier, main_dyn_l2_gas_op_cost, main_emit_l2_to_l1_msg_write_offset, main_emit_note_hash_write_offset, main_emit_nullifier_write_offset, main_emit_unencrypted_log_write_offset, main_ia, main_ib, main_ic, main_id, main_id_zero, main_ind_addr_a, main_ind_addr_b, main_ind_addr_c, main_ind_addr_d, main_internal_return_ptr, main_inv, main_is_fake_row, main_is_gas_accounted, main_kernel_in_offset, main_kernel_out_offset, main_l1_to_l2_msg_exists_write_offset, main_l2_gas_remaining, main_l2_out_of_gas, main_mem_addr_a, main_mem_addr_b, main_mem_addr_c, main_mem_addr_d, main_note_hash_exist_write_offset, main_nullifier_exists_write_offset, main_nullifier_non_exists_write_offset, main_op_err, main_opcode_val, main_pc, main_r_in_tag, main_rwa, main_rwb, main_rwc, main_rwd, main_sel_alu, main_sel_bin, main_sel_calldata, main_sel_execution_end, main_sel_execution_row, main_sel_kernel_inputs, main_sel_kernel_out, main_sel_mem_op_a, main_sel_mem_op_b, main_sel_mem_op_c, main_sel_mem_op_d, main_sel_mov_ia_to_ic, main_sel_mov_ib_to_ic, main_sel_op_add, main_sel_op_address, main_sel_op_and, main_sel_op_block_number, main_sel_op_calldata_copy, main_sel_op_cast, main_sel_op_chain_id, main_sel_op_dagasleft, main_sel_op_div, main_sel_op_ecadd, main_sel_op_emit_l2_to_l1_msg, main_sel_op_emit_note_hash, main_sel_op_emit_nullifier, main_sel_op_emit_unencrypted_log, main_sel_op_eq, main_sel_op_external_call, main_sel_op_external_return, main_sel_op_external_revert, main_sel_op_fdiv, main_sel_op_fee_per_da_gas, main_sel_op_fee_per_l2_gas, main_sel_op_function_selector, main_sel_op_get_contract_instance, main_sel_op_internal_call, main_sel_op_internal_return, main_sel_op_is_static_call, main_sel_op_jump, main_sel_op_jumpi, main_sel_op_keccak, main_sel_op_l1_to_l2_msg_exists, main_sel_op_l2gasleft, main_sel_op_lt, main_sel_op_lte, main_sel_op_mov, main_sel_op_msm, main_sel_op_mul, main_sel_op_not, main_sel_op_note_hash_exists, main_sel_op_nullifier_exists, main_sel_op_or, main_sel_op_pedersen, main_sel_op_pedersen_commit, main_sel_op_poseidon2, main_sel_op_radix_le, main_sel_op_sender, main_sel_op_set, main_sel_op_sha256, main_sel_op_shl, main_sel_op_shr, main_sel_op_sload, main_sel_op_sstore, main_sel_op_static_call, main_sel_op_storage_address, main_sel_op_sub, main_sel_op_timestamp, main_sel_op_transaction_fee, main_sel_op_version, main_sel_op_xor, main_sel_q_kernel_lookup, main_sel_q_kernel_output_lookup, main_sel_resolve_ind_addr_a, main_sel_resolve_ind_addr_b, main_sel_resolve_ind_addr_c, main_sel_resolve_ind_addr_d, main_sel_returndata, main_sel_rng_16, main_sel_rng_8, main_sel_slice_gadget, main_side_effect_counter, main_sload_write_offset, main_space_id, main_sstore_write_offset, main_tag_err, main_w_in_tag, mem_addr, mem_clk, mem_diff, mem_glob_addr, mem_last, mem_lastAccess, mem_one_min_inv, mem_r_in_tag, mem_rw, mem_sel_mem, mem_sel_mov_ia_to_ic, mem_sel_mov_ib_to_ic, mem_sel_op_a, mem_sel_op_b, mem_sel_op_c, mem_sel_op_d, mem_sel_op_poseidon_read_a, mem_sel_op_poseidon_read_b, mem_sel_op_poseidon_read_c, mem_sel_op_poseidon_read_d, mem_sel_op_poseidon_write_a, mem_sel_op_poseidon_write_b, mem_sel_op_poseidon_write_c, mem_sel_op_poseidon_write_d, mem_sel_op_slice, mem_sel_resolve_ind_addr_a, mem_sel_resolve_ind_addr_b, mem_sel_resolve_ind_addr_c, mem_sel_resolve_ind_addr_d, mem_sel_rng_chk, mem_skip_check_tag, mem_space_id, mem_tag, mem_tag_err, mem_tsp, mem_val, mem_w_in_tag, pedersen_clk, pedersen_input, pedersen_output, pedersen_sel_pedersen, poseidon2_B_10_0, poseidon2_B_10_1, poseidon2_B_10_2, poseidon2_B_10_3, poseidon2_B_11_0, poseidon2_B_11_1, poseidon2_B_11_2, poseidon2_B_11_3, poseidon2_B_12_0, poseidon2_B_12_1, poseidon2_B_12_2, poseidon2_B_12_3, poseidon2_B_13_0, poseidon2_B_13_1, poseidon2_B_13_2, poseidon2_B_13_3, poseidon2_B_14_0, poseidon2_B_14_1, poseidon2_B_14_2, poseidon2_B_14_3, poseidon2_B_15_0, poseidon2_B_15_1, poseidon2_B_15_2, poseidon2_B_15_3, poseidon2_B_16_0, poseidon2_B_16_1, poseidon2_B_16_2, poseidon2_B_16_3, poseidon2_B_17_0, poseidon2_B_17_1, poseidon2_B_17_2, poseidon2_B_17_3, poseidon2_B_18_0, poseidon2_B_18_1, poseidon2_B_18_2, poseidon2_B_18_3, poseidon2_B_19_0, poseidon2_B_19_1, poseidon2_B_19_2, poseidon2_B_19_3, poseidon2_B_20_0, poseidon2_B_20_1, poseidon2_B_20_2, poseidon2_B_20_3, poseidon2_B_21_0, poseidon2_B_21_1, poseidon2_B_21_2, poseidon2_B_21_3, poseidon2_B_22_0, poseidon2_B_22_1, poseidon2_B_22_2, poseidon2_B_22_3, poseidon2_B_23_0, poseidon2_B_23_1, poseidon2_B_23_2, poseidon2_B_23_3, poseidon2_B_24_0, poseidon2_B_24_1, poseidon2_B_24_2, poseidon2_B_24_3, poseidon2_B_25_0, poseidon2_B_25_1, poseidon2_B_25_2, poseidon2_B_25_3, poseidon2_B_26_0, poseidon2_B_26_1, poseidon2_B_26_2, poseidon2_B_26_3, poseidon2_B_27_0, poseidon2_B_27_1, poseidon2_B_27_2, poseidon2_B_27_3, poseidon2_B_28_0, poseidon2_B_28_1, poseidon2_B_28_2, poseidon2_B_28_3, poseidon2_B_29_0, poseidon2_B_29_1, poseidon2_B_29_2, poseidon2_B_29_3, poseidon2_B_30_0, poseidon2_B_30_1, poseidon2_B_30_2, poseidon2_B_30_3, poseidon2_B_31_0, poseidon2_B_31_1, poseidon2_B_31_2, poseidon2_B_31_3, poseidon2_B_32_0, poseidon2_B_32_1, poseidon2_B_32_2, poseidon2_B_32_3, poseidon2_B_33_0, poseidon2_B_33_1, poseidon2_B_33_2, poseidon2_B_33_3, poseidon2_B_34_0, poseidon2_B_34_1, poseidon2_B_34_2, poseidon2_B_34_3, poseidon2_B_35_0, poseidon2_B_35_1, poseidon2_B_35_2, poseidon2_B_35_3, poseidon2_B_36_0, poseidon2_B_36_1, poseidon2_B_36_2, poseidon2_B_36_3, poseidon2_B_37_0, poseidon2_B_37_1, poseidon2_B_37_2, poseidon2_B_37_3, poseidon2_B_38_0, poseidon2_B_38_1, poseidon2_B_38_2, poseidon2_B_38_3, poseidon2_B_39_0, poseidon2_B_39_1, poseidon2_B_39_2, poseidon2_B_39_3, poseidon2_B_40_0, poseidon2_B_40_1, poseidon2_B_40_2, poseidon2_B_40_3, poseidon2_B_41_0, poseidon2_B_41_1, poseidon2_B_41_2, poseidon2_B_41_3, poseidon2_B_42_0, poseidon2_B_42_1, poseidon2_B_42_2, poseidon2_B_42_3, poseidon2_B_43_0, poseidon2_B_43_1, poseidon2_B_43_2, poseidon2_B_43_3, poseidon2_B_44_0, poseidon2_B_44_1, poseidon2_B_44_2, poseidon2_B_44_3, poseidon2_B_45_0, poseidon2_B_45_1, poseidon2_B_45_2, poseidon2_B_45_3, poseidon2_B_46_0, poseidon2_B_46_1, poseidon2_B_46_2, poseidon2_B_46_3, poseidon2_B_47_0, poseidon2_B_47_1, poseidon2_B_47_2, poseidon2_B_47_3, poseidon2_B_48_0, poseidon2_B_48_1, poseidon2_B_48_2, poseidon2_B_48_3, poseidon2_B_49_0, poseidon2_B_49_1, poseidon2_B_49_2, poseidon2_B_49_3, poseidon2_B_4_0, poseidon2_B_4_1, poseidon2_B_4_2, poseidon2_B_4_3, poseidon2_B_50_0, poseidon2_B_50_1, poseidon2_B_50_2, poseidon2_B_50_3, poseidon2_B_51_0, poseidon2_B_51_1, poseidon2_B_51_2, poseidon2_B_51_3, poseidon2_B_52_0, poseidon2_B_52_1, poseidon2_B_52_2, poseidon2_B_52_3, poseidon2_B_53_0, poseidon2_B_53_1, poseidon2_B_53_2, poseidon2_B_53_3, poseidon2_B_54_0, poseidon2_B_54_1, poseidon2_B_54_2, poseidon2_B_54_3, poseidon2_B_55_0, poseidon2_B_55_1, poseidon2_B_55_2, poseidon2_B_55_3, poseidon2_B_56_0, poseidon2_B_56_1, poseidon2_B_56_2, poseidon2_B_56_3, poseidon2_B_57_0, poseidon2_B_57_1, poseidon2_B_57_2, poseidon2_B_57_3, poseidon2_B_58_0, poseidon2_B_58_1, poseidon2_B_58_2, poseidon2_B_58_3, poseidon2_B_59_0, poseidon2_B_59_1, poseidon2_B_59_2, poseidon2_B_59_3, poseidon2_B_5_0, poseidon2_B_5_1, poseidon2_B_5_2, poseidon2_B_5_3, poseidon2_B_6_0, poseidon2_B_6_1, poseidon2_B_6_2, poseidon2_B_6_3, poseidon2_B_7_0, poseidon2_B_7_1, poseidon2_B_7_2, poseidon2_B_7_3, poseidon2_B_8_0, poseidon2_B_8_1, poseidon2_B_8_2, poseidon2_B_8_3, poseidon2_B_9_0, poseidon2_B_9_1, poseidon2_B_9_2, poseidon2_B_9_3, poseidon2_EXT_LAYER_4, poseidon2_EXT_LAYER_5, poseidon2_EXT_LAYER_6, poseidon2_EXT_LAYER_7, poseidon2_T_0_4, poseidon2_T_0_5, poseidon2_T_0_6, poseidon2_T_0_7, poseidon2_T_1_4, poseidon2_T_1_5, poseidon2_T_1_6, poseidon2_T_1_7, poseidon2_T_2_4, poseidon2_T_2_5, poseidon2_T_2_6, poseidon2_T_2_7, poseidon2_T_3_4, poseidon2_T_3_5, poseidon2_T_3_6, poseidon2_T_3_7, poseidon2_T_60_4, poseidon2_T_60_5, poseidon2_T_60_6, poseidon2_T_60_7, poseidon2_T_61_4, poseidon2_T_61_5, poseidon2_T_61_6, poseidon2_T_61_7, poseidon2_T_62_4, poseidon2_T_62_5, poseidon2_T_62_6, poseidon2_T_62_7, poseidon2_T_63_4, poseidon2_T_63_5, poseidon2_T_63_6, poseidon2_T_63_7, poseidon2_a_0, poseidon2_a_1, poseidon2_a_2, poseidon2_a_3, poseidon2_b_0, poseidon2_b_1, poseidon2_b_2, poseidon2_b_3, poseidon2_clk, poseidon2_input_addr, poseidon2_mem_addr_read_a, poseidon2_mem_addr_read_b, poseidon2_mem_addr_read_c, poseidon2_mem_addr_read_d, poseidon2_mem_addr_write_a, poseidon2_mem_addr_write_b, poseidon2_mem_addr_write_c, poseidon2_mem_addr_write_d, poseidon2_output_addr, poseidon2_sel_poseidon_perm, range_check_alu_rng_chk, range_check_clk, range_check_cmp_hi_bits_rng_chk, range_check_cmp_lo_bits_rng_chk, range_check_dyn_diff, range_check_dyn_rng_chk_bits, range_check_dyn_rng_chk_pow_2, range_check_gas_da_rng_chk, range_check_gas_l2_rng_chk, range_check_is_lte_u112, range_check_is_lte_u128, range_check_is_lte_u16, range_check_is_lte_u32, range_check_is_lte_u48, range_check_is_lte_u64, range_check_is_lte_u80, range_check_is_lte_u96, range_check_mem_rng_chk, range_check_rng_chk_bits, range_check_sel_lookup_0, range_check_sel_lookup_1, range_check_sel_lookup_2, range_check_sel_lookup_3, range_check_sel_lookup_4, range_check_sel_lookup_5, range_check_sel_lookup_6, range_check_sel_rng_chk, range_check_u16_r0, range_check_u16_r1, range_check_u16_r2, range_check_u16_r3, range_check_u16_r4, range_check_u16_r5, range_check_u16_r6, range_check_u16_r7, range_check_value, sha256_clk, sha256_input, sha256_output, sha256_sel_sha256_compression, sha256_state, slice_addr, slice_clk, slice_cnt, slice_col_offset, slice_one_min_inv, slice_sel_cd_cpy, slice_sel_mem_active, slice_sel_return, slice_sel_start, slice_space_id, slice_val, lookup_rng_chk_pow_2_counts, lookup_rng_chk_diff_counts, lookup_rng_chk_0_counts, lookup_rng_chk_1_counts, lookup_rng_chk_2_counts, lookup_rng_chk_3_counts, lookup_rng_chk_4_counts, lookup_rng_chk_5_counts, lookup_rng_chk_6_counts, lookup_rng_chk_7_counts, lookup_pow_2_0_counts, lookup_pow_2_1_counts, lookup_byte_lengths_counts, lookup_byte_operations_counts, lookup_opcode_gas_counts, kernel_output_lookup_counts, lookup_into_kernel_counts, lookup_cd_value_counts, lookup_ret_value_counts, incl_main_tag_err_counts, incl_mem_tag_err_counts -#define DERIVED_WITNESS_ENTITIES perm_rng_mem_inv, perm_rng_cmp_lo_inv, perm_rng_cmp_hi_inv, perm_rng_alu_inv, perm_cmp_alu_inv, perm_rng_gas_l2_inv, perm_rng_gas_da_inv, perm_l2_start_gas_inv, perm_da_start_gas_inv, perm_l2_end_gas_inv, perm_da_end_gas_inv, perm_pos_mem_read_a_inv, perm_pos_mem_read_b_inv, perm_pos_mem_read_c_inv, perm_pos_mem_read_d_inv, perm_pos_mem_write_a_inv, perm_pos_mem_write_b_inv, perm_pos_mem_write_c_inv, perm_pos_mem_write_d_inv, perm_slice_mem_inv, perm_main_alu_inv, perm_main_bin_inv, perm_main_conv_inv, perm_main_pos2_perm_inv, perm_main_pedersen_inv, perm_main_slice_inv, perm_main_mem_a_inv, perm_main_mem_b_inv, perm_main_mem_c_inv, perm_main_mem_d_inv, perm_main_mem_ind_addr_a_inv, perm_main_mem_ind_addr_b_inv, perm_main_mem_ind_addr_c_inv, perm_main_mem_ind_addr_d_inv, lookup_rng_chk_pow_2_inv, lookup_rng_chk_diff_inv, lookup_rng_chk_0_inv, lookup_rng_chk_1_inv, lookup_rng_chk_2_inv, lookup_rng_chk_3_inv, lookup_rng_chk_4_inv, lookup_rng_chk_5_inv, lookup_rng_chk_6_inv, lookup_rng_chk_7_inv, lookup_pow_2_0_inv, lookup_pow_2_1_inv, lookup_byte_lengths_inv, lookup_byte_operations_inv, lookup_opcode_gas_inv, kernel_output_lookup_inv, lookup_into_kernel_inv, lookup_cd_value_inv, lookup_ret_value_inv, incl_main_tag_err_inv, incl_mem_tag_err_inv -#define SHIFTED_ENTITIES binary_acc_ia_shift, binary_acc_ib_shift, binary_acc_ic_shift, binary_mem_tag_ctr_shift, binary_op_id_shift, cmp_a_hi_shift, cmp_a_lo_shift, cmp_b_hi_shift, cmp_b_lo_shift, cmp_cmp_rng_ctr_shift, cmp_op_gt_shift, cmp_p_sub_a_hi_shift, cmp_p_sub_a_lo_shift, cmp_p_sub_b_hi_shift, cmp_p_sub_b_lo_shift, cmp_sel_rng_chk_shift, main_da_gas_remaining_shift, main_emit_l2_to_l1_msg_write_offset_shift, main_emit_note_hash_write_offset_shift, main_emit_nullifier_write_offset_shift, main_emit_unencrypted_log_write_offset_shift, main_internal_return_ptr_shift, main_l1_to_l2_msg_exists_write_offset_shift, main_l2_gas_remaining_shift, main_note_hash_exist_write_offset_shift, main_nullifier_exists_write_offset_shift, main_nullifier_non_exists_write_offset_shift, main_pc_shift, main_sel_execution_end_shift, main_sel_execution_row_shift, main_sload_write_offset_shift, main_sstore_write_offset_shift, mem_glob_addr_shift, mem_rw_shift, mem_sel_mem_shift, mem_tag_shift, mem_tsp_shift, mem_val_shift, slice_addr_shift, slice_clk_shift, slice_cnt_shift, slice_col_offset_shift, slice_sel_cd_cpy_shift, slice_sel_mem_active_shift, slice_sel_return_shift, slice_sel_start_shift, slice_space_id_shift -#define TO_BE_SHIFTED(e) e.binary_acc_ia, e.binary_acc_ib, e.binary_acc_ic, e.binary_mem_tag_ctr, e.binary_op_id, e.cmp_a_hi, e.cmp_a_lo, e.cmp_b_hi, e.cmp_b_lo, e.cmp_cmp_rng_ctr, e.cmp_op_gt, e.cmp_p_sub_a_hi, e.cmp_p_sub_a_lo, e.cmp_p_sub_b_hi, e.cmp_p_sub_b_lo, e.cmp_sel_rng_chk, e.main_da_gas_remaining, e.main_emit_l2_to_l1_msg_write_offset, e.main_emit_note_hash_write_offset, e.main_emit_nullifier_write_offset, e.main_emit_unencrypted_log_write_offset, e.main_internal_return_ptr, e.main_l1_to_l2_msg_exists_write_offset, e.main_l2_gas_remaining, e.main_note_hash_exist_write_offset, e.main_nullifier_exists_write_offset, e.main_nullifier_non_exists_write_offset, e.main_pc, e.main_sel_execution_end, e.main_sel_execution_row, e.main_sload_write_offset, e.main_sstore_write_offset, e.mem_glob_addr, e.mem_rw, e.mem_sel_mem, e.mem_tag, e.mem_tsp, e.mem_val, e.slice_addr, e.slice_clk, e.slice_cnt, e.slice_col_offset, e.slice_sel_cd_cpy, e.slice_sel_mem_active, e.slice_sel_return, e.slice_sel_start, e.slice_space_id +#define WIRE_ENTITIES main_kernel_inputs, main_kernel_value_out, main_kernel_side_effect_out, main_kernel_metadata_out, main_calldata, main_returndata, alu_a_hi, alu_a_lo, alu_b_hi, alu_b_lo, alu_b_pow, alu_c_hi, alu_c_lo, alu_cf, alu_clk, alu_cmp_gadget_gt, alu_cmp_gadget_input_a, alu_cmp_gadget_input_b, alu_cmp_gadget_result, alu_cmp_gadget_sel, alu_ff_tag, alu_ia, alu_ib, alu_ic, alu_in_tag, alu_max_bits_sub_b_bits, alu_max_bits_sub_b_pow, alu_op_add, alu_op_cast, alu_op_div, alu_op_eq, alu_op_lt, alu_op_lte, alu_op_mul, alu_op_not, alu_op_shl, alu_op_shr, alu_op_sub, alu_partial_prod_hi, alu_partial_prod_lo, alu_range_check_input_value, alu_range_check_num_bits, alu_range_check_sel, alu_remainder, alu_sel_alu, alu_sel_cmp, alu_sel_shift_which, alu_u128_tag, alu_u16_tag, alu_u1_tag, alu_u32_tag, alu_u64_tag, alu_u8_tag, alu_zero_shift, binary_acc_ia, binary_acc_ib, binary_acc_ic, binary_clk, binary_ia_bytes, binary_ib_bytes, binary_ic_bytes, binary_in_tag, binary_mem_tag_ctr, binary_mem_tag_ctr_inv, binary_op_id, binary_sel_bin, binary_start, cmp_a_hi, cmp_a_lo, cmp_b_hi, cmp_b_lo, cmp_borrow, cmp_clk, cmp_cmp_rng_ctr, cmp_input_a, cmp_input_b, cmp_op_eq, cmp_op_eq_diff_inv, cmp_op_gt, cmp_p_a_borrow, cmp_p_b_borrow, cmp_p_sub_a_hi, cmp_p_sub_a_lo, cmp_p_sub_b_hi, cmp_p_sub_b_lo, cmp_range_chk_clk, cmp_res_hi, cmp_res_lo, cmp_result, cmp_sel_cmp, cmp_sel_rng_chk, cmp_shift_sel, conversion_clk, conversion_input, conversion_num_limbs, conversion_output_bits, conversion_radix, conversion_sel_to_radix_le, keccakf1600_clk, keccakf1600_input, keccakf1600_output, keccakf1600_sel_keccakf1600, main_abs_da_rem_gas, main_abs_l2_rem_gas, main_alu_in_tag, main_base_da_gas_op_cost, main_base_l2_gas_op_cost, main_bin_op_id, main_call_ptr, main_da_gas_remaining, main_da_out_of_gas, main_dyn_da_gas_op_cost, main_dyn_gas_multiplier, main_dyn_l2_gas_op_cost, main_emit_l2_to_l1_msg_write_offset, main_emit_note_hash_write_offset, main_emit_nullifier_write_offset, main_emit_unencrypted_log_write_offset, main_ia, main_ib, main_ic, main_id, main_id_zero, main_ind_addr_a, main_ind_addr_b, main_ind_addr_c, main_ind_addr_d, main_internal_return_ptr, main_inv, main_is_fake_row, main_is_gas_accounted, main_kernel_in_offset, main_kernel_out_offset, main_l1_to_l2_msg_exists_write_offset, main_l2_gas_remaining, main_l2_out_of_gas, main_mem_addr_a, main_mem_addr_b, main_mem_addr_c, main_mem_addr_d, main_note_hash_exist_write_offset, main_nullifier_exists_write_offset, main_nullifier_non_exists_write_offset, main_op_err, main_opcode_val, main_pc, main_r_in_tag, main_rwa, main_rwb, main_rwc, main_rwd, main_sel_alu, main_sel_bin, main_sel_calldata, main_sel_execution_end, main_sel_execution_row, main_sel_kernel_inputs, main_sel_kernel_out, main_sel_mem_op_a, main_sel_mem_op_b, main_sel_mem_op_c, main_sel_mem_op_d, main_sel_mov_ia_to_ic, main_sel_mov_ib_to_ic, main_sel_op_add, main_sel_op_address, main_sel_op_and, main_sel_op_block_number, main_sel_op_calldata_copy, main_sel_op_cast, main_sel_op_chain_id, main_sel_op_dagasleft, main_sel_op_div, main_sel_op_ecadd, main_sel_op_emit_l2_to_l1_msg, main_sel_op_emit_note_hash, main_sel_op_emit_nullifier, main_sel_op_emit_unencrypted_log, main_sel_op_eq, main_sel_op_external_call, main_sel_op_external_return, main_sel_op_external_revert, main_sel_op_fdiv, main_sel_op_fee_per_da_gas, main_sel_op_fee_per_l2_gas, main_sel_op_function_selector, main_sel_op_get_contract_instance, main_sel_op_internal_call, main_sel_op_internal_return, main_sel_op_is_static_call, main_sel_op_jump, main_sel_op_jumpi, main_sel_op_keccak, main_sel_op_l1_to_l2_msg_exists, main_sel_op_l2gasleft, main_sel_op_lt, main_sel_op_lte, main_sel_op_mov, main_sel_op_msm, main_sel_op_mul, main_sel_op_not, main_sel_op_note_hash_exists, main_sel_op_nullifier_exists, main_sel_op_or, main_sel_op_pedersen, main_sel_op_pedersen_commit, main_sel_op_poseidon2, main_sel_op_radix_le, main_sel_op_sender, main_sel_op_set, main_sel_op_sha256, main_sel_op_shl, main_sel_op_shr, main_sel_op_sload, main_sel_op_sstore, main_sel_op_static_call, main_sel_op_storage_address, main_sel_op_sub, main_sel_op_timestamp, main_sel_op_transaction_fee, main_sel_op_version, main_sel_op_xor, main_sel_q_kernel_lookup, main_sel_q_kernel_output_lookup, main_sel_resolve_ind_addr_a, main_sel_resolve_ind_addr_b, main_sel_resolve_ind_addr_c, main_sel_resolve_ind_addr_d, main_sel_returndata, main_sel_rng_16, main_sel_rng_8, main_sel_slice_gadget, main_side_effect_counter, main_sload_write_offset, main_space_id, main_sstore_write_offset, main_tag_err, main_w_in_tag, mem_addr, mem_clk, mem_diff, mem_glob_addr, mem_last, mem_lastAccess, mem_one_min_inv, mem_r_in_tag, mem_rw, mem_sel_mem, mem_sel_mov_ia_to_ic, mem_sel_mov_ib_to_ic, mem_sel_op_a, mem_sel_op_b, mem_sel_op_c, mem_sel_op_d, mem_sel_op_poseidon_read_a, mem_sel_op_poseidon_read_b, mem_sel_op_poseidon_read_c, mem_sel_op_poseidon_read_d, mem_sel_op_poseidon_write_a, mem_sel_op_poseidon_write_b, mem_sel_op_poseidon_write_c, mem_sel_op_poseidon_write_d, mem_sel_op_slice, mem_sel_resolve_ind_addr_a, mem_sel_resolve_ind_addr_b, mem_sel_resolve_ind_addr_c, mem_sel_resolve_ind_addr_d, mem_sel_rng_chk, mem_skip_check_tag, mem_space_id, mem_tag, mem_tag_err, mem_tsp, mem_val, mem_w_in_tag, pedersen_clk, pedersen_input, pedersen_output, pedersen_sel_pedersen, poseidon2_B_10_0, poseidon2_B_10_1, poseidon2_B_10_2, poseidon2_B_10_3, poseidon2_B_11_0, poseidon2_B_11_1, poseidon2_B_11_2, poseidon2_B_11_3, poseidon2_B_12_0, poseidon2_B_12_1, poseidon2_B_12_2, poseidon2_B_12_3, poseidon2_B_13_0, poseidon2_B_13_1, poseidon2_B_13_2, poseidon2_B_13_3, poseidon2_B_14_0, poseidon2_B_14_1, poseidon2_B_14_2, poseidon2_B_14_3, poseidon2_B_15_0, poseidon2_B_15_1, poseidon2_B_15_2, poseidon2_B_15_3, poseidon2_B_16_0, poseidon2_B_16_1, poseidon2_B_16_2, poseidon2_B_16_3, poseidon2_B_17_0, poseidon2_B_17_1, poseidon2_B_17_2, poseidon2_B_17_3, poseidon2_B_18_0, poseidon2_B_18_1, poseidon2_B_18_2, poseidon2_B_18_3, poseidon2_B_19_0, poseidon2_B_19_1, poseidon2_B_19_2, poseidon2_B_19_3, poseidon2_B_20_0, poseidon2_B_20_1, poseidon2_B_20_2, poseidon2_B_20_3, poseidon2_B_21_0, poseidon2_B_21_1, poseidon2_B_21_2, poseidon2_B_21_3, poseidon2_B_22_0, poseidon2_B_22_1, poseidon2_B_22_2, poseidon2_B_22_3, poseidon2_B_23_0, poseidon2_B_23_1, poseidon2_B_23_2, poseidon2_B_23_3, poseidon2_B_24_0, poseidon2_B_24_1, poseidon2_B_24_2, poseidon2_B_24_3, poseidon2_B_25_0, poseidon2_B_25_1, poseidon2_B_25_2, poseidon2_B_25_3, poseidon2_B_26_0, poseidon2_B_26_1, poseidon2_B_26_2, poseidon2_B_26_3, poseidon2_B_27_0, poseidon2_B_27_1, poseidon2_B_27_2, poseidon2_B_27_3, poseidon2_B_28_0, poseidon2_B_28_1, poseidon2_B_28_2, poseidon2_B_28_3, poseidon2_B_29_0, poseidon2_B_29_1, poseidon2_B_29_2, poseidon2_B_29_3, poseidon2_B_30_0, poseidon2_B_30_1, poseidon2_B_30_2, poseidon2_B_30_3, poseidon2_B_31_0, poseidon2_B_31_1, poseidon2_B_31_2, poseidon2_B_31_3, poseidon2_B_32_0, poseidon2_B_32_1, poseidon2_B_32_2, poseidon2_B_32_3, poseidon2_B_33_0, poseidon2_B_33_1, poseidon2_B_33_2, poseidon2_B_33_3, poseidon2_B_34_0, poseidon2_B_34_1, poseidon2_B_34_2, poseidon2_B_34_3, poseidon2_B_35_0, poseidon2_B_35_1, poseidon2_B_35_2, poseidon2_B_35_3, poseidon2_B_36_0, poseidon2_B_36_1, poseidon2_B_36_2, poseidon2_B_36_3, poseidon2_B_37_0, poseidon2_B_37_1, poseidon2_B_37_2, poseidon2_B_37_3, poseidon2_B_38_0, poseidon2_B_38_1, poseidon2_B_38_2, poseidon2_B_38_3, poseidon2_B_39_0, poseidon2_B_39_1, poseidon2_B_39_2, poseidon2_B_39_3, poseidon2_B_40_0, poseidon2_B_40_1, poseidon2_B_40_2, poseidon2_B_40_3, poseidon2_B_41_0, poseidon2_B_41_1, poseidon2_B_41_2, poseidon2_B_41_3, poseidon2_B_42_0, poseidon2_B_42_1, poseidon2_B_42_2, poseidon2_B_42_3, poseidon2_B_43_0, poseidon2_B_43_1, poseidon2_B_43_2, poseidon2_B_43_3, poseidon2_B_44_0, poseidon2_B_44_1, poseidon2_B_44_2, poseidon2_B_44_3, poseidon2_B_45_0, poseidon2_B_45_1, poseidon2_B_45_2, poseidon2_B_45_3, poseidon2_B_46_0, poseidon2_B_46_1, poseidon2_B_46_2, poseidon2_B_46_3, poseidon2_B_47_0, poseidon2_B_47_1, poseidon2_B_47_2, poseidon2_B_47_3, poseidon2_B_48_0, poseidon2_B_48_1, poseidon2_B_48_2, poseidon2_B_48_3, poseidon2_B_49_0, poseidon2_B_49_1, poseidon2_B_49_2, poseidon2_B_49_3, poseidon2_B_4_0, poseidon2_B_4_1, poseidon2_B_4_2, poseidon2_B_4_3, poseidon2_B_50_0, poseidon2_B_50_1, poseidon2_B_50_2, poseidon2_B_50_3, poseidon2_B_51_0, poseidon2_B_51_1, poseidon2_B_51_2, poseidon2_B_51_3, poseidon2_B_52_0, poseidon2_B_52_1, poseidon2_B_52_2, poseidon2_B_52_3, poseidon2_B_53_0, poseidon2_B_53_1, poseidon2_B_53_2, poseidon2_B_53_3, poseidon2_B_54_0, poseidon2_B_54_1, poseidon2_B_54_2, poseidon2_B_54_3, poseidon2_B_55_0, poseidon2_B_55_1, poseidon2_B_55_2, poseidon2_B_55_3, poseidon2_B_56_0, poseidon2_B_56_1, poseidon2_B_56_2, poseidon2_B_56_3, poseidon2_B_57_0, poseidon2_B_57_1, poseidon2_B_57_2, poseidon2_B_57_3, poseidon2_B_58_0, poseidon2_B_58_1, poseidon2_B_58_2, poseidon2_B_58_3, poseidon2_B_59_0, poseidon2_B_59_1, poseidon2_B_59_2, poseidon2_B_59_3, poseidon2_B_5_0, poseidon2_B_5_1, poseidon2_B_5_2, poseidon2_B_5_3, poseidon2_B_6_0, poseidon2_B_6_1, poseidon2_B_6_2, poseidon2_B_6_3, poseidon2_B_7_0, poseidon2_B_7_1, poseidon2_B_7_2, poseidon2_B_7_3, poseidon2_B_8_0, poseidon2_B_8_1, poseidon2_B_8_2, poseidon2_B_8_3, poseidon2_B_9_0, poseidon2_B_9_1, poseidon2_B_9_2, poseidon2_B_9_3, poseidon2_EXT_LAYER_4, poseidon2_EXT_LAYER_5, poseidon2_EXT_LAYER_6, poseidon2_EXT_LAYER_7, poseidon2_T_0_4, poseidon2_T_0_5, poseidon2_T_0_6, poseidon2_T_0_7, poseidon2_T_1_4, poseidon2_T_1_5, poseidon2_T_1_6, poseidon2_T_1_7, poseidon2_T_2_4, poseidon2_T_2_5, poseidon2_T_2_6, poseidon2_T_2_7, poseidon2_T_3_4, poseidon2_T_3_5, poseidon2_T_3_6, poseidon2_T_3_7, poseidon2_T_60_4, poseidon2_T_60_5, poseidon2_T_60_6, poseidon2_T_60_7, poseidon2_T_61_4, poseidon2_T_61_5, poseidon2_T_61_6, poseidon2_T_61_7, poseidon2_T_62_4, poseidon2_T_62_5, poseidon2_T_62_6, poseidon2_T_62_7, poseidon2_T_63_4, poseidon2_T_63_5, poseidon2_T_63_6, poseidon2_T_63_7, poseidon2_a_0, poseidon2_a_1, poseidon2_a_2, poseidon2_a_3, poseidon2_b_0, poseidon2_b_1, poseidon2_b_2, poseidon2_b_3, poseidon2_clk, poseidon2_full_a_0, poseidon2_full_a_1, poseidon2_full_a_2, poseidon2_full_a_3, poseidon2_full_b_0, poseidon2_full_b_1, poseidon2_full_b_2, poseidon2_full_b_3, poseidon2_full_clk, poseidon2_full_end_poseidon, poseidon2_full_execute_poseidon_perm, poseidon2_full_input_0, poseidon2_full_input_1, poseidon2_full_input_2, poseidon2_full_input_len, poseidon2_full_num_perm_rounds_rem, poseidon2_full_num_perm_rounds_rem_inv, poseidon2_full_output, poseidon2_full_padding, poseidon2_full_sel_poseidon, poseidon2_full_start_poseidon, poseidon2_input_addr, poseidon2_mem_addr_read_a, poseidon2_mem_addr_read_b, poseidon2_mem_addr_read_c, poseidon2_mem_addr_read_d, poseidon2_mem_addr_write_a, poseidon2_mem_addr_write_b, poseidon2_mem_addr_write_c, poseidon2_mem_addr_write_d, poseidon2_output_addr, poseidon2_sel_poseidon_perm, poseidon2_sel_poseidon_perm_immediate, poseidon2_sel_poseidon_perm_mem_op, range_check_alu_rng_chk, range_check_clk, range_check_cmp_hi_bits_rng_chk, range_check_cmp_lo_bits_rng_chk, range_check_dyn_diff, range_check_dyn_rng_chk_bits, range_check_dyn_rng_chk_pow_2, range_check_gas_da_rng_chk, range_check_gas_l2_rng_chk, range_check_is_lte_u112, range_check_is_lte_u128, range_check_is_lte_u16, range_check_is_lte_u32, range_check_is_lte_u48, range_check_is_lte_u64, range_check_is_lte_u80, range_check_is_lte_u96, range_check_mem_rng_chk, range_check_rng_chk_bits, range_check_sel_lookup_0, range_check_sel_lookup_1, range_check_sel_lookup_2, range_check_sel_lookup_3, range_check_sel_lookup_4, range_check_sel_lookup_5, range_check_sel_lookup_6, range_check_sel_rng_chk, range_check_u16_r0, range_check_u16_r1, range_check_u16_r2, range_check_u16_r3, range_check_u16_r4, range_check_u16_r5, range_check_u16_r6, range_check_u16_r7, range_check_value, sha256_clk, sha256_input, sha256_output, sha256_sel_sha256_compression, sha256_state, slice_addr, slice_clk, slice_cnt, slice_col_offset, slice_one_min_inv, slice_sel_cd_cpy, slice_sel_mem_active, slice_sel_return, slice_sel_start, slice_space_id, slice_val, lookup_rng_chk_pow_2_counts, lookup_rng_chk_diff_counts, lookup_rng_chk_0_counts, lookup_rng_chk_1_counts, lookup_rng_chk_2_counts, lookup_rng_chk_3_counts, lookup_rng_chk_4_counts, lookup_rng_chk_5_counts, lookup_rng_chk_6_counts, lookup_rng_chk_7_counts, lookup_pow_2_0_counts, lookup_pow_2_1_counts, lookup_byte_lengths_counts, lookup_byte_operations_counts, lookup_opcode_gas_counts, kernel_output_lookup_counts, lookup_into_kernel_counts, lookup_cd_value_counts, lookup_ret_value_counts, incl_main_tag_err_counts, incl_mem_tag_err_counts +#define DERIVED_WITNESS_ENTITIES perm_rng_mem_inv, perm_rng_cmp_lo_inv, perm_rng_cmp_hi_inv, perm_rng_alu_inv, perm_cmp_alu_inv, perm_rng_gas_l2_inv, perm_rng_gas_da_inv, perm_l2_start_gas_inv, perm_da_start_gas_inv, perm_l2_end_gas_inv, perm_da_end_gas_inv, perm_pos_mem_read_a_inv, perm_pos_mem_read_b_inv, perm_pos_mem_read_c_inv, perm_pos_mem_read_d_inv, perm_pos_mem_write_a_inv, perm_pos_mem_write_b_inv, perm_pos_mem_write_c_inv, perm_pos_mem_write_d_inv, perm_pos2_fixed_pos2_perm_inv, perm_slice_mem_inv, perm_main_alu_inv, perm_main_bin_inv, perm_main_conv_inv, perm_main_pos2_perm_inv, perm_main_pedersen_inv, perm_main_slice_inv, perm_main_mem_a_inv, perm_main_mem_b_inv, perm_main_mem_c_inv, perm_main_mem_d_inv, perm_main_mem_ind_addr_a_inv, perm_main_mem_ind_addr_b_inv, perm_main_mem_ind_addr_c_inv, perm_main_mem_ind_addr_d_inv, lookup_rng_chk_pow_2_inv, lookup_rng_chk_diff_inv, lookup_rng_chk_0_inv, lookup_rng_chk_1_inv, lookup_rng_chk_2_inv, lookup_rng_chk_3_inv, lookup_rng_chk_4_inv, lookup_rng_chk_5_inv, lookup_rng_chk_6_inv, lookup_rng_chk_7_inv, lookup_pow_2_0_inv, lookup_pow_2_1_inv, lookup_byte_lengths_inv, lookup_byte_operations_inv, lookup_opcode_gas_inv, kernel_output_lookup_inv, lookup_into_kernel_inv, lookup_cd_value_inv, lookup_ret_value_inv, incl_main_tag_err_inv, incl_mem_tag_err_inv +#define SHIFTED_ENTITIES binary_acc_ia_shift, binary_acc_ib_shift, binary_acc_ic_shift, binary_mem_tag_ctr_shift, binary_op_id_shift, cmp_a_hi_shift, cmp_a_lo_shift, cmp_b_hi_shift, cmp_b_lo_shift, cmp_cmp_rng_ctr_shift, cmp_op_gt_shift, cmp_p_sub_a_hi_shift, cmp_p_sub_a_lo_shift, cmp_p_sub_b_hi_shift, cmp_p_sub_b_lo_shift, cmp_sel_rng_chk_shift, main_da_gas_remaining_shift, main_emit_l2_to_l1_msg_write_offset_shift, main_emit_note_hash_write_offset_shift, main_emit_nullifier_write_offset_shift, main_emit_unencrypted_log_write_offset_shift, main_internal_return_ptr_shift, main_l1_to_l2_msg_exists_write_offset_shift, main_l2_gas_remaining_shift, main_note_hash_exist_write_offset_shift, main_nullifier_exists_write_offset_shift, main_nullifier_non_exists_write_offset_shift, main_pc_shift, main_sel_execution_end_shift, main_sel_execution_row_shift, main_sload_write_offset_shift, main_sstore_write_offset_shift, mem_glob_addr_shift, mem_rw_shift, mem_sel_mem_shift, mem_tag_shift, mem_tsp_shift, mem_val_shift, poseidon2_full_a_0_shift, poseidon2_full_a_1_shift, poseidon2_full_a_2_shift, poseidon2_full_a_3_shift, poseidon2_full_execute_poseidon_perm_shift, poseidon2_full_input_0_shift, poseidon2_full_input_1_shift, poseidon2_full_input_2_shift, poseidon2_full_num_perm_rounds_rem_shift, poseidon2_full_sel_poseidon_shift, poseidon2_full_start_poseidon_shift, slice_addr_shift, slice_clk_shift, slice_cnt_shift, slice_col_offset_shift, slice_sel_cd_cpy_shift, slice_sel_mem_active_shift, slice_sel_return_shift, slice_sel_start_shift, slice_space_id_shift +#define TO_BE_SHIFTED(e) e.binary_acc_ia, e.binary_acc_ib, e.binary_acc_ic, e.binary_mem_tag_ctr, e.binary_op_id, e.cmp_a_hi, e.cmp_a_lo, e.cmp_b_hi, e.cmp_b_lo, e.cmp_cmp_rng_ctr, e.cmp_op_gt, e.cmp_p_sub_a_hi, e.cmp_p_sub_a_lo, e.cmp_p_sub_b_hi, e.cmp_p_sub_b_lo, e.cmp_sel_rng_chk, e.main_da_gas_remaining, e.main_emit_l2_to_l1_msg_write_offset, e.main_emit_note_hash_write_offset, e.main_emit_nullifier_write_offset, e.main_emit_unencrypted_log_write_offset, e.main_internal_return_ptr, e.main_l1_to_l2_msg_exists_write_offset, e.main_l2_gas_remaining, e.main_note_hash_exist_write_offset, e.main_nullifier_exists_write_offset, e.main_nullifier_non_exists_write_offset, e.main_pc, e.main_sel_execution_end, e.main_sel_execution_row, e.main_sload_write_offset, e.main_sstore_write_offset, e.mem_glob_addr, e.mem_rw, e.mem_sel_mem, e.mem_tag, e.mem_tsp, e.mem_val, e.poseidon2_full_a_0, e.poseidon2_full_a_1, e.poseidon2_full_a_2, e.poseidon2_full_a_3, e.poseidon2_full_execute_poseidon_perm, e.poseidon2_full_input_0, e.poseidon2_full_input_1, e.poseidon2_full_input_2, e.poseidon2_full_num_perm_rounds_rem, e.poseidon2_full_sel_poseidon, e.poseidon2_full_start_poseidon, e.slice_addr, e.slice_clk, e.slice_cnt, e.slice_col_offset, e.slice_sel_cd_cpy, e.slice_sel_mem_active, e.slice_sel_return, e.slice_sel_start, e.slice_space_id #define ALL_ENTITIES PRECOMPUTED_ENTITIES, WIRE_ENTITIES, DERIVED_WITNESS_ENTITIES, SHIFTED_ENTITIES // clang-format on @@ -123,12 +125,12 @@ class AvmFlavor { static constexpr bool HasZK = false; static constexpr size_t NUM_PRECOMPUTED_ENTITIES = 21; - static constexpr size_t NUM_WITNESS_ENTITIES = 687; - static constexpr size_t NUM_SHIFTED_ENTITIES = 47; + static constexpr size_t NUM_WITNESS_ENTITIES = 711; + static constexpr size_t NUM_SHIFTED_ENTITIES = 58; static constexpr size_t NUM_WIRES = NUM_WITNESS_ENTITIES + NUM_PRECOMPUTED_ENTITIES; // We have two copies of the witness entities, so we subtract the number of fixed ones (they have no shift), one for // the unshifted and one for the shifted - static constexpr size_t NUM_ALL_ENTITIES = 755; + static constexpr size_t NUM_ALL_ENTITIES = 790; // The total number of witnesses including shifts and derived entities. static constexpr size_t NUM_ALL_WITNESS_ENTITIES = NUM_WITNESS_ENTITIES + NUM_SHIFTED_ENTITIES; @@ -148,6 +150,7 @@ class AvmFlavor { Avm_vm::mem_slice, Avm_vm::pedersen, Avm_vm::poseidon2, + Avm_vm::poseidon2_full, Avm_vm::range_check, Avm_vm::sha256>; @@ -197,6 +200,7 @@ class AvmFlavor { perm_main_pedersen_relation, perm_main_pos2_perm_relation, perm_main_slice_relation, + perm_pos2_fixed_pos2_perm_relation, perm_pos_mem_read_a_relation, perm_pos_mem_read_b_relation, perm_pos_mem_read_c_relation, diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/generated/full_row.cpp b/barretenberg/cpp/src/barretenberg/vm/avm/generated/full_row.cpp index 1ad7557bb26..36ab8fd91de 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/generated/full_row.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/generated/full_row.cpp @@ -588,6 +588,27 @@ template std::vector AvmFullRow::names() "poseidon2_b_2", "poseidon2_b_3", "poseidon2_clk", + "poseidon2_full_a_0", + "poseidon2_full_a_1", + "poseidon2_full_a_2", + "poseidon2_full_a_3", + "poseidon2_full_b_0", + "poseidon2_full_b_1", + "poseidon2_full_b_2", + "poseidon2_full_b_3", + "poseidon2_full_clk", + "poseidon2_full_end_poseidon", + "poseidon2_full_execute_poseidon_perm", + "poseidon2_full_input_0", + "poseidon2_full_input_1", + "poseidon2_full_input_2", + "poseidon2_full_input_len", + "poseidon2_full_num_perm_rounds_rem", + "poseidon2_full_num_perm_rounds_rem_inv", + "poseidon2_full_output", + "poseidon2_full_padding", + "poseidon2_full_sel_poseidon", + "poseidon2_full_start_poseidon", "poseidon2_input_addr", "poseidon2_mem_addr_read_a", "poseidon2_mem_addr_read_b", @@ -599,6 +620,8 @@ template std::vector AvmFullRow::names() "poseidon2_mem_addr_write_d", "poseidon2_output_addr", "poseidon2_sel_poseidon_perm", + "poseidon2_sel_poseidon_perm_immediate", + "poseidon2_sel_poseidon_perm_mem_op", "range_check_alu_rng_chk", "range_check_clk", "range_check_cmp_hi_bits_rng_chk", @@ -670,6 +693,7 @@ template std::vector AvmFullRow::names() "perm_pos_mem_write_b_inv", "perm_pos_mem_write_c_inv", "perm_pos_mem_write_d_inv", + "perm_pos2_fixed_pos2_perm_inv", "perm_slice_mem_inv", "perm_main_alu_inv", "perm_main_bin_inv", @@ -1301,6 +1325,27 @@ template RefVector AvmFullRow::as_vector() const poseidon2_b_2, poseidon2_b_3, poseidon2_clk, + poseidon2_full_a_0, + poseidon2_full_a_1, + poseidon2_full_a_2, + poseidon2_full_a_3, + poseidon2_full_b_0, + poseidon2_full_b_1, + poseidon2_full_b_2, + poseidon2_full_b_3, + poseidon2_full_clk, + poseidon2_full_end_poseidon, + poseidon2_full_execute_poseidon_perm, + poseidon2_full_input_0, + poseidon2_full_input_1, + poseidon2_full_input_2, + poseidon2_full_input_len, + poseidon2_full_num_perm_rounds_rem, + poseidon2_full_num_perm_rounds_rem_inv, + poseidon2_full_output, + poseidon2_full_padding, + poseidon2_full_sel_poseidon, + poseidon2_full_start_poseidon, poseidon2_input_addr, poseidon2_mem_addr_read_a, poseidon2_mem_addr_read_b, @@ -1312,6 +1357,8 @@ template RefVector AvmFullRow::as_vector() const poseidon2_mem_addr_write_d, poseidon2_output_addr, poseidon2_sel_poseidon_perm, + poseidon2_sel_poseidon_perm_immediate, + poseidon2_sel_poseidon_perm_mem_op, range_check_alu_rng_chk, range_check_clk, range_check_cmp_hi_bits_rng_chk, @@ -1383,6 +1430,7 @@ template RefVector AvmFullRow::as_vector() const perm_pos_mem_write_b_inv, perm_pos_mem_write_c_inv, perm_pos_mem_write_d_inv, + perm_pos2_fixed_pos2_perm_inv, perm_slice_mem_inv, perm_main_alu_inv, perm_main_bin_inv, diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/generated/full_row.hpp b/barretenberg/cpp/src/barretenberg/vm/avm/generated/full_row.hpp index 19bad253079..1efeb5d039b 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/generated/full_row.hpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/generated/full_row.hpp @@ -579,6 +579,27 @@ template struct AvmFullRow { FF poseidon2_b_2{}; FF poseidon2_b_3{}; FF poseidon2_clk{}; + FF poseidon2_full_a_0{}; + FF poseidon2_full_a_1{}; + FF poseidon2_full_a_2{}; + FF poseidon2_full_a_3{}; + FF poseidon2_full_b_0{}; + FF poseidon2_full_b_1{}; + FF poseidon2_full_b_2{}; + FF poseidon2_full_b_3{}; + FF poseidon2_full_clk{}; + FF poseidon2_full_end_poseidon{}; + FF poseidon2_full_execute_poseidon_perm{}; + FF poseidon2_full_input_0{}; + FF poseidon2_full_input_1{}; + FF poseidon2_full_input_2{}; + FF poseidon2_full_input_len{}; + FF poseidon2_full_num_perm_rounds_rem{}; + FF poseidon2_full_num_perm_rounds_rem_inv{}; + FF poseidon2_full_output{}; + FF poseidon2_full_padding{}; + FF poseidon2_full_sel_poseidon{}; + FF poseidon2_full_start_poseidon{}; FF poseidon2_input_addr{}; FF poseidon2_mem_addr_read_a{}; FF poseidon2_mem_addr_read_b{}; @@ -590,6 +611,8 @@ template struct AvmFullRow { FF poseidon2_mem_addr_write_d{}; FF poseidon2_output_addr{}; FF poseidon2_sel_poseidon_perm{}; + FF poseidon2_sel_poseidon_perm_immediate{}; + FF poseidon2_sel_poseidon_perm_mem_op{}; FF range_check_alu_rng_chk{}; FF range_check_clk{}; FF range_check_cmp_hi_bits_rng_chk{}; @@ -661,6 +684,7 @@ template struct AvmFullRow { FF perm_pos_mem_write_b_inv{}; FF perm_pos_mem_write_c_inv{}; FF perm_pos_mem_write_d_inv{}; + FF perm_pos2_fixed_pos2_perm_inv{}; FF perm_slice_mem_inv{}; FF perm_main_alu_inv{}; FF perm_main_bin_inv{}; @@ -722,7 +746,7 @@ template struct AvmFullRow { RefVector as_vector() const; static std::vector names(); - static constexpr size_t SIZE = 708; + static constexpr size_t SIZE = 732; }; template std::ostream& operator<<(std::ostream& os, AvmFullRow const& row); diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/generated/relations/perm_pos2_fixed_pos2_perm.hpp b/barretenberg/cpp/src/barretenberg/vm/avm/generated/relations/perm_pos2_fixed_pos2_perm.hpp new file mode 100644 index 00000000000..9eba290a6c8 --- /dev/null +++ b/barretenberg/cpp/src/barretenberg/vm/avm/generated/relations/perm_pos2_fixed_pos2_perm.hpp @@ -0,0 +1,83 @@ +// AUTOGENERATED FILE +#pragma once + +#include "barretenberg/relations/generic_permutation/generic_permutation_relation.hpp" + +#include +#include + +namespace bb { + +class perm_pos2_fixed_pos2_perm_permutation_settings { + public: + // This constant defines how many columns are bundled together to form each set. + constexpr static size_t COLUMNS_PER_SET = 9; + + template static inline auto inverse_polynomial_is_computed_at_row(const AllEntities& in) + { + return (in.poseidon2_full_sel_poseidon == 1 || in.poseidon2_sel_poseidon_perm_immediate == 1); + } + + template static inline auto get_const_entities(const AllEntities& in) + { + return std::forward_as_tuple(in.perm_pos2_fixed_pos2_perm_inv, + in.poseidon2_full_sel_poseidon, + in.poseidon2_full_sel_poseidon, + in.poseidon2_sel_poseidon_perm_immediate, + in.poseidon2_full_clk, + in.poseidon2_full_a_0, + in.poseidon2_full_a_1, + in.poseidon2_full_a_2, + in.poseidon2_full_a_3, + in.poseidon2_full_b_0, + in.poseidon2_full_b_1, + in.poseidon2_full_b_2, + in.poseidon2_full_b_3, + in.poseidon2_clk, + in.poseidon2_a_0, + in.poseidon2_a_1, + in.poseidon2_a_2, + in.poseidon2_a_3, + in.poseidon2_b_0, + in.poseidon2_b_1, + in.poseidon2_b_2, + in.poseidon2_b_3); + } + + template static inline auto get_nonconst_entities(AllEntities& in) + { + return std::forward_as_tuple(in.perm_pos2_fixed_pos2_perm_inv, + in.poseidon2_full_sel_poseidon, + in.poseidon2_full_sel_poseidon, + in.poseidon2_sel_poseidon_perm_immediate, + in.poseidon2_full_clk, + in.poseidon2_full_a_0, + in.poseidon2_full_a_1, + in.poseidon2_full_a_2, + in.poseidon2_full_a_3, + in.poseidon2_full_b_0, + in.poseidon2_full_b_1, + in.poseidon2_full_b_2, + in.poseidon2_full_b_3, + in.poseidon2_clk, + in.poseidon2_a_0, + in.poseidon2_a_1, + in.poseidon2_a_2, + in.poseidon2_a_3, + in.poseidon2_b_0, + in.poseidon2_b_1, + in.poseidon2_b_2, + in.poseidon2_b_3); + } +}; + +template +class perm_pos2_fixed_pos2_perm_relation + : public GenericPermutationRelation { + public: + static constexpr const char* NAME = "PERM_POS2_FIXED_POS2_PERM"; +}; +template +using perm_pos2_fixed_pos2_perm = GenericPermutation; + +} // namespace bb \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/generated/relations/perm_pos_mem_read_a.hpp b/barretenberg/cpp/src/barretenberg/vm/avm/generated/relations/perm_pos_mem_read_a.hpp index 80b8c9797f9..564621e201a 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/generated/relations/perm_pos_mem_read_a.hpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/generated/relations/perm_pos_mem_read_a.hpp @@ -15,14 +15,14 @@ class perm_pos_mem_read_a_permutation_settings { template static inline auto inverse_polynomial_is_computed_at_row(const AllEntities& in) { - return (in.poseidon2_sel_poseidon_perm == 1 || in.mem_sel_op_poseidon_read_a == 1); + return (in.poseidon2_sel_poseidon_perm_mem_op == 1 || in.mem_sel_op_poseidon_read_a == 1); } template static inline auto get_const_entities(const AllEntities& in) { return std::forward_as_tuple(in.perm_pos_mem_read_a_inv, - in.poseidon2_sel_poseidon_perm, - in.poseidon2_sel_poseidon_perm, + in.poseidon2_sel_poseidon_perm_mem_op, + in.poseidon2_sel_poseidon_perm_mem_op, in.mem_sel_op_poseidon_read_a, in.poseidon2_clk, in.main_space_id, @@ -39,8 +39,8 @@ class perm_pos_mem_read_a_permutation_settings { template static inline auto get_nonconst_entities(AllEntities& in) { return std::forward_as_tuple(in.perm_pos_mem_read_a_inv, - in.poseidon2_sel_poseidon_perm, - in.poseidon2_sel_poseidon_perm, + in.poseidon2_sel_poseidon_perm_mem_op, + in.poseidon2_sel_poseidon_perm_mem_op, in.mem_sel_op_poseidon_read_a, in.poseidon2_clk, in.main_space_id, diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/generated/relations/perm_pos_mem_read_b.hpp b/barretenberg/cpp/src/barretenberg/vm/avm/generated/relations/perm_pos_mem_read_b.hpp index 4251a4020a7..ba1c34275e8 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/generated/relations/perm_pos_mem_read_b.hpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/generated/relations/perm_pos_mem_read_b.hpp @@ -15,14 +15,14 @@ class perm_pos_mem_read_b_permutation_settings { template static inline auto inverse_polynomial_is_computed_at_row(const AllEntities& in) { - return (in.poseidon2_sel_poseidon_perm == 1 || in.mem_sel_op_poseidon_read_b == 1); + return (in.poseidon2_sel_poseidon_perm_mem_op == 1 || in.mem_sel_op_poseidon_read_b == 1); } template static inline auto get_const_entities(const AllEntities& in) { return std::forward_as_tuple(in.perm_pos_mem_read_b_inv, - in.poseidon2_sel_poseidon_perm, - in.poseidon2_sel_poseidon_perm, + in.poseidon2_sel_poseidon_perm_mem_op, + in.poseidon2_sel_poseidon_perm_mem_op, in.mem_sel_op_poseidon_read_b, in.poseidon2_clk, in.main_space_id, @@ -39,8 +39,8 @@ class perm_pos_mem_read_b_permutation_settings { template static inline auto get_nonconst_entities(AllEntities& in) { return std::forward_as_tuple(in.perm_pos_mem_read_b_inv, - in.poseidon2_sel_poseidon_perm, - in.poseidon2_sel_poseidon_perm, + in.poseidon2_sel_poseidon_perm_mem_op, + in.poseidon2_sel_poseidon_perm_mem_op, in.mem_sel_op_poseidon_read_b, in.poseidon2_clk, in.main_space_id, diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/generated/relations/perm_pos_mem_read_c.hpp b/barretenberg/cpp/src/barretenberg/vm/avm/generated/relations/perm_pos_mem_read_c.hpp index bebb8e7df94..9c284cb08b5 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/generated/relations/perm_pos_mem_read_c.hpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/generated/relations/perm_pos_mem_read_c.hpp @@ -15,14 +15,14 @@ class perm_pos_mem_read_c_permutation_settings { template static inline auto inverse_polynomial_is_computed_at_row(const AllEntities& in) { - return (in.poseidon2_sel_poseidon_perm == 1 || in.mem_sel_op_poseidon_read_c == 1); + return (in.poseidon2_sel_poseidon_perm_mem_op == 1 || in.mem_sel_op_poseidon_read_c == 1); } template static inline auto get_const_entities(const AllEntities& in) { return std::forward_as_tuple(in.perm_pos_mem_read_c_inv, - in.poseidon2_sel_poseidon_perm, - in.poseidon2_sel_poseidon_perm, + in.poseidon2_sel_poseidon_perm_mem_op, + in.poseidon2_sel_poseidon_perm_mem_op, in.mem_sel_op_poseidon_read_c, in.poseidon2_clk, in.main_space_id, @@ -39,8 +39,8 @@ class perm_pos_mem_read_c_permutation_settings { template static inline auto get_nonconst_entities(AllEntities& in) { return std::forward_as_tuple(in.perm_pos_mem_read_c_inv, - in.poseidon2_sel_poseidon_perm, - in.poseidon2_sel_poseidon_perm, + in.poseidon2_sel_poseidon_perm_mem_op, + in.poseidon2_sel_poseidon_perm_mem_op, in.mem_sel_op_poseidon_read_c, in.poseidon2_clk, in.main_space_id, diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/generated/relations/perm_pos_mem_read_d.hpp b/barretenberg/cpp/src/barretenberg/vm/avm/generated/relations/perm_pos_mem_read_d.hpp index 7ee60a756df..0a2f7ac4c7e 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/generated/relations/perm_pos_mem_read_d.hpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/generated/relations/perm_pos_mem_read_d.hpp @@ -15,14 +15,14 @@ class perm_pos_mem_read_d_permutation_settings { template static inline auto inverse_polynomial_is_computed_at_row(const AllEntities& in) { - return (in.poseidon2_sel_poseidon_perm == 1 || in.mem_sel_op_poseidon_read_d == 1); + return (in.poseidon2_sel_poseidon_perm_mem_op == 1 || in.mem_sel_op_poseidon_read_d == 1); } template static inline auto get_const_entities(const AllEntities& in) { return std::forward_as_tuple(in.perm_pos_mem_read_d_inv, - in.poseidon2_sel_poseidon_perm, - in.poseidon2_sel_poseidon_perm, + in.poseidon2_sel_poseidon_perm_mem_op, + in.poseidon2_sel_poseidon_perm_mem_op, in.mem_sel_op_poseidon_read_d, in.poseidon2_clk, in.main_space_id, @@ -39,8 +39,8 @@ class perm_pos_mem_read_d_permutation_settings { template static inline auto get_nonconst_entities(AllEntities& in) { return std::forward_as_tuple(in.perm_pos_mem_read_d_inv, - in.poseidon2_sel_poseidon_perm, - in.poseidon2_sel_poseidon_perm, + in.poseidon2_sel_poseidon_perm_mem_op, + in.poseidon2_sel_poseidon_perm_mem_op, in.mem_sel_op_poseidon_read_d, in.poseidon2_clk, in.main_space_id, diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/generated/relations/perm_pos_mem_write_a.hpp b/barretenberg/cpp/src/barretenberg/vm/avm/generated/relations/perm_pos_mem_write_a.hpp index 6d7ffcdc6b0..6593cb644e9 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/generated/relations/perm_pos_mem_write_a.hpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/generated/relations/perm_pos_mem_write_a.hpp @@ -15,14 +15,14 @@ class perm_pos_mem_write_a_permutation_settings { template static inline auto inverse_polynomial_is_computed_at_row(const AllEntities& in) { - return (in.poseidon2_sel_poseidon_perm == 1 || in.mem_sel_op_poseidon_write_a == 1); + return (in.poseidon2_sel_poseidon_perm_mem_op == 1 || in.mem_sel_op_poseidon_write_a == 1); } template static inline auto get_const_entities(const AllEntities& in) { return std::forward_as_tuple(in.perm_pos_mem_write_a_inv, - in.poseidon2_sel_poseidon_perm, - in.poseidon2_sel_poseidon_perm, + in.poseidon2_sel_poseidon_perm_mem_op, + in.poseidon2_sel_poseidon_perm_mem_op, in.mem_sel_op_poseidon_write_a, in.poseidon2_clk, in.main_space_id, @@ -39,8 +39,8 @@ class perm_pos_mem_write_a_permutation_settings { template static inline auto get_nonconst_entities(AllEntities& in) { return std::forward_as_tuple(in.perm_pos_mem_write_a_inv, - in.poseidon2_sel_poseidon_perm, - in.poseidon2_sel_poseidon_perm, + in.poseidon2_sel_poseidon_perm_mem_op, + in.poseidon2_sel_poseidon_perm_mem_op, in.mem_sel_op_poseidon_write_a, in.poseidon2_clk, in.main_space_id, diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/generated/relations/perm_pos_mem_write_b.hpp b/barretenberg/cpp/src/barretenberg/vm/avm/generated/relations/perm_pos_mem_write_b.hpp index c4b43fe35b2..6f7695e1f72 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/generated/relations/perm_pos_mem_write_b.hpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/generated/relations/perm_pos_mem_write_b.hpp @@ -15,14 +15,14 @@ class perm_pos_mem_write_b_permutation_settings { template static inline auto inverse_polynomial_is_computed_at_row(const AllEntities& in) { - return (in.poseidon2_sel_poseidon_perm == 1 || in.mem_sel_op_poseidon_write_b == 1); + return (in.poseidon2_sel_poseidon_perm_mem_op == 1 || in.mem_sel_op_poseidon_write_b == 1); } template static inline auto get_const_entities(const AllEntities& in) { return std::forward_as_tuple(in.perm_pos_mem_write_b_inv, - in.poseidon2_sel_poseidon_perm, - in.poseidon2_sel_poseidon_perm, + in.poseidon2_sel_poseidon_perm_mem_op, + in.poseidon2_sel_poseidon_perm_mem_op, in.mem_sel_op_poseidon_write_b, in.poseidon2_clk, in.main_space_id, @@ -39,8 +39,8 @@ class perm_pos_mem_write_b_permutation_settings { template static inline auto get_nonconst_entities(AllEntities& in) { return std::forward_as_tuple(in.perm_pos_mem_write_b_inv, - in.poseidon2_sel_poseidon_perm, - in.poseidon2_sel_poseidon_perm, + in.poseidon2_sel_poseidon_perm_mem_op, + in.poseidon2_sel_poseidon_perm_mem_op, in.mem_sel_op_poseidon_write_b, in.poseidon2_clk, in.main_space_id, diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/generated/relations/perm_pos_mem_write_c.hpp b/barretenberg/cpp/src/barretenberg/vm/avm/generated/relations/perm_pos_mem_write_c.hpp index 8b7f292ccf6..d5a10e9da67 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/generated/relations/perm_pos_mem_write_c.hpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/generated/relations/perm_pos_mem_write_c.hpp @@ -15,14 +15,14 @@ class perm_pos_mem_write_c_permutation_settings { template static inline auto inverse_polynomial_is_computed_at_row(const AllEntities& in) { - return (in.poseidon2_sel_poseidon_perm == 1 || in.mem_sel_op_poseidon_write_c == 1); + return (in.poseidon2_sel_poseidon_perm_mem_op == 1 || in.mem_sel_op_poseidon_write_c == 1); } template static inline auto get_const_entities(const AllEntities& in) { return std::forward_as_tuple(in.perm_pos_mem_write_c_inv, - in.poseidon2_sel_poseidon_perm, - in.poseidon2_sel_poseidon_perm, + in.poseidon2_sel_poseidon_perm_mem_op, + in.poseidon2_sel_poseidon_perm_mem_op, in.mem_sel_op_poseidon_write_c, in.poseidon2_clk, in.main_space_id, @@ -39,8 +39,8 @@ class perm_pos_mem_write_c_permutation_settings { template static inline auto get_nonconst_entities(AllEntities& in) { return std::forward_as_tuple(in.perm_pos_mem_write_c_inv, - in.poseidon2_sel_poseidon_perm, - in.poseidon2_sel_poseidon_perm, + in.poseidon2_sel_poseidon_perm_mem_op, + in.poseidon2_sel_poseidon_perm_mem_op, in.mem_sel_op_poseidon_write_c, in.poseidon2_clk, in.main_space_id, diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/generated/relations/perm_pos_mem_write_d.hpp b/barretenberg/cpp/src/barretenberg/vm/avm/generated/relations/perm_pos_mem_write_d.hpp index 2b07f2e1e9e..46a1ad9d6ae 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/generated/relations/perm_pos_mem_write_d.hpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/generated/relations/perm_pos_mem_write_d.hpp @@ -15,14 +15,14 @@ class perm_pos_mem_write_d_permutation_settings { template static inline auto inverse_polynomial_is_computed_at_row(const AllEntities& in) { - return (in.poseidon2_sel_poseidon_perm == 1 || in.mem_sel_op_poseidon_write_d == 1); + return (in.poseidon2_sel_poseidon_perm_mem_op == 1 || in.mem_sel_op_poseidon_write_d == 1); } template static inline auto get_const_entities(const AllEntities& in) { return std::forward_as_tuple(in.perm_pos_mem_write_d_inv, - in.poseidon2_sel_poseidon_perm, - in.poseidon2_sel_poseidon_perm, + in.poseidon2_sel_poseidon_perm_mem_op, + in.poseidon2_sel_poseidon_perm_mem_op, in.mem_sel_op_poseidon_write_d, in.poseidon2_clk, in.main_space_id, @@ -39,8 +39,8 @@ class perm_pos_mem_write_d_permutation_settings { template static inline auto get_nonconst_entities(AllEntities& in) { return std::forward_as_tuple(in.perm_pos_mem_write_d_inv, - in.poseidon2_sel_poseidon_perm, - in.poseidon2_sel_poseidon_perm, + in.poseidon2_sel_poseidon_perm_mem_op, + in.poseidon2_sel_poseidon_perm_mem_op, in.mem_sel_op_poseidon_write_d, in.poseidon2_clk, in.main_space_id, diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/generated/relations/poseidon2.hpp b/barretenberg/cpp/src/barretenberg/vm/avm/generated/relations/poseidon2.hpp index 5523bd984c3..4bc10e1a2e4 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/generated/relations/poseidon2.hpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/generated/relations/poseidon2.hpp @@ -10,21 +10,23 @@ template class poseidon2Impl { public: using FF = FF_; - static constexpr std::array SUBRELATION_PARTIAL_LENGTHS = { - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + static constexpr std::array SUBRELATION_PARTIAL_LENGTHS = { + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 3, 3, 3, 3 + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 3, 3, 3, 3 }; template inline static bool skip(const AllEntities& in) { const auto& new_term = in; - return (new_term.poseidon2_sel_poseidon_perm).is_zero(); + return (((new_term.poseidon2_sel_poseidon_perm * new_term.poseidon2_sel_poseidon_perm_mem_op) * + new_term.poseidon2_sel_poseidon_perm_immediate)) + .is_zero(); } template @@ -1152,1904 +1154,1932 @@ template class poseidon2Impl { } { using Accumulator = typename std::tuple_element_t<1, ContainerOverSubrelations>; - auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_mem_addr_read_a - new_term.poseidon2_input_addr)); + auto tmp = + (new_term.poseidon2_sel_poseidon_perm_mem_op * (FF(1) - new_term.poseidon2_sel_poseidon_perm_mem_op)); tmp *= scaling_factor; std::get<1>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<2, ContainerOverSubrelations>; - auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_mem_addr_read_b - (new_term.poseidon2_input_addr + FF(1)))); + auto tmp = (new_term.poseidon2_sel_poseidon_perm_immediate * + (FF(1) - new_term.poseidon2_sel_poseidon_perm_immediate)); tmp *= scaling_factor; std::get<2>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<3, ContainerOverSubrelations>; - auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_mem_addr_read_c - (new_term.poseidon2_input_addr + FF(2)))); + auto tmp = (new_term.poseidon2_sel_poseidon_perm * ((FF(1) - new_term.poseidon2_sel_poseidon_perm_mem_op) + + new_term.poseidon2_sel_poseidon_perm_immediate)); tmp *= scaling_factor; std::get<3>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<4, ContainerOverSubrelations>; - auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_mem_addr_read_d - (new_term.poseidon2_input_addr + FF(3)))); + auto tmp = ((FF(1) - new_term.poseidon2_sel_poseidon_perm) * + (new_term.poseidon2_sel_poseidon_perm_mem_op + new_term.poseidon2_sel_poseidon_perm_immediate)); tmp *= scaling_factor; std::get<4>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<5, ContainerOverSubrelations>; - auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_mem_addr_write_a - new_term.poseidon2_output_addr)); + auto tmp = (new_term.poseidon2_sel_poseidon_perm_mem_op * + (new_term.poseidon2_mem_addr_read_a - new_term.poseidon2_input_addr)); tmp *= scaling_factor; std::get<5>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<6, ContainerOverSubrelations>; - auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_mem_addr_write_b - (new_term.poseidon2_output_addr + FF(1)))); + auto tmp = (new_term.poseidon2_sel_poseidon_perm_mem_op * + (new_term.poseidon2_mem_addr_read_b - (new_term.poseidon2_input_addr + FF(1)))); tmp *= scaling_factor; std::get<6>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<7, ContainerOverSubrelations>; - auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_mem_addr_write_c - (new_term.poseidon2_output_addr + FF(2)))); + auto tmp = (new_term.poseidon2_sel_poseidon_perm_mem_op * + (new_term.poseidon2_mem_addr_read_c - (new_term.poseidon2_input_addr + FF(2)))); tmp *= scaling_factor; std::get<7>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<8, ContainerOverSubrelations>; - auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_mem_addr_write_d - (new_term.poseidon2_output_addr + FF(3)))); + auto tmp = (new_term.poseidon2_sel_poseidon_perm_mem_op * + (new_term.poseidon2_mem_addr_read_d - (new_term.poseidon2_input_addr + FF(3)))); tmp *= scaling_factor; std::get<8>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<9, ContainerOverSubrelations>; - auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_EXT_LAYER_4 - ((FF(4) * poseidon2_EXT_LAYER_1) + poseidon2_EXT_LAYER_3))); + auto tmp = (new_term.poseidon2_sel_poseidon_perm_mem_op * + (new_term.poseidon2_mem_addr_write_a - new_term.poseidon2_output_addr)); tmp *= scaling_factor; std::get<9>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<10, ContainerOverSubrelations>; - auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_EXT_LAYER_5 - ((FF(4) * poseidon2_EXT_LAYER_0) + poseidon2_EXT_LAYER_2))); + auto tmp = (new_term.poseidon2_sel_poseidon_perm_mem_op * + (new_term.poseidon2_mem_addr_write_b - (new_term.poseidon2_output_addr + FF(1)))); tmp *= scaling_factor; std::get<10>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<11, ContainerOverSubrelations>; - auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_EXT_LAYER_6 - (poseidon2_EXT_LAYER_3 + new_term.poseidon2_EXT_LAYER_5))); + auto tmp = (new_term.poseidon2_sel_poseidon_perm_mem_op * + (new_term.poseidon2_mem_addr_write_c - (new_term.poseidon2_output_addr + FF(2)))); tmp *= scaling_factor; std::get<11>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<12, ContainerOverSubrelations>; - auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_EXT_LAYER_7 - (poseidon2_EXT_LAYER_2 + new_term.poseidon2_EXT_LAYER_4))); + auto tmp = (new_term.poseidon2_sel_poseidon_perm_mem_op * + (new_term.poseidon2_mem_addr_write_d - (new_term.poseidon2_output_addr + FF(3)))); tmp *= scaling_factor; std::get<12>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<13, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_T_0_4 - ((FF(4) * poseidon2_T_0_1) + poseidon2_T_0_3))); + (new_term.poseidon2_EXT_LAYER_4 - ((FF(4) * poseidon2_EXT_LAYER_1) + poseidon2_EXT_LAYER_3))); tmp *= scaling_factor; std::get<13>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<14, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_T_0_5 - ((FF(4) * poseidon2_T_0_0) + poseidon2_T_0_2))); + (new_term.poseidon2_EXT_LAYER_5 - ((FF(4) * poseidon2_EXT_LAYER_0) + poseidon2_EXT_LAYER_2))); tmp *= scaling_factor; std::get<14>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<15, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_T_0_6 - (poseidon2_T_0_3 + new_term.poseidon2_T_0_5))); + (new_term.poseidon2_EXT_LAYER_6 - (poseidon2_EXT_LAYER_3 + new_term.poseidon2_EXT_LAYER_5))); tmp *= scaling_factor; std::get<15>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<16, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_T_0_7 - (poseidon2_T_0_2 + new_term.poseidon2_T_0_4))); + (new_term.poseidon2_EXT_LAYER_7 - (poseidon2_EXT_LAYER_2 + new_term.poseidon2_EXT_LAYER_4))); tmp *= scaling_factor; std::get<16>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<17, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_T_1_4 - ((FF(4) * poseidon2_T_1_1) + poseidon2_T_1_3))); + (new_term.poseidon2_T_0_4 - ((FF(4) * poseidon2_T_0_1) + poseidon2_T_0_3))); tmp *= scaling_factor; std::get<17>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<18, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_T_1_5 - ((FF(4) * poseidon2_T_1_0) + poseidon2_T_1_2))); + (new_term.poseidon2_T_0_5 - ((FF(4) * poseidon2_T_0_0) + poseidon2_T_0_2))); tmp *= scaling_factor; std::get<18>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<19, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_T_1_6 - (poseidon2_T_1_3 + new_term.poseidon2_T_1_5))); + (new_term.poseidon2_T_0_6 - (poseidon2_T_0_3 + new_term.poseidon2_T_0_5))); tmp *= scaling_factor; std::get<19>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<20, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_T_1_7 - (poseidon2_T_1_2 + new_term.poseidon2_T_1_4))); + (new_term.poseidon2_T_0_7 - (poseidon2_T_0_2 + new_term.poseidon2_T_0_4))); tmp *= scaling_factor; std::get<20>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<21, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_T_2_4 - ((FF(4) * poseidon2_T_2_1) + poseidon2_T_2_3))); + (new_term.poseidon2_T_1_4 - ((FF(4) * poseidon2_T_1_1) + poseidon2_T_1_3))); tmp *= scaling_factor; std::get<21>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<22, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_T_2_5 - ((FF(4) * poseidon2_T_2_0) + poseidon2_T_2_2))); + (new_term.poseidon2_T_1_5 - ((FF(4) * poseidon2_T_1_0) + poseidon2_T_1_2))); tmp *= scaling_factor; std::get<22>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<23, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_T_2_6 - (poseidon2_T_2_3 + new_term.poseidon2_T_2_5))); + (new_term.poseidon2_T_1_6 - (poseidon2_T_1_3 + new_term.poseidon2_T_1_5))); tmp *= scaling_factor; std::get<23>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<24, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_T_2_7 - (poseidon2_T_2_2 + new_term.poseidon2_T_2_4))); + (new_term.poseidon2_T_1_7 - (poseidon2_T_1_2 + new_term.poseidon2_T_1_4))); tmp *= scaling_factor; std::get<24>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<25, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_T_3_4 - ((FF(4) * poseidon2_T_3_1) + poseidon2_T_3_3))); + (new_term.poseidon2_T_2_4 - ((FF(4) * poseidon2_T_2_1) + poseidon2_T_2_3))); tmp *= scaling_factor; std::get<25>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<26, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_T_3_5 - ((FF(4) * poseidon2_T_3_0) + poseidon2_T_3_2))); + (new_term.poseidon2_T_2_5 - ((FF(4) * poseidon2_T_2_0) + poseidon2_T_2_2))); tmp *= scaling_factor; std::get<26>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<27, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_T_3_6 - (poseidon2_T_3_3 + new_term.poseidon2_T_3_5))); + (new_term.poseidon2_T_2_6 - (poseidon2_T_2_3 + new_term.poseidon2_T_2_5))); tmp *= scaling_factor; std::get<27>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<28, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_T_3_7 - (poseidon2_T_3_2 + new_term.poseidon2_T_3_4))); + (new_term.poseidon2_T_2_7 - (poseidon2_T_2_2 + new_term.poseidon2_T_2_4))); tmp *= scaling_factor; std::get<28>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<29, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_4_0 - ((poseidon2_params_MU_0 * poseidon2_A_4_0) + poseidon2_SUM_4))); + (new_term.poseidon2_T_3_4 - ((FF(4) * poseidon2_T_3_1) + poseidon2_T_3_3))); tmp *= scaling_factor; std::get<29>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<30, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_4_1 - ((poseidon2_params_MU_1 * poseidon2_A_4_1) + poseidon2_SUM_4))); + (new_term.poseidon2_T_3_5 - ((FF(4) * poseidon2_T_3_0) + poseidon2_T_3_2))); tmp *= scaling_factor; std::get<30>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<31, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_4_2 - ((poseidon2_params_MU_2 * poseidon2_A_4_2) + poseidon2_SUM_4))); + (new_term.poseidon2_T_3_6 - (poseidon2_T_3_3 + new_term.poseidon2_T_3_5))); tmp *= scaling_factor; std::get<31>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<32, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_4_3 - ((poseidon2_params_MU_3 * poseidon2_A_4_3) + poseidon2_SUM_4))); + (new_term.poseidon2_T_3_7 - (poseidon2_T_3_2 + new_term.poseidon2_T_3_4))); tmp *= scaling_factor; std::get<32>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<33, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_5_0 - ((poseidon2_params_MU_0 * poseidon2_A_5_0) + poseidon2_SUM_5))); + (new_term.poseidon2_B_4_0 - ((poseidon2_params_MU_0 * poseidon2_A_4_0) + poseidon2_SUM_4))); tmp *= scaling_factor; std::get<33>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<34, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_5_1 - ((poseidon2_params_MU_1 * poseidon2_A_5_1) + poseidon2_SUM_5))); + (new_term.poseidon2_B_4_1 - ((poseidon2_params_MU_1 * poseidon2_A_4_1) + poseidon2_SUM_4))); tmp *= scaling_factor; std::get<34>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<35, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_5_2 - ((poseidon2_params_MU_2 * poseidon2_A_5_2) + poseidon2_SUM_5))); + (new_term.poseidon2_B_4_2 - ((poseidon2_params_MU_2 * poseidon2_A_4_2) + poseidon2_SUM_4))); tmp *= scaling_factor; std::get<35>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<36, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_5_3 - ((poseidon2_params_MU_3 * poseidon2_A_5_3) + poseidon2_SUM_5))); + (new_term.poseidon2_B_4_3 - ((poseidon2_params_MU_3 * poseidon2_A_4_3) + poseidon2_SUM_4))); tmp *= scaling_factor; std::get<36>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<37, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_6_0 - ((poseidon2_params_MU_0 * poseidon2_A_6_0) + poseidon2_SUM_6))); + (new_term.poseidon2_B_5_0 - ((poseidon2_params_MU_0 * poseidon2_A_5_0) + poseidon2_SUM_5))); tmp *= scaling_factor; std::get<37>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<38, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_6_1 - ((poseidon2_params_MU_1 * poseidon2_A_6_1) + poseidon2_SUM_6))); + (new_term.poseidon2_B_5_1 - ((poseidon2_params_MU_1 * poseidon2_A_5_1) + poseidon2_SUM_5))); tmp *= scaling_factor; std::get<38>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<39, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_6_2 - ((poseidon2_params_MU_2 * poseidon2_A_6_2) + poseidon2_SUM_6))); + (new_term.poseidon2_B_5_2 - ((poseidon2_params_MU_2 * poseidon2_A_5_2) + poseidon2_SUM_5))); tmp *= scaling_factor; std::get<39>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<40, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_6_3 - ((poseidon2_params_MU_3 * poseidon2_A_6_3) + poseidon2_SUM_6))); + (new_term.poseidon2_B_5_3 - ((poseidon2_params_MU_3 * poseidon2_A_5_3) + poseidon2_SUM_5))); tmp *= scaling_factor; std::get<40>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<41, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_7_0 - ((poseidon2_params_MU_0 * poseidon2_A_7_0) + poseidon2_SUM_7))); + (new_term.poseidon2_B_6_0 - ((poseidon2_params_MU_0 * poseidon2_A_6_0) + poseidon2_SUM_6))); tmp *= scaling_factor; std::get<41>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<42, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_7_1 - ((poseidon2_params_MU_1 * poseidon2_A_7_1) + poseidon2_SUM_7))); + (new_term.poseidon2_B_6_1 - ((poseidon2_params_MU_1 * poseidon2_A_6_1) + poseidon2_SUM_6))); tmp *= scaling_factor; std::get<42>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<43, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_7_2 - ((poseidon2_params_MU_2 * poseidon2_A_7_2) + poseidon2_SUM_7))); + (new_term.poseidon2_B_6_2 - ((poseidon2_params_MU_2 * poseidon2_A_6_2) + poseidon2_SUM_6))); tmp *= scaling_factor; std::get<43>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<44, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_7_3 - ((poseidon2_params_MU_3 * poseidon2_A_7_3) + poseidon2_SUM_7))); + (new_term.poseidon2_B_6_3 - ((poseidon2_params_MU_3 * poseidon2_A_6_3) + poseidon2_SUM_6))); tmp *= scaling_factor; std::get<44>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<45, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_8_0 - ((poseidon2_params_MU_0 * poseidon2_A_8_0) + poseidon2_SUM_8))); + (new_term.poseidon2_B_7_0 - ((poseidon2_params_MU_0 * poseidon2_A_7_0) + poseidon2_SUM_7))); tmp *= scaling_factor; std::get<45>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<46, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_8_1 - ((poseidon2_params_MU_1 * poseidon2_A_8_1) + poseidon2_SUM_8))); + (new_term.poseidon2_B_7_1 - ((poseidon2_params_MU_1 * poseidon2_A_7_1) + poseidon2_SUM_7))); tmp *= scaling_factor; std::get<46>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<47, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_8_2 - ((poseidon2_params_MU_2 * poseidon2_A_8_2) + poseidon2_SUM_8))); + (new_term.poseidon2_B_7_2 - ((poseidon2_params_MU_2 * poseidon2_A_7_2) + poseidon2_SUM_7))); tmp *= scaling_factor; std::get<47>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<48, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_8_3 - ((poseidon2_params_MU_3 * poseidon2_A_8_3) + poseidon2_SUM_8))); + (new_term.poseidon2_B_7_3 - ((poseidon2_params_MU_3 * poseidon2_A_7_3) + poseidon2_SUM_7))); tmp *= scaling_factor; std::get<48>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<49, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_9_0 - ((poseidon2_params_MU_0 * poseidon2_A_9_0) + poseidon2_SUM_9))); + (new_term.poseidon2_B_8_0 - ((poseidon2_params_MU_0 * poseidon2_A_8_0) + poseidon2_SUM_8))); tmp *= scaling_factor; std::get<49>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<50, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_9_1 - ((poseidon2_params_MU_1 * poseidon2_A_9_1) + poseidon2_SUM_9))); + (new_term.poseidon2_B_8_1 - ((poseidon2_params_MU_1 * poseidon2_A_8_1) + poseidon2_SUM_8))); tmp *= scaling_factor; std::get<50>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<51, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_9_2 - ((poseidon2_params_MU_2 * poseidon2_A_9_2) + poseidon2_SUM_9))); + (new_term.poseidon2_B_8_2 - ((poseidon2_params_MU_2 * poseidon2_A_8_2) + poseidon2_SUM_8))); tmp *= scaling_factor; std::get<51>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<52, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_9_3 - ((poseidon2_params_MU_3 * poseidon2_A_9_3) + poseidon2_SUM_9))); + (new_term.poseidon2_B_8_3 - ((poseidon2_params_MU_3 * poseidon2_A_8_3) + poseidon2_SUM_8))); tmp *= scaling_factor; std::get<52>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<53, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_10_0 - ((poseidon2_params_MU_0 * poseidon2_A_10_0) + poseidon2_SUM_10))); + (new_term.poseidon2_B_9_0 - ((poseidon2_params_MU_0 * poseidon2_A_9_0) + poseidon2_SUM_9))); tmp *= scaling_factor; std::get<53>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<54, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_10_1 - ((poseidon2_params_MU_1 * poseidon2_A_10_1) + poseidon2_SUM_10))); + (new_term.poseidon2_B_9_1 - ((poseidon2_params_MU_1 * poseidon2_A_9_1) + poseidon2_SUM_9))); tmp *= scaling_factor; std::get<54>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<55, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_10_2 - ((poseidon2_params_MU_2 * poseidon2_A_10_2) + poseidon2_SUM_10))); + (new_term.poseidon2_B_9_2 - ((poseidon2_params_MU_2 * poseidon2_A_9_2) + poseidon2_SUM_9))); tmp *= scaling_factor; std::get<55>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<56, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_10_3 - ((poseidon2_params_MU_3 * poseidon2_A_10_3) + poseidon2_SUM_10))); + (new_term.poseidon2_B_9_3 - ((poseidon2_params_MU_3 * poseidon2_A_9_3) + poseidon2_SUM_9))); tmp *= scaling_factor; std::get<56>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<57, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_11_0 - ((poseidon2_params_MU_0 * poseidon2_A_11_0) + poseidon2_SUM_11))); + (new_term.poseidon2_B_10_0 - ((poseidon2_params_MU_0 * poseidon2_A_10_0) + poseidon2_SUM_10))); tmp *= scaling_factor; std::get<57>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<58, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_11_1 - ((poseidon2_params_MU_1 * poseidon2_A_11_1) + poseidon2_SUM_11))); + (new_term.poseidon2_B_10_1 - ((poseidon2_params_MU_1 * poseidon2_A_10_1) + poseidon2_SUM_10))); tmp *= scaling_factor; std::get<58>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<59, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_11_2 - ((poseidon2_params_MU_2 * poseidon2_A_11_2) + poseidon2_SUM_11))); + (new_term.poseidon2_B_10_2 - ((poseidon2_params_MU_2 * poseidon2_A_10_2) + poseidon2_SUM_10))); tmp *= scaling_factor; std::get<59>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<60, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_11_3 - ((poseidon2_params_MU_3 * poseidon2_A_11_3) + poseidon2_SUM_11))); + (new_term.poseidon2_B_10_3 - ((poseidon2_params_MU_3 * poseidon2_A_10_3) + poseidon2_SUM_10))); tmp *= scaling_factor; std::get<60>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<61, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_12_0 - ((poseidon2_params_MU_0 * poseidon2_A_12_0) + poseidon2_SUM_12))); + (new_term.poseidon2_B_11_0 - ((poseidon2_params_MU_0 * poseidon2_A_11_0) + poseidon2_SUM_11))); tmp *= scaling_factor; std::get<61>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<62, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_12_1 - ((poseidon2_params_MU_1 * poseidon2_A_12_1) + poseidon2_SUM_12))); + (new_term.poseidon2_B_11_1 - ((poseidon2_params_MU_1 * poseidon2_A_11_1) + poseidon2_SUM_11))); tmp *= scaling_factor; std::get<62>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<63, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_12_2 - ((poseidon2_params_MU_2 * poseidon2_A_12_2) + poseidon2_SUM_12))); + (new_term.poseidon2_B_11_2 - ((poseidon2_params_MU_2 * poseidon2_A_11_2) + poseidon2_SUM_11))); tmp *= scaling_factor; std::get<63>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<64, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_12_3 - ((poseidon2_params_MU_3 * poseidon2_A_12_3) + poseidon2_SUM_12))); + (new_term.poseidon2_B_11_3 - ((poseidon2_params_MU_3 * poseidon2_A_11_3) + poseidon2_SUM_11))); tmp *= scaling_factor; std::get<64>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<65, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_13_0 - ((poseidon2_params_MU_0 * poseidon2_A_13_0) + poseidon2_SUM_13))); + (new_term.poseidon2_B_12_0 - ((poseidon2_params_MU_0 * poseidon2_A_12_0) + poseidon2_SUM_12))); tmp *= scaling_factor; std::get<65>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<66, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_13_1 - ((poseidon2_params_MU_1 * poseidon2_A_13_1) + poseidon2_SUM_13))); + (new_term.poseidon2_B_12_1 - ((poseidon2_params_MU_1 * poseidon2_A_12_1) + poseidon2_SUM_12))); tmp *= scaling_factor; std::get<66>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<67, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_13_2 - ((poseidon2_params_MU_2 * poseidon2_A_13_2) + poseidon2_SUM_13))); + (new_term.poseidon2_B_12_2 - ((poseidon2_params_MU_2 * poseidon2_A_12_2) + poseidon2_SUM_12))); tmp *= scaling_factor; std::get<67>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<68, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_13_3 - ((poseidon2_params_MU_3 * poseidon2_A_13_3) + poseidon2_SUM_13))); + (new_term.poseidon2_B_12_3 - ((poseidon2_params_MU_3 * poseidon2_A_12_3) + poseidon2_SUM_12))); tmp *= scaling_factor; std::get<68>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<69, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_14_0 - ((poseidon2_params_MU_0 * poseidon2_A_14_0) + poseidon2_SUM_14))); + (new_term.poseidon2_B_13_0 - ((poseidon2_params_MU_0 * poseidon2_A_13_0) + poseidon2_SUM_13))); tmp *= scaling_factor; std::get<69>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<70, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_14_1 - ((poseidon2_params_MU_1 * poseidon2_A_14_1) + poseidon2_SUM_14))); + (new_term.poseidon2_B_13_1 - ((poseidon2_params_MU_1 * poseidon2_A_13_1) + poseidon2_SUM_13))); tmp *= scaling_factor; std::get<70>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<71, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_14_2 - ((poseidon2_params_MU_2 * poseidon2_A_14_2) + poseidon2_SUM_14))); + (new_term.poseidon2_B_13_2 - ((poseidon2_params_MU_2 * poseidon2_A_13_2) + poseidon2_SUM_13))); tmp *= scaling_factor; std::get<71>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<72, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_14_3 - ((poseidon2_params_MU_3 * poseidon2_A_14_3) + poseidon2_SUM_14))); + (new_term.poseidon2_B_13_3 - ((poseidon2_params_MU_3 * poseidon2_A_13_3) + poseidon2_SUM_13))); tmp *= scaling_factor; std::get<72>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<73, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_15_0 - ((poseidon2_params_MU_0 * poseidon2_A_15_0) + poseidon2_SUM_15))); + (new_term.poseidon2_B_14_0 - ((poseidon2_params_MU_0 * poseidon2_A_14_0) + poseidon2_SUM_14))); tmp *= scaling_factor; std::get<73>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<74, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_15_1 - ((poseidon2_params_MU_1 * poseidon2_A_15_1) + poseidon2_SUM_15))); + (new_term.poseidon2_B_14_1 - ((poseidon2_params_MU_1 * poseidon2_A_14_1) + poseidon2_SUM_14))); tmp *= scaling_factor; std::get<74>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<75, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_15_2 - ((poseidon2_params_MU_2 * poseidon2_A_15_2) + poseidon2_SUM_15))); + (new_term.poseidon2_B_14_2 - ((poseidon2_params_MU_2 * poseidon2_A_14_2) + poseidon2_SUM_14))); tmp *= scaling_factor; std::get<75>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<76, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_15_3 - ((poseidon2_params_MU_3 * poseidon2_A_15_3) + poseidon2_SUM_15))); + (new_term.poseidon2_B_14_3 - ((poseidon2_params_MU_3 * poseidon2_A_14_3) + poseidon2_SUM_14))); tmp *= scaling_factor; std::get<76>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<77, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_16_0 - ((poseidon2_params_MU_0 * poseidon2_A_16_0) + poseidon2_SUM_16))); + (new_term.poseidon2_B_15_0 - ((poseidon2_params_MU_0 * poseidon2_A_15_0) + poseidon2_SUM_15))); tmp *= scaling_factor; std::get<77>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<78, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_16_1 - ((poseidon2_params_MU_1 * poseidon2_A_16_1) + poseidon2_SUM_16))); + (new_term.poseidon2_B_15_1 - ((poseidon2_params_MU_1 * poseidon2_A_15_1) + poseidon2_SUM_15))); tmp *= scaling_factor; std::get<78>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<79, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_16_2 - ((poseidon2_params_MU_2 * poseidon2_A_16_2) + poseidon2_SUM_16))); + (new_term.poseidon2_B_15_2 - ((poseidon2_params_MU_2 * poseidon2_A_15_2) + poseidon2_SUM_15))); tmp *= scaling_factor; std::get<79>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<80, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_16_3 - ((poseidon2_params_MU_3 * poseidon2_A_16_3) + poseidon2_SUM_16))); + (new_term.poseidon2_B_15_3 - ((poseidon2_params_MU_3 * poseidon2_A_15_3) + poseidon2_SUM_15))); tmp *= scaling_factor; std::get<80>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<81, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_17_0 - ((poseidon2_params_MU_0 * poseidon2_A_17_0) + poseidon2_SUM_17))); + (new_term.poseidon2_B_16_0 - ((poseidon2_params_MU_0 * poseidon2_A_16_0) + poseidon2_SUM_16))); tmp *= scaling_factor; std::get<81>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<82, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_17_1 - ((poseidon2_params_MU_1 * poseidon2_A_17_1) + poseidon2_SUM_17))); + (new_term.poseidon2_B_16_1 - ((poseidon2_params_MU_1 * poseidon2_A_16_1) + poseidon2_SUM_16))); tmp *= scaling_factor; std::get<82>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<83, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_17_2 - ((poseidon2_params_MU_2 * poseidon2_A_17_2) + poseidon2_SUM_17))); + (new_term.poseidon2_B_16_2 - ((poseidon2_params_MU_2 * poseidon2_A_16_2) + poseidon2_SUM_16))); tmp *= scaling_factor; std::get<83>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<84, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_17_3 - ((poseidon2_params_MU_3 * poseidon2_A_17_3) + poseidon2_SUM_17))); + (new_term.poseidon2_B_16_3 - ((poseidon2_params_MU_3 * poseidon2_A_16_3) + poseidon2_SUM_16))); tmp *= scaling_factor; std::get<84>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<85, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_18_0 - ((poseidon2_params_MU_0 * poseidon2_A_18_0) + poseidon2_SUM_18))); + (new_term.poseidon2_B_17_0 - ((poseidon2_params_MU_0 * poseidon2_A_17_0) + poseidon2_SUM_17))); tmp *= scaling_factor; std::get<85>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<86, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_18_1 - ((poseidon2_params_MU_1 * poseidon2_A_18_1) + poseidon2_SUM_18))); + (new_term.poseidon2_B_17_1 - ((poseidon2_params_MU_1 * poseidon2_A_17_1) + poseidon2_SUM_17))); tmp *= scaling_factor; std::get<86>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<87, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_18_2 - ((poseidon2_params_MU_2 * poseidon2_A_18_2) + poseidon2_SUM_18))); + (new_term.poseidon2_B_17_2 - ((poseidon2_params_MU_2 * poseidon2_A_17_2) + poseidon2_SUM_17))); tmp *= scaling_factor; std::get<87>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<88, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_18_3 - ((poseidon2_params_MU_3 * poseidon2_A_18_3) + poseidon2_SUM_18))); + (new_term.poseidon2_B_17_3 - ((poseidon2_params_MU_3 * poseidon2_A_17_3) + poseidon2_SUM_17))); tmp *= scaling_factor; std::get<88>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<89, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_19_0 - ((poseidon2_params_MU_0 * poseidon2_A_19_0) + poseidon2_SUM_19))); + (new_term.poseidon2_B_18_0 - ((poseidon2_params_MU_0 * poseidon2_A_18_0) + poseidon2_SUM_18))); tmp *= scaling_factor; std::get<89>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<90, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_19_1 - ((poseidon2_params_MU_1 * poseidon2_A_19_1) + poseidon2_SUM_19))); + (new_term.poseidon2_B_18_1 - ((poseidon2_params_MU_1 * poseidon2_A_18_1) + poseidon2_SUM_18))); tmp *= scaling_factor; std::get<90>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<91, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_19_2 - ((poseidon2_params_MU_2 * poseidon2_A_19_2) + poseidon2_SUM_19))); + (new_term.poseidon2_B_18_2 - ((poseidon2_params_MU_2 * poseidon2_A_18_2) + poseidon2_SUM_18))); tmp *= scaling_factor; std::get<91>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<92, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_19_3 - ((poseidon2_params_MU_3 * poseidon2_A_19_3) + poseidon2_SUM_19))); + (new_term.poseidon2_B_18_3 - ((poseidon2_params_MU_3 * poseidon2_A_18_3) + poseidon2_SUM_18))); tmp *= scaling_factor; std::get<92>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<93, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_20_0 - ((poseidon2_params_MU_0 * poseidon2_A_20_0) + poseidon2_SUM_20))); + (new_term.poseidon2_B_19_0 - ((poseidon2_params_MU_0 * poseidon2_A_19_0) + poseidon2_SUM_19))); tmp *= scaling_factor; std::get<93>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<94, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_20_1 - ((poseidon2_params_MU_1 * poseidon2_A_20_1) + poseidon2_SUM_20))); + (new_term.poseidon2_B_19_1 - ((poseidon2_params_MU_1 * poseidon2_A_19_1) + poseidon2_SUM_19))); tmp *= scaling_factor; std::get<94>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<95, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_20_2 - ((poseidon2_params_MU_2 * poseidon2_A_20_2) + poseidon2_SUM_20))); + (new_term.poseidon2_B_19_2 - ((poseidon2_params_MU_2 * poseidon2_A_19_2) + poseidon2_SUM_19))); tmp *= scaling_factor; std::get<95>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<96, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_20_3 - ((poseidon2_params_MU_3 * poseidon2_A_20_3) + poseidon2_SUM_20))); + (new_term.poseidon2_B_19_3 - ((poseidon2_params_MU_3 * poseidon2_A_19_3) + poseidon2_SUM_19))); tmp *= scaling_factor; std::get<96>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<97, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_21_0 - ((poseidon2_params_MU_0 * poseidon2_A_21_0) + poseidon2_SUM_21))); + (new_term.poseidon2_B_20_0 - ((poseidon2_params_MU_0 * poseidon2_A_20_0) + poseidon2_SUM_20))); tmp *= scaling_factor; std::get<97>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<98, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_21_1 - ((poseidon2_params_MU_1 * poseidon2_A_21_1) + poseidon2_SUM_21))); + (new_term.poseidon2_B_20_1 - ((poseidon2_params_MU_1 * poseidon2_A_20_1) + poseidon2_SUM_20))); tmp *= scaling_factor; std::get<98>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<99, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_21_2 - ((poseidon2_params_MU_2 * poseidon2_A_21_2) + poseidon2_SUM_21))); + (new_term.poseidon2_B_20_2 - ((poseidon2_params_MU_2 * poseidon2_A_20_2) + poseidon2_SUM_20))); tmp *= scaling_factor; std::get<99>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<100, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_21_3 - ((poseidon2_params_MU_3 * poseidon2_A_21_3) + poseidon2_SUM_21))); + (new_term.poseidon2_B_20_3 - ((poseidon2_params_MU_3 * poseidon2_A_20_3) + poseidon2_SUM_20))); tmp *= scaling_factor; std::get<100>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<101, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_22_0 - ((poseidon2_params_MU_0 * poseidon2_A_22_0) + poseidon2_SUM_22))); + (new_term.poseidon2_B_21_0 - ((poseidon2_params_MU_0 * poseidon2_A_21_0) + poseidon2_SUM_21))); tmp *= scaling_factor; std::get<101>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<102, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_22_1 - ((poseidon2_params_MU_1 * poseidon2_A_22_1) + poseidon2_SUM_22))); + (new_term.poseidon2_B_21_1 - ((poseidon2_params_MU_1 * poseidon2_A_21_1) + poseidon2_SUM_21))); tmp *= scaling_factor; std::get<102>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<103, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_22_2 - ((poseidon2_params_MU_2 * poseidon2_A_22_2) + poseidon2_SUM_22))); + (new_term.poseidon2_B_21_2 - ((poseidon2_params_MU_2 * poseidon2_A_21_2) + poseidon2_SUM_21))); tmp *= scaling_factor; std::get<103>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<104, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_22_3 - ((poseidon2_params_MU_3 * poseidon2_A_22_3) + poseidon2_SUM_22))); + (new_term.poseidon2_B_21_3 - ((poseidon2_params_MU_3 * poseidon2_A_21_3) + poseidon2_SUM_21))); tmp *= scaling_factor; std::get<104>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<105, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_23_0 - ((poseidon2_params_MU_0 * poseidon2_A_23_0) + poseidon2_SUM_23))); + (new_term.poseidon2_B_22_0 - ((poseidon2_params_MU_0 * poseidon2_A_22_0) + poseidon2_SUM_22))); tmp *= scaling_factor; std::get<105>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<106, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_23_1 - ((poseidon2_params_MU_1 * poseidon2_A_23_1) + poseidon2_SUM_23))); + (new_term.poseidon2_B_22_1 - ((poseidon2_params_MU_1 * poseidon2_A_22_1) + poseidon2_SUM_22))); tmp *= scaling_factor; std::get<106>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<107, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_23_2 - ((poseidon2_params_MU_2 * poseidon2_A_23_2) + poseidon2_SUM_23))); + (new_term.poseidon2_B_22_2 - ((poseidon2_params_MU_2 * poseidon2_A_22_2) + poseidon2_SUM_22))); tmp *= scaling_factor; std::get<107>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<108, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_23_3 - ((poseidon2_params_MU_3 * poseidon2_A_23_3) + poseidon2_SUM_23))); + (new_term.poseidon2_B_22_3 - ((poseidon2_params_MU_3 * poseidon2_A_22_3) + poseidon2_SUM_22))); tmp *= scaling_factor; std::get<108>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<109, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_24_0 - ((poseidon2_params_MU_0 * poseidon2_A_24_0) + poseidon2_SUM_24))); + (new_term.poseidon2_B_23_0 - ((poseidon2_params_MU_0 * poseidon2_A_23_0) + poseidon2_SUM_23))); tmp *= scaling_factor; std::get<109>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<110, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_24_1 - ((poseidon2_params_MU_1 * poseidon2_A_24_1) + poseidon2_SUM_24))); + (new_term.poseidon2_B_23_1 - ((poseidon2_params_MU_1 * poseidon2_A_23_1) + poseidon2_SUM_23))); tmp *= scaling_factor; std::get<110>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<111, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_24_2 - ((poseidon2_params_MU_2 * poseidon2_A_24_2) + poseidon2_SUM_24))); + (new_term.poseidon2_B_23_2 - ((poseidon2_params_MU_2 * poseidon2_A_23_2) + poseidon2_SUM_23))); tmp *= scaling_factor; std::get<111>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<112, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_24_3 - ((poseidon2_params_MU_3 * poseidon2_A_24_3) + poseidon2_SUM_24))); + (new_term.poseidon2_B_23_3 - ((poseidon2_params_MU_3 * poseidon2_A_23_3) + poseidon2_SUM_23))); tmp *= scaling_factor; std::get<112>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<113, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_25_0 - ((poseidon2_params_MU_0 * poseidon2_A_25_0) + poseidon2_SUM_25))); + (new_term.poseidon2_B_24_0 - ((poseidon2_params_MU_0 * poseidon2_A_24_0) + poseidon2_SUM_24))); tmp *= scaling_factor; std::get<113>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<114, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_25_1 - ((poseidon2_params_MU_1 * poseidon2_A_25_1) + poseidon2_SUM_25))); + (new_term.poseidon2_B_24_1 - ((poseidon2_params_MU_1 * poseidon2_A_24_1) + poseidon2_SUM_24))); tmp *= scaling_factor; std::get<114>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<115, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_25_2 - ((poseidon2_params_MU_2 * poseidon2_A_25_2) + poseidon2_SUM_25))); + (new_term.poseidon2_B_24_2 - ((poseidon2_params_MU_2 * poseidon2_A_24_2) + poseidon2_SUM_24))); tmp *= scaling_factor; std::get<115>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<116, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_25_3 - ((poseidon2_params_MU_3 * poseidon2_A_25_3) + poseidon2_SUM_25))); + (new_term.poseidon2_B_24_3 - ((poseidon2_params_MU_3 * poseidon2_A_24_3) + poseidon2_SUM_24))); tmp *= scaling_factor; std::get<116>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<117, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_26_0 - ((poseidon2_params_MU_0 * poseidon2_A_26_0) + poseidon2_SUM_26))); + (new_term.poseidon2_B_25_0 - ((poseidon2_params_MU_0 * poseidon2_A_25_0) + poseidon2_SUM_25))); tmp *= scaling_factor; std::get<117>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<118, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_26_1 - ((poseidon2_params_MU_1 * poseidon2_A_26_1) + poseidon2_SUM_26))); + (new_term.poseidon2_B_25_1 - ((poseidon2_params_MU_1 * poseidon2_A_25_1) + poseidon2_SUM_25))); tmp *= scaling_factor; std::get<118>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<119, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_26_2 - ((poseidon2_params_MU_2 * poseidon2_A_26_2) + poseidon2_SUM_26))); + (new_term.poseidon2_B_25_2 - ((poseidon2_params_MU_2 * poseidon2_A_25_2) + poseidon2_SUM_25))); tmp *= scaling_factor; std::get<119>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<120, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_26_3 - ((poseidon2_params_MU_3 * poseidon2_A_26_3) + poseidon2_SUM_26))); + (new_term.poseidon2_B_25_3 - ((poseidon2_params_MU_3 * poseidon2_A_25_3) + poseidon2_SUM_25))); tmp *= scaling_factor; std::get<120>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<121, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_27_0 - ((poseidon2_params_MU_0 * poseidon2_A_27_0) + poseidon2_SUM_27))); + (new_term.poseidon2_B_26_0 - ((poseidon2_params_MU_0 * poseidon2_A_26_0) + poseidon2_SUM_26))); tmp *= scaling_factor; std::get<121>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<122, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_27_1 - ((poseidon2_params_MU_1 * poseidon2_A_27_1) + poseidon2_SUM_27))); + (new_term.poseidon2_B_26_1 - ((poseidon2_params_MU_1 * poseidon2_A_26_1) + poseidon2_SUM_26))); tmp *= scaling_factor; std::get<122>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<123, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_27_2 - ((poseidon2_params_MU_2 * poseidon2_A_27_2) + poseidon2_SUM_27))); + (new_term.poseidon2_B_26_2 - ((poseidon2_params_MU_2 * poseidon2_A_26_2) + poseidon2_SUM_26))); tmp *= scaling_factor; std::get<123>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<124, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_27_3 - ((poseidon2_params_MU_3 * poseidon2_A_27_3) + poseidon2_SUM_27))); + (new_term.poseidon2_B_26_3 - ((poseidon2_params_MU_3 * poseidon2_A_26_3) + poseidon2_SUM_26))); tmp *= scaling_factor; std::get<124>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<125, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_28_0 - ((poseidon2_params_MU_0 * poseidon2_A_28_0) + poseidon2_SUM_28))); + (new_term.poseidon2_B_27_0 - ((poseidon2_params_MU_0 * poseidon2_A_27_0) + poseidon2_SUM_27))); tmp *= scaling_factor; std::get<125>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<126, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_28_1 - ((poseidon2_params_MU_1 * poseidon2_A_28_1) + poseidon2_SUM_28))); + (new_term.poseidon2_B_27_1 - ((poseidon2_params_MU_1 * poseidon2_A_27_1) + poseidon2_SUM_27))); tmp *= scaling_factor; std::get<126>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<127, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_28_2 - ((poseidon2_params_MU_2 * poseidon2_A_28_2) + poseidon2_SUM_28))); + (new_term.poseidon2_B_27_2 - ((poseidon2_params_MU_2 * poseidon2_A_27_2) + poseidon2_SUM_27))); tmp *= scaling_factor; std::get<127>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<128, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_28_3 - ((poseidon2_params_MU_3 * poseidon2_A_28_3) + poseidon2_SUM_28))); + (new_term.poseidon2_B_27_3 - ((poseidon2_params_MU_3 * poseidon2_A_27_3) + poseidon2_SUM_27))); tmp *= scaling_factor; std::get<128>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<129, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_29_0 - ((poseidon2_params_MU_0 * poseidon2_A_29_0) + poseidon2_SUM_29))); + (new_term.poseidon2_B_28_0 - ((poseidon2_params_MU_0 * poseidon2_A_28_0) + poseidon2_SUM_28))); tmp *= scaling_factor; std::get<129>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<130, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_29_1 - ((poseidon2_params_MU_1 * poseidon2_A_29_1) + poseidon2_SUM_29))); + (new_term.poseidon2_B_28_1 - ((poseidon2_params_MU_1 * poseidon2_A_28_1) + poseidon2_SUM_28))); tmp *= scaling_factor; std::get<130>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<131, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_29_2 - ((poseidon2_params_MU_2 * poseidon2_A_29_2) + poseidon2_SUM_29))); + (new_term.poseidon2_B_28_2 - ((poseidon2_params_MU_2 * poseidon2_A_28_2) + poseidon2_SUM_28))); tmp *= scaling_factor; std::get<131>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<132, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_29_3 - ((poseidon2_params_MU_3 * poseidon2_A_29_3) + poseidon2_SUM_29))); + (new_term.poseidon2_B_28_3 - ((poseidon2_params_MU_3 * poseidon2_A_28_3) + poseidon2_SUM_28))); tmp *= scaling_factor; std::get<132>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<133, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_30_0 - ((poseidon2_params_MU_0 * poseidon2_A_30_0) + poseidon2_SUM_30))); + (new_term.poseidon2_B_29_0 - ((poseidon2_params_MU_0 * poseidon2_A_29_0) + poseidon2_SUM_29))); tmp *= scaling_factor; std::get<133>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<134, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_30_1 - ((poseidon2_params_MU_1 * poseidon2_A_30_1) + poseidon2_SUM_30))); + (new_term.poseidon2_B_29_1 - ((poseidon2_params_MU_1 * poseidon2_A_29_1) + poseidon2_SUM_29))); tmp *= scaling_factor; std::get<134>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<135, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_30_2 - ((poseidon2_params_MU_2 * poseidon2_A_30_2) + poseidon2_SUM_30))); + (new_term.poseidon2_B_29_2 - ((poseidon2_params_MU_2 * poseidon2_A_29_2) + poseidon2_SUM_29))); tmp *= scaling_factor; std::get<135>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<136, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_30_3 - ((poseidon2_params_MU_3 * poseidon2_A_30_3) + poseidon2_SUM_30))); + (new_term.poseidon2_B_29_3 - ((poseidon2_params_MU_3 * poseidon2_A_29_3) + poseidon2_SUM_29))); tmp *= scaling_factor; std::get<136>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<137, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_31_0 - ((poseidon2_params_MU_0 * poseidon2_A_31_0) + poseidon2_SUM_31))); + (new_term.poseidon2_B_30_0 - ((poseidon2_params_MU_0 * poseidon2_A_30_0) + poseidon2_SUM_30))); tmp *= scaling_factor; std::get<137>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<138, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_31_1 - ((poseidon2_params_MU_1 * poseidon2_A_31_1) + poseidon2_SUM_31))); + (new_term.poseidon2_B_30_1 - ((poseidon2_params_MU_1 * poseidon2_A_30_1) + poseidon2_SUM_30))); tmp *= scaling_factor; std::get<138>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<139, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_31_2 - ((poseidon2_params_MU_2 * poseidon2_A_31_2) + poseidon2_SUM_31))); + (new_term.poseidon2_B_30_2 - ((poseidon2_params_MU_2 * poseidon2_A_30_2) + poseidon2_SUM_30))); tmp *= scaling_factor; std::get<139>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<140, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_31_3 - ((poseidon2_params_MU_3 * poseidon2_A_31_3) + poseidon2_SUM_31))); + (new_term.poseidon2_B_30_3 - ((poseidon2_params_MU_3 * poseidon2_A_30_3) + poseidon2_SUM_30))); tmp *= scaling_factor; std::get<140>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<141, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_32_0 - ((poseidon2_params_MU_0 * poseidon2_A_32_0) + poseidon2_SUM_32))); + (new_term.poseidon2_B_31_0 - ((poseidon2_params_MU_0 * poseidon2_A_31_0) + poseidon2_SUM_31))); tmp *= scaling_factor; std::get<141>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<142, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_32_1 - ((poseidon2_params_MU_1 * poseidon2_A_32_1) + poseidon2_SUM_32))); + (new_term.poseidon2_B_31_1 - ((poseidon2_params_MU_1 * poseidon2_A_31_1) + poseidon2_SUM_31))); tmp *= scaling_factor; std::get<142>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<143, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_32_2 - ((poseidon2_params_MU_2 * poseidon2_A_32_2) + poseidon2_SUM_32))); + (new_term.poseidon2_B_31_2 - ((poseidon2_params_MU_2 * poseidon2_A_31_2) + poseidon2_SUM_31))); tmp *= scaling_factor; std::get<143>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<144, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_32_3 - ((poseidon2_params_MU_3 * poseidon2_A_32_3) + poseidon2_SUM_32))); + (new_term.poseidon2_B_31_3 - ((poseidon2_params_MU_3 * poseidon2_A_31_3) + poseidon2_SUM_31))); tmp *= scaling_factor; std::get<144>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<145, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_33_0 - ((poseidon2_params_MU_0 * poseidon2_A_33_0) + poseidon2_SUM_33))); + (new_term.poseidon2_B_32_0 - ((poseidon2_params_MU_0 * poseidon2_A_32_0) + poseidon2_SUM_32))); tmp *= scaling_factor; std::get<145>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<146, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_33_1 - ((poseidon2_params_MU_1 * poseidon2_A_33_1) + poseidon2_SUM_33))); + (new_term.poseidon2_B_32_1 - ((poseidon2_params_MU_1 * poseidon2_A_32_1) + poseidon2_SUM_32))); tmp *= scaling_factor; std::get<146>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<147, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_33_2 - ((poseidon2_params_MU_2 * poseidon2_A_33_2) + poseidon2_SUM_33))); + (new_term.poseidon2_B_32_2 - ((poseidon2_params_MU_2 * poseidon2_A_32_2) + poseidon2_SUM_32))); tmp *= scaling_factor; std::get<147>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<148, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_33_3 - ((poseidon2_params_MU_3 * poseidon2_A_33_3) + poseidon2_SUM_33))); + (new_term.poseidon2_B_32_3 - ((poseidon2_params_MU_3 * poseidon2_A_32_3) + poseidon2_SUM_32))); tmp *= scaling_factor; std::get<148>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<149, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_34_0 - ((poseidon2_params_MU_0 * poseidon2_A_34_0) + poseidon2_SUM_34))); + (new_term.poseidon2_B_33_0 - ((poseidon2_params_MU_0 * poseidon2_A_33_0) + poseidon2_SUM_33))); tmp *= scaling_factor; std::get<149>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<150, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_34_1 - ((poseidon2_params_MU_1 * poseidon2_A_34_1) + poseidon2_SUM_34))); + (new_term.poseidon2_B_33_1 - ((poseidon2_params_MU_1 * poseidon2_A_33_1) + poseidon2_SUM_33))); tmp *= scaling_factor; std::get<150>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<151, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_34_2 - ((poseidon2_params_MU_2 * poseidon2_A_34_2) + poseidon2_SUM_34))); + (new_term.poseidon2_B_33_2 - ((poseidon2_params_MU_2 * poseidon2_A_33_2) + poseidon2_SUM_33))); tmp *= scaling_factor; std::get<151>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<152, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_34_3 - ((poseidon2_params_MU_3 * poseidon2_A_34_3) + poseidon2_SUM_34))); + (new_term.poseidon2_B_33_3 - ((poseidon2_params_MU_3 * poseidon2_A_33_3) + poseidon2_SUM_33))); tmp *= scaling_factor; std::get<152>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<153, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_35_0 - ((poseidon2_params_MU_0 * poseidon2_A_35_0) + poseidon2_SUM_35))); + (new_term.poseidon2_B_34_0 - ((poseidon2_params_MU_0 * poseidon2_A_34_0) + poseidon2_SUM_34))); tmp *= scaling_factor; std::get<153>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<154, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_35_1 - ((poseidon2_params_MU_1 * poseidon2_A_35_1) + poseidon2_SUM_35))); + (new_term.poseidon2_B_34_1 - ((poseidon2_params_MU_1 * poseidon2_A_34_1) + poseidon2_SUM_34))); tmp *= scaling_factor; std::get<154>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<155, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_35_2 - ((poseidon2_params_MU_2 * poseidon2_A_35_2) + poseidon2_SUM_35))); + (new_term.poseidon2_B_34_2 - ((poseidon2_params_MU_2 * poseidon2_A_34_2) + poseidon2_SUM_34))); tmp *= scaling_factor; std::get<155>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<156, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_35_3 - ((poseidon2_params_MU_3 * poseidon2_A_35_3) + poseidon2_SUM_35))); + (new_term.poseidon2_B_34_3 - ((poseidon2_params_MU_3 * poseidon2_A_34_3) + poseidon2_SUM_34))); tmp *= scaling_factor; std::get<156>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<157, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_36_0 - ((poseidon2_params_MU_0 * poseidon2_A_36_0) + poseidon2_SUM_36))); + (new_term.poseidon2_B_35_0 - ((poseidon2_params_MU_0 * poseidon2_A_35_0) + poseidon2_SUM_35))); tmp *= scaling_factor; std::get<157>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<158, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_36_1 - ((poseidon2_params_MU_1 * poseidon2_A_36_1) + poseidon2_SUM_36))); + (new_term.poseidon2_B_35_1 - ((poseidon2_params_MU_1 * poseidon2_A_35_1) + poseidon2_SUM_35))); tmp *= scaling_factor; std::get<158>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<159, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_36_2 - ((poseidon2_params_MU_2 * poseidon2_A_36_2) + poseidon2_SUM_36))); + (new_term.poseidon2_B_35_2 - ((poseidon2_params_MU_2 * poseidon2_A_35_2) + poseidon2_SUM_35))); tmp *= scaling_factor; std::get<159>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<160, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_36_3 - ((poseidon2_params_MU_3 * poseidon2_A_36_3) + poseidon2_SUM_36))); + (new_term.poseidon2_B_35_3 - ((poseidon2_params_MU_3 * poseidon2_A_35_3) + poseidon2_SUM_35))); tmp *= scaling_factor; std::get<160>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<161, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_37_0 - ((poseidon2_params_MU_0 * poseidon2_A_37_0) + poseidon2_SUM_37))); + (new_term.poseidon2_B_36_0 - ((poseidon2_params_MU_0 * poseidon2_A_36_0) + poseidon2_SUM_36))); tmp *= scaling_factor; std::get<161>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<162, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_37_1 - ((poseidon2_params_MU_1 * poseidon2_A_37_1) + poseidon2_SUM_37))); + (new_term.poseidon2_B_36_1 - ((poseidon2_params_MU_1 * poseidon2_A_36_1) + poseidon2_SUM_36))); tmp *= scaling_factor; std::get<162>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<163, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_37_2 - ((poseidon2_params_MU_2 * poseidon2_A_37_2) + poseidon2_SUM_37))); + (new_term.poseidon2_B_36_2 - ((poseidon2_params_MU_2 * poseidon2_A_36_2) + poseidon2_SUM_36))); tmp *= scaling_factor; std::get<163>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<164, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_37_3 - ((poseidon2_params_MU_3 * poseidon2_A_37_3) + poseidon2_SUM_37))); + (new_term.poseidon2_B_36_3 - ((poseidon2_params_MU_3 * poseidon2_A_36_3) + poseidon2_SUM_36))); tmp *= scaling_factor; std::get<164>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<165, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_38_0 - ((poseidon2_params_MU_0 * poseidon2_A_38_0) + poseidon2_SUM_38))); + (new_term.poseidon2_B_37_0 - ((poseidon2_params_MU_0 * poseidon2_A_37_0) + poseidon2_SUM_37))); tmp *= scaling_factor; std::get<165>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<166, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_38_1 - ((poseidon2_params_MU_1 * poseidon2_A_38_1) + poseidon2_SUM_38))); + (new_term.poseidon2_B_37_1 - ((poseidon2_params_MU_1 * poseidon2_A_37_1) + poseidon2_SUM_37))); tmp *= scaling_factor; std::get<166>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<167, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_38_2 - ((poseidon2_params_MU_2 * poseidon2_A_38_2) + poseidon2_SUM_38))); + (new_term.poseidon2_B_37_2 - ((poseidon2_params_MU_2 * poseidon2_A_37_2) + poseidon2_SUM_37))); tmp *= scaling_factor; std::get<167>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<168, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_38_3 - ((poseidon2_params_MU_3 * poseidon2_A_38_3) + poseidon2_SUM_38))); + (new_term.poseidon2_B_37_3 - ((poseidon2_params_MU_3 * poseidon2_A_37_3) + poseidon2_SUM_37))); tmp *= scaling_factor; std::get<168>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<169, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_39_0 - ((poseidon2_params_MU_0 * poseidon2_A_39_0) + poseidon2_SUM_39))); + (new_term.poseidon2_B_38_0 - ((poseidon2_params_MU_0 * poseidon2_A_38_0) + poseidon2_SUM_38))); tmp *= scaling_factor; std::get<169>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<170, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_39_1 - ((poseidon2_params_MU_1 * poseidon2_A_39_1) + poseidon2_SUM_39))); + (new_term.poseidon2_B_38_1 - ((poseidon2_params_MU_1 * poseidon2_A_38_1) + poseidon2_SUM_38))); tmp *= scaling_factor; std::get<170>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<171, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_39_2 - ((poseidon2_params_MU_2 * poseidon2_A_39_2) + poseidon2_SUM_39))); + (new_term.poseidon2_B_38_2 - ((poseidon2_params_MU_2 * poseidon2_A_38_2) + poseidon2_SUM_38))); tmp *= scaling_factor; std::get<171>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<172, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_39_3 - ((poseidon2_params_MU_3 * poseidon2_A_39_3) + poseidon2_SUM_39))); + (new_term.poseidon2_B_38_3 - ((poseidon2_params_MU_3 * poseidon2_A_38_3) + poseidon2_SUM_38))); tmp *= scaling_factor; std::get<172>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<173, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_40_0 - ((poseidon2_params_MU_0 * poseidon2_A_40_0) + poseidon2_SUM_40))); + (new_term.poseidon2_B_39_0 - ((poseidon2_params_MU_0 * poseidon2_A_39_0) + poseidon2_SUM_39))); tmp *= scaling_factor; std::get<173>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<174, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_40_1 - ((poseidon2_params_MU_1 * poseidon2_A_40_1) + poseidon2_SUM_40))); + (new_term.poseidon2_B_39_1 - ((poseidon2_params_MU_1 * poseidon2_A_39_1) + poseidon2_SUM_39))); tmp *= scaling_factor; std::get<174>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<175, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_40_2 - ((poseidon2_params_MU_2 * poseidon2_A_40_2) + poseidon2_SUM_40))); + (new_term.poseidon2_B_39_2 - ((poseidon2_params_MU_2 * poseidon2_A_39_2) + poseidon2_SUM_39))); tmp *= scaling_factor; std::get<175>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<176, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_40_3 - ((poseidon2_params_MU_3 * poseidon2_A_40_3) + poseidon2_SUM_40))); + (new_term.poseidon2_B_39_3 - ((poseidon2_params_MU_3 * poseidon2_A_39_3) + poseidon2_SUM_39))); tmp *= scaling_factor; std::get<176>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<177, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_41_0 - ((poseidon2_params_MU_0 * poseidon2_A_41_0) + poseidon2_SUM_41))); + (new_term.poseidon2_B_40_0 - ((poseidon2_params_MU_0 * poseidon2_A_40_0) + poseidon2_SUM_40))); tmp *= scaling_factor; std::get<177>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<178, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_41_1 - ((poseidon2_params_MU_1 * poseidon2_A_41_1) + poseidon2_SUM_41))); + (new_term.poseidon2_B_40_1 - ((poseidon2_params_MU_1 * poseidon2_A_40_1) + poseidon2_SUM_40))); tmp *= scaling_factor; std::get<178>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<179, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_41_2 - ((poseidon2_params_MU_2 * poseidon2_A_41_2) + poseidon2_SUM_41))); + (new_term.poseidon2_B_40_2 - ((poseidon2_params_MU_2 * poseidon2_A_40_2) + poseidon2_SUM_40))); tmp *= scaling_factor; std::get<179>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<180, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_41_3 - ((poseidon2_params_MU_3 * poseidon2_A_41_3) + poseidon2_SUM_41))); + (new_term.poseidon2_B_40_3 - ((poseidon2_params_MU_3 * poseidon2_A_40_3) + poseidon2_SUM_40))); tmp *= scaling_factor; std::get<180>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<181, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_42_0 - ((poseidon2_params_MU_0 * poseidon2_A_42_0) + poseidon2_SUM_42))); + (new_term.poseidon2_B_41_0 - ((poseidon2_params_MU_0 * poseidon2_A_41_0) + poseidon2_SUM_41))); tmp *= scaling_factor; std::get<181>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<182, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_42_1 - ((poseidon2_params_MU_1 * poseidon2_A_42_1) + poseidon2_SUM_42))); + (new_term.poseidon2_B_41_1 - ((poseidon2_params_MU_1 * poseidon2_A_41_1) + poseidon2_SUM_41))); tmp *= scaling_factor; std::get<182>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<183, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_42_2 - ((poseidon2_params_MU_2 * poseidon2_A_42_2) + poseidon2_SUM_42))); + (new_term.poseidon2_B_41_2 - ((poseidon2_params_MU_2 * poseidon2_A_41_2) + poseidon2_SUM_41))); tmp *= scaling_factor; std::get<183>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<184, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_42_3 - ((poseidon2_params_MU_3 * poseidon2_A_42_3) + poseidon2_SUM_42))); + (new_term.poseidon2_B_41_3 - ((poseidon2_params_MU_3 * poseidon2_A_41_3) + poseidon2_SUM_41))); tmp *= scaling_factor; std::get<184>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<185, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_43_0 - ((poseidon2_params_MU_0 * poseidon2_A_43_0) + poseidon2_SUM_43))); + (new_term.poseidon2_B_42_0 - ((poseidon2_params_MU_0 * poseidon2_A_42_0) + poseidon2_SUM_42))); tmp *= scaling_factor; std::get<185>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<186, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_43_1 - ((poseidon2_params_MU_1 * poseidon2_A_43_1) + poseidon2_SUM_43))); + (new_term.poseidon2_B_42_1 - ((poseidon2_params_MU_1 * poseidon2_A_42_1) + poseidon2_SUM_42))); tmp *= scaling_factor; std::get<186>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<187, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_43_2 - ((poseidon2_params_MU_2 * poseidon2_A_43_2) + poseidon2_SUM_43))); + (new_term.poseidon2_B_42_2 - ((poseidon2_params_MU_2 * poseidon2_A_42_2) + poseidon2_SUM_42))); tmp *= scaling_factor; std::get<187>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<188, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_43_3 - ((poseidon2_params_MU_3 * poseidon2_A_43_3) + poseidon2_SUM_43))); + (new_term.poseidon2_B_42_3 - ((poseidon2_params_MU_3 * poseidon2_A_42_3) + poseidon2_SUM_42))); tmp *= scaling_factor; std::get<188>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<189, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_44_0 - ((poseidon2_params_MU_0 * poseidon2_A_44_0) + poseidon2_SUM_44))); + (new_term.poseidon2_B_43_0 - ((poseidon2_params_MU_0 * poseidon2_A_43_0) + poseidon2_SUM_43))); tmp *= scaling_factor; std::get<189>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<190, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_44_1 - ((poseidon2_params_MU_1 * poseidon2_A_44_1) + poseidon2_SUM_44))); + (new_term.poseidon2_B_43_1 - ((poseidon2_params_MU_1 * poseidon2_A_43_1) + poseidon2_SUM_43))); tmp *= scaling_factor; std::get<190>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<191, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_44_2 - ((poseidon2_params_MU_2 * poseidon2_A_44_2) + poseidon2_SUM_44))); + (new_term.poseidon2_B_43_2 - ((poseidon2_params_MU_2 * poseidon2_A_43_2) + poseidon2_SUM_43))); tmp *= scaling_factor; std::get<191>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<192, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_44_3 - ((poseidon2_params_MU_3 * poseidon2_A_44_3) + poseidon2_SUM_44))); + (new_term.poseidon2_B_43_3 - ((poseidon2_params_MU_3 * poseidon2_A_43_3) + poseidon2_SUM_43))); tmp *= scaling_factor; std::get<192>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<193, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_45_0 - ((poseidon2_params_MU_0 * poseidon2_A_45_0) + poseidon2_SUM_45))); + (new_term.poseidon2_B_44_0 - ((poseidon2_params_MU_0 * poseidon2_A_44_0) + poseidon2_SUM_44))); tmp *= scaling_factor; std::get<193>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<194, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_45_1 - ((poseidon2_params_MU_1 * poseidon2_A_45_1) + poseidon2_SUM_45))); + (new_term.poseidon2_B_44_1 - ((poseidon2_params_MU_1 * poseidon2_A_44_1) + poseidon2_SUM_44))); tmp *= scaling_factor; std::get<194>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<195, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_45_2 - ((poseidon2_params_MU_2 * poseidon2_A_45_2) + poseidon2_SUM_45))); + (new_term.poseidon2_B_44_2 - ((poseidon2_params_MU_2 * poseidon2_A_44_2) + poseidon2_SUM_44))); tmp *= scaling_factor; std::get<195>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<196, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_45_3 - ((poseidon2_params_MU_3 * poseidon2_A_45_3) + poseidon2_SUM_45))); + (new_term.poseidon2_B_44_3 - ((poseidon2_params_MU_3 * poseidon2_A_44_3) + poseidon2_SUM_44))); tmp *= scaling_factor; std::get<196>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<197, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_46_0 - ((poseidon2_params_MU_0 * poseidon2_A_46_0) + poseidon2_SUM_46))); + (new_term.poseidon2_B_45_0 - ((poseidon2_params_MU_0 * poseidon2_A_45_0) + poseidon2_SUM_45))); tmp *= scaling_factor; std::get<197>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<198, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_46_1 - ((poseidon2_params_MU_1 * poseidon2_A_46_1) + poseidon2_SUM_46))); + (new_term.poseidon2_B_45_1 - ((poseidon2_params_MU_1 * poseidon2_A_45_1) + poseidon2_SUM_45))); tmp *= scaling_factor; std::get<198>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<199, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_46_2 - ((poseidon2_params_MU_2 * poseidon2_A_46_2) + poseidon2_SUM_46))); + (new_term.poseidon2_B_45_2 - ((poseidon2_params_MU_2 * poseidon2_A_45_2) + poseidon2_SUM_45))); tmp *= scaling_factor; std::get<199>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<200, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_46_3 - ((poseidon2_params_MU_3 * poseidon2_A_46_3) + poseidon2_SUM_46))); + (new_term.poseidon2_B_45_3 - ((poseidon2_params_MU_3 * poseidon2_A_45_3) + poseidon2_SUM_45))); tmp *= scaling_factor; std::get<200>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<201, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_47_0 - ((poseidon2_params_MU_0 * poseidon2_A_47_0) + poseidon2_SUM_47))); + (new_term.poseidon2_B_46_0 - ((poseidon2_params_MU_0 * poseidon2_A_46_0) + poseidon2_SUM_46))); tmp *= scaling_factor; std::get<201>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<202, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_47_1 - ((poseidon2_params_MU_1 * poseidon2_A_47_1) + poseidon2_SUM_47))); + (new_term.poseidon2_B_46_1 - ((poseidon2_params_MU_1 * poseidon2_A_46_1) + poseidon2_SUM_46))); tmp *= scaling_factor; std::get<202>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<203, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_47_2 - ((poseidon2_params_MU_2 * poseidon2_A_47_2) + poseidon2_SUM_47))); + (new_term.poseidon2_B_46_2 - ((poseidon2_params_MU_2 * poseidon2_A_46_2) + poseidon2_SUM_46))); tmp *= scaling_factor; std::get<203>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<204, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_47_3 - ((poseidon2_params_MU_3 * poseidon2_A_47_3) + poseidon2_SUM_47))); + (new_term.poseidon2_B_46_3 - ((poseidon2_params_MU_3 * poseidon2_A_46_3) + poseidon2_SUM_46))); tmp *= scaling_factor; std::get<204>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<205, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_48_0 - ((poseidon2_params_MU_0 * poseidon2_A_48_0) + poseidon2_SUM_48))); + (new_term.poseidon2_B_47_0 - ((poseidon2_params_MU_0 * poseidon2_A_47_0) + poseidon2_SUM_47))); tmp *= scaling_factor; std::get<205>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<206, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_48_1 - ((poseidon2_params_MU_1 * poseidon2_A_48_1) + poseidon2_SUM_48))); + (new_term.poseidon2_B_47_1 - ((poseidon2_params_MU_1 * poseidon2_A_47_1) + poseidon2_SUM_47))); tmp *= scaling_factor; std::get<206>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<207, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_48_2 - ((poseidon2_params_MU_2 * poseidon2_A_48_2) + poseidon2_SUM_48))); + (new_term.poseidon2_B_47_2 - ((poseidon2_params_MU_2 * poseidon2_A_47_2) + poseidon2_SUM_47))); tmp *= scaling_factor; std::get<207>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<208, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_48_3 - ((poseidon2_params_MU_3 * poseidon2_A_48_3) + poseidon2_SUM_48))); + (new_term.poseidon2_B_47_3 - ((poseidon2_params_MU_3 * poseidon2_A_47_3) + poseidon2_SUM_47))); tmp *= scaling_factor; std::get<208>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<209, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_49_0 - ((poseidon2_params_MU_0 * poseidon2_A_49_0) + poseidon2_SUM_49))); + (new_term.poseidon2_B_48_0 - ((poseidon2_params_MU_0 * poseidon2_A_48_0) + poseidon2_SUM_48))); tmp *= scaling_factor; std::get<209>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<210, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_49_1 - ((poseidon2_params_MU_1 * poseidon2_A_49_1) + poseidon2_SUM_49))); + (new_term.poseidon2_B_48_1 - ((poseidon2_params_MU_1 * poseidon2_A_48_1) + poseidon2_SUM_48))); tmp *= scaling_factor; std::get<210>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<211, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_49_2 - ((poseidon2_params_MU_2 * poseidon2_A_49_2) + poseidon2_SUM_49))); + (new_term.poseidon2_B_48_2 - ((poseidon2_params_MU_2 * poseidon2_A_48_2) + poseidon2_SUM_48))); tmp *= scaling_factor; std::get<211>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<212, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_49_3 - ((poseidon2_params_MU_3 * poseidon2_A_49_3) + poseidon2_SUM_49))); + (new_term.poseidon2_B_48_3 - ((poseidon2_params_MU_3 * poseidon2_A_48_3) + poseidon2_SUM_48))); tmp *= scaling_factor; std::get<212>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<213, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_50_0 - ((poseidon2_params_MU_0 * poseidon2_A_50_0) + poseidon2_SUM_50))); + (new_term.poseidon2_B_49_0 - ((poseidon2_params_MU_0 * poseidon2_A_49_0) + poseidon2_SUM_49))); tmp *= scaling_factor; std::get<213>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<214, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_50_1 - ((poseidon2_params_MU_1 * poseidon2_A_50_1) + poseidon2_SUM_50))); + (new_term.poseidon2_B_49_1 - ((poseidon2_params_MU_1 * poseidon2_A_49_1) + poseidon2_SUM_49))); tmp *= scaling_factor; std::get<214>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<215, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_50_2 - ((poseidon2_params_MU_2 * poseidon2_A_50_2) + poseidon2_SUM_50))); + (new_term.poseidon2_B_49_2 - ((poseidon2_params_MU_2 * poseidon2_A_49_2) + poseidon2_SUM_49))); tmp *= scaling_factor; std::get<215>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<216, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_50_3 - ((poseidon2_params_MU_3 * poseidon2_A_50_3) + poseidon2_SUM_50))); + (new_term.poseidon2_B_49_3 - ((poseidon2_params_MU_3 * poseidon2_A_49_3) + poseidon2_SUM_49))); tmp *= scaling_factor; std::get<216>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<217, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_51_0 - ((poseidon2_params_MU_0 * poseidon2_A_51_0) + poseidon2_SUM_51))); + (new_term.poseidon2_B_50_0 - ((poseidon2_params_MU_0 * poseidon2_A_50_0) + poseidon2_SUM_50))); tmp *= scaling_factor; std::get<217>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<218, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_51_1 - ((poseidon2_params_MU_1 * poseidon2_A_51_1) + poseidon2_SUM_51))); + (new_term.poseidon2_B_50_1 - ((poseidon2_params_MU_1 * poseidon2_A_50_1) + poseidon2_SUM_50))); tmp *= scaling_factor; std::get<218>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<219, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_51_2 - ((poseidon2_params_MU_2 * poseidon2_A_51_2) + poseidon2_SUM_51))); + (new_term.poseidon2_B_50_2 - ((poseidon2_params_MU_2 * poseidon2_A_50_2) + poseidon2_SUM_50))); tmp *= scaling_factor; std::get<219>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<220, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_51_3 - ((poseidon2_params_MU_3 * poseidon2_A_51_3) + poseidon2_SUM_51))); + (new_term.poseidon2_B_50_3 - ((poseidon2_params_MU_3 * poseidon2_A_50_3) + poseidon2_SUM_50))); tmp *= scaling_factor; std::get<220>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<221, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_52_0 - ((poseidon2_params_MU_0 * poseidon2_A_52_0) + poseidon2_SUM_52))); + (new_term.poseidon2_B_51_0 - ((poseidon2_params_MU_0 * poseidon2_A_51_0) + poseidon2_SUM_51))); tmp *= scaling_factor; std::get<221>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<222, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_52_1 - ((poseidon2_params_MU_1 * poseidon2_A_52_1) + poseidon2_SUM_52))); + (new_term.poseidon2_B_51_1 - ((poseidon2_params_MU_1 * poseidon2_A_51_1) + poseidon2_SUM_51))); tmp *= scaling_factor; std::get<222>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<223, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_52_2 - ((poseidon2_params_MU_2 * poseidon2_A_52_2) + poseidon2_SUM_52))); + (new_term.poseidon2_B_51_2 - ((poseidon2_params_MU_2 * poseidon2_A_51_2) + poseidon2_SUM_51))); tmp *= scaling_factor; std::get<223>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<224, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_52_3 - ((poseidon2_params_MU_3 * poseidon2_A_52_3) + poseidon2_SUM_52))); + (new_term.poseidon2_B_51_3 - ((poseidon2_params_MU_3 * poseidon2_A_51_3) + poseidon2_SUM_51))); tmp *= scaling_factor; std::get<224>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<225, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_53_0 - ((poseidon2_params_MU_0 * poseidon2_A_53_0) + poseidon2_SUM_53))); + (new_term.poseidon2_B_52_0 - ((poseidon2_params_MU_0 * poseidon2_A_52_0) + poseidon2_SUM_52))); tmp *= scaling_factor; std::get<225>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<226, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_53_1 - ((poseidon2_params_MU_1 * poseidon2_A_53_1) + poseidon2_SUM_53))); + (new_term.poseidon2_B_52_1 - ((poseidon2_params_MU_1 * poseidon2_A_52_1) + poseidon2_SUM_52))); tmp *= scaling_factor; std::get<226>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<227, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_53_2 - ((poseidon2_params_MU_2 * poseidon2_A_53_2) + poseidon2_SUM_53))); + (new_term.poseidon2_B_52_2 - ((poseidon2_params_MU_2 * poseidon2_A_52_2) + poseidon2_SUM_52))); tmp *= scaling_factor; std::get<227>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<228, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_53_3 - ((poseidon2_params_MU_3 * poseidon2_A_53_3) + poseidon2_SUM_53))); + (new_term.poseidon2_B_52_3 - ((poseidon2_params_MU_3 * poseidon2_A_52_3) + poseidon2_SUM_52))); tmp *= scaling_factor; std::get<228>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<229, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_54_0 - ((poseidon2_params_MU_0 * poseidon2_A_54_0) + poseidon2_SUM_54))); + (new_term.poseidon2_B_53_0 - ((poseidon2_params_MU_0 * poseidon2_A_53_0) + poseidon2_SUM_53))); tmp *= scaling_factor; std::get<229>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<230, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_54_1 - ((poseidon2_params_MU_1 * poseidon2_A_54_1) + poseidon2_SUM_54))); + (new_term.poseidon2_B_53_1 - ((poseidon2_params_MU_1 * poseidon2_A_53_1) + poseidon2_SUM_53))); tmp *= scaling_factor; std::get<230>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<231, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_54_2 - ((poseidon2_params_MU_2 * poseidon2_A_54_2) + poseidon2_SUM_54))); + (new_term.poseidon2_B_53_2 - ((poseidon2_params_MU_2 * poseidon2_A_53_2) + poseidon2_SUM_53))); tmp *= scaling_factor; std::get<231>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<232, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_54_3 - ((poseidon2_params_MU_3 * poseidon2_A_54_3) + poseidon2_SUM_54))); + (new_term.poseidon2_B_53_3 - ((poseidon2_params_MU_3 * poseidon2_A_53_3) + poseidon2_SUM_53))); tmp *= scaling_factor; std::get<232>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<233, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_55_0 - ((poseidon2_params_MU_0 * poseidon2_A_55_0) + poseidon2_SUM_55))); + (new_term.poseidon2_B_54_0 - ((poseidon2_params_MU_0 * poseidon2_A_54_0) + poseidon2_SUM_54))); tmp *= scaling_factor; std::get<233>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<234, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_55_1 - ((poseidon2_params_MU_1 * poseidon2_A_55_1) + poseidon2_SUM_55))); + (new_term.poseidon2_B_54_1 - ((poseidon2_params_MU_1 * poseidon2_A_54_1) + poseidon2_SUM_54))); tmp *= scaling_factor; std::get<234>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<235, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_55_2 - ((poseidon2_params_MU_2 * poseidon2_A_55_2) + poseidon2_SUM_55))); + (new_term.poseidon2_B_54_2 - ((poseidon2_params_MU_2 * poseidon2_A_54_2) + poseidon2_SUM_54))); tmp *= scaling_factor; std::get<235>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<236, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_55_3 - ((poseidon2_params_MU_3 * poseidon2_A_55_3) + poseidon2_SUM_55))); + (new_term.poseidon2_B_54_3 - ((poseidon2_params_MU_3 * poseidon2_A_54_3) + poseidon2_SUM_54))); tmp *= scaling_factor; std::get<236>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<237, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_56_0 - ((poseidon2_params_MU_0 * poseidon2_A_56_0) + poseidon2_SUM_56))); + (new_term.poseidon2_B_55_0 - ((poseidon2_params_MU_0 * poseidon2_A_55_0) + poseidon2_SUM_55))); tmp *= scaling_factor; std::get<237>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<238, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_56_1 - ((poseidon2_params_MU_1 * poseidon2_A_56_1) + poseidon2_SUM_56))); + (new_term.poseidon2_B_55_1 - ((poseidon2_params_MU_1 * poseidon2_A_55_1) + poseidon2_SUM_55))); tmp *= scaling_factor; std::get<238>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<239, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_56_2 - ((poseidon2_params_MU_2 * poseidon2_A_56_2) + poseidon2_SUM_56))); + (new_term.poseidon2_B_55_2 - ((poseidon2_params_MU_2 * poseidon2_A_55_2) + poseidon2_SUM_55))); tmp *= scaling_factor; std::get<239>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<240, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_56_3 - ((poseidon2_params_MU_3 * poseidon2_A_56_3) + poseidon2_SUM_56))); + (new_term.poseidon2_B_55_3 - ((poseidon2_params_MU_3 * poseidon2_A_55_3) + poseidon2_SUM_55))); tmp *= scaling_factor; std::get<240>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<241, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_57_0 - ((poseidon2_params_MU_0 * poseidon2_A_57_0) + poseidon2_SUM_57))); + (new_term.poseidon2_B_56_0 - ((poseidon2_params_MU_0 * poseidon2_A_56_0) + poseidon2_SUM_56))); tmp *= scaling_factor; std::get<241>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<242, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_57_1 - ((poseidon2_params_MU_1 * poseidon2_A_57_1) + poseidon2_SUM_57))); + (new_term.poseidon2_B_56_1 - ((poseidon2_params_MU_1 * poseidon2_A_56_1) + poseidon2_SUM_56))); tmp *= scaling_factor; std::get<242>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<243, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_57_2 - ((poseidon2_params_MU_2 * poseidon2_A_57_2) + poseidon2_SUM_57))); + (new_term.poseidon2_B_56_2 - ((poseidon2_params_MU_2 * poseidon2_A_56_2) + poseidon2_SUM_56))); tmp *= scaling_factor; std::get<243>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<244, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_57_3 - ((poseidon2_params_MU_3 * poseidon2_A_57_3) + poseidon2_SUM_57))); + (new_term.poseidon2_B_56_3 - ((poseidon2_params_MU_3 * poseidon2_A_56_3) + poseidon2_SUM_56))); tmp *= scaling_factor; std::get<244>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<245, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_58_0 - ((poseidon2_params_MU_0 * poseidon2_A_58_0) + poseidon2_SUM_58))); + (new_term.poseidon2_B_57_0 - ((poseidon2_params_MU_0 * poseidon2_A_57_0) + poseidon2_SUM_57))); tmp *= scaling_factor; std::get<245>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<246, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_58_1 - ((poseidon2_params_MU_1 * poseidon2_A_58_1) + poseidon2_SUM_58))); + (new_term.poseidon2_B_57_1 - ((poseidon2_params_MU_1 * poseidon2_A_57_1) + poseidon2_SUM_57))); tmp *= scaling_factor; std::get<246>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<247, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_58_2 - ((poseidon2_params_MU_2 * poseidon2_A_58_2) + poseidon2_SUM_58))); + (new_term.poseidon2_B_57_2 - ((poseidon2_params_MU_2 * poseidon2_A_57_2) + poseidon2_SUM_57))); tmp *= scaling_factor; std::get<247>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<248, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_58_3 - ((poseidon2_params_MU_3 * poseidon2_A_58_3) + poseidon2_SUM_58))); + (new_term.poseidon2_B_57_3 - ((poseidon2_params_MU_3 * poseidon2_A_57_3) + poseidon2_SUM_57))); tmp *= scaling_factor; std::get<248>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<249, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_59_0 - ((poseidon2_params_MU_0 * poseidon2_A_59_0) + poseidon2_SUM_59))); + (new_term.poseidon2_B_58_0 - ((poseidon2_params_MU_0 * poseidon2_A_58_0) + poseidon2_SUM_58))); tmp *= scaling_factor; std::get<249>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<250, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_59_1 - ((poseidon2_params_MU_1 * poseidon2_A_59_1) + poseidon2_SUM_59))); + (new_term.poseidon2_B_58_1 - ((poseidon2_params_MU_1 * poseidon2_A_58_1) + poseidon2_SUM_58))); tmp *= scaling_factor; std::get<250>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<251, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_59_2 - ((poseidon2_params_MU_2 * poseidon2_A_59_2) + poseidon2_SUM_59))); + (new_term.poseidon2_B_58_2 - ((poseidon2_params_MU_2 * poseidon2_A_58_2) + poseidon2_SUM_58))); tmp *= scaling_factor; std::get<251>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<252, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_B_59_3 - ((poseidon2_params_MU_3 * poseidon2_A_59_3) + poseidon2_SUM_59))); + (new_term.poseidon2_B_58_3 - ((poseidon2_params_MU_3 * poseidon2_A_58_3) + poseidon2_SUM_58))); tmp *= scaling_factor; std::get<252>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<253, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_T_60_4 - ((FF(4) * poseidon2_T_60_1) + poseidon2_T_60_3))); + (new_term.poseidon2_B_59_0 - ((poseidon2_params_MU_0 * poseidon2_A_59_0) + poseidon2_SUM_59))); tmp *= scaling_factor; std::get<253>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<254, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_T_60_5 - ((FF(4) * poseidon2_T_60_0) + poseidon2_T_60_2))); + (new_term.poseidon2_B_59_1 - ((poseidon2_params_MU_1 * poseidon2_A_59_1) + poseidon2_SUM_59))); tmp *= scaling_factor; std::get<254>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<255, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_T_60_6 - (poseidon2_T_60_3 + new_term.poseidon2_T_60_5))); + (new_term.poseidon2_B_59_2 - ((poseidon2_params_MU_2 * poseidon2_A_59_2) + poseidon2_SUM_59))); tmp *= scaling_factor; std::get<255>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<256, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_T_60_7 - (poseidon2_T_60_2 + new_term.poseidon2_T_60_4))); + (new_term.poseidon2_B_59_3 - ((poseidon2_params_MU_3 * poseidon2_A_59_3) + poseidon2_SUM_59))); tmp *= scaling_factor; std::get<256>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<257, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_T_61_4 - ((FF(4) * poseidon2_T_61_1) + poseidon2_T_61_3))); + (new_term.poseidon2_T_60_4 - ((FF(4) * poseidon2_T_60_1) + poseidon2_T_60_3))); tmp *= scaling_factor; std::get<257>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<258, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_T_61_5 - ((FF(4) * poseidon2_T_61_0) + poseidon2_T_61_2))); + (new_term.poseidon2_T_60_5 - ((FF(4) * poseidon2_T_60_0) + poseidon2_T_60_2))); tmp *= scaling_factor; std::get<258>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<259, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_T_61_6 - (poseidon2_T_61_3 + new_term.poseidon2_T_61_5))); + (new_term.poseidon2_T_60_6 - (poseidon2_T_60_3 + new_term.poseidon2_T_60_5))); tmp *= scaling_factor; std::get<259>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<260, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_T_61_7 - (poseidon2_T_61_2 + new_term.poseidon2_T_61_4))); + (new_term.poseidon2_T_60_7 - (poseidon2_T_60_2 + new_term.poseidon2_T_60_4))); tmp *= scaling_factor; std::get<260>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<261, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_T_62_4 - ((FF(4) * poseidon2_T_62_1) + poseidon2_T_62_3))); + (new_term.poseidon2_T_61_4 - ((FF(4) * poseidon2_T_61_1) + poseidon2_T_61_3))); tmp *= scaling_factor; std::get<261>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<262, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_T_62_5 - ((FF(4) * poseidon2_T_62_0) + poseidon2_T_62_2))); + (new_term.poseidon2_T_61_5 - ((FF(4) * poseidon2_T_61_0) + poseidon2_T_61_2))); tmp *= scaling_factor; std::get<262>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<263, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_T_62_6 - (poseidon2_T_62_3 + new_term.poseidon2_T_62_5))); + (new_term.poseidon2_T_61_6 - (poseidon2_T_61_3 + new_term.poseidon2_T_61_5))); tmp *= scaling_factor; std::get<263>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<264, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_T_62_7 - (poseidon2_T_62_2 + new_term.poseidon2_T_62_4))); + (new_term.poseidon2_T_61_7 - (poseidon2_T_61_2 + new_term.poseidon2_T_61_4))); tmp *= scaling_factor; std::get<264>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<265, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_T_63_4 - ((FF(4) * poseidon2_T_63_1) + poseidon2_T_63_3))); + (new_term.poseidon2_T_62_4 - ((FF(4) * poseidon2_T_62_1) + poseidon2_T_62_3))); tmp *= scaling_factor; std::get<265>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<266, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_T_63_5 - ((FF(4) * poseidon2_T_63_0) + poseidon2_T_63_2))); + (new_term.poseidon2_T_62_5 - ((FF(4) * poseidon2_T_62_0) + poseidon2_T_62_2))); tmp *= scaling_factor; std::get<266>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<267, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_T_63_6 - (poseidon2_T_63_3 + new_term.poseidon2_T_63_5))); + (new_term.poseidon2_T_62_6 - (poseidon2_T_62_3 + new_term.poseidon2_T_62_5))); tmp *= scaling_factor; std::get<267>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<268, ContainerOverSubrelations>; auto tmp = (new_term.poseidon2_sel_poseidon_perm * - (new_term.poseidon2_T_63_7 - (poseidon2_T_63_2 + new_term.poseidon2_T_63_4))); + (new_term.poseidon2_T_62_7 - (poseidon2_T_62_2 + new_term.poseidon2_T_62_4))); tmp *= scaling_factor; std::get<268>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<269, ContainerOverSubrelations>; - auto tmp = (new_term.poseidon2_sel_poseidon_perm * (new_term.poseidon2_b_0 - new_term.poseidon2_T_63_6)); + auto tmp = (new_term.poseidon2_sel_poseidon_perm * + (new_term.poseidon2_T_63_4 - ((FF(4) * poseidon2_T_63_1) + poseidon2_T_63_3))); tmp *= scaling_factor; std::get<269>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<270, ContainerOverSubrelations>; - auto tmp = (new_term.poseidon2_sel_poseidon_perm * (new_term.poseidon2_b_1 - new_term.poseidon2_T_63_5)); + auto tmp = (new_term.poseidon2_sel_poseidon_perm * + (new_term.poseidon2_T_63_5 - ((FF(4) * poseidon2_T_63_0) + poseidon2_T_63_2))); tmp *= scaling_factor; std::get<270>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<271, ContainerOverSubrelations>; - auto tmp = (new_term.poseidon2_sel_poseidon_perm * (new_term.poseidon2_b_2 - new_term.poseidon2_T_63_7)); + auto tmp = (new_term.poseidon2_sel_poseidon_perm * + (new_term.poseidon2_T_63_6 - (poseidon2_T_63_3 + new_term.poseidon2_T_63_5))); tmp *= scaling_factor; std::get<271>(evals) += typename Accumulator::View(tmp); } { using Accumulator = typename std::tuple_element_t<272, ContainerOverSubrelations>; - auto tmp = (new_term.poseidon2_sel_poseidon_perm * (new_term.poseidon2_b_3 - new_term.poseidon2_T_63_4)); + auto tmp = (new_term.poseidon2_sel_poseidon_perm * + (new_term.poseidon2_T_63_7 - (poseidon2_T_63_2 + new_term.poseidon2_T_63_4))); tmp *= scaling_factor; std::get<272>(evals) += typename Accumulator::View(tmp); } + { + using Accumulator = typename std::tuple_element_t<273, ContainerOverSubrelations>; + auto tmp = (new_term.poseidon2_sel_poseidon_perm * (new_term.poseidon2_b_0 - new_term.poseidon2_T_63_6)); + tmp *= scaling_factor; + std::get<273>(evals) += typename Accumulator::View(tmp); + } + { + using Accumulator = typename std::tuple_element_t<274, ContainerOverSubrelations>; + auto tmp = (new_term.poseidon2_sel_poseidon_perm * (new_term.poseidon2_b_1 - new_term.poseidon2_T_63_5)); + tmp *= scaling_factor; + std::get<274>(evals) += typename Accumulator::View(tmp); + } + { + using Accumulator = typename std::tuple_element_t<275, ContainerOverSubrelations>; + auto tmp = (new_term.poseidon2_sel_poseidon_perm * (new_term.poseidon2_b_2 - new_term.poseidon2_T_63_7)); + tmp *= scaling_factor; + std::get<275>(evals) += typename Accumulator::View(tmp); + } + { + using Accumulator = typename std::tuple_element_t<276, ContainerOverSubrelations>; + auto tmp = (new_term.poseidon2_sel_poseidon_perm * (new_term.poseidon2_b_3 - new_term.poseidon2_T_63_4)); + tmp *= scaling_factor; + std::get<276>(evals) += typename Accumulator::View(tmp); + } } }; diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/generated/relations/poseidon2_full.hpp b/barretenberg/cpp/src/barretenberg/vm/avm/generated/relations/poseidon2_full.hpp new file mode 100644 index 00000000000..28238677136 --- /dev/null +++ b/barretenberg/cpp/src/barretenberg/vm/avm/generated/relations/poseidon2_full.hpp @@ -0,0 +1,176 @@ +// AUTOGENERATED FILE +#pragma once + +#include "barretenberg/relations/relation_parameters.hpp" +#include "barretenberg/relations/relation_types.hpp" + +namespace bb::Avm_vm { + +template class poseidon2_fullImpl { + public: + using FF = FF_; + + static constexpr std::array SUBRELATION_PARTIAL_LENGTHS = { 3, 2, 3, 4, 4, 3, 3, 5, 3, + 3, 3, 6, 3, 6, 3, 6, 3, 6 }; + + template + void static accumulate(ContainerOverSubrelations& evals, + const AllEntities& new_term, + [[maybe_unused]] const RelationParameters&, + [[maybe_unused]] const FF& scaling_factor) + { + const auto poseidon2_full_TWOPOW64 = FF(uint256_t{ 0UL, 1UL, 0UL, 0UL }); + const auto poseidon2_full_IV = (poseidon2_full_TWOPOW64 * new_term.poseidon2_full_input_len); + const auto poseidon2_full_PADDED_LEN = (new_term.poseidon2_full_input_len + new_term.poseidon2_full_padding); + const auto poseidon2_full_NEXT_INPUT_IS_PREV_OUTPUT_SEL = + ((new_term.poseidon2_full_execute_poseidon_perm_shift * (FF(1) - new_term.poseidon2_full_start_poseidon)) * + (FF(1) - new_term.poseidon2_full_end_poseidon)); + + { + using Accumulator = typename std::tuple_element_t<0, ContainerOverSubrelations>; + auto tmp = (new_term.poseidon2_full_sel_poseidon * (FF(1) - new_term.poseidon2_full_sel_poseidon)); + tmp *= scaling_factor; + std::get<0>(evals) += typename Accumulator::View(tmp); + } + { + using Accumulator = typename std::tuple_element_t<1, ContainerOverSubrelations>; + auto tmp = (new_term.poseidon2_full_sel_poseidon - + (new_term.poseidon2_full_execute_poseidon_perm + new_term.poseidon2_full_end_poseidon)); + tmp *= scaling_factor; + std::get<1>(evals) += typename Accumulator::View(tmp); + } + { + using Accumulator = typename std::tuple_element_t<2, ContainerOverSubrelations>; + auto tmp = (new_term.poseidon2_full_start_poseidon * (FF(1) - new_term.poseidon2_full_start_poseidon)); + tmp *= scaling_factor; + std::get<2>(evals) += typename Accumulator::View(tmp); + } + { + using Accumulator = typename std::tuple_element_t<3, ContainerOverSubrelations>; + auto tmp = ((new_term.poseidon2_full_sel_poseidon_shift * (FF(1) - new_term.main_sel_first)) * + (new_term.poseidon2_full_start_poseidon_shift - new_term.poseidon2_full_end_poseidon)); + tmp *= scaling_factor; + std::get<3>(evals) += typename Accumulator::View(tmp); + } + { + using Accumulator = typename std::tuple_element_t<4, ContainerOverSubrelations>; + auto tmp = ((new_term.poseidon2_full_padding * (new_term.poseidon2_full_padding - FF(1))) * + (new_term.poseidon2_full_padding - FF(2))); + tmp *= scaling_factor; + std::get<4>(evals) += typename Accumulator::View(tmp); + } + { + using Accumulator = typename std::tuple_element_t<5, ContainerOverSubrelations>; + auto tmp = (new_term.poseidon2_full_start_poseidon * + (((new_term.poseidon2_full_num_perm_rounds_rem + FF(1)) * FF(3)) - poseidon2_full_PADDED_LEN)); + tmp *= scaling_factor; + std::get<5>(evals) += typename Accumulator::View(tmp); + } + { + using Accumulator = typename std::tuple_element_t<6, ContainerOverSubrelations>; + auto tmp = + (new_term.poseidon2_full_end_poseidon * (new_term.poseidon2_full_output - new_term.poseidon2_full_b_0)); + tmp *= scaling_factor; + std::get<6>(evals) += typename Accumulator::View(tmp); + } + { + using Accumulator = typename std::tuple_element_t<7, ContainerOverSubrelations>; + auto tmp = (new_term.poseidon2_full_sel_poseidon * + (((new_term.poseidon2_full_num_perm_rounds_rem * + ((new_term.poseidon2_full_end_poseidon * + (FF(1) - new_term.poseidon2_full_num_perm_rounds_rem_inv)) + + new_term.poseidon2_full_num_perm_rounds_rem_inv)) - + FF(1)) + + new_term.poseidon2_full_end_poseidon)); + tmp *= scaling_factor; + std::get<7>(evals) += typename Accumulator::View(tmp); + } + { + using Accumulator = typename std::tuple_element_t<8, ContainerOverSubrelations>; + auto tmp = (new_term.poseidon2_full_sel_poseidon * ((FF(1) - new_term.poseidon2_full_end_poseidon) - + new_term.poseidon2_full_execute_poseidon_perm)); + tmp *= scaling_factor; + std::get<8>(evals) += typename Accumulator::View(tmp); + } + { + using Accumulator = typename std::tuple_element_t<9, ContainerOverSubrelations>; + auto tmp = + (new_term.poseidon2_full_execute_poseidon_perm * + ((new_term.poseidon2_full_num_perm_rounds_rem_shift - new_term.poseidon2_full_num_perm_rounds_rem) + + FF(1))); + tmp *= scaling_factor; + std::get<9>(evals) += typename Accumulator::View(tmp); + } + { + using Accumulator = typename std::tuple_element_t<10, ContainerOverSubrelations>; + auto tmp = (new_term.poseidon2_full_start_poseidon * + (new_term.poseidon2_full_a_0 - new_term.poseidon2_full_input_0)); + tmp *= scaling_factor; + std::get<10>(evals) += typename Accumulator::View(tmp); + } + { + using Accumulator = typename std::tuple_element_t<11, ContainerOverSubrelations>; + auto tmp = ((new_term.poseidon2_full_sel_poseidon * poseidon2_full_NEXT_INPUT_IS_PREV_OUTPUT_SEL) * + ((new_term.poseidon2_full_a_0_shift - new_term.poseidon2_full_b_0) - + new_term.poseidon2_full_input_0_shift)); + tmp *= scaling_factor; + std::get<11>(evals) += typename Accumulator::View(tmp); + } + { + using Accumulator = typename std::tuple_element_t<12, ContainerOverSubrelations>; + auto tmp = (new_term.poseidon2_full_start_poseidon * + (new_term.poseidon2_full_a_1 - new_term.poseidon2_full_input_1)); + tmp *= scaling_factor; + std::get<12>(evals) += typename Accumulator::View(tmp); + } + { + using Accumulator = typename std::tuple_element_t<13, ContainerOverSubrelations>; + auto tmp = ((new_term.poseidon2_full_sel_poseidon * poseidon2_full_NEXT_INPUT_IS_PREV_OUTPUT_SEL) * + ((new_term.poseidon2_full_a_1_shift - new_term.poseidon2_full_b_1) - + new_term.poseidon2_full_input_1_shift)); + tmp *= scaling_factor; + std::get<13>(evals) += typename Accumulator::View(tmp); + } + { + using Accumulator = typename std::tuple_element_t<14, ContainerOverSubrelations>; + auto tmp = (new_term.poseidon2_full_start_poseidon * + (new_term.poseidon2_full_a_2 - new_term.poseidon2_full_input_2)); + tmp *= scaling_factor; + std::get<14>(evals) += typename Accumulator::View(tmp); + } + { + using Accumulator = typename std::tuple_element_t<15, ContainerOverSubrelations>; + auto tmp = ((new_term.poseidon2_full_sel_poseidon * poseidon2_full_NEXT_INPUT_IS_PREV_OUTPUT_SEL) * + ((new_term.poseidon2_full_a_2_shift - new_term.poseidon2_full_b_2) - + new_term.poseidon2_full_input_2_shift)); + tmp *= scaling_factor; + std::get<15>(evals) += typename Accumulator::View(tmp); + } + { + using Accumulator = typename std::tuple_element_t<16, ContainerOverSubrelations>; + auto tmp = (new_term.poseidon2_full_start_poseidon * (new_term.poseidon2_full_a_3 - poseidon2_full_IV)); + tmp *= scaling_factor; + std::get<16>(evals) += typename Accumulator::View(tmp); + } + { + using Accumulator = typename std::tuple_element_t<17, ContainerOverSubrelations>; + auto tmp = ((new_term.poseidon2_full_sel_poseidon * poseidon2_full_NEXT_INPUT_IS_PREV_OUTPUT_SEL) * + (new_term.poseidon2_full_a_3_shift - new_term.poseidon2_full_b_3)); + tmp *= scaling_factor; + std::get<17>(evals) += typename Accumulator::View(tmp); + } + } +}; + +template class poseidon2_full : public Relation> { + public: + static constexpr const char* NAME = "poseidon2_full"; + + static std::string get_subrelation_label(size_t index) + { + switch (index) {} + return std::to_string(index); + } +}; + +} // namespace bb::Avm_vm \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/tests/full_poseidon2.test.cpp b/barretenberg/cpp/src/barretenberg/vm/avm/tests/full_poseidon2.test.cpp new file mode 100644 index 00000000000..3083fc6d610 --- /dev/null +++ b/barretenberg/cpp/src/barretenberg/vm/avm/tests/full_poseidon2.test.cpp @@ -0,0 +1,106 @@ + +#include "barretenberg/common/thread.hpp" +#include "barretenberg/crypto/poseidon2/poseidon2.hpp" +#include "barretenberg/crypto/poseidon2/poseidon2_params.hpp" +#include "barretenberg/vm/avm/generated/circuit_builder.hpp" +#include "barretenberg/vm/avm/generated/flavor.hpp" +#include "barretenberg/vm/avm/generated/full_row.hpp" +#include "barretenberg/vm/avm/trace/fixed_powers.hpp" + +#include "barretenberg/vm/avm/trace/gadgets/poseidon2.hpp" +#include +#include + +namespace tests_avm { +using namespace bb; +using namespace bb::Avm_vm; + +TEST(AvmFullPoseidon2, shouldHashCorrectly) +{ + + using FF = AvmFlavor::FF; + constexpr size_t TRACE_SIZE = 1 << 8; + + std::vector> trace(TRACE_SIZE); + + bb::avm_trace::AvmPoseidon2TraceBuilder poseidon2_builder; + std::cerr << "Generating trace of size " << TRACE_SIZE << "..." << std::endl; + + // Create a bunch of random elements and hash them. + size_t num_elems = 10; + std::vector random_elems; + for (uint32_t i = 0; i < 8; ++i) { + for (size_t i = 0; i < num_elems; ++i) { + random_elems.push_back(FF::random_element()); + } + FF builder_result = poseidon2_builder.poseidon2_hash(random_elems, i); + FF expected_result = crypto::Poseidon2::hash(random_elems); + EXPECT_EQ(builder_result, expected_result); + } + + poseidon2_builder.finalize_full(trace); + auto finalised_builder = poseidon2_builder.finalize(); + for (size_t i = 0; i < finalised_builder.size(); i++) { + auto& dest = trace.at(i); + auto const& src = finalised_builder.at(i); + dest.poseidon2_clk = FF(src.clk); + merge_into(dest, src); + } + + trace.insert(trace.begin(), bb::AvmFullRow{ .main_sel_first = FF(1), .mem_lastAccess = FF(1) }); + // We build the polynomials needed to run "sumcheck". + AvmCircuitBuilder cb; + cb.set_trace(std::move(trace)); + auto polys = cb.compute_polynomials(); + const size_t num_rows = polys.get_polynomial_size(); + std::cerr << "Done computing polynomials..." << std::endl; + + std::cerr << "Accumulating relations..." << std::endl; + using Relation = Avm_vm::poseidon2_full; + + typename Relation::SumcheckArrayOfValuesOverSubrelations result; + for (auto& r : result) { + r = 0; + } + + // We set the conditions up there. + for (size_t r = 0; r < num_rows; ++r) { + Relation::accumulate(result, polys.get_row(r), {}, 1); + } + + for (size_t j = 0; j < result.size(); ++j) { + if (result[j] != 0) { + EXPECT_EQ(result[j], 0) << "Relation " << Relation::NAME << " subrelation " + << Relation::get_subrelation_label(j) << " was expected to be zero."; + } + } + + std::cerr << "Accumulating permutation relations..." << std::endl; + + const FF gamma = FF::random_element(); + const FF beta = FF::random_element(); + bb::RelationParameters params{ + .beta = beta, + .gamma = gamma, + }; + using PermRelations = perm_pos2_fixed_pos2_perm_relation; + + // Check the logderivative relation + bb::compute_logderivative_inverse(polys, params, num_rows); + + typename PermRelations::SumcheckArrayOfValuesOverSubrelations lookup_result; + + for (auto& r : lookup_result) { + r = 0; + } + for (size_t r = 0; r < num_rows; ++r) { + PermRelations::accumulate(lookup_result, polys.get_row(r), params, 1); + } + for (const auto& j : lookup_result) { + if (j != 0) { + EXPECT_EQ(j, 0) << "Lookup Relation " << PermRelations::NAME << " subrelation "; + } + } +} + +} // namespace tests_avm diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/tests/fuzz_skippable.test.cpp b/barretenberg/cpp/src/barretenberg/vm/avm/tests/fuzz_skippable.test.cpp index 15b13751168..6dc6e89bac7 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/tests/fuzz_skippable.test.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/tests/fuzz_skippable.test.cpp @@ -37,6 +37,8 @@ TEST(AvmSkippableTests, shouldSkipCorrectly) // Set the conditions for skippable to return true. row.poseidon2_sel_poseidon_perm = 0; + row.poseidon2_sel_poseidon_perm_mem_op = 0; + row.poseidon2_sel_poseidon_perm_immediate = 0; }); // We build the polynomials needed to run "sumcheck". diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/trace/gadgets/poseidon2.cpp b/barretenberg/cpp/src/barretenberg/vm/avm/trace/gadgets/poseidon2.cpp index 6092061f0c6..c62bc633439 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/trace/gadgets/poseidon2.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/trace/gadgets/poseidon2.cpp @@ -1,8 +1,11 @@ #include "barretenberg/vm/avm/trace/gadgets/poseidon2.hpp" +#include "barretenberg/crypto/poseidon2/poseidon2.hpp" #include "barretenberg/crypto/poseidon2/poseidon2_permutation.hpp" +#include "barretenberg/ecc/curves/bn254/fr.hpp" #include "barretenberg/vm/avm/trace/common.hpp" namespace bb::avm_trace { +using Poseidon2 = crypto::Poseidon2Permutation; std::vector AvmPoseidon2TraceBuilder::finalize() { @@ -15,16 +18,12 @@ void AvmPoseidon2TraceBuilder::reset() poseidon2_trace.shrink_to_fit(); // Reclaim memory. } -std::array AvmPoseidon2TraceBuilder::poseidon2_permutation(std::array const& input, - uint32_t clk, - uint32_t input_addr, - uint32_t output_addr) +AvmPoseidon2TraceBuilder::Poseidon2TraceEntry gen_poseidon_perm_entry(std::array const& input, uint32_t clk) { // Currently we commit to intermediate round values, changes to codegen might reduce the number of committed polys // This is lifted from bb::poeidon2, we need to extract the intermediate round values here. using State = std::array; - using Poseidon2 = crypto::Poseidon2Permutation; std::array interm_round_vals; State current_state(input); @@ -61,10 +60,106 @@ std::array AvmPoseidon2TraceBuilder::poseidon2_permutation(std::array AvmPoseidon2TraceBuilder::poseidon2_permutation(std::array const& input, + uint32_t clk, + uint32_t input_addr, + uint32_t output_addr) +{ + auto entry = gen_poseidon_perm_entry(input, clk); + entry.input_addr = input_addr; + entry.output_addr = output_addr; + entry.is_mem_op = true; + poseidon2_trace.push_back(entry); + + return entry.output; } +FF AvmPoseidon2TraceBuilder::poseidon2_hash(std::vector input, uint32_t clk) +{ + using Poseidon2 = crypto::Poseidon2; + FF output = Poseidon2::hash(input); + // 64 rounds of hashing should be enough (1 << 6 == 64) per full hash + auto entry_clk = clk << 6; + // Add the full hash trace event + poseidon2_hash_trace.push_back(Poseidon2FullTraceEntry{ + .clk = entry_clk, + .input = input, + .output = output, + .input_length = input.size(), + }); + + const FF iv = (static_cast(input.size()) << 64); + std::array input_array = { 0, 0, 0, iv }; + + size_t padded_size = input.size() % 3 == 0 ? input.size() : input.size() + (3 - input.size() % 3); + input.resize(padded_size, FF::zero()); + for (size_t i = 0; i < input.size(); i += 3) { + input_array[0] += input[i]; + input_array[1] += input[i + 1]; + input_array[2] += input[i + 2]; + + auto entry_idx = entry_clk + (i / 3); + auto entry = gen_poseidon_perm_entry(input_array, static_cast(entry_idx)); + entry.is_immediate = true; + poseidon2_trace.push_back(entry); + input_array = entry.output; + } + return output; +} + +void AvmPoseidon2TraceBuilder::finalize_full(std::vector>& main_trace) +{ + size_t main_trace_counter = 0; + + for (const auto& src : poseidon2_hash_trace) { + size_t padded_size = + src.input_length % 3 == 0 ? src.input_length : src.input_length + (3 - src.input_length % 3); + auto num_rounds = padded_size / 3; + auto num_rounds_rem = num_rounds - 1; + // Get the permutation event associated with the first round of the full hash + auto perm_event = std::find_if( + poseidon2_trace.begin(), poseidon2_trace.end(), [src](auto const& entry) { return entry.clk == src.clk; }); + ASSERT(perm_event != poseidon2_trace.end()); // "Could not find corresponding permutation event" + + for (size_t j = 0; j < num_rounds; j++) { + auto& dest = main_trace.at(main_trace_counter++); + dest.poseidon2_full_input_len = src.input_length; + dest.poseidon2_full_sel_poseidon = FF::one(); + dest.poseidon2_full_clk = src.clk + j; + dest.poseidon2_full_input_0 = src.input[3 * j]; + dest.poseidon2_full_input_1 = src.input[3 * j + 1]; + dest.poseidon2_full_input_2 = src.input[3 * j + 2]; + dest.poseidon2_full_output = src.output; + dest.poseidon2_full_num_perm_rounds_rem = num_rounds_rem; + dest.poseidon2_full_padding = padded_size - src.input_length; + dest.poseidon2_full_num_perm_rounds_rem_inv = num_rounds_rem == 0 ? 0 : FF(num_rounds_rem).invert(); + + dest.poseidon2_full_a_0 = perm_event->input[0]; + dest.poseidon2_full_a_1 = perm_event->input[1]; + dest.poseidon2_full_a_2 = perm_event->input[2]; + dest.poseidon2_full_a_3 = perm_event->input[3]; + dest.poseidon2_full_b_0 = perm_event->output[0]; + dest.poseidon2_full_b_1 = perm_event->output[1]; + dest.poseidon2_full_b_2 = perm_event->output[2]; + dest.poseidon2_full_b_3 = perm_event->output[3]; + + if (j == 0) { + dest.poseidon2_full_start_poseidon = FF::one(); + } + if (num_rounds_rem == 0) { + dest.poseidon2_full_end_poseidon = FF::one(); + } else { + dest.poseidon2_full_execute_poseidon_perm = FF::one(); + num_rounds_rem--; + } + // Careful - we assume here that the permutation events are in order + std::advance(perm_event, 1); + } + } +} } // namespace bb::avm_trace diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/trace/gadgets/poseidon2.hpp b/barretenberg/cpp/src/barretenberg/vm/avm/trace/gadgets/poseidon2.hpp index 7953b2a3a6e..821713bc1d0 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/trace/gadgets/poseidon2.hpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/trace/gadgets/poseidon2.hpp @@ -11,14 +11,24 @@ namespace bb::avm_trace { class AvmPoseidon2TraceBuilder { public: + struct Poseidon2FullTraceEntry { + uint32_t clk = 0; + std::vector input; + FF output; + size_t input_length = 0; + }; struct Poseidon2TraceEntry { uint32_t clk = 0; std::array input; std::array output; std::array first_ext; std::array, 64> interm_round_vals; - uint32_t input_addr; - uint32_t output_addr; + uint32_t input_addr = 0; + uint32_t output_addr = 0; + // If we are using the permutation gadget internally (no mem access) + bool is_immediate = false; + // If we are using the permutation gadget against mem offsets + bool is_mem_op = false; }; AvmPoseidon2TraceBuilder() = default; @@ -30,9 +40,13 @@ class AvmPoseidon2TraceBuilder { uint32_t clk, uint32_t input_addr, uint32_t output_addr); + FF poseidon2_hash(std::vector input, uint32_t clk); + // Finalize for the full poseidon hash + void finalize_full(std::vector>& main_trace); private: std::vector poseidon2_trace; + std::vector poseidon2_hash_trace; }; template void merge_into(DestRow& dest, const AvmPoseidon2TraceBuilder::Poseidon2TraceEntry& src) @@ -57,6 +71,8 @@ template void merge_into(DestRow& dest, const AvmPoseidon2Tra dest.poseidon2_mem_addr_write_c = src.output_addr + 2; dest.poseidon2_mem_addr_write_d = src.output_addr + 3; dest.poseidon2_sel_poseidon_perm = FF(1); + dest.poseidon2_sel_poseidon_perm_immediate = src.is_immediate ? FF(1) : FF(0); + dest.poseidon2_sel_poseidon_perm_mem_op = src.is_mem_op ? FF(1) : FF(0); // First Ext Round dest.poseidon2_EXT_LAYER_6 = src.first_ext[0]; dest.poseidon2_EXT_LAYER_5 = src.first_ext[1]; diff --git a/barretenberg/cpp/src/barretenberg/vm/aztec_constants.hpp b/barretenberg/cpp/src/barretenberg/vm/aztec_constants.hpp index e86b21518a8..56282bd856e 100644 --- a/barretenberg/cpp/src/barretenberg/vm/aztec_constants.hpp +++ b/barretenberg/cpp/src/barretenberg/vm/aztec_constants.hpp @@ -35,7 +35,7 @@ #define PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH 691 #define PUBLIC_CONTEXT_INPUTS_LENGTH 42 #define AVM_VERIFICATION_KEY_LENGTH_IN_FIELDS 86 -#define AVM_PROOF_LENGTH_IN_FIELDS 3848 +#define AVM_PROOF_LENGTH_IN_FIELDS 3979 #define AVM_PUBLIC_COLUMN_MAX_SIZE 1024 #define AVM_PUBLIC_INPUTS_FLATTENED_SIZE 2739 #define MEM_TAG_U1 1 diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/constants.nr b/noir-projects/noir-protocol-circuits/crates/types/src/constants.nr index b4871c87ac1..c7976002c23 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/constants.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/constants.nr @@ -330,7 +330,7 @@ global AVM_VERIFICATION_KEY_LENGTH_IN_FIELDS: u32 = 2 + 21 * 4; // `AVM_PROOF_LENGTH_IN_FIELDS` must be updated when AVM circuit changes. // To determine latest value, hover `COMPUTED_AVM_PROOF_LENGTH_IN_FIELDS` // in barretenberg/cpp/src/barretenberg/vm/avm/generated/flavor.hpp -global AVM_PROOF_LENGTH_IN_FIELDS: u32 = 3848; +global AVM_PROOF_LENGTH_IN_FIELDS: u32 = 3979; global AVM_PUBLIC_COLUMN_MAX_SIZE : u32 = 1024; global AVM_PUBLIC_INPUTS_FLATTENED_SIZE : u32 = 2 * AVM_PUBLIC_COLUMN_MAX_SIZE + PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH; /** diff --git a/yarn-project/circuits.js/src/constants.gen.ts b/yarn-project/circuits.js/src/constants.gen.ts index d0825bf30ce..46227e76215 100644 --- a/yarn-project/circuits.js/src/constants.gen.ts +++ b/yarn-project/circuits.js/src/constants.gen.ts @@ -215,7 +215,7 @@ export const NESTED_RECURSIVE_PROOF_LENGTH = 463; export const TUBE_PROOF_LENGTH = 463; export const VERIFICATION_KEY_LENGTH_IN_FIELDS = 128; export const AVM_VERIFICATION_KEY_LENGTH_IN_FIELDS = 86; -export const AVM_PROOF_LENGTH_IN_FIELDS = 3848; +export const AVM_PROOF_LENGTH_IN_FIELDS = 3979; export const AVM_PUBLIC_COLUMN_MAX_SIZE = 1024; export const AVM_PUBLIC_INPUTS_FLATTENED_SIZE = 2739; export const MEM_TAG_U1 = 1;