diff --git a/crates/vm/src/arch/extensions.rs b/crates/vm/src/arch/extensions.rs index f73a6fc461..8c9a6291c5 100644 --- a/crates/vm/src/arch/extensions.rs +++ b/crates/vm/src/arch/extensions.rs @@ -31,7 +31,7 @@ use openvm_stark_backend::{ types::{AirProvingContext, ProvingContext}, }, rap::AnyRap, - AirRef, AnyChip, Chip, + AnyChip, Chip, }; use rustc_hash::FxHashMap; use tracing::info_span; @@ -145,7 +145,7 @@ pub struct AirInventory { /// Note that the system will ensure that the first AIR in the list is always the /// [VariableRangeCheckerAir]. #[get = "pub"] - ext_airs: Vec>, + ext_airs: Vec>, /// `ext_start[i]` will have the starting index in `ext_airs` for extension `i` ext_start: Vec, @@ -399,6 +399,16 @@ impl ExecutorInventoryBuilder<'_, F, E> { } } +pub trait ColumnNames {} + +impl ColumnNames for T {} + +pub trait AnyRapWithColumnNames: AnyRap + ColumnNames {} + +pub type AirRefWithColumnNames = Arc>; + +impl + ColumnNames> AnyRapWithColumnNames for R {} + impl AirInventory { /// Outside of this crate, [AirInventory] must be constructed via [SystemConfig]. pub(crate) fn new( @@ -434,11 +444,11 @@ impl AirInventory { .filter_map(|air| air.as_any().downcast_ref()) } - pub fn add_air + 'static>(&mut self, air: A) { + pub fn add_air + 'static>(&mut self, air: A) { self.add_air_ref(Arc::new(air)); } - pub fn add_air_ref(&mut self, air: AirRef) { + pub fn add_air_ref(&mut self, air: AirRefWithColumnNames) { self.ext_airs.push(air); } @@ -452,7 +462,7 @@ impl AirInventory { /// This is the system AIRs, followed by the other AIRs in the **reverse** of the order they /// were added in the VM extension definitions. In particular, the AIRs that have dependencies /// appear later. The system guarantees that the last AIR is the [VariableRangeCheckerAir]. - pub fn into_airs(self) -> impl Iterator> { + pub fn into_airs(self) -> impl Iterator> { self.system .into_airs() .into_iter() diff --git a/crates/vm/src/arch/vm.rs b/crates/vm/src/arch/vm.rs index ad253f733a..85e839d075 100644 --- a/crates/vm/src/arch/vm.rs +++ b/crates/vm/src/arch/vm.rs @@ -1315,6 +1315,8 @@ pub fn debug_proving_ctx( let (airs, pks, proof_inputs): (Vec<_>, Vec<_>, Vec<_>) = multiunzip(ctx.per_air.iter().map(|(air_id, air_ctx)| { // Transfer from device **back** to host so the debugger can read the data. + + use openvm_stark_backend::rap::AnyRap; let cached_mains = air_ctx .cached_mains .iter() @@ -1331,7 +1333,7 @@ pub fn debug_proving_ctx( public_values, }; ( - global_airs[*air_id].clone(), + global_airs[*air_id].clone() as Arc>, pk.per_air[*air_id].clone(), raw, ) diff --git a/crates/vm/src/system/memory/mod.rs b/crates/vm/src/system/memory/mod.rs index 411e7a5473..cdff03ef85 100644 --- a/crates/vm/src/system/memory/mod.rs +++ b/crates/vm/src/system/memory/mod.rs @@ -7,7 +7,6 @@ use openvm_stark_backend::{ interaction::PermutationCheckBus, p3_field::Field, p3_util::{log2_ceil_usize, log2_strict_usize}, - AirRef, }; pub mod adapter; @@ -24,7 +23,7 @@ pub use controller::*; pub use online::{Address, AddressMap, INITIAL_TIMESTAMP}; use crate::{ - arch::{MemoryConfig, ADDR_SPACE_OFFSET}, + arch::{AirRefWithColumnNames, MemoryConfig, ADDR_SPACE_OFFSET}, system::memory::{ adapter::AccessAdapterAir, dimensions::MemoryDimensions, interface::MemoryInterfaceAirs, merkle::MemoryMerkleAir, offline_checker::MemoryBridge, persistent::PersistentBoundaryAir, @@ -75,7 +74,7 @@ impl MemoryAddress { pub struct MemoryAirInventory { pub bridge: MemoryBridge, pub interface: MemoryInterfaceAirs, - pub access_adapters: Vec>, + pub access_adapters: Vec>, } impl MemoryAirInventory { @@ -122,12 +121,12 @@ impl MemoryAirInventory { let lt_air = IsLtSubAir::new(range_bus, mem_config.timestamp_max_bits); let maan = mem_config.max_access_adapter_n; assert!(matches!(maan, 2 | 4 | 8 | 16 | 32)); - let access_adapters: Vec> = [ - Arc::new(AccessAdapterAir::<2> { memory_bus, lt_air }) as AirRef, - Arc::new(AccessAdapterAir::<4> { memory_bus, lt_air }) as AirRef, - Arc::new(AccessAdapterAir::<8> { memory_bus, lt_air }) as AirRef, - Arc::new(AccessAdapterAir::<16> { memory_bus, lt_air }) as AirRef, - Arc::new(AccessAdapterAir::<32> { memory_bus, lt_air }) as AirRef, + let access_adapters: Vec> = [ + Arc::new(AccessAdapterAir::<2> { memory_bus, lt_air }) as AirRefWithColumnNames, + Arc::new(AccessAdapterAir::<4> { memory_bus, lt_air }) as AirRefWithColumnNames, + Arc::new(AccessAdapterAir::<8> { memory_bus, lt_air }) as AirRefWithColumnNames, + Arc::new(AccessAdapterAir::<16> { memory_bus, lt_air }) as AirRefWithColumnNames, + Arc::new(AccessAdapterAir::<32> { memory_bus, lt_air }) as AirRefWithColumnNames, ] .into_iter() .take(log2_strict_usize(maan)) @@ -141,8 +140,8 @@ impl MemoryAirInventory { } /// The order of memory AIRs is boundary, merkle (if exists), access adapters - pub fn into_airs(self) -> Vec> { - let mut airs: Vec> = Vec::new(); + pub fn into_airs(self) -> Vec> { + let mut airs: Vec> = Vec::new(); match self.interface { MemoryInterfaceAirs::Volatile { boundary } => { airs.push(Arc::new(boundary)); diff --git a/crates/vm/src/system/mod.rs b/crates/vm/src/system/mod.rs index 8c0d2a3d37..50b2cc1170 100644 --- a/crates/vm/src/system/mod.rs +++ b/crates/vm/src/system/mod.rs @@ -19,18 +19,19 @@ use openvm_stark_backend::{ hal::{MatrixDimensions, ProverBackend}, types::{AirProvingContext, CommittedTraceData}, }, - AirRef, Chip, + Chip, }; use rustc_hash::FxHashMap; use self::{connector::VmConnectorAir, program::ProgramAir, public_values::PublicValuesAir}; use crate::{ arch::{ - vm_poseidon2_config, AirInventory, AirInventoryError, BusIndexManager, ChipInventory, - ChipInventoryError, DenseRecordArena, ExecutionBridge, ExecutionBus, ExecutionState, - ExecutorInventory, ExecutorInventoryError, MatrixRecordArena, PhantomSubExecutor, - RowMajorMatrixArena, SystemConfig, VmAirWrapper, VmBuilder, VmChipComplex, VmChipWrapper, - VmCircuitConfig, VmExecutionConfig, CONNECTOR_AIR_ID, PROGRAM_AIR_ID, PUBLIC_VALUES_AIR_ID, + vm_poseidon2_config, AirInventory, AirInventoryError, AirRefWithColumnNames, + BusIndexManager, ChipInventory, ChipInventoryError, DenseRecordArena, ExecutionBridge, + ExecutionBus, ExecutionState, ExecutorInventory, ExecutorInventoryError, MatrixRecordArena, + PhantomSubExecutor, RowMajorMatrixArena, SystemConfig, VmAirWrapper, VmBuilder, + VmChipComplex, VmChipWrapper, VmCircuitConfig, VmExecutionConfig, CONNECTOR_AIR_ID, + PROGRAM_AIR_ID, PUBLIC_VALUES_AIR_ID, }, system::{ connector::VmConnectorChip, @@ -224,8 +225,8 @@ impl SystemAirInventory { } } - pub fn into_airs(self) -> Vec> { - let mut airs: Vec> = Vec::new(); + pub fn into_airs(self) -> Vec> { + let mut airs: Vec> = Vec::new(); airs.push(Arc::new(self.program)); airs.push(Arc::new(self.connector)); if let Some(public_values) = self.public_values { diff --git a/crates/vm/src/system/poseidon2/mod.rs b/crates/vm/src/system/poseidon2/mod.rs index 608e5e5d02..ea1e0c5564 100644 --- a/crates/vm/src/system/poseidon2/mod.rs +++ b/crates/vm/src/system/poseidon2/mod.rs @@ -16,7 +16,7 @@ use openvm_stark_backend::{ config::{StarkGenericConfig, Val}, interaction::{BusIndex, LookupBus}, p3_field::{Field, PrimeField32}, - AirRef, ChipUsageGetter, + ChipUsageGetter, }; #[cfg(test)] @@ -27,7 +27,10 @@ mod chip; pub use chip::*; use crate::{ - arch::hasher::{Hasher, HasherChip}, + arch::{ + hasher::{Hasher, HasherChip}, + AirRefWithColumnNames, + }, system::poseidon2::air::Poseidon2PeripheryAir, }; pub mod columns; @@ -60,7 +63,7 @@ pub fn new_poseidon2_periphery_air( poseidon2_config: Poseidon2Config>, direct_bus: LookupBus, max_constraint_degree: usize, -) -> AirRef { +) -> AirRefWithColumnNames { if max_constraint_degree >= 7 { Arc::new(Poseidon2PeripheryAir::, 0>::new( Arc::new(Poseidon2SubAir::new(poseidon2_config.constants.into())),