91 bool has_valid_witness_assignments = !program.
witness.empty();
95 if (collect_gates_per_opcode) {
104 builder.create_poly_gate(constraint);
111 builder.create_big_mul_gate(constraint);
118 fr next_w4_wire_value =
fr(0);
120 for (
size_t j = 0; j < big_constraint.size() - 1; ++j) {
122 next_w4_wire_value =
builder.get_variable(big_constraint[0].d);
124 uint32_t next_w4_wire =
builder.add_variable(next_w4_wire_value);
125 big_constraint[j].d = next_w4_wire;
126 big_constraint[j].d_scaling =
fr(-1);
128 builder.create_big_mul_add_gate(big_constraint[j],
true);
129 next_w4_wire_value =
builder.get_variable(big_constraint[j].
a) *
builder.get_variable(big_constraint[j].
b) *
130 big_constraint[j].mul_scaling +
131 builder.get_variable(big_constraint[j].
a) * big_constraint[j].a_scaling +
132 builder.get_variable(big_constraint[j].
b) * big_constraint[j].b_scaling +
133 builder.get_variable(big_constraint[j].c) * big_constraint[j].c_scaling +
134 next_w4_wire_value * big_constraint[j].d_scaling + big_constraint[j].const_scaling;
135 next_w4_wire_value = -next_w4_wire_value;
137 uint32_t next_w4_wire =
builder.add_variable(next_w4_wire_value);
138 big_constraint.back().d = next_w4_wire;
139 big_constraint.back().d_scaling =
fr(-1);
140 builder.create_big_mul_add_gate(big_constraint.back(),
false);
147 builder, constraint.a, constraint.b, constraint.result, constraint.num_bits, constraint.is_xor_gate);
154 for (
auto const& index_range : constraint_system.
index_range) {
155 if (constraint_system.
minimal_range[index_range.first] == index_range.second) {
161 uint32_t range = constraint.num_bits;
162 if (constraint_system.
minimal_range.contains(constraint.witness)) {
164 builder.create_range_constraint(constraint.witness, range,
"");
191 create_ecdsa_verify_constraints<stdlib::secp256k1<Builder>>(
builder, constraint, has_valid_witness_assignments);
199 create_ecdsa_verify_constraints<stdlib::secp256r1<Builder>>(
builder, constraint, has_valid_witness_assignments);
255 if (collect_gates_per_opcode) {
256 size_t avg_gates_per_opcode =
276 create_bigint_operations_constraint<Builder>(constraint, dsl_bigints, has_valid_witness_assignments);
291 builder.assert_equal(constraint.a, constraint.b);
304 BB_ASSERT_EQ(!has_honk_recursion_constraints || !has_pg_recursion_constraints,
306 "Invalid circuit: both honk and ivc recursion constraints present.");
309 if (has_avm_recursion_constraints) {
310 info(
"WARNING: this circuit contains unhandled avm_recursion_constraints!");
313 if (has_honk_recursion_constraints) {
315 builder, constraint_system, has_valid_witness_assignments, gate_counter);
321 }
else if (has_pg_recursion_constraints) {
323 builder, constraint_system, metadata.
ivc, has_valid_witness_assignments, gate_counter);
330 bool has_pairing_points =
331 has_honk_recursion_constraints || has_civc_recursion_constraints || has_avm_recursion_constraints;
337 "Invalid circuit: pg recursion constraints are present with UltraBuilder.");
338 BB_ASSERT_EQ(!(has_honk_recursion_constraints && has_civc_recursion_constraints),
340 "Invalid circuit: both honk and civc recursion constraints are present.");
342 !(has_honk_recursion_constraints || has_civc_recursion_constraints || has_avm_recursion_constraints) ||
343 is_recursive_circuit,
345 "Invalid circuit: honk, civc, or avm recursion constraints present but the circuit is not recursive.");
350 if (has_honk_recursion_constraints) {
352 builder, constraint_system, has_valid_witness_assignments, gate_counter);
355 if (has_civc_recursion_constraints) {
357 builder, constraint_system, has_valid_witness_assignments, gate_counter);
360#ifndef DISABLE_AZTEC_VM
361 if (has_avm_recursion_constraints) {
363 builder, constraint_system, has_valid_witness_assignments, gate_counter);
376 if (has_pairing_points) {
383 auto [ipa_claim, ipa_proof] =
390 ipa_claim.set_public();
396 if (has_pairing_points) {
411 static_cast<size_t>(0),
412 "IPA proofs present when not expected.");