diff --git a/barretenberg/cpp/pil/vm2/execution.pil b/barretenberg/cpp/pil/vm2/execution.pil index 09327d89d1e9..cfebd9038628 100644 --- a/barretenberg/cpp/pil/vm2/execution.pil +++ b/barretenberg/cpp/pil/vm2/execution.pil @@ -6,8 +6,7 @@ include "keccakf1600.pil"; include "precomputed.pil"; include "sha256.pil"; include "ecc.pil"; -include "poseidon2_hash.pil"; -include "poseidon2_perm.pil"; +include "poseidon2_mem.pil"; include "scalar_mul.pil"; include "to_radix.pil"; include "ff_gt.pil"; diff --git a/barretenberg/cpp/pil/vm2/poseidon2_mem.pil b/barretenberg/cpp/pil/vm2/poseidon2_mem.pil new file mode 100644 index 000000000000..805ca90b89c8 --- /dev/null +++ b/barretenberg/cpp/pil/vm2/poseidon2_mem.pil @@ -0,0 +1,240 @@ +include "poseidon2_perm.pil"; +include "constants_gen.pil"; +include "precomputed.pil"; +include "execution.pil"; +include "gt.pil"; + +/** + * This handles the memory reads/writes when the POSEIDON2PERM opcode is executed + * by user code. The inputs to the opcode are the src and dst memory addresses. + * This trace will read inputs from addresses { src, src + 1, src + 2, src + 3 } + * and write the result to addresses { dst, dst + 1, dst + 2, dst + 3 }. + * ERROR HANDLING: + * There are two errors that need to be handled as part of this trace + * (1) MEM_OUT_OF_BOUNDS_ACCESS: If the reads or writes would access a memory address + * outside of the max AVM memory address (AVM_HIGHEST_MEM_ADDRESS). + * (2) INVALID_READ_MEM_TAG: If any value that is read is not of type Field. + * + * N.B This subtrace will load the values directly into a row, (i.e. 4 input cols) + * As a result of this, error (2) can only be captured after all 4 reads are performed + * this is because gating each subsequent read would be expensive. + * + * This subtrace is connected to the poseidon2_perm subtrace via a lookup. + * Note that the poseidon2_perm subtrace is also used extensively by other + * subtraces internally (e.g. merkle check, bytecode/calldata hashing, etc). + * This trace will be empty in those interactions. + */ + +namespace poseidon2_perm_mem; + + pol commit sel; + + #[skippable_if] + sel = 0; + + pol commit execution_clk; + pol commit space_id; + pol commit read_address[4]; + pol commit write_address[4]; + + #[READ_ADDR_INCR] + read_address[1] = sel * (read_address[0] + 1); + read_address[2] = sel * (read_address[0] + 2); + read_address[3] = sel * (read_address[0] + 3); // This is the max read addr + + #[WRITE_ADDR_INCR] + write_address[1] = sel * (write_address[0] + 1); + write_address[2] = sel * (write_address[0] + 2); + write_address[3] = sel * (write_address[0] + 3); // This is the max write addr + + //////////////////////////////////////////////// + // Error Handling - Out of Range Memory Access + //////////////////////////////////////////////// + pol commit sel_src_out_of_range_err; + sel_src_out_of_range_err * (1 - sel_src_out_of_range_err) = 0; + pol commit sel_dst_out_of_range_err; + sel_dst_out_of_range_err * (1 - sel_dst_out_of_range_err) = 0; + + // Use the comparison gadget to check that the max addresses are within range + // The comparison gadget provides the ability to test GreaterThan so we check + // (1) read_address[3] > max_mem_addr + // (2) write_address[3] > max_mem_addr + pol commit max_mem_addr; + sel * (max_mem_addr - constants.AVM_HIGHEST_MEM_ADDRESS) = 0; + #[CHECK_SRC_ADDR_IN_RANGE] + sel { read_address[3], max_mem_addr, sel_src_out_of_range_err } + in + gt.sel { gt.input_a, gt.input_b, gt.res }; + + #[CHECK_DST_ADDR_IN_RANGE] + sel { write_address[3], max_mem_addr, sel_dst_out_of_range_err } + in + gt.sel { gt.input_a, gt.input_b, gt.res }; + + //////////////////////////////////////////////// + // Read from memory into input columns + //////////////////////////////////////////////// + pol commit input[4]; + pol commit input_tag[4]; + pol commit sel_should_read_mem; + sel_should_read_mem = sel * (1 - sel_src_out_of_range_err) * (1 - sel_dst_out_of_range_err); + + // TODO: These need to be changed to permutations once we have the custom permutation selectors impl + #[POS_READ_MEM_0] + sel_should_read_mem { + execution_clk, read_address[0], + input[0], input_tag[0], + space_id, /*rw=*/ precomputed.zero + } in + memory.sel { + memory.clk, memory.address, + memory.value, memory.tag, + memory.space_id, memory.rw + }; + + #[POS_READ_MEM_1] + sel_should_read_mem { + execution_clk, read_address[1], + input[1], input_tag[1], + space_id, /*rw=*/ precomputed.zero + } in + memory.sel { + memory.clk, memory.address, + memory.value, memory.tag, + memory.space_id, memory.rw + }; + + #[POS_READ_MEM_2] + sel_should_read_mem { + execution_clk, read_address[2], + input[2], input_tag[2], + space_id, /*rw=*/ precomputed.zero + } in + memory.sel { + memory.clk, memory.address, + memory.value, memory.tag, + memory.space_id, memory.rw + }; + + #[POS_READ_MEM_3] + sel_should_read_mem { + execution_clk, read_address[3], + input[3], input_tag[3], + space_id, /*rw=*/ precomputed.zero + } in + memory.sel { + memory.clk, memory.address, + memory.value, memory.tag, + memory.space_id, memory.rw + }; + + //////////////////////////////////////////////// + // Error Handling - Invalid Input Tag (not FF) + //////////////////////////////////////////////// + pol commit sel_invalid_tag_err; + pol INPUT_TAG_DIFF_0 = input_tag[0] - constants.MEM_TAG_FF; + pol INPUT_TAG_DIFF_1 = input_tag[1] - constants.MEM_TAG_FF; + pol INPUT_TAG_DIFF_2 = input_tag[2] - constants.MEM_TAG_FF; + pol INPUT_TAG_DIFF_3 = input_tag[3] - constants.MEM_TAG_FF; + + pol BATCHED_TAG_CHECK = 2**0 * INPUT_TAG_DIFF_0 + 2**3 * INPUT_TAG_DIFF_1 + + 2**6 * INPUT_TAG_DIFF_2 + 2**9 * INPUT_TAG_DIFF_3; + + pol commit batch_tag_inv; + // BATCHED_TAG_CHECK != 0, sel_invalid_tag_err = 1 + #[BATCH_ZERO_CHECK] + BATCHED_TAG_CHECK * ((1 - sel_invalid_tag_err) * (1 - batch_tag_inv) + batch_tag_inv) - sel_invalid_tag_err = 0; + + // Consolidated error flag + pol commit err; + err = 1 - (1 - sel_src_out_of_range_err) * (1 - sel_dst_out_of_range_err) * (1 - sel_invalid_tag_err); + + /////////////////////////////////////////////////////////////////////// + // Dispatch inputs to poseidon2 permutation trace and retrieve outputs + /////////////////////////////////////////////////////////////////////// + pol commit output[4]; + pol commit sel_should_exec; + sel_should_exec = sel * (1 - err); + + // TODO: Rename a's and b's to use array notation in poseidon2_perm.pil + #[INPUT_OUTPUT_POSEIDON2_PERM] + sel_should_exec { + input[0], input[1], input[2], input[3], + output[0], output[1], output[2], output[3] + } in + poseidon2_perm.sel { + poseidon2_perm.a_0, poseidon2_perm.a_1, poseidon2_perm.a_2, poseidon2_perm.a_3, + poseidon2_perm.b_0, poseidon2_perm.b_1, poseidon2_perm.b_2, poseidon2_perm.b_3 + }; + + //////////////////////////////////////////////// + // Write output to memory + //////////////////////////////////////////////// + // TODO: These need to be changed to permutations once we have the custom permutation selectors + #[POS_WRITE_MEM_0] + sel_should_exec { + execution_clk, write_address[0], + output[0], /*FF_mem_tag*/ precomputed.zero, + space_id, /*rw=1*/ sel_should_exec + } in + memory.sel { + memory.clk, memory.address, + memory.value, memory.tag, + memory.space_id, memory.rw + }; + + #[POS_WRITE_MEM_1] + sel_should_exec { + execution_clk, write_address[1], + output[1], /*FF_mem_tag*/ precomputed.zero, + space_id, /*rw=1*/ sel_should_exec + } in + memory.sel { + memory.clk, memory.address, + memory.value, memory.tag, + memory.space_id, memory.rw + }; + + #[POS_WRITE_MEM_2] + sel_should_exec { + execution_clk, write_address[2], + output[2], /*FF_mem_tag*/ precomputed.zero, + space_id, /*rw=1*/ sel_should_exec + } in + memory.sel { + memory.clk, memory.address, + memory.value, memory.tag, + memory.space_id, memory.rw + }; + + #[POS_WRITE_MEM_3] + sel_should_exec { + execution_clk, write_address[3], + output[3], /*FF_mem_tag*/ precomputed.zero, + space_id, /*rw=1*/ sel_should_exec + } in + memory.sel { + memory.clk, memory.address, + memory.value, memory.tag, + memory.space_id, memory.rw + }; + + //////////////////////////////////////////////// + // Dispatch from execution trace + //////////////////////////////////////////////// + #[DISPATCH_EXEC_POS2] + execution.sel_execute_poseidon2_perm { + precomputed.clk, + execution.context_id, + execution.rop[0], + execution.rop[1], + execution.sel_opcode_error + } is + sel { + execution_clk, + space_id, + read_address[0], + write_address[0], + err + }; + diff --git a/barretenberg/cpp/src/barretenberg/vm2/common/instruction_spec.cpp b/barretenberg/cpp/src/barretenberg/vm2/common/instruction_spec.cpp index 1d5f66fe40fc..04568a204f8a 100644 --- a/barretenberg/cpp/src/barretenberg/vm2/common/instruction_spec.cpp +++ b/barretenberg/cpp/src/barretenberg/vm2/common/instruction_spec.cpp @@ -596,6 +596,9 @@ const std::unordered_map EXEC_INSTRUCTION_ .register_info = RegisterInfo() .add_inputs({ /*msg_hash*/ ValueTag::FF, /*leaf_index*/ ValueTag::U64 }) .add_output(/*exists*/) } }, + { ExecutionOpCode::POSEIDON2PERM, + { .num_addresses = 2, + .gas_cost = { .opcode_gas = AVM_POSEIDON2_BASE_L2_GAS, .base_da = 0, .dyn_l2 = 0, .dyn_da = 0 } } }, }; } // namespace bb::avm2 diff --git a/barretenberg/cpp/src/barretenberg/vm2/constraining/relations/address_derivation.test.cpp b/barretenberg/cpp/src/barretenberg/vm2/constraining/relations/address_derivation.test.cpp index c0feb40982d9..ce6c9fb8c6e7 100644 --- a/barretenberg/cpp/src/barretenberg/vm2/constraining/relations/address_derivation.test.cpp +++ b/barretenberg/cpp/src/barretenberg/vm2/constraining/relations/address_derivation.test.cpp @@ -13,6 +13,8 @@ #include "barretenberg/vm2/simulation/events/ecc_events.hpp" #include "barretenberg/vm2/simulation/events/event_emitter.hpp" #include "barretenberg/vm2/simulation/lib/contract_crypto.hpp" +#include "barretenberg/vm2/simulation/testing/mock_execution_id_manager.hpp" +#include "barretenberg/vm2/simulation/testing/mock_gt.hpp" #include "barretenberg/vm2/simulation/to_radix.hpp" #include "barretenberg/vm2/testing/fixtures.hpp" #include "barretenberg/vm2/tracegen/address_derivation_trace.hpp" @@ -24,6 +26,9 @@ namespace bb::avm2::constraining { namespace { +using ::testing::Return; +using ::testing::StrictMock; + using tracegen::AddressDerivationTraceBuilder; using tracegen::EccTraceBuilder; using tracegen::Poseidon2TraceBuilder; @@ -36,10 +41,13 @@ using simulation::Ecc; using simulation::EccAddEvent; using simulation::EventEmitter; using simulation::hash_public_keys; +using simulation::MockExecutionIdManager; +using simulation::MockGreaterThan; using simulation::NoopEventEmitter; using simulation::Poseidon2; using simulation::Poseidon2HashEvent; using simulation::Poseidon2PermutationEvent; +using simulation::Poseidon2PermutationMemoryEvent; using simulation::ScalarMulEvent; using simulation::ToRadix; using simulation::ToRadixEvent; @@ -98,11 +106,18 @@ TEST(AddressDerivationConstrainingTest, WithInteractions) EventEmitter scalar_mul_event_emitter; EventEmitter hash_event_emitter; NoopEventEmitter perm_event_emitter; + NoopEventEmitter perm_mem_event_emitter; EventEmitter address_derivation_event_emitter; ToRadix to_radix_simulator(to_radix_event_emitter); Ecc ecc_simulator(to_radix_simulator, ecadd_event_emitter, scalar_mul_event_emitter); - Poseidon2 poseidon2_simulator(hash_event_emitter, perm_event_emitter); + + StrictMock mock_exec_id_manager; + EXPECT_CALL(mock_exec_id_manager, get_execution_id) + .WillRepeatedly(Return(0)); // Use a fixed execution ID for the test + StrictMock mock_gt; + Poseidon2 poseidon2_simulator( + mock_exec_id_manager, mock_gt, hash_event_emitter, perm_event_emitter, perm_mem_event_emitter); AddressDerivation address_derivation(poseidon2_simulator, ecc_simulator, address_derivation_event_emitter); diff --git a/barretenberg/cpp/src/barretenberg/vm2/constraining/relations/bc_hashing.test.cpp b/barretenberg/cpp/src/barretenberg/vm2/constraining/relations/bc_hashing.test.cpp index 5462edcbf57e..e54bc4386245 100644 --- a/barretenberg/cpp/src/barretenberg/vm2/constraining/relations/bc_hashing.test.cpp +++ b/barretenberg/cpp/src/barretenberg/vm2/constraining/relations/bc_hashing.test.cpp @@ -13,6 +13,8 @@ #include "barretenberg/vm2/generated/relations/poseidon2_hash.hpp" #include "barretenberg/vm2/simulation/lib/contract_crypto.hpp" #include "barretenberg/vm2/simulation/poseidon2.hpp" +#include "barretenberg/vm2/simulation/testing/mock_execution_id_manager.hpp" +#include "barretenberg/vm2/simulation/testing/mock_gt.hpp" #include "barretenberg/vm2/testing/fixtures.hpp" #include "barretenberg/vm2/testing/macros.hpp" #include "barretenberg/vm2/tracegen/bytecode_trace.hpp" @@ -24,12 +26,23 @@ namespace bb::avm2::constraining { namespace { +using ::testing::Return; +using ::testing::StrictMock; + using testing::random_bytes; using testing::random_fields; +using simulation::EventEmitter; +using simulation::MockExecutionIdManager; +using simulation::MockGreaterThan; +using simulation::Poseidon2; +using simulation::Poseidon2HashEvent; +using simulation::Poseidon2PermutationEvent; +using simulation::Poseidon2PermutationMemoryEvent; using tracegen::BytecodeTraceBuilder; using tracegen::Poseidon2TraceBuilder; using tracegen::TestTraceContainer; + using FF = AvmFlavorSettings::FF; using C = Column; using bc_hashing = bb::avm2::bc_hashing; @@ -70,9 +83,18 @@ TEST(BytecodeHashingConstrainingTest, MultipleBytecodeHash) TEST(BytecodeHashingConstrainingTest, PoseidonInteractions) { - simulation::EventEmitter hash_event_emitter; - simulation::EventEmitter perm_event_emitter; - simulation::Poseidon2 poseidon2(hash_event_emitter, perm_event_emitter); + EventEmitter hash_event_emitter; + EventEmitter perm_event_emitter; + EventEmitter perm_mem_event_emitter; + + StrictMock mock_gt; + StrictMock mock_execution_id_manager; + EXPECT_CALL(mock_execution_id_manager, get_execution_id) + .WillRepeatedly(Return(0)); // Use a fixed execution ID for the test + + Poseidon2 poseidon2( + mock_execution_id_manager, mock_gt, hash_event_emitter, perm_event_emitter, perm_mem_event_emitter); + TestTraceContainer trace({ { { C::precomputed_first_row, 1 } }, }); diff --git a/barretenberg/cpp/src/barretenberg/vm2/constraining/relations/class_id_derivation.test.cpp b/barretenberg/cpp/src/barretenberg/vm2/constraining/relations/class_id_derivation.test.cpp index 19c5aad031f6..f58511aa7d11 100644 --- a/barretenberg/cpp/src/barretenberg/vm2/constraining/relations/class_id_derivation.test.cpp +++ b/barretenberg/cpp/src/barretenberg/vm2/constraining/relations/class_id_derivation.test.cpp @@ -10,6 +10,9 @@ #include "barretenberg/vm2/simulation/class_id_derivation.hpp" #include "barretenberg/vm2/simulation/events/event_emitter.hpp" #include "barretenberg/vm2/simulation/lib/contract_crypto.hpp" +#include "barretenberg/vm2/simulation/testing/fakes/fake_poseidon2.hpp" +#include "barretenberg/vm2/simulation/testing/mock_execution_id_manager.hpp" +#include "barretenberg/vm2/simulation/testing/mock_gt.hpp" #include "barretenberg/vm2/testing/fixtures.hpp" #include "barretenberg/vm2/tracegen/bytecode_trace.hpp" #include "barretenberg/vm2/tracegen/class_id_derivation_trace.hpp" @@ -19,6 +22,8 @@ namespace bb::avm2::constraining { namespace { +using ::testing::StrictMock; + using tracegen::BytecodeTraceBuilder; using tracegen::ClassIdDerivationTraceBuilder; using tracegen::Poseidon2TraceBuilder; @@ -28,10 +33,14 @@ using simulation::ClassIdDerivation; using simulation::ClassIdDerivationEvent; using simulation::compute_contract_class_id; using simulation::EventEmitter; +using simulation::FakePoseidon2; +using simulation::MockExecutionIdManager; +using simulation::MockGreaterThan; using simulation::NoopEventEmitter; using simulation::Poseidon2; using simulation::Poseidon2HashEvent; using simulation::Poseidon2PermutationEvent; +using simulation::Poseidon2PermutationMemoryEvent; using FF = AvmFlavorSettings::FF; using C = Column; @@ -65,11 +74,15 @@ TEST(ClassIdDerivationConstrainingTest, Basic) check_relation(trace); } -TEST(ClassIdDerivationConstrainingTest, WithHashInteraction) +TEST(ClassIdDerivationPoseidonTest, WithHashInteraction) { EventEmitter hash_event_emitter; - EventEmitter perm_event_emitter; - Poseidon2 poseidon2(hash_event_emitter, perm_event_emitter); + NoopEventEmitter perm_event_emitter; + NoopEventEmitter perm_mem_event_emitter; + StrictMock execution_id_manager; + StrictMock mock_gt; + Poseidon2 poseidon2 = + Poseidon2(execution_id_manager, mock_gt, hash_event_emitter, perm_event_emitter, perm_mem_event_emitter); EventEmitter event_emitter; ClassIdDerivation class_id_derivation(poseidon2, event_emitter); @@ -96,11 +109,9 @@ TEST(ClassIdDerivationConstrainingTest, WithHashInteraction) } // TODO: This should probably be refined and moved to bc_retrieval test file once that exists -TEST(ClassIdDerivationConstrainingTest, WithRetrievalInteraction) +TEST(ClassIdDerivationPoseidonTest, WithRetrievalInteraction) { - NoopEventEmitter hash_event_emitter; - NoopEventEmitter perm_event_emitter; - Poseidon2 poseidon2(hash_event_emitter, perm_event_emitter); + FakePoseidon2 poseidon2 = FakePoseidon2(); EventEmitter event_emitter; ClassIdDerivation class_id_derivation(poseidon2, event_emitter); diff --git a/barretenberg/cpp/src/barretenberg/vm2/constraining/relations/l1_to_l2_message_tree_check.test.cpp b/barretenberg/cpp/src/barretenberg/vm2/constraining/relations/l1_to_l2_message_tree_check.test.cpp index 3e8455358057..84ec3fdcae09 100644 --- a/barretenberg/cpp/src/barretenberg/vm2/constraining/relations/l1_to_l2_message_tree_check.test.cpp +++ b/barretenberg/cpp/src/barretenberg/vm2/constraining/relations/l1_to_l2_message_tree_check.test.cpp @@ -15,34 +15,25 @@ #include "barretenberg/vm2/simulation/events/l1_to_l2_message_tree_check_event.hpp" #include "barretenberg/vm2/simulation/l1_to_l2_message_tree_check.hpp" #include "barretenberg/vm2/simulation/lib/merkle.hpp" -#include "barretenberg/vm2/simulation/poseidon2.hpp" +#include "barretenberg/vm2/simulation/testing/fakes/fake_poseidon2.hpp" #include "barretenberg/vm2/testing/fixtures.hpp" #include "barretenberg/vm2/testing/macros.hpp" -#include "barretenberg/vm2/testing/public_inputs_builder.hpp" #include "barretenberg/vm2/tracegen/l1_to_l2_message_tree_trace.hpp" #include "barretenberg/vm2/tracegen/merkle_check_trace.hpp" -#include "barretenberg/vm2/tracegen/poseidon2_trace.hpp" -#include "barretenberg/vm2/tracegen/precomputed_trace.hpp" -#include "barretenberg/vm2/tracegen/public_inputs_trace.hpp" #include "barretenberg/vm2/tracegen/test_trace_container.hpp" namespace bb::avm2::constraining { namespace { using simulation::EventEmitter; +using simulation::FakePoseidon2; using simulation::L1ToL2MessageTreeCheck; using simulation::MerkleCheck; using simulation::MerkleCheckEvent; -using simulation::Poseidon2; -using simulation::Poseidon2HashEvent; -using simulation::Poseidon2PermutationEvent; using simulation::unconstrained_root_from_path; using tracegen::L1ToL2MessageTreeCheckTraceBuilder; using tracegen::MerkleCheckTraceBuilder; -using tracegen::Poseidon2TraceBuilder; -using tracegen::PrecomputedTraceBuilder; -using tracegen::PublicInputsTraceBuilder; using tracegen::TestTraceContainer; using FF = AvmFlavorSettings::FF; @@ -52,9 +43,7 @@ using RawPoseidon2 = crypto::Poseidon2; TEST(L1ToL2MessageTreeCheckConstrainingTests, PositiveExists) { - EventEmitter hash_event_emitter; - EventEmitter perm_event_emitter; - Poseidon2 poseidon2(hash_event_emitter, perm_event_emitter); + FakePoseidon2 poseidon2 = FakePoseidon2(); EventEmitter merkle_event_emitter; MerkleCheck merkle_check(poseidon2, merkle_event_emitter); @@ -92,9 +81,7 @@ TEST(L1ToL2MessageTreeCheckConstrainingTests, PositiveExists) TEST(L1ToL2MessageTreeCheckConstrainingTests, PositiveNotExists) { - EventEmitter hash_event_emitter; - EventEmitter perm_event_emitter; - Poseidon2 poseidon2(hash_event_emitter, perm_event_emitter); + FakePoseidon2 poseidon2 = FakePoseidon2(); EventEmitter merkle_event_emitter; MerkleCheck merkle_check(poseidon2, merkle_event_emitter); diff --git a/barretenberg/cpp/src/barretenberg/vm2/constraining/relations/merkle_check.test.cpp b/barretenberg/cpp/src/barretenberg/vm2/constraining/relations/merkle_check.test.cpp index b3000a0ad1de..7374789421ae 100644 --- a/barretenberg/cpp/src/barretenberg/vm2/constraining/relations/merkle_check.test.cpp +++ b/barretenberg/cpp/src/barretenberg/vm2/constraining/relations/merkle_check.test.cpp @@ -12,6 +12,8 @@ #include "barretenberg/vm2/simulation/lib/merkle.hpp" #include "barretenberg/vm2/simulation/merkle_check.hpp" #include "barretenberg/vm2/simulation/poseidon2.hpp" +#include "barretenberg/vm2/simulation/testing/mock_execution_id_manager.hpp" +#include "barretenberg/vm2/simulation/testing/mock_gt.hpp" #include "barretenberg/vm2/testing/fixtures.hpp" #include "barretenberg/vm2/testing/macros.hpp" #include "barretenberg/vm2/tracegen/merkle_check_trace.hpp" @@ -21,12 +23,18 @@ namespace bb::avm2::constraining { namespace { +using ::testing::NiceMock; + using simulation::EventEmitter; using simulation::MerkleCheck; using simulation::MerkleCheckEvent; +using simulation::MockExecutionIdManager; +using simulation::MockGreaterThan; +using simulation::NoopEventEmitter; using simulation::Poseidon2; using simulation::Poseidon2HashEvent; using simulation::Poseidon2PermutationEvent; +using simulation::Poseidon2PermutationMemoryEvent; using simulation::unconstrained_root_from_path; using tracegen::MerkleCheckTraceBuilder; @@ -551,12 +559,22 @@ TEST(MerkleCheckConstrainingTest, WriteWithTracegen) check_relation(trace); } -TEST(MerkleCheckConstrainingTest, ReadWithInteractions) -{ +class MerkleCheckPoseidon2Test : public ::testing::Test { + protected: + MerkleCheckPoseidon2Test() = default; + EventEmitter hash_event_emitter; - EventEmitter perm_event_emitter; - Poseidon2 poseidon2(hash_event_emitter, perm_event_emitter); + NoopEventEmitter perm_event_emitter; + NoopEventEmitter perm_mem_event_emitter; + NiceMock execution_id_manager; + NiceMock mock_gt; + Poseidon2 poseidon2 = + Poseidon2(execution_id_manager, mock_gt, hash_event_emitter, perm_event_emitter, perm_mem_event_emitter); +}; + +TEST_F(MerkleCheckPoseidon2Test, ReadWithInteractions) +{ EventEmitter merkle_event_emitter; MerkleCheck merkle_check_sim(poseidon2, merkle_event_emitter); @@ -588,12 +606,8 @@ TEST(MerkleCheckConstrainingTest, ReadWithInteractions) check_interaction(trace); } -TEST(MerkleCheckConstrainingTest, WriteWithInteractions) +TEST_F(MerkleCheckPoseidon2Test, WriteWithInteractions) { - EventEmitter hash_event_emitter; - EventEmitter perm_event_emitter; - Poseidon2 poseidon2(hash_event_emitter, perm_event_emitter); - EventEmitter merkle_event_emitter; MerkleCheck merkle_check_sim(poseidon2, merkle_event_emitter); @@ -635,7 +649,7 @@ TEST(MerkleCheckConstrainingTest, WriteWithInteractions) "destination"); } -TEST(MerkleCheckConstrainingTest, MultipleWithTracegen) +TEST_F(MerkleCheckPoseidon2Test, MultipleWithTracegen) { TestTraceContainer trace = TestTraceContainer::from_rows({ { .precomputed_first_row = 1 }, @@ -691,12 +705,8 @@ TEST(MerkleCheckConstrainingTest, MultipleWithTracegen) check_relation(trace); } -TEST(MerkleCheckConstrainingTest, MultipleWithInteractions) +TEST_F(MerkleCheckPoseidon2Test, MultipleWithInteractions) { - EventEmitter hash_event_emitter; - EventEmitter perm_event_emitter; - Poseidon2 poseidon2(hash_event_emitter, perm_event_emitter); - EventEmitter merkle_event_emitter; MerkleCheck merkle_check_sim(poseidon2, merkle_event_emitter); diff --git a/barretenberg/cpp/src/barretenberg/vm2/constraining/relations/note_hash_tree_check.test.cpp b/barretenberg/cpp/src/barretenberg/vm2/constraining/relations/note_hash_tree_check.test.cpp index 5cdb746ce815..d3d5ddaf9131 100644 --- a/barretenberg/cpp/src/barretenberg/vm2/constraining/relations/note_hash_tree_check.test.cpp +++ b/barretenberg/cpp/src/barretenberg/vm2/constraining/relations/note_hash_tree_check.test.cpp @@ -16,6 +16,8 @@ #include "barretenberg/vm2/simulation/lib/merkle.hpp" #include "barretenberg/vm2/simulation/note_hash_tree_check.hpp" #include "barretenberg/vm2/simulation/poseidon2.hpp" +#include "barretenberg/vm2/simulation/testing/mock_execution_id_manager.hpp" +#include "barretenberg/vm2/simulation/testing/mock_gt.hpp" #include "barretenberg/vm2/testing/fixtures.hpp" #include "barretenberg/vm2/testing/macros.hpp" #include "barretenberg/vm2/testing/public_inputs_builder.hpp" @@ -29,13 +31,19 @@ namespace bb::avm2::constraining { namespace { +using ::testing::NiceMock; + using simulation::EventEmitter; using simulation::MerkleCheck; using simulation::MerkleCheckEvent; +using simulation::MockExecutionIdManager; +using simulation::MockGreaterThan; +using simulation::NoopEventEmitter; using simulation::NoteHashTreeCheck; using simulation::Poseidon2; using simulation::Poseidon2HashEvent; using simulation::Poseidon2PermutationEvent; +using simulation::Poseidon2PermutationMemoryEvent; using simulation::unconstrained_root_from_path; using tracegen::MerkleCheckTraceBuilder; @@ -53,8 +61,12 @@ using RawPoseidon2 = crypto::Poseidon2; TEST(NoteHashTreeCheckConstrainingTests, PositiveExists) { EventEmitter hash_event_emitter; - EventEmitter perm_event_emitter; - Poseidon2 poseidon2(hash_event_emitter, perm_event_emitter); + NoopEventEmitter perm_event_emitter; + NoopEventEmitter perm_mem_event_emitter; + NiceMock mock_gt; + NiceMock mock_exec_id_manager; + Poseidon2 poseidon2 = + Poseidon2(mock_exec_id_manager, mock_gt, hash_event_emitter, perm_event_emitter, perm_mem_event_emitter); EventEmitter merkle_event_emitter; MerkleCheck merkle_check(poseidon2, merkle_event_emitter); @@ -100,7 +112,11 @@ TEST(NoteHashTreeCheckConstrainingTests, PositiveNotExists) { EventEmitter hash_event_emitter; EventEmitter perm_event_emitter; - Poseidon2 poseidon2(hash_event_emitter, perm_event_emitter); + NoopEventEmitter perm_mem_event_emitter; + + NiceMock mock_exec_id_manager; + NiceMock mock_gt; + Poseidon2 poseidon2(mock_exec_id_manager, mock_gt, hash_event_emitter, perm_event_emitter, perm_mem_event_emitter); EventEmitter merkle_event_emitter; MerkleCheck merkle_check(poseidon2, merkle_event_emitter); @@ -147,8 +163,12 @@ TEST(NoteHashTreeCheckConstrainingTests, PositiveWrite) { auto test_public_inputs = testing::PublicInputsBuilder().rand_previous_non_revertible_accumulated_data(1).build(); EventEmitter hash_event_emitter; - EventEmitter perm_event_emitter; - Poseidon2 poseidon2(hash_event_emitter, perm_event_emitter); + NoopEventEmitter perm_event_emitter; + NoopEventEmitter perm_mem_event_emitter; + NiceMock mock_gt; + NiceMock mock_exec_id_manager; + Poseidon2 poseidon2 = + Poseidon2(mock_exec_id_manager, mock_gt, hash_event_emitter, perm_event_emitter, perm_mem_event_emitter); EventEmitter merkle_event_emitter; MerkleCheck merkle_check(poseidon2, merkle_event_emitter); diff --git a/barretenberg/cpp/src/barretenberg/vm2/constraining/relations/nullifier_tree_check.test.cpp b/barretenberg/cpp/src/barretenberg/vm2/constraining/relations/nullifier_tree_check.test.cpp index 9b65814c12eb..e56adff8b825 100644 --- a/barretenberg/cpp/src/barretenberg/vm2/constraining/relations/nullifier_tree_check.test.cpp +++ b/barretenberg/cpp/src/barretenberg/vm2/constraining/relations/nullifier_tree_check.test.cpp @@ -16,6 +16,8 @@ #include "barretenberg/vm2/simulation/lib/merkle.hpp" #include "barretenberg/vm2/simulation/nullifier_tree_check.hpp" #include "barretenberg/vm2/simulation/poseidon2.hpp" +#include "barretenberg/vm2/simulation/testing/mock_execution_id_manager.hpp" +#include "barretenberg/vm2/simulation/testing/mock_gt.hpp" #include "barretenberg/vm2/simulation/testing/mock_range_check.hpp" #include "barretenberg/vm2/testing/fixtures.hpp" #include "barretenberg/vm2/testing/macros.hpp" @@ -35,10 +37,13 @@ using ::testing::TestWithParam; using testing::TestMemoryTree; using simulation::EventEmitter; +using simulation::ExecutionIdManager; using simulation::FieldGreaterThan; using simulation::FieldGreaterThanEvent; using simulation::MerkleCheck; using simulation::MerkleCheckEvent; +using simulation::MockExecutionIdManager; +using simulation::MockGreaterThan; using simulation::MockRangeCheck; using simulation::NoopEventEmitter; using simulation::NullifierTreeCheck; @@ -47,6 +52,7 @@ using simulation::NullifierTreeLeafPreimage; using simulation::Poseidon2; using simulation::Poseidon2HashEvent; using simulation::Poseidon2PermutationEvent; +using simulation::Poseidon2PermutationMemoryEvent; using simulation::unconstrained_root_from_path; using tracegen::NullifierTreeCheckTraceBuilder; @@ -89,8 +95,11 @@ TEST_P(NullifierReadPositiveTests, Positive) NoopEventEmitter hash_event_emitter; NoopEventEmitter perm_event_emitter; - Poseidon2 poseidon2(hash_event_emitter, perm_event_emitter); + NoopEventEmitter perm_mem_event_emitter; + NiceMock mock_gt; + NiceMock mock_exec_id_manager; + Poseidon2 poseidon2(mock_exec_id_manager, mock_gt, hash_event_emitter, perm_event_emitter, perm_mem_event_emitter); NoopEventEmitter merkle_event_emitter; MerkleCheck merkle_check(poseidon2, merkle_event_emitter); @@ -137,8 +146,11 @@ TEST(NullifierTreeCheckConstrainingTest, PositiveWriteAppend) { NoopEventEmitter hash_event_emitter; NoopEventEmitter perm_event_emitter; - Poseidon2 poseidon2(hash_event_emitter, perm_event_emitter); + NoopEventEmitter perm_mem_event_emitter; + NiceMock mock_gt; + NiceMock mock_exec_id_manager; + Poseidon2 poseidon2(mock_exec_id_manager, mock_gt, hash_event_emitter, perm_event_emitter, perm_mem_event_emitter); NoopEventEmitter merkle_event_emitter; MerkleCheck merkle_check(poseidon2, merkle_event_emitter); @@ -203,8 +215,11 @@ TEST(NullifierTreeCheckConstrainingTest, PositiveWriteMembership) auto low_leaf = NullifierTreeLeafPreimage(NullifierLeafValue(42), 0, 0); NoopEventEmitter hash_event_emitter; NoopEventEmitter perm_event_emitter; - Poseidon2 poseidon2(hash_event_emitter, perm_event_emitter); + NoopEventEmitter perm_mem_event_emitter; + NiceMock mock_gt; + NiceMock mock_exec_id_manager; + Poseidon2 poseidon2(mock_exec_id_manager, mock_gt, hash_event_emitter, perm_event_emitter, perm_mem_event_emitter); NoopEventEmitter merkle_event_emitter; MerkleCheck merkle_check(poseidon2, merkle_event_emitter); @@ -252,8 +267,11 @@ TEST(NullifierTreeCheckConstrainingTest, Siloing) auto low_leaf = NullifierTreeLeafPreimage(NullifierLeafValue(siloed_nullifier), 0, 0); NoopEventEmitter hash_event_emitter; NoopEventEmitter perm_event_emitter; - Poseidon2 poseidon2(hash_event_emitter, perm_event_emitter); + NoopEventEmitter perm_mem_event_emitter; + NiceMock mock_gt; + NiceMock mock_exec_id_manager; + Poseidon2 poseidon2(mock_exec_id_manager, mock_gt, hash_event_emitter, perm_event_emitter, perm_mem_event_emitter); NoopEventEmitter merkle_event_emitter; MerkleCheck merkle_check(poseidon2, merkle_event_emitter); diff --git a/barretenberg/cpp/src/barretenberg/vm2/constraining/relations/poseidon2.test.cpp b/barretenberg/cpp/src/barretenberg/vm2/constraining/relations/poseidon2.test.cpp index cbe85b46bd73..2b6e166fa599 100644 --- a/barretenberg/cpp/src/barretenberg/vm2/constraining/relations/poseidon2.test.cpp +++ b/barretenberg/cpp/src/barretenberg/vm2/constraining/relations/poseidon2.test.cpp @@ -4,14 +4,21 @@ #include #include "barretenberg/crypto/poseidon2/poseidon2.hpp" +#include "barretenberg/vm2/common/memory_types.hpp" #include "barretenberg/vm2/constraining/flavor_settings.hpp" #include "barretenberg/vm2/constraining/testing/check_relation.hpp" #include "barretenberg/vm2/generated/relations/lookups_poseidon2_hash.hpp" #include "barretenberg/vm2/generated/relations/poseidon2_hash.hpp" #include "barretenberg/vm2/generated/relations/poseidon2_perm.hpp" #include "barretenberg/vm2/simulation/events/event_emitter.hpp" +#include "barretenberg/vm2/simulation/lib/execution_id_manager.hpp" +#include "barretenberg/vm2/simulation/range_check.hpp" +#include "barretenberg/vm2/simulation/testing/mock_memory.hpp" +#include "barretenberg/vm2/simulation/testing/mock_range_check.hpp" #include "barretenberg/vm2/testing/fixtures.hpp" #include "barretenberg/vm2/testing/macros.hpp" +#include "barretenberg/vm2/tracegen/gt_trace.hpp" +#include "barretenberg/vm2/tracegen/memory_trace.hpp" #include "barretenberg/vm2/tracegen/poseidon2_trace.hpp" // Temporary imports, see comment in test. @@ -21,35 +28,63 @@ namespace bb::avm2::constraining { using ::testing::ElementsAreArray; +using ::testing::NiceMock; +using ::testing::Return; +using ::testing::ReturnRef; using tracegen::Poseidon2TraceBuilder; using tracegen::TestTraceContainer; + using FF = AvmFlavorSettings::FF; using C = Column; using poseidon2_hash = bb::avm2::poseidon2_hash; using poseidon2_perm = bb::avm2::poseidon2_perm; +using poseidon2_mem = bb::avm2::poseidon2_mem; using simulation::EventEmitter; -using simulation::NoopEventEmitter; +using simulation::ExecutionIdManager; +using simulation::FieldGreaterThan; +using simulation::FieldGreaterThanEvent; +using simulation::GreaterThan; +using simulation::GreaterThanEvent; +using simulation::MockMemory; +using simulation::MockRangeCheck; using simulation::Poseidon2; using simulation::Poseidon2HashEvent; using simulation::Poseidon2PermutationEvent; - -TEST(Poseidon2ConstrainingTest, Poseidon2EmptyRow) +using simulation::Poseidon2PermutationMemoryEvent; + +class Poseidon2ConstrainingTest : public ::testing::Test { + protected: + Poseidon2ConstrainingTest() + : execution_id_manager(0) + , ff_gt(range_check, field_gt_event_emitter) + , gt(ff_gt, range_check, gt_event_emitter) + , poseidon2(execution_id_manager, gt, hash_event_emitter, perm_event_emitter, perm_mem_event_emitter) + {} + EventEmitter hash_event_emitter; + EventEmitter perm_event_emitter; + EventEmitter perm_mem_event_emitter; + EventEmitter field_gt_event_emitter; + EventEmitter gt_event_emitter; + + ExecutionIdManager execution_id_manager; + NiceMock range_check; + FieldGreaterThan ff_gt; + GreaterThan gt; + Poseidon2 poseidon2; +}; + +TEST_F(Poseidon2ConstrainingTest, Poseidon2EmptyRow) { check_relation(testing::empty_trace()); check_relation(testing::empty_trace()); + check_relation(testing::empty_trace()); } // These tests imports a bunch of external code since hand-generating the poseidon2 trace is a bit laborious atm. -// TODO: Test lookup relations -TEST(Poseidon2ConstrainingTest, BasicPermutation) +TEST_F(Poseidon2ConstrainingTest, BasicPermutation) { - // We are just testing the permutation event here so we can use a noop emitter for the hash events. - NoopEventEmitter poseidon2_hash_event_emitter; - EventEmitter poseidon2_perm_event_emitter; - Poseidon2 poseidon2(poseidon2_hash_event_emitter, poseidon2_perm_event_emitter); - // Taken From barretenberg/crypto/poseidon2/poseidon2.test.cpp FF a("9a807b615c4d3e2fa0b1c2d3e4f56789fedcba9876543210abcdef0123456789"); FF b("9a807b615c4d3e2fa0b1c2d3e4f56789fedcba9876543210abcdef0123456789"); @@ -71,19 +106,14 @@ TEST(Poseidon2ConstrainingTest, BasicPermutation) TestTraceContainer trace; tracegen::Poseidon2TraceBuilder builder; - builder.process_permutation(poseidon2_perm_event_emitter.dump_events(), trace); + builder.process_permutation(perm_event_emitter.dump_events(), trace); EXPECT_EQ(trace.get_num_rows(), 1); check_relation(trace); } -TEST(Poseidon2ConstrainingTest, HashWithSinglePermutation) +TEST_F(Poseidon2ConstrainingTest, HashWithSinglePermutation) { - EventEmitter poseidon2_hash_event_emitter; - // We are just testing the hash event here so we can use a noop emitter for the permutation events. - NoopEventEmitter poseidon2_perm_event_emitter; - Poseidon2 poseidon2(poseidon2_hash_event_emitter, poseidon2_perm_event_emitter); - FF a("9a807b615c4d3e2fa0b1c2d3e4f56789fedcba9876543210abcdef0123456789"); FF b("9a807b615c4d3e2fa0b1c2d3e4f56789fedcba9876543210abcdef0123456789"); FF c("0x9a807b615c4d3e2fa0b1c2d3e4f56789fedcba9876543210abcdef0123456789"); @@ -97,20 +127,16 @@ TEST(Poseidon2ConstrainingTest, HashWithSinglePermutation) TestTraceContainer trace = TestTraceContainer::from_rows({ { .precomputed_first_row = 1 }, }); - tracegen::Poseidon2TraceBuilder builder; + Poseidon2TraceBuilder builder; - builder.process_hash(poseidon2_hash_event_emitter.dump_events(), trace); + builder.process_hash(hash_event_emitter.dump_events(), trace); EXPECT_EQ(trace.get_num_rows(), /*start_row=*/1 + 1); check_relation(trace); } -TEST(Poseidon2ConstrainingTest, HashWithMultiplePermutation) +TEST_F(Poseidon2ConstrainingTest, HashWithMultiplePermutation) { - EventEmitter poseidon2_hash_event_emitter; - NoopEventEmitter poseidon2_perm_event_emitter; - Poseidon2 poseidon2(poseidon2_hash_event_emitter, poseidon2_perm_event_emitter); - // Taken From barretenberg/crypto/poseidon2/poseidon2.test.cpp FF a("9a807b615c4d3e2fa0b1c2d3e4f56789fedcba9876543210abcdef0123456789"); FF b("9a807b615c4d3e2fa0b1c2d3e4f56789fedcba9876543210abcdef0123456789"); @@ -123,20 +149,16 @@ TEST(Poseidon2ConstrainingTest, HashWithMultiplePermutation) TestTraceContainer trace = TestTraceContainer::from_rows({ { .precomputed_first_row = 1 }, }); - tracegen::Poseidon2TraceBuilder builder; + Poseidon2TraceBuilder builder; - builder.process_hash(poseidon2_hash_event_emitter.dump_events(), trace); + builder.process_hash(hash_event_emitter.dump_events(), trace); EXPECT_EQ(trace.get_num_rows(), /*start_row=*/1 + 2); check_relation(trace); } -TEST(Poseidon2ConstrainingTest, MultipleHashInvocations) +TEST_F(Poseidon2ConstrainingTest, MultipleHashInvocations) { - EventEmitter poseidon2_hash_event_emitter; - NoopEventEmitter poseidon2_perm_event_emitter; - Poseidon2 poseidon2(poseidon2_hash_event_emitter, poseidon2_perm_event_emitter); - std::vector input = { 1, 2, 3, 4 }; FF result = poseidon2.hash(input); @@ -150,21 +172,17 @@ TEST(Poseidon2ConstrainingTest, MultipleHashInvocations) TestTraceContainer trace = TestTraceContainer::from_rows({ { .precomputed_first_row = 1 }, }); - tracegen::Poseidon2TraceBuilder builder; + Poseidon2TraceBuilder builder; - builder.process_hash(poseidon2_hash_event_emitter.dump_events(), trace); - builder.process_permutation(poseidon2_perm_event_emitter.dump_events(), trace); + builder.process_hash(hash_event_emitter.dump_events(), trace); + builder.process_permutation(perm_event_emitter.dump_events(), trace); EXPECT_EQ(trace.get_num_rows(), /*start_row=*/1 + /*first_invocation=*/2 + /*second_invokcation=*/2); check_relation(trace); } -TEST(Poseidon2ConstrainingTest, HashPermInteractions) +TEST_F(Poseidon2ConstrainingTest, HashPermInteractions) { - EventEmitter poseidon2_hash_event_emitter; - EventEmitter poseidon2_perm_event_emitter; - Poseidon2 poseidon2(poseidon2_hash_event_emitter, poseidon2_perm_event_emitter); - std::vector input = { 1, 2, 3, 4 }; poseidon2.hash(input); @@ -172,25 +190,21 @@ TEST(Poseidon2ConstrainingTest, HashPermInteractions) TestTraceContainer trace = TestTraceContainer::from_rows({ { .precomputed_first_row = 1 }, }); - tracegen::Poseidon2TraceBuilder builder; + Poseidon2TraceBuilder builder; - builder.process_hash(poseidon2_hash_event_emitter.dump_events(), trace); - builder.process_permutation(poseidon2_perm_event_emitter.dump_events(), trace); + builder.process_hash(hash_event_emitter.dump_events(), trace); + builder.process_permutation(perm_event_emitter.dump_events(), trace); check_interaction(trace); EXPECT_EQ(trace.get_num_rows(), /*start_row=*/1 + /*first_invocation=*/2); check_relation(trace); check_relation(trace); + check_all_interactions(trace); } -TEST(Poseidon2ConstrainingTest, NegativeHashPermInteractions) +TEST_F(Poseidon2ConstrainingTest, NegativeHashPermInteractions) { - // We won't generate permutation events which will cause the lookup to fail - NoopEventEmitter poseidon2_perm_event_emitter; - EventEmitter poseidon2_hash_event_emitter; - Poseidon2 poseidon2(poseidon2_hash_event_emitter, poseidon2_perm_event_emitter); - std::vector input = { 1, 2, 3, 4 }; poseidon2.hash(input); @@ -198,12 +212,12 @@ TEST(Poseidon2ConstrainingTest, NegativeHashPermInteractions) TestTraceContainer trace = TestTraceContainer::from_rows({ { .precomputed_first_row = 1 }, }); - tracegen::Poseidon2TraceBuilder builder; + Poseidon2TraceBuilder builder; - builder.process_hash(poseidon2_hash_event_emitter.dump_events(), trace); + builder.process_hash(hash_event_emitter.dump_events(), trace); - // This sets the length of the inverse polynomial via SetDummyInverses, so we still need to call this even though we - // know it will fail. + // This sets the length of the inverse polynomial via SetDummyInverses, so we still need to call this even + // though we know it will fail. EXPECT_THROW_WITH_MESSAGE( (check_interaction(trace)), "Failed.*POSEIDON2_PERM. Could not find tuple in destination."); @@ -213,4 +227,206 @@ TEST(Poseidon2ConstrainingTest, NegativeHashPermInteractions) check_relation(trace); } +/////////////////////////// +// Memory Aware Poseidon2 +/////////////////////////// + +class Poseidon2MemoryConstrainingTest : public Poseidon2ConstrainingTest { + protected: + Poseidon2MemoryConstrainingTest() { ON_CALL(memory, get_space_id).WillByDefault(Return(0)); } + + TestTraceContainer trace; + Poseidon2TraceBuilder builder; + + NiceMock memory; + std::vector inputs = { + MemoryValue::from(1), MemoryValue::from(2), MemoryValue::from(3), MemoryValue::from(4) + }; + + uint32_t src_address = 0; + uint32_t dst_address = 4; +}; + +TEST_F(Poseidon2MemoryConstrainingTest, PermutationMemory) +{ + // Read 4 inputs + EXPECT_CALL(memory, get) + .WillOnce(ReturnRef(inputs[0])) + .WillOnce(ReturnRef(inputs[1])) + .WillOnce(ReturnRef(inputs[2])) + .WillOnce(ReturnRef(inputs[3])); + EXPECT_CALL(memory, set).Times(4); // Write 4 outputs + + poseidon2.permutation(memory, src_address, dst_address); + + builder.process_permutation_with_memory(perm_mem_event_emitter.dump_events(), trace); + + check_relation(trace); +} + +TEST_F(Poseidon2MemoryConstrainingTest, PermutationMemoryInteractions) +{ + // Read 4 inputs + EXPECT_CALL(memory, get) + .WillOnce(ReturnRef(inputs[0])) + .WillOnce(ReturnRef(inputs[1])) + .WillOnce(ReturnRef(inputs[2])) + .WillOnce(ReturnRef(inputs[3])); + EXPECT_CALL(memory, set).Times(4); // Write 4 outputs + + // Expected bb output from inputs = {1, 2, 3 ,4} + std::vector outputs = { FF("0x224785a48a72c75e2cbb698143e71d5d41bd89a2b9a7185871e39a54ce5785b1"), + FF("0x225bb800db22c4f4b09ace45cb484d42b0dd7dfe8708ee26aacde6f2c1fb2cb8"), + FF("0x1180f4260e60b4264c987b503075ea8374b53ed06c5145f8c21c2aadb5087d21"), + FF("0x16c877b5b9c04d873218804ccbf65d0eeb12db447f66c9ca26fec380055df7e9") }; + + // Set the execution and gt traces + TestTraceContainer trace = TestTraceContainer({ + // Row 0 + { + // Execution + { C::execution_sel, 1 }, + { C::execution_sel_execute_poseidon2_perm, 1 }, + { C::execution_rop_0_, src_address }, + { C::execution_rop_1_, dst_address }, + // GT - dst out of range check + { C::gt_sel, 1 }, + { C::gt_input_a, dst_address + 3 }, // highest write address is src_address + 3 + { C::gt_input_b, AVM_HIGHEST_MEM_ADDRESS }, + { C::gt_res, 0 }, + }, + { + // GT - src out of range check + { C::gt_sel, 1 }, + { C::gt_input_a, src_address + 3 }, // highest read address is dst_address + 3 + { C::gt_input_b, AVM_HIGHEST_MEM_ADDRESS }, + { C::gt_res, 0 }, + }, + }); + + // Set up memory trace + for (uint32_t i = 0; i < inputs.size(); ++i) { + // Set memory reads + trace.set(C::memory_address, i, src_address + i); + trace.set(C::memory_value, i, inputs[i]); + trace.set(C::memory_tag, i, static_cast(inputs[i].get_tag())); + trace.set(C::memory_sel, i, 1); + // Set memory writes + uint32_t write_index = i + static_cast(inputs.size()); + trace.set(C::memory_address, write_index, dst_address + i); + trace.set(C::memory_value, write_index, outputs[i]); + trace.set(C::memory_sel, write_index, 1); + trace.set(C::memory_rw, write_index, 1); + } + + poseidon2.permutation(memory, src_address, dst_address); + + builder.process_permutation_with_memory(perm_mem_event_emitter.dump_events(), trace); + builder.process_permutation(perm_event_emitter.dump_events(), trace); + + check_all_interactions(trace); + check_relation(trace); +} + +TEST_F(Poseidon2MemoryConstrainingTest, PermutationMemoryInvalidTag) +{ + // Third input is of the wrong type + std::vector inputs = { + MemoryValue::from(1), MemoryValue::from(2), MemoryValue::from(3), MemoryValue::from(4) + }; + + // Still load all the inputs even though there is in invalid tag + EXPECT_CALL(memory, get) + .WillOnce(ReturnRef(inputs[0])) + .WillOnce(ReturnRef(inputs[1])) + .WillOnce(ReturnRef(inputs[2])) + .WillOnce(ReturnRef(inputs[3])); + + // Set the execution and gt traces + TestTraceContainer trace = TestTraceContainer({ + // Row 0 + { + // Execution + { C::execution_sel, 1 }, + { C::execution_sel_execute_poseidon2_perm, 1 }, + { C::execution_rop_0_, src_address }, + { C::execution_rop_1_, dst_address }, + { C::execution_sel_opcode_error, 1 }, // Invalid tag error + // GT - dst out of range check + { C::gt_sel, 1 }, + { C::gt_input_a, dst_address + 3 }, // highest write address is src_address + 3 + { C::gt_input_b, AVM_HIGHEST_MEM_ADDRESS }, + { C::gt_res, 0 }, + }, + { + // GT - src out of range check + { C::gt_sel, 1 }, + { C::gt_input_a, src_address + 3 }, // highest read address is dst_address + 3 + { C::gt_input_b, AVM_HIGHEST_MEM_ADDRESS }, + { C::gt_res, 0 }, + }, + }); + + // Set up memory trace + for (uint32_t i = 0; i < inputs.size(); ++i) { + // Set memory reads + trace.set(C::memory_address, i, src_address + i); + trace.set(C::memory_value, i, inputs[i]); + trace.set(C::memory_tag, i, static_cast(inputs[i].get_tag())); + trace.set(C::memory_sel, i, 1); + } + + EXPECT_THROW_WITH_MESSAGE(poseidon2.permutation(memory, src_address, dst_address), + "Poseidon2Exception.* input tag is not FF"); + + builder.process_permutation_with_memory(perm_mem_event_emitter.dump_events(), trace); + + // Don't expect any permutation events since the memory access was invalid + EXPECT_EQ(perm_event_emitter.dump_events().size(), 0); + + check_relation(trace); + check_all_interactions(trace); +} + +TEST_F(Poseidon2MemoryConstrainingTest, PermutationMemoryInvalidAddressRange) +{ + uint32_t src_address = AVM_HIGHEST_MEM_ADDRESS - 2; + + TestTraceContainer trace = TestTraceContainer({ + // Row 0 + { + // Execution + { C::execution_sel, 1 }, + { C::execution_sel_execute_poseidon2_perm, 1 }, + { C::execution_rop_0_, src_address }, + { C::execution_rop_1_, dst_address }, + { C::execution_sel_opcode_error, 1 }, // Invalid address error + // GT Subtrace - dst out of range check + { C::gt_sel, 1 }, + { C::gt_input_a, dst_address + 3 }, // highest write address is src_address + 3 + { C::gt_input_b, AVM_HIGHEST_MEM_ADDRESS }, + { C::gt_res, 0 }, + }, + { + // GT Subtrace - src out of range check + { C::gt_sel, 1 }, + { C::gt_input_a, static_cast(src_address) + 3 }, // highest read address is dst_address + 3 + { C::gt_input_b, AVM_HIGHEST_MEM_ADDRESS }, + { C::gt_res, 1 }, + }, + }); + + EXPECT_THROW_WITH_MESSAGE(poseidon2.permutation(memory, src_address, dst_address), + "Poseidon2Exception.* src or dst address out of range"); + + Poseidon2TraceBuilder builder; + builder.process_permutation_with_memory(perm_mem_event_emitter.dump_events(), trace); + + // Don't expect any permutation events since the address range was invalid + EXPECT_EQ(perm_event_emitter.dump_events().size(), 0); + + check_relation(trace); + check_all_interactions(trace); +} + } // namespace bb::avm2::constraining diff --git a/barretenberg/cpp/src/barretenberg/vm2/constraining/relations/public_data_tree.test.cpp b/barretenberg/cpp/src/barretenberg/vm2/constraining/relations/public_data_tree.test.cpp index 39117b6a9ea8..d9a5e99e9dc3 100644 --- a/barretenberg/cpp/src/barretenberg/vm2/constraining/relations/public_data_tree.test.cpp +++ b/barretenberg/cpp/src/barretenberg/vm2/constraining/relations/public_data_tree.test.cpp @@ -10,11 +10,13 @@ #include "barretenberg/vm2/generated/relations/merkle_check.hpp" #include "barretenberg/vm2/generated/relations/public_data_check.hpp" #include "barretenberg/vm2/simulation/events/event_emitter.hpp" +#include "barretenberg/vm2/simulation/events/poseidon2_event.hpp" #include "barretenberg/vm2/simulation/events/public_data_tree_check_event.hpp" #include "barretenberg/vm2/simulation/field_gt.hpp" #include "barretenberg/vm2/simulation/lib/merkle.hpp" #include "barretenberg/vm2/simulation/poseidon2.hpp" #include "barretenberg/vm2/simulation/public_data_tree_check.hpp" +#include "barretenberg/vm2/simulation/testing/mock_gt.hpp" #include "barretenberg/vm2/simulation/testing/mock_range_check.hpp" #include "barretenberg/vm2/testing/fixtures.hpp" #include "barretenberg/vm2/testing/macros.hpp" @@ -39,10 +41,12 @@ using simulation::FieldGreaterThan; using simulation::FieldGreaterThanEvent; using simulation::MerkleCheck; using simulation::MerkleCheckEvent; +using simulation::MockGreaterThan; using simulation::NoopEventEmitter; using simulation::Poseidon2; using simulation::Poseidon2HashEvent; using simulation::Poseidon2PermutationEvent; +using simulation::Poseidon2PermutationMemoryEvent; using simulation::PublicDataTreeCheck; using simulation::PublicDataTreeCheckEvent; using simulation::PublicDataTreeLeafPreimage; @@ -99,7 +103,9 @@ TEST_P(PublicDataReadPositiveTests, Positive) ExecutionIdManager execution_id_manager(0); EventEmitter hash_event_emitter; NoopEventEmitter perm_event_emitter; - Poseidon2 poseidon2(hash_event_emitter, perm_event_emitter); + NoopEventEmitter perm_mem_event_emitter; + NiceMock mock_gt; + Poseidon2 poseidon2(execution_id_manager, mock_gt, hash_event_emitter, perm_event_emitter, perm_mem_event_emitter); EventEmitter merkle_event_emitter; MerkleCheck merkle_check(poseidon2, merkle_event_emitter); @@ -278,7 +284,9 @@ TEST(PublicDataTreeConstrainingTest, PositiveWriteExists) ExecutionIdManager execution_id_manager(0); EventEmitter hash_event_emitter; NoopEventEmitter perm_event_emitter; - Poseidon2 poseidon2(hash_event_emitter, perm_event_emitter); + NoopEventEmitter perm_mem_event_emitter; + NiceMock mock_gt; + Poseidon2 poseidon2(execution_id_manager, mock_gt, hash_event_emitter, perm_event_emitter, perm_mem_event_emitter); EventEmitter merkle_event_emitter; MerkleCheck merkle_check(poseidon2, merkle_event_emitter); @@ -351,7 +359,9 @@ TEST(PublicDataTreeConstrainingTest, PositiveWriteAndUpdate) ExecutionIdManager execution_id_manager(0); NoopEventEmitter hash_event_emitter; NoopEventEmitter perm_event_emitter; - Poseidon2 poseidon2(hash_event_emitter, perm_event_emitter); + NoopEventEmitter perm_mem_event_emitter; + NiceMock mock_gt; + Poseidon2 poseidon2(execution_id_manager, mock_gt, hash_event_emitter, perm_event_emitter, perm_mem_event_emitter); NoopEventEmitter merkle_event_emitter; MerkleCheck merkle_check(poseidon2, merkle_event_emitter); diff --git a/barretenberg/cpp/src/barretenberg/vm2/constraining/relations/written_public_data_slots_tree_check.test.cpp b/barretenberg/cpp/src/barretenberg/vm2/constraining/relations/written_public_data_slots_tree_check.test.cpp index 9f986d4a3d33..81fb8b27dc6b 100644 --- a/barretenberg/cpp/src/barretenberg/vm2/constraining/relations/written_public_data_slots_tree_check.test.cpp +++ b/barretenberg/cpp/src/barretenberg/vm2/constraining/relations/written_public_data_slots_tree_check.test.cpp @@ -16,6 +16,8 @@ #include "barretenberg/vm2/simulation/field_gt.hpp" #include "barretenberg/vm2/simulation/lib/merkle.hpp" #include "barretenberg/vm2/simulation/poseidon2.hpp" +#include "barretenberg/vm2/simulation/testing/mock_execution_id_manager.hpp" +#include "barretenberg/vm2/simulation/testing/mock_gt.hpp" #include "barretenberg/vm2/simulation/testing/mock_range_check.hpp" #include "barretenberg/vm2/simulation/written_public_data_slots_tree_check.hpp" #include "barretenberg/vm2/testing/fixtures.hpp" @@ -41,10 +43,14 @@ using simulation::FieldGreaterThan; using simulation::FieldGreaterThanEvent; using simulation::MerkleCheck; using simulation::MerkleCheckEvent; +using simulation::MockExecutionIdManager; +using simulation::MockGreaterThan; using simulation::MockRangeCheck; +using simulation::NoopEventEmitter; using simulation::Poseidon2; using simulation::Poseidon2HashEvent; using simulation::Poseidon2PermutationEvent; +using simulation::Poseidon2PermutationMemoryEvent; using simulation::unconstrained_compute_leaf_slot; using simulation::unconstrained_root_from_path; using simulation::WrittenPublicDataSlotLeafValue; @@ -64,7 +70,23 @@ using C = Column; using written_public_data_slots_tree_check = bb::avm2::written_public_data_slots_tree_check; using RawPoseidon2 = crypto::Poseidon2; -TEST(WrittenPublicDataSlotsTreeCheckConstrainingTest, EmptyRow) +class WrittenPublicDataSlotsTreeCheckConstrainingTest : public ::testing::Test { + protected: + WrittenPublicDataSlotsTreeCheckConstrainingTest() = default; + + EventEmitter hash_event_emitter; + // Interactions involve the poseidon2 hash, so the others can be noop + NoopEventEmitter perm_event_emitter; + NoopEventEmitter perm_mem_event_emitter; + + NiceMock mock_gt; + NiceMock mock_execution_id_manager; + + Poseidon2 poseidon2 = + Poseidon2(mock_execution_id_manager, mock_gt, hash_event_emitter, perm_event_emitter, perm_mem_event_emitter); +}; + +TEST_F(WrittenPublicDataSlotsTreeCheckConstrainingTest, EmptyRow) { check_relation(testing::empty_trace()); } @@ -100,16 +122,13 @@ std::vector positive_read_tests = { .pre_existing_leaves = { { WrittenPublicDataSlotLeafValue(unconstrained_compute_leaf_slot(27, 42) + FF(1)) } } } }; -class WrittenPublicDataSlotsReadPositiveTests : public TestWithParam {}; +class WrittenPublicDataSlotsReadPositiveTests : public WrittenPublicDataSlotsTreeCheckConstrainingTest, + public ::testing::WithParamInterface {}; TEST_P(WrittenPublicDataSlotsReadPositiveTests, Positive) { const auto& param = GetParam(); - EventEmitter hash_event_emitter; - EventEmitter perm_event_emitter; - Poseidon2 poseidon2(hash_event_emitter, perm_event_emitter); - EventEmitter merkle_event_emitter; MerkleCheck merkle_check(poseidon2, merkle_event_emitter); @@ -151,12 +170,8 @@ INSTANTIATE_TEST_SUITE_P(WrittenPublicDataSlotsTreeCheckConstrainingTest, WrittenPublicDataSlotsReadPositiveTests, ::testing::ValuesIn(positive_read_tests)); -TEST(WrittenPublicDataSlotsTreeCheckConstrainingTest, PositiveWriteAppend) +TEST_F(WrittenPublicDataSlotsTreeCheckConstrainingTest, PositiveWriteAppend) { - EventEmitter hash_event_emitter; - EventEmitter perm_event_emitter; - Poseidon2 poseidon2(hash_event_emitter, perm_event_emitter); - EventEmitter merkle_event_emitter; MerkleCheck merkle_check(poseidon2, merkle_event_emitter); @@ -197,15 +212,12 @@ TEST(WrittenPublicDataSlotsTreeCheckConstrainingTest, PositiveWriteAppend) check_all_interactions(trace); } -TEST(WrittenPublicDataSlotsTreeCheckConstrainingTest, PositiveWriteMembership) +TEST_F(WrittenPublicDataSlotsTreeCheckConstrainingTest, PositiveWriteMembership) { FF slot = 42; AztecAddress contract_address = 27; FF leaf_slot = unconstrained_compute_leaf_slot(contract_address, slot); auto low_leaf = WrittenPublicDataSlotsTreeLeafPreimage(WrittenPublicDataSlotLeafValue(leaf_slot), 0, 0); - EventEmitter hash_event_emitter; - EventEmitter perm_event_emitter; - Poseidon2 poseidon2(hash_event_emitter, perm_event_emitter); EventEmitter merkle_event_emitter; MerkleCheck merkle_check(poseidon2, merkle_event_emitter); @@ -245,7 +257,7 @@ TEST(WrittenPublicDataSlotsTreeCheckConstrainingTest, PositiveWriteMembership) check_all_interactions(trace); } -TEST(WrittenPublicDataSlotsTreeCheckConstrainingTest, NegativeExistsFlagCheck) +TEST_F(WrittenPublicDataSlotsTreeCheckConstrainingTest, NegativeExistsFlagCheck) { // Test constraint: sel * (SLOT_LOW_LEAF_SLOT_DIFF * (EXISTS * (1 - slot_low_leaf_slot_diff_inv) // + slot_low_leaf_slot_diff_inv) - 1 + EXISTS) = 0 @@ -276,7 +288,7 @@ TEST(WrittenPublicDataSlotsTreeCheckConstrainingTest, NegativeExistsFlagCheck) "EXISTS_CHECK"); } -TEST(WrittenPublicDataSlotsTreeCheckConstrainingTest, NegativeNextSlotIsZero) +TEST_F(WrittenPublicDataSlotsTreeCheckConstrainingTest, NegativeNextSlotIsZero) { // Test constraint: leaf_not_exists * (low_leaf_next_slot * (NEXT_SLOT_IS_ZERO * (1 - next_slot_inv) // + next_slot_inv) - 1 + NEXT_SLOT_IS_ZERO) = 0 diff --git a/barretenberg/cpp/src/barretenberg/vm2/generated/columns.hpp b/barretenberg/cpp/src/barretenberg/vm2/generated/columns.hpp index 2812bb5bf364..c911a7dd758d 100644 --- a/barretenberg/cpp/src/barretenberg/vm2/generated/columns.hpp +++ b/barretenberg/cpp/src/barretenberg/vm2/generated/columns.hpp @@ -9,8 +9,8 @@ namespace bb::avm2 { // clang-format off #define AVM2_PRECOMPUTED_ENTITIES_E(e) e precomputed_addressing_gas, e precomputed_bitwise_input_a, e precomputed_bitwise_input_b, e precomputed_bitwise_op_id, e precomputed_bitwise_output, e precomputed_clk, e precomputed_dyn_gas_id, e precomputed_envvar_pi_row_idx, e precomputed_exec_opcode, e precomputed_exec_opcode_base_da_gas, e precomputed_exec_opcode_dynamic_da_gas, e precomputed_exec_opcode_dynamic_l2_gas, e precomputed_exec_opcode_opcode_gas, e precomputed_expected_tag_reg_0_, e precomputed_expected_tag_reg_1_, e precomputed_expected_tag_reg_2_, e precomputed_expected_tag_reg_3_, e precomputed_expected_tag_reg_4_, e precomputed_expected_tag_reg_5_, e precomputed_expected_tag_reg_6_, e precomputed_first_row, e precomputed_instr_size, e precomputed_invalid_envvar_enum, e precomputed_is_address, e precomputed_is_class_id, e precomputed_is_dagasleft, e precomputed_is_deployer, e precomputed_is_feeperl2gas, e precomputed_is_init_hash, e precomputed_is_isstaticcall, e precomputed_is_l2_l1_message_phase, e precomputed_is_l2gasleft, e precomputed_is_public_call_request_phase, e precomputed_is_revertible, e precomputed_is_sender, e precomputed_is_transactionfee, e precomputed_is_valid_member_enum, e precomputed_keccak_round_constant, e precomputed_next_phase_on_revert, e precomputed_opcode_out_of_range, e precomputed_out_tag, e precomputed_p_decomposition_limb, e precomputed_p_decomposition_limb_index, e precomputed_p_decomposition_radix, e precomputed_phase_value, e precomputed_power_of_2, e precomputed_read_public_input_length_offset, e precomputed_read_public_input_offset, e precomputed_rw_reg_0_, e precomputed_rw_reg_1_, e precomputed_rw_reg_2_, e precomputed_rw_reg_3_, e precomputed_rw_reg_4_, e precomputed_rw_reg_5_, e precomputed_rw_reg_6_, e precomputed_sel_addressing_gas, e precomputed_sel_bitwise, e precomputed_sel_collect_fee, e precomputed_sel_envvar_pi_lookup_col0, e precomputed_sel_envvar_pi_lookup_col1, e precomputed_sel_exec_spec, e precomputed_sel_has_tag, e precomputed_sel_keccak, e precomputed_sel_mem_op_reg_0_, e precomputed_sel_mem_op_reg_1_, e precomputed_sel_mem_op_reg_2_, e precomputed_sel_mem_op_reg_3_, e precomputed_sel_mem_op_reg_4_, e precomputed_sel_mem_op_reg_5_, e precomputed_sel_mem_op_reg_6_, e precomputed_sel_mem_tag_out_of_range, e precomputed_sel_non_revertible_append_note_hash, e precomputed_sel_non_revertible_append_nullifier, e precomputed_sel_op_dc_0, e precomputed_sel_op_dc_1, e precomputed_sel_op_dc_10, e precomputed_sel_op_dc_11, e precomputed_sel_op_dc_12, e precomputed_sel_op_dc_13, e precomputed_sel_op_dc_14, e precomputed_sel_op_dc_15, e precomputed_sel_op_dc_16, e precomputed_sel_op_dc_17, e precomputed_sel_op_dc_2, e precomputed_sel_op_dc_3, e precomputed_sel_op_dc_4, e precomputed_sel_op_dc_5, e precomputed_sel_op_dc_6, e precomputed_sel_op_dc_7, e precomputed_sel_op_dc_8, e precomputed_sel_op_dc_9, e precomputed_sel_op_is_address_0_, e precomputed_sel_op_is_address_1_, e precomputed_sel_op_is_address_2_, e precomputed_sel_op_is_address_3_, e precomputed_sel_op_is_address_4_, e precomputed_sel_op_is_address_5_, e precomputed_sel_op_is_address_6_, e precomputed_sel_p_decomposition, e precomputed_sel_phase, e precomputed_sel_range_16, e precomputed_sel_range_8, e precomputed_sel_revertible_append_note_hash, e precomputed_sel_revertible_append_nullifier, e precomputed_sel_sha256_compression, e precomputed_sel_tag_check_reg_0_, e precomputed_sel_tag_check_reg_1_, e precomputed_sel_tag_check_reg_2_, e precomputed_sel_tag_check_reg_3_, e precomputed_sel_tag_check_reg_4_, e precomputed_sel_tag_check_reg_5_, e precomputed_sel_tag_check_reg_6_, e precomputed_sel_tag_is_op2, e precomputed_sel_tag_parameters, e precomputed_sel_to_radix_safe_limbs, e precomputed_sha256_compression_round_constant, e precomputed_subtrace_id, e precomputed_subtrace_operation_id, e precomputed_tag_byte_length, e precomputed_tag_max_bits, e precomputed_tag_max_value, e precomputed_to_radix_safe_limbs, e precomputed_write_public_input_offset, e precomputed_zero, e public_inputs_sel -#define AVM2_WIRE_ENTITIES_E(e) e public_inputs_cols_0_, e public_inputs_cols_1_, e public_inputs_cols_2_, e public_inputs_cols_3_, e address_derivation_address, e address_derivation_address_y, e address_derivation_class_id, e address_derivation_deployer_addr, e address_derivation_g1_x, e address_derivation_g1_y, e address_derivation_incoming_viewing_key_x, e address_derivation_incoming_viewing_key_y, e address_derivation_init_hash, e address_derivation_nullifier_key_x, e address_derivation_nullifier_key_y, e address_derivation_outgoing_viewing_key_x, e address_derivation_outgoing_viewing_key_y, e address_derivation_partial_address, e address_derivation_partial_address_domain_separator, e address_derivation_preaddress, e address_derivation_preaddress_domain_separator, e address_derivation_preaddress_public_key_x, e address_derivation_preaddress_public_key_y, e address_derivation_public_keys_hash, e address_derivation_public_keys_hash_domain_separator, e address_derivation_salt, e address_derivation_salted_init_hash, e address_derivation_sel, e address_derivation_tagging_key_x, e address_derivation_tagging_key_y, e alu_ab_tags_diff_inv, e alu_cf, e alu_helper1, e alu_hi_128, e alu_ia, e alu_ia_tag, e alu_ib, e alu_ib_tag, e alu_ic, e alu_ic_tag, e alu_lo_128, e alu_lt_ops_input_a, e alu_lt_ops_input_b, e alu_lt_ops_result_c, e alu_max_bits, e alu_max_value, e alu_mid, e alu_mid_bits, e alu_op_id, e alu_sel, e alu_sel_ff_lt_ops, e alu_sel_int_lt_ops, e alu_sel_is_ff, e alu_sel_lt_ops, e alu_sel_op_add, e alu_sel_op_eq, e alu_sel_op_lt, e alu_sel_op_lte, e alu_sel_op_not, e alu_sel_op_shl, e alu_sel_op_shr, e alu_sel_op_truncate, e alu_sel_tag_err, e alu_sel_trunc_gte_128, e alu_sel_trunc_lt_128, e alu_sel_trunc_non_trivial, e alu_sel_trunc_trivial, e alu_tag_ff_diff_inv, e bc_decomposition_abs_diff, e bc_decomposition_bytes, e bc_decomposition_bytes_pc_plus_1, e bc_decomposition_bytes_pc_plus_10, e bc_decomposition_bytes_pc_plus_11, e bc_decomposition_bytes_pc_plus_12, e bc_decomposition_bytes_pc_plus_13, e bc_decomposition_bytes_pc_plus_14, e bc_decomposition_bytes_pc_plus_15, e bc_decomposition_bytes_pc_plus_16, e bc_decomposition_bytes_pc_plus_17, e bc_decomposition_bytes_pc_plus_18, e bc_decomposition_bytes_pc_plus_19, e bc_decomposition_bytes_pc_plus_2, e bc_decomposition_bytes_pc_plus_20, e bc_decomposition_bytes_pc_plus_21, e bc_decomposition_bytes_pc_plus_22, e bc_decomposition_bytes_pc_plus_23, e bc_decomposition_bytes_pc_plus_24, e bc_decomposition_bytes_pc_plus_25, e bc_decomposition_bytes_pc_plus_26, e bc_decomposition_bytes_pc_plus_27, e bc_decomposition_bytes_pc_plus_28, e bc_decomposition_bytes_pc_plus_29, e bc_decomposition_bytes_pc_plus_3, e bc_decomposition_bytes_pc_plus_30, e bc_decomposition_bytes_pc_plus_31, e bc_decomposition_bytes_pc_plus_32, e bc_decomposition_bytes_pc_plus_33, e bc_decomposition_bytes_pc_plus_34, e bc_decomposition_bytes_pc_plus_35, e bc_decomposition_bytes_pc_plus_36, e bc_decomposition_bytes_pc_plus_4, e bc_decomposition_bytes_pc_plus_5, e bc_decomposition_bytes_pc_plus_6, e bc_decomposition_bytes_pc_plus_7, e bc_decomposition_bytes_pc_plus_8, e bc_decomposition_bytes_pc_plus_9, e bc_decomposition_bytes_rem_inv, e bc_decomposition_bytes_rem_min_one_inv, e bc_decomposition_bytes_remaining, e bc_decomposition_bytes_to_read, e bc_decomposition_id, e bc_decomposition_last_of_contract, e bc_decomposition_packed_field, e bc_decomposition_pc, e bc_decomposition_sel, e bc_decomposition_sel_overflow_correction_needed, e bc_decomposition_sel_packed, e bc_hashing_bytecode_id, e bc_hashing_incremental_hash, e bc_hashing_latch, e bc_hashing_output_hash, e bc_hashing_packed_field, e bc_hashing_pc_index, e bc_hashing_sel, e bc_hashing_start, e bc_retrieval_address, e bc_retrieval_artifact_hash, e bc_retrieval_bytecode_id, e bc_retrieval_current_class_id, e bc_retrieval_error, e bc_retrieval_instance_exists, e bc_retrieval_nullifier_tree_root, e bc_retrieval_private_function_root, e bc_retrieval_public_bytecode_commitment, e bc_retrieval_public_data_tree_root, e bc_retrieval_sel, e bitwise_acc_ia, e bitwise_acc_ib, e bitwise_acc_ic, e bitwise_ctr, e bitwise_ctr_inv, e bitwise_ctr_min_one_inv, e bitwise_err, e bitwise_ia_byte, e bitwise_ib_byte, e bitwise_ic_byte, e bitwise_last, e bitwise_op_id, e bitwise_sel, e bitwise_sel_get_ctr, e bitwise_sel_tag_ff_err, e bitwise_sel_tag_mismatch_err, e bitwise_start, e bitwise_tag_a, e bitwise_tag_a_inv, e bitwise_tag_ab_diff_inv, e bitwise_tag_b, e bitwise_tag_c, e calldata_context_id, e calldata_index, e calldata_latch, e calldata_sel, e calldata_value, e cd_hashing_context_id, e cd_hashing_input_0_, e cd_hashing_input_1_, e cd_hashing_input_2_, e cd_hashing_latch, e cd_hashing_length_remaining, e cd_hashing_output_hash, e cd_hashing_sel, e class_id_derivation_artifact_hash, e class_id_derivation_class_id, e class_id_derivation_private_function_root, e class_id_derivation_public_bytecode_commitment, e class_id_derivation_sel, e class_id_derivation_temp_constant_for_lookup, e context_stack_context_id, e context_stack_context_id_inv, e context_stack_contract_address, e context_stack_entered_context_id, e context_stack_is_static, e context_stack_msg_sender, e context_stack_next_pc, e context_stack_parent_calldata_addr, e context_stack_parent_calldata_size, e context_stack_parent_da_gas_limit, e context_stack_parent_da_gas_used, e context_stack_parent_id, e context_stack_parent_l2_gas_limit, e context_stack_parent_l2_gas_used, e context_stack_sel, e contract_instance_retrieval_address, e contract_instance_retrieval_current_class_id, e contract_instance_retrieval_deployer_addr, e contract_instance_retrieval_deployer_protocol_contract_address, e contract_instance_retrieval_exists, e contract_instance_retrieval_incoming_viewing_key_x, e contract_instance_retrieval_incoming_viewing_key_y, e contract_instance_retrieval_init_hash, e contract_instance_retrieval_nullifier_key_x, e contract_instance_retrieval_nullifier_key_y, e contract_instance_retrieval_nullifier_tree_root, e contract_instance_retrieval_original_class_id, e contract_instance_retrieval_outgoing_viewing_key_x, e contract_instance_retrieval_outgoing_viewing_key_y, e contract_instance_retrieval_public_data_tree_root, e contract_instance_retrieval_salt, e contract_instance_retrieval_sel, e contract_instance_retrieval_tagging_key_x, e contract_instance_retrieval_tagging_key_y, e data_copy_abs_diff_max_read_index, e data_copy_abs_max_read_offset, e data_copy_abs_read_diff, e data_copy_abs_write_diff, e data_copy_cd_copy_col_read, e data_copy_clk, e data_copy_copy_size, e data_copy_dst_addr, e data_copy_dst_context_id, e data_copy_dst_out_of_range_err, e data_copy_err, e data_copy_is_top_level, e data_copy_offset, e data_copy_operation_id, e data_copy_padding, e data_copy_parent_id_inv, e data_copy_read_addr, e data_copy_reads_left, e data_copy_reads_left_inv, e data_copy_sel_cd_copy, e data_copy_sel_end, e data_copy_sel_mem_read, e data_copy_sel_mem_write, e data_copy_sel_offset_gt_max_read, e data_copy_sel_rd_copy, e data_copy_sel_start, e data_copy_sel_start_no_err, e data_copy_src_addr, e data_copy_src_context_id, e data_copy_src_data_size, e data_copy_src_data_size_is_lt, e data_copy_src_out_of_range_err, e data_copy_thirty_two, e data_copy_value, e data_copy_write_count_minus_one_inv, e ecc_add_op, e ecc_double_op, e ecc_inv_2_p_y, e ecc_inv_x_diff, e ecc_inv_y_diff, e ecc_lambda, e ecc_p_is_inf, e ecc_p_x, e ecc_p_y, e ecc_q_is_inf, e ecc_q_x, e ecc_q_y, e ecc_r_is_inf, e ecc_r_x, e ecc_r_y, e ecc_result_infinity, e ecc_sel, e ecc_use_computed_result, e ecc_x_match, e ecc_y_match, e execution_addressing_error_collection_inv, e execution_addressing_gas, e execution_base_address_tag, e execution_base_address_tag_diff_inv, e execution_base_address_val, e execution_base_da_gas, e execution_batched_tags_diff_inv, e execution_batched_tags_diff_inv_reg, e execution_bytecode_id, e execution_call_allocated_left_da_cmp_diff, e execution_call_allocated_left_l2_cmp_diff, e execution_call_is_da_gas_allocated_lt_left, e execution_call_is_l2_gas_allocated_lt_left, e execution_constant_32, e execution_constant_64, e execution_context_id, e execution_contract_address, e execution_da_gas_limit, e execution_da_gas_used, e execution_discard, e execution_dying_context_diff_inv, e execution_dying_context_id, e execution_dying_context_id_inv, e execution_dyn_gas_id, e execution_dynamic_da_gas, e execution_dynamic_da_gas_factor, e execution_dynamic_l2_gas, e execution_dynamic_l2_gas_factor, e execution_enqueued_call_end, e execution_enqueued_call_start, e execution_envvar_pi_row_idx, e execution_ex_opcode, e execution_expected_tag_reg_0_, e execution_expected_tag_reg_1_, e execution_expected_tag_reg_2_, e execution_expected_tag_reg_3_, e execution_expected_tag_reg_4_, e execution_expected_tag_reg_5_, e execution_expected_tag_reg_6_, e execution_has_parent_ctx, e execution_indirect, e execution_instr_length, e execution_internal_call_id, e execution_internal_call_return_id, e execution_internal_call_return_id_inv, e execution_is_address, e execution_is_dagasleft, e execution_is_dying_context, e execution_is_isstaticcall, e execution_is_l2gasleft, e execution_is_parent_id_inv, e execution_is_sender, e execution_is_static, e execution_is_transactionfee, e execution_l1_l2_tree_root, e execution_l1_l2_tree_size, e execution_l1_to_l2_msg_leaf_in_range, e execution_l1_to_l2_msg_tree_leaf_count, e execution_l2_gas_limit, e execution_l2_gas_used, e execution_last, e execution_last_child_returndata_addr, e execution_last_child_returndata_size, e execution_last_child_success, e execution_limit_used_da_cmp_diff, e execution_limit_used_l2_cmp_diff, e execution_max_data_writes_reached, e execution_mem_tag_reg_0_, e execution_mem_tag_reg_1_, e execution_mem_tag_reg_2_, e execution_mem_tag_reg_3_, e execution_mem_tag_reg_4_, e execution_mem_tag_reg_5_, e execution_mem_tag_reg_6_, e execution_msg_sender, e execution_nested_call_from_undiscarded_context, e execution_nested_exit_call, e execution_nested_return, e execution_next_context_id, e execution_next_internal_call_id, e execution_next_pc, e execution_note_hash_leaf_in_range, e execution_note_hash_tree_leaf_count, e execution_note_hash_tree_root, e execution_note_hash_tree_size, e execution_nullifier_tree_root, e execution_nullifier_tree_size, e execution_num_note_hashes_emitted, e execution_num_nullifiers_emitted, e execution_num_relative_operands_inv, e execution_op_0_, e execution_op_1_, e execution_op_2_, e execution_op_3_, e execution_op_4_, e execution_op_5_, e execution_op_6_, e execution_op_after_relative_0_, e execution_op_after_relative_1_, e execution_op_after_relative_2_, e execution_op_after_relative_3_, e execution_op_after_relative_4_, e execution_op_after_relative_5_, e execution_op_after_relative_6_, e execution_opcode_gas, e execution_out_of_gas_da, e execution_out_of_gas_l2, e execution_overflow_range_check_result_0_, e execution_overflow_range_check_result_1_, e execution_overflow_range_check_result_2_, e execution_overflow_range_check_result_3_, e execution_overflow_range_check_result_4_, e execution_overflow_range_check_result_5_, e execution_overflow_range_check_result_6_, e execution_parent_calldata_addr, e execution_parent_calldata_size, e execution_parent_da_gas_limit, e execution_parent_da_gas_used, e execution_parent_id, e execution_parent_l2_gas_limit, e execution_parent_l2_gas_used, e execution_pc, e execution_prev_da_gas_used, e execution_prev_l1_l2_tree_root, e execution_prev_l1_l2_tree_size, e execution_prev_l2_gas_used, e execution_prev_note_hash_tree_root, e execution_prev_note_hash_tree_size, e execution_prev_nullifier_tree_root, e execution_prev_nullifier_tree_size, e execution_prev_num_note_hashes_emitted, e execution_prev_num_nullifiers_emitted, e execution_prev_public_data_tree_root, e execution_prev_public_data_tree_size, e execution_prev_written_public_data_slots_tree_root, e execution_prev_written_public_data_slots_tree_size, e execution_propagate_discard, e execution_public_data_tree_root, e execution_public_data_tree_size, e execution_register_0_, e execution_register_1_, e execution_register_2_, e execution_register_3_, e execution_register_4_, e execution_register_5_, e execution_register_6_, e execution_remaining_data_writes_inv, e execution_remaining_note_hashes_inv, e execution_resolves_dying_context, e execution_rollback_context, e execution_rop_0_, e execution_rop_1_, e execution_rop_2_, e execution_rop_3_, e execution_rop_4_, e execution_rop_5_, e execution_rop_6_, e execution_rop_tag_0_, e execution_rop_tag_1_, e execution_rop_tag_2_, e execution_rop_tag_3_, e execution_rop_tag_4_, e execution_rop_tag_5_, e execution_rop_tag_6_, e execution_rw_reg_0_, e execution_rw_reg_1_, e execution_rw_reg_2_, e execution_rw_reg_3_, e execution_rw_reg_4_, e execution_rw_reg_5_, e execution_rw_reg_6_, e execution_sel, e execution_sel_addressing_error, e execution_sel_base_address_failure, e execution_sel_bytecode_retrieval_failure, e execution_sel_bytecode_retrieval_success, e execution_sel_do_base_check, e execution_sel_enter_call, e execution_sel_envvar_pi_lookup_col0, e execution_sel_envvar_pi_lookup_col1, e execution_sel_error, e execution_sel_execute_alu, e execution_sel_execute_bitwise, e execution_sel_execute_call, e execution_sel_execute_cast, e execution_sel_execute_data_copy, e execution_sel_execute_debug_log, e execution_sel_execute_ecc_add, e execution_sel_execute_emit_notehash, e execution_sel_execute_execution, e execution_sel_execute_get_contract_instance, e execution_sel_execute_get_env_var, e execution_sel_execute_internal_call, e execution_sel_execute_internal_return, e execution_sel_execute_jump, e execution_sel_execute_jumpi, e execution_sel_execute_keccakf1600, e execution_sel_execute_l1_to_l2_message_exists, e execution_sel_execute_mov, e execution_sel_execute_notehash_exists, e execution_sel_execute_poseidon2_perm, e execution_sel_execute_return, e execution_sel_execute_returndata_size, e execution_sel_execute_revert, e execution_sel_execute_set, e execution_sel_execute_sload, e execution_sel_execute_sstore, e execution_sel_execute_static_call, e execution_sel_execute_success_copy, e execution_sel_execute_to_radix, e execution_sel_exit_call, e execution_sel_failure, e execution_sel_first_row_in_context, e execution_sel_gas_bitwise, e execution_sel_gas_calldata_copy, e execution_sel_gas_emit_unencrypted_log, e execution_sel_gas_returndata_copy, e execution_sel_gas_sstore, e execution_sel_gas_to_radix, e execution_sel_instruction_fetching_failure, e execution_sel_instruction_fetching_success, e execution_sel_mem_op_reg_0_, e execution_sel_mem_op_reg_1_, e execution_sel_mem_op_reg_2_, e execution_sel_mem_op_reg_3_, e execution_sel_mem_op_reg_4_, e execution_sel_mem_op_reg_5_, e execution_sel_mem_op_reg_6_, e execution_sel_op_is_address_0_, e execution_sel_op_is_address_1_, e execution_sel_op_is_address_2_, e execution_sel_op_is_address_3_, e execution_sel_op_is_address_4_, e execution_sel_op_is_address_5_, e execution_sel_op_is_address_6_, e execution_sel_op_is_indirect_wire_0_, e execution_sel_op_is_indirect_wire_1_, e execution_sel_op_is_indirect_wire_2_, e execution_sel_op_is_indirect_wire_3_, e execution_sel_op_is_indirect_wire_4_, e execution_sel_op_is_indirect_wire_5_, e execution_sel_op_is_indirect_wire_6_, e execution_sel_op_is_indirect_wire_7_, e execution_sel_op_is_relative_effective_0_, e execution_sel_op_is_relative_effective_1_, e execution_sel_op_is_relative_effective_2_, e execution_sel_op_is_relative_effective_3_, e execution_sel_op_is_relative_effective_4_, e execution_sel_op_is_relative_effective_5_, e execution_sel_op_is_relative_effective_6_, e execution_sel_op_is_relative_wire_0_, e execution_sel_op_is_relative_wire_1_, e execution_sel_op_is_relative_wire_2_, e execution_sel_op_is_relative_wire_3_, e execution_sel_op_is_relative_wire_4_, e execution_sel_op_is_relative_wire_5_, e execution_sel_op_is_relative_wire_6_, e execution_sel_op_is_relative_wire_7_, e execution_sel_op_reg_effective_0_, e execution_sel_op_reg_effective_1_, e execution_sel_op_reg_effective_2_, e execution_sel_op_reg_effective_3_, e execution_sel_op_reg_effective_4_, e execution_sel_op_reg_effective_5_, e execution_sel_op_reg_effective_6_, e execution_sel_opcode_error, e execution_sel_opcode_failure, e execution_sel_out_of_gas, e execution_sel_register_read_error, e execution_sel_relative_overflow_0_, e execution_sel_relative_overflow_1_, e execution_sel_relative_overflow_2_, e execution_sel_relative_overflow_3_, e execution_sel_relative_overflow_4_, e execution_sel_relative_overflow_5_, e execution_sel_relative_overflow_6_, e execution_sel_should_apply_indirection_0_, e execution_sel_should_apply_indirection_1_, e execution_sel_should_apply_indirection_2_, e execution_sel_should_apply_indirection_3_, e execution_sel_should_apply_indirection_4_, e execution_sel_should_apply_indirection_5_, e execution_sel_should_apply_indirection_6_, e execution_sel_should_check_gas, e execution_sel_should_execute_opcode, e execution_sel_should_read_registers, e execution_sel_should_write_registers, e execution_sel_some_final_check_failed, e execution_sel_tag_check_reg_0_, e execution_sel_tag_check_reg_1_, e execution_sel_tag_check_reg_2_, e execution_sel_tag_check_reg_3_, e execution_sel_tag_check_reg_4_, e execution_sel_tag_check_reg_5_, e execution_sel_tag_check_reg_6_, e execution_sel_write_note_hash, e execution_sel_write_public_data, e execution_subtrace_id, e execution_subtrace_operation_id, e execution_transaction_fee, e execution_two_to_32, e execution_value_from_pi, e execution_written_public_data_slots_tree_root, e execution_written_public_data_slots_tree_size, e ff_gt_a, e ff_gt_a_hi, e ff_gt_a_lo, e ff_gt_b, e ff_gt_b_hi, e ff_gt_b_lo, e ff_gt_borrow, e ff_gt_cmp_rng_ctr, e ff_gt_cmp_rng_ctr_inv, e ff_gt_constant_128, e ff_gt_p_a_borrow, e ff_gt_p_b_borrow, e ff_gt_p_sub_a_hi, e ff_gt_p_sub_a_lo, e ff_gt_p_sub_b_hi, e ff_gt_p_sub_b_lo, e ff_gt_res_hi, e ff_gt_res_lo, e ff_gt_result, e ff_gt_sel, e ff_gt_sel_dec, e ff_gt_sel_gt, e ff_gt_sel_shift_rng, e get_contract_instance_clk, e get_contract_instance_contract_address, e get_contract_instance_dst_offset, e get_contract_instance_dst_offset_diff_max_inv, e get_contract_instance_exists_tag, e get_contract_instance_instance_exists, e get_contract_instance_is_class_id, e get_contract_instance_is_deployer, e get_contract_instance_is_init_hash, e get_contract_instance_is_valid_member_enum, e get_contract_instance_is_valid_writes_in_bounds, e get_contract_instance_member_enum, e get_contract_instance_member_tag, e get_contract_instance_member_write_offset, e get_contract_instance_nullifier_tree_root, e get_contract_instance_public_data_tree_root, e get_contract_instance_retrieved_class_id, e get_contract_instance_retrieved_deployer_addr, e get_contract_instance_retrieved_init_hash, e get_contract_instance_sel, e get_contract_instance_sel_error, e get_contract_instance_selected_member, e get_contract_instance_space_id, e gt_abs_diff, e gt_constant_128, e gt_input_a, e gt_input_b, e gt_res, e gt_sel, e instr_fetching_bd0, e instr_fetching_bd1, e instr_fetching_bd10, e instr_fetching_bd11, e instr_fetching_bd12, e instr_fetching_bd13, e instr_fetching_bd14, e instr_fetching_bd15, e instr_fetching_bd16, e instr_fetching_bd17, e instr_fetching_bd18, e instr_fetching_bd19, e instr_fetching_bd2, e instr_fetching_bd20, e instr_fetching_bd21, e instr_fetching_bd22, e instr_fetching_bd23, e instr_fetching_bd24, e instr_fetching_bd25, e instr_fetching_bd26, e instr_fetching_bd27, e instr_fetching_bd28, e instr_fetching_bd29, e instr_fetching_bd3, e instr_fetching_bd30, e instr_fetching_bd31, e instr_fetching_bd32, e instr_fetching_bd33, e instr_fetching_bd34, e instr_fetching_bd35, e instr_fetching_bd36, e instr_fetching_bd4, e instr_fetching_bd5, e instr_fetching_bd6, e instr_fetching_bd7, e instr_fetching_bd8, e instr_fetching_bd9, e instr_fetching_bytecode_id, e instr_fetching_bytecode_size, e instr_fetching_bytes_to_read, e instr_fetching_exec_opcode, e instr_fetching_indirect, e instr_fetching_instr_abs_diff, e instr_fetching_instr_out_of_range, e instr_fetching_instr_size, e instr_fetching_op1, e instr_fetching_op2, e instr_fetching_op3, e instr_fetching_op4, e instr_fetching_op5, e instr_fetching_op6, e instr_fetching_op7, e instr_fetching_opcode_out_of_range, e instr_fetching_pc, e instr_fetching_pc_abs_diff, e instr_fetching_pc_out_of_range, e instr_fetching_pc_size_in_bits, e instr_fetching_sel, e instr_fetching_sel_has_tag, e instr_fetching_sel_op_dc_0, e instr_fetching_sel_op_dc_1, e instr_fetching_sel_op_dc_10, e instr_fetching_sel_op_dc_11, e instr_fetching_sel_op_dc_12, e instr_fetching_sel_op_dc_13, e instr_fetching_sel_op_dc_14, e instr_fetching_sel_op_dc_15, e instr_fetching_sel_op_dc_16, e instr_fetching_sel_op_dc_2, e instr_fetching_sel_op_dc_3, e instr_fetching_sel_op_dc_4, e instr_fetching_sel_op_dc_5, e instr_fetching_sel_op_dc_6, e instr_fetching_sel_op_dc_7, e instr_fetching_sel_op_dc_8, e instr_fetching_sel_op_dc_9, e instr_fetching_sel_parsing_err, e instr_fetching_sel_pc_in_range, e instr_fetching_sel_tag_is_op2, e instr_fetching_tag_out_of_range, e instr_fetching_tag_value, e internal_call_stack_context_id, e internal_call_stack_entered_call_id, e internal_call_stack_id, e internal_call_stack_return_id, e internal_call_stack_return_pc, e internal_call_stack_sel, e keccak_memory_addr, e keccak_memory_clk, e keccak_memory_ctr, e keccak_memory_ctr_end, e keccak_memory_ctr_inv, e keccak_memory_ctr_min_state_size_inv, e keccak_memory_last, e keccak_memory_num_rounds, e keccak_memory_rw, e keccak_memory_sel, e keccak_memory_single_tag_error, e keccak_memory_space_id, e keccak_memory_start_read, e keccak_memory_start_write, e keccak_memory_tag, e keccak_memory_tag_error, e keccak_memory_tag_min_u64_inv, e keccak_memory_val00, e keccak_memory_val01, e keccak_memory_val02, e keccak_memory_val03, e keccak_memory_val04, e keccak_memory_val10, e keccak_memory_val11, e keccak_memory_val12, e keccak_memory_val13, e keccak_memory_val14, e keccak_memory_val20, e keccak_memory_val21, e keccak_memory_val22, e keccak_memory_val23, e keccak_memory_val24, e keccak_memory_val30, e keccak_memory_val31, e keccak_memory_val32, e keccak_memory_val33, e keccak_memory_val34, e keccak_memory_val40, e keccak_memory_val41, e keccak_memory_val42, e keccak_memory_val43, e keccak_memory_val44, e keccakf1600_bitwise_and_op_id, e keccakf1600_bitwise_xor_op_id, e keccakf1600_clk, e keccakf1600_dst_abs_diff, e keccakf1600_dst_addr, e keccakf1600_dst_out_of_range_error, e keccakf1600_error, e keccakf1600_last, e keccakf1600_rot_64_min_len_01, e keccakf1600_rot_64_min_len_03, e keccakf1600_rot_64_min_len_11, e keccakf1600_rot_64_min_len_13, e keccakf1600_rot_64_min_len_20, e keccakf1600_rot_64_min_len_22, e keccakf1600_rot_64_min_len_24, e keccakf1600_rot_64_min_len_31, e keccakf1600_rot_64_min_len_34, e keccakf1600_rot_64_min_len_42, e keccakf1600_rot_len_02, e keccakf1600_rot_len_04, e keccakf1600_rot_len_10, e keccakf1600_rot_len_12, e keccakf1600_rot_len_14, e keccakf1600_rot_len_21, e keccakf1600_rot_len_23, e keccakf1600_rot_len_30, e keccakf1600_rot_len_32, e keccakf1600_rot_len_33, e keccakf1600_rot_len_40, e keccakf1600_rot_len_41, e keccakf1600_rot_len_43, e keccakf1600_rot_len_44, e keccakf1600_round, e keccakf1600_round_cst, e keccakf1600_round_inv, e keccakf1600_sel, e keccakf1600_sel_no_error, e keccakf1600_sel_slice_read, e keccakf1600_sel_slice_write, e keccakf1600_space_id, e keccakf1600_src_abs_diff, e keccakf1600_src_addr, e keccakf1600_src_out_of_range_error, e keccakf1600_start, e keccakf1600_state_chi_00, e keccakf1600_state_chi_01, e keccakf1600_state_chi_02, e keccakf1600_state_chi_03, e keccakf1600_state_chi_04, e keccakf1600_state_chi_10, e keccakf1600_state_chi_11, e keccakf1600_state_chi_12, e keccakf1600_state_chi_13, e keccakf1600_state_chi_14, e keccakf1600_state_chi_20, e keccakf1600_state_chi_21, e keccakf1600_state_chi_22, e keccakf1600_state_chi_23, e keccakf1600_state_chi_24, e keccakf1600_state_chi_30, e keccakf1600_state_chi_31, e keccakf1600_state_chi_32, e keccakf1600_state_chi_33, e keccakf1600_state_chi_34, e keccakf1600_state_chi_40, e keccakf1600_state_chi_41, e keccakf1600_state_chi_42, e keccakf1600_state_chi_43, e keccakf1600_state_chi_44, e keccakf1600_state_in_00, e keccakf1600_state_in_01, e keccakf1600_state_in_02, e keccakf1600_state_in_03, e keccakf1600_state_in_04, e keccakf1600_state_in_10, e keccakf1600_state_in_11, e keccakf1600_state_in_12, e keccakf1600_state_in_13, e keccakf1600_state_in_14, e keccakf1600_state_in_20, e keccakf1600_state_in_21, e keccakf1600_state_in_22, e keccakf1600_state_in_23, e keccakf1600_state_in_24, e keccakf1600_state_in_30, e keccakf1600_state_in_31, e keccakf1600_state_in_32, e keccakf1600_state_in_33, e keccakf1600_state_in_34, e keccakf1600_state_in_40, e keccakf1600_state_in_41, e keccakf1600_state_in_42, e keccakf1600_state_in_43, e keccakf1600_state_in_44, e keccakf1600_state_iota_00, e keccakf1600_state_pi_and_00, e keccakf1600_state_pi_and_01, e keccakf1600_state_pi_and_02, e keccakf1600_state_pi_and_03, e keccakf1600_state_pi_and_04, e keccakf1600_state_pi_and_10, e keccakf1600_state_pi_and_11, e keccakf1600_state_pi_and_12, e keccakf1600_state_pi_and_13, e keccakf1600_state_pi_and_14, e keccakf1600_state_pi_and_20, e keccakf1600_state_pi_and_21, e keccakf1600_state_pi_and_22, e keccakf1600_state_pi_and_23, e keccakf1600_state_pi_and_24, e keccakf1600_state_pi_and_30, e keccakf1600_state_pi_and_31, e keccakf1600_state_pi_and_32, e keccakf1600_state_pi_and_33, e keccakf1600_state_pi_and_34, e keccakf1600_state_pi_and_40, e keccakf1600_state_pi_and_41, e keccakf1600_state_pi_and_42, e keccakf1600_state_pi_and_43, e keccakf1600_state_pi_and_44, e keccakf1600_state_pi_not_00, e keccakf1600_state_pi_not_01, e keccakf1600_state_pi_not_02, e keccakf1600_state_pi_not_03, e keccakf1600_state_pi_not_04, e keccakf1600_state_pi_not_10, e keccakf1600_state_pi_not_11, e keccakf1600_state_pi_not_12, e keccakf1600_state_pi_not_13, e keccakf1600_state_pi_not_14, e keccakf1600_state_pi_not_20, e keccakf1600_state_pi_not_21, e keccakf1600_state_pi_not_22, e keccakf1600_state_pi_not_23, e keccakf1600_state_pi_not_24, e keccakf1600_state_pi_not_30, e keccakf1600_state_pi_not_31, e keccakf1600_state_pi_not_32, e keccakf1600_state_pi_not_33, e keccakf1600_state_pi_not_34, e keccakf1600_state_pi_not_40, e keccakf1600_state_pi_not_41, e keccakf1600_state_pi_not_42, e keccakf1600_state_pi_not_43, e keccakf1600_state_pi_not_44, e keccakf1600_state_rho_01, e keccakf1600_state_rho_02, e keccakf1600_state_rho_03, e keccakf1600_state_rho_04, e keccakf1600_state_rho_10, e keccakf1600_state_rho_11, e keccakf1600_state_rho_12, e keccakf1600_state_rho_13, e keccakf1600_state_rho_14, e keccakf1600_state_rho_20, e keccakf1600_state_rho_21, e keccakf1600_state_rho_22, e keccakf1600_state_rho_23, e keccakf1600_state_rho_24, e keccakf1600_state_rho_30, e keccakf1600_state_rho_31, e keccakf1600_state_rho_32, e keccakf1600_state_rho_33, e keccakf1600_state_rho_34, e keccakf1600_state_rho_40, e keccakf1600_state_rho_41, e keccakf1600_state_rho_42, e keccakf1600_state_rho_43, e keccakf1600_state_rho_44, e keccakf1600_state_theta_00, e keccakf1600_state_theta_01, e keccakf1600_state_theta_02, e keccakf1600_state_theta_03, e keccakf1600_state_theta_04, e keccakf1600_state_theta_10, e keccakf1600_state_theta_11, e keccakf1600_state_theta_12, e keccakf1600_state_theta_13, e keccakf1600_state_theta_14, e keccakf1600_state_theta_20, e keccakf1600_state_theta_21, e keccakf1600_state_theta_22, e keccakf1600_state_theta_23, e keccakf1600_state_theta_24, e keccakf1600_state_theta_30, e keccakf1600_state_theta_31, e keccakf1600_state_theta_32, e keccakf1600_state_theta_33, e keccakf1600_state_theta_34, e keccakf1600_state_theta_40, e keccakf1600_state_theta_41, e keccakf1600_state_theta_42, e keccakf1600_state_theta_43, e keccakf1600_state_theta_44, e keccakf1600_state_theta_hi_01, e keccakf1600_state_theta_hi_02, e keccakf1600_state_theta_hi_03, e keccakf1600_state_theta_hi_04, e keccakf1600_state_theta_hi_10, e keccakf1600_state_theta_hi_11, e keccakf1600_state_theta_hi_12, e keccakf1600_state_theta_hi_13, e keccakf1600_state_theta_hi_14, e keccakf1600_state_theta_hi_20, e keccakf1600_state_theta_hi_21, e keccakf1600_state_theta_hi_22, e keccakf1600_state_theta_hi_23, e keccakf1600_state_theta_hi_24, e keccakf1600_state_theta_hi_30, e keccakf1600_state_theta_hi_31, e keccakf1600_state_theta_hi_32, e keccakf1600_state_theta_hi_33, e keccakf1600_state_theta_hi_34, e keccakf1600_state_theta_hi_40, e keccakf1600_state_theta_hi_41, e keccakf1600_state_theta_hi_42, e keccakf1600_state_theta_hi_43, e keccakf1600_state_theta_hi_44, e keccakf1600_state_theta_low_01, e keccakf1600_state_theta_low_02, e keccakf1600_state_theta_low_03, e keccakf1600_state_theta_low_04, e keccakf1600_state_theta_low_10, e keccakf1600_state_theta_low_11, e keccakf1600_state_theta_low_12, e keccakf1600_state_theta_low_13, e keccakf1600_state_theta_low_14, e keccakf1600_state_theta_low_20, e keccakf1600_state_theta_low_21, e keccakf1600_state_theta_low_22, e keccakf1600_state_theta_low_23, e keccakf1600_state_theta_low_24, e keccakf1600_state_theta_low_30, e keccakf1600_state_theta_low_31, e keccakf1600_state_theta_low_32, e keccakf1600_state_theta_low_33, e keccakf1600_state_theta_low_34, e keccakf1600_state_theta_low_40, e keccakf1600_state_theta_low_41, e keccakf1600_state_theta_low_42, e keccakf1600_state_theta_low_43, e keccakf1600_state_theta_low_44, e keccakf1600_tag_error, e keccakf1600_theta_combined_xor_0, e keccakf1600_theta_combined_xor_1, e keccakf1600_theta_combined_xor_2, e keccakf1600_theta_combined_xor_3, e keccakf1600_theta_combined_xor_4, e keccakf1600_theta_xor_01, e keccakf1600_theta_xor_02, e keccakf1600_theta_xor_03, e keccakf1600_theta_xor_11, e keccakf1600_theta_xor_12, e keccakf1600_theta_xor_13, e keccakf1600_theta_xor_21, e keccakf1600_theta_xor_22, e keccakf1600_theta_xor_23, e keccakf1600_theta_xor_31, e keccakf1600_theta_xor_32, e keccakf1600_theta_xor_33, e keccakf1600_theta_xor_41, e keccakf1600_theta_xor_42, e keccakf1600_theta_xor_43, e keccakf1600_theta_xor_row_0, e keccakf1600_theta_xor_row_1, e keccakf1600_theta_xor_row_2, e keccakf1600_theta_xor_row_3, e keccakf1600_theta_xor_row_4, e keccakf1600_theta_xor_row_low63_0, e keccakf1600_theta_xor_row_low63_1, e keccakf1600_theta_xor_row_low63_2, e keccakf1600_theta_xor_row_low63_3, e keccakf1600_theta_xor_row_low63_4, e keccakf1600_theta_xor_row_msb_0, e keccakf1600_theta_xor_row_msb_1, e keccakf1600_theta_xor_row_msb_2, e keccakf1600_theta_xor_row_msb_3, e keccakf1600_theta_xor_row_msb_4, e keccakf1600_theta_xor_row_rotl1_0, e keccakf1600_theta_xor_row_rotl1_1, e keccakf1600_theta_xor_row_rotl1_2, e keccakf1600_theta_xor_row_rotl1_3, e keccakf1600_theta_xor_row_rotl1_4, e keccakf1600_thirty_two, e l1_to_l2_message_tree_check_exists, e l1_to_l2_message_tree_check_l1_to_l2_message_tree_height, e l1_to_l2_message_tree_check_leaf_index, e l1_to_l2_message_tree_check_leaf_value, e l1_to_l2_message_tree_check_leaf_value_msg_hash_diff_inv, e l1_to_l2_message_tree_check_msg_hash, e l1_to_l2_message_tree_check_root, e l1_to_l2_message_tree_check_sel, e memory_address, e memory_clk, e memory_rw, e memory_sel, e memory_space_id, e memory_tag, e memory_value, e merkle_check_constant_2, e merkle_check_end, e merkle_check_index, e merkle_check_index_is_even, e merkle_check_path_len, e merkle_check_read_left_node, e merkle_check_read_node, e merkle_check_read_output_hash, e merkle_check_read_right_node, e merkle_check_read_root, e merkle_check_remaining_path_len_inv, e merkle_check_sel, e merkle_check_sibling, e merkle_check_start, e merkle_check_write, e merkle_check_write_left_node, e merkle_check_write_node, e merkle_check_write_output_hash, e merkle_check_write_right_node, e merkle_check_write_root, e note_hash_tree_check_address, e note_hash_tree_check_discard, e note_hash_tree_check_exists, e note_hash_tree_check_first_nullifier, e note_hash_tree_check_first_nullifier_pi_index, e note_hash_tree_check_leaf_index, e note_hash_tree_check_next_leaf_value, e note_hash_tree_check_next_root, e note_hash_tree_check_nonce, e note_hash_tree_check_nonce_separator, e note_hash_tree_check_note_hash, e note_hash_tree_check_note_hash_index, e note_hash_tree_check_note_hash_tree_height, e note_hash_tree_check_prev_leaf_value, e note_hash_tree_check_prev_leaf_value_unique_note_hash_diff_inv, e note_hash_tree_check_prev_root, e note_hash_tree_check_public_inputs_index, e note_hash_tree_check_sel, e note_hash_tree_check_should_silo, e note_hash_tree_check_should_unique, e note_hash_tree_check_should_write_to_public_inputs, e note_hash_tree_check_siloed_note_hash, e note_hash_tree_check_siloing_separator, e note_hash_tree_check_unique_note_hash, e note_hash_tree_check_unique_note_hash_separator, e note_hash_tree_check_write, e nullifier_check_address, e nullifier_check_discard, e nullifier_check_exists, e nullifier_check_intermediate_root, e nullifier_check_leaf_not_exists, e nullifier_check_low_leaf_hash, e nullifier_check_low_leaf_index, e nullifier_check_low_leaf_next_index, e nullifier_check_low_leaf_next_nullifier, e nullifier_check_low_leaf_nullifier, e nullifier_check_new_leaf_hash, e nullifier_check_next_nullifier_inv, e nullifier_check_next_nullifier_is_nonzero, e nullifier_check_nullifier, e nullifier_check_nullifier_index, e nullifier_check_nullifier_low_leaf_nullifier_diff_inv, e nullifier_check_public_inputs_index, e nullifier_check_root, e nullifier_check_sel, e nullifier_check_should_insert, e nullifier_check_should_silo, e nullifier_check_should_write_to_public_inputs, e nullifier_check_siloed_nullifier, e nullifier_check_siloing_separator, e nullifier_check_tree_height, e nullifier_check_tree_size_before_write, e nullifier_check_updated_low_leaf_hash, e nullifier_check_updated_low_leaf_next_index, e nullifier_check_updated_low_leaf_next_nullifier, e nullifier_check_write, e nullifier_check_write_root, e poseidon2_hash_a_0, e poseidon2_hash_a_1, e poseidon2_hash_a_2, e poseidon2_hash_a_3, e poseidon2_hash_b_0, e poseidon2_hash_b_1, e poseidon2_hash_b_2, e poseidon2_hash_b_3, e poseidon2_hash_end, e poseidon2_hash_input_0, e poseidon2_hash_input_1, e poseidon2_hash_input_2, e poseidon2_hash_input_len, e poseidon2_hash_num_perm_rounds_rem, e poseidon2_hash_num_perm_rounds_rem_inv, e poseidon2_hash_output, e poseidon2_hash_padding, e poseidon2_hash_sel, e poseidon2_hash_start, e poseidon2_perm_B_10_0, e poseidon2_perm_B_10_1, e poseidon2_perm_B_10_2, e poseidon2_perm_B_10_3, e poseidon2_perm_B_11_0, e poseidon2_perm_B_11_1, e poseidon2_perm_B_11_2, e poseidon2_perm_B_11_3, e poseidon2_perm_B_12_0, e poseidon2_perm_B_12_1, e poseidon2_perm_B_12_2, e poseidon2_perm_B_12_3, e poseidon2_perm_B_13_0, e poseidon2_perm_B_13_1, e poseidon2_perm_B_13_2, e poseidon2_perm_B_13_3, e poseidon2_perm_B_14_0, e poseidon2_perm_B_14_1, e poseidon2_perm_B_14_2, e poseidon2_perm_B_14_3, e poseidon2_perm_B_15_0, e poseidon2_perm_B_15_1, e poseidon2_perm_B_15_2, e poseidon2_perm_B_15_3, e poseidon2_perm_B_16_0, e poseidon2_perm_B_16_1, e poseidon2_perm_B_16_2, e poseidon2_perm_B_16_3, e poseidon2_perm_B_17_0, e poseidon2_perm_B_17_1, e poseidon2_perm_B_17_2, e poseidon2_perm_B_17_3, e poseidon2_perm_B_18_0, e poseidon2_perm_B_18_1, e poseidon2_perm_B_18_2, e poseidon2_perm_B_18_3, e poseidon2_perm_B_19_0, e poseidon2_perm_B_19_1, e poseidon2_perm_B_19_2, e poseidon2_perm_B_19_3, e poseidon2_perm_B_20_0, e poseidon2_perm_B_20_1, e poseidon2_perm_B_20_2, e poseidon2_perm_B_20_3, e poseidon2_perm_B_21_0, e poseidon2_perm_B_21_1, e poseidon2_perm_B_21_2, e poseidon2_perm_B_21_3, e poseidon2_perm_B_22_0, e poseidon2_perm_B_22_1, e poseidon2_perm_B_22_2, e poseidon2_perm_B_22_3, e poseidon2_perm_B_23_0, e poseidon2_perm_B_23_1, e poseidon2_perm_B_23_2, e poseidon2_perm_B_23_3, e poseidon2_perm_B_24_0, e poseidon2_perm_B_24_1, e poseidon2_perm_B_24_2, e poseidon2_perm_B_24_3, e poseidon2_perm_B_25_0, e poseidon2_perm_B_25_1, e poseidon2_perm_B_25_2, e poseidon2_perm_B_25_3, e poseidon2_perm_B_26_0, e poseidon2_perm_B_26_1, e poseidon2_perm_B_26_2, e poseidon2_perm_B_26_3, e poseidon2_perm_B_27_0, e poseidon2_perm_B_27_1, e poseidon2_perm_B_27_2, e poseidon2_perm_B_27_3, e poseidon2_perm_B_28_0, e poseidon2_perm_B_28_1, e poseidon2_perm_B_28_2, e poseidon2_perm_B_28_3, e poseidon2_perm_B_29_0, e poseidon2_perm_B_29_1, e poseidon2_perm_B_29_2, e poseidon2_perm_B_29_3, e poseidon2_perm_B_30_0, e poseidon2_perm_B_30_1, e poseidon2_perm_B_30_2, e poseidon2_perm_B_30_3, e poseidon2_perm_B_31_0, e poseidon2_perm_B_31_1, e poseidon2_perm_B_31_2, e poseidon2_perm_B_31_3, e poseidon2_perm_B_32_0, e poseidon2_perm_B_32_1, e poseidon2_perm_B_32_2, e poseidon2_perm_B_32_3, e poseidon2_perm_B_33_0, e poseidon2_perm_B_33_1, e poseidon2_perm_B_33_2, e poseidon2_perm_B_33_3, e poseidon2_perm_B_34_0, e poseidon2_perm_B_34_1, e poseidon2_perm_B_34_2, e poseidon2_perm_B_34_3, e poseidon2_perm_B_35_0, e poseidon2_perm_B_35_1, e poseidon2_perm_B_35_2, e poseidon2_perm_B_35_3, e poseidon2_perm_B_36_0, e poseidon2_perm_B_36_1, e poseidon2_perm_B_36_2, e poseidon2_perm_B_36_3, e poseidon2_perm_B_37_0, e poseidon2_perm_B_37_1, e poseidon2_perm_B_37_2, e poseidon2_perm_B_37_3, e poseidon2_perm_B_38_0, e poseidon2_perm_B_38_1, e poseidon2_perm_B_38_2, e poseidon2_perm_B_38_3, e poseidon2_perm_B_39_0, e poseidon2_perm_B_39_1, e poseidon2_perm_B_39_2, e poseidon2_perm_B_39_3, e poseidon2_perm_B_40_0, e poseidon2_perm_B_40_1, e poseidon2_perm_B_40_2, e poseidon2_perm_B_40_3, e poseidon2_perm_B_41_0, e poseidon2_perm_B_41_1, e poseidon2_perm_B_41_2, e poseidon2_perm_B_41_3, e poseidon2_perm_B_42_0, e poseidon2_perm_B_42_1, e poseidon2_perm_B_42_2, e poseidon2_perm_B_42_3, e poseidon2_perm_B_43_0, e poseidon2_perm_B_43_1, e poseidon2_perm_B_43_2, e poseidon2_perm_B_43_3, e poseidon2_perm_B_44_0, e poseidon2_perm_B_44_1, e poseidon2_perm_B_44_2, e poseidon2_perm_B_44_3, e poseidon2_perm_B_45_0, e poseidon2_perm_B_45_1, e poseidon2_perm_B_45_2, e poseidon2_perm_B_45_3, e poseidon2_perm_B_46_0, e poseidon2_perm_B_46_1, e poseidon2_perm_B_46_2, e poseidon2_perm_B_46_3, e poseidon2_perm_B_47_0, e poseidon2_perm_B_47_1, e poseidon2_perm_B_47_2, e poseidon2_perm_B_47_3, e poseidon2_perm_B_48_0, e poseidon2_perm_B_48_1, e poseidon2_perm_B_48_2, e poseidon2_perm_B_48_3, e poseidon2_perm_B_49_0, e poseidon2_perm_B_49_1, e poseidon2_perm_B_49_2, e poseidon2_perm_B_49_3, e poseidon2_perm_B_4_0, e poseidon2_perm_B_4_1, e poseidon2_perm_B_4_2, e poseidon2_perm_B_4_3, e poseidon2_perm_B_50_0, e poseidon2_perm_B_50_1, e poseidon2_perm_B_50_2, e poseidon2_perm_B_50_3, e poseidon2_perm_B_51_0, e poseidon2_perm_B_51_1, e poseidon2_perm_B_51_2, e poseidon2_perm_B_51_3, e poseidon2_perm_B_52_0, e poseidon2_perm_B_52_1, e poseidon2_perm_B_52_2, e poseidon2_perm_B_52_3, e poseidon2_perm_B_53_0, e poseidon2_perm_B_53_1, e poseidon2_perm_B_53_2, e poseidon2_perm_B_53_3, e poseidon2_perm_B_54_0, e poseidon2_perm_B_54_1, e poseidon2_perm_B_54_2, e poseidon2_perm_B_54_3, e poseidon2_perm_B_55_0, e poseidon2_perm_B_55_1, e poseidon2_perm_B_55_2, e poseidon2_perm_B_55_3, e poseidon2_perm_B_56_0, e poseidon2_perm_B_56_1, e poseidon2_perm_B_56_2, e poseidon2_perm_B_56_3, e poseidon2_perm_B_57_0, e poseidon2_perm_B_57_1, e poseidon2_perm_B_57_2, e poseidon2_perm_B_57_3, e poseidon2_perm_B_58_0, e poseidon2_perm_B_58_1, e poseidon2_perm_B_58_2, e poseidon2_perm_B_58_3, e poseidon2_perm_B_59_0, e poseidon2_perm_B_59_1, e poseidon2_perm_B_59_2, e poseidon2_perm_B_59_3, e poseidon2_perm_B_5_0, e poseidon2_perm_B_5_1, e poseidon2_perm_B_5_2, e poseidon2_perm_B_5_3, e poseidon2_perm_B_6_0, e poseidon2_perm_B_6_1, e poseidon2_perm_B_6_2, e poseidon2_perm_B_6_3, e poseidon2_perm_B_7_0, e poseidon2_perm_B_7_1, e poseidon2_perm_B_7_2, e poseidon2_perm_B_7_3, e poseidon2_perm_B_8_0, e poseidon2_perm_B_8_1, e poseidon2_perm_B_8_2, e poseidon2_perm_B_8_3, e poseidon2_perm_B_9_0, e poseidon2_perm_B_9_1, e poseidon2_perm_B_9_2, e poseidon2_perm_B_9_3, e poseidon2_perm_EXT_LAYER_4, e poseidon2_perm_EXT_LAYER_5, e poseidon2_perm_EXT_LAYER_6, e poseidon2_perm_EXT_LAYER_7, e poseidon2_perm_T_0_4, e poseidon2_perm_T_0_5, e poseidon2_perm_T_0_6, e poseidon2_perm_T_0_7, e poseidon2_perm_T_1_4, e poseidon2_perm_T_1_5, e poseidon2_perm_T_1_6, e poseidon2_perm_T_1_7, e poseidon2_perm_T_2_4, e poseidon2_perm_T_2_5, e poseidon2_perm_T_2_6, e poseidon2_perm_T_2_7, e poseidon2_perm_T_3_4, e poseidon2_perm_T_3_5, e poseidon2_perm_T_3_6, e poseidon2_perm_T_3_7, e poseidon2_perm_T_60_4, e poseidon2_perm_T_60_5, e poseidon2_perm_T_60_6, e poseidon2_perm_T_60_7, e poseidon2_perm_T_61_4, e poseidon2_perm_T_61_5, e poseidon2_perm_T_61_6, e poseidon2_perm_T_61_7, e poseidon2_perm_T_62_4, e poseidon2_perm_T_62_5, e poseidon2_perm_T_62_6, e poseidon2_perm_T_62_7, e poseidon2_perm_T_63_4, e poseidon2_perm_T_63_5, e poseidon2_perm_T_63_6, e poseidon2_perm_T_63_7, e poseidon2_perm_a_0, e poseidon2_perm_a_1, e poseidon2_perm_a_2, e poseidon2_perm_a_3, e poseidon2_perm_b_0, e poseidon2_perm_b_1, e poseidon2_perm_b_2, e poseidon2_perm_b_3, e poseidon2_perm_sel, e public_data_check_address, e public_data_check_clk, e public_data_check_clk_diff, e public_data_check_constant_32, e public_data_check_discard, e public_data_check_end, e public_data_check_intermediate_root, e public_data_check_leaf_not_exists, e public_data_check_leaf_slot, e public_data_check_leaf_slot_low_leaf_slot_diff_inv, e public_data_check_length_pi_idx, e public_data_check_low_leaf_hash, e public_data_check_low_leaf_index, e public_data_check_low_leaf_next_index, e public_data_check_low_leaf_next_slot, e public_data_check_low_leaf_slot, e public_data_check_low_leaf_value, e public_data_check_new_leaf_hash, e public_data_check_next_slot_inv, e public_data_check_next_slot_is_nonzero, e public_data_check_nondiscaded_write, e public_data_check_not_end, e public_data_check_public_data_writes_length, e public_data_check_root, e public_data_check_sel, e public_data_check_should_insert, e public_data_check_should_write_to_public_inputs, e public_data_check_siloing_separator, e public_data_check_slot, e public_data_check_tree_height, e public_data_check_tree_size_after_write, e public_data_check_tree_size_before_write, e public_data_check_updated_low_leaf_hash, e public_data_check_updated_low_leaf_next_index, e public_data_check_updated_low_leaf_next_slot, e public_data_check_updated_low_leaf_value, e public_data_check_value, e public_data_check_write, e public_data_check_write_idx, e public_data_check_write_root, e public_data_squash_check_clock, e public_data_squash_clk, e public_data_squash_clk_diff, e public_data_squash_constant_32, e public_data_squash_leaf_slot, e public_data_squash_leaf_slot_increase, e public_data_squash_sel, e public_data_squash_write_to_public_inputs, e range_check_dyn_diff, e range_check_dyn_rng_chk_bits, e range_check_dyn_rng_chk_pow_2, e range_check_is_lte_u112, e range_check_is_lte_u128, e range_check_is_lte_u16, e range_check_is_lte_u32, e range_check_is_lte_u48, e range_check_is_lte_u64, e range_check_is_lte_u80, e range_check_is_lte_u96, e range_check_rng_chk_bits, e range_check_sel, e range_check_sel_r0_16_bit_rng_lookup, e range_check_sel_r1_16_bit_rng_lookup, e range_check_sel_r2_16_bit_rng_lookup, e range_check_sel_r3_16_bit_rng_lookup, e range_check_sel_r4_16_bit_rng_lookup, e range_check_sel_r5_16_bit_rng_lookup, e range_check_sel_r6_16_bit_rng_lookup, e range_check_u16_r0, e range_check_u16_r1, e range_check_u16_r2, e range_check_u16_r3, e range_check_u16_r4, e range_check_u16_r5, e range_check_u16_r6, e range_check_u16_r7, e range_check_value, e scalar_mul_bit, e scalar_mul_bit_idx, e scalar_mul_bit_radix, e scalar_mul_end, e scalar_mul_not_end, e scalar_mul_point_inf, e scalar_mul_point_x, e scalar_mul_point_y, e scalar_mul_res_inf, e scalar_mul_res_x, e scalar_mul_res_y, e scalar_mul_scalar, e scalar_mul_sel, e scalar_mul_should_add, e scalar_mul_start, e scalar_mul_temp_inf, e scalar_mul_temp_x, e scalar_mul_temp_y, e sha256_a, e sha256_a_and_b, e sha256_a_and_b_xor_a_and_c, e sha256_a_and_c, e sha256_a_rotr_13, e sha256_a_rotr_2, e sha256_a_rotr_22, e sha256_a_rotr_2_xor_a_rotr_13, e sha256_and_sel, e sha256_b, e sha256_b_and_c, e sha256_c, e sha256_ch, e sha256_clk, e sha256_computed_w_lhs, e sha256_computed_w_rhs, e sha256_d, e sha256_e, e sha256_e_and_f, e sha256_e_rotr_11, e sha256_e_rotr_25, e sha256_e_rotr_6, e sha256_e_rotr_6_xor_e_rotr_11, e sha256_f, e sha256_g, e sha256_h, e sha256_helper_w0, e sha256_helper_w1, e sha256_helper_w10, e sha256_helper_w11, e sha256_helper_w12, e sha256_helper_w13, e sha256_helper_w14, e sha256_helper_w15, e sha256_helper_w2, e sha256_helper_w3, e sha256_helper_w4, e sha256_helper_w5, e sha256_helper_w6, e sha256_helper_w7, e sha256_helper_w8, e sha256_helper_w9, e sha256_init_a, e sha256_init_b, e sha256_init_c, e sha256_init_d, e sha256_init_e, e sha256_init_f, e sha256_init_g, e sha256_init_h, e sha256_input_offset, e sha256_is_input_round, e sha256_latch, e sha256_lhs_a_13, e sha256_lhs_a_2, e sha256_lhs_a_22, e sha256_lhs_e_11, e sha256_lhs_e_25, e sha256_lhs_e_6, e sha256_lhs_w_10, e sha256_lhs_w_17, e sha256_lhs_w_18, e sha256_lhs_w_19, e sha256_lhs_w_3, e sha256_lhs_w_7, e sha256_maj, e sha256_next_a_lhs, e sha256_next_a_rhs, e sha256_next_e_lhs, e sha256_next_e_rhs, e sha256_not_e, e sha256_not_e_and_g, e sha256_output_a_lhs, e sha256_output_a_rhs, e sha256_output_b_lhs, e sha256_output_b_rhs, e sha256_output_c_lhs, e sha256_output_c_rhs, e sha256_output_d_lhs, e sha256_output_d_rhs, e sha256_output_e_lhs, e sha256_output_e_rhs, e sha256_output_f_lhs, e sha256_output_f_rhs, e sha256_output_g_lhs, e sha256_output_g_rhs, e sha256_output_h_lhs, e sha256_output_h_rhs, e sha256_output_offset, e sha256_perform_round, e sha256_rhs_a_13, e sha256_rhs_a_2, e sha256_rhs_a_22, e sha256_rhs_e_11, e sha256_rhs_e_25, e sha256_rhs_e_6, e sha256_rhs_w_10, e sha256_rhs_w_17, e sha256_rhs_w_18, e sha256_rhs_w_19, e sha256_rhs_w_3, e sha256_rhs_w_7, e sha256_round_constant, e sha256_round_count, e sha256_rounds_remaining, e sha256_rounds_remaining_inv, e sha256_s_0, e sha256_s_1, e sha256_sel, e sha256_start, e sha256_state_offset, e sha256_w, e sha256_w_15_rotr_18, e sha256_w_15_rotr_7, e sha256_w_15_rotr_7_xor_w_15_rotr_18, e sha256_w_15_rshift_3, e sha256_w_2_rotr_17, e sha256_w_2_rotr_17_xor_w_2_rotr_19, e sha256_w_2_rotr_19, e sha256_w_2_rshift_10, e sha256_w_s_0, e sha256_w_s_1, e sha256_xor_sel, e to_radix_acc, e to_radix_acc_under_p, e to_radix_end, e to_radix_exponent, e to_radix_found, e to_radix_is_unsafe_limb, e to_radix_limb, e to_radix_limb_eq_p, e to_radix_limb_index, e to_radix_limb_lt_p, e to_radix_limb_p_diff, e to_radix_limb_radix_diff, e to_radix_not_end, e to_radix_not_padding_limb, e to_radix_p_limb, e to_radix_radix, e to_radix_rem_inverse, e to_radix_safe_limbs, e to_radix_safety_diff_inverse, e to_radix_sel, e to_radix_start, e to_radix_value, e tx_calldata_hash, e tx_context_id, e tx_contract_addr, e tx_da_gas_limit, e tx_discard, e tx_effective_fee_per_da_gas, e tx_effective_fee_per_l2_gas, e tx_end_gas_used_pi_offset, e tx_end_phase, e tx_fee, e tx_fee_juice_balance_slot, e tx_fee_juice_balances_slot, e tx_fee_juice_contract_address, e tx_fee_payer, e tx_fee_payer_balance, e tx_fee_payer_new_balance, e tx_fee_payer_pi_offset, e tx_is_collect_fee, e tx_is_l2_l1_msg_phase, e tx_is_padded, e tx_is_public_call_request, e tx_is_revertible, e tx_is_static, e tx_is_teardown_phase, e tx_is_tree_insert_phase, e tx_l2_gas_limit, e tx_l2_l1_msg_content, e tx_l2_l1_msg_contract_address, e tx_l2_l1_msg_recipient, e tx_leaf_value, e tx_msg_sender, e tx_next_context_id, e tx_next_da_gas_used, e tx_next_da_gas_used_sent_to_enqueued_call, e tx_next_l1_l2_tree_root, e tx_next_l1_l2_tree_size, e tx_next_l2_gas_used, e tx_next_l2_gas_used_sent_to_enqueued_call, e tx_next_note_hash_tree_root, e tx_next_note_hash_tree_size, e tx_next_nullifier_tree_root, e tx_next_nullifier_tree_size, e tx_next_num_note_hashes_emitted, e tx_next_num_nullifiers_emitted, e tx_next_public_data_tree_root, e tx_next_public_data_tree_size, e tx_next_written_public_data_slots_tree_root, e tx_next_written_public_data_slots_tree_size, e tx_num_l2_l1_msg_emitted, e tx_phase_value, e tx_prev_da_gas_used, e tx_prev_da_gas_used_sent_to_enqueued_call, e tx_prev_l1_l2_tree_root, e tx_prev_l1_l2_tree_size, e tx_prev_l2_gas_used, e tx_prev_l2_gas_used_sent_to_enqueued_call, e tx_prev_note_hash_tree_root, e tx_prev_note_hash_tree_size, e tx_prev_nullifier_tree_root, e tx_prev_nullifier_tree_size, e tx_prev_num_note_hashes_emitted, e tx_prev_num_nullifiers_emitted, e tx_prev_public_data_tree_root, e tx_prev_public_data_tree_size, e tx_prev_written_public_data_slots_tree_root, e tx_prev_written_public_data_slots_tree_size, e tx_read_pi_length_offset, e tx_read_pi_offset, e tx_remaining_phase_counter, e tx_remaining_phase_inv, e tx_remaining_phase_minus_one_inv, e tx_reverted, e tx_sel, e tx_sel_non_revertible_append_note_hash, e tx_sel_non_revertible_append_nullifier, e tx_sel_read_phase_length, e tx_sel_revertible_append_note_hash, e tx_sel_revertible_append_nullifier, e tx_should_note_hash_append, e tx_should_nullifier_append, e tx_start_phase, e tx_successful_msg_emit, e tx_uint32_max, e tx_write_pi_offset, e update_check_address, e update_check_current_class_id, e update_check_delayed_public_mutable_hash_slot, e update_check_delayed_public_mutable_slot, e update_check_deployer_protocol_contract_address, e update_check_hash_not_zero, e update_check_original_class_id, e update_check_public_data_tree_root, e update_check_public_leaf_index_domain_separator, e update_check_sel, e update_check_timestamp, e update_check_timestamp_is_lt_timestamp_of_change, e update_check_timestamp_of_change, e update_check_timestamp_of_change_bit_size, e update_check_timestamp_of_change_subtraction, e update_check_timestamp_pi_offset, e update_check_update_hash, e update_check_update_hash_inv, e update_check_update_hi_metadata, e update_check_update_hi_metadata_bit_size, e update_check_update_post_class_id_is_zero, e update_check_update_post_class_inv, e update_check_update_pre_class_id_is_zero, e update_check_update_pre_class_inv, e update_check_update_preimage_metadata, e update_check_update_preimage_post_class_id, e update_check_update_preimage_pre_class_id, e update_check_updated_class_ids_slot, e written_public_data_slots_tree_check_address, e written_public_data_slots_tree_check_intermediate_root, e written_public_data_slots_tree_check_leaf_not_exists, e written_public_data_slots_tree_check_leaf_slot, e written_public_data_slots_tree_check_low_leaf_hash, e written_public_data_slots_tree_check_low_leaf_index, e written_public_data_slots_tree_check_low_leaf_next_index, e written_public_data_slots_tree_check_low_leaf_next_slot, e written_public_data_slots_tree_check_low_leaf_slot, e written_public_data_slots_tree_check_new_leaf_hash, e written_public_data_slots_tree_check_next_slot_inv, e written_public_data_slots_tree_check_next_slot_is_nonzero, e written_public_data_slots_tree_check_root, e written_public_data_slots_tree_check_sel, e written_public_data_slots_tree_check_should_insert, e written_public_data_slots_tree_check_siloing_separator, e written_public_data_slots_tree_check_slot, e written_public_data_slots_tree_check_slot_low_leaf_slot_diff_inv, e written_public_data_slots_tree_check_tree_height, e written_public_data_slots_tree_check_tree_size_after_write, e written_public_data_slots_tree_check_tree_size_before_write, e written_public_data_slots_tree_check_updated_low_leaf_hash, e written_public_data_slots_tree_check_updated_low_leaf_next_index, e written_public_data_slots_tree_check_updated_low_leaf_next_slot, e written_public_data_slots_tree_check_write, e written_public_data_slots_tree_check_write_root, e lookup_range_check_dyn_rng_chk_pow_2_counts, e lookup_range_check_dyn_diff_is_u16_counts, e lookup_range_check_r0_is_u16_counts, e lookup_range_check_r1_is_u16_counts, e lookup_range_check_r2_is_u16_counts, e lookup_range_check_r3_is_u16_counts, e lookup_range_check_r4_is_u16_counts, e lookup_range_check_r5_is_u16_counts, e lookup_range_check_r6_is_u16_counts, e lookup_range_check_r7_is_u16_counts, e lookup_ff_gt_a_lo_range_counts, e lookup_ff_gt_a_hi_range_counts, e lookup_gt_gt_range_counts, e lookup_alu_register_tag_value_counts, e lookup_alu_tag_max_bits_value_counts, e lookup_alu_ff_gt_counts, e lookup_alu_int_gt_counts, e lookup_alu_exec_dispatching_cast_counts, e lookup_alu_exec_dispatching_set_counts, e lookup_alu_large_trunc_canonical_dec_counts, e lookup_alu_range_check_trunc_mid_counts, e lookup_bitwise_integral_tag_length_counts, e lookup_bitwise_byte_operations_counts, e lookup_bitwise_dispatch_exec_bitwise_counts, e lookup_keccak_memory_slice_to_mem_counts, e lookup_keccakf1600_theta_xor_01_counts, e lookup_keccakf1600_theta_xor_02_counts, e lookup_keccakf1600_theta_xor_03_counts, e lookup_keccakf1600_theta_xor_row_0_counts, e lookup_keccakf1600_theta_xor_11_counts, e lookup_keccakf1600_theta_xor_12_counts, e lookup_keccakf1600_theta_xor_13_counts, e lookup_keccakf1600_theta_xor_row_1_counts, e lookup_keccakf1600_theta_xor_21_counts, e lookup_keccakf1600_theta_xor_22_counts, e lookup_keccakf1600_theta_xor_23_counts, e lookup_keccakf1600_theta_xor_row_2_counts, e lookup_keccakf1600_theta_xor_31_counts, e lookup_keccakf1600_theta_xor_32_counts, e lookup_keccakf1600_theta_xor_33_counts, e lookup_keccakf1600_theta_xor_row_3_counts, e lookup_keccakf1600_theta_xor_41_counts, e lookup_keccakf1600_theta_xor_42_counts, e lookup_keccakf1600_theta_xor_43_counts, e lookup_keccakf1600_theta_xor_row_4_counts, e lookup_keccakf1600_theta_combined_xor_0_counts, e lookup_keccakf1600_theta_combined_xor_1_counts, e lookup_keccakf1600_theta_combined_xor_2_counts, e lookup_keccakf1600_theta_combined_xor_3_counts, e lookup_keccakf1600_theta_combined_xor_4_counts, e lookup_keccakf1600_state_theta_00_counts, e lookup_keccakf1600_state_theta_01_counts, e lookup_keccakf1600_state_theta_02_counts, e lookup_keccakf1600_state_theta_03_counts, e lookup_keccakf1600_state_theta_04_counts, e lookup_keccakf1600_state_theta_10_counts, e lookup_keccakf1600_state_theta_11_counts, e lookup_keccakf1600_state_theta_12_counts, e lookup_keccakf1600_state_theta_13_counts, e lookup_keccakf1600_state_theta_14_counts, e lookup_keccakf1600_state_theta_20_counts, e lookup_keccakf1600_state_theta_21_counts, e lookup_keccakf1600_state_theta_22_counts, e lookup_keccakf1600_state_theta_23_counts, e lookup_keccakf1600_state_theta_24_counts, e lookup_keccakf1600_state_theta_30_counts, e lookup_keccakf1600_state_theta_31_counts, e lookup_keccakf1600_state_theta_32_counts, e lookup_keccakf1600_state_theta_33_counts, e lookup_keccakf1600_state_theta_34_counts, e lookup_keccakf1600_state_theta_40_counts, e lookup_keccakf1600_state_theta_41_counts, e lookup_keccakf1600_state_theta_42_counts, e lookup_keccakf1600_state_theta_43_counts, e lookup_keccakf1600_state_theta_44_counts, e lookup_keccakf1600_theta_limb_02_range_counts, e lookup_keccakf1600_theta_limb_04_range_counts, e lookup_keccakf1600_theta_limb_10_range_counts, e lookup_keccakf1600_theta_limb_12_range_counts, e lookup_keccakf1600_theta_limb_14_range_counts, e lookup_keccakf1600_theta_limb_21_range_counts, e lookup_keccakf1600_theta_limb_23_range_counts, e lookup_keccakf1600_theta_limb_30_range_counts, e lookup_keccakf1600_theta_limb_32_range_counts, e lookup_keccakf1600_theta_limb_33_range_counts, e lookup_keccakf1600_theta_limb_40_range_counts, e lookup_keccakf1600_theta_limb_41_range_counts, e lookup_keccakf1600_theta_limb_43_range_counts, e lookup_keccakf1600_theta_limb_44_range_counts, e lookup_keccakf1600_theta_limb_01_range_counts, e lookup_keccakf1600_theta_limb_03_range_counts, e lookup_keccakf1600_theta_limb_11_range_counts, e lookup_keccakf1600_theta_limb_13_range_counts, e lookup_keccakf1600_theta_limb_20_range_counts, e lookup_keccakf1600_theta_limb_22_range_counts, e lookup_keccakf1600_theta_limb_24_range_counts, e lookup_keccakf1600_theta_limb_31_range_counts, e lookup_keccakf1600_theta_limb_34_range_counts, e lookup_keccakf1600_theta_limb_42_range_counts, e lookup_keccakf1600_state_pi_and_00_counts, e lookup_keccakf1600_state_pi_and_01_counts, e lookup_keccakf1600_state_pi_and_02_counts, e lookup_keccakf1600_state_pi_and_03_counts, e lookup_keccakf1600_state_pi_and_04_counts, e lookup_keccakf1600_state_pi_and_10_counts, e lookup_keccakf1600_state_pi_and_11_counts, e lookup_keccakf1600_state_pi_and_12_counts, e lookup_keccakf1600_state_pi_and_13_counts, e lookup_keccakf1600_state_pi_and_14_counts, e lookup_keccakf1600_state_pi_and_20_counts, e lookup_keccakf1600_state_pi_and_21_counts, e lookup_keccakf1600_state_pi_and_22_counts, e lookup_keccakf1600_state_pi_and_23_counts, e lookup_keccakf1600_state_pi_and_24_counts, e lookup_keccakf1600_state_pi_and_30_counts, e lookup_keccakf1600_state_pi_and_31_counts, e lookup_keccakf1600_state_pi_and_32_counts, e lookup_keccakf1600_state_pi_and_33_counts, e lookup_keccakf1600_state_pi_and_34_counts, e lookup_keccakf1600_state_pi_and_40_counts, e lookup_keccakf1600_state_pi_and_41_counts, e lookup_keccakf1600_state_pi_and_42_counts, e lookup_keccakf1600_state_pi_and_43_counts, e lookup_keccakf1600_state_pi_and_44_counts, e lookup_keccakf1600_state_chi_00_counts, e lookup_keccakf1600_state_chi_01_counts, e lookup_keccakf1600_state_chi_02_counts, e lookup_keccakf1600_state_chi_03_counts, e lookup_keccakf1600_state_chi_04_counts, e lookup_keccakf1600_state_chi_10_counts, e lookup_keccakf1600_state_chi_11_counts, e lookup_keccakf1600_state_chi_12_counts, e lookup_keccakf1600_state_chi_13_counts, e lookup_keccakf1600_state_chi_14_counts, e lookup_keccakf1600_state_chi_20_counts, e lookup_keccakf1600_state_chi_21_counts, e lookup_keccakf1600_state_chi_22_counts, e lookup_keccakf1600_state_chi_23_counts, e lookup_keccakf1600_state_chi_24_counts, e lookup_keccakf1600_state_chi_30_counts, e lookup_keccakf1600_state_chi_31_counts, e lookup_keccakf1600_state_chi_32_counts, e lookup_keccakf1600_state_chi_33_counts, e lookup_keccakf1600_state_chi_34_counts, e lookup_keccakf1600_state_chi_40_counts, e lookup_keccakf1600_state_chi_41_counts, e lookup_keccakf1600_state_chi_42_counts, e lookup_keccakf1600_state_chi_43_counts, e lookup_keccakf1600_state_chi_44_counts, e lookup_keccakf1600_round_cst_counts, e lookup_keccakf1600_state_iota_00_counts, e lookup_keccakf1600_src_abs_diff_positive_counts, e lookup_keccakf1600_dst_abs_diff_positive_counts, e lookup_sha256_round_constant_counts, e lookup_poseidon2_hash_poseidon2_perm_counts, e lookup_to_radix_limb_range_counts, e lookup_to_radix_limb_less_than_radix_range_counts, e lookup_to_radix_fetch_safe_limbs_counts, e lookup_to_radix_fetch_p_limb_counts, e lookup_to_radix_limb_p_diff_range_counts, e lookup_scalar_mul_to_radix_counts, e lookup_scalar_mul_double_counts, e lookup_scalar_mul_add_counts, e lookup_context_ctx_stack_call_counts, e lookup_context_ctx_stack_rollback_counts, e lookup_context_ctx_stack_return_counts, e lookup_calldata_hashing_cd_hash_counts, e lookup_calldata_hashing_cd_hash_end_counts, e lookup_data_copy_range_max_read_size_diff_counts, e lookup_data_copy_range_read_counts, e lookup_data_copy_range_write_counts, e lookup_data_copy_range_reads_left_counts, e lookup_data_copy_mem_write_counts, e lookup_data_copy_mem_read_counts, e lookup_data_copy_col_read_counts, e lookup_addressing_base_address_from_memory_counts, e lookup_addressing_relative_overflow_range_0_counts, e lookup_addressing_relative_overflow_range_1_counts, e lookup_addressing_relative_overflow_range_2_counts, e lookup_addressing_relative_overflow_range_3_counts, e lookup_addressing_relative_overflow_range_4_counts, e lookup_addressing_relative_overflow_range_5_counts, e lookup_addressing_relative_overflow_range_6_counts, e lookup_addressing_indirect_from_memory_0_counts, e lookup_addressing_indirect_from_memory_1_counts, e lookup_addressing_indirect_from_memory_2_counts, e lookup_addressing_indirect_from_memory_3_counts, e lookup_addressing_indirect_from_memory_4_counts, e lookup_addressing_indirect_from_memory_5_counts, e lookup_addressing_indirect_from_memory_6_counts, e lookup_registers_mem_op_0_counts, e lookup_registers_mem_op_1_counts, e lookup_registers_mem_op_2_counts, e lookup_registers_mem_op_3_counts, e lookup_registers_mem_op_4_counts, e lookup_registers_mem_op_5_counts, e lookup_registers_mem_op_6_counts, e lookup_gas_addressing_gas_read_counts, e lookup_gas_limit_used_l2_range_counts, e lookup_gas_limit_used_da_range_counts, e lookup_merkle_check_merkle_poseidon2_read_counts, e lookup_merkle_check_merkle_poseidon2_write_counts, e lookup_nullifier_check_silo_poseidon2_counts, e lookup_nullifier_check_low_leaf_poseidon2_counts, e lookup_nullifier_check_updated_low_leaf_poseidon2_counts, e lookup_nullifier_check_low_leaf_merkle_check_counts, e lookup_nullifier_check_low_leaf_nullifier_validation_counts, e lookup_nullifier_check_low_leaf_next_nullifier_validation_counts, e lookup_nullifier_check_new_leaf_poseidon2_counts, e lookup_nullifier_check_new_leaf_merkle_check_counts, e lookup_nullifier_check_write_nullifier_to_public_inputs_counts, e lookup_public_data_check_silo_poseidon2_counts, e lookup_public_data_check_low_leaf_slot_validation_counts, e lookup_public_data_check_low_leaf_next_slot_validation_counts, e lookup_public_data_check_low_leaf_poseidon2_0_counts, e lookup_public_data_check_low_leaf_poseidon2_1_counts, e lookup_public_data_check_updated_low_leaf_poseidon2_0_counts, e lookup_public_data_check_updated_low_leaf_poseidon2_1_counts, e lookup_public_data_check_low_leaf_merkle_check_counts, e lookup_public_data_check_new_leaf_poseidon2_0_counts, e lookup_public_data_check_new_leaf_poseidon2_1_counts, e lookup_public_data_check_new_leaf_merkle_check_counts, e lookup_public_data_check_write_public_data_to_public_inputs_counts, e lookup_written_public_data_slots_tree_check_silo_poseidon2_counts, e lookup_written_public_data_slots_tree_check_low_leaf_poseidon2_counts, e lookup_written_public_data_slots_tree_check_updated_low_leaf_poseidon2_counts, e lookup_written_public_data_slots_tree_check_low_leaf_merkle_check_counts, e lookup_written_public_data_slots_tree_check_low_leaf_slot_validation_counts, e lookup_written_public_data_slots_tree_check_low_leaf_next_slot_validation_counts, e lookup_written_public_data_slots_tree_check_new_leaf_poseidon2_counts, e lookup_written_public_data_slots_tree_check_new_leaf_merkle_check_counts, e lookup_l1_to_l2_message_tree_check_merkle_check_counts, e lookup_address_derivation_salted_initialization_hash_poseidon2_0_counts, e lookup_address_derivation_salted_initialization_hash_poseidon2_1_counts, e lookup_address_derivation_partial_address_poseidon2_counts, e lookup_address_derivation_public_keys_hash_poseidon2_0_counts, e lookup_address_derivation_public_keys_hash_poseidon2_1_counts, e lookup_address_derivation_public_keys_hash_poseidon2_2_counts, e lookup_address_derivation_public_keys_hash_poseidon2_3_counts, e lookup_address_derivation_public_keys_hash_poseidon2_4_counts, e lookup_address_derivation_preaddress_poseidon2_counts, e lookup_address_derivation_preaddress_scalar_mul_counts, e lookup_address_derivation_address_ecadd_counts, e lookup_bc_decomposition_bytes_are_bytes_counts, e lookup_bc_decomposition_abs_diff_is_u16_counts, e lookup_bc_hashing_get_packed_field_counts, e lookup_bc_hashing_iv_is_len_counts, e lookup_update_check_timestamp_from_public_inputs_counts, e lookup_update_check_delayed_public_mutable_slot_poseidon2_counts, e lookup_update_check_update_hash_public_data_read_counts, e lookup_update_check_update_hash_poseidon2_counts, e lookup_update_check_update_hi_metadata_range_counts, e lookup_update_check_update_lo_metadata_range_counts, e lookup_update_check_timestamp_of_change_cmp_range_counts, e lookup_contract_instance_retrieval_deployment_nullifier_read_counts, e lookup_contract_instance_retrieval_address_derivation_counts, e lookup_contract_instance_retrieval_update_check_counts, e lookup_bc_retrieval_contract_instance_retrieval_counts, e lookup_bc_retrieval_class_id_derivation_counts, e lookup_instr_fetching_pc_abs_diff_positive_counts, e lookup_instr_fetching_instr_abs_diff_positive_counts, e lookup_instr_fetching_tag_value_validation_counts, e lookup_instr_fetching_bytecode_size_from_bc_dec_counts, e lookup_instr_fetching_bytes_from_bc_dec_counts, e lookup_instr_fetching_wire_instruction_info_counts, e lookup_class_id_derivation_class_id_poseidon2_0_counts, e lookup_class_id_derivation_class_id_poseidon2_1_counts, e lookup_get_env_var_precomputed_info_counts, e lookup_get_env_var_read_from_public_inputs_col0_counts, e lookup_get_env_var_read_from_public_inputs_col1_counts, e lookup_get_contract_instance_precomputed_info_counts, e lookup_get_contract_instance_contract_instance_retrieval_counts, e lookup_get_contract_instance_mem_write_contract_instance_exists_counts, e lookup_get_contract_instance_mem_write_contract_instance_member_counts, e lookup_internal_call_push_call_stack_counts, e lookup_internal_call_unwind_call_stack_counts, e lookup_external_call_call_allocated_left_l2_range_counts, e lookup_external_call_call_allocated_left_da_range_counts, e lookup_sload_storage_read_counts, e lookup_sstore_record_written_storage_slot_counts, e lookup_sstore_storage_write_counts, e lookup_note_hash_tree_check_silo_poseidon2_counts, e lookup_note_hash_tree_check_read_first_nullifier_counts, e lookup_note_hash_tree_check_nonce_computation_poseidon2_counts, e lookup_note_hash_tree_check_unique_note_hash_poseidon2_counts, e lookup_note_hash_tree_check_merkle_check_counts, e lookup_note_hash_tree_check_write_note_hash_to_public_inputs_counts, e lookup_notehash_exists_note_hash_leaf_index_in_range_counts, e lookup_notehash_exists_note_hash_read_counts, e lookup_emit_notehash_notehash_tree_write_counts, e lookup_l1_to_l2_message_exists_l1_to_l2_msg_leaf_index_in_range_counts, e lookup_l1_to_l2_message_exists_l1_to_l2_msg_read_counts, e lookup_execution_bytecode_retrieval_result_counts, e lookup_execution_instruction_fetching_result_counts, e lookup_execution_instruction_fetching_body_counts, e lookup_execution_exec_spec_read_counts, e lookup_execution_dyn_l2_factor_bitwise_counts, e lookup_execution_check_written_storage_slot_counts, e lookup_tx_read_phase_table_counts, e lookup_tx_phase_jump_on_revert_counts, e lookup_tx_read_phase_length_counts, e lookup_tx_read_public_call_request_phase_counts, e lookup_tx_read_tree_insert_value_counts, e lookup_tx_note_hash_append_counts, e lookup_tx_nullifier_append_counts, e lookup_tx_read_l2_l1_msg_counts, e lookup_tx_write_l2_l1_msg_counts, e lookup_tx_read_effective_fee_public_inputs_counts, e lookup_tx_read_fee_payer_public_inputs_counts, e lookup_tx_balance_slot_poseidon2_counts, e lookup_tx_balance_validation_counts -#define AVM2_DERIVED_WITNESS_ENTITIES_E(e) e perm_keccakf1600_read_to_slice_inv, e perm_keccakf1600_write_to_slice_inv, e perm_public_data_check_squashing_inv, e perm_execution_dispatch_keccakf1600_inv, e perm_execution_dispatch_get_contract_instance_inv, e lookup_range_check_dyn_rng_chk_pow_2_inv, e lookup_range_check_dyn_diff_is_u16_inv, e lookup_range_check_r0_is_u16_inv, e lookup_range_check_r1_is_u16_inv, e lookup_range_check_r2_is_u16_inv, e lookup_range_check_r3_is_u16_inv, e lookup_range_check_r4_is_u16_inv, e lookup_range_check_r5_is_u16_inv, e lookup_range_check_r6_is_u16_inv, e lookup_range_check_r7_is_u16_inv, e lookup_ff_gt_a_lo_range_inv, e lookup_ff_gt_a_hi_range_inv, e lookup_gt_gt_range_inv, e lookup_alu_register_tag_value_inv, e lookup_alu_tag_max_bits_value_inv, e lookup_alu_ff_gt_inv, e lookup_alu_int_gt_inv, e lookup_alu_exec_dispatching_cast_inv, e lookup_alu_exec_dispatching_set_inv, e lookup_alu_large_trunc_canonical_dec_inv, e lookup_alu_range_check_trunc_mid_inv, e lookup_bitwise_integral_tag_length_inv, e lookup_bitwise_byte_operations_inv, e lookup_bitwise_dispatch_exec_bitwise_inv, e lookup_keccak_memory_slice_to_mem_inv, e lookup_keccakf1600_theta_xor_01_inv, e lookup_keccakf1600_theta_xor_02_inv, e lookup_keccakf1600_theta_xor_03_inv, e lookup_keccakf1600_theta_xor_row_0_inv, e lookup_keccakf1600_theta_xor_11_inv, e lookup_keccakf1600_theta_xor_12_inv, e lookup_keccakf1600_theta_xor_13_inv, e lookup_keccakf1600_theta_xor_row_1_inv, e lookup_keccakf1600_theta_xor_21_inv, e lookup_keccakf1600_theta_xor_22_inv, e lookup_keccakf1600_theta_xor_23_inv, e lookup_keccakf1600_theta_xor_row_2_inv, e lookup_keccakf1600_theta_xor_31_inv, e lookup_keccakf1600_theta_xor_32_inv, e lookup_keccakf1600_theta_xor_33_inv, e lookup_keccakf1600_theta_xor_row_3_inv, e lookup_keccakf1600_theta_xor_41_inv, e lookup_keccakf1600_theta_xor_42_inv, e lookup_keccakf1600_theta_xor_43_inv, e lookup_keccakf1600_theta_xor_row_4_inv, e lookup_keccakf1600_theta_combined_xor_0_inv, e lookup_keccakf1600_theta_combined_xor_1_inv, e lookup_keccakf1600_theta_combined_xor_2_inv, e lookup_keccakf1600_theta_combined_xor_3_inv, e lookup_keccakf1600_theta_combined_xor_4_inv, e lookup_keccakf1600_state_theta_00_inv, e lookup_keccakf1600_state_theta_01_inv, e lookup_keccakf1600_state_theta_02_inv, e lookup_keccakf1600_state_theta_03_inv, e lookup_keccakf1600_state_theta_04_inv, e lookup_keccakf1600_state_theta_10_inv, e lookup_keccakf1600_state_theta_11_inv, e lookup_keccakf1600_state_theta_12_inv, e lookup_keccakf1600_state_theta_13_inv, e lookup_keccakf1600_state_theta_14_inv, e lookup_keccakf1600_state_theta_20_inv, e lookup_keccakf1600_state_theta_21_inv, e lookup_keccakf1600_state_theta_22_inv, e lookup_keccakf1600_state_theta_23_inv, e lookup_keccakf1600_state_theta_24_inv, e lookup_keccakf1600_state_theta_30_inv, e lookup_keccakf1600_state_theta_31_inv, e lookup_keccakf1600_state_theta_32_inv, e lookup_keccakf1600_state_theta_33_inv, e lookup_keccakf1600_state_theta_34_inv, e lookup_keccakf1600_state_theta_40_inv, e lookup_keccakf1600_state_theta_41_inv, e lookup_keccakf1600_state_theta_42_inv, e lookup_keccakf1600_state_theta_43_inv, e lookup_keccakf1600_state_theta_44_inv, e lookup_keccakf1600_theta_limb_02_range_inv, e lookup_keccakf1600_theta_limb_04_range_inv, e lookup_keccakf1600_theta_limb_10_range_inv, e lookup_keccakf1600_theta_limb_12_range_inv, e lookup_keccakf1600_theta_limb_14_range_inv, e lookup_keccakf1600_theta_limb_21_range_inv, e lookup_keccakf1600_theta_limb_23_range_inv, e lookup_keccakf1600_theta_limb_30_range_inv, e lookup_keccakf1600_theta_limb_32_range_inv, e lookup_keccakf1600_theta_limb_33_range_inv, e lookup_keccakf1600_theta_limb_40_range_inv, e lookup_keccakf1600_theta_limb_41_range_inv, e lookup_keccakf1600_theta_limb_43_range_inv, e lookup_keccakf1600_theta_limb_44_range_inv, e lookup_keccakf1600_theta_limb_01_range_inv, e lookup_keccakf1600_theta_limb_03_range_inv, e lookup_keccakf1600_theta_limb_11_range_inv, e lookup_keccakf1600_theta_limb_13_range_inv, e lookup_keccakf1600_theta_limb_20_range_inv, e lookup_keccakf1600_theta_limb_22_range_inv, e lookup_keccakf1600_theta_limb_24_range_inv, e lookup_keccakf1600_theta_limb_31_range_inv, e lookup_keccakf1600_theta_limb_34_range_inv, e lookup_keccakf1600_theta_limb_42_range_inv, e lookup_keccakf1600_state_pi_and_00_inv, e lookup_keccakf1600_state_pi_and_01_inv, e lookup_keccakf1600_state_pi_and_02_inv, e lookup_keccakf1600_state_pi_and_03_inv, e lookup_keccakf1600_state_pi_and_04_inv, e lookup_keccakf1600_state_pi_and_10_inv, e lookup_keccakf1600_state_pi_and_11_inv, e lookup_keccakf1600_state_pi_and_12_inv, e lookup_keccakf1600_state_pi_and_13_inv, e lookup_keccakf1600_state_pi_and_14_inv, e lookup_keccakf1600_state_pi_and_20_inv, e lookup_keccakf1600_state_pi_and_21_inv, e lookup_keccakf1600_state_pi_and_22_inv, e lookup_keccakf1600_state_pi_and_23_inv, e lookup_keccakf1600_state_pi_and_24_inv, e lookup_keccakf1600_state_pi_and_30_inv, e lookup_keccakf1600_state_pi_and_31_inv, e lookup_keccakf1600_state_pi_and_32_inv, e lookup_keccakf1600_state_pi_and_33_inv, e lookup_keccakf1600_state_pi_and_34_inv, e lookup_keccakf1600_state_pi_and_40_inv, e lookup_keccakf1600_state_pi_and_41_inv, e lookup_keccakf1600_state_pi_and_42_inv, e lookup_keccakf1600_state_pi_and_43_inv, e lookup_keccakf1600_state_pi_and_44_inv, e lookup_keccakf1600_state_chi_00_inv, e lookup_keccakf1600_state_chi_01_inv, e lookup_keccakf1600_state_chi_02_inv, e lookup_keccakf1600_state_chi_03_inv, e lookup_keccakf1600_state_chi_04_inv, e lookup_keccakf1600_state_chi_10_inv, e lookup_keccakf1600_state_chi_11_inv, e lookup_keccakf1600_state_chi_12_inv, e lookup_keccakf1600_state_chi_13_inv, e lookup_keccakf1600_state_chi_14_inv, e lookup_keccakf1600_state_chi_20_inv, e lookup_keccakf1600_state_chi_21_inv, e lookup_keccakf1600_state_chi_22_inv, e lookup_keccakf1600_state_chi_23_inv, e lookup_keccakf1600_state_chi_24_inv, e lookup_keccakf1600_state_chi_30_inv, e lookup_keccakf1600_state_chi_31_inv, e lookup_keccakf1600_state_chi_32_inv, e lookup_keccakf1600_state_chi_33_inv, e lookup_keccakf1600_state_chi_34_inv, e lookup_keccakf1600_state_chi_40_inv, e lookup_keccakf1600_state_chi_41_inv, e lookup_keccakf1600_state_chi_42_inv, e lookup_keccakf1600_state_chi_43_inv, e lookup_keccakf1600_state_chi_44_inv, e lookup_keccakf1600_round_cst_inv, e lookup_keccakf1600_state_iota_00_inv, e lookup_keccakf1600_src_abs_diff_positive_inv, e lookup_keccakf1600_dst_abs_diff_positive_inv, e lookup_sha256_round_constant_inv, e lookup_poseidon2_hash_poseidon2_perm_inv, e lookup_to_radix_limb_range_inv, e lookup_to_radix_limb_less_than_radix_range_inv, e lookup_to_radix_fetch_safe_limbs_inv, e lookup_to_radix_fetch_p_limb_inv, e lookup_to_radix_limb_p_diff_range_inv, e lookup_scalar_mul_to_radix_inv, e lookup_scalar_mul_double_inv, e lookup_scalar_mul_add_inv, e lookup_context_ctx_stack_call_inv, e lookup_context_ctx_stack_rollback_inv, e lookup_context_ctx_stack_return_inv, e lookup_calldata_hashing_cd_hash_inv, e lookup_calldata_hashing_cd_hash_end_inv, e lookup_data_copy_range_max_read_size_diff_inv, e lookup_data_copy_range_read_inv, e lookup_data_copy_range_write_inv, e lookup_data_copy_range_reads_left_inv, e lookup_data_copy_mem_write_inv, e lookup_data_copy_mem_read_inv, e lookup_data_copy_col_read_inv, e lookup_addressing_base_address_from_memory_inv, e lookup_addressing_relative_overflow_range_0_inv, e lookup_addressing_relative_overflow_range_1_inv, e lookup_addressing_relative_overflow_range_2_inv, e lookup_addressing_relative_overflow_range_3_inv, e lookup_addressing_relative_overflow_range_4_inv, e lookup_addressing_relative_overflow_range_5_inv, e lookup_addressing_relative_overflow_range_6_inv, e lookup_addressing_indirect_from_memory_0_inv, e lookup_addressing_indirect_from_memory_1_inv, e lookup_addressing_indirect_from_memory_2_inv, e lookup_addressing_indirect_from_memory_3_inv, e lookup_addressing_indirect_from_memory_4_inv, e lookup_addressing_indirect_from_memory_5_inv, e lookup_addressing_indirect_from_memory_6_inv, e lookup_registers_mem_op_0_inv, e lookup_registers_mem_op_1_inv, e lookup_registers_mem_op_2_inv, e lookup_registers_mem_op_3_inv, e lookup_registers_mem_op_4_inv, e lookup_registers_mem_op_5_inv, e lookup_registers_mem_op_6_inv, e lookup_gas_addressing_gas_read_inv, e lookup_gas_limit_used_l2_range_inv, e lookup_gas_limit_used_da_range_inv, e lookup_merkle_check_merkle_poseidon2_read_inv, e lookup_merkle_check_merkle_poseidon2_write_inv, e lookup_nullifier_check_silo_poseidon2_inv, e lookup_nullifier_check_low_leaf_poseidon2_inv, e lookup_nullifier_check_updated_low_leaf_poseidon2_inv, e lookup_nullifier_check_low_leaf_merkle_check_inv, e lookup_nullifier_check_low_leaf_nullifier_validation_inv, e lookup_nullifier_check_low_leaf_next_nullifier_validation_inv, e lookup_nullifier_check_new_leaf_poseidon2_inv, e lookup_nullifier_check_new_leaf_merkle_check_inv, e lookup_nullifier_check_write_nullifier_to_public_inputs_inv, e lookup_public_data_check_silo_poseidon2_inv, e lookup_public_data_check_low_leaf_slot_validation_inv, e lookup_public_data_check_low_leaf_next_slot_validation_inv, e lookup_public_data_check_low_leaf_poseidon2_0_inv, e lookup_public_data_check_low_leaf_poseidon2_1_inv, e lookup_public_data_check_updated_low_leaf_poseidon2_0_inv, e lookup_public_data_check_updated_low_leaf_poseidon2_1_inv, e lookup_public_data_check_low_leaf_merkle_check_inv, e lookup_public_data_check_new_leaf_poseidon2_0_inv, e lookup_public_data_check_new_leaf_poseidon2_1_inv, e lookup_public_data_check_new_leaf_merkle_check_inv, e lookup_public_data_check_write_public_data_to_public_inputs_inv, e lookup_written_public_data_slots_tree_check_silo_poseidon2_inv, e lookup_written_public_data_slots_tree_check_low_leaf_poseidon2_inv, e lookup_written_public_data_slots_tree_check_updated_low_leaf_poseidon2_inv, e lookup_written_public_data_slots_tree_check_low_leaf_merkle_check_inv, e lookup_written_public_data_slots_tree_check_low_leaf_slot_validation_inv, e lookup_written_public_data_slots_tree_check_low_leaf_next_slot_validation_inv, e lookup_written_public_data_slots_tree_check_new_leaf_poseidon2_inv, e lookup_written_public_data_slots_tree_check_new_leaf_merkle_check_inv, e lookup_l1_to_l2_message_tree_check_merkle_check_inv, e lookup_address_derivation_salted_initialization_hash_poseidon2_0_inv, e lookup_address_derivation_salted_initialization_hash_poseidon2_1_inv, e lookup_address_derivation_partial_address_poseidon2_inv, e lookup_address_derivation_public_keys_hash_poseidon2_0_inv, e lookup_address_derivation_public_keys_hash_poseidon2_1_inv, e lookup_address_derivation_public_keys_hash_poseidon2_2_inv, e lookup_address_derivation_public_keys_hash_poseidon2_3_inv, e lookup_address_derivation_public_keys_hash_poseidon2_4_inv, e lookup_address_derivation_preaddress_poseidon2_inv, e lookup_address_derivation_preaddress_scalar_mul_inv, e lookup_address_derivation_address_ecadd_inv, e lookup_bc_decomposition_bytes_are_bytes_inv, e lookup_bc_decomposition_abs_diff_is_u16_inv, e lookup_bc_hashing_get_packed_field_inv, e lookup_bc_hashing_iv_is_len_inv, e lookup_update_check_timestamp_from_public_inputs_inv, e lookup_update_check_delayed_public_mutable_slot_poseidon2_inv, e lookup_update_check_update_hash_public_data_read_inv, e lookup_update_check_update_hash_poseidon2_inv, e lookup_update_check_update_hi_metadata_range_inv, e lookup_update_check_update_lo_metadata_range_inv, e lookup_update_check_timestamp_of_change_cmp_range_inv, e lookup_contract_instance_retrieval_deployment_nullifier_read_inv, e lookup_contract_instance_retrieval_address_derivation_inv, e lookup_contract_instance_retrieval_update_check_inv, e lookup_bc_retrieval_contract_instance_retrieval_inv, e lookup_bc_retrieval_class_id_derivation_inv, e lookup_instr_fetching_pc_abs_diff_positive_inv, e lookup_instr_fetching_instr_abs_diff_positive_inv, e lookup_instr_fetching_tag_value_validation_inv, e lookup_instr_fetching_bytecode_size_from_bc_dec_inv, e lookup_instr_fetching_bytes_from_bc_dec_inv, e lookup_instr_fetching_wire_instruction_info_inv, e lookup_class_id_derivation_class_id_poseidon2_0_inv, e lookup_class_id_derivation_class_id_poseidon2_1_inv, e lookup_get_env_var_precomputed_info_inv, e lookup_get_env_var_read_from_public_inputs_col0_inv, e lookup_get_env_var_read_from_public_inputs_col1_inv, e lookup_get_contract_instance_precomputed_info_inv, e lookup_get_contract_instance_contract_instance_retrieval_inv, e lookup_get_contract_instance_mem_write_contract_instance_exists_inv, e lookup_get_contract_instance_mem_write_contract_instance_member_inv, e lookup_internal_call_push_call_stack_inv, e lookup_internal_call_unwind_call_stack_inv, e lookup_external_call_call_allocated_left_l2_range_inv, e lookup_external_call_call_allocated_left_da_range_inv, e lookup_sload_storage_read_inv, e lookup_sstore_record_written_storage_slot_inv, e lookup_sstore_storage_write_inv, e lookup_note_hash_tree_check_silo_poseidon2_inv, e lookup_note_hash_tree_check_read_first_nullifier_inv, e lookup_note_hash_tree_check_nonce_computation_poseidon2_inv, e lookup_note_hash_tree_check_unique_note_hash_poseidon2_inv, e lookup_note_hash_tree_check_merkle_check_inv, e lookup_note_hash_tree_check_write_note_hash_to_public_inputs_inv, e lookup_notehash_exists_note_hash_leaf_index_in_range_inv, e lookup_notehash_exists_note_hash_read_inv, e lookup_emit_notehash_notehash_tree_write_inv, e lookup_l1_to_l2_message_exists_l1_to_l2_msg_leaf_index_in_range_inv, e lookup_l1_to_l2_message_exists_l1_to_l2_msg_read_inv, e lookup_execution_bytecode_retrieval_result_inv, e lookup_execution_instruction_fetching_result_inv, e lookup_execution_instruction_fetching_body_inv, e lookup_execution_exec_spec_read_inv, e lookup_execution_dyn_l2_factor_bitwise_inv, e lookup_execution_check_written_storage_slot_inv, e lookup_tx_read_phase_table_inv, e lookup_tx_phase_jump_on_revert_inv, e lookup_tx_read_phase_length_inv, e lookup_tx_read_public_call_request_phase_inv, e lookup_tx_read_tree_insert_value_inv, e lookup_tx_note_hash_append_inv, e lookup_tx_nullifier_append_inv, e lookup_tx_read_l2_l1_msg_inv, e lookup_tx_write_l2_l1_msg_inv, e lookup_tx_read_effective_fee_public_inputs_inv, e lookup_tx_read_fee_payer_public_inputs_inv, e lookup_tx_balance_slot_poseidon2_inv, e lookup_tx_balance_validation_inv +#define AVM2_WIRE_ENTITIES_E(e) e public_inputs_cols_0_, e public_inputs_cols_1_, e public_inputs_cols_2_, e public_inputs_cols_3_, e address_derivation_address, e address_derivation_address_y, e address_derivation_class_id, e address_derivation_deployer_addr, e address_derivation_g1_x, e address_derivation_g1_y, e address_derivation_incoming_viewing_key_x, e address_derivation_incoming_viewing_key_y, e address_derivation_init_hash, e address_derivation_nullifier_key_x, e address_derivation_nullifier_key_y, e address_derivation_outgoing_viewing_key_x, e address_derivation_outgoing_viewing_key_y, e address_derivation_partial_address, e address_derivation_partial_address_domain_separator, e address_derivation_preaddress, e address_derivation_preaddress_domain_separator, e address_derivation_preaddress_public_key_x, e address_derivation_preaddress_public_key_y, e address_derivation_public_keys_hash, e address_derivation_public_keys_hash_domain_separator, e address_derivation_salt, e address_derivation_salted_init_hash, e address_derivation_sel, e address_derivation_tagging_key_x, e address_derivation_tagging_key_y, e alu_ab_tags_diff_inv, e alu_cf, e alu_helper1, e alu_hi_128, e alu_ia, e alu_ia_tag, e alu_ib, e alu_ib_tag, e alu_ic, e alu_ic_tag, e alu_lo_128, e alu_lt_ops_input_a, e alu_lt_ops_input_b, e alu_lt_ops_result_c, e alu_max_bits, e alu_max_value, e alu_mid, e alu_mid_bits, e alu_op_id, e alu_sel, e alu_sel_ff_lt_ops, e alu_sel_int_lt_ops, e alu_sel_is_ff, e alu_sel_lt_ops, e alu_sel_op_add, e alu_sel_op_eq, e alu_sel_op_lt, e alu_sel_op_lte, e alu_sel_op_not, e alu_sel_op_shl, e alu_sel_op_shr, e alu_sel_op_truncate, e alu_sel_tag_err, e alu_sel_trunc_gte_128, e alu_sel_trunc_lt_128, e alu_sel_trunc_non_trivial, e alu_sel_trunc_trivial, e alu_tag_ff_diff_inv, e bc_decomposition_abs_diff, e bc_decomposition_bytes, e bc_decomposition_bytes_pc_plus_1, e bc_decomposition_bytes_pc_plus_10, e bc_decomposition_bytes_pc_plus_11, e bc_decomposition_bytes_pc_plus_12, e bc_decomposition_bytes_pc_plus_13, e bc_decomposition_bytes_pc_plus_14, e bc_decomposition_bytes_pc_plus_15, e bc_decomposition_bytes_pc_plus_16, e bc_decomposition_bytes_pc_plus_17, e bc_decomposition_bytes_pc_plus_18, e bc_decomposition_bytes_pc_plus_19, e bc_decomposition_bytes_pc_plus_2, e bc_decomposition_bytes_pc_plus_20, e bc_decomposition_bytes_pc_plus_21, e bc_decomposition_bytes_pc_plus_22, e bc_decomposition_bytes_pc_plus_23, e bc_decomposition_bytes_pc_plus_24, e bc_decomposition_bytes_pc_plus_25, e bc_decomposition_bytes_pc_plus_26, e bc_decomposition_bytes_pc_plus_27, e bc_decomposition_bytes_pc_plus_28, e bc_decomposition_bytes_pc_plus_29, e bc_decomposition_bytes_pc_plus_3, e bc_decomposition_bytes_pc_plus_30, e bc_decomposition_bytes_pc_plus_31, e bc_decomposition_bytes_pc_plus_32, e bc_decomposition_bytes_pc_plus_33, e bc_decomposition_bytes_pc_plus_34, e bc_decomposition_bytes_pc_plus_35, e bc_decomposition_bytes_pc_plus_36, e bc_decomposition_bytes_pc_plus_4, e bc_decomposition_bytes_pc_plus_5, e bc_decomposition_bytes_pc_plus_6, e bc_decomposition_bytes_pc_plus_7, e bc_decomposition_bytes_pc_plus_8, e bc_decomposition_bytes_pc_plus_9, e bc_decomposition_bytes_rem_inv, e bc_decomposition_bytes_rem_min_one_inv, e bc_decomposition_bytes_remaining, e bc_decomposition_bytes_to_read, e bc_decomposition_id, e bc_decomposition_last_of_contract, e bc_decomposition_packed_field, e bc_decomposition_pc, e bc_decomposition_sel, e bc_decomposition_sel_overflow_correction_needed, e bc_decomposition_sel_packed, e bc_hashing_bytecode_id, e bc_hashing_incremental_hash, e bc_hashing_latch, e bc_hashing_output_hash, e bc_hashing_packed_field, e bc_hashing_pc_index, e bc_hashing_sel, e bc_hashing_start, e bc_retrieval_address, e bc_retrieval_artifact_hash, e bc_retrieval_bytecode_id, e bc_retrieval_current_class_id, e bc_retrieval_error, e bc_retrieval_instance_exists, e bc_retrieval_nullifier_tree_root, e bc_retrieval_private_function_root, e bc_retrieval_public_bytecode_commitment, e bc_retrieval_public_data_tree_root, e bc_retrieval_sel, e bitwise_acc_ia, e bitwise_acc_ib, e bitwise_acc_ic, e bitwise_ctr, e bitwise_ctr_inv, e bitwise_ctr_min_one_inv, e bitwise_err, e bitwise_ia_byte, e bitwise_ib_byte, e bitwise_ic_byte, e bitwise_last, e bitwise_op_id, e bitwise_sel, e bitwise_sel_get_ctr, e bitwise_sel_tag_ff_err, e bitwise_sel_tag_mismatch_err, e bitwise_start, e bitwise_tag_a, e bitwise_tag_a_inv, e bitwise_tag_ab_diff_inv, e bitwise_tag_b, e bitwise_tag_c, e calldata_context_id, e calldata_index, e calldata_latch, e calldata_sel, e calldata_value, e cd_hashing_context_id, e cd_hashing_input_0_, e cd_hashing_input_1_, e cd_hashing_input_2_, e cd_hashing_latch, e cd_hashing_length_remaining, e cd_hashing_output_hash, e cd_hashing_sel, e class_id_derivation_artifact_hash, e class_id_derivation_class_id, e class_id_derivation_private_function_root, e class_id_derivation_public_bytecode_commitment, e class_id_derivation_sel, e class_id_derivation_temp_constant_for_lookup, e context_stack_context_id, e context_stack_context_id_inv, e context_stack_contract_address, e context_stack_entered_context_id, e context_stack_is_static, e context_stack_msg_sender, e context_stack_next_pc, e context_stack_parent_calldata_addr, e context_stack_parent_calldata_size, e context_stack_parent_da_gas_limit, e context_stack_parent_da_gas_used, e context_stack_parent_id, e context_stack_parent_l2_gas_limit, e context_stack_parent_l2_gas_used, e context_stack_sel, e contract_instance_retrieval_address, e contract_instance_retrieval_current_class_id, e contract_instance_retrieval_deployer_addr, e contract_instance_retrieval_deployer_protocol_contract_address, e contract_instance_retrieval_exists, e contract_instance_retrieval_incoming_viewing_key_x, e contract_instance_retrieval_incoming_viewing_key_y, e contract_instance_retrieval_init_hash, e contract_instance_retrieval_nullifier_key_x, e contract_instance_retrieval_nullifier_key_y, e contract_instance_retrieval_nullifier_tree_root, e contract_instance_retrieval_original_class_id, e contract_instance_retrieval_outgoing_viewing_key_x, e contract_instance_retrieval_outgoing_viewing_key_y, e contract_instance_retrieval_public_data_tree_root, e contract_instance_retrieval_salt, e contract_instance_retrieval_sel, e contract_instance_retrieval_tagging_key_x, e contract_instance_retrieval_tagging_key_y, e data_copy_abs_diff_max_read_index, e data_copy_abs_max_read_offset, e data_copy_abs_read_diff, e data_copy_abs_write_diff, e data_copy_cd_copy_col_read, e data_copy_clk, e data_copy_copy_size, e data_copy_dst_addr, e data_copy_dst_context_id, e data_copy_dst_out_of_range_err, e data_copy_err, e data_copy_is_top_level, e data_copy_offset, e data_copy_operation_id, e data_copy_padding, e data_copy_parent_id_inv, e data_copy_read_addr, e data_copy_reads_left, e data_copy_reads_left_inv, e data_copy_sel_cd_copy, e data_copy_sel_end, e data_copy_sel_mem_read, e data_copy_sel_mem_write, e data_copy_sel_offset_gt_max_read, e data_copy_sel_rd_copy, e data_copy_sel_start, e data_copy_sel_start_no_err, e data_copy_src_addr, e data_copy_src_context_id, e data_copy_src_data_size, e data_copy_src_data_size_is_lt, e data_copy_src_out_of_range_err, e data_copy_thirty_two, e data_copy_value, e data_copy_write_count_minus_one_inv, e ecc_add_op, e ecc_double_op, e ecc_inv_2_p_y, e ecc_inv_x_diff, e ecc_inv_y_diff, e ecc_lambda, e ecc_p_is_inf, e ecc_p_x, e ecc_p_y, e ecc_q_is_inf, e ecc_q_x, e ecc_q_y, e ecc_r_is_inf, e ecc_r_x, e ecc_r_y, e ecc_result_infinity, e ecc_sel, e ecc_use_computed_result, e ecc_x_match, e ecc_y_match, e execution_addressing_error_collection_inv, e execution_addressing_gas, e execution_base_address_tag, e execution_base_address_tag_diff_inv, e execution_base_address_val, e execution_base_da_gas, e execution_batched_tags_diff_inv, e execution_batched_tags_diff_inv_reg, e execution_bytecode_id, e execution_call_allocated_left_da_cmp_diff, e execution_call_allocated_left_l2_cmp_diff, e execution_call_is_da_gas_allocated_lt_left, e execution_call_is_l2_gas_allocated_lt_left, e execution_constant_32, e execution_constant_64, e execution_context_id, e execution_contract_address, e execution_da_gas_limit, e execution_da_gas_used, e execution_discard, e execution_dying_context_diff_inv, e execution_dying_context_id, e execution_dying_context_id_inv, e execution_dyn_gas_id, e execution_dynamic_da_gas, e execution_dynamic_da_gas_factor, e execution_dynamic_l2_gas, e execution_dynamic_l2_gas_factor, e execution_enqueued_call_end, e execution_enqueued_call_start, e execution_envvar_pi_row_idx, e execution_ex_opcode, e execution_expected_tag_reg_0_, e execution_expected_tag_reg_1_, e execution_expected_tag_reg_2_, e execution_expected_tag_reg_3_, e execution_expected_tag_reg_4_, e execution_expected_tag_reg_5_, e execution_expected_tag_reg_6_, e execution_has_parent_ctx, e execution_indirect, e execution_instr_length, e execution_internal_call_id, e execution_internal_call_return_id, e execution_internal_call_return_id_inv, e execution_is_address, e execution_is_dagasleft, e execution_is_dying_context, e execution_is_isstaticcall, e execution_is_l2gasleft, e execution_is_parent_id_inv, e execution_is_sender, e execution_is_static, e execution_is_transactionfee, e execution_l1_l2_tree_root, e execution_l1_l2_tree_size, e execution_l1_to_l2_msg_leaf_in_range, e execution_l1_to_l2_msg_tree_leaf_count, e execution_l2_gas_limit, e execution_l2_gas_used, e execution_last, e execution_last_child_returndata_addr, e execution_last_child_returndata_size, e execution_last_child_success, e execution_limit_used_da_cmp_diff, e execution_limit_used_l2_cmp_diff, e execution_max_data_writes_reached, e execution_mem_tag_reg_0_, e execution_mem_tag_reg_1_, e execution_mem_tag_reg_2_, e execution_mem_tag_reg_3_, e execution_mem_tag_reg_4_, e execution_mem_tag_reg_5_, e execution_mem_tag_reg_6_, e execution_msg_sender, e execution_nested_call_from_undiscarded_context, e execution_nested_exit_call, e execution_nested_return, e execution_next_context_id, e execution_next_internal_call_id, e execution_next_pc, e execution_note_hash_leaf_in_range, e execution_note_hash_tree_leaf_count, e execution_note_hash_tree_root, e execution_note_hash_tree_size, e execution_nullifier_tree_root, e execution_nullifier_tree_size, e execution_num_note_hashes_emitted, e execution_num_nullifiers_emitted, e execution_num_relative_operands_inv, e execution_op_0_, e execution_op_1_, e execution_op_2_, e execution_op_3_, e execution_op_4_, e execution_op_5_, e execution_op_6_, e execution_op_after_relative_0_, e execution_op_after_relative_1_, e execution_op_after_relative_2_, e execution_op_after_relative_3_, e execution_op_after_relative_4_, e execution_op_after_relative_5_, e execution_op_after_relative_6_, e execution_opcode_gas, e execution_out_of_gas_da, e execution_out_of_gas_l2, e execution_overflow_range_check_result_0_, e execution_overflow_range_check_result_1_, e execution_overflow_range_check_result_2_, e execution_overflow_range_check_result_3_, e execution_overflow_range_check_result_4_, e execution_overflow_range_check_result_5_, e execution_overflow_range_check_result_6_, e execution_parent_calldata_addr, e execution_parent_calldata_size, e execution_parent_da_gas_limit, e execution_parent_da_gas_used, e execution_parent_id, e execution_parent_l2_gas_limit, e execution_parent_l2_gas_used, e execution_pc, e execution_prev_da_gas_used, e execution_prev_l1_l2_tree_root, e execution_prev_l1_l2_tree_size, e execution_prev_l2_gas_used, e execution_prev_note_hash_tree_root, e execution_prev_note_hash_tree_size, e execution_prev_nullifier_tree_root, e execution_prev_nullifier_tree_size, e execution_prev_num_note_hashes_emitted, e execution_prev_num_nullifiers_emitted, e execution_prev_public_data_tree_root, e execution_prev_public_data_tree_size, e execution_prev_written_public_data_slots_tree_root, e execution_prev_written_public_data_slots_tree_size, e execution_propagate_discard, e execution_public_data_tree_root, e execution_public_data_tree_size, e execution_register_0_, e execution_register_1_, e execution_register_2_, e execution_register_3_, e execution_register_4_, e execution_register_5_, e execution_register_6_, e execution_remaining_data_writes_inv, e execution_remaining_note_hashes_inv, e execution_resolves_dying_context, e execution_rollback_context, e execution_rop_0_, e execution_rop_1_, e execution_rop_2_, e execution_rop_3_, e execution_rop_4_, e execution_rop_5_, e execution_rop_6_, e execution_rop_tag_0_, e execution_rop_tag_1_, e execution_rop_tag_2_, e execution_rop_tag_3_, e execution_rop_tag_4_, e execution_rop_tag_5_, e execution_rop_tag_6_, e execution_rw_reg_0_, e execution_rw_reg_1_, e execution_rw_reg_2_, e execution_rw_reg_3_, e execution_rw_reg_4_, e execution_rw_reg_5_, e execution_rw_reg_6_, e execution_sel, e execution_sel_addressing_error, e execution_sel_base_address_failure, e execution_sel_bytecode_retrieval_failure, e execution_sel_bytecode_retrieval_success, e execution_sel_do_base_check, e execution_sel_enter_call, e execution_sel_envvar_pi_lookup_col0, e execution_sel_envvar_pi_lookup_col1, e execution_sel_error, e execution_sel_execute_alu, e execution_sel_execute_bitwise, e execution_sel_execute_call, e execution_sel_execute_cast, e execution_sel_execute_data_copy, e execution_sel_execute_debug_log, e execution_sel_execute_ecc_add, e execution_sel_execute_emit_notehash, e execution_sel_execute_execution, e execution_sel_execute_get_contract_instance, e execution_sel_execute_get_env_var, e execution_sel_execute_internal_call, e execution_sel_execute_internal_return, e execution_sel_execute_jump, e execution_sel_execute_jumpi, e execution_sel_execute_keccakf1600, e execution_sel_execute_l1_to_l2_message_exists, e execution_sel_execute_mov, e execution_sel_execute_notehash_exists, e execution_sel_execute_poseidon2_perm, e execution_sel_execute_return, e execution_sel_execute_returndata_size, e execution_sel_execute_revert, e execution_sel_execute_set, e execution_sel_execute_sload, e execution_sel_execute_sstore, e execution_sel_execute_static_call, e execution_sel_execute_success_copy, e execution_sel_execute_to_radix, e execution_sel_exit_call, e execution_sel_failure, e execution_sel_first_row_in_context, e execution_sel_gas_bitwise, e execution_sel_gas_calldata_copy, e execution_sel_gas_emit_unencrypted_log, e execution_sel_gas_returndata_copy, e execution_sel_gas_sstore, e execution_sel_gas_to_radix, e execution_sel_instruction_fetching_failure, e execution_sel_instruction_fetching_success, e execution_sel_mem_op_reg_0_, e execution_sel_mem_op_reg_1_, e execution_sel_mem_op_reg_2_, e execution_sel_mem_op_reg_3_, e execution_sel_mem_op_reg_4_, e execution_sel_mem_op_reg_5_, e execution_sel_mem_op_reg_6_, e execution_sel_op_is_address_0_, e execution_sel_op_is_address_1_, e execution_sel_op_is_address_2_, e execution_sel_op_is_address_3_, e execution_sel_op_is_address_4_, e execution_sel_op_is_address_5_, e execution_sel_op_is_address_6_, e execution_sel_op_is_indirect_wire_0_, e execution_sel_op_is_indirect_wire_1_, e execution_sel_op_is_indirect_wire_2_, e execution_sel_op_is_indirect_wire_3_, e execution_sel_op_is_indirect_wire_4_, e execution_sel_op_is_indirect_wire_5_, e execution_sel_op_is_indirect_wire_6_, e execution_sel_op_is_indirect_wire_7_, e execution_sel_op_is_relative_effective_0_, e execution_sel_op_is_relative_effective_1_, e execution_sel_op_is_relative_effective_2_, e execution_sel_op_is_relative_effective_3_, e execution_sel_op_is_relative_effective_4_, e execution_sel_op_is_relative_effective_5_, e execution_sel_op_is_relative_effective_6_, e execution_sel_op_is_relative_wire_0_, e execution_sel_op_is_relative_wire_1_, e execution_sel_op_is_relative_wire_2_, e execution_sel_op_is_relative_wire_3_, e execution_sel_op_is_relative_wire_4_, e execution_sel_op_is_relative_wire_5_, e execution_sel_op_is_relative_wire_6_, e execution_sel_op_is_relative_wire_7_, e execution_sel_op_reg_effective_0_, e execution_sel_op_reg_effective_1_, e execution_sel_op_reg_effective_2_, e execution_sel_op_reg_effective_3_, e execution_sel_op_reg_effective_4_, e execution_sel_op_reg_effective_5_, e execution_sel_op_reg_effective_6_, e execution_sel_opcode_error, e execution_sel_opcode_failure, e execution_sel_out_of_gas, e execution_sel_register_read_error, e execution_sel_relative_overflow_0_, e execution_sel_relative_overflow_1_, e execution_sel_relative_overflow_2_, e execution_sel_relative_overflow_3_, e execution_sel_relative_overflow_4_, e execution_sel_relative_overflow_5_, e execution_sel_relative_overflow_6_, e execution_sel_should_apply_indirection_0_, e execution_sel_should_apply_indirection_1_, e execution_sel_should_apply_indirection_2_, e execution_sel_should_apply_indirection_3_, e execution_sel_should_apply_indirection_4_, e execution_sel_should_apply_indirection_5_, e execution_sel_should_apply_indirection_6_, e execution_sel_should_check_gas, e execution_sel_should_execute_opcode, e execution_sel_should_read_registers, e execution_sel_should_write_registers, e execution_sel_some_final_check_failed, e execution_sel_tag_check_reg_0_, e execution_sel_tag_check_reg_1_, e execution_sel_tag_check_reg_2_, e execution_sel_tag_check_reg_3_, e execution_sel_tag_check_reg_4_, e execution_sel_tag_check_reg_5_, e execution_sel_tag_check_reg_6_, e execution_sel_write_note_hash, e execution_sel_write_public_data, e execution_subtrace_id, e execution_subtrace_operation_id, e execution_transaction_fee, e execution_two_to_32, e execution_value_from_pi, e execution_written_public_data_slots_tree_root, e execution_written_public_data_slots_tree_size, e ff_gt_a, e ff_gt_a_hi, e ff_gt_a_lo, e ff_gt_b, e ff_gt_b_hi, e ff_gt_b_lo, e ff_gt_borrow, e ff_gt_cmp_rng_ctr, e ff_gt_cmp_rng_ctr_inv, e ff_gt_constant_128, e ff_gt_p_a_borrow, e ff_gt_p_b_borrow, e ff_gt_p_sub_a_hi, e ff_gt_p_sub_a_lo, e ff_gt_p_sub_b_hi, e ff_gt_p_sub_b_lo, e ff_gt_res_hi, e ff_gt_res_lo, e ff_gt_result, e ff_gt_sel, e ff_gt_sel_dec, e ff_gt_sel_gt, e ff_gt_sel_shift_rng, e get_contract_instance_clk, e get_contract_instance_contract_address, e get_contract_instance_dst_offset, e get_contract_instance_dst_offset_diff_max_inv, e get_contract_instance_exists_tag, e get_contract_instance_instance_exists, e get_contract_instance_is_class_id, e get_contract_instance_is_deployer, e get_contract_instance_is_init_hash, e get_contract_instance_is_valid_member_enum, e get_contract_instance_is_valid_writes_in_bounds, e get_contract_instance_member_enum, e get_contract_instance_member_tag, e get_contract_instance_member_write_offset, e get_contract_instance_nullifier_tree_root, e get_contract_instance_public_data_tree_root, e get_contract_instance_retrieved_class_id, e get_contract_instance_retrieved_deployer_addr, e get_contract_instance_retrieved_init_hash, e get_contract_instance_sel, e get_contract_instance_sel_error, e get_contract_instance_selected_member, e get_contract_instance_space_id, e gt_abs_diff, e gt_constant_128, e gt_input_a, e gt_input_b, e gt_res, e gt_sel, e instr_fetching_bd0, e instr_fetching_bd1, e instr_fetching_bd10, e instr_fetching_bd11, e instr_fetching_bd12, e instr_fetching_bd13, e instr_fetching_bd14, e instr_fetching_bd15, e instr_fetching_bd16, e instr_fetching_bd17, e instr_fetching_bd18, e instr_fetching_bd19, e instr_fetching_bd2, e instr_fetching_bd20, e instr_fetching_bd21, e instr_fetching_bd22, e instr_fetching_bd23, e instr_fetching_bd24, e instr_fetching_bd25, e instr_fetching_bd26, e instr_fetching_bd27, e instr_fetching_bd28, e instr_fetching_bd29, e instr_fetching_bd3, e instr_fetching_bd30, e instr_fetching_bd31, e instr_fetching_bd32, e instr_fetching_bd33, e instr_fetching_bd34, e instr_fetching_bd35, e instr_fetching_bd36, e instr_fetching_bd4, e instr_fetching_bd5, e instr_fetching_bd6, e instr_fetching_bd7, e instr_fetching_bd8, e instr_fetching_bd9, e instr_fetching_bytecode_id, e instr_fetching_bytecode_size, e instr_fetching_bytes_to_read, e instr_fetching_exec_opcode, e instr_fetching_indirect, e instr_fetching_instr_abs_diff, e instr_fetching_instr_out_of_range, e instr_fetching_instr_size, e instr_fetching_op1, e instr_fetching_op2, e instr_fetching_op3, e instr_fetching_op4, e instr_fetching_op5, e instr_fetching_op6, e instr_fetching_op7, e instr_fetching_opcode_out_of_range, e instr_fetching_pc, e instr_fetching_pc_abs_diff, e instr_fetching_pc_out_of_range, e instr_fetching_pc_size_in_bits, e instr_fetching_sel, e instr_fetching_sel_has_tag, e instr_fetching_sel_op_dc_0, e instr_fetching_sel_op_dc_1, e instr_fetching_sel_op_dc_10, e instr_fetching_sel_op_dc_11, e instr_fetching_sel_op_dc_12, e instr_fetching_sel_op_dc_13, e instr_fetching_sel_op_dc_14, e instr_fetching_sel_op_dc_15, e instr_fetching_sel_op_dc_16, e instr_fetching_sel_op_dc_2, e instr_fetching_sel_op_dc_3, e instr_fetching_sel_op_dc_4, e instr_fetching_sel_op_dc_5, e instr_fetching_sel_op_dc_6, e instr_fetching_sel_op_dc_7, e instr_fetching_sel_op_dc_8, e instr_fetching_sel_op_dc_9, e instr_fetching_sel_parsing_err, e instr_fetching_sel_pc_in_range, e instr_fetching_sel_tag_is_op2, e instr_fetching_tag_out_of_range, e instr_fetching_tag_value, e internal_call_stack_context_id, e internal_call_stack_entered_call_id, e internal_call_stack_id, e internal_call_stack_return_id, e internal_call_stack_return_pc, e internal_call_stack_sel, e keccak_memory_addr, e keccak_memory_clk, e keccak_memory_ctr, e keccak_memory_ctr_end, e keccak_memory_ctr_inv, e keccak_memory_ctr_min_state_size_inv, e keccak_memory_last, e keccak_memory_num_rounds, e keccak_memory_rw, e keccak_memory_sel, e keccak_memory_single_tag_error, e keccak_memory_space_id, e keccak_memory_start_read, e keccak_memory_start_write, e keccak_memory_tag, e keccak_memory_tag_error, e keccak_memory_tag_min_u64_inv, e keccak_memory_val00, e keccak_memory_val01, e keccak_memory_val02, e keccak_memory_val03, e keccak_memory_val04, e keccak_memory_val10, e keccak_memory_val11, e keccak_memory_val12, e keccak_memory_val13, e keccak_memory_val14, e keccak_memory_val20, e keccak_memory_val21, e keccak_memory_val22, e keccak_memory_val23, e keccak_memory_val24, e keccak_memory_val30, e keccak_memory_val31, e keccak_memory_val32, e keccak_memory_val33, e keccak_memory_val34, e keccak_memory_val40, e keccak_memory_val41, e keccak_memory_val42, e keccak_memory_val43, e keccak_memory_val44, e keccakf1600_bitwise_and_op_id, e keccakf1600_bitwise_xor_op_id, e keccakf1600_clk, e keccakf1600_dst_abs_diff, e keccakf1600_dst_addr, e keccakf1600_dst_out_of_range_error, e keccakf1600_error, e keccakf1600_last, e keccakf1600_rot_64_min_len_01, e keccakf1600_rot_64_min_len_03, e keccakf1600_rot_64_min_len_11, e keccakf1600_rot_64_min_len_13, e keccakf1600_rot_64_min_len_20, e keccakf1600_rot_64_min_len_22, e keccakf1600_rot_64_min_len_24, e keccakf1600_rot_64_min_len_31, e keccakf1600_rot_64_min_len_34, e keccakf1600_rot_64_min_len_42, e keccakf1600_rot_len_02, e keccakf1600_rot_len_04, e keccakf1600_rot_len_10, e keccakf1600_rot_len_12, e keccakf1600_rot_len_14, e keccakf1600_rot_len_21, e keccakf1600_rot_len_23, e keccakf1600_rot_len_30, e keccakf1600_rot_len_32, e keccakf1600_rot_len_33, e keccakf1600_rot_len_40, e keccakf1600_rot_len_41, e keccakf1600_rot_len_43, e keccakf1600_rot_len_44, e keccakf1600_round, e keccakf1600_round_cst, e keccakf1600_round_inv, e keccakf1600_sel, e keccakf1600_sel_no_error, e keccakf1600_sel_slice_read, e keccakf1600_sel_slice_write, e keccakf1600_space_id, e keccakf1600_src_abs_diff, e keccakf1600_src_addr, e keccakf1600_src_out_of_range_error, e keccakf1600_start, e keccakf1600_state_chi_00, e keccakf1600_state_chi_01, e keccakf1600_state_chi_02, e keccakf1600_state_chi_03, e keccakf1600_state_chi_04, e keccakf1600_state_chi_10, e keccakf1600_state_chi_11, e keccakf1600_state_chi_12, e keccakf1600_state_chi_13, e keccakf1600_state_chi_14, e keccakf1600_state_chi_20, e keccakf1600_state_chi_21, e keccakf1600_state_chi_22, e keccakf1600_state_chi_23, e keccakf1600_state_chi_24, e keccakf1600_state_chi_30, e keccakf1600_state_chi_31, e keccakf1600_state_chi_32, e keccakf1600_state_chi_33, e keccakf1600_state_chi_34, e keccakf1600_state_chi_40, e keccakf1600_state_chi_41, e keccakf1600_state_chi_42, e keccakf1600_state_chi_43, e keccakf1600_state_chi_44, e keccakf1600_state_in_00, e keccakf1600_state_in_01, e keccakf1600_state_in_02, e keccakf1600_state_in_03, e keccakf1600_state_in_04, e keccakf1600_state_in_10, e keccakf1600_state_in_11, e keccakf1600_state_in_12, e keccakf1600_state_in_13, e keccakf1600_state_in_14, e keccakf1600_state_in_20, e keccakf1600_state_in_21, e keccakf1600_state_in_22, e keccakf1600_state_in_23, e keccakf1600_state_in_24, e keccakf1600_state_in_30, e keccakf1600_state_in_31, e keccakf1600_state_in_32, e keccakf1600_state_in_33, e keccakf1600_state_in_34, e keccakf1600_state_in_40, e keccakf1600_state_in_41, e keccakf1600_state_in_42, e keccakf1600_state_in_43, e keccakf1600_state_in_44, e keccakf1600_state_iota_00, e keccakf1600_state_pi_and_00, e keccakf1600_state_pi_and_01, e keccakf1600_state_pi_and_02, e keccakf1600_state_pi_and_03, e keccakf1600_state_pi_and_04, e keccakf1600_state_pi_and_10, e keccakf1600_state_pi_and_11, e keccakf1600_state_pi_and_12, e keccakf1600_state_pi_and_13, e keccakf1600_state_pi_and_14, e keccakf1600_state_pi_and_20, e keccakf1600_state_pi_and_21, e keccakf1600_state_pi_and_22, e keccakf1600_state_pi_and_23, e keccakf1600_state_pi_and_24, e keccakf1600_state_pi_and_30, e keccakf1600_state_pi_and_31, e keccakf1600_state_pi_and_32, e keccakf1600_state_pi_and_33, e keccakf1600_state_pi_and_34, e keccakf1600_state_pi_and_40, e keccakf1600_state_pi_and_41, e keccakf1600_state_pi_and_42, e keccakf1600_state_pi_and_43, e keccakf1600_state_pi_and_44, e keccakf1600_state_pi_not_00, e keccakf1600_state_pi_not_01, e keccakf1600_state_pi_not_02, e keccakf1600_state_pi_not_03, e keccakf1600_state_pi_not_04, e keccakf1600_state_pi_not_10, e keccakf1600_state_pi_not_11, e keccakf1600_state_pi_not_12, e keccakf1600_state_pi_not_13, e keccakf1600_state_pi_not_14, e keccakf1600_state_pi_not_20, e keccakf1600_state_pi_not_21, e keccakf1600_state_pi_not_22, e keccakf1600_state_pi_not_23, e keccakf1600_state_pi_not_24, e keccakf1600_state_pi_not_30, e keccakf1600_state_pi_not_31, e keccakf1600_state_pi_not_32, e keccakf1600_state_pi_not_33, e keccakf1600_state_pi_not_34, e keccakf1600_state_pi_not_40, e keccakf1600_state_pi_not_41, e keccakf1600_state_pi_not_42, e keccakf1600_state_pi_not_43, e keccakf1600_state_pi_not_44, e keccakf1600_state_rho_01, e keccakf1600_state_rho_02, e keccakf1600_state_rho_03, e keccakf1600_state_rho_04, e keccakf1600_state_rho_10, e keccakf1600_state_rho_11, e keccakf1600_state_rho_12, e keccakf1600_state_rho_13, e keccakf1600_state_rho_14, e keccakf1600_state_rho_20, e keccakf1600_state_rho_21, e keccakf1600_state_rho_22, e keccakf1600_state_rho_23, e keccakf1600_state_rho_24, e keccakf1600_state_rho_30, e keccakf1600_state_rho_31, e keccakf1600_state_rho_32, e keccakf1600_state_rho_33, e keccakf1600_state_rho_34, e keccakf1600_state_rho_40, e keccakf1600_state_rho_41, e keccakf1600_state_rho_42, e keccakf1600_state_rho_43, e keccakf1600_state_rho_44, e keccakf1600_state_theta_00, e keccakf1600_state_theta_01, e keccakf1600_state_theta_02, e keccakf1600_state_theta_03, e keccakf1600_state_theta_04, e keccakf1600_state_theta_10, e keccakf1600_state_theta_11, e keccakf1600_state_theta_12, e keccakf1600_state_theta_13, e keccakf1600_state_theta_14, e keccakf1600_state_theta_20, e keccakf1600_state_theta_21, e keccakf1600_state_theta_22, e keccakf1600_state_theta_23, e keccakf1600_state_theta_24, e keccakf1600_state_theta_30, e keccakf1600_state_theta_31, e keccakf1600_state_theta_32, e keccakf1600_state_theta_33, e keccakf1600_state_theta_34, e keccakf1600_state_theta_40, e keccakf1600_state_theta_41, e keccakf1600_state_theta_42, e keccakf1600_state_theta_43, e keccakf1600_state_theta_44, e keccakf1600_state_theta_hi_01, e keccakf1600_state_theta_hi_02, e keccakf1600_state_theta_hi_03, e keccakf1600_state_theta_hi_04, e keccakf1600_state_theta_hi_10, e keccakf1600_state_theta_hi_11, e keccakf1600_state_theta_hi_12, e keccakf1600_state_theta_hi_13, e keccakf1600_state_theta_hi_14, e keccakf1600_state_theta_hi_20, e keccakf1600_state_theta_hi_21, e keccakf1600_state_theta_hi_22, e keccakf1600_state_theta_hi_23, e keccakf1600_state_theta_hi_24, e keccakf1600_state_theta_hi_30, e keccakf1600_state_theta_hi_31, e keccakf1600_state_theta_hi_32, e keccakf1600_state_theta_hi_33, e keccakf1600_state_theta_hi_34, e keccakf1600_state_theta_hi_40, e keccakf1600_state_theta_hi_41, e keccakf1600_state_theta_hi_42, e keccakf1600_state_theta_hi_43, e keccakf1600_state_theta_hi_44, e keccakf1600_state_theta_low_01, e keccakf1600_state_theta_low_02, e keccakf1600_state_theta_low_03, e keccakf1600_state_theta_low_04, e keccakf1600_state_theta_low_10, e keccakf1600_state_theta_low_11, e keccakf1600_state_theta_low_12, e keccakf1600_state_theta_low_13, e keccakf1600_state_theta_low_14, e keccakf1600_state_theta_low_20, e keccakf1600_state_theta_low_21, e keccakf1600_state_theta_low_22, e keccakf1600_state_theta_low_23, e keccakf1600_state_theta_low_24, e keccakf1600_state_theta_low_30, e keccakf1600_state_theta_low_31, e keccakf1600_state_theta_low_32, e keccakf1600_state_theta_low_33, e keccakf1600_state_theta_low_34, e keccakf1600_state_theta_low_40, e keccakf1600_state_theta_low_41, e keccakf1600_state_theta_low_42, e keccakf1600_state_theta_low_43, e keccakf1600_state_theta_low_44, e keccakf1600_tag_error, e keccakf1600_theta_combined_xor_0, e keccakf1600_theta_combined_xor_1, e keccakf1600_theta_combined_xor_2, e keccakf1600_theta_combined_xor_3, e keccakf1600_theta_combined_xor_4, e keccakf1600_theta_xor_01, e keccakf1600_theta_xor_02, e keccakf1600_theta_xor_03, e keccakf1600_theta_xor_11, e keccakf1600_theta_xor_12, e keccakf1600_theta_xor_13, e keccakf1600_theta_xor_21, e keccakf1600_theta_xor_22, e keccakf1600_theta_xor_23, e keccakf1600_theta_xor_31, e keccakf1600_theta_xor_32, e keccakf1600_theta_xor_33, e keccakf1600_theta_xor_41, e keccakf1600_theta_xor_42, e keccakf1600_theta_xor_43, e keccakf1600_theta_xor_row_0, e keccakf1600_theta_xor_row_1, e keccakf1600_theta_xor_row_2, e keccakf1600_theta_xor_row_3, e keccakf1600_theta_xor_row_4, e keccakf1600_theta_xor_row_low63_0, e keccakf1600_theta_xor_row_low63_1, e keccakf1600_theta_xor_row_low63_2, e keccakf1600_theta_xor_row_low63_3, e keccakf1600_theta_xor_row_low63_4, e keccakf1600_theta_xor_row_msb_0, e keccakf1600_theta_xor_row_msb_1, e keccakf1600_theta_xor_row_msb_2, e keccakf1600_theta_xor_row_msb_3, e keccakf1600_theta_xor_row_msb_4, e keccakf1600_theta_xor_row_rotl1_0, e keccakf1600_theta_xor_row_rotl1_1, e keccakf1600_theta_xor_row_rotl1_2, e keccakf1600_theta_xor_row_rotl1_3, e keccakf1600_theta_xor_row_rotl1_4, e keccakf1600_thirty_two, e l1_to_l2_message_tree_check_exists, e l1_to_l2_message_tree_check_l1_to_l2_message_tree_height, e l1_to_l2_message_tree_check_leaf_index, e l1_to_l2_message_tree_check_leaf_value, e l1_to_l2_message_tree_check_leaf_value_msg_hash_diff_inv, e l1_to_l2_message_tree_check_msg_hash, e l1_to_l2_message_tree_check_root, e l1_to_l2_message_tree_check_sel, e memory_address, e memory_clk, e memory_rw, e memory_sel, e memory_space_id, e memory_tag, e memory_value, e merkle_check_constant_2, e merkle_check_end, e merkle_check_index, e merkle_check_index_is_even, e merkle_check_path_len, e merkle_check_read_left_node, e merkle_check_read_node, e merkle_check_read_output_hash, e merkle_check_read_right_node, e merkle_check_read_root, e merkle_check_remaining_path_len_inv, e merkle_check_sel, e merkle_check_sibling, e merkle_check_start, e merkle_check_write, e merkle_check_write_left_node, e merkle_check_write_node, e merkle_check_write_output_hash, e merkle_check_write_right_node, e merkle_check_write_root, e note_hash_tree_check_address, e note_hash_tree_check_discard, e note_hash_tree_check_exists, e note_hash_tree_check_first_nullifier, e note_hash_tree_check_first_nullifier_pi_index, e note_hash_tree_check_leaf_index, e note_hash_tree_check_next_leaf_value, e note_hash_tree_check_next_root, e note_hash_tree_check_nonce, e note_hash_tree_check_nonce_separator, e note_hash_tree_check_note_hash, e note_hash_tree_check_note_hash_index, e note_hash_tree_check_note_hash_tree_height, e note_hash_tree_check_prev_leaf_value, e note_hash_tree_check_prev_leaf_value_unique_note_hash_diff_inv, e note_hash_tree_check_prev_root, e note_hash_tree_check_public_inputs_index, e note_hash_tree_check_sel, e note_hash_tree_check_should_silo, e note_hash_tree_check_should_unique, e note_hash_tree_check_should_write_to_public_inputs, e note_hash_tree_check_siloed_note_hash, e note_hash_tree_check_siloing_separator, e note_hash_tree_check_unique_note_hash, e note_hash_tree_check_unique_note_hash_separator, e note_hash_tree_check_write, e nullifier_check_address, e nullifier_check_discard, e nullifier_check_exists, e nullifier_check_intermediate_root, e nullifier_check_leaf_not_exists, e nullifier_check_low_leaf_hash, e nullifier_check_low_leaf_index, e nullifier_check_low_leaf_next_index, e nullifier_check_low_leaf_next_nullifier, e nullifier_check_low_leaf_nullifier, e nullifier_check_new_leaf_hash, e nullifier_check_next_nullifier_inv, e nullifier_check_next_nullifier_is_nonzero, e nullifier_check_nullifier, e nullifier_check_nullifier_index, e nullifier_check_nullifier_low_leaf_nullifier_diff_inv, e nullifier_check_public_inputs_index, e nullifier_check_root, e nullifier_check_sel, e nullifier_check_should_insert, e nullifier_check_should_silo, e nullifier_check_should_write_to_public_inputs, e nullifier_check_siloed_nullifier, e nullifier_check_siloing_separator, e nullifier_check_tree_height, e nullifier_check_tree_size_before_write, e nullifier_check_updated_low_leaf_hash, e nullifier_check_updated_low_leaf_next_index, e nullifier_check_updated_low_leaf_next_nullifier, e nullifier_check_write, e nullifier_check_write_root, e poseidon2_hash_a_0, e poseidon2_hash_a_1, e poseidon2_hash_a_2, e poseidon2_hash_a_3, e poseidon2_hash_b_0, e poseidon2_hash_b_1, e poseidon2_hash_b_2, e poseidon2_hash_b_3, e poseidon2_hash_end, e poseidon2_hash_input_0, e poseidon2_hash_input_1, e poseidon2_hash_input_2, e poseidon2_hash_input_len, e poseidon2_hash_num_perm_rounds_rem, e poseidon2_hash_num_perm_rounds_rem_inv, e poseidon2_hash_output, e poseidon2_hash_padding, e poseidon2_hash_sel, e poseidon2_hash_start, e poseidon2_perm_B_10_0, e poseidon2_perm_B_10_1, e poseidon2_perm_B_10_2, e poseidon2_perm_B_10_3, e poseidon2_perm_B_11_0, e poseidon2_perm_B_11_1, e poseidon2_perm_B_11_2, e poseidon2_perm_B_11_3, e poseidon2_perm_B_12_0, e poseidon2_perm_B_12_1, e poseidon2_perm_B_12_2, e poseidon2_perm_B_12_3, e poseidon2_perm_B_13_0, e poseidon2_perm_B_13_1, e poseidon2_perm_B_13_2, e poseidon2_perm_B_13_3, e poseidon2_perm_B_14_0, e poseidon2_perm_B_14_1, e poseidon2_perm_B_14_2, e poseidon2_perm_B_14_3, e poseidon2_perm_B_15_0, e poseidon2_perm_B_15_1, e poseidon2_perm_B_15_2, e poseidon2_perm_B_15_3, e poseidon2_perm_B_16_0, e poseidon2_perm_B_16_1, e poseidon2_perm_B_16_2, e poseidon2_perm_B_16_3, e poseidon2_perm_B_17_0, e poseidon2_perm_B_17_1, e poseidon2_perm_B_17_2, e poseidon2_perm_B_17_3, e poseidon2_perm_B_18_0, e poseidon2_perm_B_18_1, e poseidon2_perm_B_18_2, e poseidon2_perm_B_18_3, e poseidon2_perm_B_19_0, e poseidon2_perm_B_19_1, e poseidon2_perm_B_19_2, e poseidon2_perm_B_19_3, e poseidon2_perm_B_20_0, e poseidon2_perm_B_20_1, e poseidon2_perm_B_20_2, e poseidon2_perm_B_20_3, e poseidon2_perm_B_21_0, e poseidon2_perm_B_21_1, e poseidon2_perm_B_21_2, e poseidon2_perm_B_21_3, e poseidon2_perm_B_22_0, e poseidon2_perm_B_22_1, e poseidon2_perm_B_22_2, e poseidon2_perm_B_22_3, e poseidon2_perm_B_23_0, e poseidon2_perm_B_23_1, e poseidon2_perm_B_23_2, e poseidon2_perm_B_23_3, e poseidon2_perm_B_24_0, e poseidon2_perm_B_24_1, e poseidon2_perm_B_24_2, e poseidon2_perm_B_24_3, e poseidon2_perm_B_25_0, e poseidon2_perm_B_25_1, e poseidon2_perm_B_25_2, e poseidon2_perm_B_25_3, e poseidon2_perm_B_26_0, e poseidon2_perm_B_26_1, e poseidon2_perm_B_26_2, e poseidon2_perm_B_26_3, e poseidon2_perm_B_27_0, e poseidon2_perm_B_27_1, e poseidon2_perm_B_27_2, e poseidon2_perm_B_27_3, e poseidon2_perm_B_28_0, e poseidon2_perm_B_28_1, e poseidon2_perm_B_28_2, e poseidon2_perm_B_28_3, e poseidon2_perm_B_29_0, e poseidon2_perm_B_29_1, e poseidon2_perm_B_29_2, e poseidon2_perm_B_29_3, e poseidon2_perm_B_30_0, e poseidon2_perm_B_30_1, e poseidon2_perm_B_30_2, e poseidon2_perm_B_30_3, e poseidon2_perm_B_31_0, e poseidon2_perm_B_31_1, e poseidon2_perm_B_31_2, e poseidon2_perm_B_31_3, e poseidon2_perm_B_32_0, e poseidon2_perm_B_32_1, e poseidon2_perm_B_32_2, e poseidon2_perm_B_32_3, e poseidon2_perm_B_33_0, e poseidon2_perm_B_33_1, e poseidon2_perm_B_33_2, e poseidon2_perm_B_33_3, e poseidon2_perm_B_34_0, e poseidon2_perm_B_34_1, e poseidon2_perm_B_34_2, e poseidon2_perm_B_34_3, e poseidon2_perm_B_35_0, e poseidon2_perm_B_35_1, e poseidon2_perm_B_35_2, e poseidon2_perm_B_35_3, e poseidon2_perm_B_36_0, e poseidon2_perm_B_36_1, e poseidon2_perm_B_36_2, e poseidon2_perm_B_36_3, e poseidon2_perm_B_37_0, e poseidon2_perm_B_37_1, e poseidon2_perm_B_37_2, e poseidon2_perm_B_37_3, e poseidon2_perm_B_38_0, e poseidon2_perm_B_38_1, e poseidon2_perm_B_38_2, e poseidon2_perm_B_38_3, e poseidon2_perm_B_39_0, e poseidon2_perm_B_39_1, e poseidon2_perm_B_39_2, e poseidon2_perm_B_39_3, e poseidon2_perm_B_40_0, e poseidon2_perm_B_40_1, e poseidon2_perm_B_40_2, e poseidon2_perm_B_40_3, e poseidon2_perm_B_41_0, e poseidon2_perm_B_41_1, e poseidon2_perm_B_41_2, e poseidon2_perm_B_41_3, e poseidon2_perm_B_42_0, e poseidon2_perm_B_42_1, e poseidon2_perm_B_42_2, e poseidon2_perm_B_42_3, e poseidon2_perm_B_43_0, e poseidon2_perm_B_43_1, e poseidon2_perm_B_43_2, e poseidon2_perm_B_43_3, e poseidon2_perm_B_44_0, e poseidon2_perm_B_44_1, e poseidon2_perm_B_44_2, e poseidon2_perm_B_44_3, e poseidon2_perm_B_45_0, e poseidon2_perm_B_45_1, e poseidon2_perm_B_45_2, e poseidon2_perm_B_45_3, e poseidon2_perm_B_46_0, e poseidon2_perm_B_46_1, e poseidon2_perm_B_46_2, e poseidon2_perm_B_46_3, e poseidon2_perm_B_47_0, e poseidon2_perm_B_47_1, e poseidon2_perm_B_47_2, e poseidon2_perm_B_47_3, e poseidon2_perm_B_48_0, e poseidon2_perm_B_48_1, e poseidon2_perm_B_48_2, e poseidon2_perm_B_48_3, e poseidon2_perm_B_49_0, e poseidon2_perm_B_49_1, e poseidon2_perm_B_49_2, e poseidon2_perm_B_49_3, e poseidon2_perm_B_4_0, e poseidon2_perm_B_4_1, e poseidon2_perm_B_4_2, e poseidon2_perm_B_4_3, e poseidon2_perm_B_50_0, e poseidon2_perm_B_50_1, e poseidon2_perm_B_50_2, e poseidon2_perm_B_50_3, e poseidon2_perm_B_51_0, e poseidon2_perm_B_51_1, e poseidon2_perm_B_51_2, e poseidon2_perm_B_51_3, e poseidon2_perm_B_52_0, e poseidon2_perm_B_52_1, e poseidon2_perm_B_52_2, e poseidon2_perm_B_52_3, e poseidon2_perm_B_53_0, e poseidon2_perm_B_53_1, e poseidon2_perm_B_53_2, e poseidon2_perm_B_53_3, e poseidon2_perm_B_54_0, e poseidon2_perm_B_54_1, e poseidon2_perm_B_54_2, e poseidon2_perm_B_54_3, e poseidon2_perm_B_55_0, e poseidon2_perm_B_55_1, e poseidon2_perm_B_55_2, e poseidon2_perm_B_55_3, e poseidon2_perm_B_56_0, e poseidon2_perm_B_56_1, e poseidon2_perm_B_56_2, e poseidon2_perm_B_56_3, e poseidon2_perm_B_57_0, e poseidon2_perm_B_57_1, e poseidon2_perm_B_57_2, e poseidon2_perm_B_57_3, e poseidon2_perm_B_58_0, e poseidon2_perm_B_58_1, e poseidon2_perm_B_58_2, e poseidon2_perm_B_58_3, e poseidon2_perm_B_59_0, e poseidon2_perm_B_59_1, e poseidon2_perm_B_59_2, e poseidon2_perm_B_59_3, e poseidon2_perm_B_5_0, e poseidon2_perm_B_5_1, e poseidon2_perm_B_5_2, e poseidon2_perm_B_5_3, e poseidon2_perm_B_6_0, e poseidon2_perm_B_6_1, e poseidon2_perm_B_6_2, e poseidon2_perm_B_6_3, e poseidon2_perm_B_7_0, e poseidon2_perm_B_7_1, e poseidon2_perm_B_7_2, e poseidon2_perm_B_7_3, e poseidon2_perm_B_8_0, e poseidon2_perm_B_8_1, e poseidon2_perm_B_8_2, e poseidon2_perm_B_8_3, e poseidon2_perm_B_9_0, e poseidon2_perm_B_9_1, e poseidon2_perm_B_9_2, e poseidon2_perm_B_9_3, e poseidon2_perm_EXT_LAYER_4, e poseidon2_perm_EXT_LAYER_5, e poseidon2_perm_EXT_LAYER_6, e poseidon2_perm_EXT_LAYER_7, e poseidon2_perm_T_0_4, e poseidon2_perm_T_0_5, e poseidon2_perm_T_0_6, e poseidon2_perm_T_0_7, e poseidon2_perm_T_1_4, e poseidon2_perm_T_1_5, e poseidon2_perm_T_1_6, e poseidon2_perm_T_1_7, e poseidon2_perm_T_2_4, e poseidon2_perm_T_2_5, e poseidon2_perm_T_2_6, e poseidon2_perm_T_2_7, e poseidon2_perm_T_3_4, e poseidon2_perm_T_3_5, e poseidon2_perm_T_3_6, e poseidon2_perm_T_3_7, e poseidon2_perm_T_60_4, e poseidon2_perm_T_60_5, e poseidon2_perm_T_60_6, e poseidon2_perm_T_60_7, e poseidon2_perm_T_61_4, e poseidon2_perm_T_61_5, e poseidon2_perm_T_61_6, e poseidon2_perm_T_61_7, e poseidon2_perm_T_62_4, e poseidon2_perm_T_62_5, e poseidon2_perm_T_62_6, e poseidon2_perm_T_62_7, e poseidon2_perm_T_63_4, e poseidon2_perm_T_63_5, e poseidon2_perm_T_63_6, e poseidon2_perm_T_63_7, e poseidon2_perm_a_0, e poseidon2_perm_a_1, e poseidon2_perm_a_2, e poseidon2_perm_a_3, e poseidon2_perm_b_0, e poseidon2_perm_b_1, e poseidon2_perm_b_2, e poseidon2_perm_b_3, e poseidon2_perm_mem_batch_tag_inv, e poseidon2_perm_mem_err, e poseidon2_perm_mem_execution_clk, e poseidon2_perm_mem_input_0_, e poseidon2_perm_mem_input_1_, e poseidon2_perm_mem_input_2_, e poseidon2_perm_mem_input_3_, e poseidon2_perm_mem_input_tag_0_, e poseidon2_perm_mem_input_tag_1_, e poseidon2_perm_mem_input_tag_2_, e poseidon2_perm_mem_input_tag_3_, e poseidon2_perm_mem_max_mem_addr, e poseidon2_perm_mem_output_0_, e poseidon2_perm_mem_output_1_, e poseidon2_perm_mem_output_2_, e poseidon2_perm_mem_output_3_, e poseidon2_perm_mem_read_address_0_, e poseidon2_perm_mem_read_address_1_, e poseidon2_perm_mem_read_address_2_, e poseidon2_perm_mem_read_address_3_, e poseidon2_perm_mem_sel, e poseidon2_perm_mem_sel_dst_out_of_range_err, e poseidon2_perm_mem_sel_invalid_tag_err, e poseidon2_perm_mem_sel_should_exec, e poseidon2_perm_mem_sel_should_read_mem, e poseidon2_perm_mem_sel_src_out_of_range_err, e poseidon2_perm_mem_space_id, e poseidon2_perm_mem_write_address_0_, e poseidon2_perm_mem_write_address_1_, e poseidon2_perm_mem_write_address_2_, e poseidon2_perm_mem_write_address_3_, e poseidon2_perm_sel, e public_data_check_address, e public_data_check_clk, e public_data_check_clk_diff, e public_data_check_constant_32, e public_data_check_discard, e public_data_check_end, e public_data_check_intermediate_root, e public_data_check_leaf_not_exists, e public_data_check_leaf_slot, e public_data_check_leaf_slot_low_leaf_slot_diff_inv, e public_data_check_length_pi_idx, e public_data_check_low_leaf_hash, e public_data_check_low_leaf_index, e public_data_check_low_leaf_next_index, e public_data_check_low_leaf_next_slot, e public_data_check_low_leaf_slot, e public_data_check_low_leaf_value, e public_data_check_new_leaf_hash, e public_data_check_next_slot_inv, e public_data_check_next_slot_is_nonzero, e public_data_check_nondiscaded_write, e public_data_check_not_end, e public_data_check_public_data_writes_length, e public_data_check_root, e public_data_check_sel, e public_data_check_should_insert, e public_data_check_should_write_to_public_inputs, e public_data_check_siloing_separator, e public_data_check_slot, e public_data_check_tree_height, e public_data_check_tree_size_after_write, e public_data_check_tree_size_before_write, e public_data_check_updated_low_leaf_hash, e public_data_check_updated_low_leaf_next_index, e public_data_check_updated_low_leaf_next_slot, e public_data_check_updated_low_leaf_value, e public_data_check_value, e public_data_check_write, e public_data_check_write_idx, e public_data_check_write_root, e public_data_squash_check_clock, e public_data_squash_clk, e public_data_squash_clk_diff, e public_data_squash_constant_32, e public_data_squash_leaf_slot, e public_data_squash_leaf_slot_increase, e public_data_squash_sel, e public_data_squash_write_to_public_inputs, e range_check_dyn_diff, e range_check_dyn_rng_chk_bits, e range_check_dyn_rng_chk_pow_2, e range_check_is_lte_u112, e range_check_is_lte_u128, e range_check_is_lte_u16, e range_check_is_lte_u32, e range_check_is_lte_u48, e range_check_is_lte_u64, e range_check_is_lte_u80, e range_check_is_lte_u96, e range_check_rng_chk_bits, e range_check_sel, e range_check_sel_r0_16_bit_rng_lookup, e range_check_sel_r1_16_bit_rng_lookup, e range_check_sel_r2_16_bit_rng_lookup, e range_check_sel_r3_16_bit_rng_lookup, e range_check_sel_r4_16_bit_rng_lookup, e range_check_sel_r5_16_bit_rng_lookup, e range_check_sel_r6_16_bit_rng_lookup, e range_check_u16_r0, e range_check_u16_r1, e range_check_u16_r2, e range_check_u16_r3, e range_check_u16_r4, e range_check_u16_r5, e range_check_u16_r6, e range_check_u16_r7, e range_check_value, e scalar_mul_bit, e scalar_mul_bit_idx, e scalar_mul_bit_radix, e scalar_mul_end, e scalar_mul_not_end, e scalar_mul_point_inf, e scalar_mul_point_x, e scalar_mul_point_y, e scalar_mul_res_inf, e scalar_mul_res_x, e scalar_mul_res_y, e scalar_mul_scalar, e scalar_mul_sel, e scalar_mul_should_add, e scalar_mul_start, e scalar_mul_temp_inf, e scalar_mul_temp_x, e scalar_mul_temp_y, e sha256_a, e sha256_a_and_b, e sha256_a_and_b_xor_a_and_c, e sha256_a_and_c, e sha256_a_rotr_13, e sha256_a_rotr_2, e sha256_a_rotr_22, e sha256_a_rotr_2_xor_a_rotr_13, e sha256_and_sel, e sha256_b, e sha256_b_and_c, e sha256_c, e sha256_ch, e sha256_clk, e sha256_computed_w_lhs, e sha256_computed_w_rhs, e sha256_d, e sha256_e, e sha256_e_and_f, e sha256_e_rotr_11, e sha256_e_rotr_25, e sha256_e_rotr_6, e sha256_e_rotr_6_xor_e_rotr_11, e sha256_f, e sha256_g, e sha256_h, e sha256_helper_w0, e sha256_helper_w1, e sha256_helper_w10, e sha256_helper_w11, e sha256_helper_w12, e sha256_helper_w13, e sha256_helper_w14, e sha256_helper_w15, e sha256_helper_w2, e sha256_helper_w3, e sha256_helper_w4, e sha256_helper_w5, e sha256_helper_w6, e sha256_helper_w7, e sha256_helper_w8, e sha256_helper_w9, e sha256_init_a, e sha256_init_b, e sha256_init_c, e sha256_init_d, e sha256_init_e, e sha256_init_f, e sha256_init_g, e sha256_init_h, e sha256_input_offset, e sha256_is_input_round, e sha256_latch, e sha256_lhs_a_13, e sha256_lhs_a_2, e sha256_lhs_a_22, e sha256_lhs_e_11, e sha256_lhs_e_25, e sha256_lhs_e_6, e sha256_lhs_w_10, e sha256_lhs_w_17, e sha256_lhs_w_18, e sha256_lhs_w_19, e sha256_lhs_w_3, e sha256_lhs_w_7, e sha256_maj, e sha256_next_a_lhs, e sha256_next_a_rhs, e sha256_next_e_lhs, e sha256_next_e_rhs, e sha256_not_e, e sha256_not_e_and_g, e sha256_output_a_lhs, e sha256_output_a_rhs, e sha256_output_b_lhs, e sha256_output_b_rhs, e sha256_output_c_lhs, e sha256_output_c_rhs, e sha256_output_d_lhs, e sha256_output_d_rhs, e sha256_output_e_lhs, e sha256_output_e_rhs, e sha256_output_f_lhs, e sha256_output_f_rhs, e sha256_output_g_lhs, e sha256_output_g_rhs, e sha256_output_h_lhs, e sha256_output_h_rhs, e sha256_output_offset, e sha256_perform_round, e sha256_rhs_a_13, e sha256_rhs_a_2, e sha256_rhs_a_22, e sha256_rhs_e_11, e sha256_rhs_e_25, e sha256_rhs_e_6, e sha256_rhs_w_10, e sha256_rhs_w_17, e sha256_rhs_w_18, e sha256_rhs_w_19, e sha256_rhs_w_3, e sha256_rhs_w_7, e sha256_round_constant, e sha256_round_count, e sha256_rounds_remaining, e sha256_rounds_remaining_inv, e sha256_s_0, e sha256_s_1, e sha256_sel, e sha256_start, e sha256_state_offset, e sha256_w, e sha256_w_15_rotr_18, e sha256_w_15_rotr_7, e sha256_w_15_rotr_7_xor_w_15_rotr_18, e sha256_w_15_rshift_3, e sha256_w_2_rotr_17, e sha256_w_2_rotr_17_xor_w_2_rotr_19, e sha256_w_2_rotr_19, e sha256_w_2_rshift_10, e sha256_w_s_0, e sha256_w_s_1, e sha256_xor_sel, e to_radix_acc, e to_radix_acc_under_p, e to_radix_end, e to_radix_exponent, e to_radix_found, e to_radix_is_unsafe_limb, e to_radix_limb, e to_radix_limb_eq_p, e to_radix_limb_index, e to_radix_limb_lt_p, e to_radix_limb_p_diff, e to_radix_limb_radix_diff, e to_radix_not_end, e to_radix_not_padding_limb, e to_radix_p_limb, e to_radix_radix, e to_radix_rem_inverse, e to_radix_safe_limbs, e to_radix_safety_diff_inverse, e to_radix_sel, e to_radix_start, e to_radix_value, e tx_calldata_hash, e tx_context_id, e tx_contract_addr, e tx_da_gas_limit, e tx_discard, e tx_effective_fee_per_da_gas, e tx_effective_fee_per_l2_gas, e tx_end_gas_used_pi_offset, e tx_end_phase, e tx_fee, e tx_fee_juice_balance_slot, e tx_fee_juice_balances_slot, e tx_fee_juice_contract_address, e tx_fee_payer, e tx_fee_payer_balance, e tx_fee_payer_new_balance, e tx_fee_payer_pi_offset, e tx_is_collect_fee, e tx_is_l2_l1_msg_phase, e tx_is_padded, e tx_is_public_call_request, e tx_is_revertible, e tx_is_static, e tx_is_teardown_phase, e tx_is_tree_insert_phase, e tx_l2_gas_limit, e tx_l2_l1_msg_content, e tx_l2_l1_msg_contract_address, e tx_l2_l1_msg_recipient, e tx_leaf_value, e tx_msg_sender, e tx_next_context_id, e tx_next_da_gas_used, e tx_next_da_gas_used_sent_to_enqueued_call, e tx_next_l1_l2_tree_root, e tx_next_l1_l2_tree_size, e tx_next_l2_gas_used, e tx_next_l2_gas_used_sent_to_enqueued_call, e tx_next_note_hash_tree_root, e tx_next_note_hash_tree_size, e tx_next_nullifier_tree_root, e tx_next_nullifier_tree_size, e tx_next_num_note_hashes_emitted, e tx_next_num_nullifiers_emitted, e tx_next_public_data_tree_root, e tx_next_public_data_tree_size, e tx_next_written_public_data_slots_tree_root, e tx_next_written_public_data_slots_tree_size, e tx_num_l2_l1_msg_emitted, e tx_phase_value, e tx_prev_da_gas_used, e tx_prev_da_gas_used_sent_to_enqueued_call, e tx_prev_l1_l2_tree_root, e tx_prev_l1_l2_tree_size, e tx_prev_l2_gas_used, e tx_prev_l2_gas_used_sent_to_enqueued_call, e tx_prev_note_hash_tree_root, e tx_prev_note_hash_tree_size, e tx_prev_nullifier_tree_root, e tx_prev_nullifier_tree_size, e tx_prev_num_note_hashes_emitted, e tx_prev_num_nullifiers_emitted, e tx_prev_public_data_tree_root, e tx_prev_public_data_tree_size, e tx_prev_written_public_data_slots_tree_root, e tx_prev_written_public_data_slots_tree_size, e tx_read_pi_length_offset, e tx_read_pi_offset, e tx_remaining_phase_counter, e tx_remaining_phase_inv, e tx_remaining_phase_minus_one_inv, e tx_reverted, e tx_sel, e tx_sel_non_revertible_append_note_hash, e tx_sel_non_revertible_append_nullifier, e tx_sel_read_phase_length, e tx_sel_revertible_append_note_hash, e tx_sel_revertible_append_nullifier, e tx_should_note_hash_append, e tx_should_nullifier_append, e tx_start_phase, e tx_successful_msg_emit, e tx_uint32_max, e tx_write_pi_offset, e update_check_address, e update_check_current_class_id, e update_check_delayed_public_mutable_hash_slot, e update_check_delayed_public_mutable_slot, e update_check_deployer_protocol_contract_address, e update_check_hash_not_zero, e update_check_original_class_id, e update_check_public_data_tree_root, e update_check_public_leaf_index_domain_separator, e update_check_sel, e update_check_timestamp, e update_check_timestamp_is_lt_timestamp_of_change, e update_check_timestamp_of_change, e update_check_timestamp_of_change_bit_size, e update_check_timestamp_of_change_subtraction, e update_check_timestamp_pi_offset, e update_check_update_hash, e update_check_update_hash_inv, e update_check_update_hi_metadata, e update_check_update_hi_metadata_bit_size, e update_check_update_post_class_id_is_zero, e update_check_update_post_class_inv, e update_check_update_pre_class_id_is_zero, e update_check_update_pre_class_inv, e update_check_update_preimage_metadata, e update_check_update_preimage_post_class_id, e update_check_update_preimage_pre_class_id, e update_check_updated_class_ids_slot, e written_public_data_slots_tree_check_address, e written_public_data_slots_tree_check_intermediate_root, e written_public_data_slots_tree_check_leaf_not_exists, e written_public_data_slots_tree_check_leaf_slot, e written_public_data_slots_tree_check_low_leaf_hash, e written_public_data_slots_tree_check_low_leaf_index, e written_public_data_slots_tree_check_low_leaf_next_index, e written_public_data_slots_tree_check_low_leaf_next_slot, e written_public_data_slots_tree_check_low_leaf_slot, e written_public_data_slots_tree_check_new_leaf_hash, e written_public_data_slots_tree_check_next_slot_inv, e written_public_data_slots_tree_check_next_slot_is_nonzero, e written_public_data_slots_tree_check_root, e written_public_data_slots_tree_check_sel, e written_public_data_slots_tree_check_should_insert, e written_public_data_slots_tree_check_siloing_separator, e written_public_data_slots_tree_check_slot, e written_public_data_slots_tree_check_slot_low_leaf_slot_diff_inv, e written_public_data_slots_tree_check_tree_height, e written_public_data_slots_tree_check_tree_size_after_write, e written_public_data_slots_tree_check_tree_size_before_write, e written_public_data_slots_tree_check_updated_low_leaf_hash, e written_public_data_slots_tree_check_updated_low_leaf_next_index, e written_public_data_slots_tree_check_updated_low_leaf_next_slot, e written_public_data_slots_tree_check_write, e written_public_data_slots_tree_check_write_root, e lookup_range_check_dyn_rng_chk_pow_2_counts, e lookup_range_check_dyn_diff_is_u16_counts, e lookup_range_check_r0_is_u16_counts, e lookup_range_check_r1_is_u16_counts, e lookup_range_check_r2_is_u16_counts, e lookup_range_check_r3_is_u16_counts, e lookup_range_check_r4_is_u16_counts, e lookup_range_check_r5_is_u16_counts, e lookup_range_check_r6_is_u16_counts, e lookup_range_check_r7_is_u16_counts, e lookup_ff_gt_a_lo_range_counts, e lookup_ff_gt_a_hi_range_counts, e lookup_gt_gt_range_counts, e lookup_alu_register_tag_value_counts, e lookup_alu_tag_max_bits_value_counts, e lookup_alu_ff_gt_counts, e lookup_alu_int_gt_counts, e lookup_alu_exec_dispatching_cast_counts, e lookup_alu_exec_dispatching_set_counts, e lookup_alu_large_trunc_canonical_dec_counts, e lookup_alu_range_check_trunc_mid_counts, e lookup_bitwise_integral_tag_length_counts, e lookup_bitwise_byte_operations_counts, e lookup_bitwise_dispatch_exec_bitwise_counts, e lookup_keccak_memory_slice_to_mem_counts, e lookup_keccakf1600_theta_xor_01_counts, e lookup_keccakf1600_theta_xor_02_counts, e lookup_keccakf1600_theta_xor_03_counts, e lookup_keccakf1600_theta_xor_row_0_counts, e lookup_keccakf1600_theta_xor_11_counts, e lookup_keccakf1600_theta_xor_12_counts, e lookup_keccakf1600_theta_xor_13_counts, e lookup_keccakf1600_theta_xor_row_1_counts, e lookup_keccakf1600_theta_xor_21_counts, e lookup_keccakf1600_theta_xor_22_counts, e lookup_keccakf1600_theta_xor_23_counts, e lookup_keccakf1600_theta_xor_row_2_counts, e lookup_keccakf1600_theta_xor_31_counts, e lookup_keccakf1600_theta_xor_32_counts, e lookup_keccakf1600_theta_xor_33_counts, e lookup_keccakf1600_theta_xor_row_3_counts, e lookup_keccakf1600_theta_xor_41_counts, e lookup_keccakf1600_theta_xor_42_counts, e lookup_keccakf1600_theta_xor_43_counts, e lookup_keccakf1600_theta_xor_row_4_counts, e lookup_keccakf1600_theta_combined_xor_0_counts, e lookup_keccakf1600_theta_combined_xor_1_counts, e lookup_keccakf1600_theta_combined_xor_2_counts, e lookup_keccakf1600_theta_combined_xor_3_counts, e lookup_keccakf1600_theta_combined_xor_4_counts, e lookup_keccakf1600_state_theta_00_counts, e lookup_keccakf1600_state_theta_01_counts, e lookup_keccakf1600_state_theta_02_counts, e lookup_keccakf1600_state_theta_03_counts, e lookup_keccakf1600_state_theta_04_counts, e lookup_keccakf1600_state_theta_10_counts, e lookup_keccakf1600_state_theta_11_counts, e lookup_keccakf1600_state_theta_12_counts, e lookup_keccakf1600_state_theta_13_counts, e lookup_keccakf1600_state_theta_14_counts, e lookup_keccakf1600_state_theta_20_counts, e lookup_keccakf1600_state_theta_21_counts, e lookup_keccakf1600_state_theta_22_counts, e lookup_keccakf1600_state_theta_23_counts, e lookup_keccakf1600_state_theta_24_counts, e lookup_keccakf1600_state_theta_30_counts, e lookup_keccakf1600_state_theta_31_counts, e lookup_keccakf1600_state_theta_32_counts, e lookup_keccakf1600_state_theta_33_counts, e lookup_keccakf1600_state_theta_34_counts, e lookup_keccakf1600_state_theta_40_counts, e lookup_keccakf1600_state_theta_41_counts, e lookup_keccakf1600_state_theta_42_counts, e lookup_keccakf1600_state_theta_43_counts, e lookup_keccakf1600_state_theta_44_counts, e lookup_keccakf1600_theta_limb_02_range_counts, e lookup_keccakf1600_theta_limb_04_range_counts, e lookup_keccakf1600_theta_limb_10_range_counts, e lookup_keccakf1600_theta_limb_12_range_counts, e lookup_keccakf1600_theta_limb_14_range_counts, e lookup_keccakf1600_theta_limb_21_range_counts, e lookup_keccakf1600_theta_limb_23_range_counts, e lookup_keccakf1600_theta_limb_30_range_counts, e lookup_keccakf1600_theta_limb_32_range_counts, e lookup_keccakf1600_theta_limb_33_range_counts, e lookup_keccakf1600_theta_limb_40_range_counts, e lookup_keccakf1600_theta_limb_41_range_counts, e lookup_keccakf1600_theta_limb_43_range_counts, e lookup_keccakf1600_theta_limb_44_range_counts, e lookup_keccakf1600_theta_limb_01_range_counts, e lookup_keccakf1600_theta_limb_03_range_counts, e lookup_keccakf1600_theta_limb_11_range_counts, e lookup_keccakf1600_theta_limb_13_range_counts, e lookup_keccakf1600_theta_limb_20_range_counts, e lookup_keccakf1600_theta_limb_22_range_counts, e lookup_keccakf1600_theta_limb_24_range_counts, e lookup_keccakf1600_theta_limb_31_range_counts, e lookup_keccakf1600_theta_limb_34_range_counts, e lookup_keccakf1600_theta_limb_42_range_counts, e lookup_keccakf1600_state_pi_and_00_counts, e lookup_keccakf1600_state_pi_and_01_counts, e lookup_keccakf1600_state_pi_and_02_counts, e lookup_keccakf1600_state_pi_and_03_counts, e lookup_keccakf1600_state_pi_and_04_counts, e lookup_keccakf1600_state_pi_and_10_counts, e lookup_keccakf1600_state_pi_and_11_counts, e lookup_keccakf1600_state_pi_and_12_counts, e lookup_keccakf1600_state_pi_and_13_counts, e lookup_keccakf1600_state_pi_and_14_counts, e lookup_keccakf1600_state_pi_and_20_counts, e lookup_keccakf1600_state_pi_and_21_counts, e lookup_keccakf1600_state_pi_and_22_counts, e lookup_keccakf1600_state_pi_and_23_counts, e lookup_keccakf1600_state_pi_and_24_counts, e lookup_keccakf1600_state_pi_and_30_counts, e lookup_keccakf1600_state_pi_and_31_counts, e lookup_keccakf1600_state_pi_and_32_counts, e lookup_keccakf1600_state_pi_and_33_counts, e lookup_keccakf1600_state_pi_and_34_counts, e lookup_keccakf1600_state_pi_and_40_counts, e lookup_keccakf1600_state_pi_and_41_counts, e lookup_keccakf1600_state_pi_and_42_counts, e lookup_keccakf1600_state_pi_and_43_counts, e lookup_keccakf1600_state_pi_and_44_counts, e lookup_keccakf1600_state_chi_00_counts, e lookup_keccakf1600_state_chi_01_counts, e lookup_keccakf1600_state_chi_02_counts, e lookup_keccakf1600_state_chi_03_counts, e lookup_keccakf1600_state_chi_04_counts, e lookup_keccakf1600_state_chi_10_counts, e lookup_keccakf1600_state_chi_11_counts, e lookup_keccakf1600_state_chi_12_counts, e lookup_keccakf1600_state_chi_13_counts, e lookup_keccakf1600_state_chi_14_counts, e lookup_keccakf1600_state_chi_20_counts, e lookup_keccakf1600_state_chi_21_counts, e lookup_keccakf1600_state_chi_22_counts, e lookup_keccakf1600_state_chi_23_counts, e lookup_keccakf1600_state_chi_24_counts, e lookup_keccakf1600_state_chi_30_counts, e lookup_keccakf1600_state_chi_31_counts, e lookup_keccakf1600_state_chi_32_counts, e lookup_keccakf1600_state_chi_33_counts, e lookup_keccakf1600_state_chi_34_counts, e lookup_keccakf1600_state_chi_40_counts, e lookup_keccakf1600_state_chi_41_counts, e lookup_keccakf1600_state_chi_42_counts, e lookup_keccakf1600_state_chi_43_counts, e lookup_keccakf1600_state_chi_44_counts, e lookup_keccakf1600_round_cst_counts, e lookup_keccakf1600_state_iota_00_counts, e lookup_keccakf1600_src_abs_diff_positive_counts, e lookup_keccakf1600_dst_abs_diff_positive_counts, e lookup_sha256_round_constant_counts, e lookup_poseidon2_mem_check_src_addr_in_range_counts, e lookup_poseidon2_mem_check_dst_addr_in_range_counts, e lookup_poseidon2_mem_pos_read_mem_0_counts, e lookup_poseidon2_mem_pos_read_mem_1_counts, e lookup_poseidon2_mem_pos_read_mem_2_counts, e lookup_poseidon2_mem_pos_read_mem_3_counts, e lookup_poseidon2_mem_input_output_poseidon2_perm_counts, e lookup_poseidon2_mem_pos_write_mem_0_counts, e lookup_poseidon2_mem_pos_write_mem_1_counts, e lookup_poseidon2_mem_pos_write_mem_2_counts, e lookup_poseidon2_mem_pos_write_mem_3_counts, e lookup_to_radix_limb_range_counts, e lookup_to_radix_limb_less_than_radix_range_counts, e lookup_to_radix_fetch_safe_limbs_counts, e lookup_to_radix_fetch_p_limb_counts, e lookup_to_radix_limb_p_diff_range_counts, e lookup_scalar_mul_to_radix_counts, e lookup_scalar_mul_double_counts, e lookup_scalar_mul_add_counts, e lookup_context_ctx_stack_call_counts, e lookup_context_ctx_stack_rollback_counts, e lookup_context_ctx_stack_return_counts, e lookup_poseidon2_hash_poseidon2_perm_counts, e lookup_calldata_hashing_cd_hash_counts, e lookup_calldata_hashing_cd_hash_end_counts, e lookup_data_copy_range_max_read_size_diff_counts, e lookup_data_copy_range_read_counts, e lookup_data_copy_range_write_counts, e lookup_data_copy_range_reads_left_counts, e lookup_data_copy_mem_write_counts, e lookup_data_copy_mem_read_counts, e lookup_data_copy_col_read_counts, e lookup_addressing_base_address_from_memory_counts, e lookup_addressing_relative_overflow_range_0_counts, e lookup_addressing_relative_overflow_range_1_counts, e lookup_addressing_relative_overflow_range_2_counts, e lookup_addressing_relative_overflow_range_3_counts, e lookup_addressing_relative_overflow_range_4_counts, e lookup_addressing_relative_overflow_range_5_counts, e lookup_addressing_relative_overflow_range_6_counts, e lookup_addressing_indirect_from_memory_0_counts, e lookup_addressing_indirect_from_memory_1_counts, e lookup_addressing_indirect_from_memory_2_counts, e lookup_addressing_indirect_from_memory_3_counts, e lookup_addressing_indirect_from_memory_4_counts, e lookup_addressing_indirect_from_memory_5_counts, e lookup_addressing_indirect_from_memory_6_counts, e lookup_registers_mem_op_0_counts, e lookup_registers_mem_op_1_counts, e lookup_registers_mem_op_2_counts, e lookup_registers_mem_op_3_counts, e lookup_registers_mem_op_4_counts, e lookup_registers_mem_op_5_counts, e lookup_registers_mem_op_6_counts, e lookup_gas_addressing_gas_read_counts, e lookup_gas_limit_used_l2_range_counts, e lookup_gas_limit_used_da_range_counts, e lookup_merkle_check_merkle_poseidon2_read_counts, e lookup_merkle_check_merkle_poseidon2_write_counts, e lookup_nullifier_check_silo_poseidon2_counts, e lookup_nullifier_check_low_leaf_poseidon2_counts, e lookup_nullifier_check_updated_low_leaf_poseidon2_counts, e lookup_nullifier_check_low_leaf_merkle_check_counts, e lookup_nullifier_check_low_leaf_nullifier_validation_counts, e lookup_nullifier_check_low_leaf_next_nullifier_validation_counts, e lookup_nullifier_check_new_leaf_poseidon2_counts, e lookup_nullifier_check_new_leaf_merkle_check_counts, e lookup_nullifier_check_write_nullifier_to_public_inputs_counts, e lookup_public_data_check_silo_poseidon2_counts, e lookup_public_data_check_low_leaf_slot_validation_counts, e lookup_public_data_check_low_leaf_next_slot_validation_counts, e lookup_public_data_check_low_leaf_poseidon2_0_counts, e lookup_public_data_check_low_leaf_poseidon2_1_counts, e lookup_public_data_check_updated_low_leaf_poseidon2_0_counts, e lookup_public_data_check_updated_low_leaf_poseidon2_1_counts, e lookup_public_data_check_low_leaf_merkle_check_counts, e lookup_public_data_check_new_leaf_poseidon2_0_counts, e lookup_public_data_check_new_leaf_poseidon2_1_counts, e lookup_public_data_check_new_leaf_merkle_check_counts, e lookup_public_data_check_write_public_data_to_public_inputs_counts, e lookup_written_public_data_slots_tree_check_silo_poseidon2_counts, e lookup_written_public_data_slots_tree_check_low_leaf_poseidon2_counts, e lookup_written_public_data_slots_tree_check_updated_low_leaf_poseidon2_counts, e lookup_written_public_data_slots_tree_check_low_leaf_merkle_check_counts, e lookup_written_public_data_slots_tree_check_low_leaf_slot_validation_counts, e lookup_written_public_data_slots_tree_check_low_leaf_next_slot_validation_counts, e lookup_written_public_data_slots_tree_check_new_leaf_poseidon2_counts, e lookup_written_public_data_slots_tree_check_new_leaf_merkle_check_counts, e lookup_l1_to_l2_message_tree_check_merkle_check_counts, e lookup_address_derivation_salted_initialization_hash_poseidon2_0_counts, e lookup_address_derivation_salted_initialization_hash_poseidon2_1_counts, e lookup_address_derivation_partial_address_poseidon2_counts, e lookup_address_derivation_public_keys_hash_poseidon2_0_counts, e lookup_address_derivation_public_keys_hash_poseidon2_1_counts, e lookup_address_derivation_public_keys_hash_poseidon2_2_counts, e lookup_address_derivation_public_keys_hash_poseidon2_3_counts, e lookup_address_derivation_public_keys_hash_poseidon2_4_counts, e lookup_address_derivation_preaddress_poseidon2_counts, e lookup_address_derivation_preaddress_scalar_mul_counts, e lookup_address_derivation_address_ecadd_counts, e lookup_bc_decomposition_bytes_are_bytes_counts, e lookup_bc_decomposition_abs_diff_is_u16_counts, e lookup_bc_hashing_get_packed_field_counts, e lookup_bc_hashing_iv_is_len_counts, e lookup_update_check_timestamp_from_public_inputs_counts, e lookup_update_check_delayed_public_mutable_slot_poseidon2_counts, e lookup_update_check_update_hash_public_data_read_counts, e lookup_update_check_update_hash_poseidon2_counts, e lookup_update_check_update_hi_metadata_range_counts, e lookup_update_check_update_lo_metadata_range_counts, e lookup_update_check_timestamp_of_change_cmp_range_counts, e lookup_contract_instance_retrieval_deployment_nullifier_read_counts, e lookup_contract_instance_retrieval_address_derivation_counts, e lookup_contract_instance_retrieval_update_check_counts, e lookup_bc_retrieval_contract_instance_retrieval_counts, e lookup_bc_retrieval_class_id_derivation_counts, e lookup_instr_fetching_pc_abs_diff_positive_counts, e lookup_instr_fetching_instr_abs_diff_positive_counts, e lookup_instr_fetching_tag_value_validation_counts, e lookup_instr_fetching_bytecode_size_from_bc_dec_counts, e lookup_instr_fetching_bytes_from_bc_dec_counts, e lookup_instr_fetching_wire_instruction_info_counts, e lookup_class_id_derivation_class_id_poseidon2_0_counts, e lookup_class_id_derivation_class_id_poseidon2_1_counts, e lookup_get_env_var_precomputed_info_counts, e lookup_get_env_var_read_from_public_inputs_col0_counts, e lookup_get_env_var_read_from_public_inputs_col1_counts, e lookup_get_contract_instance_precomputed_info_counts, e lookup_get_contract_instance_contract_instance_retrieval_counts, e lookup_get_contract_instance_mem_write_contract_instance_exists_counts, e lookup_get_contract_instance_mem_write_contract_instance_member_counts, e lookup_internal_call_push_call_stack_counts, e lookup_internal_call_unwind_call_stack_counts, e lookup_external_call_call_allocated_left_l2_range_counts, e lookup_external_call_call_allocated_left_da_range_counts, e lookup_sload_storage_read_counts, e lookup_sstore_record_written_storage_slot_counts, e lookup_sstore_storage_write_counts, e lookup_note_hash_tree_check_silo_poseidon2_counts, e lookup_note_hash_tree_check_read_first_nullifier_counts, e lookup_note_hash_tree_check_nonce_computation_poseidon2_counts, e lookup_note_hash_tree_check_unique_note_hash_poseidon2_counts, e lookup_note_hash_tree_check_merkle_check_counts, e lookup_note_hash_tree_check_write_note_hash_to_public_inputs_counts, e lookup_notehash_exists_note_hash_leaf_index_in_range_counts, e lookup_notehash_exists_note_hash_read_counts, e lookup_emit_notehash_notehash_tree_write_counts, e lookup_l1_to_l2_message_exists_l1_to_l2_msg_leaf_index_in_range_counts, e lookup_l1_to_l2_message_exists_l1_to_l2_msg_read_counts, e lookup_execution_bytecode_retrieval_result_counts, e lookup_execution_instruction_fetching_result_counts, e lookup_execution_instruction_fetching_body_counts, e lookup_execution_exec_spec_read_counts, e lookup_execution_dyn_l2_factor_bitwise_counts, e lookup_execution_check_written_storage_slot_counts, e lookup_tx_read_phase_table_counts, e lookup_tx_phase_jump_on_revert_counts, e lookup_tx_read_phase_length_counts, e lookup_tx_read_public_call_request_phase_counts, e lookup_tx_read_tree_insert_value_counts, e lookup_tx_note_hash_append_counts, e lookup_tx_nullifier_append_counts, e lookup_tx_read_l2_l1_msg_counts, e lookup_tx_write_l2_l1_msg_counts, e lookup_tx_read_effective_fee_public_inputs_counts, e lookup_tx_read_fee_payer_public_inputs_counts, e lookup_tx_balance_slot_poseidon2_counts, e lookup_tx_balance_validation_counts +#define AVM2_DERIVED_WITNESS_ENTITIES_E(e) e perm_keccakf1600_read_to_slice_inv, e perm_keccakf1600_write_to_slice_inv, e perm_poseidon2_mem_dispatch_exec_pos2_inv, e perm_public_data_check_squashing_inv, e perm_execution_dispatch_keccakf1600_inv, e perm_execution_dispatch_get_contract_instance_inv, e lookup_range_check_dyn_rng_chk_pow_2_inv, e lookup_range_check_dyn_diff_is_u16_inv, e lookup_range_check_r0_is_u16_inv, e lookup_range_check_r1_is_u16_inv, e lookup_range_check_r2_is_u16_inv, e lookup_range_check_r3_is_u16_inv, e lookup_range_check_r4_is_u16_inv, e lookup_range_check_r5_is_u16_inv, e lookup_range_check_r6_is_u16_inv, e lookup_range_check_r7_is_u16_inv, e lookup_ff_gt_a_lo_range_inv, e lookup_ff_gt_a_hi_range_inv, e lookup_gt_gt_range_inv, e lookup_alu_register_tag_value_inv, e lookup_alu_tag_max_bits_value_inv, e lookup_alu_ff_gt_inv, e lookup_alu_int_gt_inv, e lookup_alu_exec_dispatching_cast_inv, e lookup_alu_exec_dispatching_set_inv, e lookup_alu_large_trunc_canonical_dec_inv, e lookup_alu_range_check_trunc_mid_inv, e lookup_bitwise_integral_tag_length_inv, e lookup_bitwise_byte_operations_inv, e lookup_bitwise_dispatch_exec_bitwise_inv, e lookup_keccak_memory_slice_to_mem_inv, e lookup_keccakf1600_theta_xor_01_inv, e lookup_keccakf1600_theta_xor_02_inv, e lookup_keccakf1600_theta_xor_03_inv, e lookup_keccakf1600_theta_xor_row_0_inv, e lookup_keccakf1600_theta_xor_11_inv, e lookup_keccakf1600_theta_xor_12_inv, e lookup_keccakf1600_theta_xor_13_inv, e lookup_keccakf1600_theta_xor_row_1_inv, e lookup_keccakf1600_theta_xor_21_inv, e lookup_keccakf1600_theta_xor_22_inv, e lookup_keccakf1600_theta_xor_23_inv, e lookup_keccakf1600_theta_xor_row_2_inv, e lookup_keccakf1600_theta_xor_31_inv, e lookup_keccakf1600_theta_xor_32_inv, e lookup_keccakf1600_theta_xor_33_inv, e lookup_keccakf1600_theta_xor_row_3_inv, e lookup_keccakf1600_theta_xor_41_inv, e lookup_keccakf1600_theta_xor_42_inv, e lookup_keccakf1600_theta_xor_43_inv, e lookup_keccakf1600_theta_xor_row_4_inv, e lookup_keccakf1600_theta_combined_xor_0_inv, e lookup_keccakf1600_theta_combined_xor_1_inv, e lookup_keccakf1600_theta_combined_xor_2_inv, e lookup_keccakf1600_theta_combined_xor_3_inv, e lookup_keccakf1600_theta_combined_xor_4_inv, e lookup_keccakf1600_state_theta_00_inv, e lookup_keccakf1600_state_theta_01_inv, e lookup_keccakf1600_state_theta_02_inv, e lookup_keccakf1600_state_theta_03_inv, e lookup_keccakf1600_state_theta_04_inv, e lookup_keccakf1600_state_theta_10_inv, e lookup_keccakf1600_state_theta_11_inv, e lookup_keccakf1600_state_theta_12_inv, e lookup_keccakf1600_state_theta_13_inv, e lookup_keccakf1600_state_theta_14_inv, e lookup_keccakf1600_state_theta_20_inv, e lookup_keccakf1600_state_theta_21_inv, e lookup_keccakf1600_state_theta_22_inv, e lookup_keccakf1600_state_theta_23_inv, e lookup_keccakf1600_state_theta_24_inv, e lookup_keccakf1600_state_theta_30_inv, e lookup_keccakf1600_state_theta_31_inv, e lookup_keccakf1600_state_theta_32_inv, e lookup_keccakf1600_state_theta_33_inv, e lookup_keccakf1600_state_theta_34_inv, e lookup_keccakf1600_state_theta_40_inv, e lookup_keccakf1600_state_theta_41_inv, e lookup_keccakf1600_state_theta_42_inv, e lookup_keccakf1600_state_theta_43_inv, e lookup_keccakf1600_state_theta_44_inv, e lookup_keccakf1600_theta_limb_02_range_inv, e lookup_keccakf1600_theta_limb_04_range_inv, e lookup_keccakf1600_theta_limb_10_range_inv, e lookup_keccakf1600_theta_limb_12_range_inv, e lookup_keccakf1600_theta_limb_14_range_inv, e lookup_keccakf1600_theta_limb_21_range_inv, e lookup_keccakf1600_theta_limb_23_range_inv, e lookup_keccakf1600_theta_limb_30_range_inv, e lookup_keccakf1600_theta_limb_32_range_inv, e lookup_keccakf1600_theta_limb_33_range_inv, e lookup_keccakf1600_theta_limb_40_range_inv, e lookup_keccakf1600_theta_limb_41_range_inv, e lookup_keccakf1600_theta_limb_43_range_inv, e lookup_keccakf1600_theta_limb_44_range_inv, e lookup_keccakf1600_theta_limb_01_range_inv, e lookup_keccakf1600_theta_limb_03_range_inv, e lookup_keccakf1600_theta_limb_11_range_inv, e lookup_keccakf1600_theta_limb_13_range_inv, e lookup_keccakf1600_theta_limb_20_range_inv, e lookup_keccakf1600_theta_limb_22_range_inv, e lookup_keccakf1600_theta_limb_24_range_inv, e lookup_keccakf1600_theta_limb_31_range_inv, e lookup_keccakf1600_theta_limb_34_range_inv, e lookup_keccakf1600_theta_limb_42_range_inv, e lookup_keccakf1600_state_pi_and_00_inv, e lookup_keccakf1600_state_pi_and_01_inv, e lookup_keccakf1600_state_pi_and_02_inv, e lookup_keccakf1600_state_pi_and_03_inv, e lookup_keccakf1600_state_pi_and_04_inv, e lookup_keccakf1600_state_pi_and_10_inv, e lookup_keccakf1600_state_pi_and_11_inv, e lookup_keccakf1600_state_pi_and_12_inv, e lookup_keccakf1600_state_pi_and_13_inv, e lookup_keccakf1600_state_pi_and_14_inv, e lookup_keccakf1600_state_pi_and_20_inv, e lookup_keccakf1600_state_pi_and_21_inv, e lookup_keccakf1600_state_pi_and_22_inv, e lookup_keccakf1600_state_pi_and_23_inv, e lookup_keccakf1600_state_pi_and_24_inv, e lookup_keccakf1600_state_pi_and_30_inv, e lookup_keccakf1600_state_pi_and_31_inv, e lookup_keccakf1600_state_pi_and_32_inv, e lookup_keccakf1600_state_pi_and_33_inv, e lookup_keccakf1600_state_pi_and_34_inv, e lookup_keccakf1600_state_pi_and_40_inv, e lookup_keccakf1600_state_pi_and_41_inv, e lookup_keccakf1600_state_pi_and_42_inv, e lookup_keccakf1600_state_pi_and_43_inv, e lookup_keccakf1600_state_pi_and_44_inv, e lookup_keccakf1600_state_chi_00_inv, e lookup_keccakf1600_state_chi_01_inv, e lookup_keccakf1600_state_chi_02_inv, e lookup_keccakf1600_state_chi_03_inv, e lookup_keccakf1600_state_chi_04_inv, e lookup_keccakf1600_state_chi_10_inv, e lookup_keccakf1600_state_chi_11_inv, e lookup_keccakf1600_state_chi_12_inv, e lookup_keccakf1600_state_chi_13_inv, e lookup_keccakf1600_state_chi_14_inv, e lookup_keccakf1600_state_chi_20_inv, e lookup_keccakf1600_state_chi_21_inv, e lookup_keccakf1600_state_chi_22_inv, e lookup_keccakf1600_state_chi_23_inv, e lookup_keccakf1600_state_chi_24_inv, e lookup_keccakf1600_state_chi_30_inv, e lookup_keccakf1600_state_chi_31_inv, e lookup_keccakf1600_state_chi_32_inv, e lookup_keccakf1600_state_chi_33_inv, e lookup_keccakf1600_state_chi_34_inv, e lookup_keccakf1600_state_chi_40_inv, e lookup_keccakf1600_state_chi_41_inv, e lookup_keccakf1600_state_chi_42_inv, e lookup_keccakf1600_state_chi_43_inv, e lookup_keccakf1600_state_chi_44_inv, e lookup_keccakf1600_round_cst_inv, e lookup_keccakf1600_state_iota_00_inv, e lookup_keccakf1600_src_abs_diff_positive_inv, e lookup_keccakf1600_dst_abs_diff_positive_inv, e lookup_sha256_round_constant_inv, e lookup_poseidon2_mem_check_src_addr_in_range_inv, e lookup_poseidon2_mem_check_dst_addr_in_range_inv, e lookup_poseidon2_mem_pos_read_mem_0_inv, e lookup_poseidon2_mem_pos_read_mem_1_inv, e lookup_poseidon2_mem_pos_read_mem_2_inv, e lookup_poseidon2_mem_pos_read_mem_3_inv, e lookup_poseidon2_mem_input_output_poseidon2_perm_inv, e lookup_poseidon2_mem_pos_write_mem_0_inv, e lookup_poseidon2_mem_pos_write_mem_1_inv, e lookup_poseidon2_mem_pos_write_mem_2_inv, e lookup_poseidon2_mem_pos_write_mem_3_inv, e lookup_to_radix_limb_range_inv, e lookup_to_radix_limb_less_than_radix_range_inv, e lookup_to_radix_fetch_safe_limbs_inv, e lookup_to_radix_fetch_p_limb_inv, e lookup_to_radix_limb_p_diff_range_inv, e lookup_scalar_mul_to_radix_inv, e lookup_scalar_mul_double_inv, e lookup_scalar_mul_add_inv, e lookup_context_ctx_stack_call_inv, e lookup_context_ctx_stack_rollback_inv, e lookup_context_ctx_stack_return_inv, e lookup_poseidon2_hash_poseidon2_perm_inv, e lookup_calldata_hashing_cd_hash_inv, e lookup_calldata_hashing_cd_hash_end_inv, e lookup_data_copy_range_max_read_size_diff_inv, e lookup_data_copy_range_read_inv, e lookup_data_copy_range_write_inv, e lookup_data_copy_range_reads_left_inv, e lookup_data_copy_mem_write_inv, e lookup_data_copy_mem_read_inv, e lookup_data_copy_col_read_inv, e lookup_addressing_base_address_from_memory_inv, e lookup_addressing_relative_overflow_range_0_inv, e lookup_addressing_relative_overflow_range_1_inv, e lookup_addressing_relative_overflow_range_2_inv, e lookup_addressing_relative_overflow_range_3_inv, e lookup_addressing_relative_overflow_range_4_inv, e lookup_addressing_relative_overflow_range_5_inv, e lookup_addressing_relative_overflow_range_6_inv, e lookup_addressing_indirect_from_memory_0_inv, e lookup_addressing_indirect_from_memory_1_inv, e lookup_addressing_indirect_from_memory_2_inv, e lookup_addressing_indirect_from_memory_3_inv, e lookup_addressing_indirect_from_memory_4_inv, e lookup_addressing_indirect_from_memory_5_inv, e lookup_addressing_indirect_from_memory_6_inv, e lookup_registers_mem_op_0_inv, e lookup_registers_mem_op_1_inv, e lookup_registers_mem_op_2_inv, e lookup_registers_mem_op_3_inv, e lookup_registers_mem_op_4_inv, e lookup_registers_mem_op_5_inv, e lookup_registers_mem_op_6_inv, e lookup_gas_addressing_gas_read_inv, e lookup_gas_limit_used_l2_range_inv, e lookup_gas_limit_used_da_range_inv, e lookup_merkle_check_merkle_poseidon2_read_inv, e lookup_merkle_check_merkle_poseidon2_write_inv, e lookup_nullifier_check_silo_poseidon2_inv, e lookup_nullifier_check_low_leaf_poseidon2_inv, e lookup_nullifier_check_updated_low_leaf_poseidon2_inv, e lookup_nullifier_check_low_leaf_merkle_check_inv, e lookup_nullifier_check_low_leaf_nullifier_validation_inv, e lookup_nullifier_check_low_leaf_next_nullifier_validation_inv, e lookup_nullifier_check_new_leaf_poseidon2_inv, e lookup_nullifier_check_new_leaf_merkle_check_inv, e lookup_nullifier_check_write_nullifier_to_public_inputs_inv, e lookup_public_data_check_silo_poseidon2_inv, e lookup_public_data_check_low_leaf_slot_validation_inv, e lookup_public_data_check_low_leaf_next_slot_validation_inv, e lookup_public_data_check_low_leaf_poseidon2_0_inv, e lookup_public_data_check_low_leaf_poseidon2_1_inv, e lookup_public_data_check_updated_low_leaf_poseidon2_0_inv, e lookup_public_data_check_updated_low_leaf_poseidon2_1_inv, e lookup_public_data_check_low_leaf_merkle_check_inv, e lookup_public_data_check_new_leaf_poseidon2_0_inv, e lookup_public_data_check_new_leaf_poseidon2_1_inv, e lookup_public_data_check_new_leaf_merkle_check_inv, e lookup_public_data_check_write_public_data_to_public_inputs_inv, e lookup_written_public_data_slots_tree_check_silo_poseidon2_inv, e lookup_written_public_data_slots_tree_check_low_leaf_poseidon2_inv, e lookup_written_public_data_slots_tree_check_updated_low_leaf_poseidon2_inv, e lookup_written_public_data_slots_tree_check_low_leaf_merkle_check_inv, e lookup_written_public_data_slots_tree_check_low_leaf_slot_validation_inv, e lookup_written_public_data_slots_tree_check_low_leaf_next_slot_validation_inv, e lookup_written_public_data_slots_tree_check_new_leaf_poseidon2_inv, e lookup_written_public_data_slots_tree_check_new_leaf_merkle_check_inv, e lookup_l1_to_l2_message_tree_check_merkle_check_inv, e lookup_address_derivation_salted_initialization_hash_poseidon2_0_inv, e lookup_address_derivation_salted_initialization_hash_poseidon2_1_inv, e lookup_address_derivation_partial_address_poseidon2_inv, e lookup_address_derivation_public_keys_hash_poseidon2_0_inv, e lookup_address_derivation_public_keys_hash_poseidon2_1_inv, e lookup_address_derivation_public_keys_hash_poseidon2_2_inv, e lookup_address_derivation_public_keys_hash_poseidon2_3_inv, e lookup_address_derivation_public_keys_hash_poseidon2_4_inv, e lookup_address_derivation_preaddress_poseidon2_inv, e lookup_address_derivation_preaddress_scalar_mul_inv, e lookup_address_derivation_address_ecadd_inv, e lookup_bc_decomposition_bytes_are_bytes_inv, e lookup_bc_decomposition_abs_diff_is_u16_inv, e lookup_bc_hashing_get_packed_field_inv, e lookup_bc_hashing_iv_is_len_inv, e lookup_update_check_timestamp_from_public_inputs_inv, e lookup_update_check_delayed_public_mutable_slot_poseidon2_inv, e lookup_update_check_update_hash_public_data_read_inv, e lookup_update_check_update_hash_poseidon2_inv, e lookup_update_check_update_hi_metadata_range_inv, e lookup_update_check_update_lo_metadata_range_inv, e lookup_update_check_timestamp_of_change_cmp_range_inv, e lookup_contract_instance_retrieval_deployment_nullifier_read_inv, e lookup_contract_instance_retrieval_address_derivation_inv, e lookup_contract_instance_retrieval_update_check_inv, e lookup_bc_retrieval_contract_instance_retrieval_inv, e lookup_bc_retrieval_class_id_derivation_inv, e lookup_instr_fetching_pc_abs_diff_positive_inv, e lookup_instr_fetching_instr_abs_diff_positive_inv, e lookup_instr_fetching_tag_value_validation_inv, e lookup_instr_fetching_bytecode_size_from_bc_dec_inv, e lookup_instr_fetching_bytes_from_bc_dec_inv, e lookup_instr_fetching_wire_instruction_info_inv, e lookup_class_id_derivation_class_id_poseidon2_0_inv, e lookup_class_id_derivation_class_id_poseidon2_1_inv, e lookup_get_env_var_precomputed_info_inv, e lookup_get_env_var_read_from_public_inputs_col0_inv, e lookup_get_env_var_read_from_public_inputs_col1_inv, e lookup_get_contract_instance_precomputed_info_inv, e lookup_get_contract_instance_contract_instance_retrieval_inv, e lookup_get_contract_instance_mem_write_contract_instance_exists_inv, e lookup_get_contract_instance_mem_write_contract_instance_member_inv, e lookup_internal_call_push_call_stack_inv, e lookup_internal_call_unwind_call_stack_inv, e lookup_external_call_call_allocated_left_l2_range_inv, e lookup_external_call_call_allocated_left_da_range_inv, e lookup_sload_storage_read_inv, e lookup_sstore_record_written_storage_slot_inv, e lookup_sstore_storage_write_inv, e lookup_note_hash_tree_check_silo_poseidon2_inv, e lookup_note_hash_tree_check_read_first_nullifier_inv, e lookup_note_hash_tree_check_nonce_computation_poseidon2_inv, e lookup_note_hash_tree_check_unique_note_hash_poseidon2_inv, e lookup_note_hash_tree_check_merkle_check_inv, e lookup_note_hash_tree_check_write_note_hash_to_public_inputs_inv, e lookup_notehash_exists_note_hash_leaf_index_in_range_inv, e lookup_notehash_exists_note_hash_read_inv, e lookup_emit_notehash_notehash_tree_write_inv, e lookup_l1_to_l2_message_exists_l1_to_l2_msg_leaf_index_in_range_inv, e lookup_l1_to_l2_message_exists_l1_to_l2_msg_read_inv, e lookup_execution_bytecode_retrieval_result_inv, e lookup_execution_instruction_fetching_result_inv, e lookup_execution_instruction_fetching_body_inv, e lookup_execution_exec_spec_read_inv, e lookup_execution_dyn_l2_factor_bitwise_inv, e lookup_execution_check_written_storage_slot_inv, e lookup_tx_read_phase_table_inv, e lookup_tx_phase_jump_on_revert_inv, e lookup_tx_read_phase_length_inv, e lookup_tx_read_public_call_request_phase_inv, e lookup_tx_read_tree_insert_value_inv, e lookup_tx_note_hash_append_inv, e lookup_tx_nullifier_append_inv, e lookup_tx_read_l2_l1_msg_inv, e lookup_tx_write_l2_l1_msg_inv, e lookup_tx_read_effective_fee_public_inputs_inv, e lookup_tx_read_fee_payer_public_inputs_inv, e lookup_tx_balance_slot_poseidon2_inv, e lookup_tx_balance_validation_inv #define AVM2_SHIFTED_ENTITIES_E(e) e bc_decomposition_bytes_shift, e bc_decomposition_bytes_pc_plus_1_shift, e bc_decomposition_bytes_pc_plus_10_shift, e bc_decomposition_bytes_pc_plus_11_shift, e bc_decomposition_bytes_pc_plus_12_shift, e bc_decomposition_bytes_pc_plus_13_shift, e bc_decomposition_bytes_pc_plus_14_shift, e bc_decomposition_bytes_pc_plus_15_shift, e bc_decomposition_bytes_pc_plus_16_shift, e bc_decomposition_bytes_pc_plus_17_shift, e bc_decomposition_bytes_pc_plus_18_shift, e bc_decomposition_bytes_pc_plus_19_shift, e bc_decomposition_bytes_pc_plus_2_shift, e bc_decomposition_bytes_pc_plus_20_shift, e bc_decomposition_bytes_pc_plus_21_shift, e bc_decomposition_bytes_pc_plus_22_shift, e bc_decomposition_bytes_pc_plus_23_shift, e bc_decomposition_bytes_pc_plus_24_shift, e bc_decomposition_bytes_pc_plus_25_shift, e bc_decomposition_bytes_pc_plus_26_shift, e bc_decomposition_bytes_pc_plus_27_shift, e bc_decomposition_bytes_pc_plus_28_shift, e bc_decomposition_bytes_pc_plus_29_shift, e bc_decomposition_bytes_pc_plus_3_shift, e bc_decomposition_bytes_pc_plus_30_shift, e bc_decomposition_bytes_pc_plus_31_shift, e bc_decomposition_bytes_pc_plus_32_shift, e bc_decomposition_bytes_pc_plus_33_shift, e bc_decomposition_bytes_pc_plus_34_shift, e bc_decomposition_bytes_pc_plus_35_shift, e bc_decomposition_bytes_pc_plus_4_shift, e bc_decomposition_bytes_pc_plus_5_shift, e bc_decomposition_bytes_pc_plus_6_shift, e bc_decomposition_bytes_pc_plus_7_shift, e bc_decomposition_bytes_pc_plus_8_shift, e bc_decomposition_bytes_pc_plus_9_shift, e bc_decomposition_bytes_remaining_shift, e bc_decomposition_id_shift, e bc_decomposition_pc_shift, e bc_decomposition_sel_shift, e bc_hashing_bytecode_id_shift, e bc_hashing_incremental_hash_shift, e bc_hashing_pc_index_shift, e bc_hashing_sel_shift, e bc_hashing_start_shift, e bc_retrieval_bytecode_id_shift, e bc_retrieval_sel_shift, e bitwise_acc_ia_shift, e bitwise_acc_ib_shift, e bitwise_acc_ic_shift, e bitwise_ctr_shift, e bitwise_op_id_shift, e calldata_context_id_shift, e calldata_index_shift, e calldata_sel_shift, e cd_hashing_sel_shift, e data_copy_copy_size_shift, e data_copy_dst_addr_shift, e data_copy_read_addr_shift, e data_copy_reads_left_shift, e data_copy_sel_cd_copy_shift, e data_copy_sel_rd_copy_shift, e data_copy_sel_start_shift, e execution_context_id_shift, e execution_contract_address_shift, e execution_da_gas_limit_shift, e execution_discard_shift, e execution_dying_context_id_shift, e execution_enqueued_call_start_shift, e execution_internal_call_id_shift, e execution_internal_call_return_id_shift, e execution_is_static_shift, e execution_l2_gas_limit_shift, e execution_last_child_returndata_addr_shift, e execution_last_child_returndata_size_shift, e execution_msg_sender_shift, e execution_next_context_id_shift, e execution_next_internal_call_id_shift, e execution_parent_calldata_addr_shift, e execution_parent_calldata_size_shift, e execution_parent_da_gas_limit_shift, e execution_parent_da_gas_used_shift, e execution_parent_id_shift, e execution_parent_l2_gas_limit_shift, e execution_parent_l2_gas_used_shift, e execution_pc_shift, e execution_prev_da_gas_used_shift, e execution_prev_l2_gas_used_shift, e execution_sel_shift, e execution_sel_first_row_in_context_shift, e execution_transaction_fee_shift, e ff_gt_a_hi_shift, e ff_gt_a_lo_shift, e ff_gt_b_hi_shift, e ff_gt_b_lo_shift, e ff_gt_cmp_rng_ctr_shift, e ff_gt_p_sub_a_hi_shift, e ff_gt_p_sub_a_lo_shift, e ff_gt_p_sub_b_hi_shift, e ff_gt_p_sub_b_lo_shift, e ff_gt_sel_shift, e ff_gt_sel_dec_shift, e ff_gt_sel_gt_shift, e keccak_memory_addr_shift, e keccak_memory_clk_shift, e keccak_memory_ctr_shift, e keccak_memory_rw_shift, e keccak_memory_space_id_shift, e keccak_memory_tag_error_shift, e keccak_memory_val00_shift, e keccak_memory_val01_shift, e keccak_memory_val02_shift, e keccak_memory_val03_shift, e keccak_memory_val04_shift, e keccak_memory_val10_shift, e keccak_memory_val11_shift, e keccak_memory_val12_shift, e keccak_memory_val13_shift, e keccak_memory_val14_shift, e keccak_memory_val20_shift, e keccak_memory_val21_shift, e keccak_memory_val22_shift, e keccak_memory_val23_shift, e keccak_memory_val24_shift, e keccak_memory_val30_shift, e keccak_memory_val31_shift, e keccak_memory_val32_shift, e keccak_memory_val33_shift, e keccak_memory_val34_shift, e keccak_memory_val40_shift, e keccak_memory_val41_shift, e keccak_memory_val42_shift, e keccak_memory_val43_shift, e keccakf1600_clk_shift, e keccakf1600_dst_addr_shift, e keccakf1600_round_shift, e keccakf1600_sel_no_error_shift, e keccakf1600_space_id_shift, e keccakf1600_state_in_00_shift, e keccakf1600_state_in_01_shift, e keccakf1600_state_in_02_shift, e keccakf1600_state_in_03_shift, e keccakf1600_state_in_04_shift, e keccakf1600_state_in_10_shift, e keccakf1600_state_in_11_shift, e keccakf1600_state_in_12_shift, e keccakf1600_state_in_13_shift, e keccakf1600_state_in_14_shift, e keccakf1600_state_in_20_shift, e keccakf1600_state_in_21_shift, e keccakf1600_state_in_22_shift, e keccakf1600_state_in_23_shift, e keccakf1600_state_in_24_shift, e keccakf1600_state_in_30_shift, e keccakf1600_state_in_31_shift, e keccakf1600_state_in_32_shift, e keccakf1600_state_in_33_shift, e keccakf1600_state_in_34_shift, e keccakf1600_state_in_40_shift, e keccakf1600_state_in_41_shift, e keccakf1600_state_in_42_shift, e keccakf1600_state_in_43_shift, e keccakf1600_state_in_44_shift, e merkle_check_index_shift, e merkle_check_path_len_shift, e merkle_check_read_node_shift, e merkle_check_read_root_shift, e merkle_check_sel_shift, e merkle_check_start_shift, e merkle_check_write_shift, e merkle_check_write_node_shift, e merkle_check_write_root_shift, e poseidon2_hash_a_0_shift, e poseidon2_hash_a_1_shift, e poseidon2_hash_a_2_shift, e poseidon2_hash_a_3_shift, e poseidon2_hash_input_0_shift, e poseidon2_hash_input_1_shift, e poseidon2_hash_input_2_shift, e poseidon2_hash_num_perm_rounds_rem_shift, e poseidon2_hash_output_shift, e poseidon2_hash_sel_shift, e poseidon2_hash_start_shift, e public_data_check_clk_shift, e public_data_check_sel_shift, e public_data_check_write_idx_shift, e public_data_squash_clk_shift, e public_data_squash_leaf_slot_shift, e public_data_squash_sel_shift, e scalar_mul_bit_idx_shift, e scalar_mul_point_inf_shift, e scalar_mul_point_x_shift, e scalar_mul_point_y_shift, e scalar_mul_res_inf_shift, e scalar_mul_res_x_shift, e scalar_mul_res_y_shift, e scalar_mul_scalar_shift, e scalar_mul_sel_shift, e scalar_mul_start_shift, e scalar_mul_temp_inf_shift, e scalar_mul_temp_x_shift, e scalar_mul_temp_y_shift, e sha256_a_shift, e sha256_b_shift, e sha256_c_shift, e sha256_d_shift, e sha256_e_shift, e sha256_f_shift, e sha256_g_shift, e sha256_h_shift, e sha256_helper_w0_shift, e sha256_helper_w1_shift, e sha256_helper_w10_shift, e sha256_helper_w11_shift, e sha256_helper_w12_shift, e sha256_helper_w13_shift, e sha256_helper_w14_shift, e sha256_helper_w15_shift, e sha256_helper_w2_shift, e sha256_helper_w3_shift, e sha256_helper_w4_shift, e sha256_helper_w5_shift, e sha256_helper_w6_shift, e sha256_helper_w7_shift, e sha256_helper_w8_shift, e sha256_helper_w9_shift, e sha256_rounds_remaining_shift, e sha256_sel_shift, e sha256_start_shift, e to_radix_acc_shift, e to_radix_acc_under_p_shift, e to_radix_exponent_shift, e to_radix_limb_shift, e to_radix_limb_eq_p_shift, e to_radix_limb_index_shift, e to_radix_limb_lt_p_shift, e to_radix_not_padding_limb_shift, e to_radix_radix_shift, e to_radix_safe_limbs_shift, e to_radix_sel_shift, e to_radix_start_shift, e to_radix_value_shift, e tx_fee_shift, e tx_phase_value_shift, e tx_prev_da_gas_used_shift, e tx_prev_l2_gas_used_shift, e tx_read_pi_offset_shift, e tx_remaining_phase_counter_shift, e tx_sel_shift, e tx_start_phase_shift #define AVM2_TO_BE_SHIFTED_E(e) e bc_decomposition_bytes, e bc_decomposition_bytes_pc_plus_1, e bc_decomposition_bytes_pc_plus_10, e bc_decomposition_bytes_pc_plus_11, e bc_decomposition_bytes_pc_plus_12, e bc_decomposition_bytes_pc_plus_13, e bc_decomposition_bytes_pc_plus_14, e bc_decomposition_bytes_pc_plus_15, e bc_decomposition_bytes_pc_plus_16, e bc_decomposition_bytes_pc_plus_17, e bc_decomposition_bytes_pc_plus_18, e bc_decomposition_bytes_pc_plus_19, e bc_decomposition_bytes_pc_plus_2, e bc_decomposition_bytes_pc_plus_20, e bc_decomposition_bytes_pc_plus_21, e bc_decomposition_bytes_pc_plus_22, e bc_decomposition_bytes_pc_plus_23, e bc_decomposition_bytes_pc_plus_24, e bc_decomposition_bytes_pc_plus_25, e bc_decomposition_bytes_pc_plus_26, e bc_decomposition_bytes_pc_plus_27, e bc_decomposition_bytes_pc_plus_28, e bc_decomposition_bytes_pc_plus_29, e bc_decomposition_bytes_pc_plus_3, e bc_decomposition_bytes_pc_plus_30, e bc_decomposition_bytes_pc_plus_31, e bc_decomposition_bytes_pc_plus_32, e bc_decomposition_bytes_pc_plus_33, e bc_decomposition_bytes_pc_plus_34, e bc_decomposition_bytes_pc_plus_35, e bc_decomposition_bytes_pc_plus_4, e bc_decomposition_bytes_pc_plus_5, e bc_decomposition_bytes_pc_plus_6, e bc_decomposition_bytes_pc_plus_7, e bc_decomposition_bytes_pc_plus_8, e bc_decomposition_bytes_pc_plus_9, e bc_decomposition_bytes_remaining, e bc_decomposition_id, e bc_decomposition_pc, e bc_decomposition_sel, e bc_hashing_bytecode_id, e bc_hashing_incremental_hash, e bc_hashing_pc_index, e bc_hashing_sel, e bc_hashing_start, e bc_retrieval_bytecode_id, e bc_retrieval_sel, e bitwise_acc_ia, e bitwise_acc_ib, e bitwise_acc_ic, e bitwise_ctr, e bitwise_op_id, e calldata_context_id, e calldata_index, e calldata_sel, e cd_hashing_sel, e data_copy_copy_size, e data_copy_dst_addr, e data_copy_read_addr, e data_copy_reads_left, e data_copy_sel_cd_copy, e data_copy_sel_rd_copy, e data_copy_sel_start, e execution_context_id, e execution_contract_address, e execution_da_gas_limit, e execution_discard, e execution_dying_context_id, e execution_enqueued_call_start, e execution_internal_call_id, e execution_internal_call_return_id, e execution_is_static, e execution_l2_gas_limit, e execution_last_child_returndata_addr, e execution_last_child_returndata_size, e execution_msg_sender, e execution_next_context_id, e execution_next_internal_call_id, e execution_parent_calldata_addr, e execution_parent_calldata_size, e execution_parent_da_gas_limit, e execution_parent_da_gas_used, e execution_parent_id, e execution_parent_l2_gas_limit, e execution_parent_l2_gas_used, e execution_pc, e execution_prev_da_gas_used, e execution_prev_l2_gas_used, e execution_sel, e execution_sel_first_row_in_context, e execution_transaction_fee, e ff_gt_a_hi, e ff_gt_a_lo, e ff_gt_b_hi, e ff_gt_b_lo, e ff_gt_cmp_rng_ctr, e ff_gt_p_sub_a_hi, e ff_gt_p_sub_a_lo, e ff_gt_p_sub_b_hi, e ff_gt_p_sub_b_lo, e ff_gt_sel, e ff_gt_sel_dec, e ff_gt_sel_gt, e keccak_memory_addr, e keccak_memory_clk, e keccak_memory_ctr, e keccak_memory_rw, e keccak_memory_space_id, e keccak_memory_tag_error, e keccak_memory_val00, e keccak_memory_val01, e keccak_memory_val02, e keccak_memory_val03, e keccak_memory_val04, e keccak_memory_val10, e keccak_memory_val11, e keccak_memory_val12, e keccak_memory_val13, e keccak_memory_val14, e keccak_memory_val20, e keccak_memory_val21, e keccak_memory_val22, e keccak_memory_val23, e keccak_memory_val24, e keccak_memory_val30, e keccak_memory_val31, e keccak_memory_val32, e keccak_memory_val33, e keccak_memory_val34, e keccak_memory_val40, e keccak_memory_val41, e keccak_memory_val42, e keccak_memory_val43, e keccakf1600_clk, e keccakf1600_dst_addr, e keccakf1600_round, e keccakf1600_sel_no_error, e keccakf1600_space_id, e keccakf1600_state_in_00, e keccakf1600_state_in_01, e keccakf1600_state_in_02, e keccakf1600_state_in_03, e keccakf1600_state_in_04, e keccakf1600_state_in_10, e keccakf1600_state_in_11, e keccakf1600_state_in_12, e keccakf1600_state_in_13, e keccakf1600_state_in_14, e keccakf1600_state_in_20, e keccakf1600_state_in_21, e keccakf1600_state_in_22, e keccakf1600_state_in_23, e keccakf1600_state_in_24, e keccakf1600_state_in_30, e keccakf1600_state_in_31, e keccakf1600_state_in_32, e keccakf1600_state_in_33, e keccakf1600_state_in_34, e keccakf1600_state_in_40, e keccakf1600_state_in_41, e keccakf1600_state_in_42, e keccakf1600_state_in_43, e keccakf1600_state_in_44, e merkle_check_index, e merkle_check_path_len, e merkle_check_read_node, e merkle_check_read_root, e merkle_check_sel, e merkle_check_start, e merkle_check_write, e merkle_check_write_node, e merkle_check_write_root, e poseidon2_hash_a_0, e poseidon2_hash_a_1, e poseidon2_hash_a_2, e poseidon2_hash_a_3, e poseidon2_hash_input_0, e poseidon2_hash_input_1, e poseidon2_hash_input_2, e poseidon2_hash_num_perm_rounds_rem, e poseidon2_hash_output, e poseidon2_hash_sel, e poseidon2_hash_start, e public_data_check_clk, e public_data_check_sel, e public_data_check_write_idx, e public_data_squash_clk, e public_data_squash_leaf_slot, e public_data_squash_sel, e scalar_mul_bit_idx, e scalar_mul_point_inf, e scalar_mul_point_x, e scalar_mul_point_y, e scalar_mul_res_inf, e scalar_mul_res_x, e scalar_mul_res_y, e scalar_mul_scalar, e scalar_mul_sel, e scalar_mul_start, e scalar_mul_temp_inf, e scalar_mul_temp_x, e scalar_mul_temp_y, e sha256_a, e sha256_b, e sha256_c, e sha256_d, e sha256_e, e sha256_f, e sha256_g, e sha256_h, e sha256_helper_w0, e sha256_helper_w1, e sha256_helper_w10, e sha256_helper_w11, e sha256_helper_w12, e sha256_helper_w13, e sha256_helper_w14, e sha256_helper_w15, e sha256_helper_w2, e sha256_helper_w3, e sha256_helper_w4, e sha256_helper_w5, e sha256_helper_w6, e sha256_helper_w7, e sha256_helper_w8, e sha256_helper_w9, e sha256_rounds_remaining, e sha256_sel, e sha256_start, e to_radix_acc, e to_radix_acc_under_p, e to_radix_exponent, e to_radix_limb, e to_radix_limb_eq_p, e to_radix_limb_index, e to_radix_limb_lt_p, e to_radix_not_padding_limb, e to_radix_radix, e to_radix_safe_limbs, e to_radix_sel, e to_radix_start, e to_radix_value, e tx_fee, e tx_phase_value, e tx_prev_da_gas_used, e tx_prev_l2_gas_used, e tx_read_pi_offset, e tx_remaining_phase_counter, e tx_sel, e tx_start_phase #define AVM2_ALL_ENTITIES_E(e) AVM2_PRECOMPUTED_ENTITIES_E(e), AVM2_WIRE_ENTITIES_E(e), AVM2_DERIVED_WITNESS_ENTITIES_E(e), AVM2_SHIFTED_ENTITIES_E(e) @@ -37,8 +37,8 @@ enum class ColumnAndShifts { SENTINEL_DO_NOT_USE, }; -constexpr auto NUM_COLUMNS_WITH_SHIFTS = 2795; -constexpr auto NUM_COLUMNS_WITHOUT_SHIFTS = 2545; +constexpr auto NUM_COLUMNS_WITH_SHIFTS = 2849; +constexpr auto NUM_COLUMNS_WITHOUT_SHIFTS = 2599; constexpr auto TO_BE_SHIFTED_COLUMNS_ARRAY = []() { return std::array{ AVM2_TO_BE_SHIFTED_COLUMNS }; }(); constexpr auto SHIFTED_COLUMNS_ARRAY = []() { return std::array{ AVM2_SHIFTED_COLUMNS }; }(); static_assert(TO_BE_SHIFTED_COLUMNS_ARRAY.size() == SHIFTED_COLUMNS_ARRAY.size()); diff --git a/barretenberg/cpp/src/barretenberg/vm2/generated/flavor_variables.hpp b/barretenberg/cpp/src/barretenberg/vm2/generated/flavor_variables.hpp index 1bcc98458647..b5f840a90ca3 100644 --- a/barretenberg/cpp/src/barretenberg/vm2/generated/flavor_variables.hpp +++ b/barretenberg/cpp/src/barretenberg/vm2/generated/flavor_variables.hpp @@ -39,6 +39,7 @@ #include "relations/notehash_exists.hpp" #include "relations/nullifier_check.hpp" #include "relations/poseidon2_hash.hpp" +#include "relations/poseidon2_mem.hpp" #include "relations/poseidon2_perm.hpp" #include "relations/public_data_check.hpp" #include "relations/public_data_squash.hpp" @@ -85,6 +86,7 @@ #include "relations/lookups_notehash_exists.hpp" #include "relations/lookups_nullifier_check.hpp" #include "relations/lookups_poseidon2_hash.hpp" +#include "relations/lookups_poseidon2_mem.hpp" #include "relations/lookups_public_data_check.hpp" #include "relations/lookups_range_check.hpp" #include "relations/lookups_registers.hpp" @@ -98,16 +100,17 @@ #include "relations/lookups_written_public_data_slots_tree_check.hpp" #include "relations/perms_execution.hpp" #include "relations/perms_keccakf1600.hpp" +#include "relations/perms_poseidon2_mem.hpp" #include "relations/perms_public_data_check.hpp" namespace bb::avm2 { struct AvmFlavorVariables { static constexpr size_t NUM_PRECOMPUTED_ENTITIES = 125; - static constexpr size_t NUM_WITNESS_ENTITIES = 2420; + static constexpr size_t NUM_WITNESS_ENTITIES = 2474; static constexpr size_t NUM_SHIFTED_ENTITIES = 250; static constexpr size_t NUM_WIRES = NUM_WITNESS_ENTITIES + NUM_PRECOMPUTED_ENTITIES; - static constexpr size_t NUM_ALL_ENTITIES = 2795; + static constexpr size_t NUM_ALL_ENTITIES = 2849; // Need to be templated for recursive verifier template @@ -150,6 +153,7 @@ struct AvmFlavorVariables { avm2::notehash_exists, avm2::nullifier_check, avm2::poseidon2_hash, + avm2::poseidon2_mem, avm2::poseidon2_perm, avm2::public_data_check, avm2::public_data_squash, @@ -410,6 +414,17 @@ struct AvmFlavorVariables { lookup_nullifier_check_updated_low_leaf_poseidon2_relation, lookup_nullifier_check_write_nullifier_to_public_inputs_relation, lookup_poseidon2_hash_poseidon2_perm_relation, + lookup_poseidon2_mem_check_dst_addr_in_range_relation, + lookup_poseidon2_mem_check_src_addr_in_range_relation, + lookup_poseidon2_mem_input_output_poseidon2_perm_relation, + lookup_poseidon2_mem_pos_read_mem_0_relation, + lookup_poseidon2_mem_pos_read_mem_1_relation, + lookup_poseidon2_mem_pos_read_mem_2_relation, + lookup_poseidon2_mem_pos_read_mem_3_relation, + lookup_poseidon2_mem_pos_write_mem_0_relation, + lookup_poseidon2_mem_pos_write_mem_1_relation, + lookup_poseidon2_mem_pos_write_mem_2_relation, + lookup_poseidon2_mem_pos_write_mem_3_relation, lookup_public_data_check_low_leaf_merkle_check_relation, lookup_public_data_check_low_leaf_next_slot_validation_relation, lookup_public_data_check_low_leaf_poseidon2_0_relation, @@ -483,6 +498,7 @@ struct AvmFlavorVariables { perm_execution_dispatch_keccakf1600_relation, perm_keccakf1600_read_to_slice_relation, perm_keccakf1600_write_to_slice_relation, + perm_poseidon2_mem_dispatch_exec_pos2_relation, perm_public_data_check_squashing_relation>; }; diff --git a/barretenberg/cpp/src/barretenberg/vm2/generated/relations/lookups_poseidon2_mem.hpp b/barretenberg/cpp/src/barretenberg/vm2/generated/relations/lookups_poseidon2_mem.hpp new file mode 100644 index 000000000000..0936b7cc9975 --- /dev/null +++ b/barretenberg/cpp/src/barretenberg/vm2/generated/relations/lookups_poseidon2_mem.hpp @@ -0,0 +1,303 @@ +// AUTOGENERATED FILE +#pragma once + +#include +#include +#include + +#include "../columns.hpp" +#include "barretenberg/relations/generic_lookup/generic_lookup_relation.hpp" +#include "barretenberg/vm2/constraining/relations/interactions_base.hpp" + +namespace bb::avm2 { + +/////////////////// lookup_poseidon2_mem_check_src_addr_in_range /////////////////// + +struct lookup_poseidon2_mem_check_src_addr_in_range_settings_ { + static constexpr std::string_view NAME = "LOOKUP_POSEIDON2_MEM_CHECK_SRC_ADDR_IN_RANGE"; + static constexpr std::string_view RELATION_NAME = "poseidon2_mem"; + static constexpr size_t LOOKUP_TUPLE_SIZE = 3; + static constexpr Column SRC_SELECTOR = Column::poseidon2_perm_mem_sel; + static constexpr Column DST_SELECTOR = Column::gt_sel; + static constexpr Column COUNTS = Column::lookup_poseidon2_mem_check_src_addr_in_range_counts; + static constexpr Column INVERSES = Column::lookup_poseidon2_mem_check_src_addr_in_range_inv; + static constexpr std::array SRC_COLUMNS = { + ColumnAndShifts::poseidon2_perm_mem_read_address_3_, + ColumnAndShifts::poseidon2_perm_mem_max_mem_addr, + ColumnAndShifts::poseidon2_perm_mem_sel_src_out_of_range_err + }; + static constexpr std::array DST_COLUMNS = { ColumnAndShifts::gt_input_a, + ColumnAndShifts::gt_input_b, + ColumnAndShifts::gt_res }; +}; + +using lookup_poseidon2_mem_check_src_addr_in_range_settings = + lookup_settings; +template +using lookup_poseidon2_mem_check_src_addr_in_range_relation = + lookup_relation_base; + +/////////////////// lookup_poseidon2_mem_check_dst_addr_in_range /////////////////// + +struct lookup_poseidon2_mem_check_dst_addr_in_range_settings_ { + static constexpr std::string_view NAME = "LOOKUP_POSEIDON2_MEM_CHECK_DST_ADDR_IN_RANGE"; + static constexpr std::string_view RELATION_NAME = "poseidon2_mem"; + static constexpr size_t LOOKUP_TUPLE_SIZE = 3; + static constexpr Column SRC_SELECTOR = Column::poseidon2_perm_mem_sel; + static constexpr Column DST_SELECTOR = Column::gt_sel; + static constexpr Column COUNTS = Column::lookup_poseidon2_mem_check_dst_addr_in_range_counts; + static constexpr Column INVERSES = Column::lookup_poseidon2_mem_check_dst_addr_in_range_inv; + static constexpr std::array SRC_COLUMNS = { + ColumnAndShifts::poseidon2_perm_mem_write_address_3_, + ColumnAndShifts::poseidon2_perm_mem_max_mem_addr, + ColumnAndShifts::poseidon2_perm_mem_sel_dst_out_of_range_err + }; + static constexpr std::array DST_COLUMNS = { ColumnAndShifts::gt_input_a, + ColumnAndShifts::gt_input_b, + ColumnAndShifts::gt_res }; +}; + +using lookup_poseidon2_mem_check_dst_addr_in_range_settings = + lookup_settings; +template +using lookup_poseidon2_mem_check_dst_addr_in_range_relation = + lookup_relation_base; + +/////////////////// lookup_poseidon2_mem_pos_read_mem_0 /////////////////// + +struct lookup_poseidon2_mem_pos_read_mem_0_settings_ { + static constexpr std::string_view NAME = "LOOKUP_POSEIDON2_MEM_POS_READ_MEM_0"; + static constexpr std::string_view RELATION_NAME = "poseidon2_mem"; + static constexpr size_t LOOKUP_TUPLE_SIZE = 6; + static constexpr Column SRC_SELECTOR = Column::poseidon2_perm_mem_sel_should_read_mem; + static constexpr Column DST_SELECTOR = Column::memory_sel; + static constexpr Column COUNTS = Column::lookup_poseidon2_mem_pos_read_mem_0_counts; + static constexpr Column INVERSES = Column::lookup_poseidon2_mem_pos_read_mem_0_inv; + static constexpr std::array SRC_COLUMNS = { + ColumnAndShifts::poseidon2_perm_mem_execution_clk, ColumnAndShifts::poseidon2_perm_mem_read_address_0_, + ColumnAndShifts::poseidon2_perm_mem_input_0_, ColumnAndShifts::poseidon2_perm_mem_input_tag_0_, + ColumnAndShifts::poseidon2_perm_mem_space_id, ColumnAndShifts::precomputed_zero + }; + static constexpr std::array DST_COLUMNS = { + ColumnAndShifts::memory_clk, ColumnAndShifts::memory_address, ColumnAndShifts::memory_value, + ColumnAndShifts::memory_tag, ColumnAndShifts::memory_space_id, ColumnAndShifts::memory_rw + }; +}; + +using lookup_poseidon2_mem_pos_read_mem_0_settings = lookup_settings; +template +using lookup_poseidon2_mem_pos_read_mem_0_relation = + lookup_relation_base; + +/////////////////// lookup_poseidon2_mem_pos_read_mem_1 /////////////////// + +struct lookup_poseidon2_mem_pos_read_mem_1_settings_ { + static constexpr std::string_view NAME = "LOOKUP_POSEIDON2_MEM_POS_READ_MEM_1"; + static constexpr std::string_view RELATION_NAME = "poseidon2_mem"; + static constexpr size_t LOOKUP_TUPLE_SIZE = 6; + static constexpr Column SRC_SELECTOR = Column::poseidon2_perm_mem_sel_should_read_mem; + static constexpr Column DST_SELECTOR = Column::memory_sel; + static constexpr Column COUNTS = Column::lookup_poseidon2_mem_pos_read_mem_1_counts; + static constexpr Column INVERSES = Column::lookup_poseidon2_mem_pos_read_mem_1_inv; + static constexpr std::array SRC_COLUMNS = { + ColumnAndShifts::poseidon2_perm_mem_execution_clk, ColumnAndShifts::poseidon2_perm_mem_read_address_1_, + ColumnAndShifts::poseidon2_perm_mem_input_1_, ColumnAndShifts::poseidon2_perm_mem_input_tag_1_, + ColumnAndShifts::poseidon2_perm_mem_space_id, ColumnAndShifts::precomputed_zero + }; + static constexpr std::array DST_COLUMNS = { + ColumnAndShifts::memory_clk, ColumnAndShifts::memory_address, ColumnAndShifts::memory_value, + ColumnAndShifts::memory_tag, ColumnAndShifts::memory_space_id, ColumnAndShifts::memory_rw + }; +}; + +using lookup_poseidon2_mem_pos_read_mem_1_settings = lookup_settings; +template +using lookup_poseidon2_mem_pos_read_mem_1_relation = + lookup_relation_base; + +/////////////////// lookup_poseidon2_mem_pos_read_mem_2 /////////////////// + +struct lookup_poseidon2_mem_pos_read_mem_2_settings_ { + static constexpr std::string_view NAME = "LOOKUP_POSEIDON2_MEM_POS_READ_MEM_2"; + static constexpr std::string_view RELATION_NAME = "poseidon2_mem"; + static constexpr size_t LOOKUP_TUPLE_SIZE = 6; + static constexpr Column SRC_SELECTOR = Column::poseidon2_perm_mem_sel_should_read_mem; + static constexpr Column DST_SELECTOR = Column::memory_sel; + static constexpr Column COUNTS = Column::lookup_poseidon2_mem_pos_read_mem_2_counts; + static constexpr Column INVERSES = Column::lookup_poseidon2_mem_pos_read_mem_2_inv; + static constexpr std::array SRC_COLUMNS = { + ColumnAndShifts::poseidon2_perm_mem_execution_clk, ColumnAndShifts::poseidon2_perm_mem_read_address_2_, + ColumnAndShifts::poseidon2_perm_mem_input_2_, ColumnAndShifts::poseidon2_perm_mem_input_tag_2_, + ColumnAndShifts::poseidon2_perm_mem_space_id, ColumnAndShifts::precomputed_zero + }; + static constexpr std::array DST_COLUMNS = { + ColumnAndShifts::memory_clk, ColumnAndShifts::memory_address, ColumnAndShifts::memory_value, + ColumnAndShifts::memory_tag, ColumnAndShifts::memory_space_id, ColumnAndShifts::memory_rw + }; +}; + +using lookup_poseidon2_mem_pos_read_mem_2_settings = lookup_settings; +template +using lookup_poseidon2_mem_pos_read_mem_2_relation = + lookup_relation_base; + +/////////////////// lookup_poseidon2_mem_pos_read_mem_3 /////////////////// + +struct lookup_poseidon2_mem_pos_read_mem_3_settings_ { + static constexpr std::string_view NAME = "LOOKUP_POSEIDON2_MEM_POS_READ_MEM_3"; + static constexpr std::string_view RELATION_NAME = "poseidon2_mem"; + static constexpr size_t LOOKUP_TUPLE_SIZE = 6; + static constexpr Column SRC_SELECTOR = Column::poseidon2_perm_mem_sel_should_read_mem; + static constexpr Column DST_SELECTOR = Column::memory_sel; + static constexpr Column COUNTS = Column::lookup_poseidon2_mem_pos_read_mem_3_counts; + static constexpr Column INVERSES = Column::lookup_poseidon2_mem_pos_read_mem_3_inv; + static constexpr std::array SRC_COLUMNS = { + ColumnAndShifts::poseidon2_perm_mem_execution_clk, ColumnAndShifts::poseidon2_perm_mem_read_address_3_, + ColumnAndShifts::poseidon2_perm_mem_input_3_, ColumnAndShifts::poseidon2_perm_mem_input_tag_3_, + ColumnAndShifts::poseidon2_perm_mem_space_id, ColumnAndShifts::precomputed_zero + }; + static constexpr std::array DST_COLUMNS = { + ColumnAndShifts::memory_clk, ColumnAndShifts::memory_address, ColumnAndShifts::memory_value, + ColumnAndShifts::memory_tag, ColumnAndShifts::memory_space_id, ColumnAndShifts::memory_rw + }; +}; + +using lookup_poseidon2_mem_pos_read_mem_3_settings = lookup_settings; +template +using lookup_poseidon2_mem_pos_read_mem_3_relation = + lookup_relation_base; + +/////////////////// lookup_poseidon2_mem_input_output_poseidon2_perm /////////////////// + +struct lookup_poseidon2_mem_input_output_poseidon2_perm_settings_ { + static constexpr std::string_view NAME = "LOOKUP_POSEIDON2_MEM_INPUT_OUTPUT_POSEIDON2_PERM"; + static constexpr std::string_view RELATION_NAME = "poseidon2_mem"; + static constexpr size_t LOOKUP_TUPLE_SIZE = 8; + static constexpr Column SRC_SELECTOR = Column::poseidon2_perm_mem_sel_should_exec; + static constexpr Column DST_SELECTOR = Column::poseidon2_perm_sel; + static constexpr Column COUNTS = Column::lookup_poseidon2_mem_input_output_poseidon2_perm_counts; + static constexpr Column INVERSES = Column::lookup_poseidon2_mem_input_output_poseidon2_perm_inv; + static constexpr std::array SRC_COLUMNS = { + ColumnAndShifts::poseidon2_perm_mem_input_0_, ColumnAndShifts::poseidon2_perm_mem_input_1_, + ColumnAndShifts::poseidon2_perm_mem_input_2_, ColumnAndShifts::poseidon2_perm_mem_input_3_, + ColumnAndShifts::poseidon2_perm_mem_output_0_, ColumnAndShifts::poseidon2_perm_mem_output_1_, + ColumnAndShifts::poseidon2_perm_mem_output_2_, ColumnAndShifts::poseidon2_perm_mem_output_3_ + }; + static constexpr std::array DST_COLUMNS = { + ColumnAndShifts::poseidon2_perm_a_0, ColumnAndShifts::poseidon2_perm_a_1, ColumnAndShifts::poseidon2_perm_a_2, + ColumnAndShifts::poseidon2_perm_a_3, ColumnAndShifts::poseidon2_perm_b_0, ColumnAndShifts::poseidon2_perm_b_1, + ColumnAndShifts::poseidon2_perm_b_2, ColumnAndShifts::poseidon2_perm_b_3 + }; +}; + +using lookup_poseidon2_mem_input_output_poseidon2_perm_settings = + lookup_settings; +template +using lookup_poseidon2_mem_input_output_poseidon2_perm_relation = + lookup_relation_base; + +/////////////////// lookup_poseidon2_mem_pos_write_mem_0 /////////////////// + +struct lookup_poseidon2_mem_pos_write_mem_0_settings_ { + static constexpr std::string_view NAME = "LOOKUP_POSEIDON2_MEM_POS_WRITE_MEM_0"; + static constexpr std::string_view RELATION_NAME = "poseidon2_mem"; + static constexpr size_t LOOKUP_TUPLE_SIZE = 6; + static constexpr Column SRC_SELECTOR = Column::poseidon2_perm_mem_sel_should_exec; + static constexpr Column DST_SELECTOR = Column::memory_sel; + static constexpr Column COUNTS = Column::lookup_poseidon2_mem_pos_write_mem_0_counts; + static constexpr Column INVERSES = Column::lookup_poseidon2_mem_pos_write_mem_0_inv; + static constexpr std::array SRC_COLUMNS = { + ColumnAndShifts::poseidon2_perm_mem_execution_clk, ColumnAndShifts::poseidon2_perm_mem_write_address_0_, + ColumnAndShifts::poseidon2_perm_mem_output_0_, ColumnAndShifts::precomputed_zero, + ColumnAndShifts::poseidon2_perm_mem_space_id, ColumnAndShifts::poseidon2_perm_mem_sel_should_exec + }; + static constexpr std::array DST_COLUMNS = { + ColumnAndShifts::memory_clk, ColumnAndShifts::memory_address, ColumnAndShifts::memory_value, + ColumnAndShifts::memory_tag, ColumnAndShifts::memory_space_id, ColumnAndShifts::memory_rw + }; +}; + +using lookup_poseidon2_mem_pos_write_mem_0_settings = lookup_settings; +template +using lookup_poseidon2_mem_pos_write_mem_0_relation = + lookup_relation_base; + +/////////////////// lookup_poseidon2_mem_pos_write_mem_1 /////////////////// + +struct lookup_poseidon2_mem_pos_write_mem_1_settings_ { + static constexpr std::string_view NAME = "LOOKUP_POSEIDON2_MEM_POS_WRITE_MEM_1"; + static constexpr std::string_view RELATION_NAME = "poseidon2_mem"; + static constexpr size_t LOOKUP_TUPLE_SIZE = 6; + static constexpr Column SRC_SELECTOR = Column::poseidon2_perm_mem_sel_should_exec; + static constexpr Column DST_SELECTOR = Column::memory_sel; + static constexpr Column COUNTS = Column::lookup_poseidon2_mem_pos_write_mem_1_counts; + static constexpr Column INVERSES = Column::lookup_poseidon2_mem_pos_write_mem_1_inv; + static constexpr std::array SRC_COLUMNS = { + ColumnAndShifts::poseidon2_perm_mem_execution_clk, ColumnAndShifts::poseidon2_perm_mem_write_address_1_, + ColumnAndShifts::poseidon2_perm_mem_output_1_, ColumnAndShifts::precomputed_zero, + ColumnAndShifts::poseidon2_perm_mem_space_id, ColumnAndShifts::poseidon2_perm_mem_sel_should_exec + }; + static constexpr std::array DST_COLUMNS = { + ColumnAndShifts::memory_clk, ColumnAndShifts::memory_address, ColumnAndShifts::memory_value, + ColumnAndShifts::memory_tag, ColumnAndShifts::memory_space_id, ColumnAndShifts::memory_rw + }; +}; + +using lookup_poseidon2_mem_pos_write_mem_1_settings = lookup_settings; +template +using lookup_poseidon2_mem_pos_write_mem_1_relation = + lookup_relation_base; + +/////////////////// lookup_poseidon2_mem_pos_write_mem_2 /////////////////// + +struct lookup_poseidon2_mem_pos_write_mem_2_settings_ { + static constexpr std::string_view NAME = "LOOKUP_POSEIDON2_MEM_POS_WRITE_MEM_2"; + static constexpr std::string_view RELATION_NAME = "poseidon2_mem"; + static constexpr size_t LOOKUP_TUPLE_SIZE = 6; + static constexpr Column SRC_SELECTOR = Column::poseidon2_perm_mem_sel_should_exec; + static constexpr Column DST_SELECTOR = Column::memory_sel; + static constexpr Column COUNTS = Column::lookup_poseidon2_mem_pos_write_mem_2_counts; + static constexpr Column INVERSES = Column::lookup_poseidon2_mem_pos_write_mem_2_inv; + static constexpr std::array SRC_COLUMNS = { + ColumnAndShifts::poseidon2_perm_mem_execution_clk, ColumnAndShifts::poseidon2_perm_mem_write_address_2_, + ColumnAndShifts::poseidon2_perm_mem_output_2_, ColumnAndShifts::precomputed_zero, + ColumnAndShifts::poseidon2_perm_mem_space_id, ColumnAndShifts::poseidon2_perm_mem_sel_should_exec + }; + static constexpr std::array DST_COLUMNS = { + ColumnAndShifts::memory_clk, ColumnAndShifts::memory_address, ColumnAndShifts::memory_value, + ColumnAndShifts::memory_tag, ColumnAndShifts::memory_space_id, ColumnAndShifts::memory_rw + }; +}; + +using lookup_poseidon2_mem_pos_write_mem_2_settings = lookup_settings; +template +using lookup_poseidon2_mem_pos_write_mem_2_relation = + lookup_relation_base; + +/////////////////// lookup_poseidon2_mem_pos_write_mem_3 /////////////////// + +struct lookup_poseidon2_mem_pos_write_mem_3_settings_ { + static constexpr std::string_view NAME = "LOOKUP_POSEIDON2_MEM_POS_WRITE_MEM_3"; + static constexpr std::string_view RELATION_NAME = "poseidon2_mem"; + static constexpr size_t LOOKUP_TUPLE_SIZE = 6; + static constexpr Column SRC_SELECTOR = Column::poseidon2_perm_mem_sel_should_exec; + static constexpr Column DST_SELECTOR = Column::memory_sel; + static constexpr Column COUNTS = Column::lookup_poseidon2_mem_pos_write_mem_3_counts; + static constexpr Column INVERSES = Column::lookup_poseidon2_mem_pos_write_mem_3_inv; + static constexpr std::array SRC_COLUMNS = { + ColumnAndShifts::poseidon2_perm_mem_execution_clk, ColumnAndShifts::poseidon2_perm_mem_write_address_3_, + ColumnAndShifts::poseidon2_perm_mem_output_3_, ColumnAndShifts::precomputed_zero, + ColumnAndShifts::poseidon2_perm_mem_space_id, ColumnAndShifts::poseidon2_perm_mem_sel_should_exec + }; + static constexpr std::array DST_COLUMNS = { + ColumnAndShifts::memory_clk, ColumnAndShifts::memory_address, ColumnAndShifts::memory_value, + ColumnAndShifts::memory_tag, ColumnAndShifts::memory_space_id, ColumnAndShifts::memory_rw + }; +}; + +using lookup_poseidon2_mem_pos_write_mem_3_settings = lookup_settings; +template +using lookup_poseidon2_mem_pos_write_mem_3_relation = + lookup_relation_base; + +} // namespace bb::avm2 diff --git a/barretenberg/cpp/src/barretenberg/vm2/generated/relations/perms_poseidon2_mem.hpp b/barretenberg/cpp/src/barretenberg/vm2/generated/relations/perms_poseidon2_mem.hpp new file mode 100644 index 000000000000..beb16c2020f6 --- /dev/null +++ b/barretenberg/cpp/src/barretenberg/vm2/generated/relations/perms_poseidon2_mem.hpp @@ -0,0 +1,45 @@ +// AUTOGENERATED FILE +#pragma once + +#include +#include +#include + +#include "../columns.hpp" +#include "barretenberg/relations/generic_permutation/generic_permutation_relation.hpp" +#include "barretenberg/vm2/constraining/relations/interactions_base.hpp" + +namespace bb::avm2 { + +/////////////////// perm_poseidon2_mem_dispatch_exec_pos2 /////////////////// + +struct perm_poseidon2_mem_dispatch_exec_pos2_settings_ { + static constexpr std::string_view NAME = "PERM_POSEIDON2_MEM_DISPATCH_EXEC_POS2"; + static constexpr std::string_view RELATION_NAME = "poseidon2_mem"; + static constexpr size_t COLUMNS_PER_SET = 5; + static constexpr Column SRC_SELECTOR = Column::execution_sel_execute_poseidon2_perm; + static constexpr Column DST_SELECTOR = Column::poseidon2_perm_mem_sel; + static constexpr Column INVERSES = Column::perm_poseidon2_mem_dispatch_exec_pos2_inv; + static constexpr std::array SRC_COLUMNS = { + ColumnAndShifts::precomputed_clk, + ColumnAndShifts::execution_context_id, + ColumnAndShifts::execution_rop_0_, + ColumnAndShifts::execution_rop_1_, + ColumnAndShifts::execution_sel_opcode_error + }; + static constexpr std::array DST_COLUMNS = { + ColumnAndShifts::poseidon2_perm_mem_execution_clk, + ColumnAndShifts::poseidon2_perm_mem_space_id, + ColumnAndShifts::poseidon2_perm_mem_read_address_0_, + ColumnAndShifts::poseidon2_perm_mem_write_address_0_, + ColumnAndShifts::poseidon2_perm_mem_err + }; +}; + +using perm_poseidon2_mem_dispatch_exec_pos2_settings = + permutation_settings; +template +using perm_poseidon2_mem_dispatch_exec_pos2_relation = + permutation_relation_base; + +} // namespace bb::avm2 diff --git a/barretenberg/cpp/src/barretenberg/vm2/generated/relations/poseidon2_mem.hpp b/barretenberg/cpp/src/barretenberg/vm2/generated/relations/poseidon2_mem.hpp new file mode 100644 index 000000000000..765cedbcaad3 --- /dev/null +++ b/barretenberg/cpp/src/barretenberg/vm2/generated/relations/poseidon2_mem.hpp @@ -0,0 +1,171 @@ +// AUTOGENERATED FILE +#pragma once + +#include + +#include "barretenberg/relations/relation_parameters.hpp" +#include "barretenberg/relations/relation_types.hpp" +#include "barretenberg/vm2/generated/columns.hpp" + +namespace bb::avm2 { + +template class poseidon2_memImpl { + public: + using FF = FF_; + + static constexpr std::array SUBRELATION_PARTIAL_LENGTHS = { 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 3 }; + + template inline static bool skip(const AllEntities& in) + { + using C = ColumnAndShifts; + + return (in.get(C::poseidon2_perm_mem_sel)).is_zero(); + } + + template + void static accumulate(ContainerOverSubrelations& evals, + const AllEntities& in, + [[maybe_unused]] const RelationParameters&, + [[maybe_unused]] const FF& scaling_factor) + { + using C = ColumnAndShifts; + + const auto constants_MEM_TAG_FF = FF(0); + const auto constants_AVM_HIGHEST_MEM_ADDRESS = FF(4294967295UL); + const auto poseidon2_perm_mem_INPUT_TAG_DIFF_0 = + (in.get(C::poseidon2_perm_mem_input_tag_0_) - constants_MEM_TAG_FF); + const auto poseidon2_perm_mem_INPUT_TAG_DIFF_1 = + (in.get(C::poseidon2_perm_mem_input_tag_1_) - constants_MEM_TAG_FF); + const auto poseidon2_perm_mem_INPUT_TAG_DIFF_2 = + (in.get(C::poseidon2_perm_mem_input_tag_2_) - constants_MEM_TAG_FF); + const auto poseidon2_perm_mem_INPUT_TAG_DIFF_3 = + (in.get(C::poseidon2_perm_mem_input_tag_3_) - constants_MEM_TAG_FF); + const auto poseidon2_perm_mem_BATCHED_TAG_CHECK = + FF(1) * poseidon2_perm_mem_INPUT_TAG_DIFF_0 + FF(8) * poseidon2_perm_mem_INPUT_TAG_DIFF_1 + + FF(64) * poseidon2_perm_mem_INPUT_TAG_DIFF_2 + FF(512) * poseidon2_perm_mem_INPUT_TAG_DIFF_3; + + { // READ_ADDR_INCR + using Accumulator = typename std::tuple_element_t<0, ContainerOverSubrelations>; + auto tmp = (in.get(C::poseidon2_perm_mem_read_address_1_) - + in.get(C::poseidon2_perm_mem_sel) * (in.get(C::poseidon2_perm_mem_read_address_0_) + FF(1))); + tmp *= scaling_factor; + std::get<0>(evals) += typename Accumulator::View(tmp); + } + { + using Accumulator = typename std::tuple_element_t<1, ContainerOverSubrelations>; + auto tmp = (in.get(C::poseidon2_perm_mem_read_address_2_) - + in.get(C::poseidon2_perm_mem_sel) * (in.get(C::poseidon2_perm_mem_read_address_0_) + FF(2))); + tmp *= scaling_factor; + std::get<1>(evals) += typename Accumulator::View(tmp); + } + { + using Accumulator = typename std::tuple_element_t<2, ContainerOverSubrelations>; + auto tmp = (in.get(C::poseidon2_perm_mem_read_address_3_) - + in.get(C::poseidon2_perm_mem_sel) * (in.get(C::poseidon2_perm_mem_read_address_0_) + FF(3))); + tmp *= scaling_factor; + std::get<2>(evals) += typename Accumulator::View(tmp); + } + { // WRITE_ADDR_INCR + using Accumulator = typename std::tuple_element_t<3, ContainerOverSubrelations>; + auto tmp = (in.get(C::poseidon2_perm_mem_write_address_1_) - + in.get(C::poseidon2_perm_mem_sel) * (in.get(C::poseidon2_perm_mem_write_address_0_) + FF(1))); + tmp *= scaling_factor; + std::get<3>(evals) += typename Accumulator::View(tmp); + } + { + using Accumulator = typename std::tuple_element_t<4, ContainerOverSubrelations>; + auto tmp = (in.get(C::poseidon2_perm_mem_write_address_2_) - + in.get(C::poseidon2_perm_mem_sel) * (in.get(C::poseidon2_perm_mem_write_address_0_) + FF(2))); + tmp *= scaling_factor; + std::get<4>(evals) += typename Accumulator::View(tmp); + } + { + using Accumulator = typename std::tuple_element_t<5, ContainerOverSubrelations>; + auto tmp = (in.get(C::poseidon2_perm_mem_write_address_3_) - + in.get(C::poseidon2_perm_mem_sel) * (in.get(C::poseidon2_perm_mem_write_address_0_) + FF(3))); + tmp *= scaling_factor; + std::get<5>(evals) += typename Accumulator::View(tmp); + } + { + using Accumulator = typename std::tuple_element_t<6, ContainerOverSubrelations>; + auto tmp = in.get(C::poseidon2_perm_mem_sel_src_out_of_range_err) * + (FF(1) - in.get(C::poseidon2_perm_mem_sel_src_out_of_range_err)); + tmp *= scaling_factor; + std::get<6>(evals) += typename Accumulator::View(tmp); + } + { + using Accumulator = typename std::tuple_element_t<7, ContainerOverSubrelations>; + auto tmp = in.get(C::poseidon2_perm_mem_sel_dst_out_of_range_err) * + (FF(1) - in.get(C::poseidon2_perm_mem_sel_dst_out_of_range_err)); + tmp *= scaling_factor; + std::get<7>(evals) += typename Accumulator::View(tmp); + } + { + using Accumulator = typename std::tuple_element_t<8, ContainerOverSubrelations>; + auto tmp = in.get(C::poseidon2_perm_mem_sel) * + (in.get(C::poseidon2_perm_mem_max_mem_addr) - constants_AVM_HIGHEST_MEM_ADDRESS); + tmp *= scaling_factor; + std::get<8>(evals) += typename Accumulator::View(tmp); + } + { + using Accumulator = typename std::tuple_element_t<9, ContainerOverSubrelations>; + auto tmp = + (in.get(C::poseidon2_perm_mem_sel_should_read_mem) - + in.get(C::poseidon2_perm_mem_sel) * (FF(1) - in.get(C::poseidon2_perm_mem_sel_src_out_of_range_err)) * + (FF(1) - in.get(C::poseidon2_perm_mem_sel_dst_out_of_range_err))); + tmp *= scaling_factor; + std::get<9>(evals) += typename Accumulator::View(tmp); + } + { // BATCH_ZERO_CHECK + using Accumulator = typename std::tuple_element_t<10, ContainerOverSubrelations>; + auto tmp = + (poseidon2_perm_mem_BATCHED_TAG_CHECK * ((FF(1) - in.get(C::poseidon2_perm_mem_sel_invalid_tag_err)) * + (FF(1) - in.get(C::poseidon2_perm_mem_batch_tag_inv)) + + in.get(C::poseidon2_perm_mem_batch_tag_inv)) - + in.get(C::poseidon2_perm_mem_sel_invalid_tag_err)); + tmp *= scaling_factor; + std::get<10>(evals) += typename Accumulator::View(tmp); + } + { + using Accumulator = typename std::tuple_element_t<11, ContainerOverSubrelations>; + auto tmp = (in.get(C::poseidon2_perm_mem_err) - + (FF(1) - (FF(1) - in.get(C::poseidon2_perm_mem_sel_src_out_of_range_err)) * + (FF(1) - in.get(C::poseidon2_perm_mem_sel_dst_out_of_range_err)) * + (FF(1) - in.get(C::poseidon2_perm_mem_sel_invalid_tag_err)))); + tmp *= scaling_factor; + std::get<11>(evals) += typename Accumulator::View(tmp); + } + { + using Accumulator = typename std::tuple_element_t<12, ContainerOverSubrelations>; + auto tmp = (in.get(C::poseidon2_perm_mem_sel_should_exec) - + in.get(C::poseidon2_perm_mem_sel) * (FF(1) - in.get(C::poseidon2_perm_mem_err))); + tmp *= scaling_factor; + std::get<12>(evals) += typename Accumulator::View(tmp); + } + } +}; + +template class poseidon2_mem : public Relation> { + public: + static constexpr const std::string_view NAME = "poseidon2_mem"; + + static std::string get_subrelation_label(size_t index) + { + switch (index) { + case 0: + return "READ_ADDR_INCR"; + case 3: + return "WRITE_ADDR_INCR"; + case 10: + return "BATCH_ZERO_CHECK"; + } + return std::to_string(index); + } + + // Subrelation indices constants, to be used in tests. + static constexpr size_t SR_READ_ADDR_INCR = 0; + static constexpr size_t SR_WRITE_ADDR_INCR = 3; + static constexpr size_t SR_BATCH_ZERO_CHECK = 10; +}; + +} // namespace bb::avm2 diff --git a/barretenberg/cpp/src/barretenberg/vm2/simulation/class_id_derivation.hpp b/barretenberg/cpp/src/barretenberg/vm2/simulation/class_id_derivation.hpp index 698b5e973bcf..3c2bba47089b 100644 --- a/barretenberg/cpp/src/barretenberg/vm2/simulation/class_id_derivation.hpp +++ b/barretenberg/cpp/src/barretenberg/vm2/simulation/class_id_derivation.hpp @@ -15,7 +15,7 @@ class ClassIdDerivationInterface { class ClassIdDerivation : public ClassIdDerivationInterface { public: - ClassIdDerivation(Poseidon2& poseidon2, EventEmitterInterface& events) + ClassIdDerivation(Poseidon2Interface& poseidon2, EventEmitterInterface& events) : events(events) , poseidon2(poseidon2) {} diff --git a/barretenberg/cpp/src/barretenberg/vm2/simulation/events/events_container.hpp b/barretenberg/cpp/src/barretenberg/vm2/simulation/events/events_container.hpp index 329929a82691..2776daae6fb1 100644 --- a/barretenberg/cpp/src/barretenberg/vm2/simulation/events/events_container.hpp +++ b/barretenberg/cpp/src/barretenberg/vm2/simulation/events/events_container.hpp @@ -52,6 +52,7 @@ struct EventsContainer { EventEmitterInterface::Container scalar_mul; EventEmitterInterface::Container poseidon2_hash; EventEmitterInterface::Container poseidon2_permutation; + EventEmitterInterface::Container poseidon2_permutation_mem; EventEmitterInterface::Container keccakf1600; EventEmitterInterface::Container to_radix; EventEmitterInterface::Container field_gt; diff --git a/barretenberg/cpp/src/barretenberg/vm2/simulation/events/poseidon2_event.hpp b/barretenberg/cpp/src/barretenberg/vm2/simulation/events/poseidon2_event.hpp index 278145b82340..e329e297a4b8 100644 --- a/barretenberg/cpp/src/barretenberg/vm2/simulation/events/poseidon2_event.hpp +++ b/barretenberg/cpp/src/barretenberg/vm2/simulation/events/poseidon2_event.hpp @@ -4,9 +4,16 @@ #include #include "barretenberg/vm2/common/field.hpp" +#include "barretenberg/vm2/common/memory_types.hpp" namespace bb::avm2::simulation { +struct Poseidon2Exception : public std::runtime_error { + Poseidon2Exception(const std::string& message) + : std::runtime_error("Poseidon2Exception: " + message) + {} +}; + struct Poseidon2HashEvent { std::vector inputs; // This input is padded to a multiple of 3 std::vector> intermediate_states; @@ -18,4 +25,14 @@ struct Poseidon2PermutationEvent { std::array output; }; +struct Poseidon2PermutationMemoryEvent { + uint32_t space_id = 0; + uint32_t execution_clk = 0; + MemoryAddress src_address = 0; + MemoryAddress dst_address = 0; + // Need to know the tag value for error handling + std::array input; + std::array output; +}; + } // namespace bb::avm2::simulation diff --git a/barretenberg/cpp/src/barretenberg/vm2/simulation/execution.cpp b/barretenberg/cpp/src/barretenberg/vm2/simulation/execution.cpp index 0e3f2cf29b44..ed2c54880e00 100644 --- a/barretenberg/cpp/src/barretenberg/vm2/simulation/execution.cpp +++ b/barretenberg/cpp/src/barretenberg/vm2/simulation/execution.cpp @@ -671,6 +671,16 @@ void Execution::l1_to_l2_message_exists(ContextInterface& context, set_output(opcode, value); } +void Execution::poseidon2_permutation(ContextInterface& context, MemoryAddress src_addr, MemoryAddress dst_addr) +{ + get_gas_tracker().consume_gas(); + try { + poseidon2.permutation(context.get_memory(), src_addr, dst_addr); + } catch (const Poseidon2Exception& e) { + throw OpcodeExecutionException("Poseidon2 permutation failed: " + std::string(e.what())); + } +} + // This context interface is a top-level enqueued one. // NOTE: For the moment this trace is not returning the context back. ExecutionResult Execution::execute(std::unique_ptr enqueued_call_context) @@ -920,6 +930,9 @@ void Execution::dispatch_opcode(ExecutionOpCode opcode, case ExecutionOpCode::L1TOL2MSGEXISTS: call_with_operands(&Execution::l1_to_l2_message_exists, context, resolved_operands); break; + case ExecutionOpCode::POSEIDON2PERM: + call_with_operands(&Execution::poseidon2_permutation, context, resolved_operands); + break; default: // NOTE: Keep this a `std::runtime_error` so that the main loop panics. throw std::runtime_error("Tried to dispatch unknown execution opcode: " + diff --git a/barretenberg/cpp/src/barretenberg/vm2/simulation/execution.hpp b/barretenberg/cpp/src/barretenberg/vm2/simulation/execution.hpp index 16ea310912c2..3137b6eb801d 100644 --- a/barretenberg/cpp/src/barretenberg/vm2/simulation/execution.hpp +++ b/barretenberg/cpp/src/barretenberg/vm2/simulation/execution.hpp @@ -52,6 +52,7 @@ class Execution : public ExecutionInterface { Execution(AluInterface& alu, BitwiseInterface& bitwise, DataCopyInterface& data_copy, + Poseidon2Interface& poseidon2, ExecutionComponentsProviderInterface& execution_components, ContextProviderInterface& context_provider, const InstructionInfoDBInterface& instruction_info_db, @@ -66,6 +67,7 @@ class Execution : public ExecutionInterface { , instruction_info_db(instruction_info_db) , alu(alu) , bitwise(bitwise) + , poseidon2(poseidon2) , context_provider(context_provider) , execution_id_manager(execution_id_manager) , data_copy(data_copy) @@ -136,6 +138,7 @@ class Execution : public ExecutionInterface { MemoryAddress msg_hash_addr, MemoryAddress leaf_index_addr, MemoryAddress dst_addr); + void poseidon2_permutation(ContextInterface& context, MemoryAddress src_addr, MemoryAddress dst_addr); protected: // Only here for testing. TODO(fcarreiro): try to improve. @@ -168,6 +171,7 @@ class Execution : public ExecutionInterface { AluInterface& alu; BitwiseInterface& bitwise; + Poseidon2Interface& poseidon2; ContextProviderInterface& context_provider; ExecutionIdManagerInterface& execution_id_manager; DataCopyInterface& data_copy; diff --git a/barretenberg/cpp/src/barretenberg/vm2/simulation/execution.test.cpp b/barretenberg/cpp/src/barretenberg/vm2/simulation/execution.test.cpp index b99525aa5589..ea3dc04ea236 100644 --- a/barretenberg/cpp/src/barretenberg/vm2/simulation/execution.test.cpp +++ b/barretenberg/cpp/src/barretenberg/vm2/simulation/execution.test.cpp @@ -31,7 +31,7 @@ #include "barretenberg/vm2/simulation/testing/mock_internal_call_stack.hpp" #include "barretenberg/vm2/simulation/testing/mock_keccakf1600.hpp" #include "barretenberg/vm2/simulation/testing/mock_memory.hpp" -#include "barretenberg/vm2/simulation/testing/mock_range_check.hpp" +#include "barretenberg/vm2/simulation/testing/mock_poseidon2.hpp" #include "barretenberg/vm2/testing/macros.hpp" namespace bb::avm2::simulation { @@ -82,9 +82,11 @@ class ExecutionSimulationTest : public ::testing::Test { StrictMock gas_tracker; StrictMock merkle_db; StrictMock greater_than; + StrictMock poseidon2; TestingExecution execution = TestingExecution(alu, bitwise, data_copy, + poseidon2, execution_components, context_provider, instruction_info_db, @@ -623,6 +625,18 @@ TEST_F(ExecutionSimulationTest, Cast) execution.cast(context, src_addr, dst_addr, dst_tag); } +TEST_F(ExecutionSimulationTest, Poseidon2Perm) +{ + MemoryAddress src_address = 10; + MemoryAddress dst_address = 20; + + EXPECT_CALL(context, get_memory); + EXPECT_CALL(gas_tracker, consume_gas); + EXPECT_CALL(poseidon2, permutation(_, src_address, dst_address)); + + execution.poseidon2_permutation(context, src_address, dst_address); +} + } // namespace } // namespace bb::avm2::simulation diff --git a/barretenberg/cpp/src/barretenberg/vm2/simulation/merkle_check.hpp b/barretenberg/cpp/src/barretenberg/vm2/simulation/merkle_check.hpp index b3abc17c6c28..e09a3eaa9e15 100644 --- a/barretenberg/cpp/src/barretenberg/vm2/simulation/merkle_check.hpp +++ b/barretenberg/cpp/src/barretenberg/vm2/simulation/merkle_check.hpp @@ -29,7 +29,7 @@ class MerkleCheckInterface { class MerkleCheck : public MerkleCheckInterface { public: - MerkleCheck(Poseidon2& poseidon2, EventEmitterInterface& event_emitter) + MerkleCheck(Poseidon2Interface& poseidon2, EventEmitterInterface& event_emitter) : events(event_emitter) , poseidon2(poseidon2) {} diff --git a/barretenberg/cpp/src/barretenberg/vm2/simulation/merkle_check.test.cpp b/barretenberg/cpp/src/barretenberg/vm2/simulation/merkle_check.test.cpp index 1aaee6369133..3f2e46a230bb 100644 --- a/barretenberg/cpp/src/barretenberg/vm2/simulation/merkle_check.test.cpp +++ b/barretenberg/cpp/src/barretenberg/vm2/simulation/merkle_check.test.cpp @@ -1,3 +1,5 @@ +#include "barretenberg/vm2/simulation/merkle_check.hpp" + #include #include #include @@ -5,7 +7,7 @@ #include "barretenberg/vm2/simulation/events/event_emitter.hpp" #include "barretenberg/vm2/simulation/events/merkle_check_event.hpp" #include "barretenberg/vm2/simulation/lib/merkle.hpp" -#include "barretenberg/vm2/simulation/merkle_check.hpp" +#include "barretenberg/vm2/simulation/testing/fakes/fake_poseidon2.hpp" #include "barretenberg/vm2/testing/macros.hpp" namespace bb::avm2::simulation { @@ -15,9 +17,8 @@ using testing::ElementsAre; TEST(MerkleCheckSimulationTest, AssertMembership) { - EventEmitter hash_emitter; - EventEmitter perm_emitter; - Poseidon2 poseidon2(hash_emitter, perm_emitter); + // This fake will still perform hashing but is "lightweight" for simulation-only + FakePoseidon2 poseidon2 = FakePoseidon2(); EventEmitter emitter; MerkleCheck merkle_check(poseidon2, emitter); @@ -47,18 +48,13 @@ TEST(MerkleCheckSimulationTest, AssertMembership) .root = root2, }; - const size_t expected_merkle_rows = sibling_path.size() + sibling_path2.size(); - EXPECT_THAT(emitter.dump_events(), ElementsAre(expect_event, expect_event2)); - - EXPECT_EQ(hash_emitter.dump_events().size(), expected_merkle_rows); } TEST(MerkleCheckSimulationTest, Write) { - EventEmitter hash_emitter; - EventEmitter perm_emitter; - Poseidon2 poseidon2(hash_emitter, perm_emitter); + // This fake will still perform hashing but is "lightweight" for simulation-only + FakePoseidon2 poseidon2 = FakePoseidon2(); EventEmitter emitter; MerkleCheck merkle_check(poseidon2, emitter); @@ -83,14 +79,12 @@ TEST(MerkleCheckSimulationTest, Write) EXPECT_EQ(new_root, expected_new_root); EXPECT_THAT(emitter.dump_events(), ElementsAre(expect_event)); - EXPECT_EQ(hash_emitter.dump_events().size(), sibling_path.size() * 2); } TEST(MerkleCheckSimulationTest, NegativeBadFinalIndex) { - NoopEventEmitter hash_emitter; - NoopEventEmitter perm_emitter; - Poseidon2 poseidon2(hash_emitter, perm_emitter); + // This fake will still perform hashing but is "lightweight" for simulation-only + FakePoseidon2 poseidon2 = FakePoseidon2(); EventEmitter emitter; MerkleCheck merkle_check(poseidon2, emitter); @@ -108,9 +102,8 @@ TEST(MerkleCheckSimulationTest, NegativeBadFinalIndex) TEST(MerkleCheckSimulationTest, NegativeWrongRoot) { - NoopEventEmitter hash_emitter; - NoopEventEmitter perm_emitter; - Poseidon2 poseidon2(hash_emitter, perm_emitter); + // This fake will still perform hashing but is "lightweight" for simulation-only + FakePoseidon2 poseidon2 = FakePoseidon2(); EventEmitter emitter; MerkleCheck merkle_check(poseidon2, emitter); @@ -128,9 +121,8 @@ TEST(MerkleCheckSimulationTest, NegativeWrongRoot) TEST(MerkleCheckSimulationTest, NegativeWrongLeafIndex) { - NoopEventEmitter hash_emitter; - NoopEventEmitter perm_emitter; - Poseidon2 poseidon2(hash_emitter, perm_emitter); + // This fake will still perform hashing but is "lightweight" for simulation-only + FakePoseidon2 poseidon2 = FakePoseidon2(); EventEmitter emitter; MerkleCheck merkle_check(poseidon2, emitter); @@ -148,9 +140,8 @@ TEST(MerkleCheckSimulationTest, NegativeWrongLeafIndex) TEST(MerkleCheckSimulationTest, NegativeWrongSiblingPath) { - NoopEventEmitter hash_emitter; - NoopEventEmitter perm_emitter; - Poseidon2 poseidon2(hash_emitter, perm_emitter); + // This fake will still perform hashing but is "lightweight" for simulation-only + FakePoseidon2 poseidon2 = FakePoseidon2(); EventEmitter emitter; MerkleCheck merkle_check(poseidon2, emitter); @@ -170,9 +161,8 @@ TEST(MerkleCheckSimulationTest, NegativeWrongSiblingPath) TEST(MerkleCheckSimulationTest, NegativeWrongLeafValue) { - NoopEventEmitter hash_emitter; - NoopEventEmitter perm_emitter; - Poseidon2 poseidon2(hash_emitter, perm_emitter); + // This fake will still perform hashing but is "lightweight" for simulation-only + FakePoseidon2 poseidon2 = FakePoseidon2(); EventEmitter emitter; MerkleCheck merkle_check(poseidon2, emitter); diff --git a/barretenberg/cpp/src/barretenberg/vm2/simulation/poseidon2.cpp b/barretenberg/cpp/src/barretenberg/vm2/simulation/poseidon2.cpp index 83aeddfc8653..1cccfcbfd402 100644 --- a/barretenberg/cpp/src/barretenberg/vm2/simulation/poseidon2.cpp +++ b/barretenberg/cpp/src/barretenberg/vm2/simulation/poseidon2.cpp @@ -1,10 +1,13 @@ #include "barretenberg/vm2/simulation/poseidon2.hpp" +#include #include #include #include "barretenberg/crypto/poseidon2/poseidon2.hpp" #include "barretenberg/crypto/poseidon2/poseidon2_permutation.hpp" +#include "barretenberg/vm2/common/aztec_constants.hpp" +#include "barretenberg/vm2/simulation/memory.hpp" using bb::crypto::Poseidon2Bn254ScalarFieldParams; using bb::crypto::Poseidon2Permutation; @@ -54,4 +57,69 @@ std::array Poseidon2::permutation(const std::array& input) return output; } +void Poseidon2::permutation(MemoryInterface& memory, MemoryAddress src_address, MemoryAddress dst_address) +{ + uint32_t execution_clk = execution_id_manager.get_execution_id(); + uint32_t space_id = memory.get_space_id(); + + auto zero = MemoryValue::from(0); + std::array input = { zero, zero, zero, zero }; + + // Poseidon2Perm reads and writes 4 sequential elements each. We need to ensure that these memory addresses are + // within the memory address bounds. + // Read Addressess: { src_address, src_address + 1, src_address + 2, src_address + 3 } + // Write Addresses: { dst_address, dst_address + 1, dst_address + 2, dst_address + 3 } + // So we check that src_address + 3 and dst_address + 3 are within the bounds + uint64_t max_read_address = static_cast(src_address) + 3; + uint64_t max_write_address = static_cast(dst_address) + 3; + bool read_out_of_range = gt.gt(max_read_address, AVM_HIGHEST_MEM_ADDRESS); + bool write_out_of_range = gt.gt(max_write_address, AVM_HIGHEST_MEM_ADDRESS); + + try { + if (read_out_of_range || write_out_of_range) { + throw std::runtime_error("src or dst address out of range"); + } + + // Read 4 elements from memory starting at src_address + for (uint32_t i = 0; i < 4; i++) { + input[i] = memory.get(src_address + i); + } + + // If any of the memory values are not tagged as FF, we throw an error. This is only tested after all elements + // are loaded as the circuit expects reading and tagging checking to be different temporality groups + if (std::ranges::any_of( + input.begin(), input.end(), [](const MemoryValue& val) { return val.get_tag() != MemoryTag::FF; })) { + throw std::runtime_error("An input tag is not FF"); + } + + // This calls the Poseidon2 gadget permutation function and so generates events + std::array output = permutation({ + input[0].as_ff(), + input[1].as_ff(), + input[2].as_ff(), + input[3].as_ff(), + }); + + // Write the output back to memory starting at dst_address + for (uint32_t i = 0; i < 4; i++) { + memory.set(dst_address + i, MemoryValue::from_tag(MemoryTag::FF, output[i])); + } + perm_mem_events.emit({ .space_id = space_id, + .execution_clk = execution_clk, + .src_address = src_address, + .dst_address = dst_address, + .input = input, + .output = output }); + + } catch (const std::exception& e) { + perm_mem_events.emit({ .space_id = space_id, + .execution_clk = execution_clk, + .src_address = src_address, + .dst_address = dst_address, + .input = input, + .output = { 0, 0, 0, 0 } }); + throw Poseidon2Exception("Permutation failed, " + std::string(e.what())); + } +} + } // namespace bb::avm2::simulation diff --git a/barretenberg/cpp/src/barretenberg/vm2/simulation/poseidon2.hpp b/barretenberg/cpp/src/barretenberg/vm2/simulation/poseidon2.hpp index bc09ea308eb7..17887787bb0a 100644 --- a/barretenberg/cpp/src/barretenberg/vm2/simulation/poseidon2.hpp +++ b/barretenberg/cpp/src/barretenberg/vm2/simulation/poseidon2.hpp @@ -6,6 +6,8 @@ #include "barretenberg/vm2/simulation/events/event_emitter.hpp" #include "barretenberg/vm2/simulation/events/poseidon2_event.hpp" +#include "barretenberg/vm2/simulation/gt.hpp" +#include "barretenberg/vm2/simulation/memory.hpp" namespace bb::avm2::simulation { @@ -14,22 +16,34 @@ class Poseidon2Interface { virtual ~Poseidon2Interface() = default; virtual FF hash(const std::vector& input) = 0; virtual std::array permutation(const std::array& input) = 0; + // Overload for opcode execution that takes memory addresses + virtual void permutation(MemoryInterface& memory, MemoryAddress src_address, MemoryAddress dst_address) = 0; }; class Poseidon2 : public Poseidon2Interface { public: - Poseidon2(EventEmitterInterface& hash_emitter, - EventEmitterInterface& perm_emitter) - : hash_events(hash_emitter) + Poseidon2(ExecutionIdManagerInterface& execution_id_manager, + GreaterThanInterface& gt, + EventEmitterInterface& hash_emitter, + EventEmitterInterface& perm_emitter, + EventEmitterInterface& perm_mem_emitter) + : execution_id_manager(execution_id_manager) + , gt(gt) + , hash_events(hash_emitter) , perm_events(perm_emitter) + , perm_mem_events(perm_mem_emitter) {} FF hash(const std::vector& input) override; std::array permutation(const std::array& input) override; + void permutation(MemoryInterface& memory, MemoryAddress src_address, MemoryAddress dst_address) override; private: + ExecutionIdManagerInterface& execution_id_manager; + GreaterThanInterface& gt; EventEmitterInterface& hash_events; EventEmitterInterface& perm_events; + EventEmitterInterface& perm_mem_events; }; } // namespace bb::avm2::simulation diff --git a/barretenberg/cpp/src/barretenberg/vm2/simulation/poseidon2.test.cpp b/barretenberg/cpp/src/barretenberg/vm2/simulation/poseidon2.test.cpp index 69607813d40b..1113c9078e1d 100644 --- a/barretenberg/cpp/src/barretenberg/vm2/simulation/poseidon2.test.cpp +++ b/barretenberg/cpp/src/barretenberg/vm2/simulation/poseidon2.test.cpp @@ -5,6 +5,8 @@ #include "barretenberg/crypto/poseidon2/poseidon2.hpp" #include "barretenberg/vm2/simulation/events/event_emitter.hpp" +#include "barretenberg/vm2/simulation/testing/fakes/fake_gt.hpp" +#include "barretenberg/vm2/simulation/testing/mock_execution_id_manager.hpp" namespace bb::avm2::simulation { namespace { @@ -13,13 +15,29 @@ using ::testing::_; using ::testing::ElementsAre; using ::testing::ElementsAreArray; using ::testing::Field; +using ::testing::StrictMock; + +class Poseidon2SimulationTest : public ::testing::Test { + protected: + Poseidon2SimulationTest() + { + EXPECT_CALL(execution_id_manager, get_execution_id()) + .WillRepeatedly(testing::Return(0)); // Default execution ID for testing + } -TEST(Poseidon2SimulationTest, Hash) -{ EventEmitter hash_event_emitter; EventEmitter perm_event_emitter; - Poseidon2 poseidon2(hash_event_emitter, perm_event_emitter); + EventEmitter perm_mem_event_emitter; + + StrictMock execution_id_manager; + FakeGreaterThan gt; + Poseidon2 poseidon2 = + Poseidon2(execution_id_manager, gt, hash_event_emitter, perm_event_emitter, perm_mem_event_emitter); +}; + +TEST_F(Poseidon2SimulationTest, Hash) +{ // Taken From barretenberg/crypto/poseidon2/poseidon2.test.cpp FF a("9a807b615c4d3e2fa0b1c2d3e4f56789fedcba9876543210abcdef0123456789"); FF b("9a807b615c4d3e2fa0b1c2d3e4f56789fedcba9876543210abcdef0123456789"); @@ -40,12 +58,8 @@ TEST(Poseidon2SimulationTest, Hash) Field(&Poseidon2HashEvent::output, expected)))); } -TEST(Poseidon2SimulationTest, Permutation) +TEST_F(Poseidon2SimulationTest, Permutation) { - EventEmitter hash_event_emitter; - EventEmitter perm_event_emitter; - Poseidon2 poseidon2(hash_event_emitter, perm_event_emitter); - // Taken From barretenberg/crypto/poseidon2/poseidon2.test.cpp FF a("9a807b615c4d3e2fa0b1c2d3e4f56789fedcba9876543210abcdef0123456789"); FF b("9a807b615c4d3e2fa0b1c2d3e4f56789fedcba9876543210abcdef0123456789"); @@ -71,12 +85,8 @@ TEST(Poseidon2SimulationTest, Permutation) } // This test may seem redundant, but since we kind of re-implement the Poseidon2 sponge function, it's good to have it. -TEST(Poseidon2SimulationTest, RandomHash) +TEST_F(Poseidon2SimulationTest, RandomHash) { - EventEmitter hash_event_emitter; - EventEmitter perm_event_emitter; - Poseidon2 poseidon2(hash_event_emitter, perm_event_emitter); - std::vector input; input.reserve(14); @@ -90,5 +100,68 @@ TEST(Poseidon2SimulationTest, RandomHash) EXPECT_EQ(result, bb_result); } +TEST_F(Poseidon2SimulationTest, PermutationWithMemory) +{ + MemoryStore mem; + MemoryAddress src_address = 0; + + // Inputs taken From barretenberg/crypto/poseidon2/poseidon2.test.cpp + std::array inputs = { FF("9a807b615c4d3e2fa0b1c2d3e4f56789fedcba9876543210abcdef0123456789"), + FF("9a807b615c4d3e2fa0b1c2d3e4f56789fedcba9876543210abcdef0123456789"), + FF("0x9a807b615c4d3e2fa0b1c2d3e4f56789fedcba9876543210abcdef0123456789"), + FF("0x9a807b615c4d3e2fa0b1c2d3e4f56789fedcba9876543210abcdef0123456789") }; + // Fill the memory with 4 FF Elements + for (uint32_t i = 0; i < 4; ++i) { + mem.set(src_address + i, MemoryValue::from(inputs[i])); + } + + MemoryAddress dst_address = 4; + + poseidon2.permutation(mem, src_address, dst_address); + + std::array expected = { + FF("0x2bf1eaf87f7d27e8dc4056e9af975985bccc89077a21891d6c7b6ccce0631f95"), + FF("0x0c01fa1b8d0748becafbe452c0cb0231c38224ea824554c9362518eebdd5701f"), + FF("0x018555a8eb50cf07f64b019ebaf3af3c925c93e631f3ecd455db07bbb52bbdd3"), + FF("0x0cbea457c91c22c6c31fd89afd2541efc2edf31736b9f721e823b2165c90fd41"), + }; + + // Read the memory at the destination address and check if it matches the expected output + for (uint32_t i = 0; i < expected.size(); ++i) { + EXPECT_EQ(mem.get(dst_address + i).as_ff(), expected[i]); + } +} + +TEST_F(Poseidon2SimulationTest, PermutationWithMemoryAddressOutOfRange) +{ + MemoryStore mem; + MemoryAddress src_address = AVM_HIGHEST_MEM_ADDRESS; // This will cause an out of range error + MemoryAddress dst_address = 0; + + EXPECT_THROW(poseidon2.permutation(mem, src_address, dst_address), std::runtime_error); +} + +TEST_F(Poseidon2SimulationTest, PermutationWithMemoryInvalidMemTag) +{ + MemoryStore mem; + MemoryAddress src_address = 0; + MemoryAddress dst_address = 4; + + // Inputs taken From barretenberg/crypto/poseidon2/poseidon2.test.cpp + std::array inputs = { + MemoryValue::from(FF("9a807b615c4d3e2fa0b1c2d3e4f56789fedcba9876543210abcdef0123456789")), + MemoryValue::from(FF("9a807b615c4d3e2fa0b1c2d3e4f56789fedcba9876543210abcdef0123456789")), + MemoryValue::from(123456789), // Invalid tag + MemoryValue::from(FF("0x9a807b615c4d3e2fa0b1c2d3e4f56789fedcba9876543210abcdef0123456789")) + }; + + // Fill the memory with 4 elements + for (uint32_t i = 0; i < inputs.size(); ++i) { + mem.set(src_address + i, inputs[i]); + } + + EXPECT_THROW(poseidon2.permutation(mem, src_address, dst_address), Poseidon2Exception); +} + } // namespace } // namespace bb::avm2::simulation diff --git a/barretenberg/cpp/src/barretenberg/vm2/simulation/testing/fakes/fake_gt.cpp b/barretenberg/cpp/src/barretenberg/vm2/simulation/testing/fakes/fake_gt.cpp new file mode 100644 index 000000000000..d3488590c3a3 --- /dev/null +++ b/barretenberg/cpp/src/barretenberg/vm2/simulation/testing/fakes/fake_gt.cpp @@ -0,0 +1,26 @@ +#include "barretenberg/vm2/simulation/testing/fakes/fake_gt.hpp" + +#include "barretenberg/numeric/uint128/uint128.hpp" +#include "barretenberg/numeric/uint256/uint256.hpp" +#include "barretenberg/vm2/common/field.hpp" +#include "barretenberg/vm2/common/tagged_value.hpp" + +namespace bb::avm2::simulation { + +bool FakeGreaterThan::gt(const FF& a, const FF& b) +{ + return static_cast(a) > static_cast(b); +} + +bool FakeGreaterThan::gt(const uint128_t& a, const uint128_t& b) +{ + return a > b; +} + +bool FakeGreaterThan::gt(const MemoryValue& a, const MemoryValue& b) +{ + // < and <= implemented on MemoryValue + return b <= a; +} + +} // namespace bb::avm2::simulation diff --git a/barretenberg/cpp/src/barretenberg/vm2/simulation/testing/fakes/fake_gt.hpp b/barretenberg/cpp/src/barretenberg/vm2/simulation/testing/fakes/fake_gt.hpp new file mode 100644 index 000000000000..0196637cf174 --- /dev/null +++ b/barretenberg/cpp/src/barretenberg/vm2/simulation/testing/fakes/fake_gt.hpp @@ -0,0 +1,21 @@ +#pragma once + +#include "barretenberg/vm2/simulation/gt.hpp" + +#include "barretenberg/numeric/uint128/uint128.hpp" +#include "barretenberg/vm2/common/field.hpp" +#include "barretenberg/vm2/common/tagged_value.hpp" + +namespace bb::avm2::simulation { + +class FakeGreaterThan : public GreaterThanInterface { + public: + FakeGreaterThan() = default; + ~FakeGreaterThan() override = default; + + bool gt(const FF& a, const FF& b) override; + bool gt(const uint128_t& a, const uint128_t& b) override; + bool gt(const MemoryValue& a, const MemoryValue& b) override; +}; + +} // namespace bb::avm2::simulation diff --git a/barretenberg/cpp/src/barretenberg/vm2/simulation/testing/fakes/fake_poseidon2.cpp b/barretenberg/cpp/src/barretenberg/vm2/simulation/testing/fakes/fake_poseidon2.cpp new file mode 100644 index 000000000000..ea8237c734f1 --- /dev/null +++ b/barretenberg/cpp/src/barretenberg/vm2/simulation/testing/fakes/fake_poseidon2.cpp @@ -0,0 +1,20 @@ +#include "barretenberg/vm2/simulation/testing/fakes/fake_poseidon2.hpp" + +#include "barretenberg//crypto/poseidon2/poseidon2.hpp" + +namespace bb::avm2::simulation { + +using Poseidon2Hash = crypto::Poseidon2; +using Poseidon2Perm = crypto::Poseidon2Permutation; + +std::array FakePoseidon2::permutation(const std::array& input) +{ + return Poseidon2Perm::permutation(input); +} + +FF FakePoseidon2::hash(const std::vector& input) +{ + return Poseidon2Hash::hash(input); +} + +} // namespace bb::avm2::simulation diff --git a/barretenberg/cpp/src/barretenberg/vm2/simulation/testing/fakes/fake_poseidon2.hpp b/barretenberg/cpp/src/barretenberg/vm2/simulation/testing/fakes/fake_poseidon2.hpp new file mode 100644 index 000000000000..74fb66bca244 --- /dev/null +++ b/barretenberg/cpp/src/barretenberg/vm2/simulation/testing/fakes/fake_poseidon2.hpp @@ -0,0 +1,24 @@ +#pragma once + +#include + +#include "barretenberg/vm2/simulation/poseidon2.hpp" + +namespace bb::avm2::simulation { + +class FakePoseidon2 : public Poseidon2Interface { + public: + FakePoseidon2() = default; + ~FakePoseidon2() override = default; + + FF hash(const std::vector& input) override; + std::array permutation(const std::array& input) override; + void permutation([[maybe_unused]] MemoryInterface& memory, + [[maybe_unused]] MemoryAddress src_address, + [[maybe_unused]] MemoryAddress dst_address) override + { + throw std::runtime_error("FakePoseidon2 memory aware permutation unimplemented"); + } +}; + +} // namespace bb::avm2::simulation diff --git a/barretenberg/cpp/src/barretenberg/vm2/simulation/testing/mock_poseidon2.hpp b/barretenberg/cpp/src/barretenberg/vm2/simulation/testing/mock_poseidon2.hpp index ee6e5ba9d769..4eb8bffcd861 100644 --- a/barretenberg/cpp/src/barretenberg/vm2/simulation/testing/mock_poseidon2.hpp +++ b/barretenberg/cpp/src/barretenberg/vm2/simulation/testing/mock_poseidon2.hpp @@ -14,6 +14,10 @@ class MockPoseidon2 : public Poseidon2Interface { MOCK_METHOD(FF, hash, (const std::vector& input), (override)); MOCK_METHOD((std::array), permutation, ((const std::array)&input), (override)); + MOCK_METHOD(void, + permutation, + (MemoryInterface & memory, MemoryAddress src_address, MemoryAddress dst_address), + (override)); }; } // namespace bb::avm2::simulation diff --git a/barretenberg/cpp/src/barretenberg/vm2/simulation_helper.cpp b/barretenberg/cpp/src/barretenberg/vm2/simulation_helper.cpp index 5484336cd9c3..5692c4044c7e 100644 --- a/barretenberg/cpp/src/barretenberg/vm2/simulation_helper.cpp +++ b/barretenberg/cpp/src/barretenberg/vm2/simulation_helper.cpp @@ -97,6 +97,7 @@ template EventsContainer AvmSimulationHelper::simulate_with_setting typename S::template DefaultEventEmitter scalar_mul_emitter; typename S::template DefaultEventEmitter poseidon2_hash_emitter; typename S::template DefaultEventEmitter poseidon2_perm_emitter; + typename S::template DefaultEventEmitter poseidon2_perm_mem_emitter; typename S::template DefaultEventEmitter keccakf1600_emitter; typename S::template DefaultEventEmitter to_radix_emitter; typename S::template DefaultEventEmitter field_gt_emitter; @@ -118,13 +119,14 @@ template EventsContainer AvmSimulationHelper::simulate_with_setting typename S::template DefaultEventEmitter l1_to_l2_msg_tree_check_emitter; ExecutionIdManager execution_id_manager(1); - Poseidon2 poseidon2(poseidon2_hash_emitter, poseidon2_perm_emitter); ToRadix to_radix(to_radix_emitter); Ecc ecc(to_radix, ecc_add_emitter, scalar_mul_emitter); - MerkleCheck merkle_check(poseidon2, merkle_check_emitter); RangeCheck range_check(range_check_emitter); FieldGreaterThan field_gt(range_check, field_gt_emitter); GreaterThan greater_than(field_gt, range_check, greater_than_emitter); + Poseidon2 poseidon2( + execution_id_manager, greater_than, poseidon2_hash_emitter, poseidon2_perm_emitter, poseidon2_perm_mem_emitter); + MerkleCheck merkle_check(poseidon2, merkle_check_emitter); PublicDataTreeCheck public_data_tree_check( poseidon2, merkle_check, field_gt, execution_id_manager, public_data_tree_check_emitter); WrittenPublicDataSlotsTreeCheck written_public_data_slots_tree_check(poseidon2, @@ -196,6 +198,7 @@ template EventsContainer AvmSimulationHelper::simulate_with_setting Execution execution(alu, bitwise, data_copy, + poseidon2, execution_components, context_provider, instruction_info_db, @@ -228,6 +231,7 @@ template EventsContainer AvmSimulationHelper::simulate_with_setting scalar_mul_emitter.dump_events(), poseidon2_hash_emitter.dump_events(), poseidon2_perm_emitter.dump_events(), + poseidon2_perm_mem_emitter.dump_events(), keccakf1600_emitter.dump_events(), to_radix_emitter.dump_events(), field_gt_emitter.dump_events(), diff --git a/barretenberg/cpp/src/barretenberg/vm2/tracegen/lib/instruction_spec.cpp b/barretenberg/cpp/src/barretenberg/vm2/tracegen/lib/instruction_spec.cpp index 32f5043ea861..7f868f7f9857 100644 --- a/barretenberg/cpp/src/barretenberg/vm2/tracegen/lib/instruction_spec.cpp +++ b/barretenberg/cpp/src/barretenberg/vm2/tracegen/lib/instruction_spec.cpp @@ -78,8 +78,9 @@ const std::unordered_map SUBTRACE_INFO_MAP = { { .subtrace_selector = SubtraceSel::EXECUTION, .subtrace_operation_id = AVM_EXEC_OP_ID_RETURNDATASIZE } }, { ExecutionOpCode::DEBUGLOG, { .subtrace_selector = SubtraceSel::EXECUTION, .subtrace_operation_id = AVM_EXEC_OP_ID_DEBUGLOG } }, - // KeccakF1600 + // Hashes { ExecutionOpCode::KECCAKF1600, { .subtrace_selector = SubtraceSel::KECCAKF1600, .subtrace_operation_id = 0 } }, + { ExecutionOpCode::POSEIDON2PERM, { .subtrace_selector = SubtraceSel::POSEIDON2PERM, .subtrace_operation_id = 0 } }, // Tree operations { ExecutionOpCode::SLOAD, { .subtrace_selector = SubtraceSel::EXECUTION, .subtrace_operation_id = AVM_EXEC_OP_ID_SLOAD } }, diff --git a/barretenberg/cpp/src/barretenberg/vm2/tracegen/nullifier_tree_check_trace.test.cpp b/barretenberg/cpp/src/barretenberg/vm2/tracegen/nullifier_tree_check_trace.test.cpp index 028f441bfe43..2e66930db6d2 100644 --- a/barretenberg/cpp/src/barretenberg/vm2/tracegen/nullifier_tree_check_trace.test.cpp +++ b/barretenberg/cpp/src/barretenberg/vm2/tracegen/nullifier_tree_check_trace.test.cpp @@ -18,6 +18,7 @@ #include "barretenberg/vm2/simulation/lib/merkle.hpp" #include "barretenberg/vm2/simulation/nullifier_tree_check.hpp" #include "barretenberg/vm2/simulation/poseidon2.hpp" +#include "barretenberg/vm2/simulation/testing/mock_gt.hpp" #include "barretenberg/vm2/simulation/testing/mock_range_check.hpp" #include "barretenberg/vm2/testing/fixtures.hpp" #include "barretenberg/vm2/testing/macros.hpp" @@ -32,23 +33,26 @@ namespace bb::avm2::tracegen { namespace { using ::testing::NiceMock; -using ::testing::TestWithParam; using testing::TestMemoryTree; using simulation::EventEmitter; +using simulation::ExecutionIdManager; using simulation::FieldGreaterThan; using simulation::FieldGreaterThanEvent; using simulation::MerkleCheck; using simulation::MerkleCheckEvent; +using simulation::MockGreaterThan; using simulation::MockRangeCheck; -using simulation::NoopEventEmitter; using simulation::NullifierTreeCheck; using simulation::NullifierTreeCheckEvent; using simulation::NullifierTreeLeafPreimage; using simulation::Poseidon2; using simulation::Poseidon2HashEvent; using simulation::Poseidon2PermutationEvent; +using simulation::Poseidon2PermutationMemoryEvent; +using simulation::RangeCheck; +using simulation::RangeCheckEvent; using simulation::unconstrained_root_from_path; using constraining::check_interaction; @@ -58,6 +62,21 @@ using C = Column; using RawPoseidon2 = crypto::Poseidon2; using NullifierLeafValue = crypto::merkle_tree::NullifierLeafValue; +class NullifierTreeCheckTracegenTest : public ::testing::Test { + protected: + NullifierTreeCheckTracegenTest() + : execution_id_manager(0){}; + + EventEmitter hash_event_emitter; + EventEmitter perm_event_emitter; + EventEmitter perm_mem_event_emitter; + + ExecutionIdManager execution_id_manager; + NiceMock mock_gt; + Poseidon2 poseidon2 = + Poseidon2(execution_id_manager, mock_gt, hash_event_emitter, perm_event_emitter, perm_mem_event_emitter); +}; + struct TestParams { FF nullifier; bool exists; @@ -77,16 +96,13 @@ std::vector positive_read_tests = { .nullifier = 42, .exists = false, .low_leaf = NullifierTreeLeafPreimage(NullifierLeafValue(10), 28, 50) } }; -class NullifierReadInteractionsTests : public TestWithParam {}; +class NullifierReadInteractionsTests : public NullifierTreeCheckTracegenTest, + public ::testing::WithParamInterface {}; TEST_P(NullifierReadInteractionsTests, PositiveWithInteractions) { const auto& param = GetParam(); - EventEmitter hash_event_emitter; - NoopEventEmitter perm_event_emitter; - Poseidon2 poseidon2(hash_event_emitter, perm_event_emitter); - EventEmitter merkle_event_emitter; MerkleCheck merkle_check(poseidon2, merkle_event_emitter); @@ -142,12 +158,8 @@ INSTANTIATE_TEST_SUITE_P(NullifierTreeCheckTracegenTest, NullifierReadInteractionsTests, ::testing::ValuesIn(positive_read_tests)); -TEST(NullifierTreeCheckTracegenTest, WriteWithInteractions) +TEST_F(NullifierTreeCheckTracegenTest, WriteWithInteractions) { - EventEmitter hash_event_emitter; - NoopEventEmitter perm_event_emitter; - Poseidon2 poseidon2(hash_event_emitter, perm_event_emitter); - EventEmitter merkle_event_emitter; MerkleCheck merkle_check(poseidon2, merkle_event_emitter); diff --git a/barretenberg/cpp/src/barretenberg/vm2/tracegen/poseidon2_trace.cpp b/barretenberg/cpp/src/barretenberg/vm2/tracegen/poseidon2_trace.cpp index f3d5c6397435..a98e70ec13d8 100644 --- a/barretenberg/cpp/src/barretenberg/vm2/tracegen/poseidon2_trace.cpp +++ b/barretenberg/cpp/src/barretenberg/vm2/tracegen/poseidon2_trace.cpp @@ -5,7 +5,10 @@ #include "barretenberg/crypto/poseidon2/poseidon2_permutation.hpp" #include "barretenberg/ecc/fields/field_declarations.hpp" +#include "barretenberg/vm2/common/aztec_constants.hpp" #include "barretenberg/vm2/generated/relations/lookups_poseidon2_hash.hpp" +#include "barretenberg/vm2/generated/relations/lookups_poseidon2_mem.hpp" +#include "barretenberg/vm2/generated/relations/perms_poseidon2_mem.hpp" #include "barretenberg/vm2/simulation/events/event_emitter.hpp" #include "barretenberg/vm2/simulation/events/poseidon2_event.hpp" #include "barretenberg/vm2/tracegen/lib/interaction_def.hpp" @@ -428,7 +431,105 @@ void Poseidon2TraceBuilder::process_permutation( } } +void Poseidon2TraceBuilder::process_permutation_with_memory( + const simulation::EventEmitterInterface::Container& perm_mem_events, + TraceContainer& trace) +{ + using C = Column; + uint32_t row = 0; + + for (const auto& event : perm_mem_events) { + // Addresses cast to uint64_t to capture overflows + uint64_t src_addr = static_cast(event.src_address); + uint64_t dst_addr = static_cast(event.dst_address); + // Error Handling, check that the addresses are within the valid range + // The max read address is src_addr + 3 since 4 input elements are read + // The max write address is dst_addr + 3 since 4 output elements are written + bool src_out_of_range_err = src_addr + 3 > AVM_HIGHEST_MEM_ADDRESS; + bool dst_out_of_range_err = dst_addr + 3 > AVM_HIGHEST_MEM_ADDRESS; + bool should_read_mem = !(src_out_of_range_err || dst_out_of_range_err); + + // Error Handling, check that the input tags are valid + bool invalid_tag = + std::ranges::any_of(event.input, [](const auto& input) { return input.get_tag() != MemoryTag::FF; }); + uint32_t target_tag = static_cast(MemoryTag::FF); + uint32_t batched_tag_check = 0; + // Performs the batched tag check described in the circuit. + // see https://hackmd.io/moq6viBpRJeLpWrHAogCZw#Batching-comparison-of-n-bit-numbers + for (uint32_t i = 0; i < event.input.size(); i++) { + uint32_t exponent = 3 * i; + uint32_t current_tag = static_cast(event.input[i].get_tag()); + batched_tag_check += (current_tag - target_tag) * (1 << exponent); + } + FF batch_tag_inv = invalid_tag ? FF(batched_tag_check).invert() : 0; + + bool err = src_out_of_range_err || dst_out_of_range_err || invalid_tag; + + trace.set(row, + { { + { C::poseidon2_perm_mem_sel, 1 }, + { C::poseidon2_perm_mem_execution_clk, event.execution_clk }, + { C::poseidon2_perm_mem_space_id, event.space_id }, + { C::poseidon2_perm_mem_max_mem_addr, AVM_HIGHEST_MEM_ADDRESS }, + // Error Handling + { C::poseidon2_perm_mem_sel_src_out_of_range_err, src_out_of_range_err ? 1 : 0 }, + { C::poseidon2_perm_mem_sel_dst_out_of_range_err, dst_out_of_range_err ? 1 : 0 }, + { C::poseidon2_perm_mem_sel_invalid_tag_err, invalid_tag ? 1 : 0 }, + { C::poseidon2_perm_mem_batch_tag_inv, batch_tag_inv }, + { C::poseidon2_perm_mem_err, err ? 1 : 0 }, + // Mem Ops + { C::poseidon2_perm_mem_sel_should_read_mem, should_read_mem ? 1 : 0 }, + // Read Addresses + { C::poseidon2_perm_mem_read_address_0_, src_addr }, + { C::poseidon2_perm_mem_read_address_1_, src_addr + 1 }, + { C::poseidon2_perm_mem_read_address_2_, src_addr + 2 }, + { C::poseidon2_perm_mem_read_address_3_, src_addr + 3 }, + // Write Addresses + { C::poseidon2_perm_mem_write_address_0_, dst_addr }, + { C::poseidon2_perm_mem_write_address_1_, dst_addr + 1 }, + { C::poseidon2_perm_mem_write_address_2_, dst_addr + 2 }, + { C::poseidon2_perm_mem_write_address_3_, dst_addr + 3 }, + // Inputs + { C::poseidon2_perm_mem_input_0_, event.input[0].as_ff() }, + { C::poseidon2_perm_mem_input_1_, event.input[1].as_ff() }, + { C::poseidon2_perm_mem_input_2_, event.input[2].as_ff() }, + { C::poseidon2_perm_mem_input_3_, event.input[3].as_ff() }, + // Input Tags + { C::poseidon2_perm_mem_input_tag_0_, static_cast(event.input[0].get_tag()) }, + { C::poseidon2_perm_mem_input_tag_1_, static_cast(event.input[1].get_tag()) }, + { C::poseidon2_perm_mem_input_tag_2_, static_cast(event.input[2].get_tag()) }, + { C::poseidon2_perm_mem_input_tag_3_, static_cast(event.input[3].get_tag()) }, + // Outputs + { C::poseidon2_perm_mem_sel_should_exec, !err ? 1 : 0 }, + { C::poseidon2_perm_mem_output_0_, event.output[0] }, + { C::poseidon2_perm_mem_output_1_, event.output[1] }, + { C::poseidon2_perm_mem_output_2_, event.output[2] }, + { C::poseidon2_perm_mem_output_3_, event.output[3] }, + } }); + row++; + } +} + const InteractionDefinition Poseidon2TraceBuilder::interactions = - InteractionDefinition().add(); + InteractionDefinition() + .add() + // These should be permutations (Read to Mem) + .add() + .add() + .add() + .add() + // These should be permutations (Write to Mem) + .add() + .add() + .add() + .add() + // Poseidon2 Memory to Permutation Subtrace + .add() + // Lookups to Greater Than Subtrace + .add() + .add() + // Dispatch from Execution Trace + .add(); +// } // namespace bb::avm2::tracegen diff --git a/barretenberg/cpp/src/barretenberg/vm2/tracegen/poseidon2_trace.hpp b/barretenberg/cpp/src/barretenberg/vm2/tracegen/poseidon2_trace.hpp index 1de55309287f..89c5941e99fb 100644 --- a/barretenberg/cpp/src/barretenberg/vm2/tracegen/poseidon2_trace.hpp +++ b/barretenberg/cpp/src/barretenberg/vm2/tracegen/poseidon2_trace.hpp @@ -18,6 +18,10 @@ class Poseidon2TraceBuilder final { const simulation::EventEmitterInterface::Container& perm_events, TraceContainer& trace); + void process_permutation_with_memory(const simulation::EventEmitterInterface< + simulation::Poseidon2PermutationMemoryEvent>::Container& perm_mem_events, + TraceContainer& trace); + static const InteractionDefinition interactions; }; diff --git a/barretenberg/cpp/src/barretenberg/vm2/tracegen/public_data_tree_trace.test.cpp b/barretenberg/cpp/src/barretenberg/vm2/tracegen/public_data_tree_trace.test.cpp index aa9eb7019ced..f054619086a0 100644 --- a/barretenberg/cpp/src/barretenberg/vm2/tracegen/public_data_tree_trace.test.cpp +++ b/barretenberg/cpp/src/barretenberg/vm2/tracegen/public_data_tree_trace.test.cpp @@ -19,7 +19,7 @@ #include "barretenberg/vm2/simulation/lib/merkle.hpp" #include "barretenberg/vm2/simulation/poseidon2.hpp" #include "barretenberg/vm2/simulation/public_data_tree_check.hpp" -#include "barretenberg/vm2/simulation/testing/mock_range_check.hpp" +#include "barretenberg/vm2/simulation/testing/mock_gt.hpp" #include "barretenberg/vm2/testing/fixtures.hpp" #include "barretenberg/vm2/testing/macros.hpp" #include "barretenberg/vm2/testing/public_inputs_builder.hpp" @@ -36,8 +36,7 @@ namespace bb::avm2::tracegen { namespace { -using ::testing::TestWithParam; - +using ::testing::NiceMock; using testing::TestMemoryTree; using simulation::EventEmitter; @@ -46,10 +45,11 @@ using simulation::FieldGreaterThan; using simulation::FieldGreaterThanEvent; using simulation::MerkleCheck; using simulation::MerkleCheckEvent; -using simulation::NoopEventEmitter; +using simulation::MockGreaterThan; using simulation::Poseidon2; using simulation::Poseidon2HashEvent; using simulation::Poseidon2PermutationEvent; +using simulation::Poseidon2PermutationMemoryEvent; using simulation::PublicDataTreeCheck; using simulation::PublicDataTreeCheckEvent; using simulation::PublicDataTreeLeafPreimage; @@ -76,6 +76,21 @@ using lookup_new_leaf_merkle_check = lookup_public_data_check_new_leaf_merkle_ch AztecAddress contract_address = 1; +class PublicDataTreeCheckTracegenTest : public ::testing::Test { + protected: + PublicDataTreeCheckTracegenTest() + : execution_id_manager(0){}; + + EventEmitter hash_event_emitter; + EventEmitter perm_event_emitter; + EventEmitter perm_mem_event_emitter; + + ExecutionIdManager execution_id_manager; + NiceMock mock_gt; + Poseidon2 poseidon2 = + Poseidon2(execution_id_manager, mock_gt, hash_event_emitter, perm_event_emitter, perm_mem_event_emitter); +}; + struct TestParams { FF slot; FF value; @@ -101,7 +116,8 @@ std::vector read_positive_tests = { .slot = 42, .value = 0, .low_leaf = PublicDataTreeLeafPreimage(PublicDataLeafValue(10, 0), 28, FF::neg_one()) } }; -class PublicDataReadInteractionsTests : public TestWithParam {}; +class PublicDataReadInteractionsTests : public PublicDataTreeCheckTracegenTest, + public ::testing::WithParamInterface {}; TEST_P(PublicDataReadInteractionsTests, PositiveWithInteractions) { @@ -109,12 +125,6 @@ TEST_P(PublicDataReadInteractionsTests, PositiveWithInteractions) auto test_public_inputs = testing::PublicInputsBuilder().build(); - ExecutionIdManager execution_id_manager(0); - - EventEmitter hash_event_emitter; - NoopEventEmitter perm_event_emitter; - Poseidon2 poseidon2(hash_event_emitter, perm_event_emitter); - EventEmitter merkle_event_emitter; MerkleCheck merkle_check(poseidon2, merkle_event_emitter); @@ -173,7 +183,7 @@ INSTANTIATE_TEST_SUITE_P(PublicDataTreeCheckTracegenTest, PublicDataReadInteractionsTests, ::testing::ValuesIn(read_positive_tests)); -TEST(PublicDataTreeCheckTracegenTest, WriteExistsWithInteractions) +TEST_F(PublicDataTreeCheckTracegenTest, WriteExistsWithInteractions) { FF slot = 40; FF leaf_slot = unconstrained_compute_leaf_slot(contract_address, slot); @@ -190,11 +200,6 @@ TEST(PublicDataTreeCheckTracegenTest, WriteExistsWithInteractions) .set_accumulated_data(accumulated_data) .set_accumulated_data_array_lengths({ .publicDataWrites = 1 }) .build(); - ExecutionIdManager execution_id_manager(0); - - EventEmitter hash_event_emitter; - NoopEventEmitter perm_event_emitter; - Poseidon2 poseidon2(hash_event_emitter, perm_event_emitter); EventEmitter merkle_event_emitter; MerkleCheck merkle_check(poseidon2, merkle_event_emitter); @@ -263,7 +268,7 @@ TEST(PublicDataTreeCheckTracegenTest, WriteExistsWithInteractions) constraining::check_all_interactions(trace); } -TEST(PublicDataTreeCheckTracegenTest, WriteAndUpdateWithInteractions) +TEST_F(PublicDataTreeCheckTracegenTest, WriteAndUpdateWithInteractions) { FF slot = 42; FF leaf_slot = unconstrained_compute_leaf_slot(contract_address, slot); @@ -283,12 +288,6 @@ TEST(PublicDataTreeCheckTracegenTest, WriteAndUpdateWithInteractions) .set_accumulated_data_array_lengths({ .publicDataWrites = 1 }) .build(); - ExecutionIdManager execution_id_manager(0); - - EventEmitter hash_event_emitter; - NoopEventEmitter perm_event_emitter; - Poseidon2 poseidon2(hash_event_emitter, perm_event_emitter); - EventEmitter merkle_event_emitter; MerkleCheck merkle_check(poseidon2, merkle_event_emitter); diff --git a/barretenberg/cpp/src/barretenberg/vm2/tracegen/update_check_trace.test.cpp b/barretenberg/cpp/src/barretenberg/vm2/tracegen/update_check_trace.test.cpp index 4092ed8ffb69..e2c210f13d9e 100644 --- a/barretenberg/cpp/src/barretenberg/vm2/tracegen/update_check_trace.test.cpp +++ b/barretenberg/cpp/src/barretenberg/vm2/tracegen/update_check_trace.test.cpp @@ -11,11 +11,13 @@ #include "barretenberg/vm2/generated/relations/lookups_update_check.hpp" #include "barretenberg/vm2/simulation/concrete_dbs.hpp" #include "barretenberg/vm2/simulation/events/event_emitter.hpp" +#include "barretenberg/vm2/simulation/events/poseidon2_event.hpp" #include "barretenberg/vm2/simulation/events/public_data_tree_check_event.hpp" #include "barretenberg/vm2/simulation/field_gt.hpp" #include "barretenberg/vm2/simulation/lib/contract_crypto.hpp" #include "barretenberg/vm2/simulation/testing/mock_dbs.hpp" #include "barretenberg/vm2/simulation/testing/mock_field_gt.hpp" +#include "barretenberg/vm2/simulation/testing/mock_gt.hpp" #include "barretenberg/vm2/simulation/testing/mock_l1_to_l2_message_tree_check.hpp" #include "barretenberg/vm2/simulation/testing/mock_merkle_check.hpp" #include "barretenberg/vm2/simulation/testing/mock_note_hash_tree_check.hpp" @@ -44,8 +46,11 @@ using ::testing::ReturnRef; using simulation::compute_contract_address; using simulation::EventEmitter; using simulation::ExecutionIdManager; +using simulation::FieldGreaterThan; +using simulation::FieldGreaterThanEvent; using simulation::MerkleDB; using simulation::MockFieldGreaterThan; +using simulation::MockGreaterThan; using simulation::MockL1ToL2MessageTreeCheck; using simulation::MockLowLevelMerkleDB; using simulation::MockMerkleCheck; @@ -56,6 +61,7 @@ using simulation::NoopEventEmitter; using simulation::Poseidon2; using simulation::Poseidon2HashEvent; using simulation::Poseidon2PermutationEvent; +using simulation::Poseidon2PermutationMemoryEvent; using simulation::PublicDataTreeCheck; using simulation::PublicDataTreeCheckEvent; using simulation::PublicDataTreeLeafPreimage; @@ -88,7 +94,8 @@ TEST(UpdateCheckTracegenTest, HashZeroInteractions) EventEmitter hash_event_emitter; NoopEventEmitter perm_event_emitter; - Poseidon2 poseidon2(hash_event_emitter, perm_event_emitter); + NoopEventEmitter perm_mem_event_emitter; + NoopEventEmitter field_gt_event_emitter; EventEmitter range_check_event_emitter; RangeCheck range_check(range_check_event_emitter); @@ -100,6 +107,8 @@ TEST(UpdateCheckTracegenTest, HashZeroInteractions) NiceMock mock_written_public_data_slots_tree_check; NiceMock mock_l1_to_l2_message_tree_check; + NiceMock mock_gt; + Poseidon2 poseidon2(execution_id_manager, mock_gt, hash_event_emitter, perm_event_emitter, perm_mem_event_emitter); EventEmitter public_data_tree_check_event_emitter; PublicDataTreeCheck public_data_tree_check( poseidon2, mock_merkle_check, mock_field_gt, execution_id_manager, public_data_tree_check_event_emitter); @@ -172,7 +181,8 @@ TEST(UpdateCheckTracegenTest, HashNonzeroInteractions) EventEmitter hash_event_emitter; NoopEventEmitter perm_event_emitter; - Poseidon2 poseidon2(hash_event_emitter, perm_event_emitter); + NoopEventEmitter perm_mem_event_emitter; + NoopEventEmitter field_gt_event_emitter; EventEmitter range_check_event_emitter; RangeCheck range_check(range_check_event_emitter); @@ -183,6 +193,9 @@ TEST(UpdateCheckTracegenTest, HashNonzeroInteractions) NiceMock mock_note_hash_tree_check; NiceMock mock_written_public_data_slots_tree_check; NiceMock mock_l1_to_l2_message_tree_check; + NiceMock mock_gt; + + Poseidon2 poseidon2(execution_id_manager, mock_gt, hash_event_emitter, perm_event_emitter, perm_mem_event_emitter); EventEmitter public_data_tree_check_event_emitter; PublicDataTreeCheck public_data_tree_check( diff --git a/barretenberg/cpp/src/barretenberg/vm2/tracegen_helper.cpp b/barretenberg/cpp/src/barretenberg/vm2/tracegen_helper.cpp index b35bf76fb45e..8d43d58d6706 100644 --- a/barretenberg/cpp/src/barretenberg/vm2/tracegen_helper.cpp +++ b/barretenberg/cpp/src/barretenberg/vm2/tracegen_helper.cpp @@ -299,6 +299,13 @@ void AvmTraceGenHelper::fill_trace_columns(TraceContainer& trace, poseidon2_builder.process_permutation(events.poseidon2_permutation, trace)); clear_events(events.poseidon2_permutation); }, + [&]() { + Poseidon2TraceBuilder poseidon2_builder; + AVM_TRACK_TIME( + "tracegen/poseidon2_permutation_with_memory", + poseidon2_builder.process_permutation_with_memory(events.poseidon2_permutation_mem, trace)); + clear_events(events.poseidon2_permutation_mem); + }, [&]() { ToRadixTraceBuilder to_radix_builder; AVM_TRACK_TIME("tracegen/to_radix", to_radix_builder.process(events.to_radix, trace));