1use deepsize2::DeepSizeOf;
2use serde::{Deserialize, Serialize};
3
4use crate::{
5 events::{MemoryReadRecord, MemoryWriteRecord},
6 Instruction, Register, TrapError,
7};
8
9pub 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#[derive(Debug, Clone, Copy, PartialEq, Eq)]
132pub enum CycleResult {
133 Done(bool),
135 TraceEnd,
137 ShardBoundary,
139}
140
141impl CycleResult {
142 #[must_use]
144 pub fn is_done(self) -> bool {
145 matches!(self, CycleResult::Done(true))
146 }
147
148 #[must_use]
150 pub fn is_shard_boundry(self) -> bool {
151 matches!(self, CycleResult::ShardBoundary)
152 }
153
154 #[must_use]
156 pub fn is_trace_end(self) -> bool {
157 matches!(self, CycleResult::TraceEnd)
158 }
159}
160
161#[derive(Debug, PartialEq, Eq, Clone, Copy, Serialize, Deserialize, DeepSizeOf)]
163#[repr(C)]
164pub struct TrapResult {
165 pub context: u64,
167 pub code_record: MemoryWriteRecord,
169 pub pc_record: MemoryWriteRecord,
171 pub handler_record: MemoryReadRecord,
173}