openvm_continuations/verifier/common/
types.rs

1use std::{array, borrow::BorrowMut};
2
3use openvm_circuit::{
4    circuit_derive::AlignedBorrow,
5    system::{connector::VmConnectorPvs, memory::merkle::MemoryMerklePvs},
6};
7use openvm_native_compiler::prelude::*;
8use openvm_stark_sdk::openvm_stark_backend::p3_field::PrimeField32;
9
10#[derive(Debug, Clone, Copy)]
11pub struct SpecialAirIds {
12    pub program_air_id: usize,
13    pub connector_air_id: usize,
14    pub public_values_air_id: usize,
15}
16
17#[derive(Debug, Clone, Copy, AlignedBorrow)]
18#[repr(C)]
19pub struct VmVerifierPvs<T> {
20    /// The commitment of the app program.
21    pub app_commit: [T; DIGEST_SIZE],
22    /// The merged execution state of all the segments this circuit aggregates.
23    pub connector: VmConnectorPvs<T>,
24    /// The memory state before/after all the segments this circuit aggregates.
25    pub memory: MemoryMerklePvs<T, DIGEST_SIZE>,
26    /// The merkle root of all public values. This is only meaningful when the last segment is
27    /// aggregated by this circuit.
28    pub public_values_commit: [T; DIGEST_SIZE],
29}
30
31impl<F: PrimeField32> VmVerifierPvs<Felt<F>> {
32    pub fn uninit<C: Config<F = F>>(builder: &mut Builder<C>) -> Self {
33        Self {
34            app_commit: array::from_fn(|_| builder.uninit()),
35            connector: VmConnectorPvs {
36                initial_pc: builder.uninit(),
37                final_pc: builder.uninit(),
38                exit_code: builder.uninit(),
39                is_terminate: builder.uninit(),
40            },
41            memory: MemoryMerklePvs {
42                initial_root: array::from_fn(|_| builder.uninit()),
43                final_root: array::from_fn(|_| builder.uninit()),
44            },
45            public_values_commit: array::from_fn(|_| builder.uninit()),
46        }
47    }
48}
49
50impl<F: Default + Clone> VmVerifierPvs<Felt<F>> {
51    pub fn flatten(self) -> Vec<Felt<F>> {
52        let mut v = vec![Felt(0, Default::default()); VmVerifierPvs::<u8>::width()];
53        *v.as_mut_slice().borrow_mut() = self;
54        v
55    }
56}