13template <
typename FF_>
15 : has_dummy_witnesses_(has_dummy_witnesses)
42 return variables.size();
47 while (prev_var_index[index] != FIRST_VARIABLE_IN_CLASS) {
48 index = prev_var_index[index];
53template <
typename FF_>
56 auto cur_index = index;
58 real_variable_index[cur_index] = new_real_index;
59 cur_index = next_var_index[cur_index];
60 }
while (cur_index != REAL_VARIABLE);
65 uint32_t result =
static_cast<uint32_t
>(-1);
66 for (
size_t i = 0; i < num_public_inputs(); ++i) {
67 if (real_variable_index[public_inputs_[i]] == real_variable_index[witness_index]) {
68 result =
static_cast<uint32_t
>(i);
72 ASSERT(result !=
static_cast<uint32_t
>(-1));
76template <
typename FF_>
79 BB_ASSERT_LT(index, public_inputs_.size(),
"Index out of bounds for public inputs.");
80 return get_variable(public_inputs_[index]);
85 variables.emplace_back(in);
86 const uint32_t index =
static_cast<uint32_t
>(variables.size()) - 1U;
87 real_variable_index.emplace_back(index);
88 next_var_index.emplace_back(REAL_VARIABLE);
89 prev_var_index.emplace_back(FIRST_VARIABLE_IN_CLASS);
90 real_variable_tags.emplace_back(DUMMY_TAG);
98 uint32_t first_idx = get_first_variable_in_class(index);
100 if (variable_names.contains(first_idx)) {
101 failure(
"Attempted to assign a name to a variable that already has a name");
104 variable_names.insert({ first_idx, name });
110 if ((1UL << log2_n) != (num_gates)) {
113 return 1UL << log2_n;
118 info(
"not implemented");
124 const uint32_t index = add_variable(in);
125 BB_ASSERT_EQ(public_inputs_finalized_,
false,
"Cannot add to public inputs after they have been finalized.");
126 public_inputs_.emplace_back(index);
132 for (
const uint32_t public_input : public_inputs()) {
133 if (public_input == witness_index) {
135 failure(
"Attempted to set a public input that is already public!");
140 uint32_t public_input_index =
static_cast<uint32_t
>(num_public_inputs());
141 BB_ASSERT_EQ(public_inputs_finalized_,
false,
"Cannot add to public inputs after they have been finalized.");
142 public_inputs_.emplace_back(witness_index);
144 return public_input_index;
154template <
typename FF>
156 const uint32_t b_variable_idx,
157 std::string
const& msg)
159 assert_valid_variables({ a_variable_idx, b_variable_idx });
160 bool values_equal = (get_variable(a_variable_idx) == get_variable(b_variable_idx));
161 if (!values_equal && !failed()) {
164 uint32_t a_real_idx = real_variable_index[a_variable_idx];
165 uint32_t b_real_idx = real_variable_index[b_variable_idx];
167 if (a_real_idx == b_real_idx) {
172 auto b_start_idx = get_first_variable_in_class(b_variable_idx);
173 update_real_variable_indices(b_start_idx, a_real_idx);
175 auto a_start_idx = get_first_variable_in_class(a_variable_idx);
176 next_var_index[b_real_idx] = a_start_idx;
177 prev_var_index[a_start_idx] = b_real_idx;
178 bool no_tag_clash = (real_variable_tags[a_real_idx] == DUMMY_TAG || real_variable_tags[b_real_idx] == DUMMY_TAG ||
179 real_variable_tags[a_real_idx] == real_variable_tags[b_real_idx]);
180 if (!no_tag_clash && !failed()) {
183 if (real_variable_tags[a_real_idx] == DUMMY_TAG) {
184 real_variable_tags[a_real_idx] = real_variable_tags[b_real_idx];
188template <
typename FF_>
192 for (
const auto& variable_index : variable_indices) {
210#ifndef FUZZING_DISABLE_WARNINGS
211 if (!has_dummy_witnesses_) {
213 info(
"(Experimental) WARNING: Builder failure when we have real witnesses! Ignore if writing vk.");
#define BB_ASSERT_EQ(actual, expected,...)
#define BB_ASSERT_LT(left, right,...)
#define ASSERT(expression,...)
#define ASSERT_DEBUG(expression,...)
virtual size_t get_num_finalized_gates() const
CircuitBuilderBase(size_t size_hint=0, bool has_dummy_witnesses=false)
uint32_t get_public_input_index(const uint32_t witness_index) const
const std::string & err() const
virtual uint32_t add_variable(const FF &in)
void failure(std::string msg)
virtual msgpack::sbuffer export_circuit()
virtual uint32_t set_public_input(uint32_t witness_index)
Make a witness variable public.
std::unordered_map< uint32_t, std::string > variable_names
std::vector< uint32_t > prev_var_index
virtual size_t get_estimated_num_finalized_gates() const
void assert_valid_variables(const std::vector< uint32_t > &variable_indices)
FF get_public_input(const uint32_t index) const
std::vector< uint32_t > next_var_index
std::vector< uint32_t > real_variable_tags
std::vector< FF > variables
virtual void assert_equal(uint32_t a_idx, uint32_t b_idx, std::string const &msg="assert_equal")
virtual size_t get_num_variables() const
virtual void print_num_estimated_finalized_gates() const
virtual void set_variable_name(uint32_t index, const std::string &name)
uint32_t get_first_variable_in_class(uint32_t index) const
void update_real_variable_indices(uint32_t index, uint32_t new_real_index)
std::vector< uint32_t > real_variable_index
virtual uint32_t add_public_variable(const FF &in)
size_t get_circuit_subgroup_size(size_t num_gates) const
constexpr T get_msb(const T in)
Entry point for Barretenberg command-line interface.