571 const auto transcript_rows =
574 const auto point_table_rows =
577 msms,
builder.get_number_of_muls(),
builder.op_queue->get_num_msm_rows());
579 const auto& point_table_read_counts =
std::get<1>(result);
581 const size_t num_rows =
std::max({ point_table_rows.size(), msm_rows.size(), transcript_rows.size() }) +
582 NUM_DISABLED_ROWS_IN_SUMCHECK;
584 size_t dyadic_num_rows = 1UL << (log_num_rows + (1UL << log_num_rows == num_rows ? 0 : 1));
586 throw_or_abort(
"The ECCVM circuit size has exceeded the fixed upper bound! Fixed size: " +
592 if (disable_fixed_dyadic_trace_size) {
593 dyadic_num_rows = num_rows;
600 size_t unmasked_witness_size = dyadic_num_rows - NUM_DISABLED_ROWS_IN_SUMCHECK;
608 for (
auto& poly : get_all()) {
609 if (poly.is_empty()) {
613 lagrange_first.at(0) = 1;
614 lagrange_second.at(1) = 1;
615 lagrange_last.at(unmasked_witness_size - 1) = 1;
616 for (
size_t i = 0; i < point_table_read_counts[0].size(); ++i) {
623 lookup_read_counts_0.at(i + 1) = point_table_read_counts[0][i];
624 lookup_read_counts_1.at(i + 1) = point_table_read_counts[1][i];
629 for (size_t i = start; i < end; i++) {
630 transcript_accumulator_not_empty.set_if_valid_index(i, transcript_rows[i].accumulator_not_empty);
631 transcript_add.set_if_valid_index(i, transcript_rows[i].q_add);
632 transcript_mul.set_if_valid_index(i, transcript_rows[i].q_mul);
633 transcript_eq.set_if_valid_index(i, transcript_rows[i].q_eq);
634 transcript_reset_accumulator.set_if_valid_index(i, transcript_rows[i].q_reset_accumulator);
635 transcript_msm_transition.set_if_valid_index(i, transcript_rows[i].msm_transition);
636 transcript_pc.set_if_valid_index(i, transcript_rows[i].pc);
637 transcript_msm_count.set_if_valid_index(i, transcript_rows[i].msm_count);
638 transcript_Px.set_if_valid_index(i, transcript_rows[i].base_x);
639 transcript_Py.set_if_valid_index(i, transcript_rows[i].base_y);
640 transcript_z1.set_if_valid_index(i, transcript_rows[i].z1);
641 transcript_z2.set_if_valid_index(i, transcript_rows[i].z2);
642 transcript_z1zero.set_if_valid_index(i, transcript_rows[i].z1_zero);
643 transcript_z2zero.set_if_valid_index(i, transcript_rows[i].z2_zero);
644 transcript_op.set_if_valid_index(i, transcript_rows[i].opcode);
645 transcript_accumulator_x.set_if_valid_index(i, transcript_rows[i].accumulator_x);
646 transcript_accumulator_y.set_if_valid_index(i, transcript_rows[i].accumulator_y);
647 transcript_msm_x.set_if_valid_index(i, transcript_rows[i].msm_output_x);
648 transcript_msm_y.set_if_valid_index(i, transcript_rows[i].msm_output_y);
649 transcript_base_infinity.set_if_valid_index(i, transcript_rows[i].base_infinity);
650 transcript_base_x_inverse.set_if_valid_index(i, transcript_rows[i].base_x_inverse);
651 transcript_base_y_inverse.set_if_valid_index(i, transcript_rows[i].base_y_inverse);
652 transcript_add_x_equal.set_if_valid_index(i, transcript_rows[i].transcript_add_x_equal);
653 transcript_add_y_equal.set_if_valid_index(i, transcript_rows[i].transcript_add_y_equal);
654 transcript_add_lambda.set_if_valid_index(i, transcript_rows[i].transcript_add_lambda);
655 transcript_msm_intermediate_x.set_if_valid_index(i,
656 transcript_rows[i].transcript_msm_intermediate_x);
657 transcript_msm_intermediate_y.set_if_valid_index(i,
658 transcript_rows[i].transcript_msm_intermediate_y);
659 transcript_msm_infinity.set_if_valid_index(i, transcript_rows[i].transcript_msm_infinity);
660 transcript_msm_x_inverse.set_if_valid_index(i, transcript_rows[i].transcript_msm_x_inverse);
661 transcript_msm_count_zero_at_transition.set_if_valid_index(
662 i, transcript_rows[i].msm_count_zero_at_transition);
663 transcript_msm_count_at_transition_inverse.set_if_valid_index(
664 i, transcript_rows[i].msm_count_at_transition_inverse);
669 for (size_t i = start; i < end; i++) {
673 precompute_select.set_if_valid_index(i, (i != 0) ? 1 : 0);
674 precompute_pc.set_if_valid_index(i, point_table_rows[i].pc);
675 precompute_point_transition.set_if_valid_index(
676 i, static_cast<uint64_t>(point_table_rows[i].point_transition));
677 precompute_round.set_if_valid_index(i, point_table_rows[i].round);
678 precompute_scalar_sum.set_if_valid_index(i, point_table_rows[i].scalar_sum);
679 precompute_s1hi.set_if_valid_index(i, point_table_rows[i].s1);
680 precompute_s1lo.set_if_valid_index(i, point_table_rows[i].s2);
681 precompute_s2hi.set_if_valid_index(i, point_table_rows[i].s3);
682 precompute_s2lo.set_if_valid_index(i, point_table_rows[i].s4);
683 precompute_s3hi.set_if_valid_index(i, point_table_rows[i].s5);
684 precompute_s3lo.set_if_valid_index(i, point_table_rows[i].s6);
685 precompute_s4hi.set_if_valid_index(i, point_table_rows[i].s7);
686 precompute_s4lo.set_if_valid_index(i, point_table_rows[i].s8);
690 precompute_skew.set_if_valid_index(i, point_table_rows[i].skew ? 7 : 0);
691 precompute_dx.set_if_valid_index(i, point_table_rows[i].precompute_double.x);
692 precompute_dy.set_if_valid_index(i, point_table_rows[i].precompute_double.y);
693 precompute_tx.set_if_valid_index(i, point_table_rows[i].precompute_accumulator.x);
694 precompute_ty.set_if_valid_index(i, point_table_rows[i].precompute_accumulator.y);
700 for (size_t i = start; i < end; i++) {
701 msm_transition.set_if_valid_index(i, static_cast<int>(msm_rows[i].msm_transition));
702 msm_add.set_if_valid_index(i, static_cast<int>(msm_rows[i].q_add));
703 msm_double.set_if_valid_index(i, static_cast<int>(msm_rows[i].q_double));
704 msm_skew.set_if_valid_index(i, static_cast<int>(msm_rows[i].q_skew));
705 msm_accumulator_x.set_if_valid_index(i, msm_rows[i].accumulator_x);
706 msm_accumulator_y.set_if_valid_index(i, msm_rows[i].accumulator_y);
707 msm_pc.set_if_valid_index(i, msm_rows[i].pc);
708 msm_size_of_msm.set_if_valid_index(i, msm_rows[i].msm_size);
709 msm_count.set_if_valid_index(i, msm_rows[i].msm_count);
710 msm_round.set_if_valid_index(i, msm_rows[i].msm_round);
711 msm_add1.set_if_valid_index(i, static_cast<int>(msm_rows[i].add_state[0].add));
712 msm_add2.set_if_valid_index(i, static_cast<int>(msm_rows[i].add_state[1].add));
713 msm_add3.set_if_valid_index(i, static_cast<int>(msm_rows[i].add_state[2].add));
714 msm_add4.set_if_valid_index(i, static_cast<int>(msm_rows[i].add_state[3].add));
715 msm_x1.set_if_valid_index(i, msm_rows[i].add_state[0].point.x);
716 msm_y1.set_if_valid_index(i, msm_rows[i].add_state[0].point.y);
717 msm_x2.set_if_valid_index(i, msm_rows[i].add_state[1].point.x);
718 msm_y2.set_if_valid_index(i, msm_rows[i].add_state[1].point.y);
719 msm_x3.set_if_valid_index(i, msm_rows[i].add_state[2].point.x);
720 msm_y3.set_if_valid_index(i, msm_rows[i].add_state[2].point.y);
721 msm_x4.set_if_valid_index(i, msm_rows[i].add_state[3].point.x);
722 msm_y4.set_if_valid_index(i, msm_rows[i].add_state[3].point.y);
723 msm_collision_x1.set_if_valid_index(i, msm_rows[i].add_state[0].collision_inverse);
724 msm_collision_x2.set_if_valid_index(i, msm_rows[i].add_state[1].collision_inverse);
725 msm_collision_x3.set_if_valid_index(i, msm_rows[i].add_state[2].collision_inverse);
726 msm_collision_x4.set_if_valid_index(i, msm_rows[i].add_state[3].collision_inverse);
727 msm_lambda1.set_if_valid_index(i, msm_rows[i].add_state[0].lambda);
728 msm_lambda2.set_if_valid_index(i, msm_rows[i].add_state[1].lambda);
729 msm_lambda3.set_if_valid_index(i, msm_rows[i].add_state[2].lambda);
730 msm_lambda4.set_if_valid_index(i, msm_rows[i].add_state[3].lambda);
731 msm_slice1.set_if_valid_index(i, msm_rows[i].add_state[0].slice);
732 msm_slice2.set_if_valid_index(i, msm_rows[i].add_state[1].slice);
733 msm_slice3.set_if_valid_index(i, msm_rows[i].add_state[2].slice);
734 msm_slice4.set_if_valid_index(i, msm_rows[i].add_state[3].slice);