sp1_core_machine/memory/consistency/
columns.rs1use sp1_derive::AlignedBorrow;
2use sp1_stark::Word;
3
4#[derive(AlignedBorrow, Default, Debug, Clone, Copy)]
6#[repr(C)]
7pub struct MemoryReadCols<T> {
8 pub access: MemoryAccessCols<T>,
9}
10
11#[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#[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 pub value: Word<T>,
32
33 pub prev_shard: T,
35 pub prev_clk: T,
36
37 pub compare_clk: T,
39
40 pub diff_16bit_limb: T,
47
48 pub diff_8bit_limb: T,
51}
52
53pub 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
146pub 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}