Skip to main content

sp1_core_executor/vm/
results.rs

1use deepsize2::DeepSizeOf;
2use serde::{Deserialize, Serialize};
3
4use crate::{
5    events::{MemoryReadRecord, MemoryWriteRecord},
6    Instruction, Register, TrapError,
7};
8
9/// For untrusted programs, fetching an instruction might lead to a memory read
10/// and a decoding phase. It's likely we will need new records here.
11pub struct FetchResult {
12    pub pc: u64,
13    pub instruction: Option<Instruction>,
14    pub mr_record: Option<MemoryReadRecord>,
15    pub error: Option<TrapError>,
16}
17
18pub struct LoadResultSupervisor {
19    pub a: u64,
20    pub b: u64,
21    pub c: u64,
22    pub addr: u64,
23    pub rs1: Register,
24    pub mr_record: MemoryReadRecord,
25    pub rd: Register,
26    pub rr_record: MemoryReadRecord,
27    pub rw_record: MemoryWriteRecord,
28}
29
30pub struct LoadResult {
31    pub a: u64,
32    pub b: u64,
33    pub c: u64,
34    pub addr: u64,
35    pub rs1: Register,
36    pub mr_record: MemoryReadRecord,
37    pub rd: Register,
38    pub rr_record: MemoryReadRecord,
39    pub rw_record: MemoryWriteRecord,
40    pub error: Option<TrapError>,
41}
42
43pub struct StoreResultSupervisor {
44    pub a: u64,
45    pub b: u64,
46    pub c: u64,
47    pub addr: u64,
48    pub rs1: Register,
49    pub rs1_record: MemoryReadRecord,
50    pub rs2: Register,
51    pub rs2_record: MemoryReadRecord,
52    pub mw_record: MemoryWriteRecord,
53}
54
55pub struct StoreResult {
56    pub a: u64,
57    pub b: u64,
58    pub c: u64,
59    pub addr: u64,
60    pub rs1: Register,
61    pub rs1_record: MemoryReadRecord,
62    pub rs2: Register,
63    pub rs2_record: MemoryReadRecord,
64    pub mw_record: MemoryWriteRecord,
65    pub error: Option<TrapError>,
66}
67
68pub struct AluResult {
69    pub rd: Register,
70    pub rw_record: MemoryWriteRecord,
71    pub a: u64,
72    pub b: u64,
73    pub c: u64,
74    pub rs1: MaybeImmediate,
75    pub rs2: MaybeImmediate,
76}
77
78pub enum MaybeImmediate {
79    Register(Register, MemoryReadRecord),
80    Immediate(u64),
81}
82
83impl MaybeImmediate {
84    pub fn record(&self) -> Option<&MemoryReadRecord> {
85        match self {
86            MaybeImmediate::Register(_, record) => Some(record),
87            MaybeImmediate::Immediate(_) => None,
88        }
89    }
90}
91
92pub struct JumpResult {
93    pub a: u64,
94    pub b: u64,
95    pub c: u64,
96    pub rd: Register,
97    pub rd_record: MemoryWriteRecord,
98    pub rs1: MaybeImmediate,
99}
100
101pub struct BranchResult {
102    pub a: u64,
103    pub rs1: Register,
104    pub a_record: MemoryReadRecord,
105    pub b: u64,
106    pub rs2: Register,
107    pub b_record: MemoryReadRecord,
108    pub c: u64,
109}
110
111pub struct UTypeResult {
112    pub a: u64,
113    pub b: u64,
114    pub c: u64,
115    pub rd: Register,
116    pub rw_record: MemoryWriteRecord,
117}
118
119pub struct EcallResult {
120    pub a: u64,
121    pub a_record: MemoryWriteRecord,
122    pub b: u64,
123    pub b_record: MemoryReadRecord,
124    pub c: u64,
125    pub c_record: MemoryReadRecord,
126    pub error: Option<TrapError>,
127    pub sig_return_pc_record: Option<MemoryReadRecord>,
128}
129
130/// The result of a cycle.
131#[derive(Debug, Clone, Copy, PartialEq, Eq)]
132pub enum CycleResult {
133    /// The cycle has completed, and may or may not have halted.
134    Done(bool),
135    /// The trace has ended at this cycle.
136    TraceEnd,
137    /// The shard has overflowed at this cycle.
138    ShardBoundary,
139}
140
141impl CycleResult {
142    /// Returns true if the program has halted.
143    #[must_use]
144    pub fn is_done(self) -> bool {
145        matches!(self, CycleResult::Done(true))
146    }
147
148    /// Returns true if the program has hit a shard boundary.
149    #[must_use]
150    pub fn is_shard_boundry(self) -> bool {
151        matches!(self, CycleResult::ShardBoundary)
152    }
153
154    /// Returns true if the trace has ended at this cycle.
155    #[must_use]
156    pub fn is_trace_end(self) -> bool {
157        matches!(self, CycleResult::TraceEnd)
158    }
159}
160
161/// The result of the trap handling.
162#[derive(Debug, PartialEq, Eq, Clone, Copy, Serialize, Deserialize, DeepSizeOf)]
163#[repr(C)]
164pub struct TrapResult {
165    /// The trap context.
166    pub context: u64,
167    /// The memory record for writing the trap code.
168    pub code_record: MemoryWriteRecord,
169    /// The memory record for writing the program counter.
170    pub pc_record: MemoryWriteRecord,
171    /// The memory record for reading the next program counter.
172    pub handler_record: MemoryReadRecord,
173}