25 const auto a_idx =
builder.add_variable(a_value);
26 const auto b_idx =
builder.add_variable(b_value);
28 const auto accumulators =
31 builder.create_gates_from_plookup_accumulators(plookup::MultiTableId::UINT32_XOR, accumulators, a_idx, b_idx);
34 EXPECT_EQ(
result[ColumnIdx::C1][0], a_idx);
35 EXPECT_EQ(
result[ColumnIdx::C2][0], b_idx);
38 EXPECT_EQ(
result[ColumnIdx::C1].size(), 6UL);
39 EXPECT_EQ(
result[ColumnIdx::C2].size(), 6UL);
40 EXPECT_EQ(
result[ColumnIdx::C3].size(), 6UL);
41 EXPECT_EQ(
builder.blocks.lookup.size(), 6UL);
54 const auto a_idx =
builder.add_variable(a_value);
55 const auto b_idx =
builder.add_variable(b_value);
57 const auto accumulators =
59 builder.create_gates_from_plookup_accumulators(plookup::MultiTableId::UINT32_XOR, accumulators, a_idx, b_idx);
62 const size_t num_lookups = multi_table.column_1_step_sizes.size();
65 for (
size_t i = 0; i < num_lookups - 1; ++i) {
66 EXPECT_EQ(
builder.blocks.lookup.q_2()[i], -multi_table.column_1_step_sizes[i + 1]);
67 EXPECT_EQ(
builder.blocks.lookup.q_m()[i], -multi_table.column_2_step_sizes[i + 1]);
68 EXPECT_EQ(
builder.blocks.lookup.q_c()[i], -multi_table.column_3_step_sizes[i + 1]);
72 const size_t last_idx = num_lookups - 1;
73 EXPECT_EQ(
builder.blocks.lookup.q_2()[last_idx],
fr(0));
74 EXPECT_EQ(
builder.blocks.lookup.q_m()[last_idx],
fr(0));
75 EXPECT_EQ(
builder.blocks.lookup.q_c()[last_idx],
fr(0));
78 for (
size_t i = 0; i < num_lookups; ++i) {
79 const auto& table =
builder.get_table(multi_table.basic_table_ids[i]);
80 EXPECT_EQ(
builder.blocks.lookup.q_3()[i],
fr(table.table_index));
83 EXPECT_EQ(
builder.blocks.lookup.q_1()[i],
fr(0));
84 EXPECT_EQ(
builder.blocks.lookup.q_4()[i],
fr(0));
96 const auto table_id1 = plookup::BasicTableId::UINT_XOR_SLICE_6_ROTATE_0;
97 const auto table_id2 = plookup::BasicTableId::UINT_XOR_SLICE_2_ROTATE_0;
98 const auto table_id3 = plookup::BasicTableId::UINT_AND_SLICE_6_ROTATE_0;
101 auto& table1 =
builder.get_table(table_id1);
102 auto& table2 =
builder.get_table(table_id2);
103 auto& table1_again =
builder.get_table(table_id1);
104 auto& table3 =
builder.get_table(table_id3);
107 EXPECT_EQ(&table1, &table1_again);
110 EXPECT_EQ(table1.id, table_id1);
111 EXPECT_EQ(table2.id, table_id2);
112 EXPECT_EQ(table1_again.id, table_id1);
113 EXPECT_EQ(table3.id, table_id3);
116 EXPECT_EQ(table1.table_index, 1UL);
117 EXPECT_EQ(table2.table_index, 2UL);
118 EXPECT_EQ(table1_again.table_index, 1UL);
119 EXPECT_EQ(table3.table_index, 3UL);
122 EXPECT_EQ(
builder.get_num_lookup_tables(), 3UL);
132 for (
size_t mt = 0; mt < static_cast<size_t>(plookup::MultiTableId::NUM_MULTI_TABLES); ++mt) {
134 for (
const auto id : multitable.basic_table_ids) {
139 std::unordered_set<size_t> seen;
140 for (
const auto& table :
builder.get_lookup_tables()) {
141 EXPECT_GT(table.table_index, 0UL) <<
"non-positive index for basic table id " <<
static_cast<size_t>(table.id);
142 EXPECT_TRUE(seen.insert(table.table_index).second)
143 <<
"duplicate table_index " << table.table_index <<
" for basic table id " <<
static_cast<size_t>(table.id);
145 EXPECT_NO_THROW(
builder.finalize_circuit());
175 const auto a_idx =
builder.add_variable(a_value);
178 const auto accumulators =
180 const auto result =
builder.create_gates_from_plookup_accumulators(
181 plookup::MultiTableId::HONK_DUMMY_MULTI, accumulators, a_idx,
std::nullopt);
184 EXPECT_EQ(
result[ColumnIdx::C1][0], a_idx);
187 EXPECT_NE(
result[ColumnIdx::C2][0], a_idx);
188 EXPECT_NE(
result[ColumnIdx::C3][0], a_idx);
198 const fr a_value(33);
199 const fr b_value(44);
200 const auto a_idx =
builder.add_variable(a_value);
201 const auto b_idx =
builder.add_variable(b_value);
203 const auto accumulators =
213 for (
const auto& table_id : multi_table.basic_table_ids) {
214 if (initial_sizes.find(table_id) == initial_sizes.end()) {
215 auto& table =
builder.get_table(table_id);
216 initial_sizes[table_id] = table.lookup_gates.size();
217 expected_additions[table_id] = 0;
219 expected_additions[table_id]++;
222 builder.create_gates_from_plookup_accumulators(plookup::MultiTableId::UINT32_XOR, accumulators, a_idx, b_idx);
225 for (
const auto& [table_id, initial_size] : initial_sizes) {
226 auto& table =
builder.get_table(table_id);
227 EXPECT_EQ(table.lookup_gates.size(), initial_size + expected_additions[table_id]);
236 auto test_corrupt_accumulator = [](ColumnIdx column,
size_t position) {
239 const fr a_value(123);
240 const fr b_value(456);
241 const auto a_idx =
builder.add_variable(a_value);
242 const auto b_idx =
builder.add_variable(b_value);
248 accumulators[column][position] +=
fr(1);
250 builder.create_gates_from_plookup_accumulators(plookup::MultiTableId::UINT32_XOR, accumulators, a_idx, b_idx);
257 const size_t num_lookups = 6;
260 for (
size_t i = 0; i < num_lookups; ++i) {
265 test_corrupt_accumulator(ColumnIdx::C1, i);
266 test_corrupt_accumulator(ColumnIdx::C2, i);
269 test_corrupt_accumulator(ColumnIdx::C3, i);
276 const fr a_value(123);
277 const fr b_value(456);
280 const auto accumulators =
288 const fr bad_a_value(666);
289 const auto bad_a_idx =
builder.add_variable(bad_a_value);
290 const auto b_idx =
builder.add_variable(b_value);
292 builder.create_gates_from_plookup_accumulators(
293 plookup::MultiTableId::UINT32_XOR, accumulators, bad_a_idx, b_idx);
304 const fr bad_b_value(666);
305 const auto a_idx =
builder.add_variable(a_value);
306 const auto bad_b_idx =
builder.add_variable(bad_b_value);
308 builder.create_gates_from_plookup_accumulators(
309 plookup::MultiTableId::UINT32_XOR, accumulators, a_idx, bad_b_idx);
ReadData< bb::fr > get_lookup_accumulators(const MultiTableId id, const fr &key_a, const fr &key_b, const bool is_2_to_1_lookup)
Given a table ID and the key(s) for a key-value lookup, return the lookup accumulators.