9#include "../circuit_builders/circuit_builders.hpp"
28 _index_initialized.resize(table_size);
29 for (
size_t i = 0; i < _index_initialized.size(); ++i) {
30 _index_initialized[i] =
false;
49 for (
const auto& entry : table_entries) {
50 if (entry.get_context() !=
nullptr) {
51 _context = entry.get_context();
55 _raw_entries = table_entries;
56 _length = _raw_entries.size();
57 _index_initialized.resize(_length);
58 for (
size_t i = 0; i < _index_initialized.size(); ++i) {
59 _index_initialized[i] =
false;
67 _tags.resize(_length);
68 for (
size_t i = 0; i < _length; i++) {
69 _tags[i] = table_entries[i].get_origin_tag();
84 if (_ram_table_generated_in_builder) {
87 ASSERT(_context !=
nullptr);
88 _ram_id = _context->create_RAM_array(_length);
90 if (_raw_entries.size() > 0) {
91 for (
size_t i = 0; i < _length; ++i) {
92 if (!_index_initialized[i]) {
94 if (_raw_entries[i].is_constant()) {
96 _context->put_constant_variable(_raw_entries[i].get_value()));
101 _index_initialized[i] =
true;
107 _tags.resize(_length);
108 if (_raw_entries.size() > 0) {
109 for (
size_t i = 0; i < _length; i++) {
113 _ram_table_generated_in_builder =
true;
122template <
typename Builder>
124 : _raw_entries(other._raw_entries)
126 , _index_initialized(other._index_initialized)
127 , _length(other._length)
128 , _ram_id(other._ram_id)
129 , _ram_table_generated_in_builder(other._ram_table_generated_in_builder)
130 , _all_entries_written_to_with_constant_index(other._all_entries_written_to_with_constant_index)
131 , _context(other._context)
140template <
typename Builder>
142 : _raw_entries(other._raw_entries)
144 , _index_initialized(other._index_initialized)
145 , _length(other._length)
146 , _ram_id(other._ram_id)
147 , _ram_table_generated_in_builder(other._ram_table_generated_in_builder)
148 , _all_entries_written_to_with_constant_index(other._all_entries_written_to_with_constant_index)
149 , _context(other._context)
183 _length = other._length;
184 _ram_id = other._ram_id;
185 _index_initialized = other._index_initialized;
186 _ram_table_generated_in_builder = other._ram_table_generated_in_builder;
187 _all_entries_written_to_with_constant_index = other._all_entries_written_to_with_constant_index;
188 _context = other._context;
202 if (_context ==
nullptr) {
206 if (native_index >= _length) {
211 _context->failure(
"ram_table: RAM array access out of bounds");
216 if (!check_indices_initialized()) {
217 _context->failure(
"ram_table: must write to every RAM entry at least once (with constant index value) before "
218 "table can be read");
229 const size_t cast_index =
static_cast<size_t>(
static_cast<uint64_t
>(native_index));
231 if (native_index < _length) {
232 element.set_origin_tag(_tags[cast_index]);
246 if (_context ==
nullptr) {
255 _context->failure(
"ram_table: RAM array access out of bounds");
265 if (!check_indices_initialized()) {
266 _context->failure(
"ram_table: must write to every RAM entry at least once (with constant index value) "
267 "before table can be written to at an unknown index");
272 auto native_value =
value.get_value();
273 if (
value.is_constant()) {
277 const size_t cast_index =
static_cast<size_t>(
static_cast<uint64_t
>(native_index));
278 if (index.
is_constant() && _index_initialized[cast_index] ==
false) {
281 _index_initialized[cast_index] =
true;
283 _context->write_RAM_array(
288 if (native_index < _length) {
289 _tags[cast_index] =
value.get_origin_tag();
#define ASSERT(expression,...)
static field_t from_witness_index(Builder *ctx, uint32_t witness_index)
Builder * get_context() const
OriginTag get_origin_tag() const
bb::fr get_value() const
Given a := *this, compute its value given by a.v * a.mul + a.add.
field_t normalize() const
Return a new element, where the in-circuit witness contains the actual represented value (multiplicat...
uint32_t get_normalized_witness_index() const
Get the index of a normalized version of this element.
uint32_t get_witness_index() const
Get the witness index of the current field element.
ram_table & operator=(const ram_table &other)
Copy assignment operator.
std::vector< bool > _index_initialized
bool _ram_table_generated_in_builder
field_pt read(const field_pt &index) const
Read a field element from the RAM table at an index value.
std::vector< field_pt > _raw_entries
bool _all_entries_written_to_with_constant_index
std::vector< OriginTag > _tags
void write(const field_pt &index, const field_pt &value)
Write a field element from the RAM table at an index value.
void initialize_table() const
internal method, is used to call Builder methods that will generate RAM table.
Contains all the headers required to adequately compile the types defined in circuit_builders_fwd....
std::conditional_t< IsGoblinBigGroup< C, Fq, Fr, G >, element_goblin::goblin_element< C, goblin_field< C >, Fr, G >, element_default::element< C, Fq, Fr, G > > element
element wraps either element_default::element or element_goblin::goblin_element depending on parametr...
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
This file contains part of the logic for the Origin Tag mechanism that tracks the use of in-circuit p...