openvm_continuations/circuit/inner/
mod.rs1use 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}