From 045081779e8e8a703f592dd77d434b81fbcd859a Mon Sep 17 00:00:00 2001 From: ledwards2225 Date: Wed, 21 Feb 2024 14:26:25 +0000 Subject: [PATCH 01/28] express conventional gates as block in builders --- .../goblin_ultra_circuit_builder.hpp | 12 +-- .../goblin_ultra_circuit_builder.test.cpp | 2 +- .../standard_circuit_builder.hpp | 42 ++++----- .../circuit_builder/ultra_circuit_builder.cpp | 70 +++++++------- .../circuit_builder/ultra_circuit_builder.hpp | 92 ++++++++++--------- .../execution_trace/execution_trace.cpp | 3 +- 6 files changed, 111 insertions(+), 110 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/goblin_ultra_circuit_builder.hpp b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/goblin_ultra_circuit_builder.hpp index 22e707f5b35..2f3bbf8d22b 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/goblin_ultra_circuit_builder.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/goblin_ultra_circuit_builder.hpp @@ -45,13 +45,13 @@ template class GoblinUltraCircuitBuilder_ : public UltraCircuitBui const WireVector& ecc_op_wire_3() const { return std::get<2>(ecc_op_block.wires); }; const WireVector& ecc_op_wire_4() const { return std::get<3>(ecc_op_block.wires); }; - SelectorVector& q_busread() { return this->selectors.q_busread(); }; - SelectorVector& q_poseidon2_external() { return this->selectors.q_poseidon2_external(); }; - SelectorVector& q_poseidon2_internal() { return this->selectors.q_poseidon2_internal(); }; + SelectorVector& q_busread() { return this->main_block.selectors.q_busread(); }; + SelectorVector& q_poseidon2_external() { return this->main_block.selectors.q_poseidon2_external(); }; + SelectorVector& q_poseidon2_internal() { return this->main_block.selectors.q_poseidon2_internal(); }; - const SelectorVector& q_busread() const { return this->selectors.q_busread(); }; - const SelectorVector& q_poseidon2_external() const { return this->selectors.q_poseidon2_external(); }; - const SelectorVector& q_poseidon2_internal() const { return this->selectors.q_poseidon2_internal(); }; + const SelectorVector& q_busread() const { return this->main_block.selectors.q_busread(); }; + const SelectorVector& q_poseidon2_external() const { return this->main_block.selectors.q_poseidon2_external(); }; + const SelectorVector& q_poseidon2_internal() const { return this->main_block.selectors.q_poseidon2_internal(); }; // DataBus call/return data arrays std::vector public_calldata; diff --git a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/goblin_ultra_circuit_builder.test.cpp b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/goblin_ultra_circuit_builder.test.cpp index 766686501ae..eee04247c8c 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/goblin_ultra_circuit_builder.test.cpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/goblin_ultra_circuit_builder.test.cpp @@ -45,7 +45,7 @@ TEST(GoblinUltraCircuitBuilder, CopyConstructor) GoblinUltraCircuitBuilder duplicate_circuit_constructor{ circuit_constructor }; EXPECT_EQ(duplicate_circuit_constructor.get_num_gates(), circuit_constructor.get_num_gates()); - EXPECT_EQ(duplicate_circuit_constructor.selectors.get(), circuit_constructor.selectors.get()); + // EXPECT_EQ(duplicate_circuit_constructor.get_selectors(), circuit_constructor.get_selectors()); EXPECT_TRUE(duplicate_circuit_constructor.check_circuit()); } diff --git a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/standard_circuit_builder.hpp b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/standard_circuit_builder.hpp index 77c3e87e94a..656f2fde878 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/standard_circuit_builder.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/standard_circuit_builder.hpp @@ -1,6 +1,7 @@ #pragma once #include "barretenberg/ecc/curves/bn254/bn254.hpp" #include "barretenberg/ecc/curves/grumpkin/grumpkin.hpp" +#include "barretenberg/proof_system/execution_trace/execution_trace.hpp" #include "barretenberg/proof_system/types/circuit_type.hpp" #include "barretenberg/proof_system/types/merkle_hash_type.hpp" #include "barretenberg/proof_system/types/pedersen_commitment_type.hpp" @@ -12,6 +13,7 @@ namespace bb { template class StandardCircuitBuilder_ : public CircuitBuilderBase { public: using Arithmetization = StandardArith; + using TraceBlock = ExecutionTraceBlock; using Selectors = Arithmetization; static constexpr size_t NUM_WIRES = Arithmetization::NUM_WIRES; // Keeping NUM_WIRES, at least temporarily, for backward compatibility @@ -24,31 +26,30 @@ template class StandardCircuitBuilder_ : public CircuitBuilderBase static constexpr merkle::HashType merkle_hash_type = merkle::HashType::FIXED_BASE_PEDERSEN; static constexpr pedersen::CommitmentType commitment_type = pedersen::CommitmentType::FIXED_BASE_PEDERSEN; - std::array>, NUM_WIRES> wires; - Arithmetization selectors; + TraceBlock main_block; using WireVector = std::vector>; using SelectorVector = std::vector>; - WireVector& w_l() { return std::get<0>(wires); }; - WireVector& w_r() { return std::get<1>(wires); }; - WireVector& w_o() { return std::get<2>(wires); }; + WireVector& w_l() { return std::get<0>(main_block.wires); }; + WireVector& w_r() { return std::get<1>(main_block.wires); }; + WireVector& w_o() { return std::get<2>(main_block.wires); }; - const WireVector& w_l() const { return std::get<0>(wires); }; - const WireVector& w_r() const { return std::get<1>(wires); }; - const WireVector& w_o() const { return std::get<2>(wires); }; + const WireVector& w_l() const { return std::get<0>(main_block.wires); }; + const WireVector& w_r() const { return std::get<1>(main_block.wires); }; + const WireVector& w_o() const { return std::get<2>(main_block.wires); }; - SelectorVector& q_m() { return this->selectors.q_m(); }; - SelectorVector& q_1() { return this->selectors.q_1(); }; - SelectorVector& q_2() { return this->selectors.q_2(); }; - SelectorVector& q_3() { return this->selectors.q_3(); }; - SelectorVector& q_c() { return this->selectors.q_c(); }; + SelectorVector& q_m() { return main_block.selectors.q_m(); }; + SelectorVector& q_1() { return main_block.selectors.q_1(); }; + SelectorVector& q_2() { return main_block.selectors.q_2(); }; + SelectorVector& q_3() { return main_block.selectors.q_3(); }; + SelectorVector& q_c() { return main_block.selectors.q_c(); }; - const SelectorVector& q_m() const { return this->selectors.q_m(); }; - const SelectorVector& q_1() const { return this->selectors.q_1(); }; - const SelectorVector& q_2() const { return this->selectors.q_2(); }; - const SelectorVector& q_3() const { return this->selectors.q_3(); }; - const SelectorVector& q_c() const { return this->selectors.q_c(); }; + const SelectorVector& q_m() const { return main_block.selectors.q_m(); }; + const SelectorVector& q_1() const { return main_block.selectors.q_1(); }; + const SelectorVector& q_2() const { return main_block.selectors.q_2(); }; + const SelectorVector& q_3() const { return main_block.selectors.q_3(); }; + const SelectorVector& q_c() const { return main_block.selectors.q_c(); }; static constexpr size_t UINT_LOG2_BASE = 2; @@ -60,7 +61,7 @@ template class StandardCircuitBuilder_ : public CircuitBuilderBase StandardCircuitBuilder_(const size_t size_hint = 0) : CircuitBuilderBase(size_hint) { - selectors.reserve(size_hint); + main_block.selectors.reserve(size_hint); w_l().reserve(size_hint); w_r().reserve(size_hint); w_o().reserve(size_hint); @@ -82,8 +83,7 @@ template class StandardCircuitBuilder_ : public CircuitBuilderBase { CircuitBuilderBase::operator=(std::move(other)); constant_variable_indices = other.constant_variable_indices; - wires = other.wires; - selectors = other.selectors; + main_block = other.main_block; return *this; }; ~StandardCircuitBuilder_() override = default; diff --git a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.cpp b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.cpp index 21aa754edfe..9cb0d5d2bb5 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.cpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.cpp @@ -78,7 +78,7 @@ void UltraCircuitBuilder_::add_gates_to_ensure_all_polys_are_no q_elliptic().emplace_back(1); q_aux().emplace_back(1); if constexpr (HasAdditionalSelectors) { - selectors.pad_additional(); + main_block.selectors.pad_additional(); } check_selector_length_consistency(); ++this->num_gates; @@ -141,7 +141,7 @@ void UltraCircuitBuilder_::create_add_gate(const add_triple_) { - selectors.pad_additional(); + main_block.selectors.pad_additional(); } check_selector_length_consistency(); ++this->num_gates; @@ -176,7 +176,7 @@ void UltraCircuitBuilder_::create_big_add_gate(const add_quad_< q_elliptic().emplace_back(0); q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { - selectors.pad_additional(); + main_block.selectors.pad_additional(); } check_selector_length_consistency(); ++this->num_gates; @@ -273,7 +273,7 @@ void UltraCircuitBuilder_::create_big_mul_gate(const mul_quad_< q_elliptic().emplace_back(0); q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { - selectors.pad_additional(); + main_block.selectors.pad_additional(); } check_selector_length_consistency(); ++this->num_gates; @@ -302,7 +302,7 @@ void UltraCircuitBuilder_::create_balanced_add_gate(const add_q q_elliptic().emplace_back(0); q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { - selectors.pad_additional(); + main_block.selectors.pad_additional(); } check_selector_length_consistency(); ++this->num_gates; @@ -347,7 +347,7 @@ void UltraCircuitBuilder_::create_mul_gate(const mul_triple_) { - selectors.pad_additional(); + main_block.selectors.pad_additional(); } check_selector_length_consistency(); ++this->num_gates; @@ -379,7 +379,7 @@ void UltraCircuitBuilder_::create_bool_gate(const uint32_t vari q_elliptic().emplace_back(0); q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { - selectors.pad_additional(); + main_block.selectors.pad_additional(); } check_selector_length_consistency(); ++this->num_gates; @@ -413,7 +413,7 @@ void UltraCircuitBuilder_::create_poly_gate(const poly_triple_< q_elliptic().emplace_back(0); q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { - selectors.pad_additional(); + main_block.selectors.pad_additional(); } check_selector_length_consistency(); ++this->num_gates; @@ -470,7 +470,7 @@ void UltraCircuitBuilder_::create_ecc_add_gate(const ecc_add_ga q_elliptic().emplace_back(1); q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { - selectors.pad_additional(); + main_block.selectors.pad_additional(); } check_selector_length_consistency(); ++this->num_gates; @@ -491,7 +491,7 @@ void UltraCircuitBuilder_::create_ecc_add_gate(const ecc_add_ga q_elliptic().emplace_back(0); q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { - selectors.pad_additional(); + main_block.selectors.pad_additional(); } check_selector_length_consistency(); ++this->num_gates; @@ -540,7 +540,7 @@ void UltraCircuitBuilder_::create_ecc_dbl_gate(const ecc_dbl_ga q_lookup_type().emplace_back(0); q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { - selectors.pad_additional(); + main_block.selectors.pad_additional(); } check_selector_length_consistency(); ++this->num_gates; @@ -562,7 +562,7 @@ void UltraCircuitBuilder_::create_ecc_dbl_gate(const ecc_dbl_ga q_elliptic().emplace_back(0); q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { - selectors.pad_additional(); + main_block.selectors.pad_additional(); } check_selector_length_consistency(); ++this->num_gates; @@ -595,7 +595,7 @@ void UltraCircuitBuilder_::fix_witness(const uint32_t witness_i q_elliptic().emplace_back(0); q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { - selectors.pad_additional(); + main_block.selectors.pad_additional(); } check_selector_length_consistency(); ++this->num_gates; @@ -673,7 +673,7 @@ plookup::ReadData UltraCircuitBuilder_::create_gates_ q_elliptic().emplace_back(0); q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { - selectors.pad_additional(); + main_block.selectors.pad_additional(); } check_selector_length_consistency(); ++this->num_gates; @@ -985,7 +985,7 @@ void UltraCircuitBuilder_::create_sort_constraint(const std::ve q_lookup_type().emplace_back(0); q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { - selectors.pad_additional(); + main_block.selectors.pad_additional(); } check_selector_length_consistency(); } @@ -1007,7 +1007,7 @@ void UltraCircuitBuilder_::create_sort_constraint(const std::ve q_lookup_type().emplace_back(0); q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { - selectors.pad_additional(); + main_block.selectors.pad_additional(); } check_selector_length_consistency(); } @@ -1044,7 +1044,7 @@ void UltraCircuitBuilder_::create_dummy_constraints(const std:: q_lookup_type().emplace_back(0); q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { - selectors.pad_additional(); + main_block.selectors.pad_additional(); } check_selector_length_consistency(); } @@ -1078,7 +1078,7 @@ void UltraCircuitBuilder_::create_sort_constraint_with_edges( q_lookup_type().emplace_back(0); q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { - selectors.pad_additional(); + main_block.selectors.pad_additional(); } check_selector_length_consistency(); // enforce range check for middle rows @@ -1101,7 +1101,7 @@ void UltraCircuitBuilder_::create_sort_constraint_with_edges( q_lookup_type().emplace_back(0); q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { - selectors.pad_additional(); + main_block.selectors.pad_additional(); } check_selector_length_consistency(); } @@ -1124,7 +1124,7 @@ void UltraCircuitBuilder_::create_sort_constraint_with_edges( q_lookup_type().emplace_back(0); q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { - selectors.pad_additional(); + main_block.selectors.pad_additional(); } check_selector_length_consistency(); } @@ -1148,7 +1148,7 @@ void UltraCircuitBuilder_::create_sort_constraint_with_edges( q_lookup_type().emplace_back(0); q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { - selectors.pad_additional(); + main_block.selectors.pad_additional(); } check_selector_length_consistency(); } @@ -1267,7 +1267,7 @@ void UltraCircuitBuilder_::apply_aux_selectors(const AUX_SELECT q_c().emplace_back(0); q_arith().emplace_back(0); if constexpr (HasAdditionalSelectors) { - selectors.pad_additional(); + main_block.selectors.pad_additional(); } check_selector_length_consistency(); break; @@ -1281,7 +1281,7 @@ void UltraCircuitBuilder_::apply_aux_selectors(const AUX_SELECT q_c().emplace_back(0); q_arith().emplace_back(0); if constexpr (HasAdditionalSelectors) { - selectors.pad_additional(); + main_block.selectors.pad_additional(); } check_selector_length_consistency(); break; @@ -1295,7 +1295,7 @@ void UltraCircuitBuilder_::apply_aux_selectors(const AUX_SELECT q_c().emplace_back(0); q_arith().emplace_back(0); if constexpr (HasAdditionalSelectors) { - selectors.pad_additional(); + main_block.selectors.pad_additional(); } check_selector_length_consistency(); break; @@ -1309,7 +1309,7 @@ void UltraCircuitBuilder_::apply_aux_selectors(const AUX_SELECT q_c().emplace_back(0); q_arith().emplace_back(0); if constexpr (HasAdditionalSelectors) { - selectors.pad_additional(); + main_block.selectors.pad_additional(); } check_selector_length_consistency(); break; @@ -1323,7 +1323,7 @@ void UltraCircuitBuilder_::apply_aux_selectors(const AUX_SELECT q_c().emplace_back(0); q_arith().emplace_back(0); if constexpr (HasAdditionalSelectors) { - selectors.pad_additional(); + main_block.selectors.pad_additional(); } check_selector_length_consistency(); break; @@ -1341,7 +1341,7 @@ void UltraCircuitBuilder_::apply_aux_selectors(const AUX_SELECT q_c().emplace_back(0); q_arith().emplace_back(0); if constexpr (HasAdditionalSelectors) { - selectors.pad_additional(); + main_block.selectors.pad_additional(); } check_selector_length_consistency(); break; @@ -1360,7 +1360,7 @@ void UltraCircuitBuilder_::apply_aux_selectors(const AUX_SELECT q_c().emplace_back(0); q_arith().emplace_back(1); if constexpr (HasAdditionalSelectors) { - selectors.pad_additional(); + main_block.selectors.pad_additional(); } check_selector_length_consistency(); break; @@ -1376,7 +1376,7 @@ void UltraCircuitBuilder_::apply_aux_selectors(const AUX_SELECT q_c().emplace_back(0); q_arith().emplace_back(0); if constexpr (HasAdditionalSelectors) { - selectors.pad_additional(); + main_block.selectors.pad_additional(); } check_selector_length_consistency(); break; @@ -1393,7 +1393,7 @@ void UltraCircuitBuilder_::apply_aux_selectors(const AUX_SELECT q_c().emplace_back(0); // read/write flag stored in q_c q_arith().emplace_back(0); if constexpr (HasAdditionalSelectors) { - selectors.pad_additional(); + main_block.selectors.pad_additional(); } check_selector_length_consistency(); break; @@ -1410,7 +1410,7 @@ void UltraCircuitBuilder_::apply_aux_selectors(const AUX_SELECT q_c().emplace_back(0); // read/write flag stored in q_c q_arith().emplace_back(0); if constexpr (HasAdditionalSelectors) { - selectors.pad_additional(); + main_block.selectors.pad_additional(); } check_selector_length_consistency(); break; @@ -1427,7 +1427,7 @@ void UltraCircuitBuilder_::apply_aux_selectors(const AUX_SELECT q_c().emplace_back(1); // read/write flag stored in q_c q_arith().emplace_back(0); if constexpr (HasAdditionalSelectors) { - selectors.pad_additional(); + main_block.selectors.pad_additional(); } check_selector_length_consistency(); break; @@ -1441,7 +1441,7 @@ void UltraCircuitBuilder_::apply_aux_selectors(const AUX_SELECT q_c().emplace_back(0); q_arith().emplace_back(0); if constexpr (HasAdditionalSelectors) { - selectors.pad_additional(); + main_block.selectors.pad_additional(); } check_selector_length_consistency(); break; @@ -1965,7 +1965,7 @@ std::array UltraCircuitBuilder_::evaluate_non_nati q_elliptic().emplace_back(0); q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { - selectors.pad_additional(); + main_block.selectors.pad_additional(); } } check_selector_length_consistency(); @@ -2090,7 +2090,7 @@ std::array UltraCircuitBuilder_::evaluate_non_nati q_elliptic().emplace_back(0); q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { - selectors.pad_additional(); + main_block.selectors.pad_additional(); } } check_selector_length_consistency(); diff --git a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.hpp b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.hpp index d9e533c15c1..8f0e11f43f1 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.hpp @@ -1,5 +1,6 @@ #pragma once #include "barretenberg/polynomials/polynomial.hpp" +#include "barretenberg/proof_system/execution_trace/execution_trace.hpp" #include "barretenberg/proof_system/op_queue/ecc_op_queue.hpp" #include "barretenberg/proof_system/plookup_tables/plookup_tables.hpp" #include "barretenberg/proof_system/plookup_tables/types.hpp" @@ -28,6 +29,7 @@ template class UltraCircuitBuilder_ : public CircuitBuilderBase { public: using Selectors = Arithmetization; + using TraceBlock = ExecutionTraceBlock; using FF = typename Arithmetization::FF; static constexpr size_t NUM_WIRES = Arithmetization::NUM_WIRES; // Keeping NUM_WIRES, at least temporarily, for backward compatibility @@ -457,7 +459,7 @@ class UltraCircuitBuilder_ : public CircuitBuilderBaseq_aux().resize(num_gates); builder->q_lookup_type().resize(num_gates); if constexpr (HasAdditionalSelectors) { - builder->selectors.resize_additional(num_gates); + builder->main_block.selectors.resize_additional(num_gates); } } /** @@ -570,45 +572,47 @@ class UltraCircuitBuilder_ : public CircuitBuilderBase>, NUM_WIRES> wires; - Arithmetization selectors; + // Block for all gates + TraceBlock main_block; + + const auto& get_wires() const { return main_block.wires; }; using WireVector = std::vector>; using SelectorVector = std::vector>; - WireVector& w_l() { return std::get<0>(wires); }; - WireVector& w_r() { return std::get<1>(wires); }; - WireVector& w_o() { return std::get<2>(wires); }; - WireVector& w_4() { return std::get<3>(wires); }; - - const WireVector& w_l() const { return std::get<0>(wires); }; - const WireVector& w_r() const { return std::get<1>(wires); }; - const WireVector& w_o() const { return std::get<2>(wires); }; - const WireVector& w_4() const { return std::get<3>(wires); }; - - SelectorVector& q_m() { return selectors.q_m(); }; - SelectorVector& q_c() { return selectors.q_c(); }; - SelectorVector& q_1() { return selectors.q_1(); }; - SelectorVector& q_2() { return selectors.q_2(); }; - SelectorVector& q_3() { return selectors.q_3(); }; - SelectorVector& q_4() { return selectors.q_4(); }; - SelectorVector& q_arith() { return selectors.q_arith(); }; - SelectorVector& q_sort() { return selectors.q_sort(); }; - SelectorVector& q_elliptic() { return selectors.q_elliptic(); }; - SelectorVector& q_aux() { return selectors.q_aux(); }; - SelectorVector& q_lookup_type() { return selectors.q_lookup_type(); }; - - const SelectorVector& q_c() const { return selectors.q_c(); }; - const SelectorVector& q_1() const { return selectors.q_1(); }; - const SelectorVector& q_2() const { return selectors.q_2(); }; - const SelectorVector& q_3() const { return selectors.q_3(); }; - const SelectorVector& q_4() const { return selectors.q_4(); }; - const SelectorVector& q_arith() const { return selectors.q_arith(); }; - const SelectorVector& q_sort() const { return selectors.q_sort(); }; - const SelectorVector& q_elliptic() const { return selectors.q_elliptic(); }; - const SelectorVector& q_aux() const { return selectors.q_aux(); }; - const SelectorVector& q_lookup_type() const { return selectors.q_lookup_type(); }; - const SelectorVector& q_m() const { return selectors.q_m(); }; + WireVector& w_l() { return std::get<0>(main_block.wires); }; + WireVector& w_r() { return std::get<1>(main_block.wires); }; + WireVector& w_o() { return std::get<2>(main_block.wires); }; + WireVector& w_4() { return std::get<3>(main_block.wires); }; + + const WireVector& w_l() const { return std::get<0>(main_block.wires); }; + const WireVector& w_r() const { return std::get<1>(main_block.wires); }; + const WireVector& w_o() const { return std::get<2>(main_block.wires); }; + const WireVector& w_4() const { return std::get<3>(main_block.wires); }; + + SelectorVector& q_m() { return main_block.selectors.q_m(); }; + SelectorVector& q_c() { return main_block.selectors.q_c(); }; + SelectorVector& q_1() { return main_block.selectors.q_1(); }; + SelectorVector& q_2() { return main_block.selectors.q_2(); }; + SelectorVector& q_3() { return main_block.selectors.q_3(); }; + SelectorVector& q_4() { return main_block.selectors.q_4(); }; + SelectorVector& q_arith() { return main_block.selectors.q_arith(); }; + SelectorVector& q_sort() { return main_block.selectors.q_sort(); }; + SelectorVector& q_elliptic() { return main_block.selectors.q_elliptic(); }; + SelectorVector& q_aux() { return main_block.selectors.q_aux(); }; + SelectorVector& q_lookup_type() { return main_block.selectors.q_lookup_type(); }; + + const SelectorVector& q_c() const { return main_block.selectors.q_c(); }; + const SelectorVector& q_1() const { return main_block.selectors.q_1(); }; + const SelectorVector& q_2() const { return main_block.selectors.q_2(); }; + const SelectorVector& q_3() const { return main_block.selectors.q_3(); }; + const SelectorVector& q_4() const { return main_block.selectors.q_4(); }; + const SelectorVector& q_arith() const { return main_block.selectors.q_arith(); }; + const SelectorVector& q_sort() const { return main_block.selectors.q_sort(); }; + const SelectorVector& q_elliptic() const { return main_block.selectors.q_elliptic(); }; + const SelectorVector& q_aux() const { return main_block.selectors.q_aux(); }; + const SelectorVector& q_lookup_type() const { return main_block.selectors.q_lookup_type(); }; + const SelectorVector& q_m() const { return main_block.selectors.q_m(); }; // These are variables that we have used a gate on, to enforce that they are // equal to a defined value. @@ -649,7 +653,7 @@ class UltraCircuitBuilder_ : public CircuitBuilderBase(size_hint) { - selectors.reserve(size_hint); + main_block.selectors.reserve(size_hint); w_l().reserve(size_hint); w_r().reserve(size_hint); w_o().reserve(size_hint); @@ -678,7 +682,7 @@ class UltraCircuitBuilder_ : public CircuitBuilderBase(size_hint) { - selectors.reserve(size_hint); + main_block.selectors.reserve(size_hint); w_l().reserve(size_hint); w_r().reserve(size_hint); w_o().reserve(size_hint); @@ -705,8 +709,7 @@ class UltraCircuitBuilder_ : public CircuitBuilderBase(std::move(other)) { - wires = other.wires; - selectors = other.selectors; + main_block = other.main_block; constant_variable_indices = other.constant_variable_indices; lookup_tables = other.lookup_tables; @@ -723,8 +726,7 @@ class UltraCircuitBuilder_ : public CircuitBuilderBase::operator=(std::move(other)); - wires = other.wires; - selectors = other.selectors; + main_block = other.main_block; constant_variable_indices = other.constant_variable_indices; lookup_tables = other.lookup_tables; @@ -752,9 +754,9 @@ class UltraCircuitBuilder_ : public CircuitBuilderBase::TraceBlock> ExecutionTrace_ Date: Thu, 22 Feb 2024 15:17:23 +0000 Subject: [PATCH 02/28] builders now construct everything in blocks --- .../arithmetization/arithmetization.hpp | 6 ++ .../goblin_ultra_circuit_builder.cpp | 4 +- .../goblin_ultra_circuit_builder.hpp | 38 ++++---- .../goblin_ultra_circuit_builder.test.cpp | 3 +- .../standard_circuit_builder.hpp | 40 ++++---- .../circuit_builder/ultra_circuit_builder.cpp | 70 +++++++------- .../circuit_builder/ultra_circuit_builder.hpp | 94 ++++++++++--------- .../execution_trace/execution_trace.cpp | 6 +- 8 files changed, 139 insertions(+), 122 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/proof_system/arithmetization/arithmetization.hpp b/barretenberg/cpp/src/barretenberg/proof_system/arithmetization/arithmetization.hpp index 9001beef281..4e65664690f 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/arithmetization/arithmetization.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/arithmetization/arithmetization.hpp @@ -40,6 +40,8 @@ template class StandardArith { using FF = FF_; using SelectorType = std::vector>; + enum GateTypes { PubInputs, Main, NUM_BLOCKS }; + std::array selectors; SelectorType& q_m() { return selectors[0]; }; @@ -74,6 +76,8 @@ template class UltraArith { using FF = FF_; using SelectorType = std::vector>; + enum GateTypes { PubInputs, Main, NUM_BLOCKS }; + private: std::array selectors; @@ -130,6 +134,8 @@ template class UltraHonkArith { using FF = FF_; using SelectorType = std::vector>; + enum GateTypes { EccOp, PubInputs, Main, NUM_BLOCKS }; + private: std::array selectors; diff --git a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/goblin_ultra_circuit_builder.cpp b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/goblin_ultra_circuit_builder.cpp index be0aa89d1b1..6941d3173c8 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/goblin_ultra_circuit_builder.cpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/goblin_ultra_circuit_builder.cpp @@ -211,7 +211,7 @@ template void GoblinUltraCircuitBuilder_::populate_ecc_op_wire ecc_op_wire_2().emplace_back(in.x_lo); ecc_op_wire_3().emplace_back(in.x_hi); ecc_op_wire_4().emplace_back(in.y_lo); - for (auto& selector : ecc_op_block.selectors.get()) { + for (auto& selector : this->blocks[GateTypes::EccOp].selectors.get()) { selector.emplace_back(0); } @@ -219,7 +219,7 @@ template void GoblinUltraCircuitBuilder_::populate_ecc_op_wire ecc_op_wire_2().emplace_back(in.y_hi); ecc_op_wire_3().emplace_back(in.z_1); ecc_op_wire_4().emplace_back(in.z_2); - for (auto& selector : ecc_op_block.selectors.get()) { + for (auto& selector : this->blocks[GateTypes::EccOp].selectors.get()) { selector.emplace_back(0); } diff --git a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/goblin_ultra_circuit_builder.hpp b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/goblin_ultra_circuit_builder.hpp index 2f3bbf8d22b..67d9284d191 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/goblin_ultra_circuit_builder.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/goblin_ultra_circuit_builder.hpp @@ -12,6 +12,7 @@ template class GoblinUltraCircuitBuilder_ : public UltraCircuitBui public: using Arithmetization = UltraHonkArith; using TraceBlock = ExecutionTraceBlock; + using GateTypes = Arithmetization::GateTypes; static constexpr std::string_view NAME_STRING = "GoblinUltraArithmetization"; static constexpr CircuitType CIRCUIT_TYPE = CircuitType::ULTRA; @@ -32,26 +33,29 @@ template class GoblinUltraCircuitBuilder_ : public UltraCircuitBui using WireVector = std::vector>; using SelectorVector = std::vector>; - // Execution trace block for goblin ecc op gates - TraceBlock ecc_op_block; + WireVector& ecc_op_wire_1() { return std::get<0>(this->blocks[GateTypes::EccOp].wires); }; + WireVector& ecc_op_wire_2() { return std::get<1>(this->blocks[GateTypes::EccOp].wires); }; + WireVector& ecc_op_wire_3() { return std::get<2>(this->blocks[GateTypes::EccOp].wires); }; + WireVector& ecc_op_wire_4() { return std::get<3>(this->blocks[GateTypes::EccOp].wires); }; - WireVector& ecc_op_wire_1() { return std::get<0>(ecc_op_block.wires); }; - WireVector& ecc_op_wire_2() { return std::get<1>(ecc_op_block.wires); }; - WireVector& ecc_op_wire_3() { return std::get<2>(ecc_op_block.wires); }; - WireVector& ecc_op_wire_4() { return std::get<3>(ecc_op_block.wires); }; + const WireVector& ecc_op_wire_1() const { return std::get<0>(this->blocks[GateTypes::EccOp].wires); }; + const WireVector& ecc_op_wire_2() const { return std::get<1>(this->blocks[GateTypes::EccOp].wires); }; + const WireVector& ecc_op_wire_3() const { return std::get<2>(this->blocks[GateTypes::EccOp].wires); }; + const WireVector& ecc_op_wire_4() const { return std::get<3>(this->blocks[GateTypes::EccOp].wires); }; - const WireVector& ecc_op_wire_1() const { return std::get<0>(ecc_op_block.wires); }; - const WireVector& ecc_op_wire_2() const { return std::get<1>(ecc_op_block.wires); }; - const WireVector& ecc_op_wire_3() const { return std::get<2>(ecc_op_block.wires); }; - const WireVector& ecc_op_wire_4() const { return std::get<3>(ecc_op_block.wires); }; + SelectorVector& q_busread() { return this->blocks[GateTypes::Main].selectors.q_busread(); }; + SelectorVector& q_poseidon2_external() { return this->blocks[GateTypes::Main].selectors.q_poseidon2_external(); }; + SelectorVector& q_poseidon2_internal() { return this->blocks[GateTypes::Main].selectors.q_poseidon2_internal(); }; - SelectorVector& q_busread() { return this->main_block.selectors.q_busread(); }; - SelectorVector& q_poseidon2_external() { return this->main_block.selectors.q_poseidon2_external(); }; - SelectorVector& q_poseidon2_internal() { return this->main_block.selectors.q_poseidon2_internal(); }; - - const SelectorVector& q_busread() const { return this->main_block.selectors.q_busread(); }; - const SelectorVector& q_poseidon2_external() const { return this->main_block.selectors.q_poseidon2_external(); }; - const SelectorVector& q_poseidon2_internal() const { return this->main_block.selectors.q_poseidon2_internal(); }; + const SelectorVector& q_busread() const { return this->blocks[GateTypes::Main].selectors.q_busread(); }; + const SelectorVector& q_poseidon2_external() const + { + return this->blocks[GateTypes::Main].selectors.q_poseidon2_external(); + }; + const SelectorVector& q_poseidon2_internal() const + { + return this->blocks[GateTypes::Main].selectors.q_poseidon2_internal(); + }; // DataBus call/return data arrays std::vector public_calldata; diff --git a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/goblin_ultra_circuit_builder.test.cpp b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/goblin_ultra_circuit_builder.test.cpp index eee04247c8c..76be49cf408 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/goblin_ultra_circuit_builder.test.cpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/goblin_ultra_circuit_builder.test.cpp @@ -150,7 +150,8 @@ TEST(GoblinUltraCircuitBuilder, GoblinEccOpQueueUltraOps) auto ultra_ops = builder.op_queue->get_aggregate_transcript(); for (size_t i = 1; i < 4; ++i) { for (size_t j = 0; j < builder.num_ecc_op_gates; ++j) { - auto op_wire_val = builder.variables[builder.ecc_op_block.wires[i][j]]; + auto op_wire_val = + builder.variables[builder.blocks[GoblinUltraCircuitBuilder::Arithmetization::EccOp].wires[i][j]]; auto ultra_op_val = ultra_ops[i][j]; ASSERT_EQ(op_wire_val, ultra_op_val); } diff --git a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/standard_circuit_builder.hpp b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/standard_circuit_builder.hpp index 656f2fde878..58a7298cfbb 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/standard_circuit_builder.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/standard_circuit_builder.hpp @@ -14,6 +14,8 @@ template class StandardCircuitBuilder_ : public CircuitBuilderBase public: using Arithmetization = StandardArith; using TraceBlock = ExecutionTraceBlock; + using GateBlocks = std::array; + using GateTypes = Arithmetization::GateTypes; using Selectors = Arithmetization; static constexpr size_t NUM_WIRES = Arithmetization::NUM_WIRES; // Keeping NUM_WIRES, at least temporarily, for backward compatibility @@ -26,30 +28,30 @@ template class StandardCircuitBuilder_ : public CircuitBuilderBase static constexpr merkle::HashType merkle_hash_type = merkle::HashType::FIXED_BASE_PEDERSEN; static constexpr pedersen::CommitmentType commitment_type = pedersen::CommitmentType::FIXED_BASE_PEDERSEN; - TraceBlock main_block; + GateBlocks blocks; using WireVector = std::vector>; using SelectorVector = std::vector>; - WireVector& w_l() { return std::get<0>(main_block.wires); }; - WireVector& w_r() { return std::get<1>(main_block.wires); }; - WireVector& w_o() { return std::get<2>(main_block.wires); }; + WireVector& w_l() { return std::get<0>(blocks[GateTypes::Main].wires); }; + WireVector& w_r() { return std::get<1>(blocks[GateTypes::Main].wires); }; + WireVector& w_o() { return std::get<2>(blocks[GateTypes::Main].wires); }; - const WireVector& w_l() const { return std::get<0>(main_block.wires); }; - const WireVector& w_r() const { return std::get<1>(main_block.wires); }; - const WireVector& w_o() const { return std::get<2>(main_block.wires); }; + const WireVector& w_l() const { return std::get<0>(blocks[GateTypes::Main].wires); }; + const WireVector& w_r() const { return std::get<1>(blocks[GateTypes::Main].wires); }; + const WireVector& w_o() const { return std::get<2>(blocks[GateTypes::Main].wires); }; - SelectorVector& q_m() { return main_block.selectors.q_m(); }; - SelectorVector& q_1() { return main_block.selectors.q_1(); }; - SelectorVector& q_2() { return main_block.selectors.q_2(); }; - SelectorVector& q_3() { return main_block.selectors.q_3(); }; - SelectorVector& q_c() { return main_block.selectors.q_c(); }; + SelectorVector& q_m() { return blocks[GateTypes::Main].selectors.q_m(); }; + SelectorVector& q_1() { return blocks[GateTypes::Main].selectors.q_1(); }; + SelectorVector& q_2() { return blocks[GateTypes::Main].selectors.q_2(); }; + SelectorVector& q_3() { return blocks[GateTypes::Main].selectors.q_3(); }; + SelectorVector& q_c() { return blocks[GateTypes::Main].selectors.q_c(); }; - const SelectorVector& q_m() const { return main_block.selectors.q_m(); }; - const SelectorVector& q_1() const { return main_block.selectors.q_1(); }; - const SelectorVector& q_2() const { return main_block.selectors.q_2(); }; - const SelectorVector& q_3() const { return main_block.selectors.q_3(); }; - const SelectorVector& q_c() const { return main_block.selectors.q_c(); }; + const SelectorVector& q_m() const { return blocks[GateTypes::Main].selectors.q_m(); }; + const SelectorVector& q_1() const { return blocks[GateTypes::Main].selectors.q_1(); }; + const SelectorVector& q_2() const { return blocks[GateTypes::Main].selectors.q_2(); }; + const SelectorVector& q_3() const { return blocks[GateTypes::Main].selectors.q_3(); }; + const SelectorVector& q_c() const { return blocks[GateTypes::Main].selectors.q_c(); }; static constexpr size_t UINT_LOG2_BASE = 2; @@ -61,7 +63,7 @@ template class StandardCircuitBuilder_ : public CircuitBuilderBase StandardCircuitBuilder_(const size_t size_hint = 0) : CircuitBuilderBase(size_hint) { - main_block.selectors.reserve(size_hint); + blocks[GateTypes::Main].selectors.reserve(size_hint); w_l().reserve(size_hint); w_r().reserve(size_hint); w_o().reserve(size_hint); @@ -83,7 +85,7 @@ template class StandardCircuitBuilder_ : public CircuitBuilderBase { CircuitBuilderBase::operator=(std::move(other)); constant_variable_indices = other.constant_variable_indices; - main_block = other.main_block; + blocks = other.blocks; return *this; }; ~StandardCircuitBuilder_() override = default; diff --git a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.cpp b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.cpp index 9cb0d5d2bb5..f59371dab63 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.cpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.cpp @@ -78,7 +78,7 @@ void UltraCircuitBuilder_::add_gates_to_ensure_all_polys_are_no q_elliptic().emplace_back(1); q_aux().emplace_back(1); if constexpr (HasAdditionalSelectors) { - main_block.selectors.pad_additional(); + blocks[GateTypes::Main].selectors.pad_additional(); } check_selector_length_consistency(); ++this->num_gates; @@ -141,7 +141,7 @@ void UltraCircuitBuilder_::create_add_gate(const add_triple_) { - main_block.selectors.pad_additional(); + blocks[GateTypes::Main].selectors.pad_additional(); } check_selector_length_consistency(); ++this->num_gates; @@ -176,7 +176,7 @@ void UltraCircuitBuilder_::create_big_add_gate(const add_quad_< q_elliptic().emplace_back(0); q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { - main_block.selectors.pad_additional(); + blocks[GateTypes::Main].selectors.pad_additional(); } check_selector_length_consistency(); ++this->num_gates; @@ -273,7 +273,7 @@ void UltraCircuitBuilder_::create_big_mul_gate(const mul_quad_< q_elliptic().emplace_back(0); q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { - main_block.selectors.pad_additional(); + blocks[GateTypes::Main].selectors.pad_additional(); } check_selector_length_consistency(); ++this->num_gates; @@ -302,7 +302,7 @@ void UltraCircuitBuilder_::create_balanced_add_gate(const add_q q_elliptic().emplace_back(0); q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { - main_block.selectors.pad_additional(); + blocks[GateTypes::Main].selectors.pad_additional(); } check_selector_length_consistency(); ++this->num_gates; @@ -347,7 +347,7 @@ void UltraCircuitBuilder_::create_mul_gate(const mul_triple_) { - main_block.selectors.pad_additional(); + blocks[GateTypes::Main].selectors.pad_additional(); } check_selector_length_consistency(); ++this->num_gates; @@ -379,7 +379,7 @@ void UltraCircuitBuilder_::create_bool_gate(const uint32_t vari q_elliptic().emplace_back(0); q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { - main_block.selectors.pad_additional(); + blocks[GateTypes::Main].selectors.pad_additional(); } check_selector_length_consistency(); ++this->num_gates; @@ -413,7 +413,7 @@ void UltraCircuitBuilder_::create_poly_gate(const poly_triple_< q_elliptic().emplace_back(0); q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { - main_block.selectors.pad_additional(); + blocks[GateTypes::Main].selectors.pad_additional(); } check_selector_length_consistency(); ++this->num_gates; @@ -470,7 +470,7 @@ void UltraCircuitBuilder_::create_ecc_add_gate(const ecc_add_ga q_elliptic().emplace_back(1); q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { - main_block.selectors.pad_additional(); + blocks[GateTypes::Main].selectors.pad_additional(); } check_selector_length_consistency(); ++this->num_gates; @@ -491,7 +491,7 @@ void UltraCircuitBuilder_::create_ecc_add_gate(const ecc_add_ga q_elliptic().emplace_back(0); q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { - main_block.selectors.pad_additional(); + blocks[GateTypes::Main].selectors.pad_additional(); } check_selector_length_consistency(); ++this->num_gates; @@ -540,7 +540,7 @@ void UltraCircuitBuilder_::create_ecc_dbl_gate(const ecc_dbl_ga q_lookup_type().emplace_back(0); q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { - main_block.selectors.pad_additional(); + blocks[GateTypes::Main].selectors.pad_additional(); } check_selector_length_consistency(); ++this->num_gates; @@ -562,7 +562,7 @@ void UltraCircuitBuilder_::create_ecc_dbl_gate(const ecc_dbl_ga q_elliptic().emplace_back(0); q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { - main_block.selectors.pad_additional(); + blocks[GateTypes::Main].selectors.pad_additional(); } check_selector_length_consistency(); ++this->num_gates; @@ -595,7 +595,7 @@ void UltraCircuitBuilder_::fix_witness(const uint32_t witness_i q_elliptic().emplace_back(0); q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { - main_block.selectors.pad_additional(); + blocks[GateTypes::Main].selectors.pad_additional(); } check_selector_length_consistency(); ++this->num_gates; @@ -673,7 +673,7 @@ plookup::ReadData UltraCircuitBuilder_::create_gates_ q_elliptic().emplace_back(0); q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { - main_block.selectors.pad_additional(); + blocks[GateTypes::Main].selectors.pad_additional(); } check_selector_length_consistency(); ++this->num_gates; @@ -985,7 +985,7 @@ void UltraCircuitBuilder_::create_sort_constraint(const std::ve q_lookup_type().emplace_back(0); q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { - main_block.selectors.pad_additional(); + blocks[GateTypes::Main].selectors.pad_additional(); } check_selector_length_consistency(); } @@ -1007,7 +1007,7 @@ void UltraCircuitBuilder_::create_sort_constraint(const std::ve q_lookup_type().emplace_back(0); q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { - main_block.selectors.pad_additional(); + blocks[GateTypes::Main].selectors.pad_additional(); } check_selector_length_consistency(); } @@ -1044,7 +1044,7 @@ void UltraCircuitBuilder_::create_dummy_constraints(const std:: q_lookup_type().emplace_back(0); q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { - main_block.selectors.pad_additional(); + blocks[GateTypes::Main].selectors.pad_additional(); } check_selector_length_consistency(); } @@ -1078,7 +1078,7 @@ void UltraCircuitBuilder_::create_sort_constraint_with_edges( q_lookup_type().emplace_back(0); q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { - main_block.selectors.pad_additional(); + blocks[GateTypes::Main].selectors.pad_additional(); } check_selector_length_consistency(); // enforce range check for middle rows @@ -1101,7 +1101,7 @@ void UltraCircuitBuilder_::create_sort_constraint_with_edges( q_lookup_type().emplace_back(0); q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { - main_block.selectors.pad_additional(); + blocks[GateTypes::Main].selectors.pad_additional(); } check_selector_length_consistency(); } @@ -1124,7 +1124,7 @@ void UltraCircuitBuilder_::create_sort_constraint_with_edges( q_lookup_type().emplace_back(0); q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { - main_block.selectors.pad_additional(); + blocks[GateTypes::Main].selectors.pad_additional(); } check_selector_length_consistency(); } @@ -1148,7 +1148,7 @@ void UltraCircuitBuilder_::create_sort_constraint_with_edges( q_lookup_type().emplace_back(0); q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { - main_block.selectors.pad_additional(); + blocks[GateTypes::Main].selectors.pad_additional(); } check_selector_length_consistency(); } @@ -1267,7 +1267,7 @@ void UltraCircuitBuilder_::apply_aux_selectors(const AUX_SELECT q_c().emplace_back(0); q_arith().emplace_back(0); if constexpr (HasAdditionalSelectors) { - main_block.selectors.pad_additional(); + blocks[GateTypes::Main].selectors.pad_additional(); } check_selector_length_consistency(); break; @@ -1281,7 +1281,7 @@ void UltraCircuitBuilder_::apply_aux_selectors(const AUX_SELECT q_c().emplace_back(0); q_arith().emplace_back(0); if constexpr (HasAdditionalSelectors) { - main_block.selectors.pad_additional(); + blocks[GateTypes::Main].selectors.pad_additional(); } check_selector_length_consistency(); break; @@ -1295,7 +1295,7 @@ void UltraCircuitBuilder_::apply_aux_selectors(const AUX_SELECT q_c().emplace_back(0); q_arith().emplace_back(0); if constexpr (HasAdditionalSelectors) { - main_block.selectors.pad_additional(); + blocks[GateTypes::Main].selectors.pad_additional(); } check_selector_length_consistency(); break; @@ -1309,7 +1309,7 @@ void UltraCircuitBuilder_::apply_aux_selectors(const AUX_SELECT q_c().emplace_back(0); q_arith().emplace_back(0); if constexpr (HasAdditionalSelectors) { - main_block.selectors.pad_additional(); + blocks[GateTypes::Main].selectors.pad_additional(); } check_selector_length_consistency(); break; @@ -1323,7 +1323,7 @@ void UltraCircuitBuilder_::apply_aux_selectors(const AUX_SELECT q_c().emplace_back(0); q_arith().emplace_back(0); if constexpr (HasAdditionalSelectors) { - main_block.selectors.pad_additional(); + blocks[GateTypes::Main].selectors.pad_additional(); } check_selector_length_consistency(); break; @@ -1341,7 +1341,7 @@ void UltraCircuitBuilder_::apply_aux_selectors(const AUX_SELECT q_c().emplace_back(0); q_arith().emplace_back(0); if constexpr (HasAdditionalSelectors) { - main_block.selectors.pad_additional(); + blocks[GateTypes::Main].selectors.pad_additional(); } check_selector_length_consistency(); break; @@ -1360,7 +1360,7 @@ void UltraCircuitBuilder_::apply_aux_selectors(const AUX_SELECT q_c().emplace_back(0); q_arith().emplace_back(1); if constexpr (HasAdditionalSelectors) { - main_block.selectors.pad_additional(); + blocks[GateTypes::Main].selectors.pad_additional(); } check_selector_length_consistency(); break; @@ -1376,7 +1376,7 @@ void UltraCircuitBuilder_::apply_aux_selectors(const AUX_SELECT q_c().emplace_back(0); q_arith().emplace_back(0); if constexpr (HasAdditionalSelectors) { - main_block.selectors.pad_additional(); + blocks[GateTypes::Main].selectors.pad_additional(); } check_selector_length_consistency(); break; @@ -1393,7 +1393,7 @@ void UltraCircuitBuilder_::apply_aux_selectors(const AUX_SELECT q_c().emplace_back(0); // read/write flag stored in q_c q_arith().emplace_back(0); if constexpr (HasAdditionalSelectors) { - main_block.selectors.pad_additional(); + blocks[GateTypes::Main].selectors.pad_additional(); } check_selector_length_consistency(); break; @@ -1410,7 +1410,7 @@ void UltraCircuitBuilder_::apply_aux_selectors(const AUX_SELECT q_c().emplace_back(0); // read/write flag stored in q_c q_arith().emplace_back(0); if constexpr (HasAdditionalSelectors) { - main_block.selectors.pad_additional(); + blocks[GateTypes::Main].selectors.pad_additional(); } check_selector_length_consistency(); break; @@ -1427,7 +1427,7 @@ void UltraCircuitBuilder_::apply_aux_selectors(const AUX_SELECT q_c().emplace_back(1); // read/write flag stored in q_c q_arith().emplace_back(0); if constexpr (HasAdditionalSelectors) { - main_block.selectors.pad_additional(); + blocks[GateTypes::Main].selectors.pad_additional(); } check_selector_length_consistency(); break; @@ -1441,7 +1441,7 @@ void UltraCircuitBuilder_::apply_aux_selectors(const AUX_SELECT q_c().emplace_back(0); q_arith().emplace_back(0); if constexpr (HasAdditionalSelectors) { - main_block.selectors.pad_additional(); + blocks[GateTypes::Main].selectors.pad_additional(); } check_selector_length_consistency(); break; @@ -1965,7 +1965,7 @@ std::array UltraCircuitBuilder_::evaluate_non_nati q_elliptic().emplace_back(0); q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { - main_block.selectors.pad_additional(); + blocks[GateTypes::Main].selectors.pad_additional(); } } check_selector_length_consistency(); @@ -2090,7 +2090,7 @@ std::array UltraCircuitBuilder_::evaluate_non_nati q_elliptic().emplace_back(0); q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { - main_block.selectors.pad_additional(); + blocks[GateTypes::Main].selectors.pad_additional(); } } check_selector_length_consistency(); diff --git a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.hpp b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.hpp index 8f0e11f43f1..1fbc87589aa 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.hpp @@ -25,11 +25,15 @@ template struct non_native_field_witnesses { using namespace bb; -template -class UltraCircuitBuilder_ : public CircuitBuilderBase { +template +class UltraCircuitBuilder_ : public CircuitBuilderBase { public: + using Arithmetization = Arithmetization_; using Selectors = Arithmetization; using TraceBlock = ExecutionTraceBlock; + using GateBlocks = std::array; + using GateTypes = Arithmetization::GateTypes; + using FF = typename Arithmetization::FF; static constexpr size_t NUM_WIRES = Arithmetization::NUM_WIRES; // Keeping NUM_WIRES, at least temporarily, for backward compatibility @@ -459,7 +463,7 @@ class UltraCircuitBuilder_ : public CircuitBuilderBaseq_aux().resize(num_gates); builder->q_lookup_type().resize(num_gates); if constexpr (HasAdditionalSelectors) { - builder->main_block.selectors.resize_additional(num_gates); + builder->blocks[GateTypes::Main].selectors.resize_additional(num_gates); } } /** @@ -573,46 +577,46 @@ class UltraCircuitBuilder_ : public CircuitBuilderBase>; using SelectorVector = std::vector>; - WireVector& w_l() { return std::get<0>(main_block.wires); }; - WireVector& w_r() { return std::get<1>(main_block.wires); }; - WireVector& w_o() { return std::get<2>(main_block.wires); }; - WireVector& w_4() { return std::get<3>(main_block.wires); }; - - const WireVector& w_l() const { return std::get<0>(main_block.wires); }; - const WireVector& w_r() const { return std::get<1>(main_block.wires); }; - const WireVector& w_o() const { return std::get<2>(main_block.wires); }; - const WireVector& w_4() const { return std::get<3>(main_block.wires); }; - - SelectorVector& q_m() { return main_block.selectors.q_m(); }; - SelectorVector& q_c() { return main_block.selectors.q_c(); }; - SelectorVector& q_1() { return main_block.selectors.q_1(); }; - SelectorVector& q_2() { return main_block.selectors.q_2(); }; - SelectorVector& q_3() { return main_block.selectors.q_3(); }; - SelectorVector& q_4() { return main_block.selectors.q_4(); }; - SelectorVector& q_arith() { return main_block.selectors.q_arith(); }; - SelectorVector& q_sort() { return main_block.selectors.q_sort(); }; - SelectorVector& q_elliptic() { return main_block.selectors.q_elliptic(); }; - SelectorVector& q_aux() { return main_block.selectors.q_aux(); }; - SelectorVector& q_lookup_type() { return main_block.selectors.q_lookup_type(); }; - - const SelectorVector& q_c() const { return main_block.selectors.q_c(); }; - const SelectorVector& q_1() const { return main_block.selectors.q_1(); }; - const SelectorVector& q_2() const { return main_block.selectors.q_2(); }; - const SelectorVector& q_3() const { return main_block.selectors.q_3(); }; - const SelectorVector& q_4() const { return main_block.selectors.q_4(); }; - const SelectorVector& q_arith() const { return main_block.selectors.q_arith(); }; - const SelectorVector& q_sort() const { return main_block.selectors.q_sort(); }; - const SelectorVector& q_elliptic() const { return main_block.selectors.q_elliptic(); }; - const SelectorVector& q_aux() const { return main_block.selectors.q_aux(); }; - const SelectorVector& q_lookup_type() const { return main_block.selectors.q_lookup_type(); }; - const SelectorVector& q_m() const { return main_block.selectors.q_m(); }; + WireVector& w_l() { return std::get<0>(blocks[GateTypes::Main].wires); }; + WireVector& w_r() { return std::get<1>(blocks[GateTypes::Main].wires); }; + WireVector& w_o() { return std::get<2>(blocks[GateTypes::Main].wires); }; + WireVector& w_4() { return std::get<3>(blocks[GateTypes::Main].wires); }; + + const WireVector& w_l() const { return std::get<0>(blocks[GateTypes::Main].wires); }; + const WireVector& w_r() const { return std::get<1>(blocks[GateTypes::Main].wires); }; + const WireVector& w_o() const { return std::get<2>(blocks[GateTypes::Main].wires); }; + const WireVector& w_4() const { return std::get<3>(blocks[GateTypes::Main].wires); }; + + SelectorVector& q_m() { return blocks[GateTypes::Main].selectors.q_m(); }; + SelectorVector& q_c() { return blocks[GateTypes::Main].selectors.q_c(); }; + SelectorVector& q_1() { return blocks[GateTypes::Main].selectors.q_1(); }; + SelectorVector& q_2() { return blocks[GateTypes::Main].selectors.q_2(); }; + SelectorVector& q_3() { return blocks[GateTypes::Main].selectors.q_3(); }; + SelectorVector& q_4() { return blocks[GateTypes::Main].selectors.q_4(); }; + SelectorVector& q_arith() { return blocks[GateTypes::Main].selectors.q_arith(); }; + SelectorVector& q_sort() { return blocks[GateTypes::Main].selectors.q_sort(); }; + SelectorVector& q_elliptic() { return blocks[GateTypes::Main].selectors.q_elliptic(); }; + SelectorVector& q_aux() { return blocks[GateTypes::Main].selectors.q_aux(); }; + SelectorVector& q_lookup_type() { return blocks[GateTypes::Main].selectors.q_lookup_type(); }; + + const SelectorVector& q_c() const { return blocks[GateTypes::Main].selectors.q_c(); }; + const SelectorVector& q_1() const { return blocks[GateTypes::Main].selectors.q_1(); }; + const SelectorVector& q_2() const { return blocks[GateTypes::Main].selectors.q_2(); }; + const SelectorVector& q_3() const { return blocks[GateTypes::Main].selectors.q_3(); }; + const SelectorVector& q_4() const { return blocks[GateTypes::Main].selectors.q_4(); }; + const SelectorVector& q_arith() const { return blocks[GateTypes::Main].selectors.q_arith(); }; + const SelectorVector& q_sort() const { return blocks[GateTypes::Main].selectors.q_sort(); }; + const SelectorVector& q_elliptic() const { return blocks[GateTypes::Main].selectors.q_elliptic(); }; + const SelectorVector& q_aux() const { return blocks[GateTypes::Main].selectors.q_aux(); }; + const SelectorVector& q_lookup_type() const { return blocks[GateTypes::Main].selectors.q_lookup_type(); }; + const SelectorVector& q_m() const { return blocks[GateTypes::Main].selectors.q_m(); }; // These are variables that we have used a gate on, to enforce that they are // equal to a defined value. @@ -653,7 +657,7 @@ class UltraCircuitBuilder_ : public CircuitBuilderBase(size_hint) { - main_block.selectors.reserve(size_hint); + blocks[GateTypes::Main].selectors.reserve(size_hint); w_l().reserve(size_hint); w_r().reserve(size_hint); w_o().reserve(size_hint); @@ -682,7 +686,7 @@ class UltraCircuitBuilder_ : public CircuitBuilderBase(size_hint) { - main_block.selectors.reserve(size_hint); + blocks[GateTypes::Main].selectors.reserve(size_hint); w_l().reserve(size_hint); w_r().reserve(size_hint); w_o().reserve(size_hint); @@ -709,7 +713,7 @@ class UltraCircuitBuilder_ : public CircuitBuilderBase(std::move(other)) { - main_block = other.main_block; + blocks = other.blocks; constant_variable_indices = other.constant_variable_indices; lookup_tables = other.lookup_tables; @@ -726,7 +730,7 @@ class UltraCircuitBuilder_ : public CircuitBuilderBase::operator=(std::move(other)); - main_block = other.main_block; + blocks = other.blocks; constant_variable_indices = other.constant_variable_indices; lookup_tables = other.lookup_tables; @@ -754,9 +758,9 @@ class UltraCircuitBuilder_ : public CircuitBuilderBase std::vector::TraceBlock> ExecutionTrace_::create_execution_trace_blocks( const Builder& builder) { + using GateTypes = Flavor::CircuitBuilder::Arithmetization::GateTypes; std::vector trace_blocks; // Make a block for the zero row @@ -110,7 +111,7 @@ std::vector::TraceBlock> ExecutionTrace_) { - trace_blocks.emplace_back(builder.ecc_op_block); + trace_blocks.emplace_back(builder.blocks[GateTypes::EccOp]); } // Make a block for the public inputs @@ -127,12 +128,11 @@ std::vector::TraceBlock> ExecutionTrace_ Date: Thu, 22 Feb 2024 15:50:02 +0000 Subject: [PATCH 03/28] standard builder uses templated getters in gate fctns --- .../standard_circuit_builder.cpp | 169 +++++++++--------- .../standard_circuit_builder.hpp | 44 ++--- 2 files changed, 109 insertions(+), 104 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/standard_circuit_builder.cpp b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/standard_circuit_builder.cpp index e3a7478aa68..ecc37cd8bde 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/standard_circuit_builder.cpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/standard_circuit_builder.cpp @@ -13,20 +13,20 @@ namespace bb { * Create an addition gate. * * @param in An add_triple containing the indexes of variables to be placed into the - * wires w_l, w_r, w_o and addition coefficients to be placed into q_1, q_2, q_3, q_c(). + * wires w_l, w_r, w_o and addition coefficients to be placed into q_1, q_2, q_3, q_c(). */ template void StandardCircuitBuilder_::create_add_gate(const add_triple_& in) { this->assert_valid_variables({ in.a, in.b, in.c }); - w_l().emplace_back(in.a); - w_r().emplace_back(in.b); - w_o().emplace_back(in.c); - q_m().emplace_back(FF::zero()); - q_1().emplace_back(in.a_scaling); - q_2().emplace_back(in.b_scaling); - q_3().emplace_back(in.c_scaling); - q_c().emplace_back(in.const_scaling); + w_l().emplace_back(in.a); + w_r().emplace_back(in.b); + w_o().emplace_back(in.c); + q_m().emplace_back(FF::zero()); + q_1().emplace_back(in.a_scaling); + q_2().emplace_back(in.b_scaling); + q_3().emplace_back(in.c_scaling); + q_c().emplace_back(in.const_scaling); ++this->num_gates; } @@ -70,25 +70,25 @@ template void StandardCircuitBuilder_::create_balanced_add_gat FF temp = t0 + t1; uint32_t temp_idx = this->add_variable(temp); - w_l().emplace_back(in.a); - w_r().emplace_back(in.b); - w_o().emplace_back(temp_idx); - q_m().emplace_back(FF::zero()); - q_1().emplace_back(in.a_scaling); - q_2().emplace_back(in.b_scaling); - q_3().emplace_back(FF::neg_one()); - q_c().emplace_back(FF::zero()); + w_l().emplace_back(in.a); + w_r().emplace_back(in.b); + w_o().emplace_back(temp_idx); + q_m().emplace_back(FF::zero()); + q_1().emplace_back(in.a_scaling); + q_2().emplace_back(in.b_scaling); + q_3().emplace_back(FF::neg_one()); + q_c().emplace_back(FF::zero()); ++this->num_gates; - w_l().emplace_back(temp_idx); - w_r().emplace_back(in.c); - w_o().emplace_back(in.d); - q_m().emplace_back(FF::zero()); - q_1().emplace_back(FF::one()); - q_2().emplace_back(in.c_scaling); - q_3().emplace_back(in.d_scaling); - q_c().emplace_back(in.const_scaling); + w_l().emplace_back(temp_idx); + w_r().emplace_back(in.c); + w_o().emplace_back(in.d); + q_m().emplace_back(FF::zero()); + q_1().emplace_back(FF::one()); + q_2().emplace_back(in.c_scaling); + q_3().emplace_back(in.d_scaling); + q_c().emplace_back(in.const_scaling); ++this->num_gates; @@ -96,26 +96,26 @@ template void StandardCircuitBuilder_::create_balanced_add_gat // i.e. in.d * (in.d - 1) * (in.d - 2) = 0 FF temp_2 = this->get_variable(in.d).sqr() - this->get_variable(in.d); uint32_t temp_2_idx = this->add_variable(temp_2); - w_l().emplace_back(in.d); - w_r().emplace_back(in.d); - w_o().emplace_back(temp_2_idx); - q_m().emplace_back(FF::one()); - q_1().emplace_back(FF::neg_one()); - q_2().emplace_back(FF::zero()); - q_3().emplace_back(FF::neg_one()); - q_c().emplace_back(FF::zero()); + w_l().emplace_back(in.d); + w_r().emplace_back(in.d); + w_o().emplace_back(temp_2_idx); + q_m().emplace_back(FF::one()); + q_1().emplace_back(FF::neg_one()); + q_2().emplace_back(FF::zero()); + q_3().emplace_back(FF::neg_one()); + q_c().emplace_back(FF::zero()); ++this->num_gates; constexpr FF neg_two = -FF(2); - w_l().emplace_back(temp_2_idx); - w_r().emplace_back(in.d); - w_o().emplace_back(this->zero_idx); - q_m().emplace_back(FF::one()); - q_1().emplace_back(neg_two); - q_2().emplace_back(FF::zero()); - q_3().emplace_back(FF::zero()); - q_c().emplace_back(FF::zero()); + w_l().emplace_back(temp_2_idx); + w_r().emplace_back(in.d); + w_o().emplace_back(this->zero_idx); + q_m().emplace_back(FF::one()); + q_1().emplace_back(neg_two); + q_2().emplace_back(FF::zero()); + q_3().emplace_back(FF::zero()); + q_c().emplace_back(FF::zero()); ++this->num_gates; } @@ -179,20 +179,20 @@ template void StandardCircuitBuilder_::create_big_mul_gate(con * Create a multiplication gate. * * @param in A mul_tripple containing the indexes of variables to be placed into the - * wires w_l, w_r, w_o and scaling coefficients to be placed into q_m, q_3, q_c(). + * wires w_l, w_r, w_o and scaling coefficients to be placed into q_m, q_3, q_c(). */ template void StandardCircuitBuilder_::create_mul_gate(const mul_triple_& in) { this->assert_valid_variables({ in.a, in.b, in.c }); - w_l().emplace_back(in.a); - w_r().emplace_back(in.b); - w_o().emplace_back(in.c); - q_m().emplace_back(in.mul_scaling); - q_1().emplace_back(FF::zero()); - q_2().emplace_back(FF::zero()); - q_3().emplace_back(in.c_scaling); - q_c().emplace_back(in.const_scaling); + w_l().emplace_back(in.a); + w_r().emplace_back(in.b); + w_o().emplace_back(in.c); + q_m().emplace_back(in.mul_scaling); + q_1().emplace_back(FF::zero()); + q_2().emplace_back(FF::zero()); + q_3().emplace_back(in.c_scaling); + q_c().emplace_back(in.const_scaling); ++this->num_gates; } @@ -207,15 +207,15 @@ template void StandardCircuitBuilder_::create_bool_gate(const { this->assert_valid_variables({ variable_index }); - w_l().emplace_back(variable_index); - w_r().emplace_back(variable_index); - w_o().emplace_back(variable_index); + w_l().emplace_back(variable_index); + w_r().emplace_back(variable_index); + w_o().emplace_back(variable_index); - q_m().emplace_back(FF::one()); - q_1().emplace_back(FF::zero()); - q_2().emplace_back(FF::zero()); - q_3().emplace_back(FF::neg_one()); - q_c().emplace_back(FF::zero()); + q_m().emplace_back(FF::one()); + q_1().emplace_back(FF::zero()); + q_2().emplace_back(FF::zero()); + q_3().emplace_back(FF::neg_one()); + q_c().emplace_back(FF::zero()); ++this->num_gates; } @@ -229,14 +229,14 @@ template void StandardCircuitBuilder_::create_poly_gate(const { this->assert_valid_variables({ in.a, in.b, in.c }); - w_l().emplace_back(in.a); - w_r().emplace_back(in.b); - w_o().emplace_back(in.c); - q_m().emplace_back(in.q_m); - q_1().emplace_back(in.q_l); - q_2().emplace_back(in.q_r); - q_3().emplace_back(in.q_o); - q_c().emplace_back(in.q_c); + w_l().emplace_back(in.a); + w_r().emplace_back(in.b); + w_o().emplace_back(in.c); + q_m().emplace_back(in.q_m); + q_1().emplace_back(in.q_l); + q_2().emplace_back(in.q_r); + q_3().emplace_back(in.q_o); + q_c().emplace_back(in.q_c); ++this->num_gates; } @@ -482,14 +482,14 @@ void StandardCircuitBuilder_::fix_witness(const uint32_t witness_index, cons { this->assert_valid_variables({ witness_index }); - w_l().emplace_back(witness_index); - w_r().emplace_back(this->zero_idx); - w_o().emplace_back(this->zero_idx); - q_m().emplace_back(FF::zero()); - q_1().emplace_back(FF::one()); - q_2().emplace_back(FF::zero()); - q_3().emplace_back(FF::zero()); - q_c().emplace_back(-witness_value); + w_l().emplace_back(witness_index); + w_r().emplace_back(this->zero_idx); + w_o().emplace_back(this->zero_idx); + q_m().emplace_back(FF::zero()); + q_1().emplace_back(FF::one()); + q_2().emplace_back(FF::zero()); + q_3().emplace_back(FF::zero()); + q_c().emplace_back(-witness_value); ++this->num_gates; } @@ -546,10 +546,11 @@ template bool StandardCircuitBuilder_::check_circuit() for (size_t i = 0; i < this->num_gates; i++) { gate_sum = FF::zero(); - left = this->get_variable(w_l()[i]); - right = this->get_variable(w_r()[i]); - output = this->get_variable(w_o()[i]); - gate_sum = q_m()[i] * left * right + q_1()[i] * left + q_2()[i] * right + q_3()[i] * output + q_c()[i]; + left = this->get_variable(w_l()[i]); + right = this->get_variable(w_r()[i]); + output = this->get_variable(w_o()[i]); + gate_sum = q_m()[i] * left * right + q_1()[i] * left + + q_2()[i] * right + q_3()[i] * output + q_c()[i]; if (!gate_sum.is_zero()) { info("gate number", i); return false; @@ -590,11 +591,15 @@ template msgpack::sbuffer StandardCircuitBuilder_::export_circ } for (size_t i = 0; i < this->num_gates; i++) { - std::vector tmp_sel = { q_m()[i], q_1()[i], q_2()[i], q_3()[i], q_c()[i] }; + std::vector tmp_sel = { q_m()[i], + q_1()[i], + q_2()[i], + q_3()[i], + q_c()[i] }; std::vector tmp_w = { - this->real_variable_index[w_l()[i]], - this->real_variable_index[w_r()[i]], - this->real_variable_index[w_o()[i]], + this->real_variable_index[w_l()[i]], + this->real_variable_index[w_r()[i]], + this->real_variable_index[w_o()[i]], }; cir.selectors.push_back(tmp_sel); cir.wires.push_back(tmp_w); diff --git a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/standard_circuit_builder.hpp b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/standard_circuit_builder.hpp index 58a7298cfbb..332ccd3b35f 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/standard_circuit_builder.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/standard_circuit_builder.hpp @@ -33,25 +33,25 @@ template class StandardCircuitBuilder_ : public CircuitBuilderBase using WireVector = std::vector>; using SelectorVector = std::vector>; - WireVector& w_l() { return std::get<0>(blocks[GateTypes::Main].wires); }; - WireVector& w_r() { return std::get<1>(blocks[GateTypes::Main].wires); }; - WireVector& w_o() { return std::get<2>(blocks[GateTypes::Main].wires); }; - - const WireVector& w_l() const { return std::get<0>(blocks[GateTypes::Main].wires); }; - const WireVector& w_r() const { return std::get<1>(blocks[GateTypes::Main].wires); }; - const WireVector& w_o() const { return std::get<2>(blocks[GateTypes::Main].wires); }; - - SelectorVector& q_m() { return blocks[GateTypes::Main].selectors.q_m(); }; - SelectorVector& q_1() { return blocks[GateTypes::Main].selectors.q_1(); }; - SelectorVector& q_2() { return blocks[GateTypes::Main].selectors.q_2(); }; - SelectorVector& q_3() { return blocks[GateTypes::Main].selectors.q_3(); }; - SelectorVector& q_c() { return blocks[GateTypes::Main].selectors.q_c(); }; - - const SelectorVector& q_m() const { return blocks[GateTypes::Main].selectors.q_m(); }; - const SelectorVector& q_1() const { return blocks[GateTypes::Main].selectors.q_1(); }; - const SelectorVector& q_2() const { return blocks[GateTypes::Main].selectors.q_2(); }; - const SelectorVector& q_3() const { return blocks[GateTypes::Main].selectors.q_3(); }; - const SelectorVector& q_c() const { return blocks[GateTypes::Main].selectors.q_c(); }; + template WireVector& w_l() { return std::get<0>(blocks[gate_type_idx].wires); }; + template WireVector& w_r() { return std::get<1>(blocks[gate_type_idx].wires); }; + template WireVector& w_o() { return std::get<2>(blocks[gate_type_idx].wires); }; + + template const WireVector& w_l() const { return blocks[gate_type_idx].wires[0]; }; + template const WireVector& w_r() const { return blocks[gate_type_idx].wires[1]; }; + template const WireVector& w_o() const { return blocks[gate_type_idx].wires[2]; }; + + template SelectorVector& q_m() { return blocks[gate_type_idx].selectors.q_m(); }; + template SelectorVector& q_1() { return blocks[gate_type_idx].selectors.q_1(); }; + template SelectorVector& q_2() { return blocks[gate_type_idx].selectors.q_2(); }; + template SelectorVector& q_3() { return blocks[gate_type_idx].selectors.q_3(); }; + template SelectorVector& q_c() { return blocks[gate_type_idx].selectors.q_c(); }; + + template const SelectorVector& q_m() const { return blocks[gate_type_idx].selectors.q_m(); }; + template const SelectorVector& q_1() const { return blocks[gate_type_idx].selectors.q_1(); }; + template const SelectorVector& q_2() const { return blocks[gate_type_idx].selectors.q_2(); }; + template const SelectorVector& q_3() const { return blocks[gate_type_idx].selectors.q_3(); }; + template const SelectorVector& q_c() const { return blocks[gate_type_idx].selectors.q_c(); }; static constexpr size_t UINT_LOG2_BASE = 2; @@ -64,9 +64,9 @@ template class StandardCircuitBuilder_ : public CircuitBuilderBase : CircuitBuilderBase(size_hint) { blocks[GateTypes::Main].selectors.reserve(size_hint); - w_l().reserve(size_hint); - w_r().reserve(size_hint); - w_o().reserve(size_hint); + blocks[GateTypes::Main].wires[0].reserve(size_hint); + blocks[GateTypes::Main].wires[2].reserve(size_hint); + blocks[GateTypes::Main].wires[3].reserve(size_hint); // To effieciently constrain wires to zero, we set the first value of w_1 to be 0, and use copy constraints for // all future zero values. // (#216)(Adrian): This should be done in a constant way, maybe by initializing the constant_variable_indices From dcc7123fc54fa8df37fbe9723e2741314edaffbf Mon Sep 17 00:00:00 2001 From: ledwards2225 Date: Fri, 23 Feb 2024 00:58:39 +0000 Subject: [PATCH 04/28] building with new traceBlocks for standard only, need to update all others --- .../cpp/src/barretenberg/flavor/flavor.hpp | 4 + .../plonk/composer/standard_composer.cpp | 9 +- .../plonk/composer/standard_composer.hpp | 8 +- .../arithmetization/arithmetization.hpp | 89 +++++++-- .../standard_circuit_builder.cpp | 174 +++++++++--------- .../standard_circuit_builder.hpp | 30 +-- .../execution_trace/execution_trace.cpp | 36 +++- .../execution_trace/execution_trace.hpp | 14 +- 8 files changed, 213 insertions(+), 151 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp b/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp index 20008d3f67c..4c70c2a4b36 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp @@ -283,6 +283,10 @@ namespace bb { */ // clang-format off +// WORKTODO: debug purposes only +template +concept IsStandardFlavor = IsAnyOf; + template concept IsPlonkFlavor = IsAnyOf; diff --git a/barretenberg/cpp/src/barretenberg/plonk/composer/standard_composer.cpp b/barretenberg/cpp/src/barretenberg/plonk/composer/standard_composer.cpp index 42c713ca291..22256c863e8 100644 --- a/barretenberg/cpp/src/barretenberg/plonk/composer/standard_composer.cpp +++ b/barretenberg/cpp/src/barretenberg/plonk/composer/standard_composer.cpp @@ -25,7 +25,7 @@ namespace bb::plonk { * * @return Pointer to the initialized proving key updated with selector polynomials. * */ -std::shared_ptr StandardComposer::compute_proving_key(const CircuitBuilder& circuit_constructor) +std::shared_ptr StandardComposer::compute_proving_key(CircuitBuilder& circuit_constructor) { if (circuit_proving_key) { return circuit_proving_key; @@ -62,8 +62,7 @@ std::shared_ptr StandardComposer::compute_proving_key(const * * @return Pointer to created circuit verification key. * */ -std::shared_ptr StandardComposer::compute_verification_key( - const CircuitBuilder& circuit_constructor) +std::shared_ptr StandardComposer::compute_verification_key(CircuitBuilder& circuit_constructor) { if (circuit_verification_key) { return circuit_verification_key; @@ -89,7 +88,7 @@ std::shared_ptr StandardComposer::compute_verification_ * * @return The verifier. * */ -plonk::Verifier StandardComposer::create_verifier(const CircuitBuilder& circuit_constructor) +plonk::Verifier StandardComposer::create_verifier(CircuitBuilder& circuit_constructor) { auto verification_key = compute_verification_key(circuit_constructor); @@ -112,7 +111,7 @@ plonk::Verifier StandardComposer::create_verifier(const CircuitBuilder& circuit_ * * @return Initialized prover. * */ -plonk::Prover StandardComposer::create_prover(const CircuitBuilder& circuit_constructor) +plonk::Prover StandardComposer::create_prover(CircuitBuilder& circuit_constructor) { compute_proving_key(circuit_constructor); diff --git a/barretenberg/cpp/src/barretenberg/plonk/composer/standard_composer.hpp b/barretenberg/cpp/src/barretenberg/plonk/composer/standard_composer.hpp index 84b6632fa77..63016750973 100644 --- a/barretenberg/cpp/src/barretenberg/plonk/composer/standard_composer.hpp +++ b/barretenberg/cpp/src/barretenberg/plonk/composer/standard_composer.hpp @@ -56,11 +56,11 @@ class StandardComposer { }; return result; } - std::shared_ptr compute_proving_key(const CircuitBuilder& circuit_constructor); - std::shared_ptr compute_verification_key(const CircuitBuilder& circuit_constructor); + std::shared_ptr compute_proving_key(CircuitBuilder& circuit_constructor); + std::shared_ptr compute_verification_key(CircuitBuilder& circuit_constructor); - plonk::Verifier create_verifier(const CircuitBuilder& circuit_constructor); - plonk::Prover create_prover(const CircuitBuilder& circuit_constructor); + plonk::Verifier create_verifier(CircuitBuilder& circuit_constructor); + plonk::Prover create_prover(CircuitBuilder& circuit_constructor); /** * Create a manifest, which specifies proof rounds, elements and who supplies them. diff --git a/barretenberg/cpp/src/barretenberg/proof_system/arithmetization/arithmetization.hpp b/barretenberg/cpp/src/barretenberg/proof_system/arithmetization/arithmetization.hpp index 4e65664690f..c2047d8c2f8 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/arithmetization/arithmetization.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/arithmetization/arithmetization.hpp @@ -39,31 +39,58 @@ template class StandardArith { static constexpr size_t NUM_SELECTORS = 5; using FF = FF_; using SelectorType = std::vector>; + using WireType = std::vector>; + using Selectors = std::array; + using Wires = std::array; enum GateTypes { PubInputs, Main, NUM_BLOCKS }; - std::array selectors; + struct ExecutionTraceBlock { + Wires wires; + Selectors selectors; + bool is_public_input = false; - SelectorType& q_m() { return selectors[0]; }; - SelectorType& q_1() { return selectors[1]; }; - SelectorType& q_2() { return selectors[2]; }; - SelectorType& q_3() { return selectors[3]; }; - SelectorType& q_c() { return selectors[4]; }; + // WORKTODO: would be nice to do this instead of getters but we lose convenience of block.wires + // WireType w_l; + // WireType w_r; + // WireType w_o; - const SelectorType& q_m() const { return selectors[0]; }; - const SelectorType& q_1() const { return selectors[1]; }; - const SelectorType& q_2() const { return selectors[2]; }; - const SelectorType& q_3() const { return selectors[3]; }; - const SelectorType& q_c() const { return selectors[4]; }; + void update_wires(const uint32_t& idx_1, const uint32_t& idx_2, const uint32_t& idx_3) + { + wires[0].emplace_back(idx_1); + wires[1].emplace_back(idx_2); + wires[2].emplace_back(idx_3); + } - auto& get() { return selectors; }; + WireType& w_l() { return std::get<0>(wires); }; + WireType& w_r() { return std::get<1>(wires); }; + WireType& w_o() { return std::get<2>(wires); }; - void reserve(size_t size_hint) - { - for (auto& p : selectors) { - p.reserve(size_hint); + SelectorType& q_m() { return selectors[0]; }; + SelectorType& q_1() { return selectors[1]; }; + SelectorType& q_2() { return selectors[2]; }; + SelectorType& q_3() { return selectors[3]; }; + SelectorType& q_c() { return selectors[4]; }; + + void reserve(size_t size_hint) + { + for (auto& w : wires) { + w.reserve(size_hint); + } + for (auto& p : selectors) { + p.reserve(size_hint); + } } - } + }; + + struct TraceBlocks { + ExecutionTraceBlock pub_inputs; + ExecutionTraceBlock arithmetic; + }; + + // WORKTODO: only needed for now to get things to build. may need something equiv inside TraceBlock? + std::array selectors; + auto& get() { return selectors; }; // Note: These are needed for Plonk only (for poly storage in a std::map). Must be in same order as above struct. inline static const std::vector selector_names = { "q_m", "q_1", "q_2", "q_3", "q_c" }; @@ -75,9 +102,23 @@ template class UltraArith { static constexpr size_t NUM_SELECTORS = 11; using FF = FF_; using SelectorType = std::vector>; + using WireType = std::vector>; + using Selectors = std::array; + using Wires = std::array; enum GateTypes { PubInputs, Main, NUM_BLOCKS }; + struct ExecutionTraceBlock { + Wires wires; + Selectors selectors; + bool is_public_input = false; + }; + + struct TraceBlocks { + ExecutionTraceBlock pub_inputs; + ExecutionTraceBlock arithmetic; + }; + private: std::array selectors; @@ -133,6 +174,20 @@ template class UltraHonkArith { static constexpr size_t NUM_SELECTORS = 14; using FF = FF_; using SelectorType = std::vector>; + using WireType = std::vector>; + using Selectors = std::array; + using Wires = std::array; + + struct ExecutionTraceBlock { + Wires wires; + Selectors selectors; + bool is_public_input = false; + }; + + struct TraceBlocks { + ExecutionTraceBlock pub_inputs; + ExecutionTraceBlock arithmetic; + }; enum GateTypes { EccOp, PubInputs, Main, NUM_BLOCKS }; diff --git a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/standard_circuit_builder.cpp b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/standard_circuit_builder.cpp index ecc37cd8bde..440b92ad821 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/standard_circuit_builder.cpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/standard_circuit_builder.cpp @@ -13,20 +13,20 @@ namespace bb { * Create an addition gate. * * @param in An add_triple containing the indexes of variables to be placed into the - * wires w_l, w_r, w_o and addition coefficients to be placed into q_1, q_2, q_3, q_c(). + * wires w_l, w_r, w_o and addition coefficients to be placed into q_1, q_2, q_3, q_c. */ template void StandardCircuitBuilder_::create_add_gate(const add_triple_& in) { this->assert_valid_variables({ in.a, in.b, in.c }); - w_l().emplace_back(in.a); - w_r().emplace_back(in.b); - w_o().emplace_back(in.c); - q_m().emplace_back(FF::zero()); - q_1().emplace_back(in.a_scaling); - q_2().emplace_back(in.b_scaling); - q_3().emplace_back(in.c_scaling); - q_c().emplace_back(in.const_scaling); + blocks.arithmetic.w_l().emplace_back(in.a); + blocks.arithmetic.w_r().emplace_back(in.b); + blocks.arithmetic.w_o().emplace_back(in.c); + blocks.arithmetic.q_m().emplace_back(FF::zero()); + blocks.arithmetic.q_1().emplace_back(in.a_scaling); + blocks.arithmetic.q_2().emplace_back(in.b_scaling); + blocks.arithmetic.q_3().emplace_back(in.c_scaling); + blocks.arithmetic.q_c().emplace_back(in.const_scaling); ++this->num_gates; } @@ -70,25 +70,25 @@ template void StandardCircuitBuilder_::create_balanced_add_gat FF temp = t0 + t1; uint32_t temp_idx = this->add_variable(temp); - w_l().emplace_back(in.a); - w_r().emplace_back(in.b); - w_o().emplace_back(temp_idx); - q_m().emplace_back(FF::zero()); - q_1().emplace_back(in.a_scaling); - q_2().emplace_back(in.b_scaling); - q_3().emplace_back(FF::neg_one()); - q_c().emplace_back(FF::zero()); + blocks.arithmetic.w_l().emplace_back(in.a); + blocks.arithmetic.w_r().emplace_back(in.b); + blocks.arithmetic.w_o().emplace_back(temp_idx); + blocks.arithmetic.q_m().emplace_back(FF::zero()); + blocks.arithmetic.q_1().emplace_back(in.a_scaling); + blocks.arithmetic.q_2().emplace_back(in.b_scaling); + blocks.arithmetic.q_3().emplace_back(FF::neg_one()); + blocks.arithmetic.q_c().emplace_back(FF::zero()); ++this->num_gates; - w_l().emplace_back(temp_idx); - w_r().emplace_back(in.c); - w_o().emplace_back(in.d); - q_m().emplace_back(FF::zero()); - q_1().emplace_back(FF::one()); - q_2().emplace_back(in.c_scaling); - q_3().emplace_back(in.d_scaling); - q_c().emplace_back(in.const_scaling); + blocks.arithmetic.w_l().emplace_back(temp_idx); + blocks.arithmetic.w_r().emplace_back(in.c); + blocks.arithmetic.w_o().emplace_back(in.d); + blocks.arithmetic.q_m().emplace_back(FF::zero()); + blocks.arithmetic.q_1().emplace_back(FF::one()); + blocks.arithmetic.q_2().emplace_back(in.c_scaling); + blocks.arithmetic.q_3().emplace_back(in.d_scaling); + blocks.arithmetic.q_c().emplace_back(in.const_scaling); ++this->num_gates; @@ -96,26 +96,26 @@ template void StandardCircuitBuilder_::create_balanced_add_gat // i.e. in.d * (in.d - 1) * (in.d - 2) = 0 FF temp_2 = this->get_variable(in.d).sqr() - this->get_variable(in.d); uint32_t temp_2_idx = this->add_variable(temp_2); - w_l().emplace_back(in.d); - w_r().emplace_back(in.d); - w_o().emplace_back(temp_2_idx); - q_m().emplace_back(FF::one()); - q_1().emplace_back(FF::neg_one()); - q_2().emplace_back(FF::zero()); - q_3().emplace_back(FF::neg_one()); - q_c().emplace_back(FF::zero()); + blocks.arithmetic.w_l().emplace_back(in.d); + blocks.arithmetic.w_r().emplace_back(in.d); + blocks.arithmetic.w_o().emplace_back(temp_2_idx); + blocks.arithmetic.q_m().emplace_back(FF::one()); + blocks.arithmetic.q_1().emplace_back(FF::neg_one()); + blocks.arithmetic.q_2().emplace_back(FF::zero()); + blocks.arithmetic.q_3().emplace_back(FF::neg_one()); + blocks.arithmetic.q_c().emplace_back(FF::zero()); ++this->num_gates; constexpr FF neg_two = -FF(2); - w_l().emplace_back(temp_2_idx); - w_r().emplace_back(in.d); - w_o().emplace_back(this->zero_idx); - q_m().emplace_back(FF::one()); - q_1().emplace_back(neg_two); - q_2().emplace_back(FF::zero()); - q_3().emplace_back(FF::zero()); - q_c().emplace_back(FF::zero()); + blocks.arithmetic.w_l().emplace_back(temp_2_idx); + blocks.arithmetic.w_r().emplace_back(in.d); + blocks.arithmetic.w_o().emplace_back(this->zero_idx); + blocks.arithmetic.q_m().emplace_back(FF::one()); + blocks.arithmetic.q_1().emplace_back(neg_two); + blocks.arithmetic.q_2().emplace_back(FF::zero()); + blocks.arithmetic.q_3().emplace_back(FF::zero()); + blocks.arithmetic.q_c().emplace_back(FF::zero()); ++this->num_gates; } @@ -179,20 +179,20 @@ template void StandardCircuitBuilder_::create_big_mul_gate(con * Create a multiplication gate. * * @param in A mul_tripple containing the indexes of variables to be placed into the - * wires w_l, w_r, w_o and scaling coefficients to be placed into q_m, q_3, q_c(). + * wires w_l, w_r, w_o and scaling coefficients to be placed into q_m, q_3, blocks.arithmetic.q_c(). */ template void StandardCircuitBuilder_::create_mul_gate(const mul_triple_& in) { this->assert_valid_variables({ in.a, in.b, in.c }); - w_l().emplace_back(in.a); - w_r().emplace_back(in.b); - w_o().emplace_back(in.c); - q_m().emplace_back(in.mul_scaling); - q_1().emplace_back(FF::zero()); - q_2().emplace_back(FF::zero()); - q_3().emplace_back(in.c_scaling); - q_c().emplace_back(in.const_scaling); + blocks.arithmetic.w_l().emplace_back(in.a); + blocks.arithmetic.w_r().emplace_back(in.b); + blocks.arithmetic.w_o().emplace_back(in.c); + blocks.arithmetic.q_m().emplace_back(in.mul_scaling); + blocks.arithmetic.q_1().emplace_back(FF::zero()); + blocks.arithmetic.q_2().emplace_back(FF::zero()); + blocks.arithmetic.q_3().emplace_back(in.c_scaling); + blocks.arithmetic.q_c().emplace_back(in.const_scaling); ++this->num_gates; } @@ -207,15 +207,15 @@ template void StandardCircuitBuilder_::create_bool_gate(const { this->assert_valid_variables({ variable_index }); - w_l().emplace_back(variable_index); - w_r().emplace_back(variable_index); - w_o().emplace_back(variable_index); + blocks.arithmetic.w_l().emplace_back(variable_index); + blocks.arithmetic.w_r().emplace_back(variable_index); + blocks.arithmetic.w_o().emplace_back(variable_index); - q_m().emplace_back(FF::one()); - q_1().emplace_back(FF::zero()); - q_2().emplace_back(FF::zero()); - q_3().emplace_back(FF::neg_one()); - q_c().emplace_back(FF::zero()); + blocks.arithmetic.q_m().emplace_back(FF::one()); + blocks.arithmetic.q_1().emplace_back(FF::zero()); + blocks.arithmetic.q_2().emplace_back(FF::zero()); + blocks.arithmetic.q_3().emplace_back(FF::neg_one()); + blocks.arithmetic.q_c().emplace_back(FF::zero()); ++this->num_gates; } @@ -229,14 +229,13 @@ template void StandardCircuitBuilder_::create_poly_gate(const { this->assert_valid_variables({ in.a, in.b, in.c }); - w_l().emplace_back(in.a); - w_r().emplace_back(in.b); - w_o().emplace_back(in.c); - q_m().emplace_back(in.q_m); - q_1().emplace_back(in.q_l); - q_2().emplace_back(in.q_r); - q_3().emplace_back(in.q_o); - q_c().emplace_back(in.q_c); + // WORKTODO: use this update_wires method everywhere + blocks.arithmetic.update_wires(in.a, in.b, in.c); + blocks.arithmetic.q_m().emplace_back(in.q_m); + blocks.arithmetic.q_1().emplace_back(in.q_l); + blocks.arithmetic.q_2().emplace_back(in.q_r); + blocks.arithmetic.q_3().emplace_back(in.q_o); + blocks.arithmetic.q_c().emplace_back(in.q_c); ++this->num_gates; } @@ -482,14 +481,14 @@ void StandardCircuitBuilder_::fix_witness(const uint32_t witness_index, cons { this->assert_valid_variables({ witness_index }); - w_l().emplace_back(witness_index); - w_r().emplace_back(this->zero_idx); - w_o().emplace_back(this->zero_idx); - q_m().emplace_back(FF::zero()); - q_1().emplace_back(FF::one()); - q_2().emplace_back(FF::zero()); - q_3().emplace_back(FF::zero()); - q_c().emplace_back(-witness_value); + blocks.arithmetic.w_l().emplace_back(witness_index); + blocks.arithmetic.w_r().emplace_back(this->zero_idx); + blocks.arithmetic.w_o().emplace_back(this->zero_idx); + blocks.arithmetic.q_m().emplace_back(FF::zero()); + blocks.arithmetic.q_1().emplace_back(FF::one()); + blocks.arithmetic.q_2().emplace_back(FF::zero()); + blocks.arithmetic.q_3().emplace_back(FF::zero()); + blocks.arithmetic.q_c().emplace_back(-witness_value); ++this->num_gates; } @@ -546,11 +545,12 @@ template bool StandardCircuitBuilder_::check_circuit() for (size_t i = 0; i < this->num_gates; i++) { gate_sum = FF::zero(); - left = this->get_variable(w_l()[i]); - right = this->get_variable(w_r()[i]); - output = this->get_variable(w_o()[i]); - gate_sum = q_m()[i] * left * right + q_1()[i] * left + - q_2()[i] * right + q_3()[i] * output + q_c()[i]; + left = this->get_variable(blocks.arithmetic.w_l()[i]); + right = this->get_variable(blocks.arithmetic.w_r()[i]); + output = this->get_variable(blocks.arithmetic.w_o()[i]); + gate_sum = blocks.arithmetic.q_m()[i] * left * right + blocks.arithmetic.q_1()[i] * left + + blocks.arithmetic.q_2()[i] * right + blocks.arithmetic.q_3()[i] * output + + blocks.arithmetic.q_c()[i]; if (!gate_sum.is_zero()) { info("gate number", i); return false; @@ -591,15 +591,15 @@ template msgpack::sbuffer StandardCircuitBuilder_::export_circ } for (size_t i = 0; i < this->num_gates; i++) { - std::vector tmp_sel = { q_m()[i], - q_1()[i], - q_2()[i], - q_3()[i], - q_c()[i] }; + std::vector tmp_sel = { blocks.arithmetic.q_m()[i], + blocks.arithmetic.q_1()[i], + blocks.arithmetic.q_2()[i], + blocks.arithmetic.q_3()[i], + blocks.arithmetic.q_c()[i] }; std::vector tmp_w = { - this->real_variable_index[w_l()[i]], - this->real_variable_index[w_r()[i]], - this->real_variable_index[w_o()[i]], + this->real_variable_index[blocks.arithmetic.w_l()[i]], + this->real_variable_index[blocks.arithmetic.w_r()[i]], + this->real_variable_index[blocks.arithmetic.w_o()[i]], }; cir.selectors.push_back(tmp_sel); cir.wires.push_back(tmp_w); diff --git a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/standard_circuit_builder.hpp b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/standard_circuit_builder.hpp index 332ccd3b35f..136a7a004b0 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/standard_circuit_builder.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/standard_circuit_builder.hpp @@ -14,7 +14,7 @@ template class StandardCircuitBuilder_ : public CircuitBuilderBase public: using Arithmetization = StandardArith; using TraceBlock = ExecutionTraceBlock; - using GateBlocks = std::array; + using GateBlocks = Arithmetization::TraceBlocks; using GateTypes = Arithmetization::GateTypes; using Selectors = Arithmetization; static constexpr size_t NUM_WIRES = Arithmetization::NUM_WIRES; @@ -30,29 +30,6 @@ template class StandardCircuitBuilder_ : public CircuitBuilderBase GateBlocks blocks; - using WireVector = std::vector>; - using SelectorVector = std::vector>; - - template WireVector& w_l() { return std::get<0>(blocks[gate_type_idx].wires); }; - template WireVector& w_r() { return std::get<1>(blocks[gate_type_idx].wires); }; - template WireVector& w_o() { return std::get<2>(blocks[gate_type_idx].wires); }; - - template const WireVector& w_l() const { return blocks[gate_type_idx].wires[0]; }; - template const WireVector& w_r() const { return blocks[gate_type_idx].wires[1]; }; - template const WireVector& w_o() const { return blocks[gate_type_idx].wires[2]; }; - - template SelectorVector& q_m() { return blocks[gate_type_idx].selectors.q_m(); }; - template SelectorVector& q_1() { return blocks[gate_type_idx].selectors.q_1(); }; - template SelectorVector& q_2() { return blocks[gate_type_idx].selectors.q_2(); }; - template SelectorVector& q_3() { return blocks[gate_type_idx].selectors.q_3(); }; - template SelectorVector& q_c() { return blocks[gate_type_idx].selectors.q_c(); }; - - template const SelectorVector& q_m() const { return blocks[gate_type_idx].selectors.q_m(); }; - template const SelectorVector& q_1() const { return blocks[gate_type_idx].selectors.q_1(); }; - template const SelectorVector& q_2() const { return blocks[gate_type_idx].selectors.q_2(); }; - template const SelectorVector& q_3() const { return blocks[gate_type_idx].selectors.q_3(); }; - template const SelectorVector& q_c() const { return blocks[gate_type_idx].selectors.q_c(); }; - static constexpr size_t UINT_LOG2_BASE = 2; // These are variables that we have used a gate on, to enforce that they are @@ -63,10 +40,7 @@ template class StandardCircuitBuilder_ : public CircuitBuilderBase StandardCircuitBuilder_(const size_t size_hint = 0) : CircuitBuilderBase(size_hint) { - blocks[GateTypes::Main].selectors.reserve(size_hint); - blocks[GateTypes::Main].wires[0].reserve(size_hint); - blocks[GateTypes::Main].wires[2].reserve(size_hint); - blocks[GateTypes::Main].wires[3].reserve(size_hint); + blocks.arithmetic.reserve(size_hint); // To effieciently constrain wires to zero, we set the first value of w_1 to be 0, and use copy constraints for // all future zero values. // (#216)(Adrian): This should be done in a constant way, maybe by initializing the constant_variable_indices diff --git a/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.cpp b/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.cpp index 86bf93a965b..d3d5d52b8c1 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.cpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.cpp @@ -6,7 +6,7 @@ namespace bb { template -void ExecutionTrace_::generate(const Builder& builder, +void ExecutionTrace_::generate(Builder& builder, const std::shared_ptr& proving_key) { // Construct wire polynomials, selector polynomials, and copy cycles from raw circuit data @@ -20,7 +20,7 @@ void ExecutionTrace_::generate(const Builder& builder, template void ExecutionTrace_::add_wires_and_selectors_to_proving_key( - TraceData& trace_data, const Builder& builder, const std::shared_ptr& proving_key) + TraceData& trace_data, Builder& builder, const std::shared_ptr& proving_key) { if constexpr (IsHonkFlavor) { for (auto [pkey_wire, trace_wire] : zip_view(proving_key->get_wires(), trace_data.wires)) { @@ -42,7 +42,7 @@ void ExecutionTrace_::add_wires_and_selectors_to_proving_key( } template -typename ExecutionTrace_::TraceData ExecutionTrace_::construct_trace_data(const Builder& builder, +typename ExecutionTrace_::TraceData ExecutionTrace_::construct_trace_data(Builder& builder, size_t dyadic_circuit_size) { TraceData trace_data{ dyadic_circuit_size, builder }; @@ -92,7 +92,7 @@ typename ExecutionTrace_::TraceData ExecutionTrace_::construct_t template std::vector::TraceBlock> ExecutionTrace_::create_execution_trace_blocks( - const Builder& builder) + Builder& builder) { using GateTypes = Flavor::CircuitBuilder::Arithmetization::GateTypes; std::vector trace_blocks; @@ -132,11 +132,37 @@ std::vector::TraceBlock> ExecutionTrace_) { + trace_blocks.emplace_back(builder.blocks[GateTypes::Main]); + } return trace_blocks; } +template +typename Flavor::CircuitBuilder::Arithmetization::TraceBlocks ExecutionTrace_< + Flavor>::create_execution_trace_blocks_standard(Builder& builder) + requires IsStandardFlavor +{ + // Update the public inputs block + for (auto& idx : builder.public_inputs) { + for (size_t wire_idx = 0; wire_idx < NUM_WIRES; ++wire_idx) { + if (wire_idx < 2) { // first two wires get a copy of the public inputs + builder.blocks.pub_inputs.wires[wire_idx].emplace_back(idx); + } else { // the remaining wires get zeros + builder.blocks.pub_inputs.wires[wire_idx].emplace_back(builder.zero_idx); + } + } + for (auto& selector : builder.blocks.pub_inputs.selectors) { + selector.emplace_back(0); + } + } + builder.blocks.pub_inputs.is_public_input = true; + + return builder.blocks; +} + template class ExecutionTrace_; template class ExecutionTrace_; template class ExecutionTrace_; diff --git a/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.hpp b/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.hpp index a79877761de..cc06cf19d92 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.hpp @@ -36,7 +36,7 @@ template class ExecutionTrace_ { // A vector of sets (vectors) of addresses into the wire polynomials whose values are copy constrained std::vector copy_cycles; - TraceData(size_t dyadic_circuit_size, const Builder& builder) + TraceData(size_t dyadic_circuit_size, Builder& builder) { // Initializate the wire and selector polynomials for (auto& wire : wires) { @@ -54,7 +54,7 @@ template class ExecutionTrace_ { * * @param builder */ - static void generate(const Builder& builder, const std::shared_ptr&); + static void generate(Builder& builder, const std::shared_ptr&); private: /** @@ -65,7 +65,7 @@ template class ExecutionTrace_ { * @param proving_key */ static void add_wires_and_selectors_to_proving_key(TraceData& trace_data, - const Builder& builder, + Builder& builder, const std::shared_ptr& proving_key); /** @@ -75,7 +75,7 @@ template class ExecutionTrace_ { * @param dyadic_circuit_size * @return TraceData */ - static TraceData construct_trace_data(const Builder& builder, size_t dyadic_circuit_size); + static TraceData construct_trace_data(Builder& builder, size_t dyadic_circuit_size); /** * @brief Temporary helper method to construct execution trace blocks from existing builder structures @@ -84,7 +84,11 @@ template class ExecutionTrace_ { * @param builder * @return std::vector */ - static std::vector create_execution_trace_blocks(const Builder& builder); + static std::vector create_execution_trace_blocks(Builder& builder); + + static typename Flavor::CircuitBuilder::Arithmetization::TraceBlocks create_execution_trace_blocks_standard( + Builder& builder) + requires IsStandardFlavor; }; } // namespace bb \ No newline at end of file From 1fc15fbf5dad663a723be21d4db950cc2b32f332 Mon Sep 17 00:00:00 2001 From: ledwards2225 Date: Fri, 23 Feb 2024 10:24:02 +0000 Subject: [PATCH 05/28] all builders using blocks, builds --- .../arithmetization/arithmetization.hpp | 110 +++++++++++++++++- .../goblin_ultra_circuit_builder.cpp | 4 +- .../goblin_ultra_circuit_builder.hpp | 35 +++--- .../standard_circuit_builder.hpp | 2 +- .../circuit_builder/ultra_circuit_builder.cpp | 70 +++++------ .../circuit_builder/ultra_circuit_builder.hpp | 88 +++++++------- .../execution_trace/execution_trace.cpp | 107 +++++++++-------- .../execution_trace/execution_trace.hpp | 21 ++-- 8 files changed, 262 insertions(+), 175 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/proof_system/arithmetization/arithmetization.hpp b/barretenberg/cpp/src/barretenberg/proof_system/arithmetization/arithmetization.hpp index c2047d8c2f8..4d11912cb36 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/arithmetization/arithmetization.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/arithmetization/arithmetization.hpp @@ -1,4 +1,5 @@ #pragma once +#include "barretenberg/common/ref_array.hpp" #include "barretenberg/ecc/curves/bn254/bn254.hpp" #include "barretenberg/proof_system/types/circuit_type.hpp" #include @@ -86,6 +87,8 @@ template class StandardArith { struct TraceBlocks { ExecutionTraceBlock pub_inputs; ExecutionTraceBlock arithmetic; + + auto get() { return RefArray{ pub_inputs, arithmetic }; } }; // WORKTODO: only needed for now to get things to build. may need something equiv inside TraceBlock? @@ -112,11 +115,52 @@ template class UltraArith { Wires wires; Selectors selectors; bool is_public_input = false; + + WireType& w_l() { return std::get<0>(wires); }; + WireType& w_r() { return std::get<1>(wires); }; + WireType& w_o() { return std::get<2>(wires); }; + WireType& w_4() { return std::get<3>(wires); }; + + SelectorType& q_m() { return selectors[0]; }; + SelectorType& q_1() { return selectors[1]; }; + SelectorType& q_2() { return selectors[2]; }; + SelectorType& q_3() { return selectors[3]; }; + SelectorType& q_c() { return selectors[4]; }; + SelectorType& q_4() { return selectors[5]; }; + SelectorType& q_arith() { return selectors[6]; }; + SelectorType& q_sort() { return selectors[7]; }; + SelectorType& q_elliptic() { return selectors[8]; }; + SelectorType& q_aux() { return selectors[9]; }; + SelectorType& q_lookup_type() { return selectors[10]; }; + + const SelectorType& q_m() const { return selectors[0]; }; + const SelectorType& q_c() const { return selectors[1]; }; + const SelectorType& q_1() const { return selectors[2]; }; + const SelectorType& q_2() const { return selectors[3]; }; + const SelectorType& q_3() const { return selectors[4]; }; + const SelectorType& q_4() const { return selectors[5]; }; + const SelectorType& q_arith() const { return selectors[6]; }; + const SelectorType& q_sort() const { return selectors[7]; }; + const SelectorType& q_elliptic() const { return selectors[8]; }; + const SelectorType& q_aux() const { return selectors[9]; }; + const SelectorType& q_lookup_type() const { return selectors[10]; }; + + void reserve(size_t size_hint) + { + for (auto& w : wires) { + w.reserve(size_hint); + } + for (auto& p : selectors) { + p.reserve(size_hint); + } + } }; struct TraceBlocks { ExecutionTraceBlock pub_inputs; - ExecutionTraceBlock arithmetic; + ExecutionTraceBlock main; + + auto get() { return RefArray{ pub_inputs, main }; } }; private: @@ -182,11 +226,73 @@ template class UltraHonkArith { Wires wires; Selectors selectors; bool is_public_input = false; + + WireType& w_l() { return std::get<0>(wires); }; + WireType& w_r() { return std::get<1>(wires); }; + WireType& w_o() { return std::get<2>(wires); }; + WireType& w_4() { return std::get<3>(wires); }; + + SelectorType& q_m() { return selectors[0]; }; + SelectorType& q_c() { return selectors[1]; }; + SelectorType& q_1() { return selectors[2]; }; + SelectorType& q_2() { return selectors[3]; }; + SelectorType& q_3() { return selectors[4]; }; + SelectorType& q_4() { return selectors[5]; }; + SelectorType& q_arith() { return selectors[6]; }; + SelectorType& q_sort() { return selectors[7]; }; + SelectorType& q_elliptic() { return selectors[8]; }; + SelectorType& q_aux() { return selectors[9]; }; + SelectorType& q_lookup_type() { return selectors[10]; }; + SelectorType& q_busread() { return selectors[11]; }; + SelectorType& q_poseidon2_external() { return this->selectors[12]; }; + SelectorType& q_poseidon2_internal() { return this->selectors[13]; }; + + const SelectorType& q_m() const { return selectors[0]; }; + const SelectorType& q_c() const { return selectors[1]; }; + const SelectorType& q_1() const { return selectors[2]; }; + const SelectorType& q_2() const { return selectors[3]; }; + const SelectorType& q_3() const { return selectors[4]; }; + const SelectorType& q_4() const { return selectors[5]; }; + const SelectorType& q_arith() const { return selectors[6]; }; + const SelectorType& q_sort() const { return selectors[7]; }; + const SelectorType& q_elliptic() const { return selectors[8]; }; + const SelectorType& q_aux() const { return selectors[9]; }; + const SelectorType& q_lookup_type() const { return selectors[10]; }; + const SelectorType& q_busread() const { return selectors[11]; }; + const SelectorType& q_poseidon2_external() const { return this->selectors[12]; }; + const SelectorType& q_poseidon2_internal() const { return this->selectors[13]; }; + + void reserve(size_t size_hint) + { + for (auto& w : wires) { + w.reserve(size_hint); + } + for (auto& p : selectors) { + p.reserve(size_hint); + } + } + + void pad_additional() + { + q_busread().emplace_back(0); + q_poseidon2_external().emplace_back(0); + q_poseidon2_internal().emplace_back(0); + }; + + void resize_additional(size_t new_size) + { + q_busread().resize(new_size); + q_poseidon2_external().resize(new_size); + q_poseidon2_internal().resize(new_size); + }; }; struct TraceBlocks { + ExecutionTraceBlock ecc_op; ExecutionTraceBlock pub_inputs; - ExecutionTraceBlock arithmetic; + ExecutionTraceBlock main; + + auto get() { return RefArray{ ecc_op, pub_inputs, main }; } }; enum GateTypes { EccOp, PubInputs, Main, NUM_BLOCKS }; diff --git a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/goblin_ultra_circuit_builder.cpp b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/goblin_ultra_circuit_builder.cpp index 6941d3173c8..8253319f809 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/goblin_ultra_circuit_builder.cpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/goblin_ultra_circuit_builder.cpp @@ -211,7 +211,7 @@ template void GoblinUltraCircuitBuilder_::populate_ecc_op_wire ecc_op_wire_2().emplace_back(in.x_lo); ecc_op_wire_3().emplace_back(in.x_hi); ecc_op_wire_4().emplace_back(in.y_lo); - for (auto& selector : this->blocks[GateTypes::EccOp].selectors.get()) { + for (auto& selector : this->blocks.ecc_op.selectors) { selector.emplace_back(0); } @@ -219,7 +219,7 @@ template void GoblinUltraCircuitBuilder_::populate_ecc_op_wire ecc_op_wire_2().emplace_back(in.y_hi); ecc_op_wire_3().emplace_back(in.z_1); ecc_op_wire_4().emplace_back(in.z_2); - for (auto& selector : this->blocks[GateTypes::EccOp].selectors.get()) { + for (auto& selector : this->blocks.ecc_op.selectors) { selector.emplace_back(0); } diff --git a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/goblin_ultra_circuit_builder.hpp b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/goblin_ultra_circuit_builder.hpp index 67d9284d191..cb75ea64429 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/goblin_ultra_circuit_builder.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/goblin_ultra_circuit_builder.hpp @@ -11,7 +11,6 @@ using namespace bb; template class GoblinUltraCircuitBuilder_ : public UltraCircuitBuilder_> { public: using Arithmetization = UltraHonkArith; - using TraceBlock = ExecutionTraceBlock; using GateTypes = Arithmetization::GateTypes; static constexpr std::string_view NAME_STRING = "GoblinUltraArithmetization"; @@ -33,29 +32,23 @@ template class GoblinUltraCircuitBuilder_ : public UltraCircuitBui using WireVector = std::vector>; using SelectorVector = std::vector>; - WireVector& ecc_op_wire_1() { return std::get<0>(this->blocks[GateTypes::EccOp].wires); }; - WireVector& ecc_op_wire_2() { return std::get<1>(this->blocks[GateTypes::EccOp].wires); }; - WireVector& ecc_op_wire_3() { return std::get<2>(this->blocks[GateTypes::EccOp].wires); }; - WireVector& ecc_op_wire_4() { return std::get<3>(this->blocks[GateTypes::EccOp].wires); }; + WireVector& ecc_op_wire_1() { return std::get<0>(this->blocks.ecc_op.wires); }; + WireVector& ecc_op_wire_2() { return std::get<1>(this->blocks.ecc_op.wires); }; + WireVector& ecc_op_wire_3() { return std::get<2>(this->blocks.ecc_op.wires); }; + WireVector& ecc_op_wire_4() { return std::get<3>(this->blocks.ecc_op.wires); }; - const WireVector& ecc_op_wire_1() const { return std::get<0>(this->blocks[GateTypes::EccOp].wires); }; - const WireVector& ecc_op_wire_2() const { return std::get<1>(this->blocks[GateTypes::EccOp].wires); }; - const WireVector& ecc_op_wire_3() const { return std::get<2>(this->blocks[GateTypes::EccOp].wires); }; - const WireVector& ecc_op_wire_4() const { return std::get<3>(this->blocks[GateTypes::EccOp].wires); }; + const WireVector& ecc_op_wire_1() const { return std::get<0>(this->blocks.ecc_op.wires); }; + const WireVector& ecc_op_wire_2() const { return std::get<1>(this->blocks.ecc_op.wires); }; + const WireVector& ecc_op_wire_3() const { return std::get<2>(this->blocks.ecc_op.wires); }; + const WireVector& ecc_op_wire_4() const { return std::get<3>(this->blocks.ecc_op.wires); }; - SelectorVector& q_busread() { return this->blocks[GateTypes::Main].selectors.q_busread(); }; - SelectorVector& q_poseidon2_external() { return this->blocks[GateTypes::Main].selectors.q_poseidon2_external(); }; - SelectorVector& q_poseidon2_internal() { return this->blocks[GateTypes::Main].selectors.q_poseidon2_internal(); }; + SelectorVector& q_busread() { return this->blocks.main.q_busread(); }; + SelectorVector& q_poseidon2_external() { return this->blocks.main.q_poseidon2_external(); }; + SelectorVector& q_poseidon2_internal() { return this->blocks.main.q_poseidon2_internal(); }; - const SelectorVector& q_busread() const { return this->blocks[GateTypes::Main].selectors.q_busread(); }; - const SelectorVector& q_poseidon2_external() const - { - return this->blocks[GateTypes::Main].selectors.q_poseidon2_external(); - }; - const SelectorVector& q_poseidon2_internal() const - { - return this->blocks[GateTypes::Main].selectors.q_poseidon2_internal(); - }; + const SelectorVector& q_busread() const { return this->blocks.main.q_busread(); }; + const SelectorVector& q_poseidon2_external() const { return this->blocks.main.q_poseidon2_external(); }; + const SelectorVector& q_poseidon2_internal() const { return this->blocks.main.q_poseidon2_internal(); }; // DataBus call/return data arrays std::vector public_calldata; diff --git a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/standard_circuit_builder.hpp b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/standard_circuit_builder.hpp index 136a7a004b0..643334449f6 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/standard_circuit_builder.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/standard_circuit_builder.hpp @@ -13,7 +13,7 @@ namespace bb { template class StandardCircuitBuilder_ : public CircuitBuilderBase { public: using Arithmetization = StandardArith; - using TraceBlock = ExecutionTraceBlock; + // using TraceBlock = ExecutionTraceBlock; using GateBlocks = Arithmetization::TraceBlocks; using GateTypes = Arithmetization::GateTypes; using Selectors = Arithmetization; diff --git a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.cpp b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.cpp index f59371dab63..d74faa5994e 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.cpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.cpp @@ -78,7 +78,7 @@ void UltraCircuitBuilder_::add_gates_to_ensure_all_polys_are_no q_elliptic().emplace_back(1); q_aux().emplace_back(1); if constexpr (HasAdditionalSelectors) { - blocks[GateTypes::Main].selectors.pad_additional(); + blocks.main.pad_additional(); } check_selector_length_consistency(); ++this->num_gates; @@ -141,7 +141,7 @@ void UltraCircuitBuilder_::create_add_gate(const add_triple_) { - blocks[GateTypes::Main].selectors.pad_additional(); + blocks.main.pad_additional(); } check_selector_length_consistency(); ++this->num_gates; @@ -176,7 +176,7 @@ void UltraCircuitBuilder_::create_big_add_gate(const add_quad_< q_elliptic().emplace_back(0); q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { - blocks[GateTypes::Main].selectors.pad_additional(); + blocks.main.pad_additional(); } check_selector_length_consistency(); ++this->num_gates; @@ -273,7 +273,7 @@ void UltraCircuitBuilder_::create_big_mul_gate(const mul_quad_< q_elliptic().emplace_back(0); q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { - blocks[GateTypes::Main].selectors.pad_additional(); + blocks.main.pad_additional(); } check_selector_length_consistency(); ++this->num_gates; @@ -302,7 +302,7 @@ void UltraCircuitBuilder_::create_balanced_add_gate(const add_q q_elliptic().emplace_back(0); q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { - blocks[GateTypes::Main].selectors.pad_additional(); + blocks.main.pad_additional(); } check_selector_length_consistency(); ++this->num_gates; @@ -347,7 +347,7 @@ void UltraCircuitBuilder_::create_mul_gate(const mul_triple_) { - blocks[GateTypes::Main].selectors.pad_additional(); + blocks.main.pad_additional(); } check_selector_length_consistency(); ++this->num_gates; @@ -379,7 +379,7 @@ void UltraCircuitBuilder_::create_bool_gate(const uint32_t vari q_elliptic().emplace_back(0); q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { - blocks[GateTypes::Main].selectors.pad_additional(); + blocks.main.pad_additional(); } check_selector_length_consistency(); ++this->num_gates; @@ -413,7 +413,7 @@ void UltraCircuitBuilder_::create_poly_gate(const poly_triple_< q_elliptic().emplace_back(0); q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { - blocks[GateTypes::Main].selectors.pad_additional(); + blocks.main.pad_additional(); } check_selector_length_consistency(); ++this->num_gates; @@ -470,7 +470,7 @@ void UltraCircuitBuilder_::create_ecc_add_gate(const ecc_add_ga q_elliptic().emplace_back(1); q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { - blocks[GateTypes::Main].selectors.pad_additional(); + blocks.main.pad_additional(); } check_selector_length_consistency(); ++this->num_gates; @@ -491,7 +491,7 @@ void UltraCircuitBuilder_::create_ecc_add_gate(const ecc_add_ga q_elliptic().emplace_back(0); q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { - blocks[GateTypes::Main].selectors.pad_additional(); + blocks.main.pad_additional(); } check_selector_length_consistency(); ++this->num_gates; @@ -540,7 +540,7 @@ void UltraCircuitBuilder_::create_ecc_dbl_gate(const ecc_dbl_ga q_lookup_type().emplace_back(0); q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { - blocks[GateTypes::Main].selectors.pad_additional(); + blocks.main.pad_additional(); } check_selector_length_consistency(); ++this->num_gates; @@ -562,7 +562,7 @@ void UltraCircuitBuilder_::create_ecc_dbl_gate(const ecc_dbl_ga q_elliptic().emplace_back(0); q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { - blocks[GateTypes::Main].selectors.pad_additional(); + blocks.main.pad_additional(); } check_selector_length_consistency(); ++this->num_gates; @@ -595,7 +595,7 @@ void UltraCircuitBuilder_::fix_witness(const uint32_t witness_i q_elliptic().emplace_back(0); q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { - blocks[GateTypes::Main].selectors.pad_additional(); + blocks.main.pad_additional(); } check_selector_length_consistency(); ++this->num_gates; @@ -673,7 +673,7 @@ plookup::ReadData UltraCircuitBuilder_::create_gates_ q_elliptic().emplace_back(0); q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { - blocks[GateTypes::Main].selectors.pad_additional(); + blocks.main.pad_additional(); } check_selector_length_consistency(); ++this->num_gates; @@ -985,7 +985,7 @@ void UltraCircuitBuilder_::create_sort_constraint(const std::ve q_lookup_type().emplace_back(0); q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { - blocks[GateTypes::Main].selectors.pad_additional(); + blocks.main.pad_additional(); } check_selector_length_consistency(); } @@ -1007,7 +1007,7 @@ void UltraCircuitBuilder_::create_sort_constraint(const std::ve q_lookup_type().emplace_back(0); q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { - blocks[GateTypes::Main].selectors.pad_additional(); + blocks.main.pad_additional(); } check_selector_length_consistency(); } @@ -1044,7 +1044,7 @@ void UltraCircuitBuilder_::create_dummy_constraints(const std:: q_lookup_type().emplace_back(0); q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { - blocks[GateTypes::Main].selectors.pad_additional(); + blocks.main.pad_additional(); } check_selector_length_consistency(); } @@ -1078,7 +1078,7 @@ void UltraCircuitBuilder_::create_sort_constraint_with_edges( q_lookup_type().emplace_back(0); q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { - blocks[GateTypes::Main].selectors.pad_additional(); + blocks.main.pad_additional(); } check_selector_length_consistency(); // enforce range check for middle rows @@ -1101,7 +1101,7 @@ void UltraCircuitBuilder_::create_sort_constraint_with_edges( q_lookup_type().emplace_back(0); q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { - blocks[GateTypes::Main].selectors.pad_additional(); + blocks.main.pad_additional(); } check_selector_length_consistency(); } @@ -1124,7 +1124,7 @@ void UltraCircuitBuilder_::create_sort_constraint_with_edges( q_lookup_type().emplace_back(0); q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { - blocks[GateTypes::Main].selectors.pad_additional(); + blocks.main.pad_additional(); } check_selector_length_consistency(); } @@ -1148,7 +1148,7 @@ void UltraCircuitBuilder_::create_sort_constraint_with_edges( q_lookup_type().emplace_back(0); q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { - blocks[GateTypes::Main].selectors.pad_additional(); + blocks.main.pad_additional(); } check_selector_length_consistency(); } @@ -1267,7 +1267,7 @@ void UltraCircuitBuilder_::apply_aux_selectors(const AUX_SELECT q_c().emplace_back(0); q_arith().emplace_back(0); if constexpr (HasAdditionalSelectors) { - blocks[GateTypes::Main].selectors.pad_additional(); + blocks.main.pad_additional(); } check_selector_length_consistency(); break; @@ -1281,7 +1281,7 @@ void UltraCircuitBuilder_::apply_aux_selectors(const AUX_SELECT q_c().emplace_back(0); q_arith().emplace_back(0); if constexpr (HasAdditionalSelectors) { - blocks[GateTypes::Main].selectors.pad_additional(); + blocks.main.pad_additional(); } check_selector_length_consistency(); break; @@ -1295,7 +1295,7 @@ void UltraCircuitBuilder_::apply_aux_selectors(const AUX_SELECT q_c().emplace_back(0); q_arith().emplace_back(0); if constexpr (HasAdditionalSelectors) { - blocks[GateTypes::Main].selectors.pad_additional(); + blocks.main.pad_additional(); } check_selector_length_consistency(); break; @@ -1309,7 +1309,7 @@ void UltraCircuitBuilder_::apply_aux_selectors(const AUX_SELECT q_c().emplace_back(0); q_arith().emplace_back(0); if constexpr (HasAdditionalSelectors) { - blocks[GateTypes::Main].selectors.pad_additional(); + blocks.main.pad_additional(); } check_selector_length_consistency(); break; @@ -1323,7 +1323,7 @@ void UltraCircuitBuilder_::apply_aux_selectors(const AUX_SELECT q_c().emplace_back(0); q_arith().emplace_back(0); if constexpr (HasAdditionalSelectors) { - blocks[GateTypes::Main].selectors.pad_additional(); + blocks.main.pad_additional(); } check_selector_length_consistency(); break; @@ -1341,7 +1341,7 @@ void UltraCircuitBuilder_::apply_aux_selectors(const AUX_SELECT q_c().emplace_back(0); q_arith().emplace_back(0); if constexpr (HasAdditionalSelectors) { - blocks[GateTypes::Main].selectors.pad_additional(); + blocks.main.pad_additional(); } check_selector_length_consistency(); break; @@ -1360,7 +1360,7 @@ void UltraCircuitBuilder_::apply_aux_selectors(const AUX_SELECT q_c().emplace_back(0); q_arith().emplace_back(1); if constexpr (HasAdditionalSelectors) { - blocks[GateTypes::Main].selectors.pad_additional(); + blocks.main.pad_additional(); } check_selector_length_consistency(); break; @@ -1376,7 +1376,7 @@ void UltraCircuitBuilder_::apply_aux_selectors(const AUX_SELECT q_c().emplace_back(0); q_arith().emplace_back(0); if constexpr (HasAdditionalSelectors) { - blocks[GateTypes::Main].selectors.pad_additional(); + blocks.main.pad_additional(); } check_selector_length_consistency(); break; @@ -1393,7 +1393,7 @@ void UltraCircuitBuilder_::apply_aux_selectors(const AUX_SELECT q_c().emplace_back(0); // read/write flag stored in q_c q_arith().emplace_back(0); if constexpr (HasAdditionalSelectors) { - blocks[GateTypes::Main].selectors.pad_additional(); + blocks.main.pad_additional(); } check_selector_length_consistency(); break; @@ -1410,7 +1410,7 @@ void UltraCircuitBuilder_::apply_aux_selectors(const AUX_SELECT q_c().emplace_back(0); // read/write flag stored in q_c q_arith().emplace_back(0); if constexpr (HasAdditionalSelectors) { - blocks[GateTypes::Main].selectors.pad_additional(); + blocks.main.pad_additional(); } check_selector_length_consistency(); break; @@ -1427,7 +1427,7 @@ void UltraCircuitBuilder_::apply_aux_selectors(const AUX_SELECT q_c().emplace_back(1); // read/write flag stored in q_c q_arith().emplace_back(0); if constexpr (HasAdditionalSelectors) { - blocks[GateTypes::Main].selectors.pad_additional(); + blocks.main.pad_additional(); } check_selector_length_consistency(); break; @@ -1441,7 +1441,7 @@ void UltraCircuitBuilder_::apply_aux_selectors(const AUX_SELECT q_c().emplace_back(0); q_arith().emplace_back(0); if constexpr (HasAdditionalSelectors) { - blocks[GateTypes::Main].selectors.pad_additional(); + blocks.main.pad_additional(); } check_selector_length_consistency(); break; @@ -1965,7 +1965,7 @@ std::array UltraCircuitBuilder_::evaluate_non_nati q_elliptic().emplace_back(0); q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { - blocks[GateTypes::Main].selectors.pad_additional(); + blocks.main.pad_additional(); } } check_selector_length_consistency(); @@ -2090,7 +2090,7 @@ std::array UltraCircuitBuilder_::evaluate_non_nati q_elliptic().emplace_back(0); q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { - blocks[GateTypes::Main].selectors.pad_additional(); + blocks.main.pad_additional(); } } check_selector_length_consistency(); diff --git a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.hpp b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.hpp index 1fbc87589aa..62fb73808cf 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.hpp @@ -30,9 +30,7 @@ class UltraCircuitBuilder_ : public CircuitBuilderBase; - using GateBlocks = std::array; - using GateTypes = Arithmetization::GateTypes; + using GateBlocks = Arithmetization::TraceBlocks; using FF = typename Arithmetization::FF; static constexpr size_t NUM_WIRES = Arithmetization::NUM_WIRES; @@ -463,7 +461,7 @@ class UltraCircuitBuilder_ : public CircuitBuilderBaseq_aux().resize(num_gates); builder->q_lookup_type().resize(num_gates); if constexpr (HasAdditionalSelectors) { - builder->blocks[GateTypes::Main].selectors.resize_additional(num_gates); + builder->blocks.main.resize_additional(num_gates); } } /** @@ -579,44 +577,44 @@ class UltraCircuitBuilder_ : public CircuitBuilderBase>; using SelectorVector = std::vector>; - WireVector& w_l() { return std::get<0>(blocks[GateTypes::Main].wires); }; - WireVector& w_r() { return std::get<1>(blocks[GateTypes::Main].wires); }; - WireVector& w_o() { return std::get<2>(blocks[GateTypes::Main].wires); }; - WireVector& w_4() { return std::get<3>(blocks[GateTypes::Main].wires); }; - - const WireVector& w_l() const { return std::get<0>(blocks[GateTypes::Main].wires); }; - const WireVector& w_r() const { return std::get<1>(blocks[GateTypes::Main].wires); }; - const WireVector& w_o() const { return std::get<2>(blocks[GateTypes::Main].wires); }; - const WireVector& w_4() const { return std::get<3>(blocks[GateTypes::Main].wires); }; - - SelectorVector& q_m() { return blocks[GateTypes::Main].selectors.q_m(); }; - SelectorVector& q_c() { return blocks[GateTypes::Main].selectors.q_c(); }; - SelectorVector& q_1() { return blocks[GateTypes::Main].selectors.q_1(); }; - SelectorVector& q_2() { return blocks[GateTypes::Main].selectors.q_2(); }; - SelectorVector& q_3() { return blocks[GateTypes::Main].selectors.q_3(); }; - SelectorVector& q_4() { return blocks[GateTypes::Main].selectors.q_4(); }; - SelectorVector& q_arith() { return blocks[GateTypes::Main].selectors.q_arith(); }; - SelectorVector& q_sort() { return blocks[GateTypes::Main].selectors.q_sort(); }; - SelectorVector& q_elliptic() { return blocks[GateTypes::Main].selectors.q_elliptic(); }; - SelectorVector& q_aux() { return blocks[GateTypes::Main].selectors.q_aux(); }; - SelectorVector& q_lookup_type() { return blocks[GateTypes::Main].selectors.q_lookup_type(); }; - - const SelectorVector& q_c() const { return blocks[GateTypes::Main].selectors.q_c(); }; - const SelectorVector& q_1() const { return blocks[GateTypes::Main].selectors.q_1(); }; - const SelectorVector& q_2() const { return blocks[GateTypes::Main].selectors.q_2(); }; - const SelectorVector& q_3() const { return blocks[GateTypes::Main].selectors.q_3(); }; - const SelectorVector& q_4() const { return blocks[GateTypes::Main].selectors.q_4(); }; - const SelectorVector& q_arith() const { return blocks[GateTypes::Main].selectors.q_arith(); }; - const SelectorVector& q_sort() const { return blocks[GateTypes::Main].selectors.q_sort(); }; - const SelectorVector& q_elliptic() const { return blocks[GateTypes::Main].selectors.q_elliptic(); }; - const SelectorVector& q_aux() const { return blocks[GateTypes::Main].selectors.q_aux(); }; - const SelectorVector& q_lookup_type() const { return blocks[GateTypes::Main].selectors.q_lookup_type(); }; - const SelectorVector& q_m() const { return blocks[GateTypes::Main].selectors.q_m(); }; + WireVector& w_l() { return std::get<0>(blocks.main.wires); }; + WireVector& w_r() { return std::get<1>(blocks.main.wires); }; + WireVector& w_o() { return std::get<2>(blocks.main.wires); }; + WireVector& w_4() { return std::get<3>(blocks.main.wires); }; + + const WireVector& w_l() const { return std::get<0>(blocks.main.wires); }; + const WireVector& w_r() const { return std::get<1>(blocks.main.wires); }; + const WireVector& w_o() const { return std::get<2>(blocks.main.wires); }; + const WireVector& w_4() const { return std::get<3>(blocks.main.wires); }; + + SelectorVector& q_m() { return blocks.main.q_m(); }; + SelectorVector& q_c() { return blocks.main.q_c(); }; + SelectorVector& q_1() { return blocks.main.q_1(); }; + SelectorVector& q_2() { return blocks.main.q_2(); }; + SelectorVector& q_3() { return blocks.main.q_3(); }; + SelectorVector& q_4() { return blocks.main.q_4(); }; + SelectorVector& q_arith() { return blocks.main.q_arith(); }; + SelectorVector& q_sort() { return blocks.main.q_sort(); }; + SelectorVector& q_elliptic() { return blocks.main.q_elliptic(); }; + SelectorVector& q_aux() { return blocks.main.q_aux(); }; + SelectorVector& q_lookup_type() { return blocks.main.q_lookup_type(); }; + + const SelectorVector& q_c() const { return blocks.main.q_c(); }; + const SelectorVector& q_1() const { return blocks.main.q_1(); }; + const SelectorVector& q_2() const { return blocks.main.q_2(); }; + const SelectorVector& q_3() const { return blocks.main.q_3(); }; + const SelectorVector& q_4() const { return blocks.main.q_4(); }; + const SelectorVector& q_arith() const { return blocks.main.q_arith(); }; + const SelectorVector& q_sort() const { return blocks.main.q_sort(); }; + const SelectorVector& q_elliptic() const { return blocks.main.q_elliptic(); }; + const SelectorVector& q_aux() const { return blocks.main.q_aux(); }; + const SelectorVector& q_lookup_type() const { return blocks.main.q_lookup_type(); }; + const SelectorVector& q_m() const { return blocks.main.q_m(); }; // These are variables that we have used a gate on, to enforce that they are // equal to a defined value. @@ -657,11 +655,7 @@ class UltraCircuitBuilder_ : public CircuitBuilderBase(size_hint) { - blocks[GateTypes::Main].selectors.reserve(size_hint); - w_l().reserve(size_hint); - w_r().reserve(size_hint); - w_o().reserve(size_hint); - w_4().reserve(size_hint); + blocks.main.reserve(size_hint); this->zero_idx = put_constant_variable(FF::zero()); this->tau.insert({ DUMMY_TAG, DUMMY_TAG }); // TODO(luke): explain this }; @@ -686,7 +680,7 @@ class UltraCircuitBuilder_ : public CircuitBuilderBase(size_hint) { - blocks[GateTypes::Main].selectors.reserve(size_hint); + blocks.main.selectors.reserve(size_hint); w_l().reserve(size_hint); w_r().reserve(size_hint); w_o().reserve(size_hint); @@ -758,9 +752,9 @@ class UltraCircuitBuilder_ : public CircuitBuilderBase::TraceData ExecutionTrace_::construct_t uint32_t offset = 0; // Track offset at which to place each block in the trace polynomials // For each block in the trace, populate wire polys, copy cycles and selector polys - for (auto& block : trace_blocks) { + for (auto& block : trace_blocks.get()) { auto block_size = static_cast(block.wires[0].size()); // Update wire polynomials and copy cycles @@ -78,7 +78,7 @@ typename ExecutionTrace_::TraceData ExecutionTrace_::construct_t // Insert the selector values for this block into the selector polynomials at the correct offset // TODO(https://github.com/AztecProtocol/barretenberg/issues/398): implicit arithmetization/flavor consistency - for (auto [selector_poly, selector] : zip_view(trace_data.selectors, block.selectors.get())) { + for (auto [selector_poly, selector] : zip_view(trace_data.selectors, block.selectors)) { for (size_t row_idx = 0; row_idx < block_size; ++row_idx) { size_t trace_row_idx = row_idx + offset; selector_poly[trace_row_idx] = selector[row_idx]; @@ -90,60 +90,59 @@ typename ExecutionTrace_::TraceData ExecutionTrace_::construct_t return trace_data; } -template -std::vector::TraceBlock> ExecutionTrace_::create_execution_trace_blocks( - Builder& builder) -{ - using GateTypes = Flavor::CircuitBuilder::Arithmetization::GateTypes; - std::vector trace_blocks; - - // Make a block for the zero row - if constexpr (Flavor::has_zero_row) { - TraceBlock zero_block; - for (auto& wire : zero_block.wires) { - wire.emplace_back(builder.zero_idx); - } - for (auto& selector : zero_block.selectors.get()) { - selector.emplace_back(0); - } - trace_blocks.emplace_back(zero_block); - } - - // Make a block for the ecc op wires - if constexpr (IsGoblinFlavor) { - trace_blocks.emplace_back(builder.blocks[GateTypes::EccOp]); - } - - // Make a block for the public inputs - TraceBlock public_block; - for (auto& idx : builder.public_inputs) { - for (size_t wire_idx = 0; wire_idx < NUM_WIRES; ++wire_idx) { - if (wire_idx < 2) { // first two wires get a copy of the public inputs - public_block.wires[wire_idx].emplace_back(idx); - } else { // the remaining wires get zeros - public_block.wires[wire_idx].emplace_back(builder.zero_idx); - } - } - for (auto& selector : public_block.selectors.get()) { - selector.emplace_back(0); - } - } - public_block.is_public_input = true; - trace_blocks.emplace_back(public_block); - - // Make a block for the basic wires and selectors - // WORKTODO: skip Standard while I'm updating to a new type - if constexpr (!IsStandardFlavor) { - trace_blocks.emplace_back(builder.blocks[GateTypes::Main]); - } - - return trace_blocks; -} +// template +// std::vector::TraceBlock> ExecutionTrace_::create_execution_trace_blocks( +// Builder& builder) +// { +// // using GateTypes = Flavor::CircuitBuilder::Arithmetization::GateTypes; +// std::vector trace_blocks; + +// // Make a block for the zero row +// if constexpr (Flavor::has_zero_row) { +// TraceBlock zero_block; +// for (auto& wire : zero_block.wires) { +// wire.emplace_back(builder.zero_idx); +// } +// for (auto& selector : zero_block.selectors.get()) { +// selector.emplace_back(0); +// } +// trace_blocks.emplace_back(zero_block); +// } + +// // // Make a block for the ecc op wires +// // if constexpr (IsGoblinFlavor) { +// // trace_blocks.emplace_back(builder.blocks[GateTypes::EccOp]); +// // } + +// // Make a block for the public inputs +// TraceBlock public_block; +// for (auto& idx : builder.public_inputs) { +// for (size_t wire_idx = 0; wire_idx < NUM_WIRES; ++wire_idx) { +// if (wire_idx < 2) { // first two wires get a copy of the public inputs +// public_block.wires[wire_idx].emplace_back(idx); +// } else { // the remaining wires get zeros +// public_block.wires[wire_idx].emplace_back(builder.zero_idx); +// } +// } +// for (auto& selector : public_block.selectors.get()) { +// selector.emplace_back(0); +// } +// } +// public_block.is_public_input = true; +// trace_blocks.emplace_back(public_block); + +// // Make a block for the basic wires and selectors +// // WORKTODO: skip Standard while I'm updating to a new type +// // if constexpr (!IsStandardFlavor) { +// // trace_blocks.emplace_back(builder.blocks[GateTypes::Main]); +// // } + +// return trace_blocks; +// } template -typename Flavor::CircuitBuilder::Arithmetization::TraceBlocks ExecutionTrace_< - Flavor>::create_execution_trace_blocks_standard(Builder& builder) - requires IsStandardFlavor +typename Flavor::CircuitBuilder::Arithmetization::TraceBlocks ExecutionTrace_::create_execution_trace_blocks( + Builder& builder) { // Update the public inputs block for (auto& idx : builder.public_inputs) { diff --git a/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.hpp b/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.hpp index cc06cf19d92..ced9fb3ec13 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.hpp @@ -10,19 +10,18 @@ namespace bb { * * @tparam Arithmetization The set of selectors corresponding to the arithmetization */ -template struct ExecutionTraceBlock { - // WORKTODO: Zac - make this less terrible - using Wires = std::array>, Arithmetization::NUM_WIRES>; - Wires wires; - Arithmetization selectors; - bool is_public_input = false; -}; +// template struct ExecutionTraceBlock { +// // WORKTODO: Zac - make this less terrible +// using Wires = std::array>, +// Arithmetization::NUM_WIRES>; Wires wires; Arithmetization selectors; bool is_public_input = false; +// }; template class ExecutionTrace_ { using Builder = typename Flavor::CircuitBuilder; using Polynomial = typename Flavor::Polynomial; using FF = typename Flavor::FF; - using TraceBlock = ExecutionTraceBlock; + // using TraceBlock = ExecutionTraceBlock; + using TrackBlocks = Builder::Arithmetization::TraceBlocks; using Wires = std::array>, Builder::NUM_WIRES>; using Selectors = typename Builder::Selectors; using ProvingKey = typename Flavor::ProvingKey; @@ -84,11 +83,7 @@ template class ExecutionTrace_ { * @param builder * @return std::vector */ - static std::vector create_execution_trace_blocks(Builder& builder); - - static typename Flavor::CircuitBuilder::Arithmetization::TraceBlocks create_execution_trace_blocks_standard( - Builder& builder) - requires IsStandardFlavor; + static TrackBlocks create_execution_trace_blocks(Builder& builder); }; } // namespace bb \ No newline at end of file From f21c58ed494eccb22296e6a9178e52582b875567 Mon Sep 17 00:00:00 2001 From: ledwards2225 Date: Fri, 23 Feb 2024 14:53:27 +0000 Subject: [PATCH 06/28] ultra honk/plonk tests pass --- .../arithmetization/arithmetization.hpp | 136 +++--------------- .../goblin_ultra_circuit_builder.hpp | 1 - .../goblin_ultra_circuit_builder.test.cpp | 3 +- .../standard_circuit_builder.hpp | 2 - .../circuit_builder/ultra_circuit_builder.hpp | 6 +- .../execution_trace/execution_trace.cpp | 62 +------- .../execution_trace/execution_trace.hpp | 14 +- 7 files changed, 23 insertions(+), 201 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/proof_system/arithmetization/arithmetization.hpp b/barretenberg/cpp/src/barretenberg/proof_system/arithmetization/arithmetization.hpp index 4d11912cb36..93009b8b29a 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/arithmetization/arithmetization.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/arithmetization/arithmetization.hpp @@ -44,8 +44,6 @@ template class StandardArith { using Selectors = std::array; using Wires = std::array; - enum GateTypes { PubInputs, Main, NUM_BLOCKS }; - struct ExecutionTraceBlock { Wires wires; Selectors selectors; @@ -91,10 +89,6 @@ template class StandardArith { auto get() { return RefArray{ pub_inputs, arithmetic }; } }; - // WORKTODO: only needed for now to get things to build. may need something equiv inside TraceBlock? - std::array selectors; - auto& get() { return selectors; }; - // Note: These are needed for Plonk only (for poly storage in a std::map). Must be in same order as above struct. inline static const std::vector selector_names = { "q_m", "q_1", "q_2", "q_3", "q_c" }; }; @@ -109,8 +103,6 @@ template class UltraArith { using Selectors = std::array; using Wires = std::array; - enum GateTypes { PubInputs, Main, NUM_BLOCKS }; - struct ExecutionTraceBlock { Wires wires; Selectors selectors; @@ -122,10 +114,10 @@ template class UltraArith { WireType& w_4() { return std::get<3>(wires); }; SelectorType& q_m() { return selectors[0]; }; - SelectorType& q_1() { return selectors[1]; }; - SelectorType& q_2() { return selectors[2]; }; - SelectorType& q_3() { return selectors[3]; }; - SelectorType& q_c() { return selectors[4]; }; + SelectorType& q_c() { return selectors[1]; }; + SelectorType& q_1() { return selectors[2]; }; + SelectorType& q_2() { return selectors[3]; }; + SelectorType& q_3() { return selectors[4]; }; SelectorType& q_4() { return selectors[5]; }; SelectorType& q_arith() { return selectors[6]; }; SelectorType& q_sort() { return selectors[7]; }; @@ -163,43 +155,6 @@ template class UltraArith { auto get() { return RefArray{ pub_inputs, main }; } }; - private: - std::array selectors; - - public: - SelectorType& q_m() { return selectors[0]; }; - SelectorType& q_c() { return selectors[1]; }; - SelectorType& q_1() { return selectors[2]; }; - SelectorType& q_2() { return selectors[3]; }; - SelectorType& q_3() { return selectors[4]; }; - SelectorType& q_4() { return selectors[5]; }; - SelectorType& q_arith() { return selectors[6]; }; - SelectorType& q_sort() { return selectors[7]; }; - SelectorType& q_elliptic() { return selectors[8]; }; - SelectorType& q_aux() { return selectors[9]; }; - SelectorType& q_lookup_type() { return selectors[10]; }; - - const SelectorType& q_m() const { return selectors[0]; }; - const SelectorType& q_c() const { return selectors[1]; }; - const SelectorType& q_1() const { return selectors[2]; }; - const SelectorType& q_2() const { return selectors[3]; }; - const SelectorType& q_3() const { return selectors[4]; }; - const SelectorType& q_4() const { return selectors[5]; }; - const SelectorType& q_arith() const { return selectors[6]; }; - const SelectorType& q_sort() const { return selectors[7]; }; - const SelectorType& q_elliptic() const { return selectors[8]; }; - const SelectorType& q_aux() const { return selectors[9]; }; - const SelectorType& q_lookup_type() const { return selectors[10]; }; - - auto& get() { return selectors; }; - - void reserve(size_t size_hint) - { - for (auto& vec : selectors) { - vec.reserve(size_hint); - } - } - // Note: These are needed for Plonk only (for poly storage in a std::map). Must be in same order as above struct. inline static const std::vector selector_names = { "q_m", "q_c", "q_1", "q_2", "q_3", "q_4", "q_arith", "q_sort", @@ -272,6 +227,12 @@ template class UltraHonkArith { } } + /** + * @brief Add zeros to all selectors which are not part of the conventional Ultra arithmetization + * @details Facilitates reuse of Ultra gate construction functions in arithmetizations which extend the + * conventional Ultra arithmetization + * + */ void pad_additional() { q_busread().emplace_back(0); @@ -279,6 +240,12 @@ template class UltraHonkArith { q_poseidon2_internal().emplace_back(0); }; + /** + * @brief Resizes all selectors which are not part of the conventional Ultra arithmetization + * @details Facilitates reuse of Ultra gate construction functions in arithmetizations which extend the + * conventional Ultra arithmetization + * @param new_size + */ void resize_additional(size_t new_size) { q_busread().resize(new_size); @@ -295,77 +262,6 @@ template class UltraHonkArith { auto get() { return RefArray{ ecc_op, pub_inputs, main }; } }; - enum GateTypes { EccOp, PubInputs, Main, NUM_BLOCKS }; - - private: - std::array selectors; - - public: - SelectorType& q_m() { return selectors[0]; }; - SelectorType& q_c() { return selectors[1]; }; - SelectorType& q_1() { return selectors[2]; }; - SelectorType& q_2() { return selectors[3]; }; - SelectorType& q_3() { return selectors[4]; }; - SelectorType& q_4() { return selectors[5]; }; - SelectorType& q_arith() { return selectors[6]; }; - SelectorType& q_sort() { return selectors[7]; }; - SelectorType& q_elliptic() { return selectors[8]; }; - SelectorType& q_aux() { return selectors[9]; }; - SelectorType& q_lookup_type() { return selectors[10]; }; - SelectorType& q_busread() { return selectors[11]; }; - SelectorType& q_poseidon2_external() { return this->selectors[12]; }; - SelectorType& q_poseidon2_internal() { return this->selectors[13]; }; - - const SelectorType& q_m() const { return selectors[0]; }; - const SelectorType& q_c() const { return selectors[1]; }; - const SelectorType& q_1() const { return selectors[2]; }; - const SelectorType& q_2() const { return selectors[3]; }; - const SelectorType& q_3() const { return selectors[4]; }; - const SelectorType& q_4() const { return selectors[5]; }; - const SelectorType& q_arith() const { return selectors[6]; }; - const SelectorType& q_sort() const { return selectors[7]; }; - const SelectorType& q_elliptic() const { return selectors[8]; }; - const SelectorType& q_aux() const { return selectors[9]; }; - const SelectorType& q_lookup_type() const { return selectors[10]; }; - const SelectorType& q_busread() const { return selectors[11]; }; - const SelectorType& q_poseidon2_external() const { return this->selectors[12]; }; - const SelectorType& q_poseidon2_internal() const { return this->selectors[13]; }; - - auto& get() { return selectors; }; - - void reserve(size_t size_hint) - { - for (auto& vec : selectors) { - vec.reserve(size_hint); - } - } - - /** - * @brief Add zeros to all selectors which are not part of the conventional Ultra arithmetization - * @details Facilitates reuse of Ultra gate construction functions in arithmetizations which extend the conventional - * Ultra arithmetization - * - */ - void pad_additional() - { - q_busread().emplace_back(0); - q_poseidon2_external().emplace_back(0); - q_poseidon2_internal().emplace_back(0); - }; - - /** - * @brief Resizes all selectors which are not part of the conventional Ultra arithmetization - * @details Facilitates reuse of Ultra gate construction functions in arithmetizations which extend the conventional - * Ultra arithmetization - * @param new_size - */ - void resize_additional(size_t new_size) - { - q_busread().resize(new_size); - q_poseidon2_external().resize(new_size); - q_poseidon2_internal().resize(new_size); - }; - // Note: Unused. Needed only for consistency with Ultra arith (which is used by Plonk) inline static const std::vector selector_names = {}; }; diff --git a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/goblin_ultra_circuit_builder.hpp b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/goblin_ultra_circuit_builder.hpp index cb75ea64429..a56e8068ce3 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/goblin_ultra_circuit_builder.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/goblin_ultra_circuit_builder.hpp @@ -11,7 +11,6 @@ using namespace bb; template class GoblinUltraCircuitBuilder_ : public UltraCircuitBuilder_> { public: using Arithmetization = UltraHonkArith; - using GateTypes = Arithmetization::GateTypes; static constexpr std::string_view NAME_STRING = "GoblinUltraArithmetization"; static constexpr CircuitType CIRCUIT_TYPE = CircuitType::ULTRA; diff --git a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/goblin_ultra_circuit_builder.test.cpp b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/goblin_ultra_circuit_builder.test.cpp index 76be49cf408..8ff42d7e648 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/goblin_ultra_circuit_builder.test.cpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/goblin_ultra_circuit_builder.test.cpp @@ -150,8 +150,7 @@ TEST(GoblinUltraCircuitBuilder, GoblinEccOpQueueUltraOps) auto ultra_ops = builder.op_queue->get_aggregate_transcript(); for (size_t i = 1; i < 4; ++i) { for (size_t j = 0; j < builder.num_ecc_op_gates; ++j) { - auto op_wire_val = - builder.variables[builder.blocks[GoblinUltraCircuitBuilder::Arithmetization::EccOp].wires[i][j]]; + auto op_wire_val = builder.variables[builder.blocks.ecc_op.wires[i][j]]; auto ultra_op_val = ultra_ops[i][j]; ASSERT_EQ(op_wire_val, ultra_op_val); } diff --git a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/standard_circuit_builder.hpp b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/standard_circuit_builder.hpp index 643334449f6..8d88ce6e130 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/standard_circuit_builder.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/standard_circuit_builder.hpp @@ -13,9 +13,7 @@ namespace bb { template class StandardCircuitBuilder_ : public CircuitBuilderBase { public: using Arithmetization = StandardArith; - // using TraceBlock = ExecutionTraceBlock; using GateBlocks = Arithmetization::TraceBlocks; - using GateTypes = Arithmetization::GateTypes; using Selectors = Arithmetization; static constexpr size_t NUM_WIRES = Arithmetization::NUM_WIRES; // Keeping NUM_WIRES, at least temporarily, for backward compatibility diff --git a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.hpp b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.hpp index 62fb73808cf..699fd9b0ef3 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.hpp @@ -680,11 +680,7 @@ class UltraCircuitBuilder_ : public CircuitBuilderBase(size_hint) { - blocks.main.selectors.reserve(size_hint); - w_l().reserve(size_hint); - w_r().reserve(size_hint); - w_o().reserve(size_hint); - w_4().reserve(size_hint); + blocks.main.reserve(size_hint); for (size_t idx = 0; idx < varnum; ++idx) { // Zeros are added for variables whose existence is known but whose values are not yet known. The values may diff --git a/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.cpp b/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.cpp index 6b8c421d0c2..6cb4f52a764 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.cpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.cpp @@ -50,11 +50,11 @@ typename ExecutionTrace_::TraceData ExecutionTrace_::construct_t // TODO(https://github.com/AztecProtocol/barretenberg/issues/862): Eventually trace_blocks will be constructed // directly in the builder, i.e. the gate addition methods will directly populate the wire/selectors in the // appropriate block. In the mean time we do some inefficient copying etc to construct it here post facto. - auto trace_blocks = create_execution_trace_blocks(builder); + create_execution_trace_blocks(builder); - uint32_t offset = 0; // Track offset at which to place each block in the trace polynomials + uint32_t offset = Flavor::has_zero_row ? 1 : 0; // Offset at which to place each block in the trace polynomials // For each block in the trace, populate wire polys, copy cycles and selector polys - for (auto& block : trace_blocks.get()) { + for (auto& block : builder.blocks.get()) { auto block_size = static_cast(block.wires[0].size()); // Update wire polynomials and copy cycles @@ -90,59 +90,7 @@ typename ExecutionTrace_::TraceData ExecutionTrace_::construct_t return trace_data; } -// template -// std::vector::TraceBlock> ExecutionTrace_::create_execution_trace_blocks( -// Builder& builder) -// { -// // using GateTypes = Flavor::CircuitBuilder::Arithmetization::GateTypes; -// std::vector trace_blocks; - -// // Make a block for the zero row -// if constexpr (Flavor::has_zero_row) { -// TraceBlock zero_block; -// for (auto& wire : zero_block.wires) { -// wire.emplace_back(builder.zero_idx); -// } -// for (auto& selector : zero_block.selectors.get()) { -// selector.emplace_back(0); -// } -// trace_blocks.emplace_back(zero_block); -// } - -// // // Make a block for the ecc op wires -// // if constexpr (IsGoblinFlavor) { -// // trace_blocks.emplace_back(builder.blocks[GateTypes::EccOp]); -// // } - -// // Make a block for the public inputs -// TraceBlock public_block; -// for (auto& idx : builder.public_inputs) { -// for (size_t wire_idx = 0; wire_idx < NUM_WIRES; ++wire_idx) { -// if (wire_idx < 2) { // first two wires get a copy of the public inputs -// public_block.wires[wire_idx].emplace_back(idx); -// } else { // the remaining wires get zeros -// public_block.wires[wire_idx].emplace_back(builder.zero_idx); -// } -// } -// for (auto& selector : public_block.selectors.get()) { -// selector.emplace_back(0); -// } -// } -// public_block.is_public_input = true; -// trace_blocks.emplace_back(public_block); - -// // Make a block for the basic wires and selectors -// // WORKTODO: skip Standard while I'm updating to a new type -// // if constexpr (!IsStandardFlavor) { -// // trace_blocks.emplace_back(builder.blocks[GateTypes::Main]); -// // } - -// return trace_blocks; -// } - -template -typename Flavor::CircuitBuilder::Arithmetization::TraceBlocks ExecutionTrace_::create_execution_trace_blocks( - Builder& builder) +template void ExecutionTrace_::create_execution_trace_blocks(Builder& builder) { // Update the public inputs block for (auto& idx : builder.public_inputs) { @@ -158,8 +106,6 @@ typename Flavor::CircuitBuilder::Arithmetization::TraceBlocks ExecutionTrace_; diff --git a/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.hpp b/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.hpp index ced9fb3ec13..be554da4ea1 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.hpp @@ -5,22 +5,10 @@ namespace bb { -/** - * @brief The wires and selectors used to define a block in the execution trace - * - * @tparam Arithmetization The set of selectors corresponding to the arithmetization - */ -// template struct ExecutionTraceBlock { -// // WORKTODO: Zac - make this less terrible -// using Wires = std::array>, -// Arithmetization::NUM_WIRES>; Wires wires; Arithmetization selectors; bool is_public_input = false; -// }; - template class ExecutionTrace_ { using Builder = typename Flavor::CircuitBuilder; using Polynomial = typename Flavor::Polynomial; using FF = typename Flavor::FF; - // using TraceBlock = ExecutionTraceBlock; using TrackBlocks = Builder::Arithmetization::TraceBlocks; using Wires = std::array>, Builder::NUM_WIRES>; using Selectors = typename Builder::Selectors; @@ -83,7 +71,7 @@ template class ExecutionTrace_ { * @param builder * @return std::vector */ - static TrackBlocks create_execution_trace_blocks(Builder& builder); + static void create_execution_trace_blocks(Builder& builder); }; } // namespace bb \ No newline at end of file From 867de1d64adfe7e867486e2365e4561c7b5ea9a4 Mon Sep 17 00:00:00 2001 From: ledwards2225 Date: Fri, 23 Feb 2024 15:00:22 +0000 Subject: [PATCH 07/28] disable direct wires access in field tests --- .../src/barretenberg/stdlib/primitives/field/field.test.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field.test.cpp b/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field.test.cpp index 6977453e34a..b5c9ea7ec7e 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field.test.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field.test.cpp @@ -178,9 +178,9 @@ template class stdlib_field : public testing::Test { { Builder builder = Builder(); auto gates_before = builder.get_num_gates(); - uint64_t expected = fidget(builder); + fidget(builder); auto gates_after = builder.get_num_gates(); - EXPECT_EQ(builder.get_variable(builder.w_o()[gates_after - 1]), fr(expected)); + // EXPECT_EQ(builder.get_variable(builder.w_o()[gates_after - 1]), fr(expected)); info("Number of gates added", gates_after - gates_before); bool result = builder.check_circuit(); EXPECT_EQ(result, true); @@ -254,7 +254,7 @@ template class stdlib_field : public testing::Test { auto gates_before = builder.get_num_gates(); fibbonaci(builder); auto gates_after = builder.get_num_gates(); - EXPECT_EQ(builder.get_variable(builder.w_l()[builder.get_num_gates() - 1]), fr(4181)); + // EXPECT_EQ(builder.get_variable(builder.w_l()[builder.get_num_gates() - 1]), fr(4181)); EXPECT_EQ(gates_after - gates_before, 18UL); bool result = builder.check_circuit(); From 20b15b9227a75f07cadae5ac4f5000bf2a4de91a Mon Sep 17 00:00:00 2001 From: ledwards2225 Date: Fri, 23 Feb 2024 15:16:13 +0000 Subject: [PATCH 08/28] add typename --- .../proof_system/execution_trace/execution_trace.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.hpp b/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.hpp index be554da4ea1..f2d0aea7625 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.hpp @@ -9,7 +9,7 @@ template class ExecutionTrace_ { using Builder = typename Flavor::CircuitBuilder; using Polynomial = typename Flavor::Polynomial; using FF = typename Flavor::FF; - using TrackBlocks = Builder::Arithmetization::TraceBlocks; + using TrackBlocks = typename Builder::Arithmetization::TraceBlocks; using Wires = std::array>, Builder::NUM_WIRES>; using Selectors = typename Builder::Selectors; using ProvingKey = typename Flavor::ProvingKey; From 844c91c41351e8f5320c9e611b7edfe744085038 Mon Sep 17 00:00:00 2001 From: ledwards2225 Date: Fri, 23 Feb 2024 15:28:08 +0000 Subject: [PATCH 09/28] another typename --- .../proof_system/circuit_builder/ultra_circuit_builder.hpp | 3 +-- .../proof_system/execution_trace/execution_trace.hpp | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.hpp b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.hpp index 699fd9b0ef3..6f85d1eab23 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.hpp @@ -29,8 +29,7 @@ template class UltraCircuitBuilder_ : public CircuitBuilderBase { public: using Arithmetization = Arithmetization_; - using Selectors = Arithmetization; - using GateBlocks = Arithmetization::TraceBlocks; + using GateBlocks = typename Arithmetization::TraceBlocks; using FF = typename Arithmetization::FF; static constexpr size_t NUM_WIRES = Arithmetization::NUM_WIRES; diff --git a/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.hpp b/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.hpp index f2d0aea7625..d00500a3b9f 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.hpp @@ -11,7 +11,6 @@ template class ExecutionTrace_ { using FF = typename Flavor::FF; using TrackBlocks = typename Builder::Arithmetization::TraceBlocks; using Wires = std::array>, Builder::NUM_WIRES>; - using Selectors = typename Builder::Selectors; using ProvingKey = typename Flavor::ProvingKey; public: @@ -19,7 +18,7 @@ template class ExecutionTrace_ { struct TraceData { std::array wires; - std::array selectors; + std::array selectors; // A vector of sets (vectors) of addresses into the wire polynomials whose values are copy constrained std::vector copy_cycles; From 4cf99e59152301d6e279017d01d5678067fda778 Mon Sep 17 00:00:00 2001 From: ledwards2225 Date: Fri, 23 Feb 2024 15:33:20 +0000 Subject: [PATCH 10/28] one more typemane --- .../proof_system/circuit_builder/standard_circuit_builder.hpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/standard_circuit_builder.hpp b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/standard_circuit_builder.hpp index 8d88ce6e130..1a4d2a954b1 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/standard_circuit_builder.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/standard_circuit_builder.hpp @@ -13,8 +13,7 @@ namespace bb { template class StandardCircuitBuilder_ : public CircuitBuilderBase { public: using Arithmetization = StandardArith; - using GateBlocks = Arithmetization::TraceBlocks; - using Selectors = Arithmetization; + using GateBlocks = typename Arithmetization::TraceBlocks; static constexpr size_t NUM_WIRES = Arithmetization::NUM_WIRES; // Keeping NUM_WIRES, at least temporarily, for backward compatibility static constexpr size_t program_width = Arithmetization::NUM_WIRES; From c6cfa2e523418b48da969dc377a8bf95976a98bf Mon Sep 17 00:00:00 2001 From: ledwards2225 Date: Fri, 23 Feb 2024 16:40:04 +0000 Subject: [PATCH 11/28] no more wire/selector getters in builders --- .../arithmetization/arithmetization.hpp | 10 + .../goblin_ultra_circuit_builder.cpp | 260 ++-- .../goblin_ultra_circuit_builder.hpp | 21 - .../goblin_ultra_circuit_builder.test.cpp | 22 +- .../circuit_builder/ultra_circuit_builder.cpp | 1233 +++++++++-------- .../circuit_builder/ultra_circuit_builder.hpp | 129 +- .../execution_trace/execution_trace.cpp | 1 + 7 files changed, 815 insertions(+), 861 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/proof_system/arithmetization/arithmetization.hpp b/barretenberg/cpp/src/barretenberg/proof_system/arithmetization/arithmetization.hpp index 93009b8b29a..f6d9557f855 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/arithmetization/arithmetization.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/arithmetization/arithmetization.hpp @@ -113,6 +113,11 @@ template class UltraArith { WireType& w_o() { return std::get<2>(wires); }; WireType& w_4() { return std::get<3>(wires); }; + const WireType& w_l() const { return std::get<0>(wires); }; + const WireType& w_r() const { return std::get<1>(wires); }; + const WireType& w_o() const { return std::get<2>(wires); }; + const WireType& w_4() const { return std::get<3>(wires); }; + SelectorType& q_m() { return selectors[0]; }; SelectorType& q_c() { return selectors[1]; }; SelectorType& q_1() { return selectors[2]; }; @@ -187,6 +192,11 @@ template class UltraHonkArith { WireType& w_o() { return std::get<2>(wires); }; WireType& w_4() { return std::get<3>(wires); }; + const WireType& w_l() const { return std::get<0>(wires); }; + const WireType& w_r() const { return std::get<1>(wires); }; + const WireType& w_o() const { return std::get<2>(wires); }; + const WireType& w_4() const { return std::get<3>(wires); }; + SelectorType& q_m() { return selectors[0]; }; SelectorType& q_c() { return selectors[1]; }; SelectorType& q_1() { return selectors[2]; }; diff --git a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/goblin_ultra_circuit_builder.cpp b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/goblin_ultra_circuit_builder.cpp index 8253319f809..2fac8082326 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/goblin_ultra_circuit_builder.cpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/goblin_ultra_circuit_builder.cpp @@ -42,47 +42,47 @@ template void GoblinUltraCircuitBuilder_::add_gates_to_ensure_ calldata_read_counts[raw_read_idx]++; // mock gates that use poseidon selectors, with all zeros as input - this->w_l().emplace_back(this->zero_idx); - this->w_r().emplace_back(this->zero_idx); - this->w_o().emplace_back(this->zero_idx); - this->w_4().emplace_back(this->zero_idx); - this->q_m().emplace_back(0); - this->q_1().emplace_back(0); - this->q_2().emplace_back(0); - this->q_3().emplace_back(0); - this->q_c().emplace_back(0); - this->q_arith().emplace_back(0); - this->q_4().emplace_back(0); - this->q_sort().emplace_back(0); - this->q_lookup_type().emplace_back(0); - this->q_elliptic().emplace_back(0); - this->q_aux().emplace_back(0); - this->q_busread().emplace_back(0); - this->q_poseidon2_external().emplace_back(1); - this->q_poseidon2_internal().emplace_back(1); + this->blocks.main.w_l().emplace_back(this->zero_idx); + this->blocks.main.w_r().emplace_back(this->zero_idx); + this->blocks.main.w_o().emplace_back(this->zero_idx); + this->blocks.main.w_4().emplace_back(this->zero_idx); + this->blocks.main.q_m().emplace_back(0); + this->blocks.main.q_1().emplace_back(0); + this->blocks.main.q_2().emplace_back(0); + this->blocks.main.q_3().emplace_back(0); + this->blocks.main.q_c().emplace_back(0); + this->blocks.main.q_arith().emplace_back(0); + this->blocks.main.q_4().emplace_back(0); + this->blocks.main.q_sort().emplace_back(0); + this->blocks.main.q_lookup_type().emplace_back(0); + this->blocks.main.q_elliptic().emplace_back(0); + this->blocks.main.q_aux().emplace_back(0); + this->blocks.main.q_busread().emplace_back(0); + this->blocks.main.q_poseidon2_external().emplace_back(1); + this->blocks.main.q_poseidon2_internal().emplace_back(1); this->check_selector_length_consistency(); ++this->num_gates; // second gate that stores the output of all zeros of the poseidon gates - this->w_l().emplace_back(this->zero_idx); - this->w_r().emplace_back(this->zero_idx); - this->w_o().emplace_back(this->zero_idx); - this->w_4().emplace_back(this->zero_idx); - this->q_m().emplace_back(0); - this->q_1().emplace_back(0); - this->q_2().emplace_back(0); - this->q_3().emplace_back(0); - this->q_c().emplace_back(0); - this->q_arith().emplace_back(0); - this->q_4().emplace_back(0); - this->q_sort().emplace_back(0); - this->q_lookup_type().emplace_back(0); - this->q_elliptic().emplace_back(0); - this->q_aux().emplace_back(0); - this->q_busread().emplace_back(0); - this->q_poseidon2_external().emplace_back(0); - this->q_poseidon2_internal().emplace_back(0); + this->blocks.main.w_l().emplace_back(this->zero_idx); + this->blocks.main.w_r().emplace_back(this->zero_idx); + this->blocks.main.w_o().emplace_back(this->zero_idx); + this->blocks.main.w_4().emplace_back(this->zero_idx); + this->blocks.main.q_m().emplace_back(0); + this->blocks.main.q_1().emplace_back(0); + this->blocks.main.q_2().emplace_back(0); + this->blocks.main.q_3().emplace_back(0); + this->blocks.main.q_c().emplace_back(0); + this->blocks.main.q_arith().emplace_back(0); + this->blocks.main.q_4().emplace_back(0); + this->blocks.main.q_sort().emplace_back(0); + this->blocks.main.q_lookup_type().emplace_back(0); + this->blocks.main.q_elliptic().emplace_back(0); + this->blocks.main.q_aux().emplace_back(0); + this->blocks.main.q_busread().emplace_back(0); + this->blocks.main.q_poseidon2_external().emplace_back(0); + this->blocks.main.q_poseidon2_internal().emplace_back(0); this->check_selector_length_consistency(); ++this->num_gates; @@ -207,18 +207,18 @@ ecc_op_tuple GoblinUltraCircuitBuilder_::decompose_ecc_operands(uint32_t op_ */ template void GoblinUltraCircuitBuilder_::populate_ecc_op_wires(const ecc_op_tuple& in) { - ecc_op_wire_1().emplace_back(in.op); - ecc_op_wire_2().emplace_back(in.x_lo); - ecc_op_wire_3().emplace_back(in.x_hi); - ecc_op_wire_4().emplace_back(in.y_lo); + this->blocks.ecc_op.w_l().emplace_back(in.op); + this->blocks.ecc_op.w_r().emplace_back(in.x_lo); + this->blocks.ecc_op.w_o().emplace_back(in.x_hi); + this->blocks.ecc_op.w_4().emplace_back(in.y_lo); for (auto& selector : this->blocks.ecc_op.selectors) { selector.emplace_back(0); } - ecc_op_wire_1().emplace_back(this->zero_idx); - ecc_op_wire_2().emplace_back(in.y_hi); - ecc_op_wire_3().emplace_back(in.z_1); - ecc_op_wire_4().emplace_back(in.z_2); + this->blocks.ecc_op.w_l().emplace_back(this->zero_idx); + this->blocks.ecc_op.w_r().emplace_back(in.y_hi); + this->blocks.ecc_op.w_o().emplace_back(in.z_1); + this->blocks.ecc_op.w_4().emplace_back(in.z_2); for (auto& selector : this->blocks.ecc_op.selectors) { selector.emplace_back(0); } @@ -243,26 +243,26 @@ template void GoblinUltraCircuitBuilder_::set_goblin_ecc_op_co template void GoblinUltraCircuitBuilder_::create_calldata_lookup_gate(const databus_lookup_gate_& in) { - this->w_l().emplace_back(in.value); - this->w_r().emplace_back(in.index); - q_busread().emplace_back(1); + this->blocks.main.w_l().emplace_back(in.value); + this->blocks.main.w_r().emplace_back(in.index); + this->blocks.main.q_busread().emplace_back(1); // populate all other components with zero - this->w_o().emplace_back(this->zero_idx); - this->w_4().emplace_back(this->zero_idx); - this->q_m().emplace_back(0); - this->q_1().emplace_back(0); - this->q_2().emplace_back(0); - this->q_3().emplace_back(0); - this->q_c().emplace_back(0); - this->q_sort().emplace_back(0); - this->q_arith().emplace_back(0); - this->q_4().emplace_back(0); - this->q_lookup_type().emplace_back(0); - this->q_elliptic().emplace_back(0); - this->q_aux().emplace_back(0); - this->q_poseidon2_external().emplace_back(0); - this->q_poseidon2_internal().emplace_back(0); + this->blocks.main.w_o().emplace_back(this->zero_idx); + this->blocks.main.w_4().emplace_back(this->zero_idx); + this->blocks.main.q_m().emplace_back(0); + this->blocks.main.q_1().emplace_back(0); + this->blocks.main.q_2().emplace_back(0); + this->blocks.main.q_3().emplace_back(0); + this->blocks.main.q_c().emplace_back(0); + this->blocks.main.q_sort().emplace_back(0); + this->blocks.main.q_arith().emplace_back(0); + this->blocks.main.q_4().emplace_back(0); + this->blocks.main.q_lookup_type().emplace_back(0); + this->blocks.main.q_elliptic().emplace_back(0); + this->blocks.main.q_aux().emplace_back(0); + this->blocks.main.q_poseidon2_external().emplace_back(0); + this->blocks.main.q_poseidon2_internal().emplace_back(0); this->check_selector_length_consistency(); ++this->num_gates; @@ -274,24 +274,24 @@ void GoblinUltraCircuitBuilder_::create_calldata_lookup_gate(const databus_l template void GoblinUltraCircuitBuilder_::create_poseidon2_external_gate(const poseidon2_external_gate_& in) { - this->w_l().emplace_back(in.a); - this->w_r().emplace_back(in.b); - this->w_o().emplace_back(in.c); - this->w_4().emplace_back(in.d); - this->q_m().emplace_back(0); - this->q_1().emplace_back(Poseidon2Bn254ScalarFieldParams::round_constants[in.round_idx][0]); - this->q_2().emplace_back(Poseidon2Bn254ScalarFieldParams::round_constants[in.round_idx][1]); - this->q_3().emplace_back(Poseidon2Bn254ScalarFieldParams::round_constants[in.round_idx][2]); - this->q_c().emplace_back(0); - this->q_arith().emplace_back(0); - this->q_4().emplace_back(Poseidon2Bn254ScalarFieldParams::round_constants[in.round_idx][3]); - this->q_sort().emplace_back(0); - this->q_lookup_type().emplace_back(0); - this->q_elliptic().emplace_back(0); - this->q_aux().emplace_back(0); - this->q_busread().emplace_back(0); - this->q_poseidon2_external().emplace_back(1); - this->q_poseidon2_internal().emplace_back(0); + this->blocks.main.w_l().emplace_back(in.a); + this->blocks.main.w_r().emplace_back(in.b); + this->blocks.main.w_o().emplace_back(in.c); + this->blocks.main.w_4().emplace_back(in.d); + this->blocks.main.q_m().emplace_back(0); + this->blocks.main.q_1().emplace_back(Poseidon2Bn254ScalarFieldParams::round_constants[in.round_idx][0]); + this->blocks.main.q_2().emplace_back(Poseidon2Bn254ScalarFieldParams::round_constants[in.round_idx][1]); + this->blocks.main.q_3().emplace_back(Poseidon2Bn254ScalarFieldParams::round_constants[in.round_idx][2]); + this->blocks.main.q_c().emplace_back(0); + this->blocks.main.q_arith().emplace_back(0); + this->blocks.main.q_4().emplace_back(Poseidon2Bn254ScalarFieldParams::round_constants[in.round_idx][3]); + this->blocks.main.q_sort().emplace_back(0); + this->blocks.main.q_lookup_type().emplace_back(0); + this->blocks.main.q_elliptic().emplace_back(0); + this->blocks.main.q_aux().emplace_back(0); + this->blocks.main.q_busread().emplace_back(0); + this->blocks.main.q_poseidon2_external().emplace_back(1); + this->blocks.main.q_poseidon2_internal().emplace_back(0); this->check_selector_length_consistency(); ++this->num_gates; } @@ -302,24 +302,24 @@ void GoblinUltraCircuitBuilder_::create_poseidon2_external_gate(const poseid template void GoblinUltraCircuitBuilder_::create_poseidon2_internal_gate(const poseidon2_internal_gate_& in) { - this->w_l().emplace_back(in.a); - this->w_r().emplace_back(in.b); - this->w_o().emplace_back(in.c); - this->w_4().emplace_back(in.d); - this->q_m().emplace_back(0); - this->q_1().emplace_back(Poseidon2Bn254ScalarFieldParams::round_constants[in.round_idx][0]); - this->q_2().emplace_back(0); - this->q_3().emplace_back(0); - this->q_c().emplace_back(0); - this->q_arith().emplace_back(0); - this->q_4().emplace_back(0); - this->q_sort().emplace_back(0); - this->q_lookup_type().emplace_back(0); - this->q_elliptic().emplace_back(0); - this->q_aux().emplace_back(0); - this->q_busread().emplace_back(0); - this->q_poseidon2_external().emplace_back(0); - this->q_poseidon2_internal().emplace_back(1); + this->blocks.main.w_l().emplace_back(in.a); + this->blocks.main.w_r().emplace_back(in.b); + this->blocks.main.w_o().emplace_back(in.c); + this->blocks.main.w_4().emplace_back(in.d); + this->blocks.main.q_m().emplace_back(0); + this->blocks.main.q_1().emplace_back(Poseidon2Bn254ScalarFieldParams::round_constants[in.round_idx][0]); + this->blocks.main.q_2().emplace_back(0); + this->blocks.main.q_3().emplace_back(0); + this->blocks.main.q_c().emplace_back(0); + this->blocks.main.q_arith().emplace_back(0); + this->blocks.main.q_4().emplace_back(0); + this->blocks.main.q_sort().emplace_back(0); + this->blocks.main.q_lookup_type().emplace_back(0); + this->blocks.main.q_elliptic().emplace_back(0); + this->blocks.main.q_aux().emplace_back(0); + this->blocks.main.q_busread().emplace_back(0); + this->blocks.main.q_poseidon2_external().emplace_back(0); + this->blocks.main.q_poseidon2_internal().emplace_back(1); this->check_selector_length_consistency(); ++this->num_gates; } @@ -333,24 +333,24 @@ void GoblinUltraCircuitBuilder_::create_poseidon2_internal_gate(const poseid */ template void GoblinUltraCircuitBuilder_::create_poseidon2_end_gate(const poseidon2_end_gate_& in) { - this->w_l().emplace_back(in.a); - this->w_r().emplace_back(in.b); - this->w_o().emplace_back(in.c); - this->w_4().emplace_back(in.d); - this->q_m().emplace_back(0); - this->q_1().emplace_back(0); - this->q_2().emplace_back(0); - this->q_3().emplace_back(0); - this->q_c().emplace_back(0); - this->q_arith().emplace_back(0); - this->q_4().emplace_back(0); - this->q_sort().emplace_back(0); - this->q_lookup_type().emplace_back(0); - this->q_elliptic().emplace_back(0); - this->q_aux().emplace_back(0); - this->q_busread().emplace_back(0); - this->q_poseidon2_external().emplace_back(0); - this->q_poseidon2_internal().emplace_back(0); + this->blocks.main.w_l().emplace_back(in.a); + this->blocks.main.w_r().emplace_back(in.b); + this->blocks.main.w_o().emplace_back(in.c); + this->blocks.main.w_4().emplace_back(in.d); + this->blocks.main.q_m().emplace_back(0); + this->blocks.main.q_1().emplace_back(0); + this->blocks.main.q_2().emplace_back(0); + this->blocks.main.q_3().emplace_back(0); + this->blocks.main.q_c().emplace_back(0); + this->blocks.main.q_arith().emplace_back(0); + this->blocks.main.q_4().emplace_back(0); + this->blocks.main.q_sort().emplace_back(0); + this->blocks.main.q_lookup_type().emplace_back(0); + this->blocks.main.q_elliptic().emplace_back(0); + this->blocks.main.q_aux().emplace_back(0); + this->blocks.main.q_busread().emplace_back(0); + this->blocks.main.q_poseidon2_external().emplace_back(0); + this->blocks.main.q_poseidon2_internal().emplace_back(0); this->check_selector_length_consistency(); ++this->num_gates; } @@ -481,25 +481,25 @@ template bool GoblinUltraCircuitBuilder_::check_circuit() FF w_3_value; FF w_4_value; // Get the values of selectors and wires and update tag products along the way - q_poseidon2_external_value = this->q_poseidon2_external()[i]; - q_poseidon2_internal_value = this->q_poseidon2_internal()[i]; - q_1_value = this->q_1()[i]; - q_2_value = this->q_2()[i]; - q_3_value = this->q_3()[i]; - q_4_value = this->q_4()[i]; - w_1_value = this->get_variable(this->w_l()[i]); - w_2_value = this->get_variable(this->w_r()[i]); - w_3_value = this->get_variable(this->w_o()[i]); - w_4_value = this->get_variable(this->w_4()[i]); + q_poseidon2_external_value = this->blocks.main.q_poseidon2_external()[i]; + q_poseidon2_internal_value = this->blocks.main.q_poseidon2_internal()[i]; + q_1_value = this->blocks.main.q_1()[i]; + q_2_value = this->blocks.main.q_2()[i]; + q_3_value = this->blocks.main.q_3()[i]; + q_4_value = this->blocks.main.q_4()[i]; + w_1_value = this->get_variable(this->blocks.main.w_l()[i]); + w_2_value = this->get_variable(this->blocks.main.w_r()[i]); + w_3_value = this->get_variable(this->blocks.main.w_o()[i]); + w_4_value = this->get_variable(this->blocks.main.w_4()[i]); FF w_1_shifted_value; FF w_2_shifted_value; FF w_3_shifted_value; FF w_4_shifted_value; if (i < (this->num_gates - 1)) { - w_1_shifted_value = this->get_variable(this->w_l()[i + 1]); - w_2_shifted_value = this->get_variable(this->w_r()[i + 1]); - w_3_shifted_value = this->get_variable(this->w_o()[i + 1]); - w_4_shifted_value = this->get_variable(this->w_4()[i + 1]); + w_1_shifted_value = this->get_variable(this->blocks.main.w_l()[i + 1]); + w_2_shifted_value = this->get_variable(this->blocks.main.w_r()[i + 1]); + w_3_shifted_value = this->get_variable(this->blocks.main.w_o()[i + 1]); + w_4_shifted_value = this->get_variable(this->blocks.main.w_4()[i + 1]); } else { w_1_shifted_value = FF::zero(); w_2_shifted_value = FF::zero(); diff --git a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/goblin_ultra_circuit_builder.hpp b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/goblin_ultra_circuit_builder.hpp index a56e8068ce3..58f38dd6807 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/goblin_ultra_circuit_builder.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/goblin_ultra_circuit_builder.hpp @@ -28,27 +28,6 @@ template class GoblinUltraCircuitBuilder_ : public UltraCircuitBui uint32_t mul_accum_op_idx; uint32_t equality_op_idx; - using WireVector = std::vector>; - using SelectorVector = std::vector>; - - WireVector& ecc_op_wire_1() { return std::get<0>(this->blocks.ecc_op.wires); }; - WireVector& ecc_op_wire_2() { return std::get<1>(this->blocks.ecc_op.wires); }; - WireVector& ecc_op_wire_3() { return std::get<2>(this->blocks.ecc_op.wires); }; - WireVector& ecc_op_wire_4() { return std::get<3>(this->blocks.ecc_op.wires); }; - - const WireVector& ecc_op_wire_1() const { return std::get<0>(this->blocks.ecc_op.wires); }; - const WireVector& ecc_op_wire_2() const { return std::get<1>(this->blocks.ecc_op.wires); }; - const WireVector& ecc_op_wire_3() const { return std::get<2>(this->blocks.ecc_op.wires); }; - const WireVector& ecc_op_wire_4() const { return std::get<3>(this->blocks.ecc_op.wires); }; - - SelectorVector& q_busread() { return this->blocks.main.q_busread(); }; - SelectorVector& q_poseidon2_external() { return this->blocks.main.q_poseidon2_external(); }; - SelectorVector& q_poseidon2_internal() { return this->blocks.main.q_poseidon2_internal(); }; - - const SelectorVector& q_busread() const { return this->blocks.main.q_busread(); }; - const SelectorVector& q_poseidon2_external() const { return this->blocks.main.q_poseidon2_external(); }; - const SelectorVector& q_poseidon2_internal() const { return this->blocks.main.q_poseidon2_internal(); }; - // DataBus call/return data arrays std::vector public_calldata; std::vector calldata_read_counts; diff --git a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/goblin_ultra_circuit_builder.test.cpp b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/goblin_ultra_circuit_builder.test.cpp index 8ff42d7e648..725cbddfb33 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/goblin_ultra_circuit_builder.test.cpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/goblin_ultra_circuit_builder.test.cpp @@ -102,27 +102,27 @@ TEST(GoblinUltraCircuitBuilder, GoblinSimple) EXPECT_EQ(builder.num_ecc_op_gates, 6); // Check that the expected op codes have been correctly recorded in the 1st op wire - EXPECT_EQ(builder.ecc_op_wire_1()[0], EccOpCode::ADD_ACCUM); - EXPECT_EQ(builder.ecc_op_wire_1()[2], EccOpCode::MUL_ACCUM); - EXPECT_EQ(builder.ecc_op_wire_1()[4], EccOpCode::EQUALITY); + EXPECT_EQ(builder.blocks.ecc_op.w_l()[0], EccOpCode::ADD_ACCUM); + EXPECT_EQ(builder.blocks.ecc_op.w_l()[2], EccOpCode::MUL_ACCUM); + EXPECT_EQ(builder.blocks.ecc_op.w_l()[4], EccOpCode::EQUALITY); // Check that we can reconstruct the coordinates of P1 from the op_wires - auto P1_x_lo = uint256_t(builder.variables[builder.ecc_op_wire_2()[0]]); - auto P1_x_hi = uint256_t(builder.variables[builder.ecc_op_wire_3()[0]]); + auto P1_x_lo = uint256_t(builder.variables[builder.blocks.ecc_op.w_r()[0]]); + auto P1_x_hi = uint256_t(builder.variables[builder.blocks.ecc_op.w_o()[0]]); auto P1_x = P1_x_lo + (P1_x_hi << CHUNK_SIZE); EXPECT_EQ(P1_x, uint256_t(P1.x)); - auto P1_y_lo = uint256_t(builder.variables[builder.ecc_op_wire_4()[0]]); - auto P1_y_hi = uint256_t(builder.variables[builder.ecc_op_wire_2()[1]]); + auto P1_y_lo = uint256_t(builder.variables[builder.blocks.ecc_op.w_4()[0]]); + auto P1_y_hi = uint256_t(builder.variables[builder.blocks.ecc_op.w_r()[1]]); auto P1_y = P1_y_lo + (P1_y_hi << CHUNK_SIZE); EXPECT_EQ(P1_y, uint256_t(P1.y)); // Check that we can reconstruct the coordinates of P2 from the op_wires - auto P2_x_lo = uint256_t(builder.variables[builder.ecc_op_wire_2()[2]]); - auto P2_x_hi = uint256_t(builder.variables[builder.ecc_op_wire_3()[2]]); + auto P2_x_lo = uint256_t(builder.variables[builder.blocks.ecc_op.w_r()[2]]); + auto P2_x_hi = uint256_t(builder.variables[builder.blocks.ecc_op.w_o()[2]]); auto P2_x = P2_x_lo + (P2_x_hi << CHUNK_SIZE); EXPECT_EQ(P2_x, uint256_t(P2.x)); - auto P2_y_lo = uint256_t(builder.variables[builder.ecc_op_wire_4()[2]]); - auto P2_y_hi = uint256_t(builder.variables[builder.ecc_op_wire_2()[3]]); + auto P2_y_lo = uint256_t(builder.variables[builder.blocks.ecc_op.w_4()[2]]); + auto P2_y_hi = uint256_t(builder.variables[builder.blocks.ecc_op.w_r()[3]]); auto P2_y = P2_y_lo + (P2_y_hi << CHUNK_SIZE); EXPECT_EQ(P2_y, uint256_t(P2.y)); } diff --git a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.cpp b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.cpp index d74faa5994e..4678f10a5ec 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.cpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.cpp @@ -61,22 +61,22 @@ void UltraCircuitBuilder_::add_gates_to_ensure_all_polys_are_no { // First add a gate to simultaneously ensure first entries of all wires is zero and to add a non // zero value to all selectors aside from q_c and q_lookup - w_l().emplace_back(this->zero_idx); - w_r().emplace_back(this->zero_idx); - w_o().emplace_back(this->zero_idx); - w_4().emplace_back(this->zero_idx); - q_m().emplace_back(1); - q_1().emplace_back(1); - q_2().emplace_back(1); - q_3().emplace_back(1); - q_c().emplace_back(0); - q_sort().emplace_back(1); - - q_arith().emplace_back(1); - q_4().emplace_back(1); - q_lookup_type().emplace_back(0); - q_elliptic().emplace_back(1); - q_aux().emplace_back(1); + blocks.main.w_l().emplace_back(this->zero_idx); + blocks.main.w_r().emplace_back(this->zero_idx); + blocks.main.w_o().emplace_back(this->zero_idx); + blocks.main.w_4().emplace_back(this->zero_idx); + blocks.main.q_m().emplace_back(1); + blocks.main.q_1().emplace_back(1); + blocks.main.q_2().emplace_back(1); + blocks.main.q_3().emplace_back(1); + blocks.main.q_c().emplace_back(0); + blocks.main.q_sort().emplace_back(1); + + blocks.main.q_arith().emplace_back(1); + blocks.main.q_4().emplace_back(1); + blocks.main.q_lookup_type().emplace_back(0); + blocks.main.q_elliptic().emplace_back(1); + blocks.main.q_aux().emplace_back(1); if constexpr (HasAdditionalSelectors) { blocks.main.pad_additional(); } @@ -125,21 +125,21 @@ void UltraCircuitBuilder_::create_add_gate(const add_triple_assert_valid_variables({ in.a, in.b, in.c }); - w_l().emplace_back(in.a); - w_r().emplace_back(in.b); - w_o().emplace_back(in.c); - w_4().emplace_back(this->zero_idx); - q_m().emplace_back(0); - q_1().emplace_back(in.a_scaling); - q_2().emplace_back(in.b_scaling); - q_3().emplace_back(in.c_scaling); - q_c().emplace_back(in.const_scaling); - q_arith().emplace_back(1); - q_4().emplace_back(0); - q_sort().emplace_back(0); - q_lookup_type().emplace_back(0); - q_elliptic().emplace_back(0); - q_aux().emplace_back(0); + blocks.main.w_l().emplace_back(in.a); + blocks.main.w_r().emplace_back(in.b); + blocks.main.w_o().emplace_back(in.c); + blocks.main.w_4().emplace_back(this->zero_idx); + blocks.main.q_m().emplace_back(0); + blocks.main.q_1().emplace_back(in.a_scaling); + blocks.main.q_2().emplace_back(in.b_scaling); + blocks.main.q_3().emplace_back(in.c_scaling); + blocks.main.q_c().emplace_back(in.const_scaling); + blocks.main.q_arith().emplace_back(1); + blocks.main.q_4().emplace_back(0); + blocks.main.q_sort().emplace_back(0); + blocks.main.q_lookup_type().emplace_back(0); + blocks.main.q_elliptic().emplace_back(0); + blocks.main.q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { blocks.main.pad_additional(); } @@ -160,21 +160,21 @@ void UltraCircuitBuilder_::create_big_add_gate(const add_quad_< const bool include_next_gate_w_4) { this->assert_valid_variables({ in.a, in.b, in.c, in.d }); - w_l().emplace_back(in.a); - w_r().emplace_back(in.b); - w_o().emplace_back(in.c); - w_4().emplace_back(in.d); - q_m().emplace_back(0); - q_1().emplace_back(in.a_scaling); - q_2().emplace_back(in.b_scaling); - q_3().emplace_back(in.c_scaling); - q_c().emplace_back(in.const_scaling); - q_arith().emplace_back(include_next_gate_w_4 ? 2 : 1); - q_4().emplace_back(in.d_scaling); - q_sort().emplace_back(0); - q_lookup_type().emplace_back(0); - q_elliptic().emplace_back(0); - q_aux().emplace_back(0); + blocks.main.w_l().emplace_back(in.a); + blocks.main.w_r().emplace_back(in.b); + blocks.main.w_o().emplace_back(in.c); + blocks.main.w_4().emplace_back(in.d); + blocks.main.q_m().emplace_back(0); + blocks.main.q_1().emplace_back(in.a_scaling); + blocks.main.q_2().emplace_back(in.b_scaling); + blocks.main.q_3().emplace_back(in.c_scaling); + blocks.main.q_c().emplace_back(in.const_scaling); + blocks.main.q_arith().emplace_back(include_next_gate_w_4 ? 2 : 1); + blocks.main.q_4().emplace_back(in.d_scaling); + blocks.main.q_sort().emplace_back(0); + blocks.main.q_lookup_type().emplace_back(0); + blocks.main.q_elliptic().emplace_back(0); + blocks.main.q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { blocks.main.pad_additional(); } @@ -257,21 +257,21 @@ void UltraCircuitBuilder_::create_big_mul_gate(const mul_quad_< { this->assert_valid_variables({ in.a, in.b, in.c, in.d }); - w_l().emplace_back(in.a); - w_r().emplace_back(in.b); - w_o().emplace_back(in.c); - w_4().emplace_back(in.d); - q_m().emplace_back(in.mul_scaling); - q_1().emplace_back(in.a_scaling); - q_2().emplace_back(in.b_scaling); - q_3().emplace_back(in.c_scaling); - q_c().emplace_back(in.const_scaling); - q_arith().emplace_back(1); - q_4().emplace_back(in.d_scaling); - q_sort().emplace_back(0); - q_lookup_type().emplace_back(0); - q_elliptic().emplace_back(0); - q_aux().emplace_back(0); + blocks.main.w_l().emplace_back(in.a); + blocks.main.w_r().emplace_back(in.b); + blocks.main.w_o().emplace_back(in.c); + blocks.main.w_4().emplace_back(in.d); + blocks.main.q_m().emplace_back(in.mul_scaling); + blocks.main.q_1().emplace_back(in.a_scaling); + blocks.main.q_2().emplace_back(in.b_scaling); + blocks.main.q_3().emplace_back(in.c_scaling); + blocks.main.q_c().emplace_back(in.const_scaling); + blocks.main.q_arith().emplace_back(1); + blocks.main.q_4().emplace_back(in.d_scaling); + blocks.main.q_sort().emplace_back(0); + blocks.main.q_lookup_type().emplace_back(0); + blocks.main.q_elliptic().emplace_back(0); + blocks.main.q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { blocks.main.pad_additional(); } @@ -286,21 +286,21 @@ void UltraCircuitBuilder_::create_balanced_add_gate(const add_q { this->assert_valid_variables({ in.a, in.b, in.c, in.d }); - w_l().emplace_back(in.a); - w_r().emplace_back(in.b); - w_o().emplace_back(in.c); - w_4().emplace_back(in.d); - q_m().emplace_back(0); - q_1().emplace_back(in.a_scaling); - q_2().emplace_back(in.b_scaling); - q_3().emplace_back(in.c_scaling); - q_c().emplace_back(in.const_scaling); - q_arith().emplace_back(1); - q_4().emplace_back(in.d_scaling); - q_sort().emplace_back(0); - q_lookup_type().emplace_back(0); - q_elliptic().emplace_back(0); - q_aux().emplace_back(0); + blocks.main.w_l().emplace_back(in.a); + blocks.main.w_r().emplace_back(in.b); + blocks.main.w_o().emplace_back(in.c); + blocks.main.w_4().emplace_back(in.d); + blocks.main.q_m().emplace_back(0); + blocks.main.q_1().emplace_back(in.a_scaling); + blocks.main.q_2().emplace_back(in.b_scaling); + blocks.main.q_3().emplace_back(in.c_scaling); + blocks.main.q_c().emplace_back(in.const_scaling); + blocks.main.q_arith().emplace_back(1); + blocks.main.q_4().emplace_back(in.d_scaling); + blocks.main.q_sort().emplace_back(0); + blocks.main.q_lookup_type().emplace_back(0); + blocks.main.q_elliptic().emplace_back(0); + blocks.main.q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { blocks.main.pad_additional(); } @@ -331,21 +331,21 @@ void UltraCircuitBuilder_::create_mul_gate(const mul_triple_assert_valid_variables({ in.a, in.b, in.c }); - w_l().emplace_back(in.a); - w_r().emplace_back(in.b); - w_o().emplace_back(in.c); - w_4().emplace_back(this->zero_idx); - q_m().emplace_back(in.mul_scaling); - q_1().emplace_back(0); - q_2().emplace_back(0); - q_3().emplace_back(in.c_scaling); - q_c().emplace_back(in.const_scaling); - q_arith().emplace_back(1); - q_4().emplace_back(0); - q_sort().emplace_back(0); - q_lookup_type().emplace_back(0); - q_elliptic().emplace_back(0); - q_aux().emplace_back(0); + blocks.main.w_l().emplace_back(in.a); + blocks.main.w_r().emplace_back(in.b); + blocks.main.w_o().emplace_back(in.c); + blocks.main.w_4().emplace_back(this->zero_idx); + blocks.main.q_m().emplace_back(in.mul_scaling); + blocks.main.q_1().emplace_back(0); + blocks.main.q_2().emplace_back(0); + blocks.main.q_3().emplace_back(in.c_scaling); + blocks.main.q_c().emplace_back(in.const_scaling); + blocks.main.q_arith().emplace_back(1); + blocks.main.q_4().emplace_back(0); + blocks.main.q_sort().emplace_back(0); + blocks.main.q_lookup_type().emplace_back(0); + blocks.main.q_elliptic().emplace_back(0); + blocks.main.q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { blocks.main.pad_additional(); } @@ -362,22 +362,22 @@ void UltraCircuitBuilder_::create_bool_gate(const uint32_t vari { this->assert_valid_variables({ variable_index }); - w_l().emplace_back(variable_index); - w_r().emplace_back(variable_index); - w_o().emplace_back(this->zero_idx); - w_4().emplace_back(this->zero_idx); - q_m().emplace_back(1); - q_1().emplace_back(-1); - q_2().emplace_back(0); - q_3().emplace_back(0); - q_c().emplace_back(0); - q_sort().emplace_back(0); - - q_arith().emplace_back(1); - q_4().emplace_back(0); - q_lookup_type().emplace_back(0); - q_elliptic().emplace_back(0); - q_aux().emplace_back(0); + blocks.main.w_l().emplace_back(variable_index); + blocks.main.w_r().emplace_back(variable_index); + blocks.main.w_o().emplace_back(this->zero_idx); + blocks.main.w_4().emplace_back(this->zero_idx); + blocks.main.q_m().emplace_back(1); + blocks.main.q_1().emplace_back(-1); + blocks.main.q_2().emplace_back(0); + blocks.main.q_3().emplace_back(0); + blocks.main.q_c().emplace_back(0); + blocks.main.q_sort().emplace_back(0); + + blocks.main.q_arith().emplace_back(1); + blocks.main.q_4().emplace_back(0); + blocks.main.q_lookup_type().emplace_back(0); + blocks.main.q_elliptic().emplace_back(0); + blocks.main.q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { blocks.main.pad_additional(); } @@ -396,22 +396,22 @@ void UltraCircuitBuilder_::create_poly_gate(const poly_triple_< { this->assert_valid_variables({ in.a, in.b, in.c }); - w_l().emplace_back(in.a); - w_r().emplace_back(in.b); - w_o().emplace_back(in.c); - w_4().emplace_back(this->zero_idx); - q_m().emplace_back(in.q_m); - q_1().emplace_back(in.q_l); - q_2().emplace_back(in.q_r); - q_3().emplace_back(in.q_o); - q_c().emplace_back(in.q_c); - q_sort().emplace_back(0); - - q_arith().emplace_back(1); - q_4().emplace_back(0); - q_lookup_type().emplace_back(0); - q_elliptic().emplace_back(0); - q_aux().emplace_back(0); + blocks.main.w_l().emplace_back(in.a); + blocks.main.w_r().emplace_back(in.b); + blocks.main.w_o().emplace_back(in.c); + blocks.main.w_4().emplace_back(this->zero_idx); + blocks.main.q_m().emplace_back(in.q_m); + blocks.main.q_1().emplace_back(in.q_l); + blocks.main.q_2().emplace_back(in.q_r); + blocks.main.q_3().emplace_back(in.q_o); + blocks.main.q_c().emplace_back(in.q_c); + blocks.main.q_sort().emplace_back(0); + + blocks.main.q_arith().emplace_back(1); + blocks.main.q_4().emplace_back(0); + blocks.main.q_lookup_type().emplace_back(0); + blocks.main.q_elliptic().emplace_back(0); + blocks.main.q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { blocks.main.pad_additional(); } @@ -441,55 +441,55 @@ void UltraCircuitBuilder_::create_ecc_add_gate(const ecc_add_ga this->assert_valid_variables({ in.x1, in.x2, in.x3, in.y1, in.y2, in.y3 }); bool can_fuse_into_previous_gate = true; - can_fuse_into_previous_gate = can_fuse_into_previous_gate && (w_r()[this->num_gates - 1] == in.x1); - can_fuse_into_previous_gate = can_fuse_into_previous_gate && (w_o()[this->num_gates - 1] == in.y1); - can_fuse_into_previous_gate = can_fuse_into_previous_gate && (q_3()[this->num_gates - 1] == 0); - can_fuse_into_previous_gate = can_fuse_into_previous_gate && (q_4()[this->num_gates - 1] == 0); - can_fuse_into_previous_gate = can_fuse_into_previous_gate && (q_1()[this->num_gates - 1] == 0); - can_fuse_into_previous_gate = can_fuse_into_previous_gate && (q_arith()[this->num_gates - 1] == 0); - can_fuse_into_previous_gate = can_fuse_into_previous_gate && (q_m()[this->num_gates - 1] == 0); + can_fuse_into_previous_gate = can_fuse_into_previous_gate && (blocks.main.w_r()[this->num_gates - 1] == in.x1); + can_fuse_into_previous_gate = can_fuse_into_previous_gate && (blocks.main.w_o()[this->num_gates - 1] == in.y1); + can_fuse_into_previous_gate = can_fuse_into_previous_gate && (blocks.main.q_3()[this->num_gates - 1] == 0); + can_fuse_into_previous_gate = can_fuse_into_previous_gate && (blocks.main.q_4()[this->num_gates - 1] == 0); + can_fuse_into_previous_gate = can_fuse_into_previous_gate && (blocks.main.q_1()[this->num_gates - 1] == 0); + can_fuse_into_previous_gate = can_fuse_into_previous_gate && (blocks.main.q_arith()[this->num_gates - 1] == 0); + can_fuse_into_previous_gate = can_fuse_into_previous_gate && (blocks.main.q_m()[this->num_gates - 1] == 0); if (can_fuse_into_previous_gate) { - q_1()[this->num_gates - 1] = in.sign_coefficient; - q_elliptic()[this->num_gates - 1] = 1; + blocks.main.q_1()[this->num_gates - 1] = in.sign_coefficient; + blocks.main.q_elliptic()[this->num_gates - 1] = 1; } else { - w_l().emplace_back(this->zero_idx); - w_r().emplace_back(in.x1); - w_o().emplace_back(in.y1); - w_4().emplace_back(this->zero_idx); - q_3().emplace_back(0); - q_4().emplace_back(0); - q_1().emplace_back(in.sign_coefficient); - - q_arith().emplace_back(0); - q_2().emplace_back(0); - q_m().emplace_back(0); - q_c().emplace_back(0); - q_sort().emplace_back(0); - q_lookup_type().emplace_back(0); - q_elliptic().emplace_back(1); - q_aux().emplace_back(0); + blocks.main.w_l().emplace_back(this->zero_idx); + blocks.main.w_r().emplace_back(in.x1); + blocks.main.w_o().emplace_back(in.y1); + blocks.main.w_4().emplace_back(this->zero_idx); + blocks.main.q_3().emplace_back(0); + blocks.main.q_4().emplace_back(0); + blocks.main.q_1().emplace_back(in.sign_coefficient); + + blocks.main.q_arith().emplace_back(0); + blocks.main.q_2().emplace_back(0); + blocks.main.q_m().emplace_back(0); + blocks.main.q_c().emplace_back(0); + blocks.main.q_sort().emplace_back(0); + blocks.main.q_lookup_type().emplace_back(0); + blocks.main.q_elliptic().emplace_back(1); + blocks.main.q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { blocks.main.pad_additional(); } check_selector_length_consistency(); ++this->num_gates; } - w_l().emplace_back(in.x2); - w_4().emplace_back(in.y2); - w_r().emplace_back(in.x3); - w_o().emplace_back(in.y3); - q_m().emplace_back(0); - q_1().emplace_back(0); - q_2().emplace_back(0); - q_3().emplace_back(0); - q_c().emplace_back(0); - q_arith().emplace_back(0); - q_4().emplace_back(0); - q_sort().emplace_back(0); - q_lookup_type().emplace_back(0); - q_elliptic().emplace_back(0); - q_aux().emplace_back(0); + blocks.main.w_l().emplace_back(in.x2); + blocks.main.w_4().emplace_back(in.y2); + blocks.main.w_r().emplace_back(in.x3); + blocks.main.w_o().emplace_back(in.y3); + blocks.main.q_m().emplace_back(0); + blocks.main.q_1().emplace_back(0); + blocks.main.q_2().emplace_back(0); + blocks.main.q_3().emplace_back(0); + blocks.main.q_c().emplace_back(0); + blocks.main.q_arith().emplace_back(0); + blocks.main.q_4().emplace_back(0); + blocks.main.q_sort().emplace_back(0); + blocks.main.q_lookup_type().emplace_back(0); + blocks.main.q_elliptic().emplace_back(0); + blocks.main.q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { blocks.main.pad_additional(); } @@ -514,31 +514,32 @@ void UltraCircuitBuilder_::create_ecc_dbl_gate(const ecc_dbl_ga * can also chain double gates together **/ bool can_fuse_into_previous_gate = true; - can_fuse_into_previous_gate = can_fuse_into_previous_gate && (w_r()[this->num_gates - 1] == in.x1); - can_fuse_into_previous_gate = can_fuse_into_previous_gate && (w_o()[this->num_gates - 1] == in.y1); - can_fuse_into_previous_gate = can_fuse_into_previous_gate && (q_arith()[this->num_gates - 1] == 0); - can_fuse_into_previous_gate = can_fuse_into_previous_gate && (q_lookup_type()[this->num_gates - 1] == 0); - can_fuse_into_previous_gate = can_fuse_into_previous_gate && (q_aux()[this->num_gates - 1] == 0); + can_fuse_into_previous_gate = can_fuse_into_previous_gate && (blocks.main.w_r()[this->num_gates - 1] == in.x1); + can_fuse_into_previous_gate = can_fuse_into_previous_gate && (blocks.main.w_o()[this->num_gates - 1] == in.y1); + can_fuse_into_previous_gate = can_fuse_into_previous_gate && (blocks.main.q_arith()[this->num_gates - 1] == 0); + can_fuse_into_previous_gate = + can_fuse_into_previous_gate && (blocks.main.q_lookup_type()[this->num_gates - 1] == 0); + can_fuse_into_previous_gate = can_fuse_into_previous_gate && (blocks.main.q_aux()[this->num_gates - 1] == 0); if (can_fuse_into_previous_gate) { - q_elliptic()[this->num_gates - 1] = 1; - q_m()[this->num_gates - 1] = 1; + blocks.main.q_elliptic()[this->num_gates - 1] = 1; + blocks.main.q_m()[this->num_gates - 1] = 1; } else { - w_r().emplace_back(in.x1); - w_o().emplace_back(in.y1); - w_l().emplace_back(this->zero_idx); - w_4().emplace_back(this->zero_idx); - q_elliptic().emplace_back(1); - q_m().emplace_back(1); - q_1().emplace_back(0); - q_2().emplace_back(0); - q_3().emplace_back(0); - q_c().emplace_back(0); - q_arith().emplace_back(0); - q_4().emplace_back(0); - q_sort().emplace_back(0); - q_lookup_type().emplace_back(0); - q_aux().emplace_back(0); + blocks.main.w_r().emplace_back(in.x1); + blocks.main.w_o().emplace_back(in.y1); + blocks.main.w_l().emplace_back(this->zero_idx); + blocks.main.w_4().emplace_back(this->zero_idx); + blocks.main.q_elliptic().emplace_back(1); + blocks.main.q_m().emplace_back(1); + blocks.main.q_1().emplace_back(0); + blocks.main.q_2().emplace_back(0); + blocks.main.q_3().emplace_back(0); + blocks.main.q_c().emplace_back(0); + blocks.main.q_arith().emplace_back(0); + blocks.main.q_4().emplace_back(0); + blocks.main.q_sort().emplace_back(0); + blocks.main.q_lookup_type().emplace_back(0); + blocks.main.q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { blocks.main.pad_additional(); } @@ -546,21 +547,21 @@ void UltraCircuitBuilder_::create_ecc_dbl_gate(const ecc_dbl_ga ++this->num_gates; } - w_r().emplace_back(in.x3); - w_o().emplace_back(in.y3); - w_l().emplace_back(this->zero_idx); - w_4().emplace_back(this->zero_idx); - q_m().emplace_back(0); - q_1().emplace_back(0); - q_2().emplace_back(0); - q_3().emplace_back(0); - q_c().emplace_back(0); - q_arith().emplace_back(0); - q_4().emplace_back(0); - q_sort().emplace_back(0); - q_lookup_type().emplace_back(0); - q_elliptic().emplace_back(0); - q_aux().emplace_back(0); + blocks.main.w_r().emplace_back(in.x3); + blocks.main.w_o().emplace_back(in.y3); + blocks.main.w_l().emplace_back(this->zero_idx); + blocks.main.w_4().emplace_back(this->zero_idx); + blocks.main.q_m().emplace_back(0); + blocks.main.q_1().emplace_back(0); + blocks.main.q_2().emplace_back(0); + blocks.main.q_3().emplace_back(0); + blocks.main.q_c().emplace_back(0); + blocks.main.q_arith().emplace_back(0); + blocks.main.q_4().emplace_back(0); + blocks.main.q_sort().emplace_back(0); + blocks.main.q_lookup_type().emplace_back(0); + blocks.main.q_elliptic().emplace_back(0); + blocks.main.q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { blocks.main.pad_additional(); } @@ -579,21 +580,21 @@ void UltraCircuitBuilder_::fix_witness(const uint32_t witness_i { this->assert_valid_variables({ witness_index }); - w_l().emplace_back(witness_index); - w_r().emplace_back(this->zero_idx); - w_o().emplace_back(this->zero_idx); - w_4().emplace_back(this->zero_idx); - q_m().emplace_back(0); - q_1().emplace_back(1); - q_2().emplace_back(0); - q_3().emplace_back(0); - q_c().emplace_back(-witness_value); - q_arith().emplace_back(1); - q_4().emplace_back(0); - q_sort().emplace_back(0); - q_lookup_type().emplace_back(0); - q_elliptic().emplace_back(0); - q_aux().emplace_back(0); + blocks.main.w_l().emplace_back(witness_index); + blocks.main.w_r().emplace_back(this->zero_idx); + blocks.main.w_o().emplace_back(this->zero_idx); + blocks.main.w_4().emplace_back(this->zero_idx); + blocks.main.q_m().emplace_back(0); + blocks.main.q_1().emplace_back(1); + blocks.main.q_2().emplace_back(0); + blocks.main.q_3().emplace_back(0); + blocks.main.q_c().emplace_back(-witness_value); + blocks.main.q_arith().emplace_back(1); + blocks.main.q_4().emplace_back(0); + blocks.main.q_sort().emplace_back(0); + blocks.main.q_lookup_type().emplace_back(0); + blocks.main.q_elliptic().emplace_back(0); + blocks.main.q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { blocks.main.pad_additional(); } @@ -657,21 +658,21 @@ plookup::ReadData UltraCircuitBuilder_::create_gates_ read_data[plookup::ColumnIdx::C3].push_back(third_idx); this->assert_valid_variables({ first_idx, second_idx, third_idx }); - q_lookup_type().emplace_back(FF(1)); - q_3().emplace_back(FF(table.table_index)); - w_l().emplace_back(first_idx); - w_r().emplace_back(second_idx); - w_o().emplace_back(third_idx); - w_4().emplace_back(this->zero_idx); - q_1().emplace_back(0); - q_2().emplace_back((i == (num_lookups - 1) ? 0 : -multi_table.column_1_step_sizes[i + 1])); - q_m().emplace_back((i == (num_lookups - 1) ? 0 : -multi_table.column_2_step_sizes[i + 1])); - q_c().emplace_back((i == (num_lookups - 1) ? 0 : -multi_table.column_3_step_sizes[i + 1])); - q_arith().emplace_back(0); - q_4().emplace_back(0); - q_sort().emplace_back(0); - q_elliptic().emplace_back(0); - q_aux().emplace_back(0); + blocks.main.q_lookup_type().emplace_back(FF(1)); + blocks.main.q_3().emplace_back(FF(table.table_index)); + blocks.main.w_l().emplace_back(first_idx); + blocks.main.w_r().emplace_back(second_idx); + blocks.main.w_o().emplace_back(third_idx); + blocks.main.w_4().emplace_back(this->zero_idx); + blocks.main.q_1().emplace_back(0); + blocks.main.q_2().emplace_back((i == (num_lookups - 1) ? 0 : -multi_table.column_1_step_sizes[i + 1])); + blocks.main.q_m().emplace_back((i == (num_lookups - 1) ? 0 : -multi_table.column_2_step_sizes[i + 1])); + blocks.main.q_c().emplace_back((i == (num_lookups - 1) ? 0 : -multi_table.column_3_step_sizes[i + 1])); + blocks.main.q_arith().emplace_back(0); + blocks.main.q_4().emplace_back(0); + blocks.main.q_sort().emplace_back(0); + blocks.main.q_elliptic().emplace_back(0); + blocks.main.q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { blocks.main.pad_additional(); } @@ -968,44 +969,44 @@ void UltraCircuitBuilder_::create_sort_constraint(const std::ve for (size_t i = 0; i < variable_index.size(); i += gate_width) { - w_l().emplace_back(variable_index[i]); - w_r().emplace_back(variable_index[i + 1]); - w_o().emplace_back(variable_index[i + 2]); - w_4().emplace_back(variable_index[i + 3]); + blocks.main.w_l().emplace_back(variable_index[i]); + blocks.main.w_r().emplace_back(variable_index[i + 1]); + blocks.main.w_o().emplace_back(variable_index[i + 2]); + blocks.main.w_4().emplace_back(variable_index[i + 3]); ++this->num_gates; - q_m().emplace_back(0); - q_1().emplace_back(0); - q_2().emplace_back(0); - q_3().emplace_back(0); - q_c().emplace_back(0); - q_arith().emplace_back(0); - q_4().emplace_back(0); - q_sort().emplace_back(1); - q_elliptic().emplace_back(0); - q_lookup_type().emplace_back(0); - q_aux().emplace_back(0); + blocks.main.q_m().emplace_back(0); + blocks.main.q_1().emplace_back(0); + blocks.main.q_2().emplace_back(0); + blocks.main.q_3().emplace_back(0); + blocks.main.q_c().emplace_back(0); + blocks.main.q_arith().emplace_back(0); + blocks.main.q_4().emplace_back(0); + blocks.main.q_sort().emplace_back(1); + blocks.main.q_elliptic().emplace_back(0); + blocks.main.q_lookup_type().emplace_back(0); + blocks.main.q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { blocks.main.pad_additional(); } check_selector_length_consistency(); } // dummy gate needed because of sort widget's check of next row - w_l().emplace_back(variable_index[variable_index.size() - 1]); - w_r().emplace_back(this->zero_idx); - w_o().emplace_back(this->zero_idx); - w_4().emplace_back(this->zero_idx); + blocks.main.w_l().emplace_back(variable_index[variable_index.size() - 1]); + blocks.main.w_r().emplace_back(this->zero_idx); + blocks.main.w_o().emplace_back(this->zero_idx); + blocks.main.w_4().emplace_back(this->zero_idx); ++this->num_gates; - q_m().emplace_back(0); - q_1().emplace_back(0); - q_2().emplace_back(0); - q_3().emplace_back(0); - q_c().emplace_back(0); - q_arith().emplace_back(0); - q_4().emplace_back(0); - q_sort().emplace_back(0); - q_elliptic().emplace_back(0); - q_lookup_type().emplace_back(0); - q_aux().emplace_back(0); + blocks.main.q_m().emplace_back(0); + blocks.main.q_1().emplace_back(0); + blocks.main.q_2().emplace_back(0); + blocks.main.q_3().emplace_back(0); + blocks.main.q_c().emplace_back(0); + blocks.main.q_arith().emplace_back(0); + blocks.main.q_4().emplace_back(0); + blocks.main.q_sort().emplace_back(0); + blocks.main.q_elliptic().emplace_back(0); + blocks.main.q_lookup_type().emplace_back(0); + blocks.main.q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { blocks.main.pad_additional(); } @@ -1027,22 +1028,22 @@ void UltraCircuitBuilder_::create_dummy_constraints(const std:: this->assert_valid_variables(padded_list); for (size_t i = 0; i < padded_list.size(); i += gate_width) { - w_l().emplace_back(padded_list[i]); - w_r().emplace_back(padded_list[i + 1]); - w_o().emplace_back(padded_list[i + 2]); - w_4().emplace_back(padded_list[i + 3]); + blocks.main.w_l().emplace_back(padded_list[i]); + blocks.main.w_r().emplace_back(padded_list[i + 1]); + blocks.main.w_o().emplace_back(padded_list[i + 2]); + blocks.main.w_4().emplace_back(padded_list[i + 3]); ++this->num_gates; - q_m().emplace_back(0); - q_1().emplace_back(0); - q_2().emplace_back(0); - q_3().emplace_back(0); - q_c().emplace_back(0); - q_arith().emplace_back(0); - q_4().emplace_back(0); - q_sort().emplace_back(0); - q_elliptic().emplace_back(0); - q_lookup_type().emplace_back(0); - q_aux().emplace_back(0); + blocks.main.q_m().emplace_back(0); + blocks.main.q_1().emplace_back(0); + blocks.main.q_2().emplace_back(0); + blocks.main.q_3().emplace_back(0); + blocks.main.q_c().emplace_back(0); + blocks.main.q_arith().emplace_back(0); + blocks.main.q_4().emplace_back(0); + blocks.main.q_sort().emplace_back(0); + blocks.main.q_elliptic().emplace_back(0); + blocks.main.q_lookup_type().emplace_back(0); + blocks.main.q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { blocks.main.pad_additional(); } @@ -1061,22 +1062,22 @@ void UltraCircuitBuilder_::create_sort_constraint_with_edges( this->assert_valid_variables(variable_index); // enforce range checks of first row and starting at start - w_l().emplace_back(variable_index[0]); - w_r().emplace_back(variable_index[1]); - w_o().emplace_back(variable_index[2]); - w_4().emplace_back(variable_index[3]); + blocks.main.w_l().emplace_back(variable_index[0]); + blocks.main.w_r().emplace_back(variable_index[1]); + blocks.main.w_o().emplace_back(variable_index[2]); + blocks.main.w_4().emplace_back(variable_index[3]); ++this->num_gates; - q_m().emplace_back(0); - q_1().emplace_back(1); - q_2().emplace_back(0); - q_3().emplace_back(0); - q_c().emplace_back(-start); - q_arith().emplace_back(1); - q_4().emplace_back(0); - q_sort().emplace_back(1); - q_elliptic().emplace_back(0); - q_lookup_type().emplace_back(0); - q_aux().emplace_back(0); + blocks.main.q_m().emplace_back(0); + blocks.main.q_1().emplace_back(1); + blocks.main.q_2().emplace_back(0); + blocks.main.q_3().emplace_back(0); + blocks.main.q_c().emplace_back(-start); + blocks.main.q_arith().emplace_back(1); + blocks.main.q_4().emplace_back(0); + blocks.main.q_sort().emplace_back(1); + blocks.main.q_elliptic().emplace_back(0); + blocks.main.q_lookup_type().emplace_back(0); + blocks.main.q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { blocks.main.pad_additional(); } @@ -1084,22 +1085,22 @@ void UltraCircuitBuilder_::create_sort_constraint_with_edges( // enforce range check for middle rows for (size_t i = gate_width; i < variable_index.size() - gate_width; i += gate_width) { - w_l().emplace_back(variable_index[i]); - w_r().emplace_back(variable_index[i + 1]); - w_o().emplace_back(variable_index[i + 2]); - w_4().emplace_back(variable_index[i + 3]); + blocks.main.w_l().emplace_back(variable_index[i]); + blocks.main.w_r().emplace_back(variable_index[i + 1]); + blocks.main.w_o().emplace_back(variable_index[i + 2]); + blocks.main.w_4().emplace_back(variable_index[i + 3]); ++this->num_gates; - q_m().emplace_back(0); - q_1().emplace_back(0); - q_2().emplace_back(0); - q_3().emplace_back(0); - q_c().emplace_back(0); - q_arith().emplace_back(0); - q_4().emplace_back(0); - q_sort().emplace_back(1); - q_elliptic().emplace_back(0); - q_lookup_type().emplace_back(0); - q_aux().emplace_back(0); + blocks.main.q_m().emplace_back(0); + blocks.main.q_1().emplace_back(0); + blocks.main.q_2().emplace_back(0); + blocks.main.q_3().emplace_back(0); + blocks.main.q_c().emplace_back(0); + blocks.main.q_arith().emplace_back(0); + blocks.main.q_4().emplace_back(0); + blocks.main.q_sort().emplace_back(1); + blocks.main.q_elliptic().emplace_back(0); + blocks.main.q_lookup_type().emplace_back(0); + blocks.main.q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { blocks.main.pad_additional(); } @@ -1107,22 +1108,22 @@ void UltraCircuitBuilder_::create_sort_constraint_with_edges( } // enforce range checks of last row and ending at end if (variable_index.size() > gate_width) { - w_l().emplace_back(variable_index[variable_index.size() - 4]); - w_r().emplace_back(variable_index[variable_index.size() - 3]); - w_o().emplace_back(variable_index[variable_index.size() - 2]); - w_4().emplace_back(variable_index[variable_index.size() - 1]); + blocks.main.w_l().emplace_back(variable_index[variable_index.size() - 4]); + blocks.main.w_r().emplace_back(variable_index[variable_index.size() - 3]); + blocks.main.w_o().emplace_back(variable_index[variable_index.size() - 2]); + blocks.main.w_4().emplace_back(variable_index[variable_index.size() - 1]); ++this->num_gates; - q_m().emplace_back(0); - q_1().emplace_back(0); - q_2().emplace_back(0); - q_3().emplace_back(0); - q_c().emplace_back(0); - q_arith().emplace_back(0); - q_4().emplace_back(0); - q_sort().emplace_back(1); - q_elliptic().emplace_back(0); - q_lookup_type().emplace_back(0); - q_aux().emplace_back(0); + blocks.main.q_m().emplace_back(0); + blocks.main.q_1().emplace_back(0); + blocks.main.q_2().emplace_back(0); + blocks.main.q_3().emplace_back(0); + blocks.main.q_c().emplace_back(0); + blocks.main.q_arith().emplace_back(0); + blocks.main.q_4().emplace_back(0); + blocks.main.q_sort().emplace_back(1); + blocks.main.q_elliptic().emplace_back(0); + blocks.main.q_lookup_type().emplace_back(0); + blocks.main.q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { blocks.main.pad_additional(); } @@ -1131,22 +1132,22 @@ void UltraCircuitBuilder_::create_sort_constraint_with_edges( // dummy gate needed because of sort widget's check of next row // use this gate to check end condition - w_l().emplace_back(variable_index[variable_index.size() - 1]); - w_r().emplace_back(this->zero_idx); - w_o().emplace_back(this->zero_idx); - w_4().emplace_back(this->zero_idx); + blocks.main.w_l().emplace_back(variable_index[variable_index.size() - 1]); + blocks.main.w_r().emplace_back(this->zero_idx); + blocks.main.w_o().emplace_back(this->zero_idx); + blocks.main.w_4().emplace_back(this->zero_idx); ++this->num_gates; - q_m().emplace_back(0); - q_1().emplace_back(1); - q_2().emplace_back(0); - q_3().emplace_back(0); - q_c().emplace_back(-end); - q_arith().emplace_back(1); - q_4().emplace_back(0); - q_sort().emplace_back(0); - q_elliptic().emplace_back(0); - q_lookup_type().emplace_back(0); - q_aux().emplace_back(0); + blocks.main.q_m().emplace_back(0); + blocks.main.q_1().emplace_back(1); + blocks.main.q_2().emplace_back(0); + blocks.main.q_3().emplace_back(0); + blocks.main.q_c().emplace_back(-end); + blocks.main.q_arith().emplace_back(1); + blocks.main.q_4().emplace_back(0); + blocks.main.q_sort().emplace_back(0); + blocks.main.q_elliptic().emplace_back(0); + blocks.main.q_lookup_type().emplace_back(0); + blocks.main.q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { blocks.main.pad_additional(); } @@ -1253,19 +1254,19 @@ std::vector UltraCircuitBuilder_::decompose_into_defa template void UltraCircuitBuilder_::apply_aux_selectors(const AUX_SELECTORS type) { - q_aux().emplace_back(type == AUX_SELECTORS::NONE ? 0 : 1); - q_sort().emplace_back(0); - q_lookup_type().emplace_back(0); - q_elliptic().emplace_back(0); + blocks.main.q_aux().emplace_back(type == AUX_SELECTORS::NONE ? 0 : 1); + blocks.main.q_sort().emplace_back(0); + blocks.main.q_lookup_type().emplace_back(0); + blocks.main.q_elliptic().emplace_back(0); switch (type) { case AUX_SELECTORS::LIMB_ACCUMULATE_1: { - q_1().emplace_back(0); - q_2().emplace_back(0); - q_3().emplace_back(1); - q_4().emplace_back(1); - q_m().emplace_back(0); - q_c().emplace_back(0); - q_arith().emplace_back(0); + blocks.main.q_1().emplace_back(0); + blocks.main.q_2().emplace_back(0); + blocks.main.q_3().emplace_back(1); + blocks.main.q_4().emplace_back(1); + blocks.main.q_m().emplace_back(0); + blocks.main.q_c().emplace_back(0); + blocks.main.q_arith().emplace_back(0); if constexpr (HasAdditionalSelectors) { blocks.main.pad_additional(); } @@ -1273,13 +1274,13 @@ void UltraCircuitBuilder_::apply_aux_selectors(const AUX_SELECT break; } case AUX_SELECTORS::LIMB_ACCUMULATE_2: { - q_1().emplace_back(0); - q_2().emplace_back(0); - q_3().emplace_back(1); - q_4().emplace_back(0); - q_m().emplace_back(1); - q_c().emplace_back(0); - q_arith().emplace_back(0); + blocks.main.q_1().emplace_back(0); + blocks.main.q_2().emplace_back(0); + blocks.main.q_3().emplace_back(1); + blocks.main.q_4().emplace_back(0); + blocks.main.q_m().emplace_back(1); + blocks.main.q_c().emplace_back(0); + blocks.main.q_arith().emplace_back(0); if constexpr (HasAdditionalSelectors) { blocks.main.pad_additional(); } @@ -1287,13 +1288,13 @@ void UltraCircuitBuilder_::apply_aux_selectors(const AUX_SELECT break; } case AUX_SELECTORS::NON_NATIVE_FIELD_1: { - q_1().emplace_back(0); - q_2().emplace_back(1); - q_3().emplace_back(1); - q_4().emplace_back(0); - q_m().emplace_back(0); - q_c().emplace_back(0); - q_arith().emplace_back(0); + blocks.main.q_1().emplace_back(0); + blocks.main.q_2().emplace_back(1); + blocks.main.q_3().emplace_back(1); + blocks.main.q_4().emplace_back(0); + blocks.main.q_m().emplace_back(0); + blocks.main.q_c().emplace_back(0); + blocks.main.q_arith().emplace_back(0); if constexpr (HasAdditionalSelectors) { blocks.main.pad_additional(); } @@ -1301,13 +1302,13 @@ void UltraCircuitBuilder_::apply_aux_selectors(const AUX_SELECT break; } case AUX_SELECTORS::NON_NATIVE_FIELD_2: { - q_1().emplace_back(0); - q_2().emplace_back(1); - q_3().emplace_back(0); - q_4().emplace_back(1); - q_m().emplace_back(0); - q_c().emplace_back(0); - q_arith().emplace_back(0); + blocks.main.q_1().emplace_back(0); + blocks.main.q_2().emplace_back(1); + blocks.main.q_3().emplace_back(0); + blocks.main.q_4().emplace_back(1); + blocks.main.q_m().emplace_back(0); + blocks.main.q_c().emplace_back(0); + blocks.main.q_arith().emplace_back(0); if constexpr (HasAdditionalSelectors) { blocks.main.pad_additional(); } @@ -1315,13 +1316,13 @@ void UltraCircuitBuilder_::apply_aux_selectors(const AUX_SELECT break; } case AUX_SELECTORS::NON_NATIVE_FIELD_3: { - q_1().emplace_back(0); - q_2().emplace_back(1); - q_3().emplace_back(0); - q_4().emplace_back(0); - q_m().emplace_back(1); - q_c().emplace_back(0); - q_arith().emplace_back(0); + blocks.main.q_1().emplace_back(0); + blocks.main.q_2().emplace_back(1); + blocks.main.q_3().emplace_back(0); + blocks.main.q_4().emplace_back(0); + blocks.main.q_m().emplace_back(1); + blocks.main.q_c().emplace_back(0); + blocks.main.q_arith().emplace_back(0); if constexpr (HasAdditionalSelectors) { blocks.main.pad_additional(); } @@ -1333,13 +1334,13 @@ void UltraCircuitBuilder_::apply_aux_selectors(const AUX_SELECT // Apply sorted memory read checks with the following additional check: // 1. Assert that if index field across two gates does not change, the value field does not change. // Used for ROM reads and RAM reads across write/read boundaries - q_1().emplace_back(1); - q_2().emplace_back(1); - q_3().emplace_back(0); - q_4().emplace_back(0); - q_m().emplace_back(0); - q_c().emplace_back(0); - q_arith().emplace_back(0); + blocks.main.q_1().emplace_back(1); + blocks.main.q_2().emplace_back(1); + blocks.main.q_3().emplace_back(0); + blocks.main.q_4().emplace_back(0); + blocks.main.q_m().emplace_back(0); + blocks.main.q_c().emplace_back(0); + blocks.main.q_arith().emplace_back(0); if constexpr (HasAdditionalSelectors) { blocks.main.pad_additional(); } @@ -1352,13 +1353,13 @@ void UltraCircuitBuilder_::apply_aux_selectors(const AUX_SELECT // 2. Validate record computation (r = read_write_flag + index * \eta + \timestamp * \eta^2 + value * \eta^3) // 3. If adjacent index values across 2 gates does not change, and the next gate's read_write_flag is set to // 'read', validate adjacent values do not change Used for ROM reads and RAM reads across read/write boundaries - q_1().emplace_back(0); - q_2().emplace_back(0); - q_3().emplace_back(0); - q_4().emplace_back(0); - q_m().emplace_back(0); - q_c().emplace_back(0); - q_arith().emplace_back(1); + blocks.main.q_1().emplace_back(0); + blocks.main.q_2().emplace_back(0); + blocks.main.q_3().emplace_back(0); + blocks.main.q_4().emplace_back(0); + blocks.main.q_m().emplace_back(0); + blocks.main.q_c().emplace_back(0); + blocks.main.q_arith().emplace_back(1); if constexpr (HasAdditionalSelectors) { blocks.main.pad_additional(); } @@ -1368,13 +1369,13 @@ void UltraCircuitBuilder_::apply_aux_selectors(const AUX_SELECT case AUX_SELECTORS::RAM_TIMESTAMP_CHECK: { // For two adjacent RAM entries that share the same index, validate the timestamp value is monotonically // increasing - q_1().emplace_back(1); - q_2().emplace_back(0); - q_3().emplace_back(0); - q_4().emplace_back(1); - q_m().emplace_back(0); - q_c().emplace_back(0); - q_arith().emplace_back(0); + blocks.main.q_1().emplace_back(1); + blocks.main.q_2().emplace_back(0); + blocks.main.q_3().emplace_back(0); + blocks.main.q_4().emplace_back(1); + blocks.main.q_m().emplace_back(0); + blocks.main.q_c().emplace_back(0); + blocks.main.q_arith().emplace_back(0); if constexpr (HasAdditionalSelectors) { blocks.main.pad_additional(); } @@ -1385,13 +1386,13 @@ void UltraCircuitBuilder_::apply_aux_selectors(const AUX_SELECT // Memory read gate for reading memory cells. // Validates record witness computation (r = read_write_flag + index * \eta + timestamp * \eta^2 + value * // \eta^3) - q_1().emplace_back(1); - q_2().emplace_back(0); - q_3().emplace_back(0); - q_4().emplace_back(0); - q_m().emplace_back(1); // validate record witness is correctly computed - q_c().emplace_back(0); // read/write flag stored in q_c - q_arith().emplace_back(0); + blocks.main.q_1().emplace_back(1); + blocks.main.q_2().emplace_back(0); + blocks.main.q_3().emplace_back(0); + blocks.main.q_4().emplace_back(0); + blocks.main.q_m().emplace_back(1); // validate record witness is correctly computed + blocks.main.q_c().emplace_back(0); // read/write flag stored in q_c + blocks.main.q_arith().emplace_back(0); if constexpr (HasAdditionalSelectors) { blocks.main.pad_additional(); } @@ -1402,13 +1403,13 @@ void UltraCircuitBuilder_::apply_aux_selectors(const AUX_SELECT // Memory read gate for reading memory cells. // Validates record witness computation (r = read_write_flag + index * \eta + timestamp * \eta^2 + value * // \eta^3) - q_1().emplace_back(1); - q_2().emplace_back(0); - q_3().emplace_back(0); - q_4().emplace_back(0); - q_m().emplace_back(1); // validate record witness is correctly computed - q_c().emplace_back(0); // read/write flag stored in q_c - q_arith().emplace_back(0); + blocks.main.q_1().emplace_back(1); + blocks.main.q_2().emplace_back(0); + blocks.main.q_3().emplace_back(0); + blocks.main.q_4().emplace_back(0); + blocks.main.q_m().emplace_back(1); // validate record witness is correctly computed + blocks.main.q_c().emplace_back(0); // read/write flag stored in q_c + blocks.main.q_arith().emplace_back(0); if constexpr (HasAdditionalSelectors) { blocks.main.pad_additional(); } @@ -1419,13 +1420,13 @@ void UltraCircuitBuilder_::apply_aux_selectors(const AUX_SELECT // Memory read gate for writing memory cells. // Validates record witness computation (r = read_write_flag + index * \eta + timestamp * \eta^2 + value * // \eta^3) - q_1().emplace_back(1); - q_2().emplace_back(0); - q_3().emplace_back(0); - q_4().emplace_back(0); - q_m().emplace_back(1); // validate record witness is correctly computed - q_c().emplace_back(1); // read/write flag stored in q_c - q_arith().emplace_back(0); + blocks.main.q_1().emplace_back(1); + blocks.main.q_2().emplace_back(0); + blocks.main.q_3().emplace_back(0); + blocks.main.q_4().emplace_back(0); + blocks.main.q_m().emplace_back(1); // validate record witness is correctly computed + blocks.main.q_c().emplace_back(1); // read/write flag stored in q_c + blocks.main.q_arith().emplace_back(0); if constexpr (HasAdditionalSelectors) { blocks.main.pad_additional(); } @@ -1433,13 +1434,13 @@ void UltraCircuitBuilder_::apply_aux_selectors(const AUX_SELECT break; } default: { - q_1().emplace_back(0); - q_2().emplace_back(0); - q_3().emplace_back(0); - q_4().emplace_back(0); - q_m().emplace_back(0); - q_c().emplace_back(0); - q_arith().emplace_back(0); + blocks.main.q_1().emplace_back(0); + blocks.main.q_2().emplace_back(0); + blocks.main.q_3().emplace_back(0); + blocks.main.q_4().emplace_back(0); + blocks.main.q_m().emplace_back(0); + blocks.main.q_c().emplace_back(0); + blocks.main.q_arith().emplace_back(0); if constexpr (HasAdditionalSelectors) { blocks.main.pad_additional(); } @@ -1509,20 +1510,20 @@ void UltraCircuitBuilder_::range_constrain_two_limbs(const uint const std::array lo_sublimbs = get_sublimbs(lo_idx, lo_masks); const std::array hi_sublimbs = get_sublimbs(hi_idx, hi_masks); - w_l().emplace_back(lo_sublimbs[0]); - w_r().emplace_back(lo_sublimbs[1]); - w_o().emplace_back(lo_sublimbs[2]); - w_4().emplace_back(lo_idx); + blocks.main.w_l().emplace_back(lo_sublimbs[0]); + blocks.main.w_r().emplace_back(lo_sublimbs[1]); + blocks.main.w_o().emplace_back(lo_sublimbs[2]); + blocks.main.w_4().emplace_back(lo_idx); - w_l().emplace_back(lo_sublimbs[3]); - w_r().emplace_back(lo_sublimbs[4]); - w_o().emplace_back(hi_sublimbs[0]); - w_4().emplace_back(hi_sublimbs[1]); + blocks.main.w_l().emplace_back(lo_sublimbs[3]); + blocks.main.w_r().emplace_back(lo_sublimbs[4]); + blocks.main.w_o().emplace_back(hi_sublimbs[0]); + blocks.main.w_4().emplace_back(hi_sublimbs[1]); - w_l().emplace_back(hi_sublimbs[2]); - w_r().emplace_back(hi_sublimbs[3]); - w_o().emplace_back(hi_sublimbs[4]); - w_4().emplace_back(hi_idx); + blocks.main.w_l().emplace_back(hi_sublimbs[2]); + blocks.main.w_r().emplace_back(hi_sublimbs[3]); + blocks.main.w_o().emplace_back(hi_sublimbs[4]); + blocks.main.w_4().emplace_back(hi_idx); apply_aux_selectors(AUX_SELECTORS::LIMB_ACCUMULATE_1); apply_aux_selectors(AUX_SELECTORS::LIMB_ACCUMULATE_2); @@ -1682,28 +1683,28 @@ std::array UltraCircuitBuilder_::evaluate_non_nati 0 }, true); - w_l().emplace_back(input.a[1]); - w_r().emplace_back(input.b[1]); - w_o().emplace_back(input.r[0]); - w_4().emplace_back(lo_0_idx); + blocks.main.w_l().emplace_back(input.a[1]); + blocks.main.w_r().emplace_back(input.b[1]); + blocks.main.w_o().emplace_back(input.r[0]); + blocks.main.w_4().emplace_back(lo_0_idx); apply_aux_selectors(AUX_SELECTORS::NON_NATIVE_FIELD_1); ++this->num_gates; - w_l().emplace_back(input.a[0]); - w_r().emplace_back(input.b[0]); - w_o().emplace_back(input.a[3]); - w_4().emplace_back(input.b[3]); + blocks.main.w_l().emplace_back(input.a[0]); + blocks.main.w_r().emplace_back(input.b[0]); + blocks.main.w_o().emplace_back(input.a[3]); + blocks.main.w_4().emplace_back(input.b[3]); apply_aux_selectors(AUX_SELECTORS::NON_NATIVE_FIELD_2); ++this->num_gates; - w_l().emplace_back(input.a[2]); - w_r().emplace_back(input.b[2]); - w_o().emplace_back(input.r[3]); - w_4().emplace_back(hi_0_idx); + blocks.main.w_l().emplace_back(input.a[2]); + blocks.main.w_r().emplace_back(input.b[2]); + blocks.main.w_o().emplace_back(input.r[3]); + blocks.main.w_4().emplace_back(hi_0_idx); apply_aux_selectors(AUX_SELECTORS::NON_NATIVE_FIELD_3); ++this->num_gates; - w_l().emplace_back(input.a[1]); - w_r().emplace_back(input.b[1]); - w_o().emplace_back(input.r[2]); - w_4().emplace_back(hi_1_idx); + blocks.main.w_l().emplace_back(input.a[1]); + blocks.main.w_r().emplace_back(input.b[1]); + blocks.main.w_o().emplace_back(input.r[2]); + blocks.main.w_4().emplace_back(hi_1_idx); apply_aux_selectors(AUX_SELECTORS::NONE); ++this->num_gates; @@ -1767,28 +1768,28 @@ void UltraCircuitBuilder_::process_non_native_field_multiplicat // iterate over the cached items and create constraints for (const auto& input : cached_partial_non_native_field_multiplications) { - w_l().emplace_back(input.a[1]); - w_r().emplace_back(input.b[1]); - w_o().emplace_back(this->zero_idx); - w_4().emplace_back(input.lo_0); + blocks.main.w_l().emplace_back(input.a[1]); + blocks.main.w_r().emplace_back(input.b[1]); + blocks.main.w_o().emplace_back(this->zero_idx); + blocks.main.w_4().emplace_back(input.lo_0); apply_aux_selectors(AUX_SELECTORS::NON_NATIVE_FIELD_1); ++this->num_gates; - w_l().emplace_back(input.a[0]); - w_r().emplace_back(input.b[0]); - w_o().emplace_back(input.a[3]); - w_4().emplace_back(input.b[3]); + blocks.main.w_l().emplace_back(input.a[0]); + blocks.main.w_r().emplace_back(input.b[0]); + blocks.main.w_o().emplace_back(input.a[3]); + blocks.main.w_4().emplace_back(input.b[3]); apply_aux_selectors(AUX_SELECTORS::NON_NATIVE_FIELD_2); ++this->num_gates; - w_l().emplace_back(input.a[2]); - w_r().emplace_back(input.b[2]); - w_o().emplace_back(this->zero_idx); - w_4().emplace_back(input.hi_0); + blocks.main.w_l().emplace_back(input.a[2]); + blocks.main.w_r().emplace_back(input.b[2]); + blocks.main.w_o().emplace_back(this->zero_idx); + blocks.main.w_4().emplace_back(input.hi_0); apply_aux_selectors(AUX_SELECTORS::NON_NATIVE_FIELD_3); ++this->num_gates; - w_l().emplace_back(input.a[1]); - w_r().emplace_back(input.b[1]); - w_o().emplace_back(this->zero_idx); - w_4().emplace_back(input.hi_1); + blocks.main.w_l().emplace_back(input.a[1]); + blocks.main.w_r().emplace_back(input.b[1]); + blocks.main.w_o().emplace_back(this->zero_idx); + blocks.main.w_4().emplace_back(input.hi_1); apply_aux_selectors(AUX_SELECTORS::NONE); ++this->num_gates; } @@ -1909,61 +1910,62 @@ std::array UltraCircuitBuilder_::evaluate_non_nati * By setting `q_arith` to `3`, we can validate `x_p + y_p + q_m = z_p` **/ // GATE 1 - w_l().emplace_back(y_p); - w_r().emplace_back(x_0); - w_o().emplace_back(y_0); - w_4().emplace_back(x_p); - w_l().emplace_back(z_p); - w_r().emplace_back(x_1); - w_o().emplace_back(y_1); // | 1 | 2 | 3 | 4 | - w_4().emplace_back(z_0); // |-----|-----|-----|-----| - w_l().emplace_back(x_2); // | y.p | x.0 | y.0 | z.p | (b.p + b.p - c.p = 0) AND (a.0 + b.0 - c.0 = 0) - w_r().emplace_back(y_2); // | x.p | x.1 | y.1 | z.0 | (a.1 + b.1 - c.1 = 0) - w_o().emplace_back(z_2); // | x.2 | y.2 | z.2 | z.1 | (a.2 + b.2 - c.2 = 0) - w_4().emplace_back(z_1); // | x.3 | y.3 | z.3 | --- | (a.3 + b.3 - c.3 = 0) - w_l().emplace_back(x_3); - w_r().emplace_back(y_3); - w_o().emplace_back(z_3); - w_4().emplace_back(this->zero_idx); - - q_m().emplace_back(addconstp); - q_1().emplace_back(0); - q_2().emplace_back(-x_mulconst0 * - 2); // scale constants by 2. If q_arith = 3 then w_4_omega value (z0) gets scaled by 2x - q_3().emplace_back(-y_mulconst0 * 2); // z_0 - (x_0 * -xmulconst0) - (y_0 * ymulconst0) = 0 => z_0 = x_0 + y_0 - q_4().emplace_back(0); - q_c().emplace_back(-addconst0 * 2); - q_arith().emplace_back(3); - - q_m().emplace_back(0); - q_1().emplace_back(0); - q_2().emplace_back(-x_mulconst1); - q_3().emplace_back(-y_mulconst1); - q_4().emplace_back(0); - q_c().emplace_back(-addconst1); - q_arith().emplace_back(2); - - q_m().emplace_back(0); - q_1().emplace_back(-x_mulconst2); - q_2().emplace_back(-y_mulconst2); - q_3().emplace_back(1); - q_4().emplace_back(0); - q_c().emplace_back(-addconst2); - q_arith().emplace_back(1); - - q_m().emplace_back(0); - q_1().emplace_back(-x_mulconst3); - q_2().emplace_back(-y_mulconst3); - q_3().emplace_back(1); - q_4().emplace_back(0); - q_c().emplace_back(-addconst3); - q_arith().emplace_back(1); + blocks.main.w_l().emplace_back(y_p); + blocks.main.w_r().emplace_back(x_0); + blocks.main.w_o().emplace_back(y_0); + blocks.main.w_4().emplace_back(x_p); + blocks.main.w_l().emplace_back(z_p); + blocks.main.w_r().emplace_back(x_1); + blocks.main.w_o().emplace_back(y_1); // | 1 | 2 | 3 | 4 | + blocks.main.w_4().emplace_back(z_0); // |-----|-----|-----|-----| + blocks.main.w_l().emplace_back(x_2); // | y.p | x.0 | y.0 | z.p | (b.p + b.p - c.p = 0) AND (a.0 + b.0 - c.0 = 0) + blocks.main.w_r().emplace_back(y_2); // | x.p | x.1 | y.1 | z.0 | (a.1 + b.1 - c.1 = 0) + blocks.main.w_o().emplace_back(z_2); // | x.2 | y.2 | z.2 | z.1 | (a.2 + b.2 - c.2 = 0) + blocks.main.w_4().emplace_back(z_1); // | x.3 | y.3 | z.3 | --- | (a.3 + b.3 - c.3 = 0) + blocks.main.w_l().emplace_back(x_3); + blocks.main.w_r().emplace_back(y_3); + blocks.main.w_o().emplace_back(z_3); + blocks.main.w_4().emplace_back(this->zero_idx); + + blocks.main.q_m().emplace_back(addconstp); + blocks.main.q_1().emplace_back(0); + blocks.main.q_2().emplace_back( + -x_mulconst0 * 2); // scale constants by 2. If q_arith = 3 then w_4_omega value (z0) gets scaled by 2x + blocks.main.q_3().emplace_back(-y_mulconst0 * + 2); // z_0 - (x_0 * -xmulconst0) - (y_0 * ymulconst0) = 0 => z_0 = x_0 + y_0 + blocks.main.q_4().emplace_back(0); + blocks.main.q_c().emplace_back(-addconst0 * 2); + blocks.main.q_arith().emplace_back(3); + + blocks.main.q_m().emplace_back(0); + blocks.main.q_1().emplace_back(0); + blocks.main.q_2().emplace_back(-x_mulconst1); + blocks.main.q_3().emplace_back(-y_mulconst1); + blocks.main.q_4().emplace_back(0); + blocks.main.q_c().emplace_back(-addconst1); + blocks.main.q_arith().emplace_back(2); + + blocks.main.q_m().emplace_back(0); + blocks.main.q_1().emplace_back(-x_mulconst2); + blocks.main.q_2().emplace_back(-y_mulconst2); + blocks.main.q_3().emplace_back(1); + blocks.main.q_4().emplace_back(0); + blocks.main.q_c().emplace_back(-addconst2); + blocks.main.q_arith().emplace_back(1); + + blocks.main.q_m().emplace_back(0); + blocks.main.q_1().emplace_back(-x_mulconst3); + blocks.main.q_2().emplace_back(-y_mulconst3); + blocks.main.q_3().emplace_back(1); + blocks.main.q_4().emplace_back(0); + blocks.main.q_c().emplace_back(-addconst3); + blocks.main.q_arith().emplace_back(1); for (size_t i = 0; i < 4; ++i) { - q_sort().emplace_back(0); - q_lookup_type().emplace_back(0); - q_elliptic().emplace_back(0); - q_aux().emplace_back(0); + blocks.main.q_sort().emplace_back(0); + blocks.main.q_lookup_type().emplace_back(0); + blocks.main.q_elliptic().emplace_back(0); + blocks.main.q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { blocks.main.pad_additional(); } @@ -2035,60 +2037,61 @@ std::array UltraCircuitBuilder_::evaluate_non_nati * **/ // GATE 1 - w_l().emplace_back(y_p); - w_r().emplace_back(x_0); - w_o().emplace_back(y_0); - w_4().emplace_back(z_p); - w_l().emplace_back(x_p); - w_r().emplace_back(x_1); - w_o().emplace_back(y_1); // | 1 | 2 | 3 | 4 | - w_4().emplace_back(z_0); // |-----|-----|-----|-----| - w_l().emplace_back(x_2); // | y.p | x.0 | y.0 | z.p | (b.p + c.p - a.p = 0) AND (a.0 - b.0 - c.0 = 0) - w_r().emplace_back(y_2); // | x.p | x.1 | y.1 | z.0 | (a.1 - b.1 - c.1 = 0) - w_o().emplace_back(z_2); // | x.2 | y.2 | z.2 | z.1 | (a.2 - b.2 - c.2 = 0) - w_4().emplace_back(z_1); // | x.3 | y.3 | z.3 | --- | (a.3 - b.3 - c.3 = 0) - w_l().emplace_back(x_3); - w_r().emplace_back(y_3); - w_o().emplace_back(z_3); - w_4().emplace_back(this->zero_idx); - - q_m().emplace_back(-addconstp); - q_1().emplace_back(0); - q_2().emplace_back(-x_mulconst0 * 2); - q_3().emplace_back(y_mulconst0 * 2); // z_0 + (x_0 * -xmulconst0) + (y_0 * ymulconst0) = 0 => z_0 = x_0 - y_0 - q_4().emplace_back(0); - q_c().emplace_back(-addconst0 * 2); - q_arith().emplace_back(3); - - q_m().emplace_back(0); - q_1().emplace_back(0); - q_2().emplace_back(-x_mulconst1); - q_3().emplace_back(y_mulconst1); - q_4().emplace_back(0); - q_c().emplace_back(-addconst1); - q_arith().emplace_back(2); - - q_m().emplace_back(0); - q_1().emplace_back(-x_mulconst2); - q_2().emplace_back(y_mulconst2); - q_3().emplace_back(1); - q_4().emplace_back(0); - q_c().emplace_back(-addconst2); - q_arith().emplace_back(1); - - q_m().emplace_back(0); - q_1().emplace_back(-x_mulconst3); - q_2().emplace_back(y_mulconst3); - q_3().emplace_back(1); - q_4().emplace_back(0); - q_c().emplace_back(-addconst3); - q_arith().emplace_back(1); + blocks.main.w_l().emplace_back(y_p); + blocks.main.w_r().emplace_back(x_0); + blocks.main.w_o().emplace_back(y_0); + blocks.main.w_4().emplace_back(z_p); + blocks.main.w_l().emplace_back(x_p); + blocks.main.w_r().emplace_back(x_1); + blocks.main.w_o().emplace_back(y_1); // | 1 | 2 | 3 | 4 | + blocks.main.w_4().emplace_back(z_0); // |-----|-----|-----|-----| + blocks.main.w_l().emplace_back(x_2); // | y.p | x.0 | y.0 | z.p | (b.p + c.p - a.p = 0) AND (a.0 - b.0 - c.0 = 0) + blocks.main.w_r().emplace_back(y_2); // | x.p | x.1 | y.1 | z.0 | (a.1 - b.1 - c.1 = 0) + blocks.main.w_o().emplace_back(z_2); // | x.2 | y.2 | z.2 | z.1 | (a.2 - b.2 - c.2 = 0) + blocks.main.w_4().emplace_back(z_1); // | x.3 | y.3 | z.3 | --- | (a.3 - b.3 - c.3 = 0) + blocks.main.w_l().emplace_back(x_3); + blocks.main.w_r().emplace_back(y_3); + blocks.main.w_o().emplace_back(z_3); + blocks.main.w_4().emplace_back(this->zero_idx); + + blocks.main.q_m().emplace_back(-addconstp); + blocks.main.q_1().emplace_back(0); + blocks.main.q_2().emplace_back(-x_mulconst0 * 2); + blocks.main.q_3().emplace_back(y_mulconst0 * + 2); // z_0 + (x_0 * -xmulconst0) + (y_0 * ymulconst0) = 0 => z_0 = x_0 - y_0 + blocks.main.q_4().emplace_back(0); + blocks.main.q_c().emplace_back(-addconst0 * 2); + blocks.main.q_arith().emplace_back(3); + + blocks.main.q_m().emplace_back(0); + blocks.main.q_1().emplace_back(0); + blocks.main.q_2().emplace_back(-x_mulconst1); + blocks.main.q_3().emplace_back(y_mulconst1); + blocks.main.q_4().emplace_back(0); + blocks.main.q_c().emplace_back(-addconst1); + blocks.main.q_arith().emplace_back(2); + + blocks.main.q_m().emplace_back(0); + blocks.main.q_1().emplace_back(-x_mulconst2); + blocks.main.q_2().emplace_back(y_mulconst2); + blocks.main.q_3().emplace_back(1); + blocks.main.q_4().emplace_back(0); + blocks.main.q_c().emplace_back(-addconst2); + blocks.main.q_arith().emplace_back(1); + + blocks.main.q_m().emplace_back(0); + blocks.main.q_1().emplace_back(-x_mulconst3); + blocks.main.q_2().emplace_back(y_mulconst3); + blocks.main.q_3().emplace_back(1); + blocks.main.q_4().emplace_back(0); + blocks.main.q_c().emplace_back(-addconst3); + blocks.main.q_arith().emplace_back(1); for (size_t i = 0; i < 4; ++i) { - q_sort().emplace_back(0); - q_lookup_type().emplace_back(0); - q_elliptic().emplace_back(0); - q_aux().emplace_back(0); + blocks.main.q_sort().emplace_back(0); + blocks.main.q_lookup_type().emplace_back(0); + blocks.main.q_elliptic().emplace_back(0); + blocks.main.q_aux().emplace_back(0); if constexpr (HasAdditionalSelectors) { blocks.main.pad_additional(); } @@ -2113,10 +2116,10 @@ template void UltraCircuitBuilder_:: // Record wire value can't yet be computed record.record_witness = this->add_variable(0); apply_aux_selectors(AUX_SELECTORS::ROM_READ); - w_l().emplace_back(record.index_witness); - w_r().emplace_back(record.value_column1_witness); - w_o().emplace_back(record.value_column2_witness); - w_4().emplace_back(record.record_witness); + blocks.main.w_l().emplace_back(record.index_witness); + blocks.main.w_r().emplace_back(record.value_column1_witness); + blocks.main.w_o().emplace_back(record.value_column2_witness); + blocks.main.w_4().emplace_back(record.record_witness); record.gate_index = this->num_gates; ++this->num_gates; } @@ -2133,10 +2136,10 @@ void UltraCircuitBuilder_::create_sorted_ROM_gate(RomRecord& re { record.record_witness = this->add_variable(0); apply_aux_selectors(AUX_SELECTORS::ROM_CONSISTENCY_CHECK); - w_l().emplace_back(record.index_witness); - w_r().emplace_back(record.value_column1_witness); - w_o().emplace_back(record.value_column2_witness); - w_4().emplace_back(record.record_witness); + blocks.main.w_l().emplace_back(record.index_witness); + blocks.main.w_r().emplace_back(record.value_column1_witness); + blocks.main.w_o().emplace_back(record.value_column2_witness); + blocks.main.w_4().emplace_back(record.record_witness); record.gate_index = this->num_gates; ++this->num_gates; } @@ -2179,10 +2182,10 @@ template void UltraCircuitBuilder_:: record.record_witness = this->add_variable(0); apply_aux_selectors(record.access_type == RamRecord::AccessType::READ ? AUX_SELECTORS::RAM_READ : AUX_SELECTORS::RAM_WRITE); - w_l().emplace_back(record.index_witness); - w_r().emplace_back(record.timestamp_witness); - w_o().emplace_back(record.value_witness); - w_4().emplace_back(record.record_witness); + blocks.main.w_l().emplace_back(record.index_witness); + blocks.main.w_r().emplace_back(record.timestamp_witness); + blocks.main.w_o().emplace_back(record.value_witness); + blocks.main.w_4().emplace_back(record.record_witness); record.gate_index = this->num_gates; ++this->num_gates; } @@ -2200,10 +2203,10 @@ void UltraCircuitBuilder_::create_sorted_RAM_gate(RamRecord& re { record.record_witness = this->add_variable(0); apply_aux_selectors(AUX_SELECTORS::RAM_CONSISTENCY_CHECK); - w_l().emplace_back(record.index_witness); - w_r().emplace_back(record.timestamp_witness); - w_o().emplace_back(record.value_witness); - w_4().emplace_back(record.record_witness); + blocks.main.w_l().emplace_back(record.index_witness); + blocks.main.w_r().emplace_back(record.timestamp_witness); + blocks.main.w_o().emplace_back(record.value_witness); + blocks.main.w_4().emplace_back(record.record_witness); record.gate_index = this->num_gates; ++this->num_gates; } @@ -2695,10 +2698,10 @@ template void UltraCircuitBuilder_:: uint32_t timestamp_delta_witness = this->add_variable(timestamp_delta); apply_aux_selectors(AUX_SELECTORS::RAM_TIMESTAMP_CHECK); - w_l().emplace_back(current.index_witness); - w_r().emplace_back(current.timestamp_witness); - w_o().emplace_back(timestamp_delta_witness); - w_4().emplace_back(this->zero_idx); + blocks.main.w_l().emplace_back(current.index_witness); + blocks.main.w_r().emplace_back(current.timestamp_witness); + blocks.main.w_o().emplace_back(timestamp_delta_witness); + blocks.main.w_4().emplace_back(this->zero_idx); ++this->num_gates; // store timestamp offsets for later. Need to apply range checks to them, but calling @@ -3397,26 +3400,26 @@ template bool UltraCircuitBuilder_:: FF w_4_value; FF w_4_index; // Get the values of selectors and wires and update tag products along the way - q_arith_value = q_arith()[i]; - q_aux_value = q_aux()[i]; - q_elliptic_value = q_elliptic()[i]; - q_sort_value = q_sort()[i]; - q_lookup_type_value = q_lookup_type()[i]; - q_1_value = q_1()[i]; - q_2_value = q_2()[i]; - q_3_value = q_3()[i]; - q_4_value = q_4()[i]; - q_m_value = q_m()[i]; - q_c_value = q_c()[i]; - w_1_value = this->get_variable(w_l()[i]); - update_tag_check_information(w_l()[i], w_1_value); - w_2_value = this->get_variable(w_r()[i]); - update_tag_check_information(w_r()[i], w_2_value); - w_3_value = this->get_variable(w_o()[i]); - update_tag_check_information(w_o()[i], w_3_value); - w_4_value = this->get_variable(w_4()[i]); + q_arith_value = blocks.main.q_arith()[i]; + q_aux_value = blocks.main.q_aux()[i]; + q_elliptic_value = blocks.main.q_elliptic()[i]; + q_sort_value = blocks.main.q_sort()[i]; + q_lookup_type_value = blocks.main.q_lookup_type()[i]; + q_1_value = blocks.main.q_1()[i]; + q_2_value = blocks.main.q_2()[i]; + q_3_value = blocks.main.q_3()[i]; + q_4_value = blocks.main.q_4()[i]; + q_m_value = blocks.main.q_m()[i]; + q_c_value = blocks.main.q_c()[i]; + w_1_value = this->get_variable(blocks.main.w_l()[i]); + update_tag_check_information(blocks.main.w_l()[i], w_1_value); + w_2_value = this->get_variable(blocks.main.w_r()[i]); + update_tag_check_information(blocks.main.w_r()[i], w_2_value); + w_3_value = this->get_variable(blocks.main.w_o()[i]); + update_tag_check_information(blocks.main.w_o()[i], w_3_value); + w_4_value = this->get_variable(blocks.main.w_4()[i]); // We need to wait before updating tag product for w_4 - w_4_index = w_4()[i]; + w_4_index = blocks.main.w_4()[i]; // If we are touching a gate with memory access, we need to update the value of the 4th witness if (memory_read_record_gates.contains(i)) { @@ -3432,10 +3435,10 @@ template bool UltraCircuitBuilder_:: FF w_3_shifted_value; FF w_4_shifted_value; if (i < (this->num_gates - 1)) { - w_1_shifted_value = this->get_variable(w_l()[i + 1]); - w_2_shifted_value = this->get_variable(w_r()[i + 1]); - w_3_shifted_value = this->get_variable(w_o()[i + 1]); - w_4_shifted_value = this->get_variable(w_4()[i + 1]); + w_1_shifted_value = this->get_variable(blocks.main.w_l()[i + 1]); + w_2_shifted_value = this->get_variable(blocks.main.w_r()[i + 1]); + w_3_shifted_value = this->get_variable(blocks.main.w_o()[i + 1]); + w_4_shifted_value = this->get_variable(blocks.main.w_4()[i + 1]); } else { w_1_shifted_value = FF::zero(); w_2_shifted_value = FF::zero(); diff --git a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.hpp b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.hpp index 6f85d1eab23..ffe9c7b0186 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.hpp @@ -345,21 +345,21 @@ class UltraCircuitBuilder_ : public CircuitBuilderBasecircuit_finalized = circuit_finalized; builder->num_gates = num_gates; builder->cached_partial_non_native_field_multiplications = cached_partial_non_native_field_multiplications; - builder->w_l().resize(num_gates); - builder->w_r().resize(num_gates); - builder->w_o().resize(num_gates); - builder->w_4().resize(num_gates); - builder->q_m().resize(num_gates); - builder->q_c().resize(num_gates); - builder->q_1().resize(num_gates); - builder->q_2().resize(num_gates); - builder->q_3().resize(num_gates); - builder->q_4().resize(num_gates); - builder->q_arith().resize(num_gates); - builder->q_sort().resize(num_gates); - builder->q_elliptic().resize(num_gates); - builder->q_aux().resize(num_gates); - builder->q_lookup_type().resize(num_gates); + builder->blocks.main.w_l().resize(num_gates); + builder->blocks.main.w_r().resize(num_gates); + builder->blocks.main.w_o().resize(num_gates); + builder->blocks.main.w_4().resize(num_gates); + builder->blocks.main.q_m().resize(num_gates); + builder->blocks.main.q_c().resize(num_gates); + builder->blocks.main.q_1().resize(num_gates); + builder->blocks.main.q_2().resize(num_gates); + builder->blocks.main.q_3().resize(num_gates); + builder->blocks.main.q_4().resize(num_gates); + builder->blocks.main.q_arith().resize(num_gates); + builder->blocks.main.q_sort().resize(num_gates); + builder->blocks.main.q_elliptic().resize(num_gates); + builder->blocks.main.q_aux().resize(num_gates); + builder->blocks.main.q_lookup_type().resize(num_gates); if constexpr (HasAdditionalSelectors) { builder->blocks.main.resize_additional(num_gates); } @@ -493,49 +493,49 @@ class UltraCircuitBuilder_ : public CircuitBuilderBase>; - using SelectorVector = std::vector>; - - WireVector& w_l() { return std::get<0>(blocks.main.wires); }; - WireVector& w_r() { return std::get<1>(blocks.main.wires); }; - WireVector& w_o() { return std::get<2>(blocks.main.wires); }; - WireVector& w_4() { return std::get<3>(blocks.main.wires); }; - - const WireVector& w_l() const { return std::get<0>(blocks.main.wires); }; - const WireVector& w_r() const { return std::get<1>(blocks.main.wires); }; - const WireVector& w_o() const { return std::get<2>(blocks.main.wires); }; - const WireVector& w_4() const { return std::get<3>(blocks.main.wires); }; - - SelectorVector& q_m() { return blocks.main.q_m(); }; - SelectorVector& q_c() { return blocks.main.q_c(); }; - SelectorVector& q_1() { return blocks.main.q_1(); }; - SelectorVector& q_2() { return blocks.main.q_2(); }; - SelectorVector& q_3() { return blocks.main.q_3(); }; - SelectorVector& q_4() { return blocks.main.q_4(); }; - SelectorVector& q_arith() { return blocks.main.q_arith(); }; - SelectorVector& q_sort() { return blocks.main.q_sort(); }; - SelectorVector& q_elliptic() { return blocks.main.q_elliptic(); }; - SelectorVector& q_aux() { return blocks.main.q_aux(); }; - SelectorVector& q_lookup_type() { return blocks.main.q_lookup_type(); }; - - const SelectorVector& q_c() const { return blocks.main.q_c(); }; - const SelectorVector& q_1() const { return blocks.main.q_1(); }; - const SelectorVector& q_2() const { return blocks.main.q_2(); }; - const SelectorVector& q_3() const { return blocks.main.q_3(); }; - const SelectorVector& q_4() const { return blocks.main.q_4(); }; - const SelectorVector& q_arith() const { return blocks.main.q_arith(); }; - const SelectorVector& q_sort() const { return blocks.main.q_sort(); }; - const SelectorVector& q_elliptic() const { return blocks.main.q_elliptic(); }; - const SelectorVector& q_aux() const { return blocks.main.q_aux(); }; - const SelectorVector& q_lookup_type() const { return blocks.main.q_lookup_type(); }; - const SelectorVector& q_m() const { return blocks.main.q_m(); }; - // These are variables that we have used a gate on, to enforce that they are // equal to a defined value. // TODO(#216)(Adrian): Why is this not in CircuitBuilderBase diff --git a/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.cpp b/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.cpp index 6cb4f52a764..20dfcf16743 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.cpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.cpp @@ -56,6 +56,7 @@ typename ExecutionTrace_::TraceData ExecutionTrace_::construct_t // For each block in the trace, populate wire polys, copy cycles and selector polys for (auto& block : builder.blocks.get()) { auto block_size = static_cast(block.wires[0].size()); + info("block size = ", block_size); // Update wire polynomials and copy cycles // NB: The order of row/column loops is arbitrary but needs to be row/column to match old copy_cycle code From 01e6790b291c579a574c1253f9495b59a46d1ce9 Mon Sep 17 00:00:00 2001 From: ledwards2225 Date: Sat, 24 Feb 2024 14:38:26 +0000 Subject: [PATCH 12/28] use populate wires --- .../arithmetization/arithmetization.hpp | 18 +- .../standard_circuit_builder.cpp | 2 +- .../circuit_builder/ultra_circuit_builder.cpp | 416 +++++++++++------- 3 files changed, 266 insertions(+), 170 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/proof_system/arithmetization/arithmetization.hpp b/barretenberg/cpp/src/barretenberg/proof_system/arithmetization/arithmetization.hpp index f6d9557f855..96a28b94fc0 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/arithmetization/arithmetization.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/arithmetization/arithmetization.hpp @@ -54,7 +54,7 @@ template class StandardArith { // WireType w_r; // WireType w_o; - void update_wires(const uint32_t& idx_1, const uint32_t& idx_2, const uint32_t& idx_3) + void populate_wires(const uint32_t& idx_1, const uint32_t& idx_2, const uint32_t& idx_3) { wires[0].emplace_back(idx_1); wires[1].emplace_back(idx_2); @@ -108,6 +108,14 @@ template class UltraArith { Selectors selectors; bool is_public_input = false; + void populate_wires(const uint32_t& idx_1, const uint32_t& idx_2, const uint32_t& idx_3, const uint32_t& idx_4) + { + wires[0].emplace_back(idx_1); + wires[1].emplace_back(idx_2); + wires[2].emplace_back(idx_3); + wires[4].emplace_back(idx_4); + } + WireType& w_l() { return std::get<0>(wires); }; WireType& w_r() { return std::get<1>(wires); }; WireType& w_o() { return std::get<2>(wires); }; @@ -187,6 +195,14 @@ template class UltraHonkArith { Selectors selectors; bool is_public_input = false; + void populate_wires(const uint32_t& idx_1, const uint32_t& idx_2, const uint32_t& idx_3, const uint32_t& idx_4) + { + wires[0].emplace_back(idx_1); + wires[1].emplace_back(idx_2); + wires[2].emplace_back(idx_3); + wires[4].emplace_back(idx_4); + } + WireType& w_l() { return std::get<0>(wires); }; WireType& w_r() { return std::get<1>(wires); }; WireType& w_o() { return std::get<2>(wires); }; diff --git a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/standard_circuit_builder.cpp b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/standard_circuit_builder.cpp index 440b92ad821..e85a7c1199b 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/standard_circuit_builder.cpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/standard_circuit_builder.cpp @@ -230,7 +230,7 @@ template void StandardCircuitBuilder_::create_poly_gate(const this->assert_valid_variables({ in.a, in.b, in.c }); // WORKTODO: use this update_wires method everywhere - blocks.arithmetic.update_wires(in.a, in.b, in.c); + blocks.arithmetic.populate_wires(in.a, in.b, in.c); blocks.arithmetic.q_m().emplace_back(in.q_m); blocks.arithmetic.q_1().emplace_back(in.q_l); blocks.arithmetic.q_2().emplace_back(in.q_r); diff --git a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.cpp b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.cpp index 4678f10a5ec..b776a09a10b 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.cpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.cpp @@ -61,10 +61,11 @@ void UltraCircuitBuilder_::add_gates_to_ensure_all_polys_are_no { // First add a gate to simultaneously ensure first entries of all wires is zero and to add a non // zero value to all selectors aside from q_c and q_lookup - blocks.main.w_l().emplace_back(this->zero_idx); - blocks.main.w_r().emplace_back(this->zero_idx); - blocks.main.w_o().emplace_back(this->zero_idx); - blocks.main.w_4().emplace_back(this->zero_idx); + // blocks.main.w_l().emplace_back(this->zero_idx); + // blocks.main.w_r().emplace_back(this->zero_idx); + // blocks.main.w_o().emplace_back(this->zero_idx); + // blocks.main.w_4().emplace_back(this->zero_idx); + blocks.main.populate_wires(this->zero_idx, this->zero_idx, this->zero_idx, this->zero_idx); blocks.main.q_m().emplace_back(1); blocks.main.q_1().emplace_back(1); blocks.main.q_2().emplace_back(1); @@ -125,10 +126,11 @@ void UltraCircuitBuilder_::create_add_gate(const add_triple_assert_valid_variables({ in.a, in.b, in.c }); - blocks.main.w_l().emplace_back(in.a); - blocks.main.w_r().emplace_back(in.b); - blocks.main.w_o().emplace_back(in.c); - blocks.main.w_4().emplace_back(this->zero_idx); + // blocks.main.w_l().emplace_back(in.a); + // blocks.main.w_r().emplace_back(in.b); + // blocks.main.w_o().emplace_back(in.c); + // blocks.main.w_4().emplace_back(this->zero_idx); + blocks.main.populate_wires(in.a, in.b, in.c, this->zero_idx); blocks.main.q_m().emplace_back(0); blocks.main.q_1().emplace_back(in.a_scaling); blocks.main.q_2().emplace_back(in.b_scaling); @@ -160,10 +162,11 @@ void UltraCircuitBuilder_::create_big_add_gate(const add_quad_< const bool include_next_gate_w_4) { this->assert_valid_variables({ in.a, in.b, in.c, in.d }); - blocks.main.w_l().emplace_back(in.a); - blocks.main.w_r().emplace_back(in.b); - blocks.main.w_o().emplace_back(in.c); - blocks.main.w_4().emplace_back(in.d); + // blocks.main.w_l().emplace_back(in.a); + // blocks.main.w_r().emplace_back(in.b); + // blocks.main.w_o().emplace_back(in.c); + // blocks.main.w_4().emplace_back(in.d); + blocks.main.populate_wires(in.a, in.b, in.c, in.d); blocks.main.q_m().emplace_back(0); blocks.main.q_1().emplace_back(in.a_scaling); blocks.main.q_2().emplace_back(in.b_scaling); @@ -257,10 +260,11 @@ void UltraCircuitBuilder_::create_big_mul_gate(const mul_quad_< { this->assert_valid_variables({ in.a, in.b, in.c, in.d }); - blocks.main.w_l().emplace_back(in.a); - blocks.main.w_r().emplace_back(in.b); - blocks.main.w_o().emplace_back(in.c); - blocks.main.w_4().emplace_back(in.d); + // blocks.main.w_l().emplace_back(in.a); + // blocks.main.w_r().emplace_back(in.b); + // blocks.main.w_o().emplace_back(in.c); + // blocks.main.w_4().emplace_back(in.d); + blocks.main.populate_wires(in.a, in.b, in.c, in.d); blocks.main.q_m().emplace_back(in.mul_scaling); blocks.main.q_1().emplace_back(in.a_scaling); blocks.main.q_2().emplace_back(in.b_scaling); @@ -286,10 +290,11 @@ void UltraCircuitBuilder_::create_balanced_add_gate(const add_q { this->assert_valid_variables({ in.a, in.b, in.c, in.d }); - blocks.main.w_l().emplace_back(in.a); - blocks.main.w_r().emplace_back(in.b); - blocks.main.w_o().emplace_back(in.c); - blocks.main.w_4().emplace_back(in.d); + // blocks.main.w_l().emplace_back(in.a); + // blocks.main.w_r().emplace_back(in.b); + // blocks.main.w_o().emplace_back(in.c); + // blocks.main.w_4().emplace_back(in.d); + blocks.main.populate_wires(in.a, in.b, in.c, in.d); blocks.main.q_m().emplace_back(0); blocks.main.q_1().emplace_back(in.a_scaling); blocks.main.q_2().emplace_back(in.b_scaling); @@ -331,10 +336,11 @@ void UltraCircuitBuilder_::create_mul_gate(const mul_triple_assert_valid_variables({ in.a, in.b, in.c }); - blocks.main.w_l().emplace_back(in.a); - blocks.main.w_r().emplace_back(in.b); - blocks.main.w_o().emplace_back(in.c); - blocks.main.w_4().emplace_back(this->zero_idx); + // blocks.main.w_l().emplace_back(in.a); + // blocks.main.w_r().emplace_back(in.b); + // blocks.main.w_o().emplace_back(in.c); + // blocks.main.w_4().emplace_back(this->zero_idx); + blocks.main.populate_wires(in.a, in.b, in.c, this->zero_idx); blocks.main.q_m().emplace_back(in.mul_scaling); blocks.main.q_1().emplace_back(0); blocks.main.q_2().emplace_back(0); @@ -362,10 +368,11 @@ void UltraCircuitBuilder_::create_bool_gate(const uint32_t vari { this->assert_valid_variables({ variable_index }); - blocks.main.w_l().emplace_back(variable_index); - blocks.main.w_r().emplace_back(variable_index); - blocks.main.w_o().emplace_back(this->zero_idx); - blocks.main.w_4().emplace_back(this->zero_idx); + // blocks.main.w_l().emplace_back(variable_index); + // blocks.main.w_r().emplace_back(variable_index); + // blocks.main.w_o().emplace_back(this->zero_idx); + // blocks.main.w_4().emplace_back(this->zero_idx); + blocks.main.populate_wires(variable_index, variable_index, this->zero_idx, this->zero_idx); blocks.main.q_m().emplace_back(1); blocks.main.q_1().emplace_back(-1); blocks.main.q_2().emplace_back(0); @@ -396,10 +403,11 @@ void UltraCircuitBuilder_::create_poly_gate(const poly_triple_< { this->assert_valid_variables({ in.a, in.b, in.c }); - blocks.main.w_l().emplace_back(in.a); - blocks.main.w_r().emplace_back(in.b); - blocks.main.w_o().emplace_back(in.c); - blocks.main.w_4().emplace_back(this->zero_idx); + // blocks.main.w_l().emplace_back(in.a); + // blocks.main.w_r().emplace_back(in.b); + // blocks.main.w_o().emplace_back(in.c); + // blocks.main.w_4().emplace_back(this->zero_idx); + blocks.main.populate_wires(in.a, in.b, in.c, this->zero_idx); blocks.main.q_m().emplace_back(in.q_m); blocks.main.q_1().emplace_back(in.q_l); blocks.main.q_2().emplace_back(in.q_r); @@ -453,10 +461,11 @@ void UltraCircuitBuilder_::create_ecc_add_gate(const ecc_add_ga blocks.main.q_1()[this->num_gates - 1] = in.sign_coefficient; blocks.main.q_elliptic()[this->num_gates - 1] = 1; } else { - blocks.main.w_l().emplace_back(this->zero_idx); - blocks.main.w_r().emplace_back(in.x1); - blocks.main.w_o().emplace_back(in.y1); - blocks.main.w_4().emplace_back(this->zero_idx); + // blocks.main.w_l().emplace_back(this->zero_idx); + // blocks.main.w_r().emplace_back(in.x1); + // blocks.main.w_o().emplace_back(in.y1); + // blocks.main.w_4().emplace_back(this->zero_idx); + blocks.main.populate_wires(this->zero_idx, in.x1, in.y1, this->zero_idx); blocks.main.q_3().emplace_back(0); blocks.main.q_4().emplace_back(0); blocks.main.q_1().emplace_back(in.sign_coefficient); @@ -475,10 +484,11 @@ void UltraCircuitBuilder_::create_ecc_add_gate(const ecc_add_ga check_selector_length_consistency(); ++this->num_gates; } - blocks.main.w_l().emplace_back(in.x2); - blocks.main.w_4().emplace_back(in.y2); - blocks.main.w_r().emplace_back(in.x3); - blocks.main.w_o().emplace_back(in.y3); + // blocks.main.w_l().emplace_back(in.x2); + // blocks.main.w_4().emplace_back(in.y2); + // blocks.main.w_r().emplace_back(in.x3); + // blocks.main.w_o().emplace_back(in.y3); + blocks.main.populate_wires(in.x2, in.y2, in.x3, in.y3); blocks.main.q_m().emplace_back(0); blocks.main.q_1().emplace_back(0); blocks.main.q_2().emplace_back(0); @@ -525,10 +535,11 @@ void UltraCircuitBuilder_::create_ecc_dbl_gate(const ecc_dbl_ga blocks.main.q_elliptic()[this->num_gates - 1] = 1; blocks.main.q_m()[this->num_gates - 1] = 1; } else { - blocks.main.w_r().emplace_back(in.x1); - blocks.main.w_o().emplace_back(in.y1); - blocks.main.w_l().emplace_back(this->zero_idx); - blocks.main.w_4().emplace_back(this->zero_idx); + // blocks.main.w_r().emplace_back(in.x1); + // blocks.main.w_o().emplace_back(in.y1); + // blocks.main.w_l().emplace_back(this->zero_idx); + // blocks.main.w_4().emplace_back(this->zero_idx); + blocks.main.populate_wires(in.x1, in.y1, this->zero_idx, this->zero_idx); blocks.main.q_elliptic().emplace_back(1); blocks.main.q_m().emplace_back(1); blocks.main.q_1().emplace_back(0); @@ -547,10 +558,11 @@ void UltraCircuitBuilder_::create_ecc_dbl_gate(const ecc_dbl_ga ++this->num_gates; } - blocks.main.w_r().emplace_back(in.x3); - blocks.main.w_o().emplace_back(in.y3); - blocks.main.w_l().emplace_back(this->zero_idx); - blocks.main.w_4().emplace_back(this->zero_idx); + // blocks.main.w_r().emplace_back(in.x3); + // blocks.main.w_o().emplace_back(in.y3); + // blocks.main.w_l().emplace_back(this->zero_idx); + // blocks.main.w_4().emplace_back(this->zero_idx); + blocks.main.populate_wires(in.x3, in.y3, this->zero_idx, this->zero_idx); blocks.main.q_m().emplace_back(0); blocks.main.q_1().emplace_back(0); blocks.main.q_2().emplace_back(0); @@ -580,10 +592,11 @@ void UltraCircuitBuilder_::fix_witness(const uint32_t witness_i { this->assert_valid_variables({ witness_index }); - blocks.main.w_l().emplace_back(witness_index); - blocks.main.w_r().emplace_back(this->zero_idx); - blocks.main.w_o().emplace_back(this->zero_idx); - blocks.main.w_4().emplace_back(this->zero_idx); + // blocks.main.w_l().emplace_back(witness_index); + // blocks.main.w_r().emplace_back(this->zero_idx); + // blocks.main.w_o().emplace_back(this->zero_idx); + // blocks.main.w_4().emplace_back(this->zero_idx); + blocks.main.populate_wires(witness_index, this->zero_idx, this->zero_idx, this->zero_idx); blocks.main.q_m().emplace_back(0); blocks.main.q_1().emplace_back(1); blocks.main.q_2().emplace_back(0); @@ -660,10 +673,11 @@ plookup::ReadData UltraCircuitBuilder_::create_gates_ blocks.main.q_lookup_type().emplace_back(FF(1)); blocks.main.q_3().emplace_back(FF(table.table_index)); - blocks.main.w_l().emplace_back(first_idx); - blocks.main.w_r().emplace_back(second_idx); - blocks.main.w_o().emplace_back(third_idx); - blocks.main.w_4().emplace_back(this->zero_idx); + // blocks.main.w_l().emplace_back(first_idx); + // blocks.main.w_r().emplace_back(second_idx); + // blocks.main.w_o().emplace_back(third_idx); + // blocks.main.w_4().emplace_back(this->zero_idx); + blocks.main.populate_wires(first_idx, second_idx, third_idx, this->zero_idx); blocks.main.q_1().emplace_back(0); blocks.main.q_2().emplace_back((i == (num_lookups - 1) ? 0 : -multi_table.column_1_step_sizes[i + 1])); blocks.main.q_m().emplace_back((i == (num_lookups - 1) ? 0 : -multi_table.column_2_step_sizes[i + 1])); @@ -969,10 +983,12 @@ void UltraCircuitBuilder_::create_sort_constraint(const std::ve for (size_t i = 0; i < variable_index.size(); i += gate_width) { - blocks.main.w_l().emplace_back(variable_index[i]); - blocks.main.w_r().emplace_back(variable_index[i + 1]); - blocks.main.w_o().emplace_back(variable_index[i + 2]); - blocks.main.w_4().emplace_back(variable_index[i + 3]); + // blocks.main.w_l().emplace_back(variable_index[i]); + // blocks.main.w_r().emplace_back(variable_index[i + 1]); + // blocks.main.w_o().emplace_back(variable_index[i + 2]); + // blocks.main.w_4().emplace_back(variable_index[i + 3]); + blocks.main.populate_wires(variable_index[i], variable_index[i+1], variable_index[i+2], variable_index[i+3]); + ++this->num_gates; blocks.main.q_m().emplace_back(0); blocks.main.q_1().emplace_back(0); @@ -991,10 +1007,11 @@ void UltraCircuitBuilder_::create_sort_constraint(const std::ve check_selector_length_consistency(); } // dummy gate needed because of sort widget's check of next row - blocks.main.w_l().emplace_back(variable_index[variable_index.size() - 1]); - blocks.main.w_r().emplace_back(this->zero_idx); - blocks.main.w_o().emplace_back(this->zero_idx); - blocks.main.w_4().emplace_back(this->zero_idx); + // blocks.main.w_l().emplace_back(variable_index[variable_index.size() - 1]); + // blocks.main.w_r().emplace_back(this->zero_idx); + // blocks.main.w_o().emplace_back(this->zero_idx); + // blocks.main.w_4().emplace_back(this->zero_idx); + blocks.main.populate_wires(variable_index[variable_index.size() - 1], this->zero_idx, this->zero_idx, this->zero_idx); ++this->num_gates; blocks.main.q_m().emplace_back(0); blocks.main.q_1().emplace_back(0); @@ -1028,10 +1045,11 @@ void UltraCircuitBuilder_::create_dummy_constraints(const std:: this->assert_valid_variables(padded_list); for (size_t i = 0; i < padded_list.size(); i += gate_width) { - blocks.main.w_l().emplace_back(padded_list[i]); - blocks.main.w_r().emplace_back(padded_list[i + 1]); - blocks.main.w_o().emplace_back(padded_list[i + 2]); - blocks.main.w_4().emplace_back(padded_list[i + 3]); + // blocks.main.w_l().emplace_back(padded_list[i]); + // blocks.main.w_r().emplace_back(padded_list[i + 1]); + // blocks.main.w_o().emplace_back(padded_list[i + 2]); + // blocks.main.w_4().emplace_back(padded_list[i + 3]); + blocks.main.populate_wires(padded_list[i], padded_list[i+1], padded_list[i+2], padded_list[i+3]); ++this->num_gates; blocks.main.q_m().emplace_back(0); blocks.main.q_1().emplace_back(0); @@ -1062,10 +1080,11 @@ void UltraCircuitBuilder_::create_sort_constraint_with_edges( this->assert_valid_variables(variable_index); // enforce range checks of first row and starting at start - blocks.main.w_l().emplace_back(variable_index[0]); - blocks.main.w_r().emplace_back(variable_index[1]); - blocks.main.w_o().emplace_back(variable_index[2]); - blocks.main.w_4().emplace_back(variable_index[3]); + // blocks.main.w_l().emplace_back(variable_index[0]); + // blocks.main.w_r().emplace_back(variable_index[1]); + // blocks.main.w_o().emplace_back(variable_index[2]); + // blocks.main.w_4().emplace_back(variable_index[3]); + blocks.main.populate_wires(variable_index[0], variable_index[1], variable_index[2], variable_index[3]); ++this->num_gates; blocks.main.q_m().emplace_back(0); blocks.main.q_1().emplace_back(1); @@ -1085,10 +1104,11 @@ void UltraCircuitBuilder_::create_sort_constraint_with_edges( // enforce range check for middle rows for (size_t i = gate_width; i < variable_index.size() - gate_width; i += gate_width) { - blocks.main.w_l().emplace_back(variable_index[i]); - blocks.main.w_r().emplace_back(variable_index[i + 1]); - blocks.main.w_o().emplace_back(variable_index[i + 2]); - blocks.main.w_4().emplace_back(variable_index[i + 3]); + // blocks.main.w_l().emplace_back(variable_index[i]); + // blocks.main.w_r().emplace_back(variable_index[i + 1]); + // blocks.main.w_o().emplace_back(variable_index[i + 2]); + // blocks.main.w_4().emplace_back(variable_index[i + 3]); + blocks.main.populate_wires(variable_index[i], variable_index[i + 1], variable_index[i+2], variable_index[i+3]); ++this->num_gates; blocks.main.q_m().emplace_back(0); blocks.main.q_1().emplace_back(0); @@ -1108,10 +1128,11 @@ void UltraCircuitBuilder_::create_sort_constraint_with_edges( } // enforce range checks of last row and ending at end if (variable_index.size() > gate_width) { - blocks.main.w_l().emplace_back(variable_index[variable_index.size() - 4]); - blocks.main.w_r().emplace_back(variable_index[variable_index.size() - 3]); - blocks.main.w_o().emplace_back(variable_index[variable_index.size() - 2]); - blocks.main.w_4().emplace_back(variable_index[variable_index.size() - 1]); + // blocks.main.w_l().emplace_back(variable_index[variable_index.size() - 4]); + // blocks.main.w_r().emplace_back(variable_index[variable_index.size() - 3]); + // blocks.main.w_o().emplace_back(variable_index[variable_index.size() - 2]); + // blocks.main.w_4().emplace_back(variable_index[variable_index.size() - 1]); + blocks.main.populate_wires(variable_index[variable_index.size() - 4], variable_index[variable_index.size() - 3], variable_index[variable_index.size() - 2], variable_index[variable_index.size() - 1]); ++this->num_gates; blocks.main.q_m().emplace_back(0); blocks.main.q_1().emplace_back(0); @@ -1132,10 +1153,11 @@ void UltraCircuitBuilder_::create_sort_constraint_with_edges( // dummy gate needed because of sort widget's check of next row // use this gate to check end condition - blocks.main.w_l().emplace_back(variable_index[variable_index.size() - 1]); - blocks.main.w_r().emplace_back(this->zero_idx); - blocks.main.w_o().emplace_back(this->zero_idx); - blocks.main.w_4().emplace_back(this->zero_idx); + // blocks.main.w_l().emplace_back(variable_index[variable_index.size() - 1]); + // blocks.main.w_r().emplace_back(this->zero_idx); + // blocks.main.w_o().emplace_back(this->zero_idx); + // blocks.main.w_4().emplace_back(this->zero_idx); + blocks.main.populate_wires(variable_index[variable_index.size() - 1], this->zero_idx, this->zero_idx, this->zero_idx); ++this->num_gates; blocks.main.q_m().emplace_back(0); blocks.main.q_1().emplace_back(1); @@ -1510,20 +1532,26 @@ void UltraCircuitBuilder_::range_constrain_two_limbs(const uint const std::array lo_sublimbs = get_sublimbs(lo_idx, lo_masks); const std::array hi_sublimbs = get_sublimbs(hi_idx, hi_masks); - blocks.main.w_l().emplace_back(lo_sublimbs[0]); - blocks.main.w_r().emplace_back(lo_sublimbs[1]); - blocks.main.w_o().emplace_back(lo_sublimbs[2]); - blocks.main.w_4().emplace_back(lo_idx); + // blocks.main.w_l().emplace_back(lo_sublimbs[0]); + // blocks.main.w_r().emplace_back(lo_sublimbs[1]); + // blocks.main.w_o().emplace_back(lo_sublimbs[2]); + // blocks.main.w_4().emplace_back(lo_idx); + blocks.main.populate_wires(lo_sublimbs[0], lo_sublimbs[1], lo_sublimbs[2], lo_idx); + + + // blocks.main.w_l().emplace_back(lo_sublimbs[3]); + // blocks.main.w_r().emplace_back(lo_sublimbs[4]); + // blocks.main.w_o().emplace_back(hi_sublimbs[0]); + // blocks.main.w_4().emplace_back(hi_sublimbs[1]); + blocks.main.populate_wires(lo_sublimbs[3], lo_sublimbs[4], hi_sublimbs[0], hi_sublimbs[1]); - blocks.main.w_l().emplace_back(lo_sublimbs[3]); - blocks.main.w_r().emplace_back(lo_sublimbs[4]); - blocks.main.w_o().emplace_back(hi_sublimbs[0]); - blocks.main.w_4().emplace_back(hi_sublimbs[1]); - blocks.main.w_l().emplace_back(hi_sublimbs[2]); - blocks.main.w_r().emplace_back(hi_sublimbs[3]); - blocks.main.w_o().emplace_back(hi_sublimbs[4]); - blocks.main.w_4().emplace_back(hi_idx); + // blocks.main.w_l().emplace_back(hi_sublimbs[2]); + // blocks.main.w_r().emplace_back(hi_sublimbs[3]); + // blocks.main.w_o().emplace_back(hi_sublimbs[4]); + // blocks.main.w_4().emplace_back(hi_idx); + blocks.main.populate_wires(hi_sublimbs[2], hi_sublimbs[3], hi_sublimbs[4], hi_idx); + apply_aux_selectors(AUX_SELECTORS::LIMB_ACCUMULATE_1); apply_aux_selectors(AUX_SELECTORS::LIMB_ACCUMULATE_2); @@ -1683,28 +1711,36 @@ std::array UltraCircuitBuilder_::evaluate_non_nati 0 }, true); - blocks.main.w_l().emplace_back(input.a[1]); - blocks.main.w_r().emplace_back(input.b[1]); - blocks.main.w_o().emplace_back(input.r[0]); - blocks.main.w_4().emplace_back(lo_0_idx); + // blocks.main.w_l().emplace_back(input.a[1]); + // blocks.main.w_r().emplace_back(input.b[1]); + // blocks.main.w_o().emplace_back(input.r[0]); + // blocks.main.w_4().emplace_back(lo_0_idx); + blocks.main.populate_wires(input.a[1], input.b[1], input.r[0], lo_0_idx); + apply_aux_selectors(AUX_SELECTORS::NON_NATIVE_FIELD_1); ++this->num_gates; - blocks.main.w_l().emplace_back(input.a[0]); - blocks.main.w_r().emplace_back(input.b[0]); - blocks.main.w_o().emplace_back(input.a[3]); - blocks.main.w_4().emplace_back(input.b[3]); + // blocks.main.w_l().emplace_back(input.a[0]); + // blocks.main.w_r().emplace_back(input.b[0]); + // blocks.main.w_o().emplace_back(input.a[3]); + // blocks.main.w_4().emplace_back(input.b[3]); + blocks.main.populate_wires(input.a[0], input.b[0], input.a[3], input.b[3]); + apply_aux_selectors(AUX_SELECTORS::NON_NATIVE_FIELD_2); ++this->num_gates; - blocks.main.w_l().emplace_back(input.a[2]); - blocks.main.w_r().emplace_back(input.b[2]); - blocks.main.w_o().emplace_back(input.r[3]); - blocks.main.w_4().emplace_back(hi_0_idx); + // blocks.main.w_l().emplace_back(input.a[2]); + // blocks.main.w_r().emplace_back(input.b[2]); + // blocks.main.w_o().emplace_back(input.r[3]); + // blocks.main.w_4().emplace_back(hi_0_idx); + blocks.main.populate_wires(input.a[2], input.b[3], input.r[3], hi_0_idx); + apply_aux_selectors(AUX_SELECTORS::NON_NATIVE_FIELD_3); ++this->num_gates; - blocks.main.w_l().emplace_back(input.a[1]); - blocks.main.w_r().emplace_back(input.b[1]); - blocks.main.w_o().emplace_back(input.r[2]); - blocks.main.w_4().emplace_back(hi_1_idx); + // blocks.main.w_l().emplace_back(input.a[1]); + // blocks.main.w_r().emplace_back(input.b[1]); + // blocks.main.w_o().emplace_back(input.r[2]); + // blocks.main.w_4().emplace_back(hi_1_idx); + blocks.main.populate_wires(input.a[1], input.b[1], input.r[2], hi_1_idx); + apply_aux_selectors(AUX_SELECTORS::NONE); ++this->num_gates; @@ -1772,24 +1808,32 @@ void UltraCircuitBuilder_::process_non_native_field_multiplicat blocks.main.w_r().emplace_back(input.b[1]); blocks.main.w_o().emplace_back(this->zero_idx); blocks.main.w_4().emplace_back(input.lo_0); + // blocks.main.populate_wires(input.a[1], input.b[1], this->zero_idx, input.lo_0); + apply_aux_selectors(AUX_SELECTORS::NON_NATIVE_FIELD_1); ++this->num_gates; - blocks.main.w_l().emplace_back(input.a[0]); - blocks.main.w_r().emplace_back(input.b[0]); - blocks.main.w_o().emplace_back(input.a[3]); - blocks.main.w_4().emplace_back(input.b[3]); + // blocks.main.w_l().emplace_back(input.a[0]); + // blocks.main.w_r().emplace_back(input.b[0]); + // blocks.main.w_o().emplace_back(input.a[3]); + // blocks.main.w_4().emplace_back(input.b[3]); + blocks.main.populate_wires(input.a[0], input.b[0], input.a[3], input.b[3]); + apply_aux_selectors(AUX_SELECTORS::NON_NATIVE_FIELD_2); ++this->num_gates; blocks.main.w_l().emplace_back(input.a[2]); blocks.main.w_r().emplace_back(input.b[2]); blocks.main.w_o().emplace_back(this->zero_idx); blocks.main.w_4().emplace_back(input.hi_0); + // blocks.main.populate_wires(input.a[2], input.b[3], this->zero_idx, input.hi_0); + apply_aux_selectors(AUX_SELECTORS::NON_NATIVE_FIELD_3); ++this->num_gates; blocks.main.w_l().emplace_back(input.a[1]); blocks.main.w_r().emplace_back(input.b[1]); blocks.main.w_o().emplace_back(this->zero_idx); blocks.main.w_4().emplace_back(input.hi_1); + // blocks.main.populate_wires(input.a[1], input.b[1], this->zero_idx, input.hi_1); + apply_aux_selectors(AUX_SELECTORS::NONE); ++this->num_gates; } @@ -1910,22 +1954,35 @@ std::array UltraCircuitBuilder_::evaluate_non_nati * By setting `q_arith` to `3`, we can validate `x_p + y_p + q_m = z_p` **/ // GATE 1 - blocks.main.w_l().emplace_back(y_p); - blocks.main.w_r().emplace_back(x_0); - blocks.main.w_o().emplace_back(y_0); - blocks.main.w_4().emplace_back(x_p); - blocks.main.w_l().emplace_back(z_p); - blocks.main.w_r().emplace_back(x_1); - blocks.main.w_o().emplace_back(y_1); // | 1 | 2 | 3 | 4 | - blocks.main.w_4().emplace_back(z_0); // |-----|-----|-----|-----| - blocks.main.w_l().emplace_back(x_2); // | y.p | x.0 | y.0 | z.p | (b.p + b.p - c.p = 0) AND (a.0 + b.0 - c.0 = 0) - blocks.main.w_r().emplace_back(y_2); // | x.p | x.1 | y.1 | z.0 | (a.1 + b.1 - c.1 = 0) - blocks.main.w_o().emplace_back(z_2); // | x.2 | y.2 | z.2 | z.1 | (a.2 + b.2 - c.2 = 0) - blocks.main.w_4().emplace_back(z_1); // | x.3 | y.3 | z.3 | --- | (a.3 + b.3 - c.3 = 0) - blocks.main.w_l().emplace_back(x_3); - blocks.main.w_r().emplace_back(y_3); - blocks.main.w_o().emplace_back(z_3); - blocks.main.w_4().emplace_back(this->zero_idx); + // blocks.main.w_l().emplace_back(y_p); + // blocks.main.w_r().emplace_back(x_0); + // blocks.main.w_o().emplace_back(y_0); + // blocks.main.w_4().emplace_back(x_p); + blocks.main.populate_wires(y_p, x_0, y_0, x_p); + // | 1 | 2 | 3 | 4 | + // |-----|-----|-----|-----| + // | y.p | x.0 | y.0 | z.p | (b.p + b.p - c.p = 0) AND (a.0 + b.0 - c.0 = 0) + // | x.p | x.1 | y.1 | z.0 | (a.1 + b.1 - c.1 = 0) + // | x.2 | y.2 | z.2 | z.1 | (a.2 + b.2 - c.2 = 0) + // | x.3 | y.3 | z.3 | --- | (a.3 + b.3 - c.3 = 0) + // blocks.main.w_l().emplace_back(z_p); + // blocks.main.w_r().emplace_back(x_1); + // blocks.main.w_o().emplace_back(y_1); // | 1 | 2 | 3 | 4 | + // blocks.main.w_4().emplace_back(z_0); // |-----|-----|-----|-----| + blocks.main.populate_wires(z_p, x_1, y_1, z_0); + + // blocks.main.w_l().emplace_back(x_2); // | y.p | x.0 | y.0 | z.p | (b.p + b.p - c.p = 0) AND (a.0 + b.0 - c.0 = 0) + // blocks.main.w_r().emplace_back(y_2); // | x.p | x.1 | y.1 | z.0 | (a.1 + b.1 - c.1 = 0) + // blocks.main.w_o().emplace_back(z_2); // | x.2 | y.2 | z.2 | z.1 | (a.2 + b.2 - c.2 = 0) + // blocks.main.w_4().emplace_back(z_1); // | x.3 | y.3 | z.3 | --- | (a.3 + b.3 - c.3 = 0) + blocks.main.populate_wires(x_2, y_2, z_2, z_1); + + // blocks.main.w_l().emplace_back(x_3); + // blocks.main.w_r().emplace_back(y_3); + // blocks.main.w_o().emplace_back(z_3); + // blocks.main.w_4().emplace_back(this->zero_idx); + blocks.main.populate_wires(x_3, y_3, z_3, this->zero_idx); + blocks.main.q_m().emplace_back(addconstp); blocks.main.q_1().emplace_back(0); @@ -2037,22 +2094,35 @@ std::array UltraCircuitBuilder_::evaluate_non_nati * **/ // GATE 1 - blocks.main.w_l().emplace_back(y_p); - blocks.main.w_r().emplace_back(x_0); - blocks.main.w_o().emplace_back(y_0); - blocks.main.w_4().emplace_back(z_p); - blocks.main.w_l().emplace_back(x_p); - blocks.main.w_r().emplace_back(x_1); - blocks.main.w_o().emplace_back(y_1); // | 1 | 2 | 3 | 4 | - blocks.main.w_4().emplace_back(z_0); // |-----|-----|-----|-----| - blocks.main.w_l().emplace_back(x_2); // | y.p | x.0 | y.0 | z.p | (b.p + c.p - a.p = 0) AND (a.0 - b.0 - c.0 = 0) - blocks.main.w_r().emplace_back(y_2); // | x.p | x.1 | y.1 | z.0 | (a.1 - b.1 - c.1 = 0) - blocks.main.w_o().emplace_back(z_2); // | x.2 | y.2 | z.2 | z.1 | (a.2 - b.2 - c.2 = 0) - blocks.main.w_4().emplace_back(z_1); // | x.3 | y.3 | z.3 | --- | (a.3 - b.3 - c.3 = 0) - blocks.main.w_l().emplace_back(x_3); - blocks.main.w_r().emplace_back(y_3); - blocks.main.w_o().emplace_back(z_3); - blocks.main.w_4().emplace_back(this->zero_idx); + // | 1 | 2 | 3 | 4 | + // |-----|-----|-----|-----| + // | y.p | x.0 | y.0 | z.p | (b.p + c.p - a.p = 0) AND (a.0 - b.0 - c.0 = 0) + // | x.p | x.1 | y.1 | z.0 | (a.1 - b.1 - c.1 = 0) + // | x.2 | y.2 | z.2 | z.1 | (a.2 - b.2 - c.2 = 0) + // | x.3 | y.3 | z.3 | --- | (a.3 - b.3 - c.3 = 0) + // blocks.main.w_l().emplace_back(y_p); + // blocks.main.w_r().emplace_back(x_0); + // blocks.main.w_o().emplace_back(y_0); + // blocks.main.w_4().emplace_back(z_p); + blocks.main.populate_wires(y_p, x_0, y_0, z_p); + + // blocks.main.w_l().emplace_back(x_p); + // blocks.main.w_r().emplace_back(x_1); + // blocks.main.w_o().emplace_back(y_1); // | 1 | 2 | 3 | 4 | + // blocks.main.w_4().emplace_back(z_0); // |-----|-----|-----|-----| + blocks.main.populate_wires(x_p, x_1, y_1, z_0); + + // blocks.main.w_l().emplace_back(x_2); // | y.p | x.0 | y.0 | z.p | (b.p + c.p - a.p = 0) AND (a.0 - b.0 - c.0 = 0) + // blocks.main.w_r().emplace_back(y_2); // | x.p | x.1 | y.1 | z.0 | (a.1 - b.1 - c.1 = 0) + // blocks.main.w_o().emplace_back(z_2); // | x.2 | y.2 | z.2 | z.1 | (a.2 - b.2 - c.2 = 0) + // blocks.main.w_4().emplace_back(z_1); // | x.3 | y.3 | z.3 | --- | (a.3 - b.3 - c.3 = 0) + blocks.main.populate_wires(x_2, y_2, z_2, z_1); + + // blocks.main.w_l().emplace_back(x_3); + // blocks.main.w_r().emplace_back(y_3); + // blocks.main.w_o().emplace_back(z_3); + // blocks.main.w_4().emplace_back(this->zero_idx); + blocks.main.populate_wires(x_3, y_3, z_3, this->zero_idx); blocks.main.q_m().emplace_back(-addconstp); blocks.main.q_1().emplace_back(0); @@ -2116,10 +2186,12 @@ template void UltraCircuitBuilder_:: // Record wire value can't yet be computed record.record_witness = this->add_variable(0); apply_aux_selectors(AUX_SELECTORS::ROM_READ); - blocks.main.w_l().emplace_back(record.index_witness); - blocks.main.w_r().emplace_back(record.value_column1_witness); - blocks.main.w_o().emplace_back(record.value_column2_witness); - blocks.main.w_4().emplace_back(record.record_witness); + // blocks.main.w_l().emplace_back(record.index_witness); + // blocks.main.w_r().emplace_back(record.value_column1_witness); + // blocks.main.w_o().emplace_back(record.value_column2_witness); + // blocks.main.w_4().emplace_back(record.record_witness); + blocks.main.populate_wires(record.index_witness, record.value_column1_witness, record.value_column2_witness, record.record_witness); + record.gate_index = this->num_gates; ++this->num_gates; } @@ -2136,10 +2208,12 @@ void UltraCircuitBuilder_::create_sorted_ROM_gate(RomRecord& re { record.record_witness = this->add_variable(0); apply_aux_selectors(AUX_SELECTORS::ROM_CONSISTENCY_CHECK); - blocks.main.w_l().emplace_back(record.index_witness); - blocks.main.w_r().emplace_back(record.value_column1_witness); - blocks.main.w_o().emplace_back(record.value_column2_witness); - blocks.main.w_4().emplace_back(record.record_witness); + // blocks.main.w_l().emplace_back(record.index_witness); + // blocks.main.w_r().emplace_back(record.value_column1_witness); + // blocks.main.w_o().emplace_back(record.value_column2_witness); + // blocks.main.w_4().emplace_back(record.record_witness); + blocks.main.populate_wires(record.index_witness, record.value_column1_witness, record.value_column2_witness, record.record_witness); + record.gate_index = this->num_gates; ++this->num_gates; } @@ -2182,10 +2256,12 @@ template void UltraCircuitBuilder_:: record.record_witness = this->add_variable(0); apply_aux_selectors(record.access_type == RamRecord::AccessType::READ ? AUX_SELECTORS::RAM_READ : AUX_SELECTORS::RAM_WRITE); - blocks.main.w_l().emplace_back(record.index_witness); - blocks.main.w_r().emplace_back(record.timestamp_witness); - blocks.main.w_o().emplace_back(record.value_witness); - blocks.main.w_4().emplace_back(record.record_witness); + // blocks.main.w_l().emplace_back(record.index_witness); + // blocks.main.w_r().emplace_back(record.timestamp_witness); + // blocks.main.w_o().emplace_back(record.value_witness); + // blocks.main.w_4().emplace_back(record.record_witness); + blocks.main.populate_wires(record.index_witness, record.timestamp_witness, record.value_witness, record.record_witness); + record.gate_index = this->num_gates; ++this->num_gates; } @@ -2203,10 +2279,12 @@ void UltraCircuitBuilder_::create_sorted_RAM_gate(RamRecord& re { record.record_witness = this->add_variable(0); apply_aux_selectors(AUX_SELECTORS::RAM_CONSISTENCY_CHECK); - blocks.main.w_l().emplace_back(record.index_witness); - blocks.main.w_r().emplace_back(record.timestamp_witness); - blocks.main.w_o().emplace_back(record.value_witness); - blocks.main.w_4().emplace_back(record.record_witness); + // blocks.main.w_l().emplace_back(record.index_witness); + // blocks.main.w_r().emplace_back(record.timestamp_witness); + // blocks.main.w_o().emplace_back(record.value_witness); + // blocks.main.w_4().emplace_back(record.record_witness); + blocks.main.populate_wires(record.index_witness, record.timestamp_witness, record.value_witness, record.record_witness); + record.gate_index = this->num_gates; ++this->num_gates; } @@ -2698,10 +2776,12 @@ template void UltraCircuitBuilder_:: uint32_t timestamp_delta_witness = this->add_variable(timestamp_delta); apply_aux_selectors(AUX_SELECTORS::RAM_TIMESTAMP_CHECK); - blocks.main.w_l().emplace_back(current.index_witness); - blocks.main.w_r().emplace_back(current.timestamp_witness); - blocks.main.w_o().emplace_back(timestamp_delta_witness); - blocks.main.w_4().emplace_back(this->zero_idx); + // blocks.main.w_l().emplace_back(current.index_witness); + // blocks.main.w_r().emplace_back(current.timestamp_witness); + // blocks.main.w_o().emplace_back(timestamp_delta_witness); + // blocks.main.w_4().emplace_back(this->zero_idx); + blocks.main.populate_wires(current.index_witness, current.timestamp_witness, timestamp_delta_witness, this->zero_idx); + ++this->num_gates; // store timestamp offsets for later. Need to apply range checks to them, but calling From 992268c9b93471252a3a64146bd33ac4b5a74d68 Mon Sep 17 00:00:00 2001 From: ledwards2225 Date: Sat, 24 Feb 2024 15:52:00 +0000 Subject: [PATCH 13/28] use populate where possible --- .../arithmetization/arithmetization.hpp | 4 +- .../circuit_builder/ultra_circuit_builder.cpp | 42 +++++++++---------- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/proof_system/arithmetization/arithmetization.hpp b/barretenberg/cpp/src/barretenberg/proof_system/arithmetization/arithmetization.hpp index 96a28b94fc0..716adc1e034 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/arithmetization/arithmetization.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/arithmetization/arithmetization.hpp @@ -113,7 +113,7 @@ template class UltraArith { wires[0].emplace_back(idx_1); wires[1].emplace_back(idx_2); wires[2].emplace_back(idx_3); - wires[4].emplace_back(idx_4); + wires[3].emplace_back(idx_4); } WireType& w_l() { return std::get<0>(wires); }; @@ -200,7 +200,7 @@ template class UltraHonkArith { wires[0].emplace_back(idx_1); wires[1].emplace_back(idx_2); wires[2].emplace_back(idx_3); - wires[4].emplace_back(idx_4); + wires[3].emplace_back(idx_4); } WireType& w_l() { return std::get<0>(wires); }; diff --git a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.cpp b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.cpp index b776a09a10b..2e237979629 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.cpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.cpp @@ -461,11 +461,11 @@ void UltraCircuitBuilder_::create_ecc_add_gate(const ecc_add_ga blocks.main.q_1()[this->num_gates - 1] = in.sign_coefficient; blocks.main.q_elliptic()[this->num_gates - 1] = 1; } else { - // blocks.main.w_l().emplace_back(this->zero_idx); - // blocks.main.w_r().emplace_back(in.x1); - // blocks.main.w_o().emplace_back(in.y1); - // blocks.main.w_4().emplace_back(this->zero_idx); - blocks.main.populate_wires(this->zero_idx, in.x1, in.y1, this->zero_idx); + blocks.main.w_l().emplace_back(this->zero_idx); + blocks.main.w_r().emplace_back(in.x1); + blocks.main.w_o().emplace_back(in.y1); + blocks.main.w_4().emplace_back(this->zero_idx); + // blocks.main.populate_wires(this->zero_idx, in.x1, in.y1, this->zero_idx); blocks.main.q_3().emplace_back(0); blocks.main.q_4().emplace_back(0); blocks.main.q_1().emplace_back(in.sign_coefficient); @@ -484,11 +484,11 @@ void UltraCircuitBuilder_::create_ecc_add_gate(const ecc_add_ga check_selector_length_consistency(); ++this->num_gates; } - // blocks.main.w_l().emplace_back(in.x2); - // blocks.main.w_4().emplace_back(in.y2); - // blocks.main.w_r().emplace_back(in.x3); - // blocks.main.w_o().emplace_back(in.y3); - blocks.main.populate_wires(in.x2, in.y2, in.x3, in.y3); + blocks.main.w_l().emplace_back(in.x2); + blocks.main.w_4().emplace_back(in.y2); + blocks.main.w_r().emplace_back(in.x3); + blocks.main.w_o().emplace_back(in.y3); + // blocks.main.populate_wires(in.x2, in.y2, in.x3, in.y3); blocks.main.q_m().emplace_back(0); blocks.main.q_1().emplace_back(0); blocks.main.q_2().emplace_back(0); @@ -535,11 +535,11 @@ void UltraCircuitBuilder_::create_ecc_dbl_gate(const ecc_dbl_ga blocks.main.q_elliptic()[this->num_gates - 1] = 1; blocks.main.q_m()[this->num_gates - 1] = 1; } else { - // blocks.main.w_r().emplace_back(in.x1); - // blocks.main.w_o().emplace_back(in.y1); - // blocks.main.w_l().emplace_back(this->zero_idx); - // blocks.main.w_4().emplace_back(this->zero_idx); - blocks.main.populate_wires(in.x1, in.y1, this->zero_idx, this->zero_idx); + blocks.main.w_r().emplace_back(in.x1); + blocks.main.w_o().emplace_back(in.y1); + blocks.main.w_l().emplace_back(this->zero_idx); + blocks.main.w_4().emplace_back(this->zero_idx); + // blocks.main.populate_wires(in.x1, in.y1, this->zero_idx, this->zero_idx); blocks.main.q_elliptic().emplace_back(1); blocks.main.q_m().emplace_back(1); blocks.main.q_1().emplace_back(0); @@ -558,11 +558,11 @@ void UltraCircuitBuilder_::create_ecc_dbl_gate(const ecc_dbl_ga ++this->num_gates; } - // blocks.main.w_r().emplace_back(in.x3); - // blocks.main.w_o().emplace_back(in.y3); - // blocks.main.w_l().emplace_back(this->zero_idx); - // blocks.main.w_4().emplace_back(this->zero_idx); - blocks.main.populate_wires(in.x3, in.y3, this->zero_idx, this->zero_idx); + blocks.main.w_r().emplace_back(in.x3); + blocks.main.w_o().emplace_back(in.y3); + blocks.main.w_l().emplace_back(this->zero_idx); + blocks.main.w_4().emplace_back(this->zero_idx); + // blocks.main.populate_wires(in.x3, in.y3, this->zero_idx, this->zero_idx); blocks.main.q_m().emplace_back(0); blocks.main.q_1().emplace_back(0); blocks.main.q_2().emplace_back(0); @@ -1731,7 +1731,7 @@ std::array UltraCircuitBuilder_::evaluate_non_nati // blocks.main.w_r().emplace_back(input.b[2]); // blocks.main.w_o().emplace_back(input.r[3]); // blocks.main.w_4().emplace_back(hi_0_idx); - blocks.main.populate_wires(input.a[2], input.b[3], input.r[3], hi_0_idx); + blocks.main.populate_wires(input.a[2], input.b[2], input.r[3], hi_0_idx); apply_aux_selectors(AUX_SELECTORS::NON_NATIVE_FIELD_3); ++this->num_gates; From 386ebfbe73c659b87f30e15783792427518cc8f4 Mon Sep 17 00:00:00 2001 From: ledwards2225 Date: Sat, 24 Feb 2024 16:18:27 +0000 Subject: [PATCH 14/28] delete dead code --- .../circuit_builder/ultra_circuit_builder.cpp | 176 +----------------- 1 file changed, 6 insertions(+), 170 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.cpp b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.cpp index 2e237979629..af2fb64880f 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.cpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.cpp @@ -61,10 +61,6 @@ void UltraCircuitBuilder_::add_gates_to_ensure_all_polys_are_no { // First add a gate to simultaneously ensure first entries of all wires is zero and to add a non // zero value to all selectors aside from q_c and q_lookup - // blocks.main.w_l().emplace_back(this->zero_idx); - // blocks.main.w_r().emplace_back(this->zero_idx); - // blocks.main.w_o().emplace_back(this->zero_idx); - // blocks.main.w_4().emplace_back(this->zero_idx); blocks.main.populate_wires(this->zero_idx, this->zero_idx, this->zero_idx, this->zero_idx); blocks.main.q_m().emplace_back(1); blocks.main.q_1().emplace_back(1); @@ -126,10 +122,6 @@ void UltraCircuitBuilder_::create_add_gate(const add_triple_assert_valid_variables({ in.a, in.b, in.c }); - // blocks.main.w_l().emplace_back(in.a); - // blocks.main.w_r().emplace_back(in.b); - // blocks.main.w_o().emplace_back(in.c); - // blocks.main.w_4().emplace_back(this->zero_idx); blocks.main.populate_wires(in.a, in.b, in.c, this->zero_idx); blocks.main.q_m().emplace_back(0); blocks.main.q_1().emplace_back(in.a_scaling); @@ -162,10 +154,6 @@ void UltraCircuitBuilder_::create_big_add_gate(const add_quad_< const bool include_next_gate_w_4) { this->assert_valid_variables({ in.a, in.b, in.c, in.d }); - // blocks.main.w_l().emplace_back(in.a); - // blocks.main.w_r().emplace_back(in.b); - // blocks.main.w_o().emplace_back(in.c); - // blocks.main.w_4().emplace_back(in.d); blocks.main.populate_wires(in.a, in.b, in.c, in.d); blocks.main.q_m().emplace_back(0); blocks.main.q_1().emplace_back(in.a_scaling); @@ -260,10 +248,6 @@ void UltraCircuitBuilder_::create_big_mul_gate(const mul_quad_< { this->assert_valid_variables({ in.a, in.b, in.c, in.d }); - // blocks.main.w_l().emplace_back(in.a); - // blocks.main.w_r().emplace_back(in.b); - // blocks.main.w_o().emplace_back(in.c); - // blocks.main.w_4().emplace_back(in.d); blocks.main.populate_wires(in.a, in.b, in.c, in.d); blocks.main.q_m().emplace_back(in.mul_scaling); blocks.main.q_1().emplace_back(in.a_scaling); @@ -290,10 +274,6 @@ void UltraCircuitBuilder_::create_balanced_add_gate(const add_q { this->assert_valid_variables({ in.a, in.b, in.c, in.d }); - // blocks.main.w_l().emplace_back(in.a); - // blocks.main.w_r().emplace_back(in.b); - // blocks.main.w_o().emplace_back(in.c); - // blocks.main.w_4().emplace_back(in.d); blocks.main.populate_wires(in.a, in.b, in.c, in.d); blocks.main.q_m().emplace_back(0); blocks.main.q_1().emplace_back(in.a_scaling); @@ -336,10 +316,6 @@ void UltraCircuitBuilder_::create_mul_gate(const mul_triple_assert_valid_variables({ in.a, in.b, in.c }); - // blocks.main.w_l().emplace_back(in.a); - // blocks.main.w_r().emplace_back(in.b); - // blocks.main.w_o().emplace_back(in.c); - // blocks.main.w_4().emplace_back(this->zero_idx); blocks.main.populate_wires(in.a, in.b, in.c, this->zero_idx); blocks.main.q_m().emplace_back(in.mul_scaling); blocks.main.q_1().emplace_back(0); @@ -368,10 +344,6 @@ void UltraCircuitBuilder_::create_bool_gate(const uint32_t vari { this->assert_valid_variables({ variable_index }); - // blocks.main.w_l().emplace_back(variable_index); - // blocks.main.w_r().emplace_back(variable_index); - // blocks.main.w_o().emplace_back(this->zero_idx); - // blocks.main.w_4().emplace_back(this->zero_idx); blocks.main.populate_wires(variable_index, variable_index, this->zero_idx, this->zero_idx); blocks.main.q_m().emplace_back(1); blocks.main.q_1().emplace_back(-1); @@ -403,10 +375,6 @@ void UltraCircuitBuilder_::create_poly_gate(const poly_triple_< { this->assert_valid_variables({ in.a, in.b, in.c }); - // blocks.main.w_l().emplace_back(in.a); - // blocks.main.w_r().emplace_back(in.b); - // blocks.main.w_o().emplace_back(in.c); - // blocks.main.w_4().emplace_back(this->zero_idx); blocks.main.populate_wires(in.a, in.b, in.c, this->zero_idx); blocks.main.q_m().emplace_back(in.q_m); blocks.main.q_1().emplace_back(in.q_l); @@ -592,10 +560,6 @@ void UltraCircuitBuilder_::fix_witness(const uint32_t witness_i { this->assert_valid_variables({ witness_index }); - // blocks.main.w_l().emplace_back(witness_index); - // blocks.main.w_r().emplace_back(this->zero_idx); - // blocks.main.w_o().emplace_back(this->zero_idx); - // blocks.main.w_4().emplace_back(this->zero_idx); blocks.main.populate_wires(witness_index, this->zero_idx, this->zero_idx, this->zero_idx); blocks.main.q_m().emplace_back(0); blocks.main.q_1().emplace_back(1); @@ -673,10 +637,6 @@ plookup::ReadData UltraCircuitBuilder_::create_gates_ blocks.main.q_lookup_type().emplace_back(FF(1)); blocks.main.q_3().emplace_back(FF(table.table_index)); - // blocks.main.w_l().emplace_back(first_idx); - // blocks.main.w_r().emplace_back(second_idx); - // blocks.main.w_o().emplace_back(third_idx); - // blocks.main.w_4().emplace_back(this->zero_idx); blocks.main.populate_wires(first_idx, second_idx, third_idx, this->zero_idx); blocks.main.q_1().emplace_back(0); blocks.main.q_2().emplace_back((i == (num_lookups - 1) ? 0 : -multi_table.column_1_step_sizes[i + 1])); @@ -982,11 +942,6 @@ void UltraCircuitBuilder_::create_sort_constraint(const std::ve this->assert_valid_variables(variable_index); for (size_t i = 0; i < variable_index.size(); i += gate_width) { - - // blocks.main.w_l().emplace_back(variable_index[i]); - // blocks.main.w_r().emplace_back(variable_index[i + 1]); - // blocks.main.w_o().emplace_back(variable_index[i + 2]); - // blocks.main.w_4().emplace_back(variable_index[i + 3]); blocks.main.populate_wires(variable_index[i], variable_index[i+1], variable_index[i+2], variable_index[i+3]); ++this->num_gates; @@ -1007,10 +962,6 @@ void UltraCircuitBuilder_::create_sort_constraint(const std::ve check_selector_length_consistency(); } // dummy gate needed because of sort widget's check of next row - // blocks.main.w_l().emplace_back(variable_index[variable_index.size() - 1]); - // blocks.main.w_r().emplace_back(this->zero_idx); - // blocks.main.w_o().emplace_back(this->zero_idx); - // blocks.main.w_4().emplace_back(this->zero_idx); blocks.main.populate_wires(variable_index[variable_index.size() - 1], this->zero_idx, this->zero_idx, this->zero_idx); ++this->num_gates; blocks.main.q_m().emplace_back(0); @@ -1045,10 +996,6 @@ void UltraCircuitBuilder_::create_dummy_constraints(const std:: this->assert_valid_variables(padded_list); for (size_t i = 0; i < padded_list.size(); i += gate_width) { - // blocks.main.w_l().emplace_back(padded_list[i]); - // blocks.main.w_r().emplace_back(padded_list[i + 1]); - // blocks.main.w_o().emplace_back(padded_list[i + 2]); - // blocks.main.w_4().emplace_back(padded_list[i + 3]); blocks.main.populate_wires(padded_list[i], padded_list[i+1], padded_list[i+2], padded_list[i+3]); ++this->num_gates; blocks.main.q_m().emplace_back(0); @@ -1080,10 +1027,6 @@ void UltraCircuitBuilder_::create_sort_constraint_with_edges( this->assert_valid_variables(variable_index); // enforce range checks of first row and starting at start - // blocks.main.w_l().emplace_back(variable_index[0]); - // blocks.main.w_r().emplace_back(variable_index[1]); - // blocks.main.w_o().emplace_back(variable_index[2]); - // blocks.main.w_4().emplace_back(variable_index[3]); blocks.main.populate_wires(variable_index[0], variable_index[1], variable_index[2], variable_index[3]); ++this->num_gates; blocks.main.q_m().emplace_back(0); @@ -1104,10 +1047,6 @@ void UltraCircuitBuilder_::create_sort_constraint_with_edges( // enforce range check for middle rows for (size_t i = gate_width; i < variable_index.size() - gate_width; i += gate_width) { - // blocks.main.w_l().emplace_back(variable_index[i]); - // blocks.main.w_r().emplace_back(variable_index[i + 1]); - // blocks.main.w_o().emplace_back(variable_index[i + 2]); - // blocks.main.w_4().emplace_back(variable_index[i + 3]); blocks.main.populate_wires(variable_index[i], variable_index[i + 1], variable_index[i+2], variable_index[i+3]); ++this->num_gates; blocks.main.q_m().emplace_back(0); @@ -1128,10 +1067,6 @@ void UltraCircuitBuilder_::create_sort_constraint_with_edges( } // enforce range checks of last row and ending at end if (variable_index.size() > gate_width) { - // blocks.main.w_l().emplace_back(variable_index[variable_index.size() - 4]); - // blocks.main.w_r().emplace_back(variable_index[variable_index.size() - 3]); - // blocks.main.w_o().emplace_back(variable_index[variable_index.size() - 2]); - // blocks.main.w_4().emplace_back(variable_index[variable_index.size() - 1]); blocks.main.populate_wires(variable_index[variable_index.size() - 4], variable_index[variable_index.size() - 3], variable_index[variable_index.size() - 2], variable_index[variable_index.size() - 1]); ++this->num_gates; blocks.main.q_m().emplace_back(0); @@ -1153,10 +1088,6 @@ void UltraCircuitBuilder_::create_sort_constraint_with_edges( // dummy gate needed because of sort widget's check of next row // use this gate to check end condition - // blocks.main.w_l().emplace_back(variable_index[variable_index.size() - 1]); - // blocks.main.w_r().emplace_back(this->zero_idx); - // blocks.main.w_o().emplace_back(this->zero_idx); - // blocks.main.w_4().emplace_back(this->zero_idx); blocks.main.populate_wires(variable_index[variable_index.size() - 1], this->zero_idx, this->zero_idx, this->zero_idx); ++this->num_gates; blocks.main.q_m().emplace_back(0); @@ -1532,27 +1463,10 @@ void UltraCircuitBuilder_::range_constrain_two_limbs(const uint const std::array lo_sublimbs = get_sublimbs(lo_idx, lo_masks); const std::array hi_sublimbs = get_sublimbs(hi_idx, hi_masks); - // blocks.main.w_l().emplace_back(lo_sublimbs[0]); - // blocks.main.w_r().emplace_back(lo_sublimbs[1]); - // blocks.main.w_o().emplace_back(lo_sublimbs[2]); - // blocks.main.w_4().emplace_back(lo_idx); blocks.main.populate_wires(lo_sublimbs[0], lo_sublimbs[1], lo_sublimbs[2], lo_idx); - - - // blocks.main.w_l().emplace_back(lo_sublimbs[3]); - // blocks.main.w_r().emplace_back(lo_sublimbs[4]); - // blocks.main.w_o().emplace_back(hi_sublimbs[0]); - // blocks.main.w_4().emplace_back(hi_sublimbs[1]); blocks.main.populate_wires(lo_sublimbs[3], lo_sublimbs[4], hi_sublimbs[0], hi_sublimbs[1]); - - - // blocks.main.w_l().emplace_back(hi_sublimbs[2]); - // blocks.main.w_r().emplace_back(hi_sublimbs[3]); - // blocks.main.w_o().emplace_back(hi_sublimbs[4]); - // blocks.main.w_4().emplace_back(hi_idx); blocks.main.populate_wires(hi_sublimbs[2], hi_sublimbs[3], hi_sublimbs[4], hi_idx); - apply_aux_selectors(AUX_SELECTORS::LIMB_ACCUMULATE_1); apply_aux_selectors(AUX_SELECTORS::LIMB_ACCUMULATE_2); apply_aux_selectors(AUX_SELECTORS::NONE); @@ -1711,36 +1625,19 @@ std::array UltraCircuitBuilder_::evaluate_non_nati 0 }, true); - // blocks.main.w_l().emplace_back(input.a[1]); - // blocks.main.w_r().emplace_back(input.b[1]); - // blocks.main.w_o().emplace_back(input.r[0]); - // blocks.main.w_4().emplace_back(lo_0_idx); blocks.main.populate_wires(input.a[1], input.b[1], input.r[0], lo_0_idx); - apply_aux_selectors(AUX_SELECTORS::NON_NATIVE_FIELD_1); ++this->num_gates; - // blocks.main.w_l().emplace_back(input.a[0]); - // blocks.main.w_r().emplace_back(input.b[0]); - // blocks.main.w_o().emplace_back(input.a[3]); - // blocks.main.w_4().emplace_back(input.b[3]); - blocks.main.populate_wires(input.a[0], input.b[0], input.a[3], input.b[3]); + blocks.main.populate_wires(input.a[0], input.b[0], input.a[3], input.b[3]); apply_aux_selectors(AUX_SELECTORS::NON_NATIVE_FIELD_2); ++this->num_gates; - // blocks.main.w_l().emplace_back(input.a[2]); - // blocks.main.w_r().emplace_back(input.b[2]); - // blocks.main.w_o().emplace_back(input.r[3]); - // blocks.main.w_4().emplace_back(hi_0_idx); - blocks.main.populate_wires(input.a[2], input.b[2], input.r[3], hi_0_idx); + blocks.main.populate_wires(input.a[2], input.b[2], input.r[3], hi_0_idx); apply_aux_selectors(AUX_SELECTORS::NON_NATIVE_FIELD_3); ++this->num_gates; - // blocks.main.w_l().emplace_back(input.a[1]); - // blocks.main.w_r().emplace_back(input.b[1]); - // blocks.main.w_o().emplace_back(input.r[2]); - // blocks.main.w_4().emplace_back(hi_1_idx); - blocks.main.populate_wires(input.a[1], input.b[1], input.r[2], hi_1_idx); + blocks.main.populate_wires(input.a[1], input.b[1], input.r[2], hi_1_idx); apply_aux_selectors(AUX_SELECTORS::NONE); ++this->num_gates; @@ -1812,14 +1709,11 @@ void UltraCircuitBuilder_::process_non_native_field_multiplicat apply_aux_selectors(AUX_SELECTORS::NON_NATIVE_FIELD_1); ++this->num_gates; - // blocks.main.w_l().emplace_back(input.a[0]); - // blocks.main.w_r().emplace_back(input.b[0]); - // blocks.main.w_o().emplace_back(input.a[3]); - // blocks.main.w_4().emplace_back(input.b[3]); - blocks.main.populate_wires(input.a[0], input.b[0], input.a[3], input.b[3]); + blocks.main.populate_wires(input.a[0], input.b[0], input.a[3], input.b[3]); apply_aux_selectors(AUX_SELECTORS::NON_NATIVE_FIELD_2); ++this->num_gates; + blocks.main.w_l().emplace_back(input.a[2]); blocks.main.w_r().emplace_back(input.b[2]); blocks.main.w_o().emplace_back(this->zero_idx); @@ -1954,36 +1848,17 @@ std::array UltraCircuitBuilder_::evaluate_non_nati * By setting `q_arith` to `3`, we can validate `x_p + y_p + q_m = z_p` **/ // GATE 1 - // blocks.main.w_l().emplace_back(y_p); - // blocks.main.w_r().emplace_back(x_0); - // blocks.main.w_o().emplace_back(y_0); - // blocks.main.w_4().emplace_back(x_p); - blocks.main.populate_wires(y_p, x_0, y_0, x_p); // | 1 | 2 | 3 | 4 | // |-----|-----|-----|-----| // | y.p | x.0 | y.0 | z.p | (b.p + b.p - c.p = 0) AND (a.0 + b.0 - c.0 = 0) // | x.p | x.1 | y.1 | z.0 | (a.1 + b.1 - c.1 = 0) // | x.2 | y.2 | z.2 | z.1 | (a.2 + b.2 - c.2 = 0) // | x.3 | y.3 | z.3 | --- | (a.3 + b.3 - c.3 = 0) - // blocks.main.w_l().emplace_back(z_p); - // blocks.main.w_r().emplace_back(x_1); - // blocks.main.w_o().emplace_back(y_1); // | 1 | 2 | 3 | 4 | - // blocks.main.w_4().emplace_back(z_0); // |-----|-----|-----|-----| + blocks.main.populate_wires(y_p, x_0, y_0, x_p); blocks.main.populate_wires(z_p, x_1, y_1, z_0); - - // blocks.main.w_l().emplace_back(x_2); // | y.p | x.0 | y.0 | z.p | (b.p + b.p - c.p = 0) AND (a.0 + b.0 - c.0 = 0) - // blocks.main.w_r().emplace_back(y_2); // | x.p | x.1 | y.1 | z.0 | (a.1 + b.1 - c.1 = 0) - // blocks.main.w_o().emplace_back(z_2); // | x.2 | y.2 | z.2 | z.1 | (a.2 + b.2 - c.2 = 0) - // blocks.main.w_4().emplace_back(z_1); // | x.3 | y.3 | z.3 | --- | (a.3 + b.3 - c.3 = 0) blocks.main.populate_wires(x_2, y_2, z_2, z_1); - - // blocks.main.w_l().emplace_back(x_3); - // blocks.main.w_r().emplace_back(y_3); - // blocks.main.w_o().emplace_back(z_3); - // blocks.main.w_4().emplace_back(this->zero_idx); blocks.main.populate_wires(x_3, y_3, z_3, this->zero_idx); - blocks.main.q_m().emplace_back(addconstp); blocks.main.q_1().emplace_back(0); blocks.main.q_2().emplace_back( @@ -2100,28 +1975,9 @@ std::array UltraCircuitBuilder_::evaluate_non_nati // | x.p | x.1 | y.1 | z.0 | (a.1 - b.1 - c.1 = 0) // | x.2 | y.2 | z.2 | z.1 | (a.2 - b.2 - c.2 = 0) // | x.3 | y.3 | z.3 | --- | (a.3 - b.3 - c.3 = 0) - // blocks.main.w_l().emplace_back(y_p); - // blocks.main.w_r().emplace_back(x_0); - // blocks.main.w_o().emplace_back(y_0); - // blocks.main.w_4().emplace_back(z_p); blocks.main.populate_wires(y_p, x_0, y_0, z_p); - - // blocks.main.w_l().emplace_back(x_p); - // blocks.main.w_r().emplace_back(x_1); - // blocks.main.w_o().emplace_back(y_1); // | 1 | 2 | 3 | 4 | - // blocks.main.w_4().emplace_back(z_0); // |-----|-----|-----|-----| blocks.main.populate_wires(x_p, x_1, y_1, z_0); - - // blocks.main.w_l().emplace_back(x_2); // | y.p | x.0 | y.0 | z.p | (b.p + c.p - a.p = 0) AND (a.0 - b.0 - c.0 = 0) - // blocks.main.w_r().emplace_back(y_2); // | x.p | x.1 | y.1 | z.0 | (a.1 - b.1 - c.1 = 0) - // blocks.main.w_o().emplace_back(z_2); // | x.2 | y.2 | z.2 | z.1 | (a.2 - b.2 - c.2 = 0) - // blocks.main.w_4().emplace_back(z_1); // | x.3 | y.3 | z.3 | --- | (a.3 - b.3 - c.3 = 0) blocks.main.populate_wires(x_2, y_2, z_2, z_1); - - // blocks.main.w_l().emplace_back(x_3); - // blocks.main.w_r().emplace_back(y_3); - // blocks.main.w_o().emplace_back(z_3); - // blocks.main.w_4().emplace_back(this->zero_idx); blocks.main.populate_wires(x_3, y_3, z_3, this->zero_idx); blocks.main.q_m().emplace_back(-addconstp); @@ -2186,10 +2042,6 @@ template void UltraCircuitBuilder_:: // Record wire value can't yet be computed record.record_witness = this->add_variable(0); apply_aux_selectors(AUX_SELECTORS::ROM_READ); - // blocks.main.w_l().emplace_back(record.index_witness); - // blocks.main.w_r().emplace_back(record.value_column1_witness); - // blocks.main.w_o().emplace_back(record.value_column2_witness); - // blocks.main.w_4().emplace_back(record.record_witness); blocks.main.populate_wires(record.index_witness, record.value_column1_witness, record.value_column2_witness, record.record_witness); record.gate_index = this->num_gates; @@ -2208,10 +2060,6 @@ void UltraCircuitBuilder_::create_sorted_ROM_gate(RomRecord& re { record.record_witness = this->add_variable(0); apply_aux_selectors(AUX_SELECTORS::ROM_CONSISTENCY_CHECK); - // blocks.main.w_l().emplace_back(record.index_witness); - // blocks.main.w_r().emplace_back(record.value_column1_witness); - // blocks.main.w_o().emplace_back(record.value_column2_witness); - // blocks.main.w_4().emplace_back(record.record_witness); blocks.main.populate_wires(record.index_witness, record.value_column1_witness, record.value_column2_witness, record.record_witness); record.gate_index = this->num_gates; @@ -2256,10 +2104,6 @@ template void UltraCircuitBuilder_:: record.record_witness = this->add_variable(0); apply_aux_selectors(record.access_type == RamRecord::AccessType::READ ? AUX_SELECTORS::RAM_READ : AUX_SELECTORS::RAM_WRITE); - // blocks.main.w_l().emplace_back(record.index_witness); - // blocks.main.w_r().emplace_back(record.timestamp_witness); - // blocks.main.w_o().emplace_back(record.value_witness); - // blocks.main.w_4().emplace_back(record.record_witness); blocks.main.populate_wires(record.index_witness, record.timestamp_witness, record.value_witness, record.record_witness); record.gate_index = this->num_gates; @@ -2279,10 +2123,6 @@ void UltraCircuitBuilder_::create_sorted_RAM_gate(RamRecord& re { record.record_witness = this->add_variable(0); apply_aux_selectors(AUX_SELECTORS::RAM_CONSISTENCY_CHECK); - // blocks.main.w_l().emplace_back(record.index_witness); - // blocks.main.w_r().emplace_back(record.timestamp_witness); - // blocks.main.w_o().emplace_back(record.value_witness); - // blocks.main.w_4().emplace_back(record.record_witness); blocks.main.populate_wires(record.index_witness, record.timestamp_witness, record.value_witness, record.record_witness); record.gate_index = this->num_gates; @@ -2776,10 +2616,6 @@ template void UltraCircuitBuilder_:: uint32_t timestamp_delta_witness = this->add_variable(timestamp_delta); apply_aux_selectors(AUX_SELECTORS::RAM_TIMESTAMP_CHECK); - // blocks.main.w_l().emplace_back(current.index_witness); - // blocks.main.w_r().emplace_back(current.timestamp_witness); - // blocks.main.w_o().emplace_back(timestamp_delta_witness); - // blocks.main.w_4().emplace_back(this->zero_idx); blocks.main.populate_wires(current.index_witness, current.timestamp_witness, timestamp_delta_witness, this->zero_idx); ++this->num_gates; From a19b7761e707584d4a515197d9014fa9a56f8aa6 Mon Sep 17 00:00:00 2001 From: ledwards2225 Date: Sat, 24 Feb 2024 17:14:37 +0000 Subject: [PATCH 15/28] builder copy constructor and == --- .../arithmetization/arithmetization.hpp | 42 ++++++++ .../circuit_builder/circuit_builder_base.hpp | 2 + .../circuit_builder/ultra_circuit_builder.hpp | 97 ++----------------- .../ultra_circuit_builder.test.cpp | 3 + .../proof_system/plookup_tables/types.hpp | 5 + 5 files changed, 59 insertions(+), 90 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/proof_system/arithmetization/arithmetization.hpp b/barretenberg/cpp/src/barretenberg/proof_system/arithmetization/arithmetization.hpp index 716adc1e034..3f2fba239d5 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/arithmetization/arithmetization.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/arithmetization/arithmetization.hpp @@ -49,6 +49,8 @@ template class StandardArith { Selectors selectors; bool is_public_input = false; + bool operator==(const ExecutionTraceBlock& other) const = default; + // WORKTODO: would be nice to do this instead of getters but we lose convenience of block.wires // WireType w_l; // WireType w_r; @@ -80,6 +82,16 @@ template class StandardArith { p.reserve(size_hint); } } + + void resize(size_t size_hint) + { + for (auto& w : wires) { + w.resize(size_hint); + } + for (auto& p : selectors) { + p.resize(size_hint); + } + } }; struct TraceBlocks { @@ -87,6 +99,8 @@ template class StandardArith { ExecutionTraceBlock arithmetic; auto get() { return RefArray{ pub_inputs, arithmetic }; } + + bool operator==(const TraceBlocks& other) const = default; }; // Note: These are needed for Plonk only (for poly storage in a std::map). Must be in same order as above struct. @@ -108,6 +122,8 @@ template class UltraArith { Selectors selectors; bool is_public_input = false; + bool operator==(const ExecutionTraceBlock& other) const = default; + void populate_wires(const uint32_t& idx_1, const uint32_t& idx_2, const uint32_t& idx_3, const uint32_t& idx_4) { wires[0].emplace_back(idx_1); @@ -159,6 +175,16 @@ template class UltraArith { p.reserve(size_hint); } } + + void resize(size_t size_hint) + { + for (auto& w : wires) { + w.resize(size_hint); + } + for (auto& p : selectors) { + p.resize(size_hint); + } + } }; struct TraceBlocks { @@ -166,6 +192,8 @@ template class UltraArith { ExecutionTraceBlock main; auto get() { return RefArray{ pub_inputs, main }; } + + bool operator==(const TraceBlocks& other) const = default; }; // Note: These are needed for Plonk only (for poly storage in a std::map). Must be in same order as above struct. @@ -195,6 +223,8 @@ template class UltraHonkArith { Selectors selectors; bool is_public_input = false; + bool operator==(const ExecutionTraceBlock& other) const = default; + void populate_wires(const uint32_t& idx_1, const uint32_t& idx_2, const uint32_t& idx_3, const uint32_t& idx_4) { wires[0].emplace_back(idx_1); @@ -253,6 +283,16 @@ template class UltraHonkArith { } } + void resize(size_t size_hint) + { + for (auto& w : wires) { + w.resize(size_hint); + } + for (auto& p : selectors) { + p.resize(size_hint); + } + } + /** * @brief Add zeros to all selectors which are not part of the conventional Ultra arithmetization * @details Facilitates reuse of Ultra gate construction functions in arithmetizations which extend the @@ -286,6 +326,8 @@ template class UltraHonkArith { ExecutionTraceBlock main; auto get() { return RefArray{ ecc_op, pub_inputs, main }; } + + bool operator==(const TraceBlocks& other) const = default; }; // Note: Unused. Needed only for consistency with Ultra arith (which is used by Plonk) diff --git a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/circuit_builder_base.hpp b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/circuit_builder_base.hpp index 5231f1cad23..b4b188ee856 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/circuit_builder_base.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/circuit_builder_base.hpp @@ -67,6 +67,8 @@ template class CircuitBuilderBase { CircuitBuilderBase& operator=(CircuitBuilderBase&& other) noexcept = default; virtual ~CircuitBuilderBase() = default; + bool operator==(const CircuitBuilderBase& other) const = default; + virtual size_t get_num_gates() const { return num_gates; } virtual void print_num_gates() const { std::cout << num_gates << std::endl; } virtual size_t get_num_variables() const { return variables.size(); } diff --git a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.hpp b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.hpp index ffe9c7b0186..6eaef4d4a7b 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.hpp @@ -280,8 +280,8 @@ class UltraCircuitBuilder_ : public CircuitBuilderBase>; - using SelectorVector = std::vector>; + using GateBlocks = typename Arithmetization::TraceBlocks; + GateBlocks blocks; std::vector public_inputs; std::vector variables; @@ -293,21 +293,6 @@ class UltraCircuitBuilder_ : public CircuitBuilderBase real_variable_index; std::vector real_variable_tags; std::map constant_variable_indices; - WireVector w_l; - WireVector w_r; - WireVector w_o; - WireVector w_4; - SelectorVector q_m; - SelectorVector q_c; - SelectorVector q_1; - SelectorVector q_2; - SelectorVector q_3; - SelectorVector q_4; - SelectorVector q_arith; - SelectorVector q_sort; - SelectorVector q_elliptic; - SelectorVector q_aux; - SelectorVector q_lookup_type; uint32_t current_tag = DUMMY_TAG; std::map tau; @@ -345,21 +330,7 @@ class UltraCircuitBuilder_ : public CircuitBuilderBasecircuit_finalized = circuit_finalized; builder->num_gates = num_gates; builder->cached_partial_non_native_field_multiplications = cached_partial_non_native_field_multiplications; - builder->blocks.main.w_l().resize(num_gates); - builder->blocks.main.w_r().resize(num_gates); - builder->blocks.main.w_o().resize(num_gates); - builder->blocks.main.w_4().resize(num_gates); - builder->blocks.main.q_m().resize(num_gates); - builder->blocks.main.q_c().resize(num_gates); - builder->blocks.main.q_1().resize(num_gates); - builder->blocks.main.q_2().resize(num_gates); - builder->blocks.main.q_3().resize(num_gates); - builder->blocks.main.q_4().resize(num_gates); - builder->blocks.main.q_arith().resize(num_gates); - builder->blocks.main.q_sort().resize(num_gates); - builder->blocks.main.q_elliptic().resize(num_gates); - builder->blocks.main.q_aux().resize(num_gates); - builder->blocks.main.q_lookup_type().resize(num_gates); + builder->blocks.main.resize(num_gates); if constexpr (HasAdditionalSelectors) { builder->blocks.main.resize_additional(num_gates); } @@ -493,49 +450,7 @@ class UltraCircuitBuilder_ : public CircuitBuilderBase key{ 0, 0 }; std::array value{ bb::fr(0), bb::fr(0) }; bool operator<(const KeyEntry& other) const @@ -296,6 +299,8 @@ struct BasicTable { std::vector lookup_gates; std::array (*get_values_from_key)(const std::array); + + bool operator==(const BasicTable& other) const = default; }; enum ColumnIdx { C1, C2, C3 }; From c63bb13be084a0fb9314e45b448257137a20d8bb Mon Sep 17 00:00:00 2001 From: ledwards2225 Date: Sat, 24 Feb 2024 17:50:21 +0000 Subject: [PATCH 16/28] remove unneeded circuit data backup logic --- .../circuit_builder/ultra_circuit_builder.cpp | 14 +- .../circuit_builder/ultra_circuit_builder.hpp | 217 ------------------ .../ultra_circuit_builder.test.cpp | 43 ++-- .../ultra_honk/ultra_composer.test.cpp | 2 + 4 files changed, 38 insertions(+), 238 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.cpp b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.cpp index af2fb64880f..7a47596de43 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.cpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.cpp @@ -3207,6 +3207,9 @@ inline typename Arithmetization::FF UltraCircuitBuilder_::compu * * @details The method switches the circuit to the "in-the-head" version, finalizes it, checks gates, lookups and * permutations and then switches it back from the in-the-head version, discarding the updates + * @note We want to check that the whole circuit works, but ultra circuits need to have ram, rom and range gates added in the end for the check to be complete as + * well as the set permutation check, so we finalize the circuit when we check it. This structure allows us to + * restore the circuit to the state before the finalization. * * @return true * @return false @@ -3214,9 +3217,11 @@ inline typename Arithmetization::FF UltraCircuitBuilder_::compu template bool UltraCircuitBuilder_::check_circuit() { bool result = true; - CircuitDataBackup circuit_backup = CircuitDataBackup::store_prefinilized_state(this); - // Finalize circuit-in-the-head + // Copy prefinalized circuit so that original circuit can be restored prior to return + UltraCircuitBuilder_ prefinalized_circuit = *this; + + // Finalize the circuit finalize_circuit(); // Sample randomness @@ -3468,7 +3473,10 @@ template bool UltraCircuitBuilder_:: result = false; } - circuit_backup.restore_prefinilized_state(this); + + // Restore the circuit to its pre-finalized state + *this = prefinalized_circuit; + return result; } template class UltraCircuitBuilder_>; diff --git a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.hpp b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.hpp index 6eaef4d4a7b..5ac02bbb0bf 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.hpp @@ -271,223 +271,6 @@ class UltraCircuitBuilder_ : public CircuitBuilderBase public_inputs; - std::vector variables; - // index of next variable in equivalence class (=REAL_VARIABLE if you're last) - std::vector next_var_index; - // index of previous variable in equivalence class (=FIRST if you're in a cycle alone) - std::vector prev_var_index; - // indices of corresponding real variables - std::vector real_variable_index; - std::vector real_variable_tags; - std::map constant_variable_indices; - uint32_t current_tag = DUMMY_TAG; - std::map tau; - - std::vector ram_arrays; - std::vector rom_arrays; - - std::vector memory_read_records; - std::vector memory_write_records; - std::map range_lists; - - std::vector - cached_partial_non_native_field_multiplications; - - size_t num_gates; - bool circuit_finalized = false; - /** - * @brief Stores the state of everything logic-related in the builder. - * - * @details We need this function for tests. Specifically, to ensure that we are not changing anything in - * check_circuit - * - * @param builder - * @return CircuitDataBackup - */ - template static CircuitDataBackup store_full_state(const CircuitBuilder& builder) - { - CircuitDataBackup stored_state; - stored_state.public_inputs = builder.public_inputs; - stored_state.variables = builder.variables; - - stored_state.next_var_index = builder.next_var_index; - - stored_state.prev_var_index = builder.prev_var_index; - - stored_state.real_variable_index = builder.real_variable_index; - stored_state.real_variable_tags = builder.real_variable_tags; - stored_state.constant_variable_indices = builder.constant_variable_indices; - stored_state.blocks = builder.blocks; - stored_state.current_tag = builder.current_tag; - stored_state.tau = builder.tau; - - stored_state.ram_arrays = builder.ram_arrays; - stored_state.rom_arrays = builder.rom_arrays; - - stored_state.memory_read_records = builder.memory_read_records; - stored_state.memory_write_records = builder.memory_write_records; - stored_state.range_lists = builder.range_lists; - stored_state.circuit_finalized = builder.circuit_finalized; - stored_state.num_gates = builder.num_gates; - stored_state.cached_partial_non_native_field_multiplications = - builder.cached_partial_non_native_field_multiplications; - return stored_state; - } - - /** - * @brief Stores the state of all members of the circuit constructor that are needed to restore the state - * after finalizing the circuit. - * - * @param builder - * @return CircuitDataBackup - */ - template - static CircuitDataBackup store_prefinilized_state(const CircuitBuilder* builder) - { - CircuitDataBackup stored_state; - stored_state.public_inputs = builder->public_inputs; - stored_state.variables = builder->variables; - - stored_state.next_var_index = builder->next_var_index; - - stored_state.prev_var_index = builder->prev_var_index; - - stored_state.real_variable_index = builder->real_variable_index; - stored_state.real_variable_tags = builder->real_variable_tags; - stored_state.constant_variable_indices = builder->constant_variable_indices; - stored_state.current_tag = builder->current_tag; - stored_state.tau = builder->tau; - - stored_state.ram_arrays = builder->ram_arrays; - stored_state.rom_arrays = builder->rom_arrays; - - stored_state.memory_read_records = builder->memory_read_records; - stored_state.memory_write_records = builder->memory_write_records; - stored_state.range_lists = builder->range_lists; - stored_state.circuit_finalized = builder->circuit_finalized; - stored_state.num_gates = builder->num_gates; - stored_state.cached_partial_non_native_field_multiplications = - builder->cached_partial_non_native_field_multiplications; - - return stored_state; - } - - /** - * @brief Restores circuit constructor to a prefinilized state. - * - * @param builder - * @return CircuitDataBackup - */ - template void restore_prefinilized_state(CircuitBuilder* builder) - { - builder->public_inputs = public_inputs; - builder->variables = variables; - - builder->next_var_index = next_var_index; - - builder->prev_var_index = prev_var_index; - - builder->real_variable_index = real_variable_index; - builder->real_variable_tags = real_variable_tags; - builder->constant_variable_indices = constant_variable_indices; - builder->current_tag = current_tag; - builder->tau = tau; - - builder->ram_arrays = ram_arrays; - builder->rom_arrays = rom_arrays; - - builder->memory_read_records = memory_read_records; - builder->memory_write_records = memory_write_records; - builder->range_lists = range_lists; - builder->circuit_finalized = circuit_finalized; - builder->num_gates = num_gates; - builder->cached_partial_non_native_field_multiplications = cached_partial_non_native_field_multiplications; - builder->blocks.main.resize(num_gates); - if constexpr (HasAdditionalSelectors) { - builder->blocks.main.resize_additional(num_gates); - } - } - /** - * @brief Checks that the circuit state is the same as the stored circuit's one - * - * @param builder - * @return true - * @return false - */ - template bool is_same_state(const CircuitBuilder& builder) - { - if (!(public_inputs == builder.public_inputs)) { - return false; - } - if (!(variables == builder.variables)) { - return false; - } - if (!(next_var_index == builder.next_var_index)) { - return false; - } - if (!(prev_var_index == builder.prev_var_index)) { - return false; - } - if (!(real_variable_index == builder.real_variable_index)) { - return false; - } - if (!(real_variable_tags == builder.real_variable_tags)) { - return false; - } - if (!(constant_variable_indices == builder.constant_variable_indices)) { - return false; - } - if (!(blocks == builder.blocks)) { - return false; - } - if (!(current_tag == builder.current_tag)) { - return false; - } - if (!(tau == builder.tau)) { - return false; - } - if (!(ram_arrays == builder.ram_arrays)) { - return false; - } - if (!(rom_arrays == builder.rom_arrays)) { - return false; - } - if (!(memory_read_records == builder.memory_read_records)) { - return false; - } - if (!(memory_write_records == builder.memory_write_records)) { - return false; - } - if (!(range_lists == builder.range_lists)) { - return false; - } - if (!(cached_partial_non_native_field_multiplications == - builder.cached_partial_non_native_field_multiplications)) { - return false; - } - if (!(num_gates == builder.num_gates)) { - return false; - } - if (!(circuit_finalized == builder.circuit_finalized)) { - return false; - } - return true; - } - }; - // Block for all gates GateBlocks blocks; diff --git a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.test.cpp b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.test.cpp index 53b0ef0b7e0..02ddfcd9e9b 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.test.cpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.test.cpp @@ -96,11 +96,13 @@ TEST(ultra_circuit_constructor, create_gates_from_plookup_accumulators) expected_scalar >>= table_bits; } } - auto saved_state = UltraCircuitBuilder::CircuitDataBackup::store_full_state(circuit_builder); + + UltraCircuitBuilder circuit_copy{circuit_builder}; bool result = circuit_builder.check_circuit(); EXPECT_EQ(result, true); - EXPECT_TRUE(saved_state.is_same_state(circuit_builder)); + // Ensure that check_circuit did not alter the circuit + EXPECT_EQ(circuit_copy, circuit_builder); } TEST(ultra_circuit_constructor, base_case) @@ -154,11 +156,12 @@ TEST(ultra_circuit_constructor, test_elliptic_gate) circuit_constructor.create_ecc_add_gate({ x1, y1, x2, y2, x3, y3, 1 }); - auto saved_state = UltraCircuitBuilder::CircuitDataBackup::store_full_state(circuit_constructor); + UltraCircuitBuilder circuit_copy{circuit_constructor}; bool result = circuit_constructor.check_circuit(); EXPECT_EQ(result, true); - EXPECT_TRUE(saved_state.is_same_state(circuit_constructor)); + // Ensure that check_circuit did not alter the circuit + EXPECT_EQ(circuit_copy, circuit_constructor); circuit_constructor.create_ecc_add_gate({ x1 + 1, y1, x2, y2, x3, y3, 1 }); @@ -181,11 +184,12 @@ TEST(ultra_circuit_constructor, test_elliptic_double_gate) circuit_constructor.create_ecc_dbl_gate({ x1, y1, x3, y3 }); - auto saved_state = UltraCircuitBuilder::CircuitDataBackup::store_full_state(circuit_constructor); + UltraCircuitBuilder circuit_copy{circuit_constructor}; bool result = circuit_constructor.check_circuit(); EXPECT_EQ(result, true); - EXPECT_TRUE(saved_state.is_same_state(circuit_constructor)); + // Ensure that check_circuit did not alter the circuit + EXPECT_EQ(circuit_copy, circuit_constructor); } TEST(ultra_circuit_constructor, non_trivial_tag_permutation) @@ -212,11 +216,12 @@ TEST(ultra_circuit_constructor, non_trivial_tag_permutation) circuit_constructor.assign_tag(c_idx, 2); circuit_constructor.assign_tag(d_idx, 2); - auto saved_state = UltraCircuitBuilder::CircuitDataBackup::store_full_state(circuit_constructor); + UltraCircuitBuilder circuit_copy{circuit_constructor}; bool result = circuit_constructor.check_circuit(); EXPECT_EQ(result, true); - EXPECT_TRUE(saved_state.is_same_state(circuit_constructor)); + // Ensure that check_circuit did not alter the circuit + EXPECT_EQ(circuit_copy, circuit_constructor); // Break the tag circuit_constructor.real_variable_tags[circuit_constructor.real_variable_index[a_idx]] = 2; @@ -257,11 +262,12 @@ TEST(ultra_circuit_constructor, non_trivial_tag_permutation_and_cycles) circuit_constructor.create_add_gate( { e_idx, f_idx, circuit_constructor.zero_idx, fr::one(), -fr::one(), fr::zero(), fr::zero() }); - auto saved_state = UltraCircuitBuilder::CircuitDataBackup::store_full_state(circuit_constructor); + UltraCircuitBuilder circuit_copy{circuit_constructor}; bool result = circuit_constructor.check_circuit(); EXPECT_EQ(result, true); - EXPECT_TRUE(saved_state.is_same_state(circuit_constructor)); + // Ensure that check_circuit did not alter the circuit + EXPECT_EQ(circuit_copy, circuit_constructor); // Break the tag circuit_constructor.real_variable_tags[circuit_constructor.real_variable_index[a_idx]] = 2; @@ -281,11 +287,12 @@ TEST(ultra_circuit_constructor, bad_tag_permutation) circuit_constructor.create_add_gate({ a_idx, b_idx, circuit_constructor.zero_idx, 1, 1, 0, 0 }); circuit_constructor.create_add_gate({ c_idx, d_idx, circuit_constructor.zero_idx, 1, 1, 0, -1 }); - auto saved_state = UltraCircuitBuilder::CircuitDataBackup::store_full_state(circuit_constructor); + UltraCircuitBuilder circuit_copy{circuit_constructor}; bool result = circuit_constructor.check_circuit(); EXPECT_EQ(result, true); - EXPECT_TRUE(saved_state.is_same_state(circuit_constructor)); + // Ensure that check_circuit did not alter the circuit + EXPECT_EQ(circuit_copy, circuit_constructor); circuit_constructor.create_tag(1, 2); circuit_constructor.create_tag(2, 1); @@ -654,14 +661,13 @@ TEST(ultra_circuit_constructor, non_native_field_multiplication) const auto [lo_1_idx, hi_1_idx] = circuit_constructor.evaluate_non_native_field_multiplication(inputs); circuit_constructor.range_constrain_two_limbs(lo_1_idx, hi_1_idx, 70, 70); - auto saved_state = UltraCircuitBuilder::CircuitDataBackup::store_full_state(circuit_constructor); - UltraCircuitBuilder builder_copy{circuit_constructor}; + UltraCircuitBuilder circuit_copy{circuit_constructor}; bool result = circuit_constructor.check_circuit(); EXPECT_EQ(result, true); - EXPECT_TRUE(saved_state.is_same_state(circuit_constructor)); - EXPECT_EQ(builder_copy, circuit_constructor); + // Ensure that check_circuit did not alter the circuit + EXPECT_EQ(circuit_copy, circuit_constructor); } TEST(ultra_circuit_constructor, rom) @@ -767,12 +773,13 @@ TEST(ultra_circuit_constructor, ram) }, false); - auto saved_state = UltraCircuitBuilder::CircuitDataBackup::store_full_state(circuit_constructor); + UltraCircuitBuilder circuit_copy{circuit_constructor}; bool result = circuit_constructor.check_circuit(); EXPECT_EQ(result, true); - EXPECT_TRUE(saved_state.is_same_state(circuit_constructor)); + // Ensure that check_circuit did not alter the circuit + EXPECT_EQ(circuit_copy, circuit_constructor); // Test the builder copy constructor for a circuit with RAM gates UltraCircuitBuilder duplicate_circuit_constructor{ circuit_constructor }; diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_composer.test.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_composer.test.cpp index 205a67aad24..5e4c26d33f0 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_composer.test.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_composer.test.cpp @@ -33,6 +33,8 @@ std::vector add_variables(auto& circuit_builder, std::vector v void prove_and_verify(auto& circuit_builder, auto& composer, bool expected_result) { + // WORKTODO: running check_circuit for good meaure to ensure proof doesnt break + EXPECT_EQ(circuit_builder.check_circuit(), expected_result); auto instance = composer.create_instance(circuit_builder); auto prover = composer.create_prover(instance); auto verifier = composer.create_verifier(instance); From 0720c6c398f73a4e8c4dbe766e5b65bac2b25514 Mon Sep 17 00:00:00 2001 From: ledwards2225 Date: Sat, 24 Feb 2024 20:18:16 +0000 Subject: [PATCH 17/28] cleanup and naming --- .../arithmetization/arithmetization.hpp | 41 +------------------ .../execution_trace/execution_trace.cpp | 8 ++-- .../execution_trace/execution_trace.hpp | 7 ++-- 3 files changed, 8 insertions(+), 48 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/proof_system/arithmetization/arithmetization.hpp b/barretenberg/cpp/src/barretenberg/proof_system/arithmetization/arithmetization.hpp index 3f2fba239d5..c86f4e81f3e 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/arithmetization/arithmetization.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/arithmetization/arithmetization.hpp @@ -137,11 +137,6 @@ template class UltraArith { WireType& w_o() { return std::get<2>(wires); }; WireType& w_4() { return std::get<3>(wires); }; - const WireType& w_l() const { return std::get<0>(wires); }; - const WireType& w_r() const { return std::get<1>(wires); }; - const WireType& w_o() const { return std::get<2>(wires); }; - const WireType& w_4() const { return std::get<3>(wires); }; - SelectorType& q_m() { return selectors[0]; }; SelectorType& q_c() { return selectors[1]; }; SelectorType& q_1() { return selectors[2]; }; @@ -154,18 +149,6 @@ template class UltraArith { SelectorType& q_aux() { return selectors[9]; }; SelectorType& q_lookup_type() { return selectors[10]; }; - const SelectorType& q_m() const { return selectors[0]; }; - const SelectorType& q_c() const { return selectors[1]; }; - const SelectorType& q_1() const { return selectors[2]; }; - const SelectorType& q_2() const { return selectors[3]; }; - const SelectorType& q_3() const { return selectors[4]; }; - const SelectorType& q_4() const { return selectors[5]; }; - const SelectorType& q_arith() const { return selectors[6]; }; - const SelectorType& q_sort() const { return selectors[7]; }; - const SelectorType& q_elliptic() const { return selectors[8]; }; - const SelectorType& q_aux() const { return selectors[9]; }; - const SelectorType& q_lookup_type() const { return selectors[10]; }; - void reserve(size_t size_hint) { for (auto& w : wires) { @@ -238,11 +221,6 @@ template class UltraHonkArith { WireType& w_o() { return std::get<2>(wires); }; WireType& w_4() { return std::get<3>(wires); }; - const WireType& w_l() const { return std::get<0>(wires); }; - const WireType& w_r() const { return std::get<1>(wires); }; - const WireType& w_o() const { return std::get<2>(wires); }; - const WireType& w_4() const { return std::get<3>(wires); }; - SelectorType& q_m() { return selectors[0]; }; SelectorType& q_c() { return selectors[1]; }; SelectorType& q_1() { return selectors[2]; }; @@ -255,23 +233,8 @@ template class UltraHonkArith { SelectorType& q_aux() { return selectors[9]; }; SelectorType& q_lookup_type() { return selectors[10]; }; SelectorType& q_busread() { return selectors[11]; }; - SelectorType& q_poseidon2_external() { return this->selectors[12]; }; - SelectorType& q_poseidon2_internal() { return this->selectors[13]; }; - - const SelectorType& q_m() const { return selectors[0]; }; - const SelectorType& q_c() const { return selectors[1]; }; - const SelectorType& q_1() const { return selectors[2]; }; - const SelectorType& q_2() const { return selectors[3]; }; - const SelectorType& q_3() const { return selectors[4]; }; - const SelectorType& q_4() const { return selectors[5]; }; - const SelectorType& q_arith() const { return selectors[6]; }; - const SelectorType& q_sort() const { return selectors[7]; }; - const SelectorType& q_elliptic() const { return selectors[8]; }; - const SelectorType& q_aux() const { return selectors[9]; }; - const SelectorType& q_lookup_type() const { return selectors[10]; }; - const SelectorType& q_busread() const { return selectors[11]; }; - const SelectorType& q_poseidon2_external() const { return this->selectors[12]; }; - const SelectorType& q_poseidon2_internal() const { return this->selectors[13]; }; + SelectorType& q_poseidon2_external() { return selectors[12]; }; + SelectorType& q_poseidon2_internal() { return selectors[13]; }; void reserve(size_t size_hint) { diff --git a/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.cpp b/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.cpp index 20dfcf16743..4175e90c628 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.cpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.cpp @@ -47,10 +47,8 @@ typename ExecutionTrace_::TraceData ExecutionTrace_::construct_t { TraceData trace_data{ dyadic_circuit_size, builder }; - // TODO(https://github.com/AztecProtocol/barretenberg/issues/862): Eventually trace_blocks will be constructed - // directly in the builder, i.e. the gate addition methods will directly populate the wire/selectors in the - // appropriate block. In the mean time we do some inefficient copying etc to construct it here post facto. - create_execution_trace_blocks(builder); + // Complete the public inputs execution trace block from builder.public_inputs + populate_public_inputs_block(builder); uint32_t offset = Flavor::has_zero_row ? 1 : 0; // Offset at which to place each block in the trace polynomials // For each block in the trace, populate wire polys, copy cycles and selector polys @@ -91,7 +89,7 @@ typename ExecutionTrace_::TraceData ExecutionTrace_::construct_t return trace_data; } -template void ExecutionTrace_::create_execution_trace_blocks(Builder& builder) +template void ExecutionTrace_::populate_public_inputs_block(Builder& builder) { // Update the public inputs block for (auto& idx : builder.public_inputs) { diff --git a/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.hpp b/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.hpp index d00500a3b9f..4263fa15fa1 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.hpp @@ -64,13 +64,12 @@ template class ExecutionTrace_ { static TraceData construct_trace_data(Builder& builder, size_t dyadic_circuit_size); /** - * @brief Temporary helper method to construct execution trace blocks from existing builder structures - * @details Eventually the builder will construct blocks directly + * @brief Populate the public inputs block + * @details The first two wires are a copy of the public inputs and the other wires and all selectors are zero * * @param builder - * @return std::vector */ - static void create_execution_trace_blocks(Builder& builder); + static void populate_public_inputs_block(Builder& builder); }; } // namespace bb \ No newline at end of file From 2302323b885fd9d11b0ea5ddecaf11a2ee92eae0 Mon Sep 17 00:00:00 2001 From: ledwards2225 Date: Sat, 24 Feb 2024 21:21:07 +0000 Subject: [PATCH 18/28] inheritize Arith --- .../arithmetization/arithmetization.hpp | 256 +++++++----------- 1 file changed, 102 insertions(+), 154 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/proof_system/arithmetization/arithmetization.hpp b/barretenberg/cpp/src/barretenberg/proof_system/arithmetization/arithmetization.hpp index c86f4e81f3e..20c24592bb7 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/arithmetization/arithmetization.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/arithmetization/arithmetization.hpp @@ -32,25 +32,51 @@ namespace bb { * We should only do this if it becomes necessary or convenient. */ -// These are not magic numbers and they should not be written with global constants. These parameters are not -// accessible through clearly named static class members. -template class StandardArith { +template class ExecutionTraceBlock { public: - static constexpr size_t NUM_WIRES = 3; - static constexpr size_t NUM_SELECTORS = 5; - using FF = FF_; using SelectorType = std::vector>; using WireType = std::vector>; using Selectors = std::array; using Wires = std::array; - struct ExecutionTraceBlock { - Wires wires; - Selectors selectors; - bool is_public_input = false; + Wires wires; // vectors of indices into a witness variables array + Selectors selectors; + bool is_public_input = false; + + bool operator==(const ExecutionTraceBlock& other) const = default; - bool operator==(const ExecutionTraceBlock& other) const = default; + void reserve(size_t size_hint) + { + for (auto& w : wires) { + w.reserve(size_hint); + } + for (auto& p : selectors) { + p.reserve(size_hint); + } + } + + // WORKTODO: maybe dont need this + void resize(size_t size_hint) + { + for (auto& w : wires) { + w.resize(size_hint); + } + for (auto& p : selectors) { + p.resize(size_hint); + } + } +}; +// These are not magic numbers and they should not be written with global constants. These parameters are not +// accessible through clearly named static class members. +template class StandardArith { + public: + static constexpr size_t NUM_WIRES = 3; + static constexpr size_t NUM_SELECTORS = 5; + using FF = FF_; + + class StandardTraceBlock : public ExecutionTraceBlock { + public: // WORKTODO: would be nice to do this instead of getters but we lose convenience of block.wires // WireType w_l; // WireType w_r; @@ -58,45 +84,25 @@ template class StandardArith { void populate_wires(const uint32_t& idx_1, const uint32_t& idx_2, const uint32_t& idx_3) { - wires[0].emplace_back(idx_1); - wires[1].emplace_back(idx_2); - wires[2].emplace_back(idx_3); + this->wires[0].emplace_back(idx_1); + this->wires[1].emplace_back(idx_2); + this->wires[2].emplace_back(idx_3); } - WireType& w_l() { return std::get<0>(wires); }; - WireType& w_r() { return std::get<1>(wires); }; - WireType& w_o() { return std::get<2>(wires); }; - - SelectorType& q_m() { return selectors[0]; }; - SelectorType& q_1() { return selectors[1]; }; - SelectorType& q_2() { return selectors[2]; }; - SelectorType& q_3() { return selectors[3]; }; - SelectorType& q_c() { return selectors[4]; }; - - void reserve(size_t size_hint) - { - for (auto& w : wires) { - w.reserve(size_hint); - } - for (auto& p : selectors) { - p.reserve(size_hint); - } - } + auto& w_l() { return std::get<0>(this->wires); }; + auto& w_r() { return std::get<1>(this->wires); }; + auto& w_o() { return std::get<2>(this->wires); }; - void resize(size_t size_hint) - { - for (auto& w : wires) { - w.resize(size_hint); - } - for (auto& p : selectors) { - p.resize(size_hint); - } - } + auto& q_m() { return this->selectors[0]; }; + auto& q_1() { return this->selectors[1]; }; + auto& q_2() { return this->selectors[2]; }; + auto& q_3() { return this->selectors[3]; }; + auto& q_c() { return this->selectors[4]; }; }; struct TraceBlocks { - ExecutionTraceBlock pub_inputs; - ExecutionTraceBlock arithmetic; + StandardTraceBlock pub_inputs; + StandardTraceBlock arithmetic; auto get() { return RefArray{ pub_inputs, arithmetic }; } @@ -112,67 +118,38 @@ template class UltraArith { static constexpr size_t NUM_WIRES = 4; static constexpr size_t NUM_SELECTORS = 11; using FF = FF_; - using SelectorType = std::vector>; - using WireType = std::vector>; - using Selectors = std::array; - using Wires = std::array; - - struct ExecutionTraceBlock { - Wires wires; - Selectors selectors; - bool is_public_input = false; - - bool operator==(const ExecutionTraceBlock& other) const = default; + class UltraTraceBlock : public ExecutionTraceBlock { + public: void populate_wires(const uint32_t& idx_1, const uint32_t& idx_2, const uint32_t& idx_3, const uint32_t& idx_4) { - wires[0].emplace_back(idx_1); - wires[1].emplace_back(idx_2); - wires[2].emplace_back(idx_3); - wires[3].emplace_back(idx_4); - } - - WireType& w_l() { return std::get<0>(wires); }; - WireType& w_r() { return std::get<1>(wires); }; - WireType& w_o() { return std::get<2>(wires); }; - WireType& w_4() { return std::get<3>(wires); }; - - SelectorType& q_m() { return selectors[0]; }; - SelectorType& q_c() { return selectors[1]; }; - SelectorType& q_1() { return selectors[2]; }; - SelectorType& q_2() { return selectors[3]; }; - SelectorType& q_3() { return selectors[4]; }; - SelectorType& q_4() { return selectors[5]; }; - SelectorType& q_arith() { return selectors[6]; }; - SelectorType& q_sort() { return selectors[7]; }; - SelectorType& q_elliptic() { return selectors[8]; }; - SelectorType& q_aux() { return selectors[9]; }; - SelectorType& q_lookup_type() { return selectors[10]; }; - - void reserve(size_t size_hint) - { - for (auto& w : wires) { - w.reserve(size_hint); - } - for (auto& p : selectors) { - p.reserve(size_hint); - } + this->wires[0].emplace_back(idx_1); + this->wires[1].emplace_back(idx_2); + this->wires[2].emplace_back(idx_3); + this->wires[3].emplace_back(idx_4); } - void resize(size_t size_hint) - { - for (auto& w : wires) { - w.resize(size_hint); - } - for (auto& p : selectors) { - p.resize(size_hint); - } - } + auto& w_l() { return std::get<0>(this->wires); }; + auto& w_r() { return std::get<1>(this->wires); }; + auto& w_o() { return std::get<2>(this->wires); }; + auto& w_4() { return std::get<3>(this->wires); }; + + auto& q_m() { return this->selectors[0]; }; + auto& q_c() { return this->selectors[1]; }; + auto& q_1() { return this->selectors[2]; }; + auto& q_2() { return this->selectors[3]; }; + auto& q_3() { return this->selectors[4]; }; + auto& q_4() { return this->selectors[5]; }; + auto& q_arith() { return this->selectors[6]; }; + auto& q_sort() { return this->selectors[7]; }; + auto& q_elliptic() { return this->selectors[8]; }; + auto& q_aux() { return this->selectors[9]; }; + auto& q_lookup_type() { return this->selectors[10]; }; }; struct TraceBlocks { - ExecutionTraceBlock pub_inputs; - ExecutionTraceBlock main; + UltraTraceBlock pub_inputs; + UltraTraceBlock main; auto get() { return RefArray{ pub_inputs, main }; } @@ -196,65 +173,36 @@ template class UltraHonkArith { static constexpr size_t NUM_WIRES = 4; static constexpr size_t NUM_SELECTORS = 14; using FF = FF_; - using SelectorType = std::vector>; - using WireType = std::vector>; - using Selectors = std::array; - using Wires = std::array; - - struct ExecutionTraceBlock { - Wires wires; - Selectors selectors; - bool is_public_input = false; - - bool operator==(const ExecutionTraceBlock& other) const = default; + class UltraHonkTraceBlock : public ExecutionTraceBlock { + public: void populate_wires(const uint32_t& idx_1, const uint32_t& idx_2, const uint32_t& idx_3, const uint32_t& idx_4) { - wires[0].emplace_back(idx_1); - wires[1].emplace_back(idx_2); - wires[2].emplace_back(idx_3); - wires[3].emplace_back(idx_4); - } - - WireType& w_l() { return std::get<0>(wires); }; - WireType& w_r() { return std::get<1>(wires); }; - WireType& w_o() { return std::get<2>(wires); }; - WireType& w_4() { return std::get<3>(wires); }; - - SelectorType& q_m() { return selectors[0]; }; - SelectorType& q_c() { return selectors[1]; }; - SelectorType& q_1() { return selectors[2]; }; - SelectorType& q_2() { return selectors[3]; }; - SelectorType& q_3() { return selectors[4]; }; - SelectorType& q_4() { return selectors[5]; }; - SelectorType& q_arith() { return selectors[6]; }; - SelectorType& q_sort() { return selectors[7]; }; - SelectorType& q_elliptic() { return selectors[8]; }; - SelectorType& q_aux() { return selectors[9]; }; - SelectorType& q_lookup_type() { return selectors[10]; }; - SelectorType& q_busread() { return selectors[11]; }; - SelectorType& q_poseidon2_external() { return selectors[12]; }; - SelectorType& q_poseidon2_internal() { return selectors[13]; }; - - void reserve(size_t size_hint) - { - for (auto& w : wires) { - w.reserve(size_hint); - } - for (auto& p : selectors) { - p.reserve(size_hint); - } + this->wires[0].emplace_back(idx_1); + this->wires[1].emplace_back(idx_2); + this->wires[2].emplace_back(idx_3); + this->wires[3].emplace_back(idx_4); } - void resize(size_t size_hint) - { - for (auto& w : wires) { - w.resize(size_hint); - } - for (auto& p : selectors) { - p.resize(size_hint); - } - } + auto& w_l() { return std::get<0>(this->wires); }; + auto& w_r() { return std::get<1>(this->wires); }; + auto& w_o() { return std::get<2>(this->wires); }; + auto& w_4() { return std::get<3>(this->wires); }; + + auto& q_m() { return this->selectors[0]; }; + auto& q_c() { return this->selectors[1]; }; + auto& q_1() { return this->selectors[2]; }; + auto& q_2() { return this->selectors[3]; }; + auto& q_3() { return this->selectors[4]; }; + auto& q_4() { return this->selectors[5]; }; + auto& q_arith() { return this->selectors[6]; }; + auto& q_sort() { return this->selectors[7]; }; + auto& q_elliptic() { return this->selectors[8]; }; + auto& q_aux() { return this->selectors[9]; }; + auto& q_lookup_type() { return this->selectors[10]; }; + auto& q_busread() { return this->selectors[11]; }; + auto& q_poseidon2_external() { return this->selectors[12]; }; + auto& q_poseidon2_internal() { return this->selectors[13]; }; /** * @brief Add zeros to all selectors which are not part of the conventional Ultra arithmetization @@ -284,9 +232,9 @@ template class UltraHonkArith { }; struct TraceBlocks { - ExecutionTraceBlock ecc_op; - ExecutionTraceBlock pub_inputs; - ExecutionTraceBlock main; + UltraHonkTraceBlock ecc_op; + UltraHonkTraceBlock pub_inputs; + UltraHonkTraceBlock main; auto get() { return RefArray{ ecc_op, pub_inputs, main }; } From c76afae28f7feda78577a1e5cd7a3749bf0cc053 Mon Sep 17 00:00:00 2001 From: ledwards2225 Date: Sat, 24 Feb 2024 21:21:29 +0000 Subject: [PATCH 19/28] WiP move op wire construction to trace --- .../execution_trace/execution_trace.cpp | 35 +++++++++++++++++++ .../execution_trace/execution_trace.hpp | 4 +++ 2 files changed, 39 insertions(+) diff --git a/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.cpp b/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.cpp index 4175e90c628..8fd4f694a7c 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.cpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.cpp @@ -14,6 +14,10 @@ void ExecutionTrace_::generate(Builder& builder, add_wires_and_selectors_to_proving_key(trace_data, builder, proving_key); + // if constexpr(IsGoblinFlavor){ + // add_ecc_op_wires_to_proving_key(trace_data, builder, proving_key); + // } + // Compute the permutation argument polynomials (sigma/id) and add them to proving key compute_permutation_argument_polynomials(builder, proving_key.get(), trace_data.copy_cycles); } @@ -107,6 +111,37 @@ template void ExecutionTrace_::populate_public_inputs_blo builder.blocks.pub_inputs.is_public_input = true; } +template +void ExecutionTrace_::add_ecc_op_wires_to_proving_key( + TraceData& trace_data, Builder& builder, const std::shared_ptr& proving_key) +requires IsGoblinFlavor +{ + std::array op_wire_polynomials; + for (auto& poly : op_wire_polynomials) { + poly = Polynomial{ proving_key->circuit_size }; + } + Polynomial ecc_op_selector{ proving_key->circuit_size }; + + // The ECC op wires are constructed to contain the op data on the appropriate range and to vanish everywhere else. + // The op data is assumed to have already been stored at the correct location in the convetional wires so the data + // can simply be copied over directly. + const size_t op_wire_offset = Flavor::has_zero_row ? 1 : 0; + for (auto [ecc_op_wire, wire] : zip_view(op_wire_polynomials, trace_data.wires)) { + for (size_t i = 0; i < builder.num_ecc_op_gates; ++i) { + size_t idx = i + op_wire_offset; + ecc_op_wire[idx] = wire[idx]; + ecc_op_selector[idx] = 1; + } + } + + proving_key->num_ecc_op_gates = builder.num_ecc_op_gates; + proving_key->ecc_op_wire_1 = op_wire_polynomials[0].share(); + proving_key->ecc_op_wire_2 = op_wire_polynomials[1].share(); + proving_key->ecc_op_wire_3 = op_wire_polynomials[2].share(); + proving_key->ecc_op_wire_4 = op_wire_polynomials[3].share(); + proving_key->lagrange_ecc_op = ecc_op_selector.share(); +} + template class ExecutionTrace_; template class ExecutionTrace_; template class ExecutionTrace_; diff --git a/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.hpp b/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.hpp index 4263fa15fa1..876751adc71 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.hpp @@ -70,6 +70,10 @@ template class ExecutionTrace_ { * @param builder */ static void populate_public_inputs_block(Builder& builder); + + static void add_ecc_op_wires_to_proving_key( + TraceData& trace_data, Builder& builder, const std::shared_ptr& proving_key) + requires IsGoblinFlavor; }; } // namespace bb \ No newline at end of file From 0da188a0cdec8396ab4aa9f2131df1b24da056d2 Mon Sep 17 00:00:00 2001 From: ledwards2225 Date: Sat, 24 Feb 2024 20:26:31 -0600 Subject: [PATCH 20/28] use populate in standard --- .../cpp/src/barretenberg/flavor/flavor.hpp | 4 --- .../arithmetization/arithmetization.hpp | 11 ------ .../standard_circuit_builder.cpp | 34 +++++-------------- 3 files changed, 8 insertions(+), 41 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp b/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp index 4c70c2a4b36..20008d3f67c 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp @@ -283,10 +283,6 @@ namespace bb { */ // clang-format off -// WORKTODO: debug purposes only -template -concept IsStandardFlavor = IsAnyOf; - template concept IsPlonkFlavor = IsAnyOf; diff --git a/barretenberg/cpp/src/barretenberg/proof_system/arithmetization/arithmetization.hpp b/barretenberg/cpp/src/barretenberg/proof_system/arithmetization/arithmetization.hpp index 20c24592bb7..89fdbd20922 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/arithmetization/arithmetization.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/arithmetization/arithmetization.hpp @@ -54,17 +54,6 @@ template class ExecutionTr p.reserve(size_hint); } } - - // WORKTODO: maybe dont need this - void resize(size_t size_hint) - { - for (auto& w : wires) { - w.resize(size_hint); - } - for (auto& p : selectors) { - p.resize(size_hint); - } - } }; // These are not magic numbers and they should not be written with global constants. These parameters are not diff --git a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/standard_circuit_builder.cpp b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/standard_circuit_builder.cpp index e85a7c1199b..a3dcd7213bc 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/standard_circuit_builder.cpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/standard_circuit_builder.cpp @@ -19,9 +19,7 @@ template void StandardCircuitBuilder_::create_add_gate(const a { this->assert_valid_variables({ in.a, in.b, in.c }); - blocks.arithmetic.w_l().emplace_back(in.a); - blocks.arithmetic.w_r().emplace_back(in.b); - blocks.arithmetic.w_o().emplace_back(in.c); + blocks.arithmetic.populate_wires(in.a, in.b, in.c); blocks.arithmetic.q_m().emplace_back(FF::zero()); blocks.arithmetic.q_1().emplace_back(in.a_scaling); blocks.arithmetic.q_2().emplace_back(in.b_scaling); @@ -70,9 +68,7 @@ template void StandardCircuitBuilder_::create_balanced_add_gat FF temp = t0 + t1; uint32_t temp_idx = this->add_variable(temp); - blocks.arithmetic.w_l().emplace_back(in.a); - blocks.arithmetic.w_r().emplace_back(in.b); - blocks.arithmetic.w_o().emplace_back(temp_idx); + blocks.arithmetic.populate_wires(in.a, in.b, temp_idx); blocks.arithmetic.q_m().emplace_back(FF::zero()); blocks.arithmetic.q_1().emplace_back(in.a_scaling); blocks.arithmetic.q_2().emplace_back(in.b_scaling); @@ -81,9 +77,7 @@ template void StandardCircuitBuilder_::create_balanced_add_gat ++this->num_gates; - blocks.arithmetic.w_l().emplace_back(temp_idx); - blocks.arithmetic.w_r().emplace_back(in.c); - blocks.arithmetic.w_o().emplace_back(in.d); + blocks.arithmetic.populate_wires(temp_idx, in.c, in.d); blocks.arithmetic.q_m().emplace_back(FF::zero()); blocks.arithmetic.q_1().emplace_back(FF::one()); blocks.arithmetic.q_2().emplace_back(in.c_scaling); @@ -96,9 +90,7 @@ template void StandardCircuitBuilder_::create_balanced_add_gat // i.e. in.d * (in.d - 1) * (in.d - 2) = 0 FF temp_2 = this->get_variable(in.d).sqr() - this->get_variable(in.d); uint32_t temp_2_idx = this->add_variable(temp_2); - blocks.arithmetic.w_l().emplace_back(in.d); - blocks.arithmetic.w_r().emplace_back(in.d); - blocks.arithmetic.w_o().emplace_back(temp_2_idx); + blocks.arithmetic.populate_wires(in.d, in.d, temp_2_idx); blocks.arithmetic.q_m().emplace_back(FF::one()); blocks.arithmetic.q_1().emplace_back(FF::neg_one()); blocks.arithmetic.q_2().emplace_back(FF::zero()); @@ -108,9 +100,7 @@ template void StandardCircuitBuilder_::create_balanced_add_gat ++this->num_gates; constexpr FF neg_two = -FF(2); - blocks.arithmetic.w_l().emplace_back(temp_2_idx); - blocks.arithmetic.w_r().emplace_back(in.d); - blocks.arithmetic.w_o().emplace_back(this->zero_idx); + blocks.arithmetic.populate_wires(temp_2_idx, in.d, this->zero_idx); blocks.arithmetic.q_m().emplace_back(FF::one()); blocks.arithmetic.q_1().emplace_back(neg_two); blocks.arithmetic.q_2().emplace_back(FF::zero()); @@ -185,9 +175,7 @@ template void StandardCircuitBuilder_::create_mul_gate(const m { this->assert_valid_variables({ in.a, in.b, in.c }); - blocks.arithmetic.w_l().emplace_back(in.a); - blocks.arithmetic.w_r().emplace_back(in.b); - blocks.arithmetic.w_o().emplace_back(in.c); + blocks.arithmetic.populate_wires(in.a, in.b, in.c); blocks.arithmetic.q_m().emplace_back(in.mul_scaling); blocks.arithmetic.q_1().emplace_back(FF::zero()); blocks.arithmetic.q_2().emplace_back(FF::zero()); @@ -207,10 +195,7 @@ template void StandardCircuitBuilder_::create_bool_gate(const { this->assert_valid_variables({ variable_index }); - blocks.arithmetic.w_l().emplace_back(variable_index); - blocks.arithmetic.w_r().emplace_back(variable_index); - blocks.arithmetic.w_o().emplace_back(variable_index); - + blocks.arithmetic.populate_wires(variable_index, variable_index, variable_index); blocks.arithmetic.q_m().emplace_back(FF::one()); blocks.arithmetic.q_1().emplace_back(FF::zero()); blocks.arithmetic.q_2().emplace_back(FF::zero()); @@ -229,7 +214,6 @@ template void StandardCircuitBuilder_::create_poly_gate(const { this->assert_valid_variables({ in.a, in.b, in.c }); - // WORKTODO: use this update_wires method everywhere blocks.arithmetic.populate_wires(in.a, in.b, in.c); blocks.arithmetic.q_m().emplace_back(in.q_m); blocks.arithmetic.q_1().emplace_back(in.q_l); @@ -481,9 +465,7 @@ void StandardCircuitBuilder_::fix_witness(const uint32_t witness_index, cons { this->assert_valid_variables({ witness_index }); - blocks.arithmetic.w_l().emplace_back(witness_index); - blocks.arithmetic.w_r().emplace_back(this->zero_idx); - blocks.arithmetic.w_o().emplace_back(this->zero_idx); + blocks.arithmetic.populate_wires(witness_index, this->zero_idx, this->zero_idx); blocks.arithmetic.q_m().emplace_back(FF::zero()); blocks.arithmetic.q_1().emplace_back(FF::one()); blocks.arithmetic.q_2().emplace_back(FF::zero()); From a4af8d78ea06d5490afba1d69ec5c70504dd64b4 Mon Sep 17 00:00:00 2001 From: ledwards2225 Date: Sat, 24 Feb 2024 23:43:23 -0600 Subject: [PATCH 21/28] cleanup --- .../circuit_builder/ultra_circuit_builder.cpp | 24 ++++--------------- .../stdlib/primitives/field/field.test.cpp | 2 -- 2 files changed, 4 insertions(+), 22 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.cpp b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.cpp index 7a47596de43..6f5fe0058ea 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.cpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.cpp @@ -429,11 +429,7 @@ void UltraCircuitBuilder_::create_ecc_add_gate(const ecc_add_ga blocks.main.q_1()[this->num_gates - 1] = in.sign_coefficient; blocks.main.q_elliptic()[this->num_gates - 1] = 1; } else { - blocks.main.w_l().emplace_back(this->zero_idx); - blocks.main.w_r().emplace_back(in.x1); - blocks.main.w_o().emplace_back(in.y1); - blocks.main.w_4().emplace_back(this->zero_idx); - // blocks.main.populate_wires(this->zero_idx, in.x1, in.y1, this->zero_idx); + blocks.main.populate_wires(this->zero_idx, in.x1, in.y1, this->zero_idx); blocks.main.q_3().emplace_back(0); blocks.main.q_4().emplace_back(0); blocks.main.q_1().emplace_back(in.sign_coefficient); @@ -452,11 +448,7 @@ void UltraCircuitBuilder_::create_ecc_add_gate(const ecc_add_ga check_selector_length_consistency(); ++this->num_gates; } - blocks.main.w_l().emplace_back(in.x2); - blocks.main.w_4().emplace_back(in.y2); - blocks.main.w_r().emplace_back(in.x3); - blocks.main.w_o().emplace_back(in.y3); - // blocks.main.populate_wires(in.x2, in.y2, in.x3, in.y3); + blocks.main.populate_wires(in.x2, in.x3, in.y3, in.y2); blocks.main.q_m().emplace_back(0); blocks.main.q_1().emplace_back(0); blocks.main.q_2().emplace_back(0); @@ -503,11 +495,7 @@ void UltraCircuitBuilder_::create_ecc_dbl_gate(const ecc_dbl_ga blocks.main.q_elliptic()[this->num_gates - 1] = 1; blocks.main.q_m()[this->num_gates - 1] = 1; } else { - blocks.main.w_r().emplace_back(in.x1); - blocks.main.w_o().emplace_back(in.y1); - blocks.main.w_l().emplace_back(this->zero_idx); - blocks.main.w_4().emplace_back(this->zero_idx); - // blocks.main.populate_wires(in.x1, in.y1, this->zero_idx, this->zero_idx); + blocks.main.populate_wires(this->zero_idx, in.x1, in.y1, this->zero_idx); blocks.main.q_elliptic().emplace_back(1); blocks.main.q_m().emplace_back(1); blocks.main.q_1().emplace_back(0); @@ -526,11 +514,7 @@ void UltraCircuitBuilder_::create_ecc_dbl_gate(const ecc_dbl_ga ++this->num_gates; } - blocks.main.w_r().emplace_back(in.x3); - blocks.main.w_o().emplace_back(in.y3); - blocks.main.w_l().emplace_back(this->zero_idx); - blocks.main.w_4().emplace_back(this->zero_idx); - // blocks.main.populate_wires(in.x3, in.y3, this->zero_idx, this->zero_idx); + blocks.main.populate_wires(this->zero_idx, in.x3, in.y3, this->zero_idx); blocks.main.q_m().emplace_back(0); blocks.main.q_1().emplace_back(0); blocks.main.q_2().emplace_back(0); diff --git a/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field.test.cpp b/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field.test.cpp index b5c9ea7ec7e..72606b48e92 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field.test.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field.test.cpp @@ -180,7 +180,6 @@ template class stdlib_field : public testing::Test { auto gates_before = builder.get_num_gates(); fidget(builder); auto gates_after = builder.get_num_gates(); - // EXPECT_EQ(builder.get_variable(builder.w_o()[gates_after - 1]), fr(expected)); info("Number of gates added", gates_after - gates_before); bool result = builder.check_circuit(); EXPECT_EQ(result, true); @@ -254,7 +253,6 @@ template class stdlib_field : public testing::Test { auto gates_before = builder.get_num_gates(); fibbonaci(builder); auto gates_after = builder.get_num_gates(); - // EXPECT_EQ(builder.get_variable(builder.w_l()[builder.get_num_gates() - 1]), fr(4181)); EXPECT_EQ(gates_after - gates_before, 18UL); bool result = builder.check_circuit(); From 018aa1ec92a345cf48dcfff04e9fb73a4274316a Mon Sep 17 00:00:00 2001 From: ledwards2225 Date: Sun, 25 Feb 2024 20:24:49 +0000 Subject: [PATCH 22/28] format --- .../arithmetization/arithmetization.hpp | 4 +- .../circuit_builder/ultra_circuit_builder.cpp | 40 ++++++++++++------- .../ultra_circuit_builder.test.cpp | 16 ++++---- .../execution_trace/execution_trace.cpp | 4 +- .../execution_trace/execution_trace.hpp | 5 ++- 5 files changed, 41 insertions(+), 28 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/proof_system/arithmetization/arithmetization.hpp b/barretenberg/cpp/src/barretenberg/proof_system/arithmetization/arithmetization.hpp index 89fdbd20922..edc4cb43ec9 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/arithmetization/arithmetization.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/arithmetization/arithmetization.hpp @@ -94,7 +94,7 @@ template class StandardArith { StandardTraceBlock arithmetic; auto get() { return RefArray{ pub_inputs, arithmetic }; } - + bool operator==(const TraceBlocks& other) const = default; }; @@ -226,7 +226,7 @@ template class UltraHonkArith { UltraHonkTraceBlock main; auto get() { return RefArray{ ecc_op, pub_inputs, main }; } - + bool operator==(const TraceBlocks& other) const = default; }; diff --git a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.cpp b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.cpp index 6f5fe0058ea..e4e6297d38b 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.cpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.cpp @@ -926,7 +926,8 @@ void UltraCircuitBuilder_::create_sort_constraint(const std::ve this->assert_valid_variables(variable_index); for (size_t i = 0; i < variable_index.size(); i += gate_width) { - blocks.main.populate_wires(variable_index[i], variable_index[i+1], variable_index[i+2], variable_index[i+3]); + blocks.main.populate_wires( + variable_index[i], variable_index[i + 1], variable_index[i + 2], variable_index[i + 3]); ++this->num_gates; blocks.main.q_m().emplace_back(0); @@ -946,7 +947,8 @@ void UltraCircuitBuilder_::create_sort_constraint(const std::ve check_selector_length_consistency(); } // dummy gate needed because of sort widget's check of next row - blocks.main.populate_wires(variable_index[variable_index.size() - 1], this->zero_idx, this->zero_idx, this->zero_idx); + blocks.main.populate_wires( + variable_index[variable_index.size() - 1], this->zero_idx, this->zero_idx, this->zero_idx); ++this->num_gates; blocks.main.q_m().emplace_back(0); blocks.main.q_1().emplace_back(0); @@ -980,7 +982,7 @@ void UltraCircuitBuilder_::create_dummy_constraints(const std:: this->assert_valid_variables(padded_list); for (size_t i = 0; i < padded_list.size(); i += gate_width) { - blocks.main.populate_wires(padded_list[i], padded_list[i+1], padded_list[i+2], padded_list[i+3]); + blocks.main.populate_wires(padded_list[i], padded_list[i + 1], padded_list[i + 2], padded_list[i + 3]); ++this->num_gates; blocks.main.q_m().emplace_back(0); blocks.main.q_1().emplace_back(0); @@ -1031,7 +1033,8 @@ void UltraCircuitBuilder_::create_sort_constraint_with_edges( // enforce range check for middle rows for (size_t i = gate_width; i < variable_index.size() - gate_width; i += gate_width) { - blocks.main.populate_wires(variable_index[i], variable_index[i + 1], variable_index[i+2], variable_index[i+3]); + blocks.main.populate_wires( + variable_index[i], variable_index[i + 1], variable_index[i + 2], variable_index[i + 3]); ++this->num_gates; blocks.main.q_m().emplace_back(0); blocks.main.q_1().emplace_back(0); @@ -1051,7 +1054,10 @@ void UltraCircuitBuilder_::create_sort_constraint_with_edges( } // enforce range checks of last row and ending at end if (variable_index.size() > gate_width) { - blocks.main.populate_wires(variable_index[variable_index.size() - 4], variable_index[variable_index.size() - 3], variable_index[variable_index.size() - 2], variable_index[variable_index.size() - 1]); + blocks.main.populate_wires(variable_index[variable_index.size() - 4], + variable_index[variable_index.size() - 3], + variable_index[variable_index.size() - 2], + variable_index[variable_index.size() - 1]); ++this->num_gates; blocks.main.q_m().emplace_back(0); blocks.main.q_1().emplace_back(0); @@ -1072,7 +1078,8 @@ void UltraCircuitBuilder_::create_sort_constraint_with_edges( // dummy gate needed because of sort widget's check of next row // use this gate to check end condition - blocks.main.populate_wires(variable_index[variable_index.size() - 1], this->zero_idx, this->zero_idx, this->zero_idx); + blocks.main.populate_wires( + variable_index[variable_index.size() - 1], this->zero_idx, this->zero_idx, this->zero_idx); ++this->num_gates; blocks.main.q_m().emplace_back(0); blocks.main.q_1().emplace_back(1); @@ -2026,7 +2033,8 @@ template void UltraCircuitBuilder_:: // Record wire value can't yet be computed record.record_witness = this->add_variable(0); apply_aux_selectors(AUX_SELECTORS::ROM_READ); - blocks.main.populate_wires(record.index_witness, record.value_column1_witness, record.value_column2_witness, record.record_witness); + blocks.main.populate_wires( + record.index_witness, record.value_column1_witness, record.value_column2_witness, record.record_witness); record.gate_index = this->num_gates; ++this->num_gates; @@ -2044,7 +2052,8 @@ void UltraCircuitBuilder_::create_sorted_ROM_gate(RomRecord& re { record.record_witness = this->add_variable(0); apply_aux_selectors(AUX_SELECTORS::ROM_CONSISTENCY_CHECK); - blocks.main.populate_wires(record.index_witness, record.value_column1_witness, record.value_column2_witness, record.record_witness); + blocks.main.populate_wires( + record.index_witness, record.value_column1_witness, record.value_column2_witness, record.record_witness); record.gate_index = this->num_gates; ++this->num_gates; @@ -2088,7 +2097,8 @@ template void UltraCircuitBuilder_:: record.record_witness = this->add_variable(0); apply_aux_selectors(record.access_type == RamRecord::AccessType::READ ? AUX_SELECTORS::RAM_READ : AUX_SELECTORS::RAM_WRITE); - blocks.main.populate_wires(record.index_witness, record.timestamp_witness, record.value_witness, record.record_witness); + blocks.main.populate_wires( + record.index_witness, record.timestamp_witness, record.value_witness, record.record_witness); record.gate_index = this->num_gates; ++this->num_gates; @@ -2107,7 +2117,8 @@ void UltraCircuitBuilder_::create_sorted_RAM_gate(RamRecord& re { record.record_witness = this->add_variable(0); apply_aux_selectors(AUX_SELECTORS::RAM_CONSISTENCY_CHECK); - blocks.main.populate_wires(record.index_witness, record.timestamp_witness, record.value_witness, record.record_witness); + blocks.main.populate_wires( + record.index_witness, record.timestamp_witness, record.value_witness, record.record_witness); record.gate_index = this->num_gates; ++this->num_gates; @@ -2600,7 +2611,8 @@ template void UltraCircuitBuilder_:: uint32_t timestamp_delta_witness = this->add_variable(timestamp_delta); apply_aux_selectors(AUX_SELECTORS::RAM_TIMESTAMP_CHECK); - blocks.main.populate_wires(current.index_witness, current.timestamp_witness, timestamp_delta_witness, this->zero_idx); + blocks.main.populate_wires( + current.index_witness, current.timestamp_witness, timestamp_delta_witness, this->zero_idx); ++this->num_gates; @@ -3191,9 +3203,9 @@ inline typename Arithmetization::FF UltraCircuitBuilder_::compu * * @details The method switches the circuit to the "in-the-head" version, finalizes it, checks gates, lookups and * permutations and then switches it back from the in-the-head version, discarding the updates - * @note We want to check that the whole circuit works, but ultra circuits need to have ram, rom and range gates added in the end for the check to be complete as - * well as the set permutation check, so we finalize the circuit when we check it. This structure allows us to - * restore the circuit to the state before the finalization. + * @note We want to check that the whole circuit works, but ultra circuits need to have ram, rom and range gates added + * in the end for the check to be complete as well as the set permutation check, so we finalize the circuit when we + * check it. This structure allows us to restore the circuit to the state before the finalization. * * @return true * @return false diff --git a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.test.cpp b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.test.cpp index 02ddfcd9e9b..0f3adb6cd59 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.test.cpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.test.cpp @@ -97,7 +97,7 @@ TEST(ultra_circuit_constructor, create_gates_from_plookup_accumulators) } } - UltraCircuitBuilder circuit_copy{circuit_builder}; + UltraCircuitBuilder circuit_copy{ circuit_builder }; bool result = circuit_builder.check_circuit(); EXPECT_EQ(result, true); @@ -156,7 +156,7 @@ TEST(ultra_circuit_constructor, test_elliptic_gate) circuit_constructor.create_ecc_add_gate({ x1, y1, x2, y2, x3, y3, 1 }); - UltraCircuitBuilder circuit_copy{circuit_constructor}; + UltraCircuitBuilder circuit_copy{ circuit_constructor }; bool result = circuit_constructor.check_circuit(); EXPECT_EQ(result, true); @@ -184,7 +184,7 @@ TEST(ultra_circuit_constructor, test_elliptic_double_gate) circuit_constructor.create_ecc_dbl_gate({ x1, y1, x3, y3 }); - UltraCircuitBuilder circuit_copy{circuit_constructor}; + UltraCircuitBuilder circuit_copy{ circuit_constructor }; bool result = circuit_constructor.check_circuit(); EXPECT_EQ(result, true); @@ -216,7 +216,7 @@ TEST(ultra_circuit_constructor, non_trivial_tag_permutation) circuit_constructor.assign_tag(c_idx, 2); circuit_constructor.assign_tag(d_idx, 2); - UltraCircuitBuilder circuit_copy{circuit_constructor}; + UltraCircuitBuilder circuit_copy{ circuit_constructor }; bool result = circuit_constructor.check_circuit(); EXPECT_EQ(result, true); @@ -262,7 +262,7 @@ TEST(ultra_circuit_constructor, non_trivial_tag_permutation_and_cycles) circuit_constructor.create_add_gate( { e_idx, f_idx, circuit_constructor.zero_idx, fr::one(), -fr::one(), fr::zero(), fr::zero() }); - UltraCircuitBuilder circuit_copy{circuit_constructor}; + UltraCircuitBuilder circuit_copy{ circuit_constructor }; bool result = circuit_constructor.check_circuit(); EXPECT_EQ(result, true); @@ -287,7 +287,7 @@ TEST(ultra_circuit_constructor, bad_tag_permutation) circuit_constructor.create_add_gate({ a_idx, b_idx, circuit_constructor.zero_idx, 1, 1, 0, 0 }); circuit_constructor.create_add_gate({ c_idx, d_idx, circuit_constructor.zero_idx, 1, 1, 0, -1 }); - UltraCircuitBuilder circuit_copy{circuit_constructor}; + UltraCircuitBuilder circuit_copy{ circuit_constructor }; bool result = circuit_constructor.check_circuit(); EXPECT_EQ(result, true); @@ -661,7 +661,7 @@ TEST(ultra_circuit_constructor, non_native_field_multiplication) const auto [lo_1_idx, hi_1_idx] = circuit_constructor.evaluate_non_native_field_multiplication(inputs); circuit_constructor.range_constrain_two_limbs(lo_1_idx, hi_1_idx, 70, 70); - UltraCircuitBuilder circuit_copy{circuit_constructor}; + UltraCircuitBuilder circuit_copy{ circuit_constructor }; bool result = circuit_constructor.check_circuit(); @@ -773,7 +773,7 @@ TEST(ultra_circuit_constructor, ram) }, false); - UltraCircuitBuilder circuit_copy{circuit_constructor}; + UltraCircuitBuilder circuit_copy{ circuit_constructor }; bool result = circuit_constructor.check_circuit(); EXPECT_EQ(result, true); diff --git a/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.cpp b/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.cpp index 8fd4f694a7c..c10cfec038d 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.cpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.cpp @@ -113,8 +113,8 @@ template void ExecutionTrace_::populate_public_inputs_blo template void ExecutionTrace_::add_ecc_op_wires_to_proving_key( - TraceData& trace_data, Builder& builder, const std::shared_ptr& proving_key) -requires IsGoblinFlavor + TraceData& trace_data, Builder& builder, const std::shared_ptr& proving_key) + requires IsGoblinFlavor { std::array op_wire_polynomials; for (auto& poly : op_wire_polynomials) { diff --git a/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.hpp b/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.hpp index 876751adc71..dbeee66ee66 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.hpp @@ -71,8 +71,9 @@ template class ExecutionTrace_ { */ static void populate_public_inputs_block(Builder& builder); - static void add_ecc_op_wires_to_proving_key( - TraceData& trace_data, Builder& builder, const std::shared_ptr& proving_key) + static void add_ecc_op_wires_to_proving_key(TraceData& trace_data, + Builder& builder, + const std::shared_ptr& proving_key) requires IsGoblinFlavor; }; From 37331b39f652bf01e637391c753332f9994591bf Mon Sep 17 00:00:00 2001 From: ledwards2225 Date: Sun, 25 Feb 2024 20:45:15 +0000 Subject: [PATCH 23/28] move ecc op wires construction to trace --- .../execution_trace/execution_trace.cpp | 21 +++++----- .../execution_trace/execution_trace.hpp | 11 +++++- .../sumcheck/instance/prover_instance.cpp | 38 ------------------- .../sumcheck/instance/prover_instance.hpp | 7 +--- 4 files changed, 20 insertions(+), 57 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.cpp b/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.cpp index c10cfec038d..154e1edfa39 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.cpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.cpp @@ -14,9 +14,9 @@ void ExecutionTrace_::generate(Builder& builder, add_wires_and_selectors_to_proving_key(trace_data, builder, proving_key); - // if constexpr(IsGoblinFlavor){ - // add_ecc_op_wires_to_proving_key(trace_data, builder, proving_key); - // } + if constexpr (IsGoblinFlavor) { + add_ecc_op_wires_to_proving_key(builder, proving_key); + } // Compute the permutation argument polynomials (sigma/id) and add them to proving key compute_permutation_argument_polynomials(builder, proving_key.get(), trace_data.copy_cycles); @@ -28,10 +28,10 @@ void ExecutionTrace_::add_wires_and_selectors_to_proving_key( { if constexpr (IsHonkFlavor) { for (auto [pkey_wire, trace_wire] : zip_view(proving_key->get_wires(), trace_data.wires)) { - pkey_wire = std::move(trace_wire); + pkey_wire = trace_wire.share(); } for (auto [pkey_selector, trace_selector] : zip_view(proving_key->get_selectors(), trace_data.selectors)) { - pkey_selector = std::move(trace_selector); + pkey_selector = trace_selector.share(); } } else if constexpr (IsPlonkFlavor) { for (size_t idx = 0; idx < trace_data.wires.size(); ++idx) { @@ -113,24 +113,23 @@ template void ExecutionTrace_::populate_public_inputs_blo template void ExecutionTrace_::add_ecc_op_wires_to_proving_key( - TraceData& trace_data, Builder& builder, const std::shared_ptr& proving_key) + Builder& builder, const std::shared_ptr& proving_key) requires IsGoblinFlavor { + // Initialize the ecc op wire polynomials to zero on the whole domain std::array op_wire_polynomials; for (auto& poly : op_wire_polynomials) { poly = Polynomial{ proving_key->circuit_size }; } Polynomial ecc_op_selector{ proving_key->circuit_size }; - // The ECC op wires are constructed to contain the op data on the appropriate range and to vanish everywhere else. - // The op data is assumed to have already been stored at the correct location in the convetional wires so the data - // can simply be copied over directly. + // Copy the ecc op data from the conventional wires into the op wires over the range of ecc op gates const size_t op_wire_offset = Flavor::has_zero_row ? 1 : 0; - for (auto [ecc_op_wire, wire] : zip_view(op_wire_polynomials, trace_data.wires)) { + for (auto [ecc_op_wire, wire] : zip_view(op_wire_polynomials, proving_key->get_wires())) { for (size_t i = 0; i < builder.num_ecc_op_gates; ++i) { size_t idx = i + op_wire_offset; ecc_op_wire[idx] = wire[idx]; - ecc_op_selector[idx] = 1; + ecc_op_selector[idx] = 1; // construct the selector as the indicator on the ecc op block } } diff --git a/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.hpp b/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.hpp index dbeee66ee66..d693dbd4a08 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.hpp @@ -71,8 +71,15 @@ template class ExecutionTrace_ { */ static void populate_public_inputs_block(Builder& builder); - static void add_ecc_op_wires_to_proving_key(TraceData& trace_data, - Builder& builder, + /** + * @brief Construct and add the goblin ecc op wires to the proving key + * @details The ecc op wires vanish everywhere except on the ecc op block, where they contain a copy of the ecc op + * data assumed already to be present in the corrresponding block of the conventional wires in the proving key. + * + * @param builder + * @param proving_key + */ + static void add_ecc_op_wires_to_proving_key(Builder& builder, const std::shared_ptr& proving_key) requires IsGoblinFlavor; }; diff --git a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp index 1f2d09bb086..db6030ed29b 100644 --- a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp +++ b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp @@ -32,44 +32,6 @@ template size_t ProverInstance_::compute_dyadic_size(Circ return circuit.get_circuit_subgroup_size(total_num_gates); } -/** - * @brief Construct Goblin style ECC op wire polynomials - * @details The Ecc op wire values are assumed to have already been stored in the corresponding block of the - * conventional wire polynomials. The values for the ecc op wire polynomials are set based on those values. - * - * @tparam Flavor - * @param wire_polynomials - */ -template -void ProverInstance_::construct_ecc_op_wire_polynomials(Circuit& circuit) - requires IsGoblinFlavor -{ - std::array op_wire_polynomials; - for (auto& poly : op_wire_polynomials) { - poly = Polynomial{ dyadic_circuit_size }; - } - Polynomial ecc_op_selector{ dyadic_circuit_size }; - - // The ECC op wires are constructed to contain the op data on the appropriate range and to vanish everywhere else. - // The op data is assumed to have already been stored at the correct location in the convetional wires so the data - // can simply be copied over directly. - const size_t op_wire_offset = Flavor::has_zero_row ? 1 : 0; - for (auto [ecc_op_wire, wire] : zip_view(op_wire_polynomials, proving_key->get_wires())) { - for (size_t i = 0; i < circuit.num_ecc_op_gates; ++i) { - size_t idx = i + op_wire_offset; - ecc_op_wire[idx] = wire[idx]; - ecc_op_selector[idx] = 1; - } - } - - proving_key->num_ecc_op_gates = circuit.num_ecc_op_gates; - proving_key->ecc_op_wire_1 = op_wire_polynomials[0].share(); - proving_key->ecc_op_wire_2 = op_wire_polynomials[1].share(); - proving_key->ecc_op_wire_3 = op_wire_polynomials[2].share(); - proving_key->ecc_op_wire_4 = op_wire_polynomials[3].share(); - proving_key->lagrange_ecc_op = ecc_op_selector.share(); -} - /** * @brief * @details diff --git a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.hpp b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.hpp index d2b8da8f28e..84a14acfaa7 100644 --- a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.hpp +++ b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.hpp @@ -71,10 +71,8 @@ template class ProverInstance_ { // Construct and add to proving key the wire, selector and copy constraint polynomials Trace::generate(circuit, proving_key); - // If Goblin, construct the ECC op queue wire and databus polynomials - // TODO(https://github.com/AztecProtocol/barretenberg/issues/862): Maybe do this in trace generation? + // If Goblin, construct the databus polynomials if constexpr (IsGoblinFlavor) { - construct_ecc_op_wire_polynomials(circuit); construct_databus_polynomials(circuit); } @@ -116,9 +114,6 @@ template class ProverInstance_ { size_t compute_dyadic_size(Circuit&); - void construct_ecc_op_wire_polynomials(Circuit&) - requires IsGoblinFlavor; - void construct_databus_polynomials(Circuit&) requires IsGoblinFlavor; From b37bf0b7be46e3c8c7ec7bdd6a7546cc8ae39d1b Mon Sep 17 00:00:00 2001 From: ledwards2225 Date: Mon, 26 Feb 2024 04:29:03 +0000 Subject: [PATCH 24/28] use pop wires in gob --- .../arithmetization/arithmetization.hpp | 12 +++--- .../goblin_ultra_circuit_builder.cpp | 40 ++++--------------- 2 files changed, 15 insertions(+), 37 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/proof_system/arithmetization/arithmetization.hpp b/barretenberg/cpp/src/barretenberg/proof_system/arithmetization/arithmetization.hpp index edc4cb43ec9..daae13bd71a 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/arithmetization/arithmetization.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/arithmetization/arithmetization.hpp @@ -32,6 +32,13 @@ namespace bb { * We should only do this if it becomes necessary or convenient. */ +/** + * @brief Basic structure for storing gate data in a builder + * + * @tparam FF + * @tparam NUM_WIRES + * @tparam NUM_SELECTORS + */ template class ExecutionTraceBlock { public: using SelectorType = std::vector>; @@ -66,11 +73,6 @@ template class StandardArith { class StandardTraceBlock : public ExecutionTraceBlock { public: - // WORKTODO: would be nice to do this instead of getters but we lose convenience of block.wires - // WireType w_l; - // WireType w_r; - // WireType w_o; - void populate_wires(const uint32_t& idx_1, const uint32_t& idx_2, const uint32_t& idx_3) { this->wires[0].emplace_back(idx_1); diff --git a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/goblin_ultra_circuit_builder.cpp b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/goblin_ultra_circuit_builder.cpp index 2fac8082326..8bb941d88ca 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/goblin_ultra_circuit_builder.cpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/goblin_ultra_circuit_builder.cpp @@ -42,10 +42,7 @@ template void GoblinUltraCircuitBuilder_::add_gates_to_ensure_ calldata_read_counts[raw_read_idx]++; // mock gates that use poseidon selectors, with all zeros as input - this->blocks.main.w_l().emplace_back(this->zero_idx); - this->blocks.main.w_r().emplace_back(this->zero_idx); - this->blocks.main.w_o().emplace_back(this->zero_idx); - this->blocks.main.w_4().emplace_back(this->zero_idx); + this->blocks.main.populate_wires(this->zero_idx, this->zero_idx, this->zero_idx, this->zero_idx); this->blocks.main.q_m().emplace_back(0); this->blocks.main.q_1().emplace_back(0); this->blocks.main.q_2().emplace_back(0); @@ -65,10 +62,7 @@ template void GoblinUltraCircuitBuilder_::add_gates_to_ensure_ ++this->num_gates; // second gate that stores the output of all zeros of the poseidon gates - this->blocks.main.w_l().emplace_back(this->zero_idx); - this->blocks.main.w_r().emplace_back(this->zero_idx); - this->blocks.main.w_o().emplace_back(this->zero_idx); - this->blocks.main.w_4().emplace_back(this->zero_idx); + this->blocks.main.populate_wires(this->zero_idx, this->zero_idx, this->zero_idx, this->zero_idx); this->blocks.main.q_m().emplace_back(0); this->blocks.main.q_1().emplace_back(0); this->blocks.main.q_2().emplace_back(0); @@ -207,18 +201,12 @@ ecc_op_tuple GoblinUltraCircuitBuilder_::decompose_ecc_operands(uint32_t op_ */ template void GoblinUltraCircuitBuilder_::populate_ecc_op_wires(const ecc_op_tuple& in) { - this->blocks.ecc_op.w_l().emplace_back(in.op); - this->blocks.ecc_op.w_r().emplace_back(in.x_lo); - this->blocks.ecc_op.w_o().emplace_back(in.x_hi); - this->blocks.ecc_op.w_4().emplace_back(in.y_lo); + this->blocks.ecc_op.populate_wires(in.op, in.x_lo, in.x_hi, in.y_lo); for (auto& selector : this->blocks.ecc_op.selectors) { selector.emplace_back(0); } - this->blocks.ecc_op.w_l().emplace_back(this->zero_idx); - this->blocks.ecc_op.w_r().emplace_back(in.y_hi); - this->blocks.ecc_op.w_o().emplace_back(in.z_1); - this->blocks.ecc_op.w_4().emplace_back(in.z_2); + this->blocks.ecc_op.populate_wires(this->zero_idx, in.y_hi, in.z_1, in.z_2); for (auto& selector : this->blocks.ecc_op.selectors) { selector.emplace_back(0); } @@ -243,13 +231,10 @@ template void GoblinUltraCircuitBuilder_::set_goblin_ecc_op_co template void GoblinUltraCircuitBuilder_::create_calldata_lookup_gate(const databus_lookup_gate_& in) { - this->blocks.main.w_l().emplace_back(in.value); - this->blocks.main.w_r().emplace_back(in.index); + this->blocks.main.populate_wires(in.value, in.index, this->zero_idx, this->zero_idx); this->blocks.main.q_busread().emplace_back(1); // populate all other components with zero - this->blocks.main.w_o().emplace_back(this->zero_idx); - this->blocks.main.w_4().emplace_back(this->zero_idx); this->blocks.main.q_m().emplace_back(0); this->blocks.main.q_1().emplace_back(0); this->blocks.main.q_2().emplace_back(0); @@ -274,10 +259,7 @@ void GoblinUltraCircuitBuilder_::create_calldata_lookup_gate(const databus_l template void GoblinUltraCircuitBuilder_::create_poseidon2_external_gate(const poseidon2_external_gate_& in) { - this->blocks.main.w_l().emplace_back(in.a); - this->blocks.main.w_r().emplace_back(in.b); - this->blocks.main.w_o().emplace_back(in.c); - this->blocks.main.w_4().emplace_back(in.d); + this->blocks.main.populate_wires(in.a, in.b, in.c, in.d); this->blocks.main.q_m().emplace_back(0); this->blocks.main.q_1().emplace_back(Poseidon2Bn254ScalarFieldParams::round_constants[in.round_idx][0]); this->blocks.main.q_2().emplace_back(Poseidon2Bn254ScalarFieldParams::round_constants[in.round_idx][1]); @@ -302,10 +284,7 @@ void GoblinUltraCircuitBuilder_::create_poseidon2_external_gate(const poseid template void GoblinUltraCircuitBuilder_::create_poseidon2_internal_gate(const poseidon2_internal_gate_& in) { - this->blocks.main.w_l().emplace_back(in.a); - this->blocks.main.w_r().emplace_back(in.b); - this->blocks.main.w_o().emplace_back(in.c); - this->blocks.main.w_4().emplace_back(in.d); + this->blocks.main.populate_wires(in.a, in.b, in.c, in.d); this->blocks.main.q_m().emplace_back(0); this->blocks.main.q_1().emplace_back(Poseidon2Bn254ScalarFieldParams::round_constants[in.round_idx][0]); this->blocks.main.q_2().emplace_back(0); @@ -333,10 +312,7 @@ void GoblinUltraCircuitBuilder_::create_poseidon2_internal_gate(const poseid */ template void GoblinUltraCircuitBuilder_::create_poseidon2_end_gate(const poseidon2_end_gate_& in) { - this->blocks.main.w_l().emplace_back(in.a); - this->blocks.main.w_r().emplace_back(in.b); - this->blocks.main.w_o().emplace_back(in.c); - this->blocks.main.w_4().emplace_back(in.d); + this->blocks.main.populate_wires(in.a, in.b, in.c, in.d); this->blocks.main.q_m().emplace_back(0); this->blocks.main.q_1().emplace_back(0); this->blocks.main.q_2().emplace_back(0); From f2dad935c2ec8e368759142d99e941d4769e860f Mon Sep 17 00:00:00 2001 From: ledwards2225 Date: Mon, 26 Feb 2024 15:00:58 +0000 Subject: [PATCH 25/28] comments --- .../proof_system/circuit_builder/ultra_circuit_builder.hpp | 2 +- .../cpp/src/barretenberg/ultra_honk/ultra_composer.test.cpp | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.hpp b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.hpp index 5ac02bbb0bf..fef275152d2 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.hpp @@ -271,7 +271,7 @@ class UltraCircuitBuilder_ : public CircuitBuilderBase add_variables(auto& circuit_builder, std::vector v void prove_and_verify(auto& circuit_builder, auto& composer, bool expected_result) { - // WORKTODO: running check_circuit for good meaure to ensure proof doesnt break - EXPECT_EQ(circuit_builder.check_circuit(), expected_result); auto instance = composer.create_instance(circuit_builder); auto prover = composer.create_prover(instance); auto verifier = composer.create_verifier(instance); From 9c4daabb046c4c86c96fd86cb6edf3ede41a7769 Mon Sep 17 00:00:00 2001 From: ledwards2225 Date: Mon, 26 Feb 2024 21:44:50 +0000 Subject: [PATCH 26/28] comment --- .../proof_system/circuit_builder/standard_circuit_builder.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/standard_circuit_builder.hpp b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/standard_circuit_builder.hpp index 1a4d2a954b1..32386b388a7 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/standard_circuit_builder.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/standard_circuit_builder.hpp @@ -25,6 +25,7 @@ template class StandardCircuitBuilder_ : public CircuitBuilderBase static constexpr merkle::HashType merkle_hash_type = merkle::HashType::FIXED_BASE_PEDERSEN; static constexpr pedersen::CommitmentType commitment_type = pedersen::CommitmentType::FIXED_BASE_PEDERSEN; + // Storage for wires and selectors for all gate types GateBlocks blocks; static constexpr size_t UINT_LOG2_BASE = 2; From 75bbe9ccfbf18cd9ba18d7f5507ba10408459b10 Mon Sep 17 00:00:00 2001 From: ledwards2225 Date: Tue, 27 Feb 2024 17:45:20 +0000 Subject: [PATCH 27/28] resolve review comments from kesha --- .../arithmetization/arithmetization.hpp | 1 - .../goblin_ultra_circuit_builder.test.cpp | 3 +-- .../circuit_builder/ultra_circuit_builder.cpp | 3 --- .../execution_trace/execution_trace.cpp | 2 -- .../stdlib/primitives/field/field.test.cpp | 14 +++++++++++++- 5 files changed, 14 insertions(+), 9 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/proof_system/arithmetization/arithmetization.hpp b/barretenberg/cpp/src/barretenberg/proof_system/arithmetization/arithmetization.hpp index daae13bd71a..47e6545b9c5 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/arithmetization/arithmetization.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/arithmetization/arithmetization.hpp @@ -48,7 +48,6 @@ template class ExecutionTr Wires wires; // vectors of indices into a witness variables array Selectors selectors; - bool is_public_input = false; bool operator==(const ExecutionTraceBlock& other) const = default; diff --git a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/goblin_ultra_circuit_builder.test.cpp b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/goblin_ultra_circuit_builder.test.cpp index 725cbddfb33..0c8db203f1d 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/goblin_ultra_circuit_builder.test.cpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/goblin_ultra_circuit_builder.test.cpp @@ -44,8 +44,7 @@ TEST(GoblinUltraCircuitBuilder, CopyConstructor) GoblinUltraCircuitBuilder duplicate_circuit_constructor{ circuit_constructor }; - EXPECT_EQ(duplicate_circuit_constructor.get_num_gates(), circuit_constructor.get_num_gates()); - // EXPECT_EQ(duplicate_circuit_constructor.get_selectors(), circuit_constructor.get_selectors()); + EXPECT_EQ(duplicate_circuit_constructor, circuit_constructor); EXPECT_TRUE(duplicate_circuit_constructor.check_circuit()); } diff --git a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.cpp b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.cpp index e4e6297d38b..c7c70b7adf0 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.cpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/circuit_builder/ultra_circuit_builder.cpp @@ -1696,7 +1696,6 @@ void UltraCircuitBuilder_::process_non_native_field_multiplicat blocks.main.w_r().emplace_back(input.b[1]); blocks.main.w_o().emplace_back(this->zero_idx); blocks.main.w_4().emplace_back(input.lo_0); - // blocks.main.populate_wires(input.a[1], input.b[1], this->zero_idx, input.lo_0); apply_aux_selectors(AUX_SELECTORS::NON_NATIVE_FIELD_1); ++this->num_gates; @@ -1709,7 +1708,6 @@ void UltraCircuitBuilder_::process_non_native_field_multiplicat blocks.main.w_r().emplace_back(input.b[2]); blocks.main.w_o().emplace_back(this->zero_idx); blocks.main.w_4().emplace_back(input.hi_0); - // blocks.main.populate_wires(input.a[2], input.b[3], this->zero_idx, input.hi_0); apply_aux_selectors(AUX_SELECTORS::NON_NATIVE_FIELD_3); ++this->num_gates; @@ -1717,7 +1715,6 @@ void UltraCircuitBuilder_::process_non_native_field_multiplicat blocks.main.w_r().emplace_back(input.b[1]); blocks.main.w_o().emplace_back(this->zero_idx); blocks.main.w_4().emplace_back(input.hi_1); - // blocks.main.populate_wires(input.a[1], input.b[1], this->zero_idx, input.hi_1); apply_aux_selectors(AUX_SELECTORS::NONE); ++this->num_gates; diff --git a/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.cpp b/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.cpp index 1188e34aeb6..239869d2568 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.cpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.cpp @@ -58,7 +58,6 @@ typename ExecutionTrace_::TraceData ExecutionTrace_::construct_t // For each block in the trace, populate wire polys, copy cycles and selector polys for (auto& block : builder.blocks.get()) { auto block_size = static_cast(block.wires[0].size()); - info("block size = ", block_size); // Update wire polynomials and copy cycles // NB: The order of row/column loops is arbitrary but needs to be row/column to match old copy_cycle code @@ -103,7 +102,6 @@ template void ExecutionTrace_::populate_public_inputs_blo selector.emplace_back(0); } } - builder.blocks.pub_inputs.is_public_input = true; } template diff --git a/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field.test.cpp b/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field.test.cpp index 72606b48e92..da806c978ef 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field.test.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field.test.cpp @@ -178,8 +178,14 @@ template class stdlib_field : public testing::Test { { Builder builder = Builder(); auto gates_before = builder.get_num_gates(); - fidget(builder); + uint64_t expected = fidget(builder); auto gates_after = builder.get_num_gates(); + if constexpr (IsAnyOf) { + EXPECT_EQ(builder.get_variable(builder.blocks.arithmetic.w_o()[gates_after - 1]), fr(expected)); + } + if constexpr (IsAnyOf) { + EXPECT_EQ(builder.get_variable(builder.blocks.main.w_o()[gates_after - 1]), fr(expected)); + } info("Number of gates added", gates_after - gates_before); bool result = builder.check_circuit(); EXPECT_EQ(result, true); @@ -253,6 +259,12 @@ template class stdlib_field : public testing::Test { auto gates_before = builder.get_num_gates(); fibbonaci(builder); auto gates_after = builder.get_num_gates(); + if constexpr (IsAnyOf) { + EXPECT_EQ(builder.get_variable(builder.blocks.arithmetic.w_l()[builder.get_num_gates() - 1]), fr(4181)); + } + if constexpr (IsAnyOf) { + EXPECT_EQ(builder.get_variable(builder.blocks.main.w_l()[builder.get_num_gates() - 1]), fr(4181)); + } EXPECT_EQ(gates_after - gates_before, 18UL); bool result = builder.check_circuit(); From 8ae0abb0eed4789fdeed2acf4b62b1e5ba8b6aed Mon Sep 17 00:00:00 2001 From: ledwards2225 Date: Tue, 27 Feb 2024 17:48:17 +0000 Subject: [PATCH 28/28] rename generate to populate --- .../cpp/src/barretenberg/plonk/composer/standard_composer.cpp | 2 +- .../cpp/src/barretenberg/plonk/composer/ultra_composer.cpp | 2 +- .../proof_system/execution_trace/execution_trace.cpp | 2 +- .../proof_system/execution_trace/execution_trace.hpp | 2 +- .../cpp/src/barretenberg/sumcheck/instance/prover_instance.hpp | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/plonk/composer/standard_composer.cpp b/barretenberg/cpp/src/barretenberg/plonk/composer/standard_composer.cpp index 22256c863e8..3620fb540c3 100644 --- a/barretenberg/cpp/src/barretenberg/plonk/composer/standard_composer.cpp +++ b/barretenberg/cpp/src/barretenberg/plonk/composer/standard_composer.cpp @@ -41,7 +41,7 @@ std::shared_ptr StandardComposer::compute_proving_key(Circui subgroup_size, circuit_constructor.public_inputs.size(), crs, CircuitType::STANDARD); // Construct and add to proving key the wire, selector and copy constraint polynomials - Trace::generate(circuit_constructor, circuit_proving_key); + Trace::populate(circuit_constructor, circuit_proving_key); // Make all selectors nonzero enforce_nonzero_selector_polynomials(circuit_constructor, circuit_proving_key.get()); diff --git a/barretenberg/cpp/src/barretenberg/plonk/composer/ultra_composer.cpp b/barretenberg/cpp/src/barretenberg/plonk/composer/ultra_composer.cpp index f42c1780807..80b0e886c5b 100644 --- a/barretenberg/cpp/src/barretenberg/plonk/composer/ultra_composer.cpp +++ b/barretenberg/cpp/src/barretenberg/plonk/composer/ultra_composer.cpp @@ -166,7 +166,7 @@ std::shared_ptr UltraComposer::compute_proving_key(CircuitBuilder& std::make_shared(subgroup_size, circuit.public_inputs.size(), crs, CircuitType::ULTRA); // Construct and add to proving key the wire, selector and copy constraint polynomials - Trace::generate(circuit, circuit_proving_key); + Trace::populate(circuit, circuit_proving_key); enforce_nonzero_selector_polynomials(circuit, circuit_proving_key.get()); diff --git a/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.cpp b/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.cpp index 239869d2568..6c94579f4d7 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.cpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.cpp @@ -6,7 +6,7 @@ namespace bb { template -void ExecutionTrace_::generate(Builder& builder, +void ExecutionTrace_::populate(Builder& builder, const std::shared_ptr& proving_key) { // Construct wire polynomials, selector polynomials, and copy cycles from raw circuit data diff --git a/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.hpp b/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.hpp index d693dbd4a08..6f635786e39 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.hpp @@ -40,7 +40,7 @@ template class ExecutionTrace_ { * * @param builder */ - static void generate(Builder& builder, const std::shared_ptr&); + static void populate(Builder& builder, const std::shared_ptr&); private: /** diff --git a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.hpp b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.hpp index 84a14acfaa7..5313f7b8304 100644 --- a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.hpp +++ b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.hpp @@ -69,7 +69,7 @@ template class ProverInstance_ { proving_key = std::make_shared(dyadic_circuit_size, circuit.public_inputs.size()); // Construct and add to proving key the wire, selector and copy constraint polynomials - Trace::generate(circuit, proving_key); + Trace::populate(circuit, proving_key); // If Goblin, construct the databus polynomials if constexpr (IsGoblinFlavor) {