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()) {
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))
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);
117 rom_id = other.rom_id;
118 initialized = other.initialized;
123 other.initialized =
false;
124 other.context =
nullptr;
129template <
typename Builder>
134 context->failure(
"twin_rom_table: ROM array access out of bounds");
137 return raw_entries[
index];
140template <
typename Builder>
143 if (
index.is_constant()) {
152 context->failure(
"twin_rom_table: ROM array access out of bounds");
155 auto output_indices =
context->read_ROM_array_pair(rom_id,
index.get_witness_index());
162 const size_t cast_index =
static_cast<size_t>(
static_cast<uint64_t
>(native_index));
164 if (native_index <
length) {
165 pair[0].set_origin_tag(_tags[cast_index][0]);
166 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
uint8_t const size_t length
Entry point for Barretenberg command-line interface.
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept