From b9ec79b79424ee424a199170178c90af02331d9e Mon Sep 17 00:00:00 2001 From: fcarreiro Date: Wed, 5 Feb 2025 20:18:20 +0000 Subject: [PATCH] sequential --- barretenberg/cpp/pil/vm2/alu.pil | 3 + barretenberg/cpp/pil/vm2/execution.pil | 11 +- .../barretenberg/vm2/generated/columns.hpp | 8 +- .../src/barretenberg/vm2/generated/flavor.hpp | 6 +- .../generated/relations/lookups_execution.hpp | 114 +++++++++--------- .../barretenberg/vm2/tracegen/alu_trace.cpp | 1 + .../vm2/tracegen/execution_trace.cpp | 15 +++ .../vm2/tracegen/lib/lookup_builder.hpp | 57 ++++++++- .../src/barretenberg/vm2/tracegen_helper.cpp | 2 +- 9 files changed, 147 insertions(+), 70 deletions(-) diff --git a/barretenberg/cpp/pil/vm2/alu.pil b/barretenberg/cpp/pil/vm2/alu.pil index 287ee0c9563..a18614267d1 100644 --- a/barretenberg/cpp/pil/vm2/alu.pil +++ b/barretenberg/cpp/pil/vm2/alu.pil @@ -1,5 +1,8 @@ namespace alu; +// Trace selector. +pol commit sel; + pol commit sel_op_add; pol commit ia; pol commit ib; diff --git a/barretenberg/cpp/pil/vm2/execution.pil b/barretenberg/cpp/pil/vm2/execution.pil index 62294de8ecc..1d22728d465 100644 --- a/barretenberg/cpp/pil/vm2/execution.pil +++ b/barretenberg/cpp/pil/vm2/execution.pil @@ -29,6 +29,9 @@ pol commit last; sel * (1 - sel) = 0; last * (1 - last) = 0; +// Opcode selectors +pol commit sel_alu; + // If the current row is an execution row, then either // the next row is an execution row, or the current row is marked as the last row. // sel => (sel' v last) = 1 iff @@ -46,12 +49,16 @@ sel * (1 - sel') * (1 - last) = 0; #[LAST_IS_LAST] last * sel' = 0; +// This is just an example of a sequential dynamic lookup. +// TODO: This might actually be a permutation, it depends. +// FIXME: This does not have all it needs. +#[LOOKUP_EXEC_ALU] +sel_alu {op1, op2, op3} in alu.sel {alu.ia_addr, alu.ib_addr, alu.dst_addr}; + // These are needed to have a non-empty set of columns for each type. pol public input; #[LOOKUP_DUMMY_PRECOMPUTED] sel {/*will be 1=OR*/ sel, clk, clk, clk} in precomputed.sel_bitwise {precomputed.bitwise_op_id, precomputed.bitwise_input_a, precomputed.bitwise_input_b, precomputed.bitwise_output}; -#[LOOKUP_DUMMY_DYNAMIC] // Just a self-lookup for now, for testing. -sel {op1, op2, op3, op4} in sel {op1, op2, op3, op4}; #[PERM_DUMMY_DYNAMIC] // Just a self-permutation for now, for testing. sel {op1, op2, op3, op4} is sel {op1, op2, op3, op4}; diff --git a/barretenberg/cpp/src/barretenberg/vm2/generated/columns.hpp b/barretenberg/cpp/src/barretenberg/vm2/generated/columns.hpp index 29cd8798aaa..78df83a1c54 100644 --- a/barretenberg/cpp/src/barretenberg/vm2/generated/columns.hpp +++ b/barretenberg/cpp/src/barretenberg/vm2/generated/columns.hpp @@ -10,8 +10,8 @@ namespace bb::avm2 { // The entities that will be used in the flavor. // clang-format off #define AVM2_PRECOMPUTED_ENTITIES precomputed_as_unary, precomputed_bitwise_input_a, precomputed_bitwise_input_b, precomputed_bitwise_op_id, precomputed_bitwise_output, precomputed_clk, precomputed_first_row, precomputed_integral_tag_length, precomputed_power_of_2, precomputed_sel_bitwise, precomputed_sel_integral_tag, precomputed_sel_range_16, precomputed_sel_range_8, precomputed_sel_sha256_compression, precomputed_sel_unary, precomputed_sha256_compression_round_constant -#define AVM2_WIRE_ENTITIES execution_input, alu_dst_addr, alu_ia, alu_ia_addr, alu_ib, alu_ib_addr, alu_ic, alu_op, alu_sel_op_add, bc_decomposition_bytes, bc_decomposition_bytes_pc_plus_1, bc_decomposition_bytes_pc_plus_10, bc_decomposition_bytes_pc_plus_11, bc_decomposition_bytes_pc_plus_12, bc_decomposition_bytes_pc_plus_13, bc_decomposition_bytes_pc_plus_14, bc_decomposition_bytes_pc_plus_15, bc_decomposition_bytes_pc_plus_16, bc_decomposition_bytes_pc_plus_17, bc_decomposition_bytes_pc_plus_18, bc_decomposition_bytes_pc_plus_19, bc_decomposition_bytes_pc_plus_2, bc_decomposition_bytes_pc_plus_20, bc_decomposition_bytes_pc_plus_21, bc_decomposition_bytes_pc_plus_22, bc_decomposition_bytes_pc_plus_23, bc_decomposition_bytes_pc_plus_24, bc_decomposition_bytes_pc_plus_25, bc_decomposition_bytes_pc_plus_26, bc_decomposition_bytes_pc_plus_27, bc_decomposition_bytes_pc_plus_28, bc_decomposition_bytes_pc_plus_29, bc_decomposition_bytes_pc_plus_3, bc_decomposition_bytes_pc_plus_30, bc_decomposition_bytes_pc_plus_31, bc_decomposition_bytes_pc_plus_32, bc_decomposition_bytes_pc_plus_33, bc_decomposition_bytes_pc_plus_34, bc_decomposition_bytes_pc_plus_35, bc_decomposition_bytes_pc_plus_4, bc_decomposition_bytes_pc_plus_5, bc_decomposition_bytes_pc_plus_6, bc_decomposition_bytes_pc_plus_7, bc_decomposition_bytes_pc_plus_8, bc_decomposition_bytes_pc_plus_9, bc_decomposition_bytes_remaining, bc_decomposition_bytes_to_read, bc_decomposition_bytes_to_read_unary, bc_decomposition_id, bc_decomposition_last_of_contract, bc_decomposition_pc, bc_decomposition_sel, bc_decomposition_sel_overflow_correction_needed, bc_decomposition_sel_pc_plus_0, bc_decomposition_sel_pc_plus_1, bc_decomposition_sel_pc_plus_10, bc_decomposition_sel_pc_plus_11, bc_decomposition_sel_pc_plus_12, bc_decomposition_sel_pc_plus_13, bc_decomposition_sel_pc_plus_14, bc_decomposition_sel_pc_plus_15, bc_decomposition_sel_pc_plus_16, bc_decomposition_sel_pc_plus_17, bc_decomposition_sel_pc_plus_18, bc_decomposition_sel_pc_plus_19, bc_decomposition_sel_pc_plus_2, bc_decomposition_sel_pc_plus_20, bc_decomposition_sel_pc_plus_21, bc_decomposition_sel_pc_plus_22, bc_decomposition_sel_pc_plus_23, bc_decomposition_sel_pc_plus_24, bc_decomposition_sel_pc_plus_25, bc_decomposition_sel_pc_plus_26, bc_decomposition_sel_pc_plus_27, bc_decomposition_sel_pc_plus_28, bc_decomposition_sel_pc_plus_29, bc_decomposition_sel_pc_plus_3, bc_decomposition_sel_pc_plus_30, bc_decomposition_sel_pc_plus_31, bc_decomposition_sel_pc_plus_32, bc_decomposition_sel_pc_plus_33, bc_decomposition_sel_pc_plus_34, bc_decomposition_sel_pc_plus_35, bc_decomposition_sel_pc_plus_4, bc_decomposition_sel_pc_plus_5, bc_decomposition_sel_pc_plus_6, bc_decomposition_sel_pc_plus_7, bc_decomposition_sel_pc_plus_8, bc_decomposition_sel_pc_plus_9, bc_retrieval_address, bc_retrieval_artifact_hash, bc_retrieval_bytecode_id, bc_retrieval_class_id, bc_retrieval_deployer_addr, bc_retrieval_err, bc_retrieval_incoming_viewing_key_x, bc_retrieval_incoming_viewing_key_y, bc_retrieval_init_hash, bc_retrieval_nullifier_key_x, bc_retrieval_nullifier_key_y, bc_retrieval_outgoing_viewing_key_x, bc_retrieval_outgoing_viewing_key_y, bc_retrieval_private_function_root, bc_retrieval_public_bytecode_commitment, bc_retrieval_salt, bc_retrieval_sel, bc_retrieval_tagging_key_x, bc_retrieval_tagging_key_y, bitwise_acc_ia, bitwise_acc_ib, bitwise_acc_ic, bitwise_ctr, bitwise_ctr_inv, bitwise_ctr_min_one_inv, bitwise_ia_byte, bitwise_ib_byte, bitwise_ic_byte, bitwise_last, bitwise_op_id, bitwise_sel, bitwise_start, bitwise_tag, execution_addressing_error_idx, execution_addressing_error_kind, execution_base_address_tag, execution_base_address_val, execution_bytecode_id, execution_clk, execution_ex_opcode, execution_indirect, execution_last, execution_op1, execution_op1_after_relative, execution_op2, execution_op2_after_relative, execution_op3, execution_op3_after_relative, execution_op4, execution_op4_after_relative, execution_pc, execution_rop1, execution_rop2, execution_rop3, execution_rop4, execution_sel, execution_sel_addressing_error, execution_sel_op1_is_address, execution_sel_op2_is_address, execution_sel_op3_is_address, execution_sel_op4_is_address, instr_fetching_bd0, instr_fetching_bd1, instr_fetching_bd10, instr_fetching_bd11, instr_fetching_bd12, instr_fetching_bd13, instr_fetching_bd14, instr_fetching_bd15, instr_fetching_bd16, instr_fetching_bd17, instr_fetching_bd18, instr_fetching_bd19, instr_fetching_bd2, instr_fetching_bd20, instr_fetching_bd21, instr_fetching_bd22, instr_fetching_bd23, instr_fetching_bd24, instr_fetching_bd25, instr_fetching_bd26, instr_fetching_bd27, instr_fetching_bd28, instr_fetching_bd29, instr_fetching_bd3, instr_fetching_bd30, instr_fetching_bd31, instr_fetching_bd32, instr_fetching_bd33, instr_fetching_bd34, instr_fetching_bd35, instr_fetching_bd4, instr_fetching_bd5, instr_fetching_bd6, instr_fetching_bd7, instr_fetching_bd8, instr_fetching_bd9, instr_fetching_bytecode_id, instr_fetching_ex_opcode, instr_fetching_fmt_3_op_u8, instr_fetching_indirect, instr_fetching_op1, instr_fetching_op2, instr_fetching_op3, instr_fetching_op4, instr_fetching_pc, instr_fetching_sel, range_check_dyn_diff, range_check_dyn_rng_chk_bits, range_check_dyn_rng_chk_pow_2, range_check_is_lte_u112, range_check_is_lte_u128, range_check_is_lte_u16, range_check_is_lte_u32, range_check_is_lte_u48, range_check_is_lte_u64, range_check_is_lte_u80, range_check_is_lte_u96, range_check_rng_chk_bits, range_check_sel, range_check_sel_r0_16_bit_rng_lookup, range_check_sel_r1_16_bit_rng_lookup, range_check_sel_r2_16_bit_rng_lookup, range_check_sel_r3_16_bit_rng_lookup, range_check_sel_r4_16_bit_rng_lookup, range_check_sel_r5_16_bit_rng_lookup, range_check_sel_r6_16_bit_rng_lookup, range_check_u16_r0, range_check_u16_r1, range_check_u16_r2, range_check_u16_r3, range_check_u16_r4, range_check_u16_r5, range_check_u16_r6, range_check_u16_r7, range_check_value, sha256_a, sha256_a_and_b, sha256_a_and_b_xor_a_and_c, sha256_a_and_c, sha256_a_rotr_13, sha256_a_rotr_2, sha256_a_rotr_22, sha256_a_rotr_2_xor_a_rotr_13, sha256_and_sel, sha256_b, sha256_b_and_c, sha256_c, sha256_ch, sha256_clk, sha256_computed_w_lhs, sha256_computed_w_rhs, sha256_d, sha256_dummy_zero, sha256_e, sha256_e_and_f, sha256_e_rotr_11, sha256_e_rotr_25, sha256_e_rotr_6, sha256_e_rotr_6_xor_e_rotr_11, sha256_f, sha256_g, sha256_h, sha256_helper_w0, sha256_helper_w1, sha256_helper_w10, sha256_helper_w11, sha256_helper_w12, sha256_helper_w13, sha256_helper_w14, sha256_helper_w15, sha256_helper_w2, sha256_helper_w3, sha256_helper_w4, sha256_helper_w5, sha256_helper_w6, sha256_helper_w7, sha256_helper_w8, sha256_helper_w9, sha256_init_a, sha256_init_b, sha256_init_c, sha256_init_d, sha256_init_e, sha256_init_f, sha256_init_g, sha256_init_h, sha256_input_offset, sha256_is_input_round, sha256_latch, sha256_lhs_a_13, sha256_lhs_a_2, sha256_lhs_a_22, sha256_lhs_e_11, sha256_lhs_e_25, sha256_lhs_e_6, sha256_lhs_w_10, sha256_lhs_w_17, sha256_lhs_w_18, sha256_lhs_w_19, sha256_lhs_w_3, sha256_lhs_w_7, sha256_maj, sha256_next_a_lhs, sha256_next_a_rhs, sha256_next_e_lhs, sha256_next_e_rhs, sha256_not_e, sha256_not_e_and_g, sha256_output_a_lhs, sha256_output_a_rhs, sha256_output_b_lhs, sha256_output_b_rhs, sha256_output_c_lhs, sha256_output_c_rhs, sha256_output_d_lhs, sha256_output_d_rhs, sha256_output_e_lhs, sha256_output_e_rhs, sha256_output_f_lhs, sha256_output_f_rhs, sha256_output_g_lhs, sha256_output_g_rhs, sha256_output_h_lhs, sha256_output_h_rhs, sha256_output_offset, sha256_perform_round, sha256_rhs_a_13, sha256_rhs_a_2, sha256_rhs_a_22, sha256_rhs_e_11, sha256_rhs_e_25, sha256_rhs_e_6, sha256_rhs_w_10, sha256_rhs_w_17, sha256_rhs_w_18, sha256_rhs_w_19, sha256_rhs_w_3, sha256_rhs_w_7, sha256_round_constant, sha256_round_count, sha256_rounds_remaining, sha256_rounds_remaining_inv, sha256_s_0, sha256_s_1, sha256_sel, sha256_start, sha256_state_offset, sha256_w, sha256_w_15_rotr_18, sha256_w_15_rotr_7, sha256_w_15_rotr_7_xor_w_15_rotr_18, sha256_w_15_rshift_3, sha256_w_2_rotr_17, sha256_w_2_rotr_17_xor_w_2_rotr_19, sha256_w_2_rotr_19, sha256_w_2_rshift_10, sha256_w_s_0, sha256_w_s_1, sha256_xor_sel, lookup_bytecode_to_read_unary_counts, lookup_rng_chk_pow_2_counts, lookup_rng_chk_diff_counts, lookup_rng_chk_is_r0_16_bit_counts, lookup_rng_chk_is_r1_16_bit_counts, lookup_rng_chk_is_r2_16_bit_counts, lookup_rng_chk_is_r3_16_bit_counts, lookup_rng_chk_is_r4_16_bit_counts, lookup_rng_chk_is_r5_16_bit_counts, lookup_rng_chk_is_r6_16_bit_counts, lookup_rng_chk_is_r7_16_bit_counts, lookup_bitw_byte_lengths_counts, lookup_bitw_byte_operations_counts, lookup_sha256_round_constant_counts, lookup_dummy_precomputed_counts, lookup_dummy_dynamic_counts -#define AVM2_DERIVED_WITNESS_ENTITIES perm_dummy_dynamic_inv, lookup_bytecode_to_read_unary_inv, lookup_rng_chk_pow_2_inv, lookup_rng_chk_diff_inv, lookup_rng_chk_is_r0_16_bit_inv, lookup_rng_chk_is_r1_16_bit_inv, lookup_rng_chk_is_r2_16_bit_inv, lookup_rng_chk_is_r3_16_bit_inv, lookup_rng_chk_is_r4_16_bit_inv, lookup_rng_chk_is_r5_16_bit_inv, lookup_rng_chk_is_r6_16_bit_inv, lookup_rng_chk_is_r7_16_bit_inv, lookup_bitw_byte_lengths_inv, lookup_bitw_byte_operations_inv, lookup_sha256_round_constant_inv, lookup_dummy_precomputed_inv, lookup_dummy_dynamic_inv +#define AVM2_WIRE_ENTITIES execution_input, alu_dst_addr, alu_ia, alu_ia_addr, alu_ib, alu_ib_addr, alu_ic, alu_op, alu_sel, alu_sel_op_add, bc_decomposition_bytes, bc_decomposition_bytes_pc_plus_1, bc_decomposition_bytes_pc_plus_10, bc_decomposition_bytes_pc_plus_11, bc_decomposition_bytes_pc_plus_12, bc_decomposition_bytes_pc_plus_13, bc_decomposition_bytes_pc_plus_14, bc_decomposition_bytes_pc_plus_15, bc_decomposition_bytes_pc_plus_16, bc_decomposition_bytes_pc_plus_17, bc_decomposition_bytes_pc_plus_18, bc_decomposition_bytes_pc_plus_19, bc_decomposition_bytes_pc_plus_2, bc_decomposition_bytes_pc_plus_20, bc_decomposition_bytes_pc_plus_21, bc_decomposition_bytes_pc_plus_22, bc_decomposition_bytes_pc_plus_23, bc_decomposition_bytes_pc_plus_24, bc_decomposition_bytes_pc_plus_25, bc_decomposition_bytes_pc_plus_26, bc_decomposition_bytes_pc_plus_27, bc_decomposition_bytes_pc_plus_28, bc_decomposition_bytes_pc_plus_29, bc_decomposition_bytes_pc_plus_3, bc_decomposition_bytes_pc_plus_30, bc_decomposition_bytes_pc_plus_31, bc_decomposition_bytes_pc_plus_32, bc_decomposition_bytes_pc_plus_33, bc_decomposition_bytes_pc_plus_34, bc_decomposition_bytes_pc_plus_35, bc_decomposition_bytes_pc_plus_4, bc_decomposition_bytes_pc_plus_5, bc_decomposition_bytes_pc_plus_6, bc_decomposition_bytes_pc_plus_7, bc_decomposition_bytes_pc_plus_8, bc_decomposition_bytes_pc_plus_9, bc_decomposition_bytes_remaining, bc_decomposition_bytes_to_read, bc_decomposition_bytes_to_read_unary, bc_decomposition_id, bc_decomposition_last_of_contract, bc_decomposition_pc, bc_decomposition_sel, bc_decomposition_sel_overflow_correction_needed, bc_decomposition_sel_pc_plus_0, bc_decomposition_sel_pc_plus_1, bc_decomposition_sel_pc_plus_10, bc_decomposition_sel_pc_plus_11, bc_decomposition_sel_pc_plus_12, bc_decomposition_sel_pc_plus_13, bc_decomposition_sel_pc_plus_14, bc_decomposition_sel_pc_plus_15, bc_decomposition_sel_pc_plus_16, bc_decomposition_sel_pc_plus_17, bc_decomposition_sel_pc_plus_18, bc_decomposition_sel_pc_plus_19, bc_decomposition_sel_pc_plus_2, bc_decomposition_sel_pc_plus_20, bc_decomposition_sel_pc_plus_21, bc_decomposition_sel_pc_plus_22, bc_decomposition_sel_pc_plus_23, bc_decomposition_sel_pc_plus_24, bc_decomposition_sel_pc_plus_25, bc_decomposition_sel_pc_plus_26, bc_decomposition_sel_pc_plus_27, bc_decomposition_sel_pc_plus_28, bc_decomposition_sel_pc_plus_29, bc_decomposition_sel_pc_plus_3, bc_decomposition_sel_pc_plus_30, bc_decomposition_sel_pc_plus_31, bc_decomposition_sel_pc_plus_32, bc_decomposition_sel_pc_plus_33, bc_decomposition_sel_pc_plus_34, bc_decomposition_sel_pc_plus_35, bc_decomposition_sel_pc_plus_4, bc_decomposition_sel_pc_plus_5, bc_decomposition_sel_pc_plus_6, bc_decomposition_sel_pc_plus_7, bc_decomposition_sel_pc_plus_8, bc_decomposition_sel_pc_plus_9, bc_retrieval_address, bc_retrieval_artifact_hash, bc_retrieval_bytecode_id, bc_retrieval_class_id, bc_retrieval_deployer_addr, bc_retrieval_err, bc_retrieval_incoming_viewing_key_x, bc_retrieval_incoming_viewing_key_y, bc_retrieval_init_hash, bc_retrieval_nullifier_key_x, bc_retrieval_nullifier_key_y, bc_retrieval_outgoing_viewing_key_x, bc_retrieval_outgoing_viewing_key_y, bc_retrieval_private_function_root, bc_retrieval_public_bytecode_commitment, bc_retrieval_salt, bc_retrieval_sel, bc_retrieval_tagging_key_x, bc_retrieval_tagging_key_y, bitwise_acc_ia, bitwise_acc_ib, bitwise_acc_ic, bitwise_ctr, bitwise_ctr_inv, bitwise_ctr_min_one_inv, bitwise_ia_byte, bitwise_ib_byte, bitwise_ic_byte, bitwise_last, bitwise_op_id, bitwise_sel, bitwise_start, bitwise_tag, execution_addressing_error_idx, execution_addressing_error_kind, execution_base_address_tag, execution_base_address_val, execution_bytecode_id, execution_clk, execution_ex_opcode, execution_indirect, execution_last, execution_op1, execution_op1_after_relative, execution_op2, execution_op2_after_relative, execution_op3, execution_op3_after_relative, execution_op4, execution_op4_after_relative, execution_pc, execution_rop1, execution_rop2, execution_rop3, execution_rop4, execution_sel, execution_sel_addressing_error, execution_sel_alu, execution_sel_op1_is_address, execution_sel_op2_is_address, execution_sel_op3_is_address, execution_sel_op4_is_address, instr_fetching_bd0, instr_fetching_bd1, instr_fetching_bd10, instr_fetching_bd11, instr_fetching_bd12, instr_fetching_bd13, instr_fetching_bd14, instr_fetching_bd15, instr_fetching_bd16, instr_fetching_bd17, instr_fetching_bd18, instr_fetching_bd19, instr_fetching_bd2, instr_fetching_bd20, instr_fetching_bd21, instr_fetching_bd22, instr_fetching_bd23, instr_fetching_bd24, instr_fetching_bd25, instr_fetching_bd26, instr_fetching_bd27, instr_fetching_bd28, instr_fetching_bd29, instr_fetching_bd3, instr_fetching_bd30, instr_fetching_bd31, instr_fetching_bd32, instr_fetching_bd33, instr_fetching_bd34, instr_fetching_bd35, instr_fetching_bd4, instr_fetching_bd5, instr_fetching_bd6, instr_fetching_bd7, instr_fetching_bd8, instr_fetching_bd9, instr_fetching_bytecode_id, instr_fetching_ex_opcode, instr_fetching_fmt_3_op_u8, instr_fetching_indirect, instr_fetching_op1, instr_fetching_op2, instr_fetching_op3, instr_fetching_op4, instr_fetching_pc, instr_fetching_sel, range_check_dyn_diff, range_check_dyn_rng_chk_bits, range_check_dyn_rng_chk_pow_2, range_check_is_lte_u112, range_check_is_lte_u128, range_check_is_lte_u16, range_check_is_lte_u32, range_check_is_lte_u48, range_check_is_lte_u64, range_check_is_lte_u80, range_check_is_lte_u96, range_check_rng_chk_bits, range_check_sel, range_check_sel_r0_16_bit_rng_lookup, range_check_sel_r1_16_bit_rng_lookup, range_check_sel_r2_16_bit_rng_lookup, range_check_sel_r3_16_bit_rng_lookup, range_check_sel_r4_16_bit_rng_lookup, range_check_sel_r5_16_bit_rng_lookup, range_check_sel_r6_16_bit_rng_lookup, range_check_u16_r0, range_check_u16_r1, range_check_u16_r2, range_check_u16_r3, range_check_u16_r4, range_check_u16_r5, range_check_u16_r6, range_check_u16_r7, range_check_value, sha256_a, sha256_a_and_b, sha256_a_and_b_xor_a_and_c, sha256_a_and_c, sha256_a_rotr_13, sha256_a_rotr_2, sha256_a_rotr_22, sha256_a_rotr_2_xor_a_rotr_13, sha256_and_sel, sha256_b, sha256_b_and_c, sha256_c, sha256_ch, sha256_clk, sha256_computed_w_lhs, sha256_computed_w_rhs, sha256_d, sha256_dummy_zero, sha256_e, sha256_e_and_f, sha256_e_rotr_11, sha256_e_rotr_25, sha256_e_rotr_6, sha256_e_rotr_6_xor_e_rotr_11, sha256_f, sha256_g, sha256_h, sha256_helper_w0, sha256_helper_w1, sha256_helper_w10, sha256_helper_w11, sha256_helper_w12, sha256_helper_w13, sha256_helper_w14, sha256_helper_w15, sha256_helper_w2, sha256_helper_w3, sha256_helper_w4, sha256_helper_w5, sha256_helper_w6, sha256_helper_w7, sha256_helper_w8, sha256_helper_w9, sha256_init_a, sha256_init_b, sha256_init_c, sha256_init_d, sha256_init_e, sha256_init_f, sha256_init_g, sha256_init_h, sha256_input_offset, sha256_is_input_round, sha256_latch, sha256_lhs_a_13, sha256_lhs_a_2, sha256_lhs_a_22, sha256_lhs_e_11, sha256_lhs_e_25, sha256_lhs_e_6, sha256_lhs_w_10, sha256_lhs_w_17, sha256_lhs_w_18, sha256_lhs_w_19, sha256_lhs_w_3, sha256_lhs_w_7, sha256_maj, sha256_next_a_lhs, sha256_next_a_rhs, sha256_next_e_lhs, sha256_next_e_rhs, sha256_not_e, sha256_not_e_and_g, sha256_output_a_lhs, sha256_output_a_rhs, sha256_output_b_lhs, sha256_output_b_rhs, sha256_output_c_lhs, sha256_output_c_rhs, sha256_output_d_lhs, sha256_output_d_rhs, sha256_output_e_lhs, sha256_output_e_rhs, sha256_output_f_lhs, sha256_output_f_rhs, sha256_output_g_lhs, sha256_output_g_rhs, sha256_output_h_lhs, sha256_output_h_rhs, sha256_output_offset, sha256_perform_round, sha256_rhs_a_13, sha256_rhs_a_2, sha256_rhs_a_22, sha256_rhs_e_11, sha256_rhs_e_25, sha256_rhs_e_6, sha256_rhs_w_10, sha256_rhs_w_17, sha256_rhs_w_18, sha256_rhs_w_19, sha256_rhs_w_3, sha256_rhs_w_7, sha256_round_constant, sha256_round_count, sha256_rounds_remaining, sha256_rounds_remaining_inv, sha256_s_0, sha256_s_1, sha256_sel, sha256_start, sha256_state_offset, sha256_w, sha256_w_15_rotr_18, sha256_w_15_rotr_7, sha256_w_15_rotr_7_xor_w_15_rotr_18, sha256_w_15_rshift_3, sha256_w_2_rotr_17, sha256_w_2_rotr_17_xor_w_2_rotr_19, sha256_w_2_rotr_19, sha256_w_2_rshift_10, sha256_w_s_0, sha256_w_s_1, sha256_xor_sel, lookup_bytecode_to_read_unary_counts, lookup_rng_chk_pow_2_counts, lookup_rng_chk_diff_counts, lookup_rng_chk_is_r0_16_bit_counts, lookup_rng_chk_is_r1_16_bit_counts, lookup_rng_chk_is_r2_16_bit_counts, lookup_rng_chk_is_r3_16_bit_counts, lookup_rng_chk_is_r4_16_bit_counts, lookup_rng_chk_is_r5_16_bit_counts, lookup_rng_chk_is_r6_16_bit_counts, lookup_rng_chk_is_r7_16_bit_counts, lookup_bitw_byte_lengths_counts, lookup_bitw_byte_operations_counts, lookup_sha256_round_constant_counts, lookup_exec_alu_counts, lookup_dummy_precomputed_counts +#define AVM2_DERIVED_WITNESS_ENTITIES perm_dummy_dynamic_inv, lookup_bytecode_to_read_unary_inv, lookup_rng_chk_pow_2_inv, lookup_rng_chk_diff_inv, lookup_rng_chk_is_r0_16_bit_inv, lookup_rng_chk_is_r1_16_bit_inv, lookup_rng_chk_is_r2_16_bit_inv, lookup_rng_chk_is_r3_16_bit_inv, lookup_rng_chk_is_r4_16_bit_inv, lookup_rng_chk_is_r5_16_bit_inv, lookup_rng_chk_is_r6_16_bit_inv, lookup_rng_chk_is_r7_16_bit_inv, lookup_bitw_byte_lengths_inv, lookup_bitw_byte_operations_inv, lookup_sha256_round_constant_inv, lookup_exec_alu_inv, lookup_dummy_precomputed_inv #define AVM2_SHIFTED_ENTITIES bc_decomposition_bytes_shift, bc_decomposition_bytes_pc_plus_1_shift, bc_decomposition_bytes_pc_plus_10_shift, bc_decomposition_bytes_pc_plus_11_shift, bc_decomposition_bytes_pc_plus_12_shift, bc_decomposition_bytes_pc_plus_13_shift, bc_decomposition_bytes_pc_plus_14_shift, bc_decomposition_bytes_pc_plus_15_shift, bc_decomposition_bytes_pc_plus_16_shift, bc_decomposition_bytes_pc_plus_17_shift, bc_decomposition_bytes_pc_plus_18_shift, bc_decomposition_bytes_pc_plus_19_shift, bc_decomposition_bytes_pc_plus_2_shift, bc_decomposition_bytes_pc_plus_20_shift, bc_decomposition_bytes_pc_plus_21_shift, bc_decomposition_bytes_pc_plus_22_shift, bc_decomposition_bytes_pc_plus_23_shift, bc_decomposition_bytes_pc_plus_24_shift, bc_decomposition_bytes_pc_plus_25_shift, bc_decomposition_bytes_pc_plus_26_shift, bc_decomposition_bytes_pc_plus_27_shift, bc_decomposition_bytes_pc_plus_28_shift, bc_decomposition_bytes_pc_plus_29_shift, bc_decomposition_bytes_pc_plus_3_shift, bc_decomposition_bytes_pc_plus_30_shift, bc_decomposition_bytes_pc_plus_31_shift, bc_decomposition_bytes_pc_plus_32_shift, bc_decomposition_bytes_pc_plus_33_shift, bc_decomposition_bytes_pc_plus_34_shift, bc_decomposition_bytes_pc_plus_4_shift, bc_decomposition_bytes_pc_plus_5_shift, bc_decomposition_bytes_pc_plus_6_shift, bc_decomposition_bytes_pc_plus_7_shift, bc_decomposition_bytes_pc_plus_8_shift, bc_decomposition_bytes_pc_plus_9_shift, bitwise_acc_ia_shift, bitwise_acc_ib_shift, bitwise_acc_ic_shift, bitwise_ctr_shift, bitwise_op_id_shift, execution_sel_shift, sha256_a_shift, sha256_b_shift, sha256_c_shift, sha256_d_shift, sha256_e_shift, sha256_f_shift, sha256_g_shift, sha256_h_shift, sha256_helper_w0_shift, sha256_helper_w1_shift, sha256_helper_w10_shift, sha256_helper_w11_shift, sha256_helper_w12_shift, sha256_helper_w13_shift, sha256_helper_w14_shift, sha256_helper_w15_shift, sha256_helper_w2_shift, sha256_helper_w3_shift, sha256_helper_w4_shift, sha256_helper_w5_shift, sha256_helper_w6_shift, sha256_helper_w7_shift, sha256_helper_w8_shift, sha256_helper_w9_shift, sha256_rounds_remaining_shift, sha256_sel_shift, sha256_start_shift #define AVM2_TO_BE_SHIFTED(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_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.bitwise_acc_ia, e.bitwise_acc_ib, e.bitwise_acc_ic, e.bitwise_ctr, e.bitwise_op_id, e.execution_sel, 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 #define AVM2_ALL_ENTITIES AVM2_PRECOMPUTED_ENTITIES, AVM2_WIRE_ENTITIES, AVM2_DERIVED_WITNESS_ENTITIES, AVM2_SHIFTED_ENTITIES @@ -31,8 +31,8 @@ enum class ColumnAndShifts { SENTINEL_DO_NOT_USE, }; -constexpr auto NUM_COLUMNS_WITH_SHIFTS = 466; -constexpr auto NUM_COLUMNS_WITHOUT_SHIFTS = 398; +constexpr auto NUM_COLUMNS_WITH_SHIFTS = 468; +constexpr auto NUM_COLUMNS_WITHOUT_SHIFTS = 400; 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.hpp b/barretenberg/cpp/src/barretenberg/vm2/generated/flavor.hpp index 243de435825..28b85af2a67 100644 --- a/barretenberg/cpp/src/barretenberg/vm2/generated/flavor.hpp +++ b/barretenberg/cpp/src/barretenberg/vm2/generated/flavor.hpp @@ -76,12 +76,12 @@ class AvmFlavor { static constexpr bool HasZK = false; static constexpr size_t NUM_PRECOMPUTED_ENTITIES = 16; - static constexpr size_t NUM_WITNESS_ENTITIES = 382; + static constexpr size_t NUM_WITNESS_ENTITIES = 384; static constexpr size_t NUM_SHIFTED_ENTITIES = 68; static constexpr size_t NUM_WIRES = NUM_WITNESS_ENTITIES + NUM_PRECOMPUTED_ENTITIES; // We have two copies of the witness entities, so we subtract the number of fixed ones (they have no shift), one for // the unshifted and one for the shifted - static constexpr size_t NUM_ALL_ENTITIES = 466; + static constexpr size_t NUM_ALL_ENTITIES = 468; // Need to be templated for recursive verifier template @@ -105,8 +105,8 @@ class AvmFlavor { lookup_bitw_byte_lengths_relation, lookup_bitw_byte_operations_relation, lookup_bytecode_to_read_unary_relation, - lookup_dummy_dynamic_relation, lookup_dummy_precomputed_relation, + lookup_exec_alu_relation, lookup_rng_chk_diff_relation, lookup_rng_chk_is_r0_16_bit_relation, lookup_rng_chk_is_r1_16_bit_relation, diff --git a/barretenberg/cpp/src/barretenberg/vm2/generated/relations/lookups_execution.hpp b/barretenberg/cpp/src/barretenberg/vm2/generated/relations/lookups_execution.hpp index db68fe8aff2..c52e338b0b4 100644 --- a/barretenberg/cpp/src/barretenberg/vm2/generated/relations/lookups_execution.hpp +++ b/barretenberg/cpp/src/barretenberg/vm2/generated/relations/lookups_execution.hpp @@ -10,45 +10,44 @@ namespace bb::avm2 { -/////////////////// lookup_dummy_precomputed /////////////////// +/////////////////// lookup_exec_alu /////////////////// -class lookup_dummy_precomputed_lookup_settings { +class lookup_exec_alu_lookup_settings { public: - static constexpr std::string_view NAME = "LOOKUP_DUMMY_PRECOMPUTED"; + static constexpr std::string_view NAME = "LOOKUP_EXEC_ALU"; static constexpr size_t READ_TERMS = 1; static constexpr size_t WRITE_TERMS = 1; static constexpr size_t READ_TERM_TYPES[READ_TERMS] = { 0 }; static constexpr size_t WRITE_TERM_TYPES[WRITE_TERMS] = { 0 }; - static constexpr size_t LOOKUP_TUPLE_SIZE = 4; + static constexpr size_t LOOKUP_TUPLE_SIZE = 3; static constexpr size_t INVERSE_EXISTS_POLYNOMIAL_DEGREE = 4; static constexpr size_t READ_TERM_DEGREE = 0; static constexpr size_t WRITE_TERM_DEGREE = 0; // Columns using the Column enum. - static constexpr Column SRC_SELECTOR = Column::execution_sel; - static constexpr Column DST_SELECTOR = Column::precomputed_sel_bitwise; - static constexpr Column COUNTS = Column::lookup_dummy_precomputed_counts; - static constexpr Column INVERSES = Column::lookup_dummy_precomputed_inv; - static constexpr std::array SRC_COLUMNS = { - Column::execution_sel, Column::execution_clk, Column::execution_clk, Column::execution_clk - }; - static constexpr std::array DST_COLUMNS = { Column::precomputed_bitwise_op_id, - Column::precomputed_bitwise_input_a, - Column::precomputed_bitwise_input_b, - Column::precomputed_bitwise_output }; + static constexpr Column SRC_SELECTOR = Column::execution_sel_alu; + static constexpr Column DST_SELECTOR = Column::alu_sel; + static constexpr Column COUNTS = Column::lookup_exec_alu_counts; + static constexpr Column INVERSES = Column::lookup_exec_alu_inv; + static constexpr std::array SRC_COLUMNS = { Column::execution_op1, + Column::execution_op2, + Column::execution_op3 }; + static constexpr std::array DST_COLUMNS = { Column::alu_ia_addr, + Column::alu_ib_addr, + Column::alu_dst_addr }; template static inline auto inverse_polynomial_is_computed_at_row(const AllEntities& in) { - return (in._execution_sel() == 1 || in._precomputed_sel_bitwise() == 1); + return (in._execution_sel_alu() == 1 || in._alu_sel() == 1); } template static inline auto compute_inverse_exists(const AllEntities& in) { using View = typename Accumulator::View; - const auto is_operation = View(in._execution_sel()); - const auto is_table_entry = View(in._precomputed_sel_bitwise()); + const auto is_operation = View(in._execution_sel_alu()); + const auto is_table_entry = View(in._alu_sel()); return (is_operation + is_table_entry - is_operation * is_table_entry); } @@ -64,33 +63,31 @@ class lookup_dummy_precomputed_lookup_settings { template static inline auto get_entities(AllEntities&& in) { - return std::forward_as_tuple(in._lookup_dummy_precomputed_inv(), - in._lookup_dummy_precomputed_counts(), - in._execution_sel(), - in._precomputed_sel_bitwise(), - in._execution_sel(), - in._execution_clk(), - in._execution_clk(), - in._execution_clk(), - in._precomputed_bitwise_op_id(), - in._precomputed_bitwise_input_a(), - in._precomputed_bitwise_input_b(), - in._precomputed_bitwise_output()); + return std::forward_as_tuple(in._lookup_exec_alu_inv(), + in._lookup_exec_alu_counts(), + in._execution_sel_alu(), + in._alu_sel(), + in._execution_op1(), + in._execution_op2(), + in._execution_op3(), + in._alu_ia_addr(), + in._alu_ib_addr(), + in._alu_dst_addr()); } }; template -class lookup_dummy_precomputed_relation : public GenericLookupRelation { +class lookup_exec_alu_relation : public GenericLookupRelation { public: - static constexpr std::string_view NAME = lookup_dummy_precomputed_lookup_settings::NAME; + static constexpr std::string_view NAME = lookup_exec_alu_lookup_settings::NAME; }; -template using lookup_dummy_precomputed = GenericLookup; +template using lookup_exec_alu = GenericLookup; -/////////////////// lookup_dummy_dynamic /////////////////// +/////////////////// lookup_dummy_precomputed /////////////////// -class lookup_dummy_dynamic_lookup_settings { +class lookup_dummy_precomputed_lookup_settings { public: - static constexpr std::string_view NAME = "LOOKUP_DUMMY_DYNAMIC"; + static constexpr std::string_view NAME = "LOOKUP_DUMMY_PRECOMPUTED"; static constexpr size_t READ_TERMS = 1; static constexpr size_t WRITE_TERMS = 1; @@ -103,19 +100,20 @@ class lookup_dummy_dynamic_lookup_settings { // Columns using the Column enum. static constexpr Column SRC_SELECTOR = Column::execution_sel; - static constexpr Column DST_SELECTOR = Column::execution_sel; - static constexpr Column COUNTS = Column::lookup_dummy_dynamic_counts; - static constexpr Column INVERSES = Column::lookup_dummy_dynamic_inv; + static constexpr Column DST_SELECTOR = Column::precomputed_sel_bitwise; + static constexpr Column COUNTS = Column::lookup_dummy_precomputed_counts; + static constexpr Column INVERSES = Column::lookup_dummy_precomputed_inv; static constexpr std::array SRC_COLUMNS = { - Column::execution_op1, Column::execution_op2, Column::execution_op3, Column::execution_op4 - }; - static constexpr std::array DST_COLUMNS = { - Column::execution_op1, Column::execution_op2, Column::execution_op3, Column::execution_op4 + Column::execution_sel, Column::execution_clk, Column::execution_clk, Column::execution_clk }; + static constexpr std::array DST_COLUMNS = { Column::precomputed_bitwise_op_id, + Column::precomputed_bitwise_input_a, + Column::precomputed_bitwise_input_b, + Column::precomputed_bitwise_output }; template static inline auto inverse_polynomial_is_computed_at_row(const AllEntities& in) { - return (in._execution_sel() == 1 || in._execution_sel() == 1); + return (in._execution_sel() == 1 || in._precomputed_sel_bitwise() == 1); } template @@ -123,7 +121,7 @@ class lookup_dummy_dynamic_lookup_settings { { using View = typename Accumulator::View; const auto is_operation = View(in._execution_sel()); - const auto is_table_entry = View(in._execution_sel()); + const auto is_table_entry = View(in._precomputed_sel_bitwise()); return (is_operation + is_table_entry - is_operation * is_table_entry); } @@ -139,26 +137,26 @@ class lookup_dummy_dynamic_lookup_settings { template static inline auto get_entities(AllEntities&& in) { - return std::forward_as_tuple(in._lookup_dummy_dynamic_inv(), - in._lookup_dummy_dynamic_counts(), + return std::forward_as_tuple(in._lookup_dummy_precomputed_inv(), + in._lookup_dummy_precomputed_counts(), in._execution_sel(), + in._precomputed_sel_bitwise(), in._execution_sel(), - in._execution_op1(), - in._execution_op2(), - in._execution_op3(), - in._execution_op4(), - in._execution_op1(), - in._execution_op2(), - in._execution_op3(), - in._execution_op4()); + in._execution_clk(), + in._execution_clk(), + in._execution_clk(), + in._precomputed_bitwise_op_id(), + in._precomputed_bitwise_input_a(), + in._precomputed_bitwise_input_b(), + in._precomputed_bitwise_output()); } }; template -class lookup_dummy_dynamic_relation : public GenericLookupRelation { +class lookup_dummy_precomputed_relation : public GenericLookupRelation { public: - static constexpr std::string_view NAME = lookup_dummy_dynamic_lookup_settings::NAME; + static constexpr std::string_view NAME = lookup_dummy_precomputed_lookup_settings::NAME; }; -template using lookup_dummy_dynamic = GenericLookup; +template using lookup_dummy_precomputed = GenericLookup; } // namespace bb::avm2 \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/vm2/tracegen/alu_trace.cpp b/barretenberg/cpp/src/barretenberg/vm2/tracegen/alu_trace.cpp index f9a5636fe4d..2ca2a3424f3 100644 --- a/barretenberg/cpp/src/barretenberg/vm2/tracegen/alu_trace.cpp +++ b/barretenberg/cpp/src/barretenberg/vm2/tracegen/alu_trace.cpp @@ -36,6 +36,7 @@ void AluTraceBuilder::process(const simulation::EventEmitterInterface(event.operation) }, { C::alu_ia, event.a }, diff --git a/barretenberg/cpp/src/barretenberg/vm2/tracegen/execution_trace.cpp b/barretenberg/cpp/src/barretenberg/vm2/tracegen/execution_trace.cpp index 53bbd710946..71e3b3c204f 100644 --- a/barretenberg/cpp/src/barretenberg/vm2/tracegen/execution_trace.cpp +++ b/barretenberg/cpp/src/barretenberg/vm2/tracegen/execution_trace.cpp @@ -7,6 +7,7 @@ #include "barretenberg/common/log.hpp" #include "barretenberg/common/zip_view.hpp" +#include "barretenberg/vm2/common/opcodes.hpp" #include "barretenberg/vm2/simulation/events/addressing_event.hpp" #include "barretenberg/vm2/simulation/events/event_emitter.hpp" #include "barretenberg/vm2/simulation/events/execution_event.hpp" @@ -17,6 +18,19 @@ namespace { constexpr size_t operand_columns = 4; +Column get_operation_selector(ExecutionOpCode operation) +{ + switch (operation) { + case ExecutionOpCode::ADD: + return Column::execution_sel_alu; + default: + // TODO: Complete and remove this. + return Column::execution_sel; + // throw std::runtime_error("Unknown ALU operation"); + break; + } +} + } // namespace void ExecutionTraceBuilder::process( @@ -47,6 +61,7 @@ void ExecutionTraceBuilder::process( { C::execution_sel, 1 }, // active execution trace { C::execution_clk, row }, // TODO: we may want this in the event { C::execution_ex_opcode, static_cast(ex_event.opcode) }, + { get_operation_selector(ex_event.opcode), 1 }, { C::execution_op1, static_cast(operands.at(0)) }, { C::execution_op2, static_cast(operands.at(1)) }, { C::execution_op3, static_cast(operands.at(2)) }, diff --git a/barretenberg/cpp/src/barretenberg/vm2/tracegen/lib/lookup_builder.hpp b/barretenberg/cpp/src/barretenberg/vm2/tracegen/lib/lookup_builder.hpp index eceb0f803a1..89a12bb02af 100644 --- a/barretenberg/cpp/src/barretenberg/vm2/tracegen/lib/lookup_builder.hpp +++ b/barretenberg/cpp/src/barretenberg/vm2/tracegen/lib/lookup_builder.hpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include "barretenberg/vm2/common/field.hpp" @@ -54,9 +55,12 @@ template class BaseLookupTraceBuilder : public Intera // This class is used when the lookup is into a non-precomputed table. // It calculates the counts by trying to find the tuple in the destination columns. // It creates an index of the destination columns on init, and uses it to find the tuple efficiently. -template class LookupIntoDynamicTable : public BaseLookupTraceBuilder { +// This class should work for any lookup that is not precomputed. +// However, consider using a more specialized and faster class. +template +class LookupIntoDynamicTableGeneric : public BaseLookupTraceBuilder { public: - virtual ~LookupIntoDynamicTable() = default; + virtual ~LookupIntoDynamicTableGeneric() = default; protected: using LookupSettings = LookupSettings_; @@ -89,6 +93,55 @@ template class LookupIntoDynamicTable : public BaseLo unordered_flat_map row_idx; }; +// This class is used when the lookup is into a non-precomputed table. +// It is optimized for the case when the source and destination tuples +// are expected to be in the same order (possibly with other tuples in the middle +// in the destination table). +// The approach is that for a given source row, you start sequentially looking at the +// destination rows until you find a match. Then you move to the next source row. +// Then you keep looking from the last destination row you found a match. +template class LookupIntoDynamicTableSequential : public InteractionBuilderInterface { + public: + ~LookupIntoDynamicTableSequential() override = default; + + void process(TraceContainer& trace) override + { + uint32_t dst_row = 0; + uint32_t max_dst_row = trace.get_column_rows(LookupSettings::DST_SELECTOR); + + trace.visit_column(LookupSettings::SRC_SELECTOR, [&](uint32_t row, const FF& src_sel_value) { + assert(src_sel_value == 1); + (void)src_sel_value; // Avoid GCC complaining of unused parameter when asserts are disabled. + + auto src_values = trace.get_multiple(LookupSettings::SRC_COLUMNS, row); + + // We set a dummy value in the inverse column so that the size of the column is right. + // The correct value will be set by the prover. + trace.set(LookupSettings::INVERSES, row, 0xdeadbeef); + + // We find the first row in the destination columns where the values match. + while (dst_row < max_dst_row) { + // TODO: As an optimization, we could try to only walk the rows where the selector is active. + // We can't just do a visit because we cannot skip rows with that. + auto dst_selector = trace.get(LookupSettings::DST_SELECTOR, dst_row); + if (dst_selector == 1 && src_values == trace.get_multiple(LookupSettings::DST_COLUMNS, dst_row)) { + trace.set(LookupSettings::COUNTS, dst_row, trace.get(LookupSettings::COUNTS, dst_row) + 1); + return; // Done with this source row. + } + ++dst_row; + } + + throw std::runtime_error("Failed computing counts for " + std::string(LookupSettings::NAME) + + ". Could not find tuple in destination."); + }); + + // We set a dummy value in the inverse column so that the size of the column is right. + // The correct value will be set by the prover. + trace.visit_column(LookupSettings::DST_SELECTOR, + [&](uint32_t row, const FF&) { trace.set(LookupSettings::INVERSES, row, 0xdeadbeef); }); + } +}; + } // namespace bb::avm2::tracegen // Define a hash function for std::array so that it can be used as a key in a std::unordered_map. diff --git a/barretenberg/cpp/src/barretenberg/vm2/tracegen_helper.cpp b/barretenberg/cpp/src/barretenberg/vm2/tracegen_helper.cpp index 48f21de77b5..6c5162f67ba 100644 --- a/barretenberg/cpp/src/barretenberg/vm2/tracegen_helper.cpp +++ b/barretenberg/cpp/src/barretenberg/vm2/tracegen_helper.cpp @@ -183,7 +183,7 @@ TraceContainer AvmTraceGenHelper::generate_trace(EventsContainer&& events) { auto jobs_interactions = make_jobs>( std::make_unique>(), - std::make_unique>(), + std::make_unique>(), std::make_unique>(), std::make_unique>(), std::make_unique>(),