diff --git a/barretenberg/cpp/pil/avm/binary.pil b/barretenberg/cpp/pil/avm/binary.pil index 441f4c56bd1..c951481caf6 100644 --- a/barretenberg/cpp/pil/avm/binary.pil +++ b/barretenberg/cpp/pil/avm/binary.pil @@ -1,6 +1,4 @@ - -include "byte_lookup.pil"; -include "main.pil"; +include "fixed/byte_lookup.pil"; namespace binary(256); diff --git a/barretenberg/cpp/pil/avm/byte_lookup.pil b/barretenberg/cpp/pil/avm/fixed/byte_lookup.pil similarity index 99% rename from barretenberg/cpp/pil/avm/byte_lookup.pil rename to barretenberg/cpp/pil/avm/fixed/byte_lookup.pil index a91272a86e6..1759bf83899 100644 --- a/barretenberg/cpp/pil/avm/byte_lookup.pil +++ b/barretenberg/cpp/pil/avm/fixed/byte_lookup.pil @@ -1,4 +1,3 @@ - namespace byte_lookup(256); // These columns are commited for now, but will be migrated to constant/fixed when // we support more *exotic* code generation options diff --git a/barretenberg/cpp/pil/avm/gas.pil b/barretenberg/cpp/pil/avm/fixed/gas.pil similarity index 63% rename from barretenberg/cpp/pil/avm/gas.pil rename to barretenberg/cpp/pil/avm/fixed/gas.pil index 0a1ed20bdb2..e366c85c67f 100644 --- a/barretenberg/cpp/pil/avm/gas.pil +++ b/barretenberg/cpp/pil/avm/fixed/gas.pil @@ -5,4 +5,9 @@ namespace gas(256); // TODO(ISSUE_NUMBER): Constrain variable gas costs pol commit l2_gas_fixed_table; - pol commit da_gas_fixed_table; \ No newline at end of file + pol commit da_gas_fixed_table; + + // DUMMY RELATIONS to force creation of hpp. + sel_gas_cost - sel_gas_cost = 0; + l2_gas_fixed_table - l2_gas_fixed_table = 0; + da_gas_fixed_table - da_gas_fixed_table = 0; \ No newline at end of file diff --git a/barretenberg/cpp/pil/avm/fixed/powers.pil b/barretenberg/cpp/pil/avm/fixed/powers.pil new file mode 100644 index 00000000000..bc497eca04c --- /dev/null +++ b/barretenberg/cpp/pil/avm/fixed/powers.pil @@ -0,0 +1,9 @@ +// This table should eventually be fixed. +// Contains 256 rows with the powers of 2 for 8-bit numbers. +// power_of_2 = 1 << clk; +namespace powers(256); + // clk will be the implicit power. + pol commit power_of_2; + + // DUMMY RELATION to force creation of hpp. + power_of_2 - power_of_2 = 0; \ No newline at end of file diff --git a/barretenberg/cpp/pil/avm/main.pil b/barretenberg/cpp/pil/avm/main.pil index 618dc585d7e..19e445d6290 100644 --- a/barretenberg/cpp/pil/avm/main.pil +++ b/barretenberg/cpp/pil/avm/main.pil @@ -3,7 +3,8 @@ include "alu.pil"; include "binary.pil"; include "constants.pil"; include "kernel.pil"; -include "gas.pil"; +include "fixed/gas.pil"; +include "fixed/powers.pil"; include "gadgets/conversion.pil"; include "gadgets/sha256.pil"; include "gadgets/poseidon2.pil"; @@ -139,9 +140,6 @@ namespace main(256); pol commit sel_rng_8; // Boolean selector for the 8-bit range check lookup pol commit sel_rng_16; // Boolean selector for the 16-bit range check lookup - //===== Lookup table powers of 2 ============================================= - pol commit table_pow_2; // Table of powers of 2 for 8-bit numbers. - //===== CONTROL FLOW ========================================================== // Program counter pol commit pc; @@ -773,11 +771,11 @@ namespace main(256); // Lookup for 2**(ib) #[LOOKUP_POW_2_0] - alu.sel_shift_which {alu.ib, alu.two_pow_s} in sel_rng_8 {clk, table_pow_2}; + alu.sel_shift_which {alu.ib, alu.two_pow_s} in sel_rng_8 {clk, powers.power_of_2}; // Lookup for 2**(t-ib) #[LOOKUP_POW_2_1] - alu.sel_shift_which {alu.t_sub_s_bits , alu.two_pow_t_sub_s} in sel_rng_8 {clk, table_pow_2}; + alu.sel_shift_which {alu.t_sub_s_bits , alu.two_pow_t_sub_s} in sel_rng_8 {clk, powers.power_of_2}; //====== Inter-table Constraints (Range Checks) ============================================ // TODO: Investigate optimising these range checks. Handling non-FF elements should require less range checks. diff --git a/barretenberg/cpp/src/barretenberg/relations/generated/avm/declare_views.hpp b/barretenberg/cpp/src/barretenberg/relations/generated/avm/declare_views.hpp index 9dd3eb86948..2cdb82e6d1e 100644 --- a/barretenberg/cpp/src/barretenberg/relations/generated/avm/declare_views.hpp +++ b/barretenberg/cpp/src/barretenberg/relations/generated/avm/declare_views.hpp @@ -251,7 +251,6 @@ [[maybe_unused]] auto main_sel_rng_16 = View(new_term.main_sel_rng_16); \ [[maybe_unused]] auto main_sel_rng_8 = View(new_term.main_sel_rng_8); \ [[maybe_unused]] auto main_space_id = View(new_term.main_space_id); \ - [[maybe_unused]] auto main_table_pow_2 = View(new_term.main_table_pow_2); \ [[maybe_unused]] auto main_tag_err = View(new_term.main_tag_err); \ [[maybe_unused]] auto main_w_in_tag = View(new_term.main_w_in_tag); \ [[maybe_unused]] auto mem_addr = View(new_term.mem_addr); \ @@ -293,6 +292,7 @@ [[maybe_unused]] auto poseidon2_input = View(new_term.poseidon2_input); \ [[maybe_unused]] auto poseidon2_output = View(new_term.poseidon2_output); \ [[maybe_unused]] auto poseidon2_sel_poseidon_perm = View(new_term.poseidon2_sel_poseidon_perm); \ + [[maybe_unused]] auto powers_power_of_2 = View(new_term.powers_power_of_2); \ [[maybe_unused]] auto sha256_clk = View(new_term.sha256_clk); \ [[maybe_unused]] auto sha256_input = View(new_term.sha256_input); \ [[maybe_unused]] auto sha256_output = View(new_term.sha256_output); \ diff --git a/barretenberg/cpp/src/barretenberg/relations/generated/avm/gas.hpp b/barretenberg/cpp/src/barretenberg/relations/generated/avm/gas.hpp new file mode 100644 index 00000000000..a5e2adfe5a0 --- /dev/null +++ b/barretenberg/cpp/src/barretenberg/relations/generated/avm/gas.hpp @@ -0,0 +1,69 @@ + +#pragma once +#include "../../relation_parameters.hpp" +#include "../../relation_types.hpp" +#include "./declare_views.hpp" + +namespace bb::Avm_vm { + +template struct GasRow { + FF gas_da_gas_fixed_table{}; + FF gas_l2_gas_fixed_table{}; + FF gas_sel_gas_cost{}; + + [[maybe_unused]] static std::vector names(); +}; + +inline std::string get_relation_label_gas(int index) +{ + switch (index) {} + return std::to_string(index); +} + +template class gasImpl { + public: + using FF = FF_; + + static constexpr std::array SUBRELATION_PARTIAL_LENGTHS{ + 2, + 2, + 2, + }; + + template + void static accumulate(ContainerOverSubrelations& evals, + const AllEntities& new_term, + [[maybe_unused]] const RelationParameters&, + [[maybe_unused]] const FF& scaling_factor) + { + + // Contribution 0 + { + Avm_DECLARE_VIEWS(0); + + auto tmp = (gas_sel_gas_cost - gas_sel_gas_cost); + tmp *= scaling_factor; + std::get<0>(evals) += tmp; + } + // Contribution 1 + { + Avm_DECLARE_VIEWS(1); + + auto tmp = (gas_l2_gas_fixed_table - gas_l2_gas_fixed_table); + tmp *= scaling_factor; + std::get<1>(evals) += tmp; + } + // Contribution 2 + { + Avm_DECLARE_VIEWS(2); + + auto tmp = (gas_da_gas_fixed_table - gas_da_gas_fixed_table); + tmp *= scaling_factor; + std::get<2>(evals) += tmp; + } + } +}; + +template using gas = Relation>; + +} // namespace bb::Avm_vm \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/relations/generated/avm/lookup_pow_2_0.hpp b/barretenberg/cpp/src/barretenberg/relations/generated/avm/lookup_pow_2_0.hpp index b042e72cf58..7ec3d3283b1 100644 --- a/barretenberg/cpp/src/barretenberg/relations/generated/avm/lookup_pow_2_0.hpp +++ b/barretenberg/cpp/src/barretenberg/relations/generated/avm/lookup_pow_2_0.hpp @@ -140,7 +140,7 @@ class lookup_pow_2_0_lookup_settings { in.alu_ib, in.alu_two_pow_s, in.main_clk, - in.main_table_pow_2); + in.powers_power_of_2); } /** @@ -160,7 +160,7 @@ class lookup_pow_2_0_lookup_settings { in.alu_ib, in.alu_two_pow_s, in.main_clk, - in.main_table_pow_2); + in.powers_power_of_2); } }; diff --git a/barretenberg/cpp/src/barretenberg/relations/generated/avm/lookup_pow_2_1.hpp b/barretenberg/cpp/src/barretenberg/relations/generated/avm/lookup_pow_2_1.hpp index 0e3a413289c..4101469c97f 100644 --- a/barretenberg/cpp/src/barretenberg/relations/generated/avm/lookup_pow_2_1.hpp +++ b/barretenberg/cpp/src/barretenberg/relations/generated/avm/lookup_pow_2_1.hpp @@ -140,7 +140,7 @@ class lookup_pow_2_1_lookup_settings { in.alu_t_sub_s_bits, in.alu_two_pow_t_sub_s, in.main_clk, - in.main_table_pow_2); + in.powers_power_of_2); } /** @@ -160,7 +160,7 @@ class lookup_pow_2_1_lookup_settings { in.alu_t_sub_s_bits, in.alu_two_pow_t_sub_s, in.main_clk, - in.main_table_pow_2); + in.powers_power_of_2); } }; diff --git a/barretenberg/cpp/src/barretenberg/relations/generated/avm/powers.hpp b/barretenberg/cpp/src/barretenberg/relations/generated/avm/powers.hpp new file mode 100644 index 00000000000..dab82e6757e --- /dev/null +++ b/barretenberg/cpp/src/barretenberg/relations/generated/avm/powers.hpp @@ -0,0 +1,49 @@ + +#pragma once +#include "../../relation_parameters.hpp" +#include "../../relation_types.hpp" +#include "./declare_views.hpp" + +namespace bb::Avm_vm { + +template struct PowersRow { + FF powers_power_of_2{}; + + [[maybe_unused]] static std::vector names(); +}; + +inline std::string get_relation_label_powers(int index) +{ + switch (index) {} + return std::to_string(index); +} + +template class powersImpl { + public: + using FF = FF_; + + static constexpr std::array SUBRELATION_PARTIAL_LENGTHS{ + 2, + }; + + template + void static accumulate(ContainerOverSubrelations& evals, + const AllEntities& new_term, + [[maybe_unused]] const RelationParameters&, + [[maybe_unused]] const FF& scaling_factor) + { + + // Contribution 0 + { + Avm_DECLARE_VIEWS(0); + + auto tmp = (powers_power_of_2 - powers_power_of_2); + tmp *= scaling_factor; + std::get<0>(evals) += tmp; + } + } +}; + +template using powers = Relation>; + +} // namespace bb::Avm_vm \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/vm/avm_trace/avm_gas_trace.cpp b/barretenberg/cpp/src/barretenberg/vm/avm_trace/avm_gas_trace.cpp index 4c8bb0f9872..59b0c41d9ba 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm_trace/avm_gas_trace.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm_trace/avm_gas_trace.cpp @@ -1,5 +1,10 @@ #include "barretenberg/vm/avm_trace/avm_gas_trace.hpp" + +#include +#include + #include "barretenberg/vm/avm_trace/avm_opcode.hpp" +#include "barretenberg/vm/avm_trace/fixed_gas.hpp" namespace bb::avm_trace { @@ -39,8 +44,9 @@ void AvmGasTraceBuilder::constrain_gas_lookup(uint32_t clk, OpCode opcode) gas_opcode_lookup_counter[opcode]++; // Get the gas prices for this opcode - uint32_t l2_gas_cost = GAS_COST_TABLE.at(opcode).l2_fixed_gas_cost; - uint32_t da_gas_cost = GAS_COST_TABLE.at(opcode).da_fixed_gas_cost; + const auto& GAS_COST_TABLE = FixedGasTable::get(); + auto l2_gas_cost = static_cast(GAS_COST_TABLE.at(opcode).gas_l2_gas_fixed_table); + auto da_gas_cost = static_cast(GAS_COST_TABLE.at(opcode).gas_da_gas_fixed_table); remaining_l2_gas -= l2_gas_cost; remaining_da_gas -= da_gas_cost; @@ -69,8 +75,9 @@ void AvmGasTraceBuilder::constrain_gas_for_external_call(uint32_t clk, // gas_opcode_lookup_counter[opcode]++; // Get the gas prices for this opcode - uint32_t opcode_l2_gas_cost = GAS_COST_TABLE.at(opcode).l2_fixed_gas_cost; - uint32_t opcode_da_gas_cost = GAS_COST_TABLE.at(opcode).da_fixed_gas_cost; + const auto& GAS_COST_TABLE = FixedGasTable::get(); + auto opcode_l2_gas_cost = static_cast(GAS_COST_TABLE.at(opcode).gas_l2_gas_fixed_table); + auto opcode_da_gas_cost = static_cast(GAS_COST_TABLE.at(opcode).gas_da_gas_fixed_table); remaining_l2_gas -= opcode_l2_gas_cost + nested_l2_gas_cost; remaining_da_gas -= opcode_da_gas_cost + nested_da_gas_cost; diff --git a/barretenberg/cpp/src/barretenberg/vm/avm_trace/avm_gas_trace.hpp b/barretenberg/cpp/src/barretenberg/vm/avm_trace/avm_gas_trace.hpp index 8085321586b..1e5f226b55a 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm_trace/avm_gas_trace.hpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm_trace/avm_gas_trace.hpp @@ -1,120 +1,17 @@ +#pragma once + +#include + #include "barretenberg/vm/avm_trace/avm_common.hpp" #include "barretenberg/vm/avm_trace/avm_opcode.hpp" -#include namespace bb::avm_trace { -struct GasTableEntry { - uint32_t l2_fixed_gas_cost = 0; - uint32_t da_fixed_gas_cost = 0; -}; - -// Temporary values until the definitive gas cost values are settled. -// See TS counterpart constant TemporaryDefaultGasCost in avm_gas.ts -static const inline GasTableEntry temp_default_gas_entry{ .l2_fixed_gas_cost = 10, .da_fixed_gas_cost = 2 }; - -static const inline std::unordered_map GAS_COST_TABLE = { - // Compute - // Compute - Arithmetic - { OpCode::ADD, temp_default_gas_entry }, - { OpCode::SUB, temp_default_gas_entry }, - { OpCode::MUL, temp_default_gas_entry }, - { OpCode::DIV, temp_default_gas_entry }, - { OpCode::FDIV, temp_default_gas_entry }, - // Compute - Comparators - { OpCode::EQ, temp_default_gas_entry }, - { OpCode::LT, temp_default_gas_entry }, - { OpCode::LTE, temp_default_gas_entry }, - // Compute - Bitwise - { OpCode::AND, temp_default_gas_entry }, - { OpCode::OR, temp_default_gas_entry }, - { OpCode::XOR, temp_default_gas_entry }, - { OpCode::NOT, temp_default_gas_entry }, - { OpCode::SHL, temp_default_gas_entry }, - { OpCode::SHR, temp_default_gas_entry }, - // Compute - Type Conversions - { OpCode::CAST, temp_default_gas_entry }, - - // Execution Environment - { OpCode::ADDRESS, temp_default_gas_entry }, - { OpCode::STORAGEADDRESS, temp_default_gas_entry }, - { OpCode::SENDER, temp_default_gas_entry }, - { OpCode::FEEPERL2GAS, temp_default_gas_entry }, - { OpCode::FEEPERDAGAS, temp_default_gas_entry }, - { OpCode::TRANSACTIONFEE, temp_default_gas_entry }, - { OpCode::CONTRACTCALLDEPTH, temp_default_gas_entry }, - // Execution Environment - Globals - { OpCode::CHAINID, temp_default_gas_entry }, - { OpCode::VERSION, temp_default_gas_entry }, - { OpCode::BLOCKNUMBER, temp_default_gas_entry }, - { OpCode::TIMESTAMP, temp_default_gas_entry }, - { OpCode::COINBASE, temp_default_gas_entry }, - { OpCode::BLOCKL2GASLIMIT, temp_default_gas_entry }, - { OpCode::BLOCKDAGASLIMIT, temp_default_gas_entry }, - // Execution Environment - Calldata - { OpCode::CALLDATACOPY, temp_default_gas_entry }, - - // Machine State - // Machine State - Gas - { OpCode::L2GASLEFT, temp_default_gas_entry }, - { OpCode::DAGASLEFT, temp_default_gas_entry }, - // Machine State - Internal Control Flow - { OpCode::JUMP, temp_default_gas_entry }, - { OpCode::JUMPI, temp_default_gas_entry }, - { OpCode::INTERNALCALL, temp_default_gas_entry }, - { OpCode::INTERNALRETURN, temp_default_gas_entry }, - // Machine State - Memory - { OpCode::SET, temp_default_gas_entry }, - { OpCode::MOV, temp_default_gas_entry }, - { OpCode::CMOV, temp_default_gas_entry }, - - // World State - { OpCode::SLOAD, temp_default_gas_entry }, - { OpCode::SSTORE, temp_default_gas_entry }, - { OpCode::NOTEHASHEXISTS, temp_default_gas_entry }, - { OpCode::EMITNOTEHASH, temp_default_gas_entry }, - { OpCode::NULLIFIEREXISTS, temp_default_gas_entry }, - { OpCode::EMITNULLIFIER, temp_default_gas_entry }, - { OpCode::L1TOL2MSGEXISTS, temp_default_gas_entry }, - { OpCode::HEADERMEMBER, temp_default_gas_entry }, - { OpCode::GETCONTRACTINSTANCE, temp_default_gas_entry }, - - // Accrued Substate - { OpCode::EMITUNENCRYPTEDLOG, temp_default_gas_entry }, - { OpCode::SENDL2TOL1MSG, temp_default_gas_entry }, - - // Control Flow - Contract Calls - { OpCode::CALL, temp_default_gas_entry }, - { OpCode::STATICCALL, temp_default_gas_entry }, - { OpCode::DELEGATECALL, temp_default_gas_entry }, - { OpCode::RETURN, temp_default_gas_entry }, - { OpCode::REVERT, temp_default_gas_entry }, - - // Misc - { OpCode::DEBUGLOG, temp_default_gas_entry }, - - // Gadgets - { OpCode::KECCAK, temp_default_gas_entry }, - { OpCode::POSEIDON2, temp_default_gas_entry }, - { OpCode::SHA256, temp_default_gas_entry }, - { OpCode::PEDERSEN, temp_default_gas_entry }, - { OpCode::ECADD, temp_default_gas_entry }, - - // Conversions - { OpCode::TORADIXLE, temp_default_gas_entry }, - - // Future Gadgets -- pending changes in noir - { OpCode::SHA256COMPRESSION, temp_default_gas_entry }, - { OpCode::KECCAKF1600, temp_default_gas_entry }, // Here for when we eventually support this - // Sentinel - // LAST_OPCODE_SENTINEL, -}; - class AvmGasTraceBuilder { public: struct GasTraceEntry { uint32_t clk = 0; - OpCode opcode = OpCode::ADD; // 0 + OpCode opcode; uint32_t l2_gas_cost = 0; uint32_t da_gas_cost = 0; uint32_t remaining_l2_gas = 0; diff --git a/barretenberg/cpp/src/barretenberg/vm/avm_trace/avm_trace.cpp b/barretenberg/cpp/src/barretenberg/vm/avm_trace/avm_trace.cpp index 7799ceca628..ae472b6643d 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm_trace/avm_trace.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm_trace/avm_trace.cpp @@ -21,6 +21,8 @@ #include "barretenberg/vm/avm_trace/avm_helper.hpp" #include "barretenberg/vm/avm_trace/avm_opcode.hpp" #include "barretenberg/vm/avm_trace/avm_trace.hpp" +#include "barretenberg/vm/avm_trace/fixed_gas.hpp" +#include "barretenberg/vm/avm_trace/fixed_powers.hpp" namespace bb::avm_trace { @@ -3695,6 +3697,7 @@ std::vector AvmTraceBuilder::finalize(uint32_t min_trace_size, bool range_c auto pedersen_trace = pedersen_trace_builder.finalize(); auto bin_trace = bin_trace_builder.finalize(); auto gas_trace = gas_trace_builder.finalize(); + const auto& fixed_gas_table = FixedGasTable::get(); size_t mem_trace_size = mem_trace.size(); size_t main_trace_size = main_trace.size(); size_t alu_trace_size = alu_trace.size(); @@ -3716,11 +3719,11 @@ std::vector AvmTraceBuilder::finalize(uint32_t min_trace_size, bool range_c // 2**16 long) size_t const lookup_table_size = (bin_trace_size > 0 && range_check_required) ? 3 * (1 << 16) : 0; size_t const range_check_size = range_check_required ? UINT16_MAX + 1 : 0; - std::vector trace_sizes = { mem_trace_size, main_trace_size, alu_trace_size, - range_check_size, conv_trace_size, lookup_table_size, - sha256_trace_size, poseidon2_trace_size, pedersen_trace_size, - gas_trace_size + 1, KERNEL_INPUTS_LENGTH, KERNEL_OUTPUTS_LENGTH, - min_trace_size, GAS_COST_TABLE.size() }; + std::vector trace_sizes = { mem_trace_size, main_trace_size, alu_trace_size, + range_check_size, conv_trace_size, lookup_table_size, + sha256_trace_size, poseidon2_trace_size, pedersen_trace_size, + gas_trace_size + 1, KERNEL_INPUTS_LENGTH, KERNEL_OUTPUTS_LENGTH, + min_trace_size, fixed_gas_table.size() }; auto trace_size = std::max_element(trace_sizes.begin(), trace_sizes.end()); // We only need to pad with zeroes to the size to the largest trace here, pow_2 padding is handled in the @@ -4228,13 +4231,16 @@ std::vector AvmTraceBuilder::finalize(uint32_t min_trace_size, bool range_c r.incl_main_tag_err_counts = mem_trace_builder.m_tag_err_lookup_counts[static_cast(counter)]; if (counter <= UINT8_MAX) { - r.lookup_u8_0_counts = alu_trace_builder.u8_range_chk_counters[0][static_cast(counter)]; - r.lookup_u8_1_counts = alu_trace_builder.u8_range_chk_counters[1][static_cast(counter)]; - r.lookup_pow_2_0_counts = alu_trace_builder.u8_pow_2_counters[0][static_cast(counter)]; - r.lookup_pow_2_1_counts = alu_trace_builder.u8_pow_2_counters[1][static_cast(counter)]; - r.lookup_mem_rng_chk_hi_counts = mem_rng_check_hi_counts[static_cast(counter)]; + auto counter_u8 = static_cast(counter); + r.lookup_u8_0_counts = alu_trace_builder.u8_range_chk_counters[0][counter_u8]; + r.lookup_u8_1_counts = alu_trace_builder.u8_range_chk_counters[1][counter_u8]; + r.lookup_pow_2_0_counts = alu_trace_builder.u8_pow_2_counters[0][counter_u8]; + r.lookup_pow_2_1_counts = alu_trace_builder.u8_pow_2_counters[1][counter_u8]; + r.lookup_mem_rng_chk_hi_counts = mem_rng_check_hi_counts[counter_u8]; r.main_sel_rng_8 = FF(1); - r.main_table_pow_2 = uint256_t(1) << uint256_t(counter); + + // Also merge the powers of 2 table. + merge_into(r, FixedPowersTable::get().at(counter)); } if (counter <= UINT16_MAX) { @@ -4457,12 +4463,8 @@ std::vector AvmTraceBuilder::finalize(uint32_t min_trace_size, bool range_c // Add the gas costs table to the main trace // For each opcode we write its l2 gas cost and da gas cost - for (auto const& [opcode, gas_entry] : GAS_COST_TABLE) { - auto& dest = main_trace.at(static_cast(opcode)); - - dest.gas_sel_gas_cost = FF(1); - dest.gas_l2_gas_fixed_table = gas_entry.l2_fixed_gas_cost; - dest.gas_da_gas_fixed_table = gas_entry.da_fixed_gas_cost; + for (size_t i = 0; i < fixed_gas_table.size(); i++) { + merge_into(main_trace.at(i), fixed_gas_table.at(i)); } // Finalise gas left lookup counts diff --git a/barretenberg/cpp/src/barretenberg/vm/avm_trace/fixed_gas.cpp b/barretenberg/cpp/src/barretenberg/vm/avm_trace/fixed_gas.cpp new file mode 100644 index 00000000000..d27331a4811 --- /dev/null +++ b/barretenberg/cpp/src/barretenberg/vm/avm_trace/fixed_gas.cpp @@ -0,0 +1,23 @@ +#include "barretenberg/vm/avm_trace/fixed_gas.hpp" + +namespace bb::avm_trace { + +FixedGasTable::FixedGasTable() +{ + for (int i = 0; i < static_cast(OpCode::LAST_OPCODE_SENTINEL); i++) { + table_rows.push_back(GasRow{ + .gas_da_gas_fixed_table = FF(2), + .gas_l2_gas_fixed_table = FF(10), + .gas_sel_gas_cost = FF(1), + }); + } +} + +// Singleton. +const FixedGasTable& FixedGasTable::get() +{ + static FixedGasTable table; + return table; +} + +} // namespace bb::avm_trace \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/vm/avm_trace/fixed_gas.hpp b/barretenberg/cpp/src/barretenberg/vm/avm_trace/fixed_gas.hpp new file mode 100644 index 00000000000..15e7687c385 --- /dev/null +++ b/barretenberg/cpp/src/barretenberg/vm/avm_trace/fixed_gas.hpp @@ -0,0 +1,36 @@ +#pragma once + +#include +#include + +#include "barretenberg/ecc/curves/bn254/fr.hpp" +#include "barretenberg/relations/generated/avm/gas.hpp" +#include "barretenberg/vm/avm_trace/avm_common.hpp" +#include "barretenberg/vm/avm_trace/avm_opcode.hpp" + +namespace bb::avm_trace { + +class FixedGasTable { + public: + using GasRow = bb::Avm_vm::GasRow; + + static const FixedGasTable& get(); + + size_t size() const { return table_rows.size(); } + const GasRow& at(size_t i) const { return table_rows.at(i); } + const GasRow& at(OpCode o) const { return at(static_cast(o)); } + + private: + FixedGasTable(); + + std::vector table_rows; +}; + +template void merge_into(DestRow& dest, FixedGasTable::GasRow const& src) +{ + dest.gas_sel_gas_cost = src.gas_sel_gas_cost; + dest.gas_l2_gas_fixed_table = src.gas_l2_gas_fixed_table; + dest.gas_da_gas_fixed_table = src.gas_da_gas_fixed_table; +} + +} // namespace bb::avm_trace \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/vm/avm_trace/fixed_powers.cpp b/barretenberg/cpp/src/barretenberg/vm/avm_trace/fixed_powers.cpp new file mode 100644 index 00000000000..6ef8b8b4248 --- /dev/null +++ b/barretenberg/cpp/src/barretenberg/vm/avm_trace/fixed_powers.cpp @@ -0,0 +1,25 @@ +#include "barretenberg/vm/avm_trace/fixed_powers.hpp" + +#include + +#include "barretenberg/numeric/uint256/uint256.hpp" + +namespace bb::avm_trace { + +FixedPowersTable::FixedPowersTable() +{ + for (uint64_t i = 0; i < 256; i++) { + table_rows.push_back(PowersRow{ + .powers_power_of_2 = FF(uint256_t(1) << uint256_t(i)), + }); + } +} + +// Singleton. +const FixedPowersTable& FixedPowersTable::get() +{ + static FixedPowersTable table; + return table; +} + +} // namespace bb::avm_trace \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/vm/avm_trace/fixed_powers.hpp b/barretenberg/cpp/src/barretenberg/vm/avm_trace/fixed_powers.hpp new file mode 100644 index 00000000000..d19a1d81ecc --- /dev/null +++ b/barretenberg/cpp/src/barretenberg/vm/avm_trace/fixed_powers.hpp @@ -0,0 +1,32 @@ +#pragma once + +#include +#include + +#include "barretenberg/ecc/curves/bn254/fr.hpp" +#include "barretenberg/relations/generated/avm/powers.hpp" +#include "barretenberg/vm/avm_trace/avm_common.hpp" + +namespace bb::avm_trace { + +class FixedPowersTable { + public: + using PowersRow = bb::Avm_vm::PowersRow; + + static const FixedPowersTable& get(); + + size_t size() const { return table_rows.size(); } + const PowersRow& at(size_t i) const { return table_rows.at(i); } + + private: + FixedPowersTable(); + + std::vector table_rows; +}; + +template void merge_into(DestRow& dest, FixedPowersTable::PowersRow const& src) +{ + dest.powers_power_of_2 = src.powers_power_of_2; +} + +} // namespace bb::avm_trace \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/vm/generated/avm_circuit_builder.cpp b/barretenberg/cpp/src/barretenberg/vm/generated/avm_circuit_builder.cpp index 7d58df8071a..448bf350a0e 100644 --- a/barretenberg/cpp/src/barretenberg/vm/generated/avm_circuit_builder.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/generated/avm_circuit_builder.cpp @@ -261,7 +261,6 @@ template std::vector AvmFullRow::names() "main_sel_rng_16", "main_sel_rng_8", "main_space_id", - "main_table_pow_2", "main_tag_err", "main_w_in_tag", "mem_addr", @@ -303,6 +302,7 @@ template std::vector AvmFullRow::names() "poseidon2_input", "poseidon2_output", "poseidon2_sel_poseidon_perm", + "powers_power_of_2", "sha256_clk", "sha256_input", "sha256_output", @@ -541,38 +541,38 @@ template std::ostream& operator<<(std::ostream& os, AvmFullRow << field_to_string(row.main_sel_resolve_ind_addr_c) << "," << field_to_string(row.main_sel_resolve_ind_addr_d) << "," << field_to_string(row.main_sel_rng_16) << "," << field_to_string(row.main_sel_rng_8) << "," << field_to_string(row.main_space_id) << "," - << field_to_string(row.main_table_pow_2) << "," << field_to_string(row.main_tag_err) << "," - << field_to_string(row.main_w_in_tag) << "," << field_to_string(row.mem_addr) << "," - << field_to_string(row.mem_clk) << "," << field_to_string(row.mem_diff_hi) << "," - << field_to_string(row.mem_diff_lo) << "," << field_to_string(row.mem_diff_mid) << "," - << field_to_string(row.mem_glob_addr) << "," << field_to_string(row.mem_last) << "," - << field_to_string(row.mem_lastAccess) << "," << field_to_string(row.mem_one_min_inv) << "," - << field_to_string(row.mem_r_in_tag) << "," << field_to_string(row.mem_rw) << "," - << field_to_string(row.mem_sel_mem) << "," << field_to_string(row.mem_sel_mov_ia_to_ic) << "," - << field_to_string(row.mem_sel_mov_ib_to_ic) << "," << field_to_string(row.mem_sel_op_a) << "," - << field_to_string(row.mem_sel_op_b) << "," << field_to_string(row.mem_sel_op_c) << "," - << field_to_string(row.mem_sel_op_cmov) << "," << field_to_string(row.mem_sel_op_d) << "," - << field_to_string(row.mem_sel_resolve_ind_addr_a) << "," << field_to_string(row.mem_sel_resolve_ind_addr_b) - << "," << field_to_string(row.mem_sel_resolve_ind_addr_c) << "," - << field_to_string(row.mem_sel_resolve_ind_addr_d) << "," << field_to_string(row.mem_sel_rng_chk) << "," - << field_to_string(row.mem_skip_check_tag) << "," << field_to_string(row.mem_space_id) << "," + << field_to_string(row.main_tag_err) << "," << field_to_string(row.main_w_in_tag) << "," + << field_to_string(row.mem_addr) << "," << field_to_string(row.mem_clk) << "," + << field_to_string(row.mem_diff_hi) << "," << field_to_string(row.mem_diff_lo) << "," + << field_to_string(row.mem_diff_mid) << "," << field_to_string(row.mem_glob_addr) << "," + << field_to_string(row.mem_last) << "," << field_to_string(row.mem_lastAccess) << "," + << field_to_string(row.mem_one_min_inv) << "," << field_to_string(row.mem_r_in_tag) << "," + << field_to_string(row.mem_rw) << "," << field_to_string(row.mem_sel_mem) << "," + << field_to_string(row.mem_sel_mov_ia_to_ic) << "," << field_to_string(row.mem_sel_mov_ib_to_ic) << "," + << field_to_string(row.mem_sel_op_a) << "," << field_to_string(row.mem_sel_op_b) << "," + << field_to_string(row.mem_sel_op_c) << "," << field_to_string(row.mem_sel_op_cmov) << "," + << field_to_string(row.mem_sel_op_d) << "," << field_to_string(row.mem_sel_resolve_ind_addr_a) << "," + << field_to_string(row.mem_sel_resolve_ind_addr_b) << "," << field_to_string(row.mem_sel_resolve_ind_addr_c) + << "," << field_to_string(row.mem_sel_resolve_ind_addr_d) << "," << field_to_string(row.mem_sel_rng_chk) + << "," << field_to_string(row.mem_skip_check_tag) << "," << field_to_string(row.mem_space_id) << "," << field_to_string(row.mem_tag) << "," << field_to_string(row.mem_tag_err) << "," << field_to_string(row.mem_tsp) << "," << field_to_string(row.mem_val) << "," << field_to_string(row.mem_w_in_tag) << "," << field_to_string(row.pedersen_clk) << "," << field_to_string(row.pedersen_input) << "," << field_to_string(row.pedersen_output) << "," << field_to_string(row.pedersen_sel_pedersen) << "," << field_to_string(row.poseidon2_clk) << "," << field_to_string(row.poseidon2_input) << "," << field_to_string(row.poseidon2_output) << "," - << field_to_string(row.poseidon2_sel_poseidon_perm) << "," << field_to_string(row.sha256_clk) << "," - << field_to_string(row.sha256_input) << "," << field_to_string(row.sha256_output) << "," - << field_to_string(row.sha256_sel_sha256_compression) << "," << field_to_string(row.sha256_state) << "," - << field_to_string(row.perm_main_alu) << "," << field_to_string(row.perm_main_bin) << "," - << field_to_string(row.perm_main_conv) << "," << field_to_string(row.perm_main_pos2_perm) << "," - << field_to_string(row.perm_main_pedersen) << "," << field_to_string(row.perm_main_mem_a) << "," - << field_to_string(row.perm_main_mem_b) << "," << field_to_string(row.perm_main_mem_c) << "," - << field_to_string(row.perm_main_mem_d) << "," << field_to_string(row.perm_main_mem_ind_addr_a) << "," - << field_to_string(row.perm_main_mem_ind_addr_b) << "," << field_to_string(row.perm_main_mem_ind_addr_c) - << "," << field_to_string(row.perm_main_mem_ind_addr_d) << "," << field_to_string(row.lookup_byte_lengths) - << "," << field_to_string(row.lookup_byte_operations) << "," << field_to_string(row.lookup_opcode_gas) << "," + << field_to_string(row.poseidon2_sel_poseidon_perm) << "," << field_to_string(row.powers_power_of_2) << "," + << field_to_string(row.sha256_clk) << "," << field_to_string(row.sha256_input) << "," + << field_to_string(row.sha256_output) << "," << field_to_string(row.sha256_sel_sha256_compression) << "," + << field_to_string(row.sha256_state) << "," << field_to_string(row.perm_main_alu) << "," + << field_to_string(row.perm_main_bin) << "," << field_to_string(row.perm_main_conv) << "," + << field_to_string(row.perm_main_pos2_perm) << "," << field_to_string(row.perm_main_pedersen) << "," + << field_to_string(row.perm_main_mem_a) << "," << field_to_string(row.perm_main_mem_b) << "," + << field_to_string(row.perm_main_mem_c) << "," << field_to_string(row.perm_main_mem_d) << "," + << field_to_string(row.perm_main_mem_ind_addr_a) << "," << field_to_string(row.perm_main_mem_ind_addr_b) + << "," << field_to_string(row.perm_main_mem_ind_addr_c) << "," + << field_to_string(row.perm_main_mem_ind_addr_d) << "," << field_to_string(row.lookup_byte_lengths) << "," + << field_to_string(row.lookup_byte_operations) << "," << field_to_string(row.lookup_opcode_gas) << "," << field_to_string(row.range_check_l2_gas_hi) << "," << field_to_string(row.range_check_l2_gas_lo) << "," << field_to_string(row.range_check_da_gas_hi) << "," << field_to_string(row.range_check_da_gas_lo) << "," << field_to_string(row.kernel_output_lookup) << "," << field_to_string(row.lookup_into_kernel) << "," diff --git a/barretenberg/cpp/src/barretenberg/vm/generated/avm_circuit_builder.hpp b/barretenberg/cpp/src/barretenberg/vm/generated/avm_circuit_builder.hpp index b8f8a107901..9bbe9334c85 100644 --- a/barretenberg/cpp/src/barretenberg/vm/generated/avm_circuit_builder.hpp +++ b/barretenberg/cpp/src/barretenberg/vm/generated/avm_circuit_builder.hpp @@ -19,6 +19,7 @@ #include "barretenberg/relations/generated/avm/alu.hpp" #include "barretenberg/relations/generated/avm/binary.hpp" #include "barretenberg/relations/generated/avm/conversion.hpp" +#include "barretenberg/relations/generated/avm/gas.hpp" #include "barretenberg/relations/generated/avm/incl_main_tag_err.hpp" #include "barretenberg/relations/generated/avm/incl_mem_tag_err.hpp" #include "barretenberg/relations/generated/avm/keccakf1600.hpp" @@ -75,6 +76,7 @@ #include "barretenberg/relations/generated/avm/perm_main_pedersen.hpp" #include "barretenberg/relations/generated/avm/perm_main_pos2_perm.hpp" #include "barretenberg/relations/generated/avm/poseidon2.hpp" +#include "barretenberg/relations/generated/avm/powers.hpp" #include "barretenberg/relations/generated/avm/range_check_da_gas_hi.hpp" #include "barretenberg/relations/generated/avm/range_check_da_gas_lo.hpp" #include "barretenberg/relations/generated/avm/range_check_l2_gas_hi.hpp" @@ -328,7 +330,6 @@ template struct AvmFullRow { FF main_sel_rng_16{}; FF main_sel_rng_8{}; FF main_space_id{}; - FF main_table_pow_2{}; FF main_tag_err{}; FF main_w_in_tag{}; FF mem_addr{}; @@ -370,6 +371,7 @@ template struct AvmFullRow { FF poseidon2_input{}; FF poseidon2_output{}; FF poseidon2_sel_poseidon_perm{}; + FF powers_power_of_2{}; FF sha256_clk{}; FF sha256_input{}; FF sha256_output{}; @@ -812,7 +814,6 @@ class AvmCircuitBuilder { polys.main_sel_rng_16[i] = rows[i].main_sel_rng_16; polys.main_sel_rng_8[i] = rows[i].main_sel_rng_8; polys.main_space_id[i] = rows[i].main_space_id; - polys.main_table_pow_2[i] = rows[i].main_table_pow_2; polys.main_tag_err[i] = rows[i].main_tag_err; polys.main_w_in_tag[i] = rows[i].main_w_in_tag; polys.mem_addr[i] = rows[i].mem_addr; @@ -854,6 +855,7 @@ class AvmCircuitBuilder { polys.poseidon2_input[i] = rows[i].poseidon2_input; polys.poseidon2_output[i] = rows[i].poseidon2_output; polys.poseidon2_sel_poseidon_perm[i] = rows[i].poseidon2_sel_poseidon_perm; + polys.powers_power_of_2[i] = rows[i].powers_power_of_2; polys.sha256_clk[i] = rows[i].sha256_clk; polys.sha256_input[i] = rows[i].sha256_input; polys.sha256_output[i] = rows[i].sha256_output; @@ -1058,6 +1060,10 @@ class AvmCircuitBuilder { Avm_vm::get_relation_label_conversion); }; + auto gas = [=]() { + return evaluate_relation.template operator()>("gas", Avm_vm::get_relation_label_gas); + }; + auto keccakf1600 = [=]() { return evaluate_relation.template operator()>( "keccakf1600", Avm_vm::get_relation_label_keccakf1600); @@ -1086,6 +1092,11 @@ class AvmCircuitBuilder { Avm_vm::get_relation_label_poseidon2); }; + auto powers = [=]() { + return evaluate_relation.template operator()>("powers", + Avm_vm::get_relation_label_powers); + }; + auto sha256 = [=]() { return evaluate_relation.template operator()>("sha256", Avm_vm::get_relation_label_sha256); @@ -1331,6 +1342,8 @@ class AvmCircuitBuilder { relation_futures.emplace_back(std::async(std::launch::async, conversion)); + relation_futures.emplace_back(std::async(std::launch::async, gas)); + relation_futures.emplace_back(std::async(std::launch::async, keccakf1600)); relation_futures.emplace_back(std::async(std::launch::async, kernel)); @@ -1343,6 +1356,8 @@ class AvmCircuitBuilder { relation_futures.emplace_back(std::async(std::launch::async, poseidon2)); + relation_futures.emplace_back(std::async(std::launch::async, powers)); + relation_futures.emplace_back(std::async(std::launch::async, sha256)); relation_futures.emplace_back(std::async(std::launch::async, perm_main_alu)); @@ -1468,6 +1483,8 @@ class AvmCircuitBuilder { conversion(); + gas(); + keccakf1600(); kernel(); @@ -1480,6 +1497,8 @@ class AvmCircuitBuilder { poseidon2(); + powers(); + sha256(); perm_main_alu(); diff --git a/barretenberg/cpp/src/barretenberg/vm/generated/avm_flavor.hpp b/barretenberg/cpp/src/barretenberg/vm/generated/avm_flavor.hpp index 283812ece0f..e5729066c00 100644 --- a/barretenberg/cpp/src/barretenberg/vm/generated/avm_flavor.hpp +++ b/barretenberg/cpp/src/barretenberg/vm/generated/avm_flavor.hpp @@ -16,6 +16,7 @@ #include "barretenberg/relations/generated/avm/alu.hpp" #include "barretenberg/relations/generated/avm/binary.hpp" #include "barretenberg/relations/generated/avm/conversion.hpp" +#include "barretenberg/relations/generated/avm/gas.hpp" #include "barretenberg/relations/generated/avm/incl_main_tag_err.hpp" #include "barretenberg/relations/generated/avm/incl_mem_tag_err.hpp" #include "barretenberg/relations/generated/avm/keccakf1600.hpp" @@ -72,6 +73,7 @@ #include "barretenberg/relations/generated/avm/perm_main_pedersen.hpp" #include "barretenberg/relations/generated/avm/perm_main_pos2_perm.hpp" #include "barretenberg/relations/generated/avm/poseidon2.hpp" +#include "barretenberg/relations/generated/avm/powers.hpp" #include "barretenberg/relations/generated/avm/range_check_da_gas_hi.hpp" #include "barretenberg/relations/generated/avm/range_check_da_gas_lo.hpp" #include "barretenberg/relations/generated/avm/range_check_l2_gas_hi.hpp" @@ -162,12 +164,14 @@ class AvmFlavor { using Relations = std::tuple, Avm_vm::binary, Avm_vm::conversion, + Avm_vm::gas, Avm_vm::keccakf1600, Avm_vm::kernel, Avm_vm::main, Avm_vm::mem, Avm_vm::pedersen, Avm_vm::poseidon2, + Avm_vm::powers, Avm_vm::sha256, perm_main_alu_relation, perm_main_bin_relation, @@ -497,7 +501,6 @@ class AvmFlavor { main_sel_rng_16, main_sel_rng_8, main_space_id, - main_table_pow_2, main_tag_err, main_w_in_tag, mem_addr, @@ -539,6 +542,7 @@ class AvmFlavor { poseidon2_input, poseidon2_output, poseidon2_sel_poseidon_perm, + powers_power_of_2, sha256_clk, sha256_input, sha256_output, @@ -883,7 +887,6 @@ class AvmFlavor { main_sel_rng_16, main_sel_rng_8, main_space_id, - main_table_pow_2, main_tag_err, main_w_in_tag, mem_addr, @@ -925,6 +928,7 @@ class AvmFlavor { poseidon2_input, poseidon2_output, poseidon2_sel_poseidon_perm, + powers_power_of_2, sha256_clk, sha256_input, sha256_output, @@ -1274,7 +1278,6 @@ class AvmFlavor { main_sel_rng_16, main_sel_rng_8, main_space_id, - main_table_pow_2, main_tag_err, main_w_in_tag, mem_addr, @@ -1316,6 +1319,7 @@ class AvmFlavor { poseidon2_input, poseidon2_output, poseidon2_sel_poseidon_perm, + powers_power_of_2, sha256_clk, sha256_input, sha256_output, @@ -1727,7 +1731,6 @@ class AvmFlavor { main_sel_rng_16, main_sel_rng_8, main_space_id, - main_table_pow_2, main_tag_err, main_w_in_tag, mem_addr, @@ -1769,6 +1772,7 @@ class AvmFlavor { poseidon2_input, poseidon2_output, poseidon2_sel_poseidon_perm, + powers_power_of_2, sha256_clk, sha256_input, sha256_output, @@ -2180,7 +2184,6 @@ class AvmFlavor { main_sel_rng_16, main_sel_rng_8, main_space_id, - main_table_pow_2, main_tag_err, main_w_in_tag, mem_addr, @@ -2222,6 +2225,7 @@ class AvmFlavor { poseidon2_input, poseidon2_output, poseidon2_sel_poseidon_perm, + powers_power_of_2, sha256_clk, sha256_input, sha256_output, @@ -2989,7 +2993,6 @@ class AvmFlavor { Base::main_sel_rng_16 = "MAIN_SEL_RNG_16"; Base::main_sel_rng_8 = "MAIN_SEL_RNG_8"; Base::main_space_id = "MAIN_SPACE_ID"; - Base::main_table_pow_2 = "MAIN_TABLE_POW_2"; Base::main_tag_err = "MAIN_TAG_ERR"; Base::main_w_in_tag = "MAIN_W_IN_TAG"; Base::mem_addr = "MEM_ADDR"; @@ -3031,6 +3034,7 @@ class AvmFlavor { Base::poseidon2_input = "POSEIDON2_INPUT"; Base::poseidon2_output = "POSEIDON2_OUTPUT"; Base::poseidon2_sel_poseidon_perm = "POSEIDON2_SEL_POSEIDON_PERM"; + Base::powers_power_of_2 = "POWERS_POWER_OF_2"; Base::sha256_clk = "SHA256_CLK"; Base::sha256_input = "SHA256_INPUT"; Base::sha256_output = "SHA256_OUTPUT"; @@ -3391,7 +3395,6 @@ class AvmFlavor { Commitment main_sel_rng_16; Commitment main_sel_rng_8; Commitment main_space_id; - Commitment main_table_pow_2; Commitment main_tag_err; Commitment main_w_in_tag; Commitment mem_addr; @@ -3433,6 +3436,7 @@ class AvmFlavor { Commitment poseidon2_input; Commitment poseidon2_output; Commitment poseidon2_sel_poseidon_perm; + Commitment powers_power_of_2; Commitment sha256_clk; Commitment sha256_input; Commitment sha256_output; @@ -3805,7 +3809,6 @@ class AvmFlavor { main_sel_rng_16 = deserialize_from_buffer(Transcript::proof_data, num_frs_read); main_sel_rng_8 = deserialize_from_buffer(Transcript::proof_data, num_frs_read); main_space_id = deserialize_from_buffer(Transcript::proof_data, num_frs_read); - main_table_pow_2 = deserialize_from_buffer(Transcript::proof_data, num_frs_read); main_tag_err = deserialize_from_buffer(Transcript::proof_data, num_frs_read); main_w_in_tag = deserialize_from_buffer(Transcript::proof_data, num_frs_read); mem_addr = deserialize_from_buffer(Transcript::proof_data, num_frs_read); @@ -3847,6 +3850,7 @@ class AvmFlavor { poseidon2_input = deserialize_from_buffer(Transcript::proof_data, num_frs_read); poseidon2_output = deserialize_from_buffer(Transcript::proof_data, num_frs_read); poseidon2_sel_poseidon_perm = deserialize_from_buffer(Transcript::proof_data, num_frs_read); + powers_power_of_2 = deserialize_from_buffer(Transcript::proof_data, num_frs_read); sha256_clk = deserialize_from_buffer(Transcript::proof_data, num_frs_read); sha256_input = deserialize_from_buffer(Transcript::proof_data, num_frs_read); sha256_output = deserialize_from_buffer(Transcript::proof_data, num_frs_read); @@ -4211,7 +4215,6 @@ class AvmFlavor { serialize_to_buffer(main_sel_rng_16, Transcript::proof_data); serialize_to_buffer(main_sel_rng_8, Transcript::proof_data); serialize_to_buffer(main_space_id, Transcript::proof_data); - serialize_to_buffer(main_table_pow_2, Transcript::proof_data); serialize_to_buffer(main_tag_err, Transcript::proof_data); serialize_to_buffer(main_w_in_tag, Transcript::proof_data); serialize_to_buffer(mem_addr, Transcript::proof_data); @@ -4253,6 +4256,7 @@ class AvmFlavor { serialize_to_buffer(poseidon2_input, Transcript::proof_data); serialize_to_buffer(poseidon2_output, Transcript::proof_data); serialize_to_buffer(poseidon2_sel_poseidon_perm, Transcript::proof_data); + serialize_to_buffer(powers_power_of_2, Transcript::proof_data); serialize_to_buffer(sha256_clk, Transcript::proof_data); serialize_to_buffer(sha256_input, Transcript::proof_data); serialize_to_buffer(sha256_output, Transcript::proof_data); diff --git a/barretenberg/cpp/src/barretenberg/vm/generated/avm_prover.cpp b/barretenberg/cpp/src/barretenberg/vm/generated/avm_prover.cpp index df045145c6c..ca3af5db56f 100644 --- a/barretenberg/cpp/src/barretenberg/vm/generated/avm_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/generated/avm_prover.cpp @@ -312,7 +312,6 @@ void AvmProver::execute_wire_commitments_round() witness_commitments.main_sel_rng_16 = commitment_key->commit(key->main_sel_rng_16); witness_commitments.main_sel_rng_8 = commitment_key->commit(key->main_sel_rng_8); witness_commitments.main_space_id = commitment_key->commit(key->main_space_id); - witness_commitments.main_table_pow_2 = commitment_key->commit(key->main_table_pow_2); witness_commitments.main_tag_err = commitment_key->commit(key->main_tag_err); witness_commitments.main_w_in_tag = commitment_key->commit(key->main_w_in_tag); witness_commitments.mem_addr = commitment_key->commit(key->mem_addr); @@ -354,6 +353,7 @@ void AvmProver::execute_wire_commitments_round() witness_commitments.poseidon2_input = commitment_key->commit(key->poseidon2_input); witness_commitments.poseidon2_output = commitment_key->commit(key->poseidon2_output); witness_commitments.poseidon2_sel_poseidon_perm = commitment_key->commit(key->poseidon2_sel_poseidon_perm); + witness_commitments.powers_power_of_2 = commitment_key->commit(key->powers_power_of_2); witness_commitments.sha256_clk = commitment_key->commit(key->sha256_clk); witness_commitments.sha256_input = commitment_key->commit(key->sha256_input); witness_commitments.sha256_output = commitment_key->commit(key->sha256_output); @@ -694,7 +694,6 @@ void AvmProver::execute_wire_commitments_round() transcript->send_to_verifier(commitment_labels.main_sel_rng_16, witness_commitments.main_sel_rng_16); transcript->send_to_verifier(commitment_labels.main_sel_rng_8, witness_commitments.main_sel_rng_8); transcript->send_to_verifier(commitment_labels.main_space_id, witness_commitments.main_space_id); - transcript->send_to_verifier(commitment_labels.main_table_pow_2, witness_commitments.main_table_pow_2); transcript->send_to_verifier(commitment_labels.main_tag_err, witness_commitments.main_tag_err); transcript->send_to_verifier(commitment_labels.main_w_in_tag, witness_commitments.main_w_in_tag); transcript->send_to_verifier(commitment_labels.mem_addr, witness_commitments.mem_addr); @@ -741,6 +740,7 @@ void AvmProver::execute_wire_commitments_round() transcript->send_to_verifier(commitment_labels.poseidon2_output, witness_commitments.poseidon2_output); transcript->send_to_verifier(commitment_labels.poseidon2_sel_poseidon_perm, witness_commitments.poseidon2_sel_poseidon_perm); + transcript->send_to_verifier(commitment_labels.powers_power_of_2, witness_commitments.powers_power_of_2); transcript->send_to_verifier(commitment_labels.sha256_clk, witness_commitments.sha256_clk); transcript->send_to_verifier(commitment_labels.sha256_input, witness_commitments.sha256_input); transcript->send_to_verifier(commitment_labels.sha256_output, witness_commitments.sha256_output); diff --git a/barretenberg/cpp/src/barretenberg/vm/generated/avm_verifier.cpp b/barretenberg/cpp/src/barretenberg/vm/generated/avm_verifier.cpp index 24a8b6c6f0b..5fe89bc3d48 100644 --- a/barretenberg/cpp/src/barretenberg/vm/generated/avm_verifier.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/generated/avm_verifier.cpp @@ -452,8 +452,6 @@ bool AvmVerifier::verify_proof(const HonkProof& proof, const std::vectortemplate receive_from_prover(commitment_labels.main_sel_rng_16); commitments.main_sel_rng_8 = transcript->template receive_from_prover(commitment_labels.main_sel_rng_8); commitments.main_space_id = transcript->template receive_from_prover(commitment_labels.main_space_id); - commitments.main_table_pow_2 = - transcript->template receive_from_prover(commitment_labels.main_table_pow_2); commitments.main_tag_err = transcript->template receive_from_prover(commitment_labels.main_tag_err); commitments.main_w_in_tag = transcript->template receive_from_prover(commitment_labels.main_w_in_tag); commitments.mem_addr = transcript->template receive_from_prover(commitment_labels.mem_addr); @@ -510,6 +508,8 @@ bool AvmVerifier::verify_proof(const HonkProof& proof, const std::vectortemplate receive_from_prover(commitment_labels.poseidon2_output); commitments.poseidon2_sel_poseidon_perm = transcript->template receive_from_prover(commitment_labels.poseidon2_sel_poseidon_perm); + commitments.powers_power_of_2 = + transcript->template receive_from_prover(commitment_labels.powers_power_of_2); commitments.sha256_clk = transcript->template receive_from_prover(commitment_labels.sha256_clk); commitments.sha256_input = transcript->template receive_from_prover(commitment_labels.sha256_input); commitments.sha256_output = transcript->template receive_from_prover(commitment_labels.sha256_output); diff --git a/barretenberg/cpp/src/barretenberg/vm/tests/avm_arithmetic.test.cpp b/barretenberg/cpp/src/barretenberg/vm/tests/avm_arithmetic.test.cpp index 0db934ed1ed..fa7c78ab02f 100644 --- a/barretenberg/cpp/src/barretenberg/vm/tests/avm_arithmetic.test.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/tests/avm_arithmetic.test.cpp @@ -205,20 +205,15 @@ size_t common_validate_div(std::vector const& trace, class AvmArithmeticTests : public ::testing::Test { public: - AvmTraceBuilder trace_builder; - VmPublicInputs public_inputs{}; - - protected: - // TODO(640): The Standard Honk on Grumpkin test suite fails unless the SRS is initialised for every test. - void SetUp() override + AvmArithmeticTests() + : public_inputs(generate_base_public_inputs()) + , trace_builder(AvmTraceBuilder(public_inputs)) { srs::init_crs_factory("../srs_db/ignition"); - std::array kernel_inputs{}; - kernel_inputs.at(DA_GAS_LEFT_CONTEXT_INPUTS_OFFSET) = DEFAULT_INITIAL_DA_GAS; - kernel_inputs.at(L2_GAS_LEFT_CONTEXT_INPUTS_OFFSET) = DEFAULT_INITIAL_L2_GAS; - std::get<0>(public_inputs) = kernel_inputs; - trace_builder = AvmTraceBuilder(public_inputs); - }; + } + + VmPublicInputs public_inputs; + AvmTraceBuilder trace_builder; // Generate a trace with an EQ opcode operation. std::vector gen_trace_eq(uint128_t const& a, @@ -1877,7 +1872,7 @@ TEST_F(AvmArithmeticNegativeTestsFF, fDivisionWrongWInTag) // Test that error flag cannot be raised for a non-relevant operation such as // the addition, subtraction, multiplication. -TEST_F(AvmArithmeticNegativeTestsFF, operationWithErrorFlag) +TEST_F(AvmArithmeticNegativeTestsFF, operationWithErrorFlag1) { trace_builder.calldata_copy(0, 0, 3, 0, std::vector{ 37, 4, 11 }); @@ -1894,35 +1889,37 @@ TEST_F(AvmArithmeticNegativeTestsFF, operationWithErrorFlag) row->main_op_err = FF(1); EXPECT_THROW_WITH_MESSAGE(validate_trace_check_circuit(std::move(trace)), "SUBOP_ERROR_RELEVANT_OP"); +} - trace_builder = AvmTraceBuilder(public_inputs); - +TEST_F(AvmArithmeticNegativeTestsFF, operationWithErrorFlag2) +{ trace_builder.calldata_copy(0, 0, 3, 0, std::vector{ 8, 4, 17 }); // Memory layout: [8,4,17,0,0,0,....] trace_builder.op_sub(0, 2, 0, 1, AvmMemoryTag::FF); // [8,9,17,0,0,0....] trace_builder.return_op(0, 0, 3); - trace = trace_builder.finalize(); + auto trace = trace_builder.finalize(); // Find the first row enabling the subtraction selector - row = std::ranges::find_if(trace.begin(), trace.end(), [](Row r) { return r.main_sel_op_sub == FF(1); }); + auto row = std::ranges::find_if(trace.begin(), trace.end(), [](Row r) { return r.main_sel_op_sub == FF(1); }); // Activate the operator error row->main_op_err = FF(1); EXPECT_THROW_WITH_MESSAGE(validate_trace_check_circuit(std::move(trace)), "SUBOP_ERROR_RELEVANT_OP"); +} - trace_builder = AvmTraceBuilder(public_inputs); - +TEST_F(AvmArithmeticNegativeTestsFF, operationWithErrorFlag3) +{ trace_builder.calldata_copy(0, 0, 3, 0, std::vector{ 5, 0, 20 }); // Memory layout: [5,0,20,0,0,0,....] trace_builder.op_mul(0, 2, 0, 1, AvmMemoryTag::FF); // [5,100,20,0,0,0....] trace_builder.return_op(0, 0, 3); - trace = trace_builder.finalize(); + auto trace = trace_builder.finalize(); // Find the first row enabling the multiplication selector - row = std::ranges::find_if(trace.begin(), trace.end(), [](Row r) { return r.main_sel_op_mul == FF(1); }); + auto row = std::ranges::find_if(trace.begin(), trace.end(), [](Row r) { return r.main_sel_op_mul == FF(1); }); // Activate the operator error row->main_op_err = FF(1); diff --git a/barretenberg/cpp/src/barretenberg/vm/tests/avm_bitwise.test.cpp b/barretenberg/cpp/src/barretenberg/vm/tests/avm_bitwise.test.cpp index ff1c4168616..482d397cbcc 100644 --- a/barretenberg/cpp/src/barretenberg/vm/tests/avm_bitwise.test.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/tests/avm_bitwise.test.cpp @@ -346,20 +346,15 @@ std::vector gen_mutated_trace_bit(std::vector trace, class AvmBitwiseTests : public ::testing::Test { public: - AvmTraceBuilder trace_builder; - VmPublicInputs public_inputs{}; - - protected: - // TODO(640): The Standard Honk on Grumpkin test suite fails unless the SRS is initialised for every test. - void SetUp() override + AvmBitwiseTests() + : public_inputs(generate_base_public_inputs()) + , trace_builder(AvmTraceBuilder(public_inputs)) { srs::init_crs_factory("../srs_db/ignition"); - std::array kernel_inputs{}; - kernel_inputs.at(DA_GAS_LEFT_CONTEXT_INPUTS_OFFSET) = DEFAULT_INITIAL_DA_GAS; - kernel_inputs.at(L2_GAS_LEFT_CONTEXT_INPUTS_OFFSET) = DEFAULT_INITIAL_L2_GAS; - std::get<0>(public_inputs) = kernel_inputs; - trace_builder = AvmTraceBuilder(public_inputs); - }; + } + + VmPublicInputs public_inputs; + AvmTraceBuilder trace_builder; std::vector gen_mutated_trace_not(FF const& a, FF const& c_mutated, avm_trace::AvmMemoryTag tag) { diff --git a/barretenberg/cpp/src/barretenberg/vm/tests/avm_cast.test.cpp b/barretenberg/cpp/src/barretenberg/vm/tests/avm_cast.test.cpp index 040a1937688..446215b1ec0 100644 --- a/barretenberg/cpp/src/barretenberg/vm/tests/avm_cast.test.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/tests/avm_cast.test.cpp @@ -13,25 +13,22 @@ using namespace bb::avm_trace; using namespace testing; class AvmCastTests : public ::testing::Test { - protected: - VmPublicInputs public_inputs{}; + public: + AvmCastTests() + : public_inputs(generate_base_public_inputs()) + , trace_builder(AvmTraceBuilder(public_inputs)) + { + srs::init_crs_factory("../srs_db/ignition"); + } + + VmPublicInputs public_inputs; AvmTraceBuilder trace_builder; + std::vector trace; size_t main_addr; size_t alu_addr; size_t mem_addr_c; - // TODO(640): The Standard Honk on Grumpkin test suite fails unless the SRS is initialised for every test. - void SetUp() override - { - srs::init_crs_factory("../srs_db/ignition"); - std::array kernel_inputs{}; - kernel_inputs.at(DA_GAS_LEFT_CONTEXT_INPUTS_OFFSET) = DEFAULT_INITIAL_DA_GAS; - kernel_inputs.at(L2_GAS_LEFT_CONTEXT_INPUTS_OFFSET) = DEFAULT_INITIAL_L2_GAS; - std::get<0>(public_inputs) = kernel_inputs; - trace_builder = AvmTraceBuilder(public_inputs); - }; - void gen_trace( uint128_t const& a, uint32_t src_address, uint32_t dst_address, AvmMemoryTag src_tag, AvmMemoryTag dst_tag) { diff --git a/barretenberg/cpp/src/barretenberg/vm/tests/avm_comparison.test.cpp b/barretenberg/cpp/src/barretenberg/vm/tests/avm_comparison.test.cpp index 38b028306f7..0f0f4ebac52 100644 --- a/barretenberg/cpp/src/barretenberg/vm/tests/avm_comparison.test.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/tests/avm_comparison.test.cpp @@ -80,23 +80,20 @@ std::vector positive_op_lte_test_values = { std::vector mem_tag_arr{ { AvmMemoryTag::U8, AvmMemoryTag::U16, AvmMemoryTag::U32, AvmMemoryTag::U64, AvmMemoryTag::U128 } }; + class AvmCmpTests : public ::testing::Test { public: - AvmTraceBuilder trace_builder; - VmPublicInputs public_inputs{}; - - protected: - // TODO(640): The Standard Honk on Grumpkin test suite fails unless the SRS is initialised for every test. - void SetUp() override + AvmCmpTests() + : public_inputs(generate_base_public_inputs()) + , trace_builder(AvmTraceBuilder(public_inputs)) { srs::init_crs_factory("../srs_db/ignition"); - std::array kernel_inputs{}; - kernel_inputs.at(DA_GAS_LEFT_CONTEXT_INPUTS_OFFSET) = DEFAULT_INITIAL_DA_GAS; - kernel_inputs.at(L2_GAS_LEFT_CONTEXT_INPUTS_OFFSET) = DEFAULT_INITIAL_L2_GAS; - std::get<0>(public_inputs) = kernel_inputs; - trace_builder = AvmTraceBuilder(public_inputs); - }; + } + + VmPublicInputs public_inputs; + AvmTraceBuilder trace_builder; }; + class AvmCmpTestsLT : public AvmCmpTests, public testing::WithParamInterface {}; class AvmCmpTestsLTE : public AvmCmpTests, public testing::WithParamInterface {}; diff --git a/barretenberg/cpp/src/barretenberg/vm/tests/avm_control_flow.test.cpp b/barretenberg/cpp/src/barretenberg/vm/tests/avm_control_flow.test.cpp index eb2b13781d1..616bdd5f126 100644 --- a/barretenberg/cpp/src/barretenberg/vm/tests/avm_control_flow.test.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/tests/avm_control_flow.test.cpp @@ -38,20 +38,15 @@ void validate_internal_return(Row const& row, uint32_t current_pc, uint32_t retu class AvmControlFlowTests : public ::testing::Test { public: - AvmTraceBuilder trace_builder; - VmPublicInputs public_inputs{}; - - protected: - // TODO(640): The Standard Honk on Grumpkin test suite fails unless the SRS is initialised for every test. - void SetUp() override + AvmControlFlowTests() + : public_inputs(generate_base_public_inputs()) + , trace_builder(AvmTraceBuilder(public_inputs)) { srs::init_crs_factory("../srs_db/ignition"); - std::array kernel_inputs{}; - kernel_inputs.at(DA_GAS_LEFT_CONTEXT_INPUTS_OFFSET) = DEFAULT_INITIAL_DA_GAS; - kernel_inputs.at(L2_GAS_LEFT_CONTEXT_INPUTS_OFFSET) = DEFAULT_INITIAL_L2_GAS; - std::get<0>(public_inputs) = kernel_inputs; - trace_builder = AvmTraceBuilder(public_inputs); - }; + } + + VmPublicInputs public_inputs; + AvmTraceBuilder trace_builder; }; /****************************************************************************** diff --git a/barretenberg/cpp/src/barretenberg/vm/tests/avm_execution.test.cpp b/barretenberg/cpp/src/barretenberg/vm/tests/avm_execution.test.cpp index dc18269ae45..10f971f1f70 100644 --- a/barretenberg/cpp/src/barretenberg/vm/tests/avm_execution.test.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/tests/avm_execution.test.cpp @@ -1,4 +1,9 @@ #include "barretenberg/vm/avm_trace/avm_execution.hpp" + +#include +#include +#include + #include "avm_common.test.hpp" #include "barretenberg/common/serialize.hpp" #include "barretenberg/common/utils.hpp" @@ -7,11 +12,10 @@ #include "barretenberg/vm/avm_trace/avm_kernel_trace.hpp" #include "barretenberg/vm/avm_trace/avm_opcode.hpp" #include "barretenberg/vm/avm_trace/aztec_constants.hpp" -#include -#include -#include +#include "barretenberg/vm/avm_trace/fixed_gas.hpp" namespace tests_avm { + using namespace bb; using namespace bb::avm_trace; using namespace testing; @@ -27,6 +31,8 @@ class AvmExecutionTests : public ::testing::Test { : public_inputs_vec(PUBLIC_CIRCUIT_PUBLIC_INPUTS_LENGTH){}; protected: + const FixedGasTable& GAS_COST_TABLE = FixedGasTable::get(); + // TODO(640): The Standard Honk on Grumpkin test suite fails unless the SRS is initialised for every test. void SetUp() override { @@ -1551,8 +1557,9 @@ TEST_F(AvmExecutionTests, l2GasLeft) // Find the first row enabling the L2GASLEFT selector auto row = std::ranges::find_if(trace.begin(), trace.end(), [](Row r) { return r.main_sel_op_l2gasleft == 1; }); - uint32_t expected_rem_gas = DEFAULT_INITIAL_L2_GAS - GAS_COST_TABLE.at(OpCode::SET).l2_fixed_gas_cost - - GAS_COST_TABLE.at(OpCode::L2GASLEFT).l2_fixed_gas_cost; + uint32_t expected_rem_gas = DEFAULT_INITIAL_L2_GAS - + static_cast(GAS_COST_TABLE.at(OpCode::SET).gas_l2_gas_fixed_table) - + static_cast(GAS_COST_TABLE.at(OpCode::L2GASLEFT).gas_l2_gas_fixed_table); EXPECT_EQ(row->main_ia, expected_rem_gas); EXPECT_EQ(row->main_mem_addr_a, 257); // Resolved direct address: 257 @@ -1592,8 +1599,9 @@ TEST_F(AvmExecutionTests, daGasLeft) // Find the first row enabling the DAGASLEFT selector auto row = std::ranges::find_if(trace.begin(), trace.end(), [](Row r) { return r.main_sel_op_dagasleft == 1; }); - uint32_t expected_rem_gas = DEFAULT_INITIAL_DA_GAS - GAS_COST_TABLE.at(OpCode::ADD).da_fixed_gas_cost - - GAS_COST_TABLE.at(OpCode::DAGASLEFT).da_fixed_gas_cost; + uint32_t expected_rem_gas = DEFAULT_INITIAL_DA_GAS - + static_cast(GAS_COST_TABLE.at(OpCode::ADD).gas_da_gas_fixed_table) - + static_cast(GAS_COST_TABLE.at(OpCode::DAGASLEFT).gas_da_gas_fixed_table); EXPECT_EQ(row->main_ia, expected_rem_gas); EXPECT_EQ(row->main_mem_addr_a, 39); diff --git a/barretenberg/cpp/src/barretenberg/vm/tests/avm_gas.test.cpp b/barretenberg/cpp/src/barretenberg/vm/tests/avm_gas.test.cpp index 75ebab12270..2666bb40e01 100644 --- a/barretenberg/cpp/src/barretenberg/vm/tests/avm_gas.test.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/tests/avm_gas.test.cpp @@ -9,7 +9,6 @@ using namespace bb; using namespace bb::avm_trace; class AvmGasTests : public ::testing::Test { - protected: // TODO(640): The Standard Honk on Grumpkin test suite fails unless the SRS is initialised for every test. void SetUp() override { srs::init_crs_factory("../srs_db/ignition"); }; @@ -34,7 +33,7 @@ void test_gas(StartGas startGas, OpcodesFunc apply_opcodes, CheckFunc check_trac kernel_inputs[L2_GAS_LEFT_CONTEXT_INPUTS_OFFSET] = FF(startGas.l2_gas); kernel_inputs[DA_GAS_LEFT_CONTEXT_INPUTS_OFFSET] = FF(startGas.da_gas); - VmPublicInputs public_inputs{}; + VmPublicInputs public_inputs; std::get<0>(public_inputs) = kernel_inputs; AvmTraceBuilder trace_builder(public_inputs); diff --git a/barretenberg/cpp/src/barretenberg/vm/tests/avm_indirect_mem.test.cpp b/barretenberg/cpp/src/barretenberg/vm/tests/avm_indirect_mem.test.cpp index d75c53f49eb..f4592476924 100644 --- a/barretenberg/cpp/src/barretenberg/vm/tests/avm_indirect_mem.test.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/tests/avm_indirect_mem.test.cpp @@ -7,20 +7,15 @@ using namespace bb::avm_trace; class AvmIndirectMemTests : public ::testing::Test { public: - AvmTraceBuilder trace_builder; - VmPublicInputs public_inputs{}; - - protected: - // TODO(640): The Standard Honk on Grumpkin test suite fails unless the SRS is initialised for every test. - void SetUp() override + AvmIndirectMemTests() + : public_inputs(generate_base_public_inputs()) + , trace_builder(AvmTraceBuilder(public_inputs)) { srs::init_crs_factory("../srs_db/ignition"); - std::array kernel_inputs{}; - kernel_inputs.at(DA_GAS_LEFT_CONTEXT_INPUTS_OFFSET) = DEFAULT_INITIAL_DA_GAS; - kernel_inputs.at(L2_GAS_LEFT_CONTEXT_INPUTS_OFFSET) = DEFAULT_INITIAL_L2_GAS; - std::get<0>(public_inputs) = kernel_inputs; - trace_builder = AvmTraceBuilder(public_inputs); - }; + } + + VmPublicInputs public_inputs; + AvmTraceBuilder trace_builder; }; /****************************************************************************** diff --git a/barretenberg/cpp/src/barretenberg/vm/tests/avm_inter_table.test.cpp b/barretenberg/cpp/src/barretenberg/vm/tests/avm_inter_table.test.cpp index 9a4855892e5..098dbb0c181 100644 --- a/barretenberg/cpp/src/barretenberg/vm/tests/avm_inter_table.test.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/tests/avm_inter_table.test.cpp @@ -14,20 +14,15 @@ using namespace bb::avm_trace; class AvmInterTableTests : public ::testing::Test { public: - AvmTraceBuilder trace_builder; - VmPublicInputs public_inputs{}; - - protected: - // TODO(640): The Standard Honk on Grumpkin test suite fails unless the SRS is initialised for every test. - void SetUp() override + AvmInterTableTests() + : public_inputs(generate_base_public_inputs()) + , trace_builder(AvmTraceBuilder(public_inputs)) { srs::init_crs_factory("../srs_db/ignition"); - std::array kernel_inputs{}; - kernel_inputs.at(DA_GAS_LEFT_CONTEXT_INPUTS_OFFSET) = DEFAULT_INITIAL_DA_GAS; - kernel_inputs.at(L2_GAS_LEFT_CONTEXT_INPUTS_OFFSET) = DEFAULT_INITIAL_L2_GAS; - std::get<0>(public_inputs) = kernel_inputs; - trace_builder = AvmTraceBuilder(public_inputs); - }; + } + + VmPublicInputs public_inputs; + AvmTraceBuilder trace_builder; }; /****************************************************************************** diff --git a/barretenberg/cpp/src/barretenberg/vm/tests/avm_kernel.test.cpp b/barretenberg/cpp/src/barretenberg/vm/tests/avm_kernel.test.cpp index 96ec0edc085..786902dc110 100644 --- a/barretenberg/cpp/src/barretenberg/vm/tests/avm_kernel.test.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/tests/avm_kernel.test.cpp @@ -12,7 +12,6 @@ using namespace bb; using namespace bb::avm_trace; class AvmKernelTests : public ::testing::Test { - protected: // TODO(640): The Standard Honk on Grumpkin test suite fails unless the SRS is initialised for every test. void SetUp() override { srs::init_crs_factory("../srs_db/ignition"); }; diff --git a/barretenberg/cpp/src/barretenberg/vm/tests/avm_mem_opcodes.test.cpp b/barretenberg/cpp/src/barretenberg/vm/tests/avm_mem_opcodes.test.cpp index 102d00a57ca..71bfcbbe39e 100644 --- a/barretenberg/cpp/src/barretenberg/vm/tests/avm_mem_opcodes.test.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/tests/avm_mem_opcodes.test.cpp @@ -17,8 +17,15 @@ using namespace testing; class AvmMemOpcodeTests : public ::testing::Test { public: + AvmMemOpcodeTests() + : public_inputs(generate_base_public_inputs()) + , trace_builder(AvmTraceBuilder(public_inputs)) + { + srs::init_crs_factory("../srs_db/ignition"); + } + + VmPublicInputs public_inputs; AvmTraceBuilder trace_builder; - VmPublicInputs public_inputs{}; protected: std::vector trace; @@ -32,17 +39,6 @@ class AvmMemOpcodeTests : public ::testing::Test { size_t mem_ind_c_addr; size_t mem_ind_d_addr; - // TODO(640): The Standard Honk on Grumpkin test suite fails unless the SRS is initialised for every test. - void SetUp() override - { - srs::init_crs_factory("../srs_db/ignition"); - std::array kernel_inputs{}; - kernel_inputs.at(DA_GAS_LEFT_CONTEXT_INPUTS_OFFSET) = DEFAULT_INITIAL_DA_GAS; - kernel_inputs.at(L2_GAS_LEFT_CONTEXT_INPUTS_OFFSET) = DEFAULT_INITIAL_L2_GAS; - std::get<0>(public_inputs) = kernel_inputs; - trace_builder = AvmTraceBuilder(public_inputs); - }; - void build_mov_trace(bool indirect, uint128_t const& val, uint32_t src_offset, diff --git a/barretenberg/cpp/src/barretenberg/vm/tests/avm_memory.test.cpp b/barretenberg/cpp/src/barretenberg/vm/tests/avm_memory.test.cpp index 38428559194..5dcfe52e0df 100644 --- a/barretenberg/cpp/src/barretenberg/vm/tests/avm_memory.test.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/tests/avm_memory.test.cpp @@ -2,25 +2,21 @@ #include "barretenberg/vm/avm_trace/avm_common.hpp" namespace tests_avm { + using namespace bb; using namespace bb::avm_trace; class AvmMemoryTests : public ::testing::Test { public: - AvmTraceBuilder trace_builder; - VmPublicInputs public_inputs{}; - - protected: - // TODO(640): The Standard Honk on Grumpkin test suite fails unless the SRS is initialised for every test. - void SetUp() override + AvmMemoryTests() + : public_inputs(generate_base_public_inputs()) + , trace_builder(AvmTraceBuilder(public_inputs)) { srs::init_crs_factory("../srs_db/ignition"); - std::array kernel_inputs{}; - kernel_inputs.at(DA_GAS_LEFT_CONTEXT_INPUTS_OFFSET) = DEFAULT_INITIAL_DA_GAS; - kernel_inputs.at(L2_GAS_LEFT_CONTEXT_INPUTS_OFFSET) = DEFAULT_INITIAL_L2_GAS; - std::get<0>(public_inputs) = kernel_inputs; - trace_builder = AvmTraceBuilder(public_inputs); - }; + } + + VmPublicInputs public_inputs; + AvmTraceBuilder trace_builder; }; /****************************************************************************** diff --git a/barretenberg/cpp/src/barretenberg/vm/tests/helpers.test.cpp b/barretenberg/cpp/src/barretenberg/vm/tests/helpers.test.cpp index 8d31f30ce9a..1657ba8ce0d 100644 --- a/barretenberg/cpp/src/barretenberg/vm/tests/helpers.test.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/tests/helpers.test.cpp @@ -5,8 +5,8 @@ #include "barretenberg/vm/generated/avm_flavor.hpp" #include -using namespace bb; namespace tests_avm { + using namespace bb; std::vector gen_three_op_params(std::vector operands, @@ -241,4 +241,14 @@ void clear_range_check_counters(std::vector& trace, uint256_t previous_valu previous_value >>= 16; } +VmPublicInputs generate_base_public_inputs() +{ + VmPublicInputs public_inputs; + std::array kernel_inputs{}; + kernel_inputs.at(DA_GAS_LEFT_CONTEXT_INPUTS_OFFSET) = DEFAULT_INITIAL_DA_GAS; + kernel_inputs.at(L2_GAS_LEFT_CONTEXT_INPUTS_OFFSET) = DEFAULT_INITIAL_L2_GAS; + std::get<0>(public_inputs) = kernel_inputs; + return public_inputs; +} + } // namespace tests_avm diff --git a/barretenberg/cpp/src/barretenberg/vm/tests/helpers.test.hpp b/barretenberg/cpp/src/barretenberg/vm/tests/helpers.test.hpp index c3c665f3490..0dcf6381502 100644 --- a/barretenberg/cpp/src/barretenberg/vm/tests/helpers.test.hpp +++ b/barretenberg/cpp/src/barretenberg/vm/tests/helpers.test.hpp @@ -41,4 +41,6 @@ void update_slice_registers(Row& row, uint256_t a); std::vector gen_three_op_params(std::vector> operands, std::vector mem_tags); +VmPublicInputs generate_base_public_inputs(); + } // namespace tests_avm