sp1_core_machine/cpu/columns/
mod.rs1mod instruction;
2
3pub use instruction::*;
4
5use p3_util::indices_arr;
6use sp1_derive::AlignedBorrow;
7use sp1_stark::Word;
8use std::mem::{size_of, transmute};
9
10use crate::memory::{MemoryCols, MemoryReadCols, MemoryReadWriteCols};
11
12pub const NUM_CPU_COLS: usize = size_of::<CpuCols<u8>>();
13
14pub const CPU_COL_MAP: CpuCols<usize> = make_col_map();
15
16#[derive(AlignedBorrow, Default, Debug, Clone, Copy)]
18#[repr(C)]
19pub struct CpuCols<T: Copy> {
20 pub shard: T,
22
23 pub clk_16bit_limb: T,
25 pub clk_8bit_limb: T,
27
28 pub shard_to_send: T,
31 pub clk_to_send: T,
34
35 pub pc: T,
37
38 pub next_pc: T,
40
41 pub instruction: InstructionCols<T>,
43
44 pub op_a_immutable: T,
47
48 pub is_memory: T,
50
51 pub is_syscall: T,
53
54 pub is_halt: T,
56
57 pub num_extra_cycles: T,
59
60 pub op_a_access: MemoryReadWriteCols<T>,
62 pub op_b_access: MemoryReadCols<T>,
63 pub op_c_access: MemoryReadCols<T>,
64
65 pub is_real: T,
67}
68
69impl<T: Copy> CpuCols<T> {
70 pub fn op_a_val(&self) -> Word<T> {
72 *self.op_a_access.value()
73 }
74
75 pub fn op_b_val(&self) -> Word<T> {
77 *self.op_b_access.value()
78 }
79
80 pub fn op_c_val(&self) -> Word<T> {
82 *self.op_c_access.value()
83 }
84}
85
86const fn make_col_map() -> CpuCols<usize> {
88 let indices_arr = indices_arr::<NUM_CPU_COLS>();
89 unsafe { transmute::<[usize; NUM_CPU_COLS], CpuCols<usize>>(indices_arr) }
90}