sp1_recursion_core/air/
memory.rsuse p3_field::PrimeField32;
use sp1_derive::AlignedBorrow;
use crate::air::Block;
#[derive(AlignedBorrow, Default, Debug, Clone)]
#[repr(C)]
pub struct MemoryInitCols<T> {
pub addr: T,
pub timestamp: T,
pub value: Block<T>,
pub is_initialize: T,
pub is_finalize: T,
pub diff_16bit_limb: T,
pub diff_12bit_limb: T,
pub addr_16bit_limb: T,
pub addr_12bit_limb: T,
pub is_real: T,
pub is_range_check: T,
}
impl<T: PrimeField32> MemoryInitCols<T> {
pub fn new() -> Self {
Self {
addr: T::zero(),
timestamp: T::zero(),
value: Block::from([T::zero(); 4]),
is_initialize: T::zero(),
is_finalize: T::zero(),
diff_16bit_limb: T::zero(),
diff_12bit_limb: T::zero(),
addr_16bit_limb: T::zero(),
addr_12bit_limb: T::zero(),
is_real: T::zero(),
is_range_check: T::zero(),
}
}
}
#[derive(AlignedBorrow, Default, Debug, Clone, Copy)]
#[repr(C)]
pub struct MemoryReadCols<T> {
pub access: MemoryAccessCols<T, Block<T>>,
}
#[derive(AlignedBorrow, Default, Debug, Clone, Copy)]
#[repr(C)]
pub struct MemoryReadWriteCols<T> {
pub prev_value: Block<T>,
pub access: MemoryAccessCols<T, Block<T>>,
}
#[derive(AlignedBorrow, Default, Debug, Clone, Copy)]
#[repr(C)]
pub struct MemoryReadSingleCols<T> {
pub access: MemoryAccessCols<T, T>,
}
#[derive(AlignedBorrow, Default, Debug, Clone, Copy)]
#[repr(C)]
pub struct MemoryReadWriteSingleCols<T> {
pub prev_value: T,
pub access: MemoryAccessCols<T, T>,
}
#[derive(AlignedBorrow, Default, Debug, Clone, Copy)]
#[repr(C)]
pub struct MemoryAccessCols<T, TValue> {
pub value: TValue,
pub prev_timestamp: T,
pub diff_16bit_limb: T,
pub diff_12bit_limb: T,
}
pub trait MemoryCols<T, TValue> {
fn access(&self) -> &MemoryAccessCols<T, TValue>;
fn access_mut(&mut self) -> &mut MemoryAccessCols<T, TValue>;
fn prev_value(&self) -> &TValue;
fn prev_value_mut(&mut self) -> &mut TValue;
fn value(&self) -> &TValue;
fn value_mut(&mut self) -> &mut TValue;
}
pub trait MemoryAccessTimestampCols<T> {
fn prev_timestamp(&self) -> &T;
fn diff_16bit_limb(&self) -> &T;
fn diff_12bit_limb(&self) -> &T;
}
impl<T> MemoryAccessTimestampCols<T> for MemoryAccessCols<T, Block<T>> {
fn prev_timestamp(&self) -> &T {
&self.prev_timestamp
}
fn diff_16bit_limb(&self) -> &T {
&self.diff_16bit_limb
}
fn diff_12bit_limb(&self) -> &T {
&self.diff_12bit_limb
}
}
impl<T> MemoryAccessTimestampCols<T> for MemoryAccessCols<T, T> {
fn prev_timestamp(&self) -> &T {
&self.prev_timestamp
}
fn diff_16bit_limb(&self) -> &T {
&self.diff_16bit_limb
}
fn diff_12bit_limb(&self) -> &T {
&self.diff_12bit_limb
}
}
impl<T> MemoryCols<T, Block<T>> for MemoryReadCols<T> {
fn access(&self) -> &MemoryAccessCols<T, Block<T>> {
&self.access
}
fn access_mut(&mut self) -> &mut MemoryAccessCols<T, Block<T>> {
&mut self.access
}
fn prev_value(&self) -> &Block<T> {
&self.access.value
}
fn prev_value_mut(&mut self) -> &mut Block<T> {
&mut self.access.value
}
fn value(&self) -> &Block<T> {
&self.access.value
}
fn value_mut(&mut self) -> &mut Block<T> {
&mut self.access.value
}
}
impl<T> MemoryCols<T, Block<T>> for MemoryReadWriteCols<T> {
fn access(&self) -> &MemoryAccessCols<T, Block<T>> {
&self.access
}
fn access_mut(&mut self) -> &mut MemoryAccessCols<T, Block<T>> {
&mut self.access
}
fn prev_value(&self) -> &Block<T> {
&self.prev_value
}
fn prev_value_mut(&mut self) -> &mut Block<T> {
&mut self.prev_value
}
fn value(&self) -> &Block<T> {
&self.access.value
}
fn value_mut(&mut self) -> &mut Block<T> {
&mut self.access.value
}
}
impl<T> MemoryCols<T, T> for MemoryReadSingleCols<T> {
fn access(&self) -> &MemoryAccessCols<T, T> {
&self.access
}
fn access_mut(&mut self) -> &mut MemoryAccessCols<T, T> {
&mut self.access
}
fn prev_value(&self) -> &T {
&self.access.value
}
fn prev_value_mut(&mut self) -> &mut T {
&mut self.access.value
}
fn value(&self) -> &T {
&self.access.value
}
fn value_mut(&mut self) -> &mut T {
&mut self.access.value
}
}
impl<T> MemoryCols<T, T> for MemoryReadWriteSingleCols<T> {
fn access(&self) -> &MemoryAccessCols<T, T> {
&self.access
}
fn access_mut(&mut self) -> &mut MemoryAccessCols<T, T> {
&mut self.access
}
fn prev_value(&self) -> &T {
&self.prev_value
}
fn prev_value_mut(&mut self) -> &mut T {
&mut self.prev_value
}
fn value(&self) -> &T {
&self.access.value
}
fn value_mut(&mut self) -> &mut T {
&mut self.access.value
}
}