89 bool has_valid_witness_assignments = !program.
witness.empty();
93 if (collect_gates_per_opcode) {
102 builder.create_poly_gate(constraint);
109 builder.create_big_mul_gate(constraint);
116 fr next_w4_wire_value =
fr(0);
118 for (
size_t j = 0; j < big_constraint.size() - 1; ++j) {
120 next_w4_wire_value =
builder.get_variable(big_constraint[0].d);
122 uint32_t next_w4_wire =
builder.add_variable(next_w4_wire_value);
123 big_constraint[j].d = next_w4_wire;
124 big_constraint[j].d_scaling =
fr(-1);
126 builder.create_big_mul_add_gate(big_constraint[j],
true);
127 next_w4_wire_value =
builder.get_variable(big_constraint[j].
a) *
builder.get_variable(big_constraint[j].
b) *
128 big_constraint[j].mul_scaling +
129 builder.get_variable(big_constraint[j].
a) * big_constraint[j].a_scaling +
130 builder.get_variable(big_constraint[j].
b) * big_constraint[j].b_scaling +
131 builder.get_variable(big_constraint[j].c) * big_constraint[j].c_scaling +
132 next_w4_wire_value * big_constraint[j].d_scaling + big_constraint[j].const_scaling;
133 next_w4_wire_value = -next_w4_wire_value;
135 uint32_t next_w4_wire =
builder.add_variable(next_w4_wire_value);
136 big_constraint.back().d = next_w4_wire;
137 big_constraint.back().d_scaling =
fr(-1);
138 builder.create_big_mul_add_gate(big_constraint.back(),
false);
145 builder, constraint.a, constraint.b, constraint.result, constraint.num_bits, constraint.is_xor_gate);
152 for (
auto const& index_range : constraint_system.
index_range) {
153 if (constraint_system.
minimal_range[index_range.first] == index_range.second) {
159 uint32_t range = constraint.num_bits;
160 if (constraint_system.
minimal_range.contains(constraint.witness)) {
162 builder.create_range_constraint(constraint.witness, range,
"");
189 create_ecdsa_verify_constraints<stdlib::secp256k1<Builder>>(
builder, constraint, has_valid_witness_assignments);
197 create_ecdsa_verify_constraints<stdlib::secp256r1<Builder>>(
builder, constraint, has_valid_witness_assignments);
253 if (collect_gates_per_opcode) {
254 size_t avg_gates_per_opcode =
265 builder.assert_equal(constraint.a, constraint.b);
278 BB_ASSERT_EQ(!has_honk_recursion_constraints || !has_pg_recursion_constraints,
280 "Invalid circuit: both honk and ivc recursion constraints present.");
283 if (has_avm_recursion_constraints) {
284 info(
"WARNING: this circuit contains unhandled avm_recursion_constraints!");
287 if (has_honk_recursion_constraints) {
289 builder, constraint_system, has_valid_witness_assignments, gate_counter);
295 }
else if (has_pg_recursion_constraints) {
297 builder, constraint_system, metadata.
ivc, has_valid_witness_assignments, gate_counter);
304 bool has_pairing_points =
305 has_honk_recursion_constraints || has_civc_recursion_constraints || has_avm_recursion_constraints;
316 "Invalid circuit: pg recursion constraints are present with UltraBuilder.");
317 BB_ASSERT_EQ(!(has_civc_recursion_constraints && has_honk_recursion_constraints),
319 "Invalid circuit: both honk and civc recursion constraints are present.");
321 !(has_honk_recursion_constraints || has_civc_recursion_constraints || has_avm_recursion_constraints) ||
322 is_recursive_circuit,
324 "Invalid circuit: honk, civc, or avm recursion constraints present but the circuit is not recursive.");
325 if (has_civc_recursion_constraints && has_avm_recursion_constraints) {
326 vinfo(
"WARNING: both civc and avm recursion constraints are present. While we support this combination, we "
327 "expect to see it only in a mock "
334 if (has_honk_recursion_constraints) {
336 builder, constraint_system, has_valid_witness_assignments, gate_counter);
339 if (has_civc_recursion_constraints) {
341 builder, constraint_system, has_valid_witness_assignments, gate_counter);
344#ifndef DISABLE_AZTEC_VM
345 if (has_avm_recursion_constraints) {
347 builder, constraint_system, has_valid_witness_assignments, gate_counter);
360 if (has_pairing_points) {
367 auto [ipa_claim, ipa_proof] =
374 ipa_claim.set_public();
380 if (has_pairing_points) {
395 static_cast<size_t>(0),
396 "IPA proofs present when not expected.");
540 bool has_valid_witness_assignments,
551 ivc->verification_queue.size(),
552 "WARNING: Mismatch in number of recursive verifications during kernel creation!");
556 if (!has_valid_witness_assignments) {
558 for (
auto [constraint, queue_entry] :
561 builder.set_variable(constraint.key_hash, queue_entry.honk_vk->hash());
572 StdlibVerificationKey::from_witness_indices(
builder, constraint.key)),
573 StdlibFF::from_witness_index(&
builder, constraint.key_hash)));
576 ivc->instantiate_stdlib_verification_queue(
builder, stdlib_vk_and_hashs);
582 for (
auto [constraint, queue_entry] :
586 std::vector<uint32_t> public_input_indices =
588 constraint.public_inputs.size());
591 for (
auto [witness_idx, constraint_witness_idx] :
592 zip_view(public_input_indices, constraint.public_inputs)) {
593 builder.assert_equal(witness_idx, constraint_witness_idx);
598 ivc->complete_kernel_circuit_logic(
builder);
608 if (ivc_base ==
nullptr) {
611 process_with_ivc(mock_ivc);
615 process_with_ivc(mock_ivc);
621 process_with_ivc(sumcheck_ivc);
624 process_with_ivc(ivc);