15 auto replace_and_check_zero_scaling = [&](uint32_t&
index,
const FF& scaling) {
16 if (
index == bb::stdlib::IS_CONSTANT) {
18 BB_ASSERT_EQ(scaling,
FF(0),
"mul_quad_ gate with IS_CONSTANT witness index has non-zero scaling");
23 bb::stdlib::IS_CONSTANT,
24 "mul_quad_ gate cannot have IS_CONSTANT for witness a. An error here probably means a conversion "
25 "issue in acir_to_constraint_buf.");
26 replace_and_check_zero_scaling(mul_quad.
b, mul_quad.
b_scaling);
27 replace_and_check_zero_scaling(mul_quad.
c, mul_quad.
c_scaling);
28 replace_and_check_zero_scaling(mul_quad.
d, mul_quad.
d_scaling);
31template <
typename Builder>
44 builder.failure(
"mul_add_gate");
55 builder.create_big_mul_add_gate(mul_quad);
64 uint32_t next_w4_wire_idx = 0;
67 for (
size_t j = 0; j < big_constraint.size() - 1; ++j) {
71 builder.create_big_mul_add_gate(big_constraint[j],
true);
73 next_w4_wire_value =
builder.get_variable(big_constraint[j].
a) *
builder.get_variable(big_constraint[j].
b) *
74 big_constraint[j].mul_scaling +
75 builder.get_variable(big_constraint[j].
a) * big_constraint[j].a_scaling +
76 builder.get_variable(big_constraint[j].
b) * big_constraint[j].b_scaling +
77 builder.get_variable(big_constraint[j].c) * big_constraint[j].c_scaling +
78 builder.get_variable(big_constraint[j].d) * big_constraint[j].d_scaling +
79 big_constraint[j].const_scaling;
80 next_w4_wire_value = -next_w4_wire_value;
81 next_w4_wire_idx =
builder.add_variable(next_w4_wire_value);
85 big_constraint[j + 1].d = next_w4_wire_idx;
86 big_constraint[j + 1].d_scaling =
fr(-1);
91 builder.create_big_mul_add_gate(big_constraint.back(),
false);
#define BB_ASSERT_NEQ(actual, expected,...)
#define BB_ASSERT_EQ(actual, expected,...)
bb::field< bb::Bn254FrParams > FF
typename ExecutionTrace::FF FF
field< Bn254FrParams > fr
static constexpr field zero()