barretenberg
Loading...
Searching...
No Matches
uint.hpp
1#pragma once
2
3#include "./types.hpp"
4
5#include "barretenberg/numeric/bitop/rotate.hpp"
6
7namespace plookup {
8namespace uint_tables {
9
10template <uint64_t bits_per_slice, uint64_t num_rotated_output_bits>
11inline std::array<barretenberg::fr, 2> get_xor_rotate_values_from_key(const std::array<uint64_t, 2> key)
12{
13 return { numeric::rotate64(key[0] ^ key[1], num_rotated_output_bits), 0ULL };
14}
15
16template <uint64_t bits_per_slice, uint64_t num_rotated_output_bits>
17inline BasicTable generate_xor_rotate_table(BasicTableId id, const size_t table_index)
18{
19 const uint64_t base = 1UL << bits_per_slice;
20 BasicTable table;
21 table.id = id;
22 table.table_index = table_index;
23 table.size = base * base;
24 table.use_twin_keys = true;
25
26 for (uint64_t i = 0; i < base; ++i) {
27 for (uint64_t j = 0; j < base; ++j) {
28 table.column_1.emplace_back(i);
29 table.column_2.emplace_back(j);
30 table.column_3.emplace_back(numeric::rotate64(i ^ j, num_rotated_output_bits));
31 }
32 }
33
34 table.get_values_from_key = &get_xor_rotate_values_from_key<bits_per_slice, num_rotated_output_bits>;
35
36 table.column_1_step_size = base;
37 table.column_2_step_size = base;
38 table.column_3_step_size = base;
39
40 return table;
41}
42
43template <uint64_t bits_per_slice, uint64_t num_rotated_output_bits>
44inline std::array<barretenberg::fr, 2> get_and_rotate_values_from_key(const std::array<uint64_t, 2> key)
45{
46 return { numeric::rotate64(key[0] & key[1], num_rotated_output_bits), 0ULL };
47}
48
49template <uint64_t bits_per_slice, uint64_t num_rotated_output_bits>
50inline BasicTable generate_and_rotate_table(BasicTableId id, const size_t table_index)
51{
52 const uint64_t base = 1UL << bits_per_slice;
53 BasicTable table;
54 table.id = id;
55 table.table_index = table_index;
56 table.size = base * base;
57 table.use_twin_keys = true;
58
59 for (uint64_t i = 0; i < base; ++i) {
60 for (uint64_t j = 0; j < base; ++j) {
61 table.column_1.emplace_back(i);
62 table.column_2.emplace_back(j);
63 table.column_3.emplace_back(numeric::rotate64(i & j, num_rotated_output_bits));
64 }
65 }
66
67 table.get_values_from_key = &get_and_rotate_values_from_key<bits_per_slice, num_rotated_output_bits>;
68
69 table.column_1_step_size = base;
70 table.column_2_step_size = base;
71 table.column_3_step_size = base;
72
73 return table;
74}
75
76inline MultiTable get_uint32_xor_table(const MultiTableId id = UINT32_XOR)
77{
78 const size_t num_entries = (32 + 5) / 6;
79 const uint64_t base = 1 << 6;
80 MultiTable table(base, base, base, num_entries);
81
82 table.id = id;
83 for (size_t i = 0; i < num_entries; ++i) {
84 table.slice_sizes.emplace_back(base);
85 table.lookup_ids.emplace_back(UINT_XOR_ROTATE0);
86 table.get_table_values.emplace_back(&get_xor_rotate_values_from_key<6, 0>);
87 }
88 return table;
89}
90
91inline MultiTable get_uint32_and_table(const MultiTableId id = UINT32_AND)
92{
93 const size_t num_entries = (32 + 5) / 6;
94 const uint64_t base = 1 << 6;
95 MultiTable table(base, base, base, num_entries);
96
97 table.id = id;
98 for (size_t i = 0; i < num_entries; ++i) {
99 table.slice_sizes.emplace_back(base);
100 table.lookup_ids.emplace_back(UINT_AND_ROTATE0);
101 table.get_table_values.emplace_back(&get_and_rotate_values_from_key<6, 0>);
102 }
103 return table;
104}
105
106} // namespace uint_tables
107} // namespace plookup