Skip to content

Commit 06616d4

Browse files
authored
feat: merge-train/barretenberg (#22208)
BEGIN_COMMIT_OVERRIDE chore: builder tweaks (#22200) END_COMMIT_OVERRIDE
2 parents e041f09 + bf3dcc8 commit 06616d4

File tree

10 files changed

+91
-87
lines changed

10 files changed

+91
-87
lines changed

barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/circuit_builder_base.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -127,9 +127,9 @@ template <typename FF_> class CircuitBuilderBase {
127127
CircuitBuilderBase(bool is_write_vk_mode = false);
128128

129129
CircuitBuilderBase(const CircuitBuilderBase& other) = default;
130-
CircuitBuilderBase(CircuitBuilderBase&& other) noexcept = default;
130+
CircuitBuilderBase(CircuitBuilderBase&& other) = delete;
131131
CircuitBuilderBase& operator=(const CircuitBuilderBase& other) = default;
132-
CircuitBuilderBase& operator=(CircuitBuilderBase&& other) noexcept = default;
132+
CircuitBuilderBase& operator=(CircuitBuilderBase&& other) = delete;
133133
virtual ~CircuitBuilderBase() = default;
134134

135135
bool operator==(const CircuitBuilderBase& other) const = default;
@@ -143,7 +143,7 @@ template <typename FF_> class CircuitBuilderBase {
143143
// Increment the gate count by the specified amount
144144
void increment_num_gates(size_t count = 1)
145145
{
146-
BB_ASSERT_DEBUG(!circuit_finalized, "Cannot add gates after circuit is finalized");
146+
BB_ASSERT(!circuit_finalized, "Cannot add gates after circuit is finalized");
147147
_num_gates += count;
148148
}
149149

barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/plookup_tables/non_native_group_generator.cpp

Lines changed: 63 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -18,71 +18,69 @@ namespace bb::plookup::ecc_generator_tables {
1818
**/
1919
template <typename G1> void ecc_generator_table<G1>::init_generator_tables()
2020
{
21-
if (init) {
22-
return;
23-
}
24-
element base_point = G1::one;
25-
26-
auto d2 = base_point.dbl();
27-
std::array<element, 256> point_table;
28-
point_table[128] = base_point;
29-
for (size_t i = 1; i < 128; ++i) {
30-
point_table[i + 128] = point_table[i + 127] + d2;
31-
}
32-
for (size_t i = 0; i < 128; ++i) {
33-
point_table[127 - i] = -point_table[128 + i];
34-
}
35-
element::batch_normalize(&point_table[0], 256);
36-
37-
auto beta = G1::Fq::cube_root_of_unity();
38-
for (size_t i = 0; i < 256; ++i) {
39-
uint256_t endo_x = static_cast<uint256_t>(point_table[i].x * beta);
40-
uint256_t x = static_cast<uint256_t>(point_table[i].x);
41-
uint256_t y = static_cast<uint256_t>(point_table[i].y);
42-
43-
// Store the values in prime-basis lookup tables
44-
ecc_generator_table<G1>::generator_xyprime_table[i] = std::make_pair(bb::fr(x), bb::fr(y));
45-
ecc_generator_table<G1>::generator_endo_xyprime_table[i] = std::make_pair(bb::fr(endo_x), bb::fr(y));
46-
47-
// Compute x limbs
48-
constexpr size_t num_limb_bits = stdlib::NUM_LIMB_BITS_IN_FIELD_SIMULATION;
49-
const uint256_t SHIFT = uint256_t(1) << num_limb_bits;
50-
const uint256_t MASK = SHIFT - 1;
51-
uint256_t x0 = x & MASK;
52-
x = x >> num_limb_bits;
53-
uint256_t x1 = x & MASK;
54-
x = x >> num_limb_bits;
55-
uint256_t x2 = x & MASK;
56-
x = x >> num_limb_bits;
57-
uint256_t x3 = x & MASK;
58-
59-
// Compute endo x limbs
60-
uint256_t endox0 = endo_x & MASK;
61-
endo_x = endo_x >> num_limb_bits;
62-
uint256_t endox1 = endo_x & MASK;
63-
endo_x = endo_x >> num_limb_bits;
64-
uint256_t endox2 = endo_x & MASK;
65-
endo_x = endo_x >> num_limb_bits;
66-
uint256_t endox3 = endo_x & MASK;
67-
68-
// Compute y limbs
69-
uint256_t y0 = y & MASK;
70-
y = y >> num_limb_bits;
71-
uint256_t y1 = y & MASK;
72-
y = y >> num_limb_bits;
73-
uint256_t y2 = y & MASK;
74-
y = y >> num_limb_bits;
75-
uint256_t y3 = y & MASK;
76-
77-
// Store the limb values in the respective lookup tables
78-
ecc_generator_table<G1>::generator_xlo_table[i] = std::make_pair(x0, x1);
79-
ecc_generator_table<G1>::generator_xhi_table[i] = std::make_pair(x2, x3);
80-
ecc_generator_table<G1>::generator_endo_xlo_table[i] = std::make_pair(endox0, endox1);
81-
ecc_generator_table<G1>::generator_endo_xhi_table[i] = std::make_pair(endox2, endox3);
82-
ecc_generator_table<G1>::generator_ylo_table[i] = std::make_pair(y0, y1);
83-
ecc_generator_table<G1>::generator_yhi_table[i] = std::make_pair(y2, y3);
84-
}
85-
init = true;
21+
std::call_once(init_flag, []() {
22+
element base_point = G1::one;
23+
24+
auto d2 = base_point.dbl();
25+
std::array<element, 256> point_table;
26+
point_table[128] = base_point;
27+
for (size_t i = 1; i < 128; ++i) {
28+
point_table[i + 128] = point_table[i + 127] + d2;
29+
}
30+
for (size_t i = 0; i < 128; ++i) {
31+
point_table[127 - i] = -point_table[128 + i];
32+
}
33+
element::batch_normalize(&point_table[0], 256);
34+
35+
auto beta = G1::Fq::cube_root_of_unity();
36+
for (size_t i = 0; i < 256; ++i) {
37+
uint256_t endo_x = static_cast<uint256_t>(point_table[i].x * beta);
38+
uint256_t x = static_cast<uint256_t>(point_table[i].x);
39+
uint256_t y = static_cast<uint256_t>(point_table[i].y);
40+
41+
// Store the values in prime-basis lookup tables
42+
ecc_generator_table<G1>::generator_xyprime_table[i] = std::make_pair(bb::fr(x), bb::fr(y));
43+
ecc_generator_table<G1>::generator_endo_xyprime_table[i] = std::make_pair(bb::fr(endo_x), bb::fr(y));
44+
45+
// Compute x limbs
46+
constexpr size_t num_limb_bits = stdlib::NUM_LIMB_BITS_IN_FIELD_SIMULATION;
47+
const uint256_t SHIFT = uint256_t(1) << num_limb_bits;
48+
const uint256_t MASK = SHIFT - 1;
49+
uint256_t x0 = x & MASK;
50+
x = x >> num_limb_bits;
51+
uint256_t x1 = x & MASK;
52+
x = x >> num_limb_bits;
53+
uint256_t x2 = x & MASK;
54+
x = x >> num_limb_bits;
55+
uint256_t x3 = x & MASK;
56+
57+
// Compute endo x limbs
58+
uint256_t endox0 = endo_x & MASK;
59+
endo_x = endo_x >> num_limb_bits;
60+
uint256_t endox1 = endo_x & MASK;
61+
endo_x = endo_x >> num_limb_bits;
62+
uint256_t endox2 = endo_x & MASK;
63+
endo_x = endo_x >> num_limb_bits;
64+
uint256_t endox3 = endo_x & MASK;
65+
66+
// Compute y limbs
67+
uint256_t y0 = y & MASK;
68+
y = y >> num_limb_bits;
69+
uint256_t y1 = y & MASK;
70+
y = y >> num_limb_bits;
71+
uint256_t y2 = y & MASK;
72+
y = y >> num_limb_bits;
73+
uint256_t y3 = y & MASK;
74+
75+
// Store the limb values in the respective lookup tables
76+
ecc_generator_table<G1>::generator_xlo_table[i] = std::make_pair(x0, x1);
77+
ecc_generator_table<G1>::generator_xhi_table[i] = std::make_pair(x2, x3);
78+
ecc_generator_table<G1>::generator_endo_xlo_table[i] = std::make_pair(endox0, endox1);
79+
ecc_generator_table<G1>::generator_endo_xhi_table[i] = std::make_pair(endox2, endox3);
80+
ecc_generator_table<G1>::generator_ylo_table[i] = std::make_pair(y0, y1);
81+
ecc_generator_table<G1>::generator_yhi_table[i] = std::make_pair(y2, y3);
82+
}
83+
});
8684
}
8785

8886
/**

barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/plookup_tables/non_native_group_generator.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include "barretenberg/ecc/curves/bn254/g1.hpp"
1212
#include "barretenberg/ecc/curves/secp256k1/secp256k1.hpp"
1313
#include <array>
14+
#include <mutex>
1415

1516
namespace bb::plookup::ecc_generator_tables {
1617

@@ -39,7 +40,7 @@ template <typename G1> class ecc_generator_table {
3940
inline static std::array<std::pair<fr, fr>, 256> generator_yhi_table;
4041
inline static std::array<std::pair<fr, fr>, 256> generator_xyprime_table;
4142
inline static std::array<std::pair<fr, fr>, 256> generator_endo_xyprime_table;
42-
inline static bool init = false;
43+
inline static std::once_flag init_flag;
4344

4445
static void init_generator_tables();
4546

barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/plookup_tables/plookup_tables.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,11 @@ ReadData<bb::fr> get_lookup_accumulators(const MultiTableId id,
158158
const auto& multi_table = get_multitable(id);
159159
const size_t num_lookups = multi_table.basic_table_ids.size();
160160

161+
// All MultiTable vectors must be consistently sized
162+
BB_ASSERT_EQ(multi_table.column_1_coefficients.size(), num_lookups, "MultiTable coefficient/table count mismatch");
163+
BB_ASSERT_EQ(multi_table.get_table_values.size(), num_lookups, "MultiTable get_table_values/table count mismatch");
164+
BB_ASSERT_EQ(multi_table.slice_sizes.size(), num_lookups, "MultiTable slice_sizes/table count mismatch");
165+
161166
ReadData<bb::fr> lookup;
162167
const auto key_a_slices = numeric::slice_input_using_variable_bases(key_a, multi_table.slice_sizes);
163168
const auto key_b_slices = numeric::slice_input_using_variable_bases(key_b, multi_table.slice_sizes);

barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/plookup_tables/types.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ struct MultiTable {
193193
column_2_coefficients.emplace_back(1);
194194
column_3_coefficients.emplace_back(1);
195195

196-
for (size_t i = 0; i < num_lookups; ++i) {
196+
for (size_t i = 1; i < num_lookups; ++i) {
197197
column_1_coefficients.emplace_back(column_1_coefficients.back() * col_1_repeated_coeff);
198198
column_2_coefficients.emplace_back(column_2_coefficients.back() * col_2_repeated_coeff);
199199
column_3_coefficients.emplace_back(column_3_coefficients.back() * col_3_repeated_coeff);

barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/plookup_tables/uint.hpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,9 @@ template <size_t uint_size> inline MultiTable get_uint_xor_table(const MultiTabl
8484

8585
const size_t TABLE_BIT_SIZE = 6;
8686
const size_t num_entries = uint_size / TABLE_BIT_SIZE;
87+
const size_t total_tables = num_entries + 1; // +1 for the remaining-bits table
8788
const uint64_t base = 1 << TABLE_BIT_SIZE;
88-
MultiTable table(base, base, base, num_entries);
89+
MultiTable table(base, base, base, total_tables);
8990

9091
table.id = id;
9192
for (size_t i = 0; i < num_entries; ++i) {
@@ -95,7 +96,7 @@ template <size_t uint_size> inline MultiTable get_uint_xor_table(const MultiTabl
9596
}
9697

9798
// remaining bits
98-
const size_t LAST_TABLE_BIT_SIZE = uint_size - TABLE_BIT_SIZE * num_entries;
99+
const size_t LAST_TABLE_BIT_SIZE = uint_size - (TABLE_BIT_SIZE * num_entries);
99100
const size_t LAST_SLICE_SIZE = 1 << LAST_TABLE_BIT_SIZE;
100101
table.slice_sizes.emplace_back(LAST_SLICE_SIZE);
101102
if (uint_size == 8 || uint_size == 32) {
@@ -118,8 +119,9 @@ template <size_t uint_size> inline MultiTable get_uint_and_table(const MultiTabl
118119

119120
const size_t TABLE_BIT_SIZE = 6;
120121
const size_t num_entries = uint_size / TABLE_BIT_SIZE;
122+
const size_t total_tables = num_entries + 1; // +1 for the remaining-bits table
121123
const uint64_t base = 1 << TABLE_BIT_SIZE;
122-
MultiTable table(base, base, base, num_entries);
124+
MultiTable table(base, base, base, total_tables);
123125

124126
table.id = id;
125127
for (size_t i = 0; i < num_entries; ++i) {
@@ -129,7 +131,7 @@ template <size_t uint_size> inline MultiTable get_uint_and_table(const MultiTabl
129131
}
130132

131133
// remaining bits
132-
const size_t LAST_TABLE_BIT_SIZE = uint_size - TABLE_BIT_SIZE * num_entries;
134+
const size_t LAST_TABLE_BIT_SIZE = uint_size - (TABLE_BIT_SIZE * num_entries);
133135
const size_t LAST_SLICE_SIZE = 1 << LAST_TABLE_BIT_SIZE;
134136
table.slice_sizes.emplace_back(LAST_SLICE_SIZE);
135137
if (uint_size == 8 || uint_size == 32) {

barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/rom_ram_logic.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -314,11 +314,12 @@ void RomRamLogic_<ExecutionTrace>::init_RAM_element(CircuitBuilder* builder,
314314
.timestamp_witness = builder->put_constant_variable((uint64_t)ram_array.access_count),
315315
.value_witness = value_witness,
316316
.index = static_cast<uint32_t>(index_value),
317-
.timestamp = static_cast<uint32_t>(ram_array.access_count),
317+
.timestamp = ram_array.access_count,
318318
.access_type = RamRecord::AccessType::WRITE,
319319
.record_witness = 0,
320320
.gate_index = 0 };
321321
ram_array.state[index_value] = value_witness;
322+
BB_ASSERT_LT(ram_array.access_count, UINT32_MAX, "RAM access count overflow");
322323
ram_array.access_count++;
323324
// mutates the gate_index
324325
create_RAM_gate(builder, new_record);
@@ -342,7 +343,7 @@ uint32_t RomRamLogic_<ExecutionTrace>::read_RAM_array(CircuitBuilder* builder,
342343
.timestamp_witness = builder->put_constant_variable((uint64_t)ram_array.access_count),
343344
.value_witness = value_witness,
344345
.index = index,
345-
.timestamp = static_cast<uint32_t>(ram_array.access_count),
346+
.timestamp = ram_array.access_count,
346347
.access_type = RamRecord::AccessType::READ,
347348
.record_witness = 0,
348349
.gate_index = 0 };
@@ -352,6 +353,7 @@ uint32_t RomRamLogic_<ExecutionTrace>::read_RAM_array(CircuitBuilder* builder,
352353
ram_array.records.emplace_back(new_record);
353354

354355
// increment ram array's access count
356+
BB_ASSERT_LT(ram_array.access_count, UINT32_MAX, "RAM access count overflow");
355357
ram_array.access_count++;
356358

357359
// return witness index of the value in the array
@@ -385,7 +387,7 @@ void RomRamLogic_<ExecutionTrace>::write_RAM_array(CircuitBuilder* builder,
385387
.timestamp_witness = builder->put_constant_variable((uint64_t)ram_array.access_count),
386388
.value_witness = value_witness,
387389
.index = index,
388-
.timestamp = static_cast<uint32_t>(ram_array.access_count),
390+
.timestamp = ram_array.access_count,
389391
.access_type = RamRecord::AccessType::WRITE,
390392
.record_witness = 0,
391393
.gate_index = 0 };
@@ -394,6 +396,7 @@ void RomRamLogic_<ExecutionTrace>::write_RAM_array(CircuitBuilder* builder,
394396
ram_array.records.emplace_back(new_record);
395397

396398
// increment ram array's access count
399+
BB_ASSERT_LT(ram_array.access_count, UINT32_MAX, "RAM access count overflow");
397400
ram_array.access_count++;
398401

399402
// update Composer's current state of RAM array
@@ -612,7 +615,7 @@ void RomRamLogic_<ExecutionTrace>::process_RAM_array(CircuitBuilder* builder, co
612615
// monotonically increasing. i.e. are <= maximum timestamp. NOTE: we do _not_ check that every possible
613616
// timestamp between 0 and `max_timestamp` occurs at least once (which corresponds to an "honest trace," e.g.,
614617
// one generated by the code in this file). However, our check nonetheless suffices for correct memory accesses.
615-
const size_t max_timestamp = ram_array.access_count - 1;
618+
const uint32_t max_timestamp = ram_array.access_count - 1;
616619
for (auto& w : timestamp_deltas) {
617620
builder->create_small_range_constraint(w, max_timestamp);
618621
}

barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/rom_ram_logic.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ struct RamTranscript {
117117
// The number of times this RAM array has been touched (i.e., has had a READ or WRITE operation performed on it).
118118
// used for RAM records, to compute the timestamp when performing a read/write. Note that the timestamp is _not_ a
119119
// global timestamp; rather, it is a timestamp for the RAM array in question.
120-
size_t access_count = 0;
120+
uint32_t access_count = 0;
121121
// Used to check that the state hasn't changed in tests
122122
bool operator==(const RamTranscript& other) const noexcept
123123
{

barretenberg/cpp/src/barretenberg/trace_to_polynomials/trace_to_polynomials.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ std::vector<CyclicPermutation> TraceToPolynomials<Flavor>::populate_wires_and_se
7171
wires[wire_idx].at(trace_row_idx) = builder.get_variable(var_idx);
7272
// Add the address of the witness value to its corresponding copy cycle
7373
// Note that the copy_cycles are indexed by real_variable_indices.
74-
copy_cycles[real_var_idx].emplace_back(cycle_node{ wire_idx, trace_row_idx });
74+
copy_cycles.at(real_var_idx).emplace_back(cycle_node{ wire_idx, trace_row_idx });
7575
}
7676
}
7777
}

barretenberg/cpp/src/barretenberg/translator_vm/translator_circuit_builder.hpp

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -359,14 +359,9 @@ class TranslatorCircuitBuilder : public CircuitBuilderBase<bb::fr> {
359359

360360
TranslatorCircuitBuilder() = default;
361361
TranslatorCircuitBuilder(const TranslatorCircuitBuilder& other) = delete;
362-
TranslatorCircuitBuilder(TranslatorCircuitBuilder&& other) noexcept
363-
: CircuitBuilderBase(std::move(other)) {};
362+
TranslatorCircuitBuilder(TranslatorCircuitBuilder&& other) = delete;
364363
TranslatorCircuitBuilder& operator=(const TranslatorCircuitBuilder& other) = delete;
365-
TranslatorCircuitBuilder& operator=(TranslatorCircuitBuilder&& other) noexcept
366-
{
367-
CircuitBuilderBase::operator=(std::move(other));
368-
return *this;
369-
};
364+
TranslatorCircuitBuilder& operator=(TranslatorCircuitBuilder&& other) = delete;
370365
~TranslatorCircuitBuilder() override = default;
371366

372367
/**

0 commit comments

Comments
 (0)