sp1_core_machine/
sys.rs

1use crate::{
2    alu::{AddSubCols, BitwiseCols, LtCols, MulCols, ShiftLeftCols, ShiftRightCols},
3    memory::{MemoryInitCols, SingleMemoryLocal},
4    syscall::chip::SyscallCols,
5};
6use p3_baby_bear::BabyBear;
7
8use sp1_core_executor::events::{
9    AluEvent, MemoryInitializeFinalizeEvent, MemoryLocalEvent, MemoryReadRecord, MemoryRecordEnum,
10    MemoryWriteRecord, SyscallEvent,
11};
12
13#[link(name = "sp1-core-machine-sys", kind = "static")]
14extern "C-unwind" {
15    pub fn add_sub_event_to_row_babybear(event: &AluEvent, cols: &mut AddSubCols<BabyBear>);
16    pub fn mul_event_to_row_babybear(event: &AluEvent, cols: &mut MulCols<BabyBear>);
17    pub fn bitwise_event_to_row_babybear(event: &AluEvent, cols: &mut BitwiseCols<BabyBear>);
18    pub fn lt_event_to_row_babybear(event: &AluEvent, cols: &mut LtCols<BabyBear>);
19    pub fn sll_event_to_row_babybear(event: &AluEvent, cols: &mut ShiftLeftCols<BabyBear>);
20    pub fn sr_event_to_row_babybear(event: &AluEvent, cols: &mut ShiftRightCols<BabyBear>);
21    pub fn memory_local_event_to_row_babybear(
22        event: &MemoryLocalEvent,
23        cols: &mut SingleMemoryLocal<BabyBear>,
24    );
25    pub fn memory_global_event_to_row_babybear(
26        event: &MemoryInitializeFinalizeEvent,
27        is_receive: bool,
28        cols: &mut MemoryInitCols<BabyBear>,
29    );
30    pub fn syscall_event_to_row_babybear(
31        event: &SyscallEvent,
32        is_receive: bool,
33        cols: &mut SyscallCols<BabyBear>,
34    );
35}
36
37/// An alternative to `Option<MemoryRecordEnum>` that is FFI-safe.
38///
39/// See [`MemoryRecordEnum`].
40#[derive(Debug, Copy, Clone)]
41#[repr(C)]
42pub enum OptionMemoryRecordEnum {
43    /// Read.
44    Read(MemoryReadRecord),
45    /// Write.
46    Write(MemoryWriteRecord),
47    None,
48}
49
50impl From<Option<MemoryRecordEnum>> for OptionMemoryRecordEnum {
51    fn from(value: Option<MemoryRecordEnum>) -> Self {
52        match value {
53            Some(MemoryRecordEnum::Read(r)) => Self::Read(r),
54            Some(MemoryRecordEnum::Write(r)) => Self::Write(r),
55            None => Self::None,
56        }
57    }
58}
59
60impl From<OptionMemoryRecordEnum> for Option<MemoryRecordEnum> {
61    fn from(value: OptionMemoryRecordEnum) -> Self {
62        match value {
63            OptionMemoryRecordEnum::Read(r) => Some(MemoryRecordEnum::Read(r)),
64            OptionMemoryRecordEnum::Write(r) => Some(MemoryRecordEnum::Write(r)),
65            OptionMemoryRecordEnum::None => None,
66        }
67    }
68}