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));
80 EXPECT_EQ(
builder.blocks.lookup.q_lookup()[i],
fr(1));
81 EXPECT_EQ(
builder.blocks.lookup.q_1()[i],
fr(0));
82 EXPECT_EQ(
builder.blocks.lookup.q_4()[i],
fr(0));
94 const auto table_id1 = plookup::BasicTableId::UINT_XOR_SLICE_6_ROTATE_0;
95 const auto table_id2 = plookup::BasicTableId::UINT_XOR_SLICE_2_ROTATE_0;
96 const auto table_id3 = plookup::BasicTableId::UINT_AND_SLICE_6_ROTATE_0;
99 auto& table1 =
builder.get_table(table_id1);
100 auto& table2 =
builder.get_table(table_id2);
101 auto& table1_again =
builder.get_table(table_id1);
102 auto& table3 =
builder.get_table(table_id3);
105 EXPECT_EQ(&table1, &table1_again);
108 EXPECT_EQ(table1.id, table_id1);
109 EXPECT_EQ(table2.id, table_id2);
110 EXPECT_EQ(table1_again.id, table_id1);
111 EXPECT_EQ(table3.id, table_id3);
114 EXPECT_EQ(table1.table_index, 0UL);
115 EXPECT_EQ(table2.table_index, 1UL);
116 EXPECT_EQ(table1_again.table_index, 0UL);
117 EXPECT_EQ(table3.table_index, 2UL);
120 EXPECT_EQ(
builder.get_num_lookup_tables(), 3UL);
132 const auto a_idx =
builder.add_variable(a_value);
135 const auto accumulators =
137 const auto result =
builder.create_gates_from_plookup_accumulators(
138 plookup::MultiTableId::HONK_DUMMY_MULTI, accumulators, a_idx,
std::nullopt);
141 EXPECT_EQ(result[ColumnIdx::C1][0], a_idx);
144 EXPECT_NE(result[ColumnIdx::C2][0], a_idx);
145 EXPECT_NE(result[ColumnIdx::C3][0], a_idx);
155 const fr a_value(33);
156 const fr b_value(44);
157 const auto a_idx =
builder.add_variable(a_value);
158 const auto b_idx =
builder.add_variable(b_value);
160 const auto accumulators =
170 for (
const auto& table_id : multi_table.basic_table_ids) {
171 if (initial_sizes.find(table_id) == initial_sizes.end()) {
172 auto& table =
builder.get_table(table_id);
173 initial_sizes[table_id] = table.lookup_gates.size();
174 expected_additions[table_id] = 0;
176 expected_additions[table_id]++;
179 builder.create_gates_from_plookup_accumulators(plookup::MultiTableId::UINT32_XOR, accumulators, a_idx, b_idx);
182 for (
const auto& [table_id, initial_size] : initial_sizes) {
183 auto& table =
builder.get_table(table_id);
184 EXPECT_EQ(table.lookup_gates.size(), initial_size + expected_additions[table_id]);
193 auto test_corrupt_accumulator = [](ColumnIdx column,
size_t position) {
196 const fr a_value(123);
197 const fr b_value(456);
198 const auto a_idx =
builder.add_variable(a_value);
199 const auto b_idx =
builder.add_variable(b_value);
205 accumulators[column][position] +=
fr(1);
207 builder.create_gates_from_plookup_accumulators(plookup::MultiTableId::UINT32_XOR, accumulators, a_idx, b_idx);
214 const size_t num_lookups = 6;
217 for (
size_t i = 0; i < num_lookups; ++i) {
222 test_corrupt_accumulator(ColumnIdx::C1, i);
223 test_corrupt_accumulator(ColumnIdx::C2, i);
226 test_corrupt_accumulator(ColumnIdx::C3, i);
233 const fr a_value(123);
234 const fr b_value(456);
237 const auto accumulators =
245 const fr bad_a_value(666);
246 const auto bad_a_idx =
builder.add_variable(bad_a_value);
247 const auto b_idx =
builder.add_variable(b_value);
249 builder.create_gates_from_plookup_accumulators(
250 plookup::MultiTableId::UINT32_XOR, accumulators, bad_a_idx, b_idx);
261 const fr bad_b_value(666);
262 const auto a_idx =
builder.add_variable(a_value);
263 const auto bad_b_idx =
builder.add_variable(bad_b_value);
265 builder.create_gates_from_plookup_accumulators(
266 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.