sp1_core_machine/memory/consistency/
columns.rs

1use sp1_derive::AlignedBorrow;
2use sp1_stark::Word;
3
4/// Memory read access.
5#[derive(AlignedBorrow, Default, Debug, Clone, Copy)]
6#[repr(C)]
7pub struct MemoryReadCols<T> {
8    pub access: MemoryAccessCols<T>,
9}
10
11/// Memory write access.
12#[derive(AlignedBorrow, Default, Debug, Clone, Copy)]
13#[repr(C)]
14pub struct MemoryWriteCols<T> {
15    pub prev_value: Word<T>,
16    pub access: MemoryAccessCols<T>,
17}
18
19/// Memory read-write access.
20#[derive(AlignedBorrow, Default, Debug, Clone, Copy)]
21#[repr(C)]
22pub struct MemoryReadWriteCols<T> {
23    pub prev_value: Word<T>,
24    pub access: MemoryAccessCols<T>,
25}
26
27#[derive(AlignedBorrow, Default, Debug, Clone, Copy)]
28#[repr(C)]
29pub struct MemoryAccessCols<T> {
30    /// The value of the memory access.
31    pub value: Word<T>,
32
33    /// The previous shard and timestamp that this memory access is being read from.
34    pub prev_shard: T,
35    pub prev_clk: T,
36
37    /// This will be true if the current shard == prev_access's shard, else false.
38    pub compare_clk: T,
39
40    /// The following columns are decomposed limbs for the difference between the current access's
41    /// timestamp and the previous access's timestamp.  Note the actual value of the timestamp
42    /// is either the accesses' shard or clk depending on the value of compare_clk.
43    ///
44    /// This column is the least significant 16 bit limb of current access timestamp - prev access
45    /// timestamp.
46    pub diff_16bit_limb: T,
47
48    /// This column is the most significant 8 bit limb of current access timestamp - prev access
49    /// timestamp.
50    pub diff_8bit_limb: T,
51}
52
53/// The common columns for all memory access types.
54pub trait MemoryCols<T> {
55    fn access(&self) -> &MemoryAccessCols<T>;
56
57    fn access_mut(&mut self) -> &mut MemoryAccessCols<T>;
58
59    fn prev_value(&self) -> &Word<T>;
60
61    fn prev_value_mut(&mut self) -> &mut Word<T>;
62
63    fn value(&self) -> &Word<T>;
64
65    fn value_mut(&mut self) -> &mut Word<T>;
66}
67
68impl<T> MemoryCols<T> for MemoryReadCols<T> {
69    fn access(&self) -> &MemoryAccessCols<T> {
70        &self.access
71    }
72
73    fn access_mut(&mut self) -> &mut MemoryAccessCols<T> {
74        &mut self.access
75    }
76
77    fn prev_value(&self) -> &Word<T> {
78        &self.access.value
79    }
80
81    fn prev_value_mut(&mut self) -> &mut Word<T> {
82        &mut self.access.value
83    }
84
85    fn value(&self) -> &Word<T> {
86        &self.access.value
87    }
88
89    fn value_mut(&mut self) -> &mut Word<T> {
90        &mut self.access.value
91    }
92}
93
94impl<T> MemoryCols<T> for MemoryWriteCols<T> {
95    fn access(&self) -> &MemoryAccessCols<T> {
96        &self.access
97    }
98
99    fn access_mut(&mut self) -> &mut MemoryAccessCols<T> {
100        &mut self.access
101    }
102
103    fn prev_value(&self) -> &Word<T> {
104        &self.prev_value
105    }
106
107    fn prev_value_mut(&mut self) -> &mut Word<T> {
108        &mut self.prev_value
109    }
110
111    fn value(&self) -> &Word<T> {
112        &self.access.value
113    }
114
115    fn value_mut(&mut self) -> &mut Word<T> {
116        &mut self.access.value
117    }
118}
119
120impl<T> MemoryCols<T> for MemoryReadWriteCols<T> {
121    fn access(&self) -> &MemoryAccessCols<T> {
122        &self.access
123    }
124
125    fn access_mut(&mut self) -> &mut MemoryAccessCols<T> {
126        &mut self.access
127    }
128
129    fn prev_value(&self) -> &Word<T> {
130        &self.prev_value
131    }
132
133    fn prev_value_mut(&mut self) -> &mut Word<T> {
134        &mut self.prev_value
135    }
136
137    fn value(&self) -> &Word<T> {
138        &self.access.value
139    }
140
141    fn value_mut(&mut self) -> &mut Word<T> {
142        &mut self.access.value
143    }
144}
145
146/// A utility method to convert a slice of memory access columns into a vector of values.
147/// This is useful for comparing the values of a memory access to limbs.
148pub fn value_as_limbs<T: Clone, M: MemoryCols<T>>(memory: &[M]) -> Vec<T> {
149    memory.iter().flat_map(|m| m.value().clone().into_iter()).collect()
150}