Skip to main content

sp1_core_executor/vm/
results.rs

1use crate::{
2    events::{MemoryReadRecord, MemoryWriteRecord},
3    Register,
4};
5
6pub struct LoadResult {
7    pub a: u64,
8    pub b: u64,
9    pub c: u64,
10    pub addr: u64,
11    pub rs1: Register,
12    pub mr_record: MemoryReadRecord,
13    pub rd: Register,
14    pub rr_record: MemoryReadRecord,
15    pub rw_record: MemoryWriteRecord,
16}
17
18pub struct StoreResult {
19    pub a: u64,
20    pub b: u64,
21    pub c: u64,
22    pub addr: u64,
23    pub rs1: Register,
24    pub rs1_record: MemoryReadRecord,
25    pub rs2: Register,
26    pub rs2_record: MemoryReadRecord,
27    pub mw_record: MemoryWriteRecord,
28}
29
30pub struct AluResult {
31    pub rd: Register,
32    pub rw_record: MemoryWriteRecord,
33    pub a: u64,
34    pub b: u64,
35    pub c: u64,
36    pub rs1: MaybeImmediate,
37    pub rs2: MaybeImmediate,
38}
39
40pub enum MaybeImmediate {
41    Register(Register, MemoryReadRecord),
42    Immediate(u64),
43}
44
45impl MaybeImmediate {
46    pub fn record(&self) -> Option<&MemoryReadRecord> {
47        match self {
48            MaybeImmediate::Register(_, record) => Some(record),
49            MaybeImmediate::Immediate(_) => None,
50        }
51    }
52}
53
54pub struct JumpResult {
55    pub a: u64,
56    pub b: u64,
57    pub c: u64,
58    pub rd: Register,
59    pub rd_record: MemoryWriteRecord,
60    pub rs1: MaybeImmediate,
61}
62
63pub struct BranchResult {
64    pub a: u64,
65    pub rs1: Register,
66    pub a_record: MemoryReadRecord,
67    pub b: u64,
68    pub rs2: Register,
69    pub b_record: MemoryReadRecord,
70    pub c: u64,
71}
72
73pub struct UTypeResult {
74    pub a: u64,
75    pub b: u64,
76    pub c: u64,
77    pub rd: Register,
78    pub rw_record: MemoryWriteRecord,
79}
80
81pub struct EcallResult {
82    pub a: u64,
83    pub a_record: MemoryWriteRecord,
84    pub b: u64,
85    pub b_record: MemoryReadRecord,
86    pub c: u64,
87    pub c_record: MemoryReadRecord,
88}
89
90/// The result of a cycle.
91#[derive(Debug, Clone, Copy, PartialEq, Eq)]
92pub enum CycleResult {
93    /// The cycle has completed, and may or may not have halted.
94    Done(bool),
95    /// The trace has ended at this cycle.
96    TraceEnd,
97    /// The shard has overflowed at this cycle.
98    ShardBoundary,
99}
100
101impl CycleResult {
102    /// Returns true if the program has halted.
103    #[must_use]
104    pub fn is_done(self) -> bool {
105        matches!(self, CycleResult::Done(true))
106    }
107
108    /// Returns true if the program has hit a shard boundary.
109    #[must_use]
110    pub fn is_shard_boundry(self) -> bool {
111        matches!(self, CycleResult::ShardBoundary)
112    }
113
114    /// Returns true if the trace has ended at this cycle.
115    #[must_use]
116    pub fn is_trace_end(self) -> bool {
117        matches!(self, CycleResult::TraceEnd)
118    }
119}