8#include "../circuit_builders/circuit_builders.hpp"
13template <
typename Builder>
18 for (
const auto& entry : entries_in) {
19 if (entry.get_context() !=
nullptr) {
28 for (
const auto& entry : entries_in) {
29 if (entry.is_constant()) {
30 auto const_var_idx =
context->put_constant_variable(entry.get_value());
33 entries.emplace_back(entry.normalize());
36 context->append_to_bus_vector(bus_idx, entries.back().get_witness_index());
38 length = entries.size();
41 _tags.resize(entries_in.size());
42 for (
size_t i = 0; i < length; ++i) {
43 _tags[i] = entries_in[i].get_origin_tag();
47template <
typename Builder>
53 if (raw_index >= length) {
55 context->failure(
"bus_vector: access out of bounds");
60 uint32_t index_witness_idx = 0;
61 if (
index.is_constant()) {
62 index_witness_idx =
context->put_constant_variable(
index.get_value());
64 index_witness_idx =
index.get_witness_index();
68 uint32_t output_idx =
context->read_bus_vector(bus_idx, index_witness_idx);
72 if (raw_index < length) {
73 result.set_origin_tag(_tags[raw_index]);
#define BB_ASSERT(expression,...)
field_pt operator[](const field_pt &index) const
Read from the bus vector with a witness index value. Creates a read gate.
void set_values(const std::vector< field_pt > &entries_in)
Set the entries of the bus vector from possibly unnormalized or constant inputs.
static field_t from_witness_index(Builder *ctx, uint32_t witness_index)
StrictMock< MockContext > context
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept