openvm_continuations/circuit/deferral/inner/
mod.rs1use std::sync::Arc;
2
3use itertools::Itertools;
4use openvm_recursion_circuit::{prelude::F, system::AggregationSubCircuit};
5use openvm_stark_backend::{AirRef, StarkProtocolConfig};
6
7use crate::circuit::Circuit;
8
9pub mod bus;
10pub mod def_pvs;
11pub mod input;
12pub mod verifier;
13
14mod trace;
15pub use trace::*;
16
17#[derive(derive_new::new, Clone)]
18pub struct DeferralInnerCircuit<S: AggregationSubCircuit> {
19 pub verifier_circuit: Arc<S>,
20}
21
22impl<SC: StarkProtocolConfig<F = F>, S: AggregationSubCircuit> Circuit<SC>
23 for DeferralInnerCircuit<S>
24{
25 fn airs(&self) -> Vec<AirRef<SC>> {
26 let bus_inventory = self.verifier_circuit.bus_inventory();
27 let next_bus_idx = self.verifier_circuit.next_bus_idx();
28 let input_or_merkle_commit_bus = bus::InputOrMerkleCommitBus::new(next_bus_idx);
29 let def_pvs_consistency_bus = bus::DefPvsConsistencyBus::new(next_bus_idx + 1);
30
31 let verifier_pvs_air = verifier::DeferralVerifierPvsAir {
32 public_values_bus: bus_inventory.public_values_bus,
33 cached_commit_bus: bus_inventory.cached_commit_bus,
34 pre_hash_bus: bus_inventory.pre_hash_bus,
35 range_bus: bus_inventory.range_checker_bus,
36 def_pvs_consistency_bus,
37 };
38
39 let def_pvs_air = def_pvs::DeferralAggPvsAir::new(
40 bus_inventory.public_values_bus,
41 bus_inventory.poseidon2_compress_bus,
42 bus_inventory.range_checker_bus,
43 input_or_merkle_commit_bus,
44 def_pvs_consistency_bus,
45 );
46
47 let input_commit_air = input::InputCommitAir {
48 public_values_bus: bus_inventory.public_values_bus,
49 poseidon2_bus: bus_inventory.poseidon2_permute_bus,
50 cached_commit_bus: bus_inventory.cached_commit_bus,
51 input_or_merkle_commit_bus,
52 };
53
54 [Arc::new(verifier_pvs_air) as AirRef<SC>]
55 .into_iter()
56 .chain([Arc::new(def_pvs_air) as AirRef<SC>])
57 .chain([Arc::new(input_commit_air) as AirRef<SC>])
58 .chain(self.verifier_circuit.airs())
59 .collect_vec()
60 }
61}