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 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}