24 const auto a_idx =
builder.add_variable(a_value);
25 const auto b_idx =
builder.add_variable(b_value);
27 const auto accumulators =
30 builder.create_gates_from_plookup_accumulators(plookup::MultiTableId::UINT32_XOR, accumulators, a_idx, b_idx);
33 EXPECT_EQ(result[ColumnIdx::C1][0], a_idx);
34 EXPECT_EQ(result[ColumnIdx::C2][0], b_idx);
37 EXPECT_EQ(result[ColumnIdx::C1].size(), 6UL);
38 EXPECT_EQ(result[ColumnIdx::C2].size(), 6UL);
39 EXPECT_EQ(result[ColumnIdx::C3].size(), 6UL);
40 EXPECT_EQ(
builder.blocks.lookup.size(), 6UL);
53 const auto a_idx =
builder.add_variable(a_value);
54 const auto b_idx =
builder.add_variable(b_value);
56 const auto accumulators =
58 builder.create_gates_from_plookup_accumulators(plookup::MultiTableId::UINT32_XOR, accumulators, a_idx, b_idx);
61 const size_t num_lookups = multi_table.column_1_step_sizes.size();
64 for (
size_t i = 0; i < num_lookups - 1; ++i) {
65 EXPECT_EQ(
builder.blocks.lookup.q_2()[i], -multi_table.column_1_step_sizes[i + 1]);
66 EXPECT_EQ(
builder.blocks.lookup.q_m()[i], -multi_table.column_2_step_sizes[i + 1]);
67 EXPECT_EQ(
builder.blocks.lookup.q_c()[i], -multi_table.column_3_step_sizes[i + 1]);
71 const size_t last_idx = num_lookups - 1;
72 EXPECT_EQ(
builder.blocks.lookup.q_2()[last_idx],
fr(0));
73 EXPECT_EQ(
builder.blocks.lookup.q_m()[last_idx],
fr(0));
74 EXPECT_EQ(
builder.blocks.lookup.q_c()[last_idx],
fr(0));
77 for (
size_t i = 0; i < num_lookups; ++i) {
78 const auto& table =
builder.get_table(multi_table.basic_table_ids[i]);
79 EXPECT_EQ(
builder.blocks.lookup.q_3()[i],
fr(table.table_index));
82 EXPECT_EQ(
builder.blocks.lookup.q_1()[i],
fr(0));
83 EXPECT_EQ(
builder.blocks.lookup.q_4()[i],
fr(0));
95 const auto table_id1 = plookup::BasicTableId::UINT_XOR_SLICE_6_ROTATE_0;
96 const auto table_id2 = plookup::BasicTableId::UINT_XOR_SLICE_2_ROTATE_0;
97 const auto table_id3 = plookup::BasicTableId::UINT_AND_SLICE_6_ROTATE_0;
100 auto& table1 =
builder.get_table(table_id1);
101 auto& table2 =
builder.get_table(table_id2);
102 auto& table1_again =
builder.get_table(table_id1);
103 auto& table3 =
builder.get_table(table_id3);
106 EXPECT_EQ(&table1, &table1_again);
109 EXPECT_EQ(table1.id, table_id1);
110 EXPECT_EQ(table2.id, table_id2);
111 EXPECT_EQ(table1_again.id, table_id1);
112 EXPECT_EQ(table3.id, table_id3);
115 EXPECT_EQ(table1.table_index, 0UL);
116 EXPECT_EQ(table2.table_index, 1UL);
117 EXPECT_EQ(table1_again.table_index, 0UL);
118 EXPECT_EQ(table3.table_index, 2UL);
121 EXPECT_EQ(
builder.get_num_lookup_tables(), 3UL);
133 const auto a_idx =
builder.add_variable(a_value);
136 const auto accumulators =
138 const auto result =
builder.create_gates_from_plookup_accumulators(
139 plookup::MultiTableId::HONK_DUMMY_MULTI, accumulators, a_idx,
std::nullopt);
142 EXPECT_EQ(result[ColumnIdx::C1][0], a_idx);
145 EXPECT_NE(result[ColumnIdx::C2][0], a_idx);
146 EXPECT_NE(result[ColumnIdx::C3][0], a_idx);
156 const fr a_value(33);
157 const fr b_value(44);
158 const auto a_idx =
builder.add_variable(a_value);
159 const auto b_idx =
builder.add_variable(b_value);
161 const auto accumulators =
171 for (
const auto& table_id : multi_table.basic_table_ids) {
172 if (initial_sizes.find(table_id) == initial_sizes.end()) {
173 auto& table =
builder.get_table(table_id);
174 initial_sizes[table_id] = table.lookup_gates.size();
175 expected_additions[table_id] = 0;
177 expected_additions[table_id]++;
180 builder.create_gates_from_plookup_accumulators(plookup::MultiTableId::UINT32_XOR, accumulators, a_idx, b_idx);
183 for (
const auto& [table_id, initial_size] : initial_sizes) {
184 auto& table =
builder.get_table(table_id);
185 EXPECT_EQ(table.lookup_gates.size(), initial_size + expected_additions[table_id]);
194 auto test_corrupt_accumulator = [](ColumnIdx column,
size_t position) {
197 const fr a_value(123);
198 const fr b_value(456);
199 const auto a_idx =
builder.add_variable(a_value);
200 const auto b_idx =
builder.add_variable(b_value);
206 accumulators[column][position] +=
fr(1);
208 builder.create_gates_from_plookup_accumulators(plookup::MultiTableId::UINT32_XOR, accumulators, a_idx, b_idx);
215 const size_t num_lookups = 6;
218 for (
size_t i = 0; i < num_lookups; ++i) {
223 test_corrupt_accumulator(ColumnIdx::C1, i);
224 test_corrupt_accumulator(ColumnIdx::C2, i);
227 test_corrupt_accumulator(ColumnIdx::C3, i);
234 const fr a_value(123);
235 const fr b_value(456);
238 const auto accumulators =
246 const fr bad_a_value(666);
247 const auto bad_a_idx =
builder.add_variable(bad_a_value);
248 const auto b_idx =
builder.add_variable(b_value);
250 builder.create_gates_from_plookup_accumulators(
251 plookup::MultiTableId::UINT32_XOR, accumulators, bad_a_idx, b_idx);
262 const fr bad_b_value(666);
263 const auto a_idx =
builder.add_variable(a_value);
264 const auto bad_b_idx =
builder.add_variable(bad_b_value);
266 builder.create_gates_from_plookup_accumulators(
267 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.