openvm_circuit/arch/testing/memory/
air.rs

1use std::{borrow::Borrow, mem::size_of};
2
3use openvm_circuit_primitives_derive::AlignedBorrow;
4use openvm_stark_backend::{
5    interaction::InteractionBuilder,
6    p3_air::{Air, BaseAir},
7    p3_matrix::Matrix,
8    rap::{BaseAirWithPublicValues, PartitionedBaseAir},
9};
10
11use crate::system::memory::{offline_checker::MemoryBus, MemoryAddress};
12
13#[derive(Clone, Copy, Debug, AlignedBorrow, derive_new::new)]
14#[repr(C)]
15pub struct DummyMemoryInteractionCols<T, const BLOCK_SIZE: usize> {
16    pub address: MemoryAddress<T, T>,
17    pub data: [T; BLOCK_SIZE],
18    pub timestamp: T,
19    /// The send frequency. Send corresponds to write. To read, set to negative.
20    pub count: T,
21}
22
23#[derive(Clone, Copy, Debug, derive_new::new)]
24pub struct MemoryDummyAir<const BLOCK_SIZE: usize> {
25    pub bus: MemoryBus,
26}
27
28impl<const BLOCK_SIZE: usize, F> BaseAirWithPublicValues<F> for MemoryDummyAir<BLOCK_SIZE> {}
29impl<const BLOCK_SIZE: usize, F> PartitionedBaseAir<F> for MemoryDummyAir<BLOCK_SIZE> {}
30impl<const BLOCK_SIZE: usize, F> BaseAir<F> for MemoryDummyAir<BLOCK_SIZE> {
31    fn width(&self) -> usize {
32        size_of::<DummyMemoryInteractionCols<u8, BLOCK_SIZE>>()
33    }
34}
35
36impl<const BLOCK_SIZE: usize, AB: InteractionBuilder> Air<AB> for MemoryDummyAir<BLOCK_SIZE> {
37    fn eval(&self, builder: &mut AB) {
38        let main = builder.main();
39        let local = main.row_slice(0);
40        let local: &DummyMemoryInteractionCols<AB::Var, BLOCK_SIZE> = (*local).borrow();
41
42        self.bus
43            .send(local.address, local.data.to_vec(), local.timestamp)
44            .eval(builder, local.count);
45    }
46}