sp1_core_executor/vm/
results.rs1use 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#[derive(Debug, Clone, Copy, PartialEq, Eq)]
92pub enum CycleResult {
93 Done(bool),
95 TraceEnd,
97 ShardBoundary,
99}
100
101impl CycleResult {
102 #[must_use]
104 pub fn is_done(self) -> bool {
105 matches!(self, CycleResult::Done(true))
106 }
107
108 #[must_use]
110 pub fn is_shard_boundry(self) -> bool {
111 matches!(self, CycleResult::ShardBoundary)
112 }
113
114 #[must_use]
116 pub fn is_trace_end(self) -> bool {
117 matches!(self, CycleResult::TraceEnd)
118 }
119}