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) {
33 for (
size_t i = 0; i < length; ++i) {
34 _tags[i] = { raw_entries[i][0].get_origin_tag(), raw_entries[i][1].get_origin_tag() };
47 BB_ASSERT_EQ(
context !=
nullptr,
true,
"twin_rom_table: context must be set before initializing the table");
50 for (
const auto& entry : raw_entries) {
53 if (entry[0].is_constant()) {
58 if (entry[1].is_constant()) {
67 rom_id =
context->create_ROM_array(length);
69 for (
size_t i = 0; i < length; ++i) {
71 rom_id, i, std::array<uint32_t, 2>{ entries[i][0].get_witness_index(), entries[i][1].get_witness_index() });
76 for (
size_t i = 0; i < length; ++i) {
77 _tags[i] = { raw_entries[i][0].
get_origin_tag(), raw_entries[i][1].get_origin_tag() };
84template <
typename Builder>
86 : raw_entries(
std::move(other.raw_entries))
89 , length(other.length)
90 , rom_id(other.rom_id)
91 , initialized(other.initialized)
96 other.initialized =
false;
97 other.context =
nullptr;
100template <
typename Builder>
105 if (
this != &other) {
106 raw_entries =
std::move(other.raw_entries);
109 length = other.length;
110 rom_id = other.rom_id;
111 initialized = other.initialized;
116 other.initialized =
false;
117 other.context =
nullptr;
122template <
typename Builder>
126 return raw_entries[
index];
129template <
typename Builder>
133 BB_ASSERT_LT(native_index, length,
"twin_rom_table: ROM array access out of bounds");
135 if (
index.is_constant()) {
137 return operator[](
static_cast<size_t>(
static_cast<uint64_t
>(native_index)));
145 auto output_indices =
context->read_ROM_array_pair(rom_id,
index.get_witness_index());
152 const size_t cast_index =
static_cast<size_t>(
static_cast<uint64_t
>(native_index));
154 if (native_index < length) {
155 pair[0].set_origin_tag(_tags[cast_index][0]);
156 pair[1].set_origin_tag(_tags[cast_index][1]);
#define BB_ASSERT_EQ(actual, expected,...)
#define BB_ASSERT_LT(left, right,...)
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
T * validate_context(T *ptr)
Entry point for Barretenberg command-line interface.
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept