openvm_continuations/circuit/inner/
mod.rs

1use std::sync::Arc;
2
3use itertools::Itertools;
4use openvm_recursion_circuit::{prelude::F, system::AggregationSubCircuit};
5use openvm_stark_backend::{AirRef, StarkProtocolConfig};
6use openvm_verify_stark_host::pvs::{DeferralPvs, VmPvs, DEF_PVS_AIR_ID, VM_PVS_AIR_ID};
7
8use crate::{
9    circuit::{
10        inner::{
11            bus::PvsAirConsistencyBus,
12            def_pvs::DeferralPvsAir,
13            unset::UnsetPvsAir,
14            verifier::{VerifierDeferralConfig, VerifierPvsAir},
15        },
16        subair::HashSliceSubAir,
17        Circuit,
18    },
19    CommitBytes,
20};
21
22pub mod app {
23    pub use openvm_circuit::arch::{
24        CONNECTOR_AIR_ID, MERKLE_AIR_ID, PROGRAM_AIR_ID, PROGRAM_CACHED_TRACE_INDEX,
25    };
26}
27
28pub mod bus;
29pub mod def_pvs;
30pub mod unset;
31pub mod verifier;
32pub mod vm_pvs;
33
34mod trace;
35pub use trace::*;
36
37#[derive(derive_new::new, Clone)]
38pub struct InnerCircuit<S: AggregationSubCircuit> {
39    pub verifier_circuit: Arc<S>,
40    pub def_hook_cached_commit: Option<CommitBytes>,
41}
42
43impl<SC: StarkProtocolConfig<F = F>, S: AggregationSubCircuit> Circuit<SC> for InnerCircuit<S> {
44    fn airs(&self) -> Vec<AirRef<SC>> {
45        let bus_inventory = self.verifier_circuit.bus_inventory();
46        let public_values_bus = bus_inventory.public_values_bus;
47        let cached_commit_bus = bus_inventory.cached_commit_bus;
48        let pre_hash_bus = bus_inventory.pre_hash_bus;
49        let poseidon2_compress_bus = bus_inventory.poseidon2_compress_bus;
50        let poseidon2_permute_bus = bus_inventory.poseidon2_permute_bus;
51        let range_bus = bus_inventory.range_checker_bus;
52        let pvs_air_consistency_bus =
53            PvsAirConsistencyBus::new(self.verifier_circuit.next_bus_idx());
54
55        let deferral_enabled = self.def_hook_cached_commit.is_some();
56
57        let deferral_config = if deferral_enabled {
58            VerifierDeferralConfig::Enabled {
59                hash_slice_subair: HashSliceSubAir {
60                    compress_bus: poseidon2_compress_bus,
61                    permute_bus: poseidon2_permute_bus,
62                },
63            }
64        } else {
65            VerifierDeferralConfig::Disabled
66        };
67
68        let verifier_pvs_air = Arc::new(VerifierPvsAir {
69            public_values_bus,
70            cached_commit_bus,
71            pre_hash_bus,
72            range_bus,
73            pvs_air_consistency_bus,
74            deferral_config,
75        });
76
77        let vm_pvs_air = Arc::new(vm_pvs::VmPvsAir {
78            public_values_bus,
79            cached_commit_bus,
80            pvs_air_consistency_bus,
81            deferral_enabled,
82        });
83
84        let (idx2_air, other_airs) = if deferral_enabled {
85            let def_pvs_air = Arc::new(DeferralPvsAir {
86                public_values_bus,
87                cached_commit_bus,
88                poseidon2_bus: poseidon2_compress_bus,
89                range_bus,
90                pvs_air_consistency_bus,
91                expected_def_hook_cached_commit: self.def_hook_cached_commit.unwrap(),
92            }) as AirRef<SC>;
93            let unset_vm_pvs_air = Arc::new(UnsetPvsAir {
94                public_values_bus,
95                pvs_air_consistency_bus,
96                air_idx: VM_PVS_AIR_ID,
97                num_pvs: VmPvs::<u8>::width(),
98                def_flag: 1,
99            }) as AirRef<SC>;
100            let unset_def_pvs_air = Arc::new(UnsetPvsAir {
101                public_values_bus,
102                pvs_air_consistency_bus,
103                air_idx: DEF_PVS_AIR_ID,
104                num_pvs: DeferralPvs::<u8>::width(),
105                def_flag: 0,
106            }) as AirRef<SC>;
107            (def_pvs_air, vec![unset_vm_pvs_air, unset_def_pvs_air])
108        } else {
109            let unset_dummy_air = Arc::new(UnsetPvsAir {
110                public_values_bus,
111                pvs_air_consistency_bus,
112                air_idx: 0,
113                num_pvs: 0,
114                def_flag: 0,
115            }) as AirRef<SC>;
116            (unset_dummy_air, vec![])
117        };
118
119        [
120            verifier_pvs_air as AirRef<SC>,
121            vm_pvs_air as AirRef<SC>,
122            idx2_air,
123        ]
124        .into_iter()
125        .chain(self.verifier_circuit.airs())
126        .chain(other_airs)
127        .collect_vec()
128    }
129}