9#include "../circuit_builders/circuit_builders.hpp"
16template <
typename Builder>
18 : raw_entries(table_entries)
19 , length(raw_entries.size())
22 for (
const auto& entry : table_entries) {
23 if (entry[0].get_context() !=
nullptr) {
24 context = entry[0].get_context();
27 if (entry[1].get_context() !=
nullptr) {
28 context = entry[1].get_context();
40 for (
size_t i = 0; i < length; ++i) {
41 _tags[i] = { raw_entries[i][0].get_origin_tag(), raw_entries[i][1].get_origin_tag() };
54 BB_ASSERT_EQ(
context !=
nullptr,
true,
"twin_rom_table: context must be set before initializing the table");
57 for (
const auto& entry : raw_entries) {
60 if (entry[0].is_constant()) {
65 if (entry[1].is_constant()) {
74 rom_id =
context->create_ROM_array(length);
76 for (
size_t i = 0; i < length; ++i) {
78 rom_id, i, std::array<uint32_t, 2>{ entries[i][0].get_witness_index(), entries[i][1].get_witness_index() });
83 for (
size_t i = 0; i < length; ++i) {
84 _tags[i] = { raw_entries[i][0].
get_origin_tag(), raw_entries[i][1].get_origin_tag() };
91template <
typename Builder>
93 : raw_entries(
std::move(other.raw_entries))
96 , length(other.length)
97 , rom_id(other.rom_id)
98 , initialized(other.initialized)
103 other.initialized =
false;
104 other.context =
nullptr;
107template <
typename Builder>
112 if (
this != &other) {
113 raw_entries =
std::move(other.raw_entries);
116 length = other.length;
117 rom_id = other.rom_id;
118 initialized = other.initialized;
123 other.initialized =
false;
124 other.context =
nullptr;
129template <
typename Builder>
132 if (
index >= length) {
134 context->failure(
"twin_rom_table: ROM array access out of bounds");
135 return raw_entries[0];
138 return raw_entries[
index];
141template <
typename Builder>
144 if (
index.is_constant()) {
154 context->failure(
"twin_rom_table: ROM array access out of bounds");
159 auto output_indices =
context->read_ROM_array_pair(rom_id,
index.get_witness_index());
166 const size_t cast_index =
static_cast<size_t>(
static_cast<uint64_t
>(native_index));
168 if (native_index < length) {
169 pair[0].set_origin_tag(_tags[cast_index][0]);
170 pair[1].set_origin_tag(_tags[cast_index][1]);
#define BB_ASSERT(expression,...)
#define BB_ASSERT_EQ(actual, expected,...)
static field_t from_witness_index(Builder *ctx, uint32_t witness_index)
OriginTag get_origin_tag() const
std::array< field_pt, 2 > field_pair_pt
StrictMock< MockContext > context
Entry point for Barretenberg command-line interface.
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept