openvm_continuations/circuit/inner/unset/
trace.rs

1use std::borrow::BorrowMut;
2
3use openvm_cpu_backend::CpuBackend;
4use openvm_stark_backend::prover::AirProvingContext;
5use openvm_stark_sdk::config::baby_bear_poseidon2::{BabyBearPoseidon2Config, F};
6use p3_field::PrimeCharacteristicRing;
7use p3_matrix::dense::RowMajorMatrix;
8
9use crate::circuit::inner::unset::UnsetPvsCols;
10
11pub fn generate_proving_ctx(
12    unset_proof_idxs: &[usize],
13    child_is_app: bool,
14) -> AirProvingContext<CpuBackend<BabyBearPoseidon2Config>> {
15    let num_valid = if child_is_app {
16        0
17    } else {
18        unset_proof_idxs.len()
19    };
20
21    let height = num_valid.next_power_of_two();
22    let width = UnsetPvsCols::<u8>::width();
23    let mut trace = vec![F::ZERO; height * width];
24    let mut chunks = trace.chunks_exact_mut(width);
25
26    for proof_idx in unset_proof_idxs.iter().take(num_valid) {
27        let chunk = chunks.next().unwrap();
28        let cols: &mut UnsetPvsCols<F> = chunk.borrow_mut();
29        cols.is_valid = F::ONE;
30        cols.proof_idx = F::from_usize(*proof_idx);
31    }
32
33    for proof_idx in num_valid..height {
34        let chunk = chunks.next().unwrap();
35        let cols: &mut UnsetPvsCols<F> = chunk.borrow_mut();
36        cols.proof_idx = F::from_usize(proof_idx);
37    }
38
39    AirProvingContext::simple_no_pis(RowMajorMatrix::new(trace, width))
40}