1pub mod advice;
2pub mod debug;
3mod print;
4
5use alloc::vec::Vec;
6
7pub use self::{advice::SystemEventNode, debug::DebugOptions};
8use crate::{
9 Felt,
10 ast::{InvocationTarget, immediate::*},
11 parser::{IntValue, WordValue},
12};
13
14#[derive(Clone, PartialEq, Eq, Debug)]
21pub enum Instruction {
22 Nop,
23 Assert,
24 AssertWithError(ErrorMsg),
25 AssertEq,
26 AssertEqWithError(ErrorMsg),
27 AssertEqw,
28 AssertEqwWithError(ErrorMsg),
29 Assertz,
30 AssertzWithError(ErrorMsg),
31 Add,
32 AddImm(ImmFelt),
33 Sub,
34 SubImm(ImmFelt),
35 Mul,
36 MulImm(ImmFelt),
37 Div,
38 DivImm(ImmFelt),
39 Neg,
40 ILog2,
41 Inv,
42 Incr,
43 Pow2,
44 Exp,
45 ExpImm(ImmFelt),
46 ExpBitLength(u8),
47 Not,
48 And,
49 Or,
50 Xor,
51 Eq,
52 EqImm(ImmFelt),
53 Neq,
54 NeqImm(ImmFelt),
55 Eqw,
56 Lt,
57 Lte,
58 Gt,
59 Gte,
60 IsOdd,
61
62 Ext2Add,
64 Ext2Sub,
65 Ext2Mul,
66 Ext2Div,
67 Ext2Neg,
68 Ext2Inv,
69
70 U32Test,
72 U32TestW,
73 U32Assert,
74 U32AssertWithError(ErrorMsg),
75 U32Assert2,
76 U32Assert2WithError(ErrorMsg),
77 U32AssertW,
78 U32AssertWWithError(ErrorMsg),
79 U32Split,
80 U32Cast,
81 U32WrappingAdd,
82 U32WrappingAddImm(ImmU32),
83 U32OverflowingAdd,
84 U32OverflowingAddImm(ImmU32),
85 U32OverflowingAdd3,
86 U32WrappingAdd3,
87 U32WrappingSub,
88 U32WrappingSubImm(ImmU32),
89 U32OverflowingSub,
90 U32OverflowingSubImm(ImmU32),
91 U32WrappingMul,
92 U32WrappingMulImm(ImmU32),
93 U32OverflowingMul,
94 U32OverflowingMulImm(ImmU32),
95 U32OverflowingMadd,
96 U32WrappingMadd,
97 U32Div,
98 U32DivImm(ImmU32),
99 U32Mod,
100 U32ModImm(ImmU32),
101 U32DivMod,
102 U32DivModImm(ImmU32),
103 U32And,
104 U32Or,
105 U32Xor,
106 U32Not,
107 U32Shr,
108 U32ShrImm(ImmU8),
109 U32Shl,
110 U32ShlImm(ImmU8),
111 U32Rotr,
112 U32RotrImm(ImmU8),
113 U32Rotl,
114 U32RotlImm(ImmU8),
115 U32Popcnt,
116 U32Ctz,
117 U32Clz,
118 U32Clo,
119 U32Cto,
120 U32Lt,
121 U32Lte,
122 U32Gt,
123 U32Gte,
124 U32Min,
125 U32Max,
126
127 Drop,
129 DropW,
130 PadW,
131 Dup0,
132 Dup1,
133 Dup2,
134 Dup3,
135 Dup4,
136 Dup5,
137 Dup6,
138 Dup7,
139 Dup8,
140 Dup9,
141 Dup10,
142 Dup11,
143 Dup12,
144 Dup13,
145 Dup14,
146 Dup15,
147 DupW0,
148 DupW1,
149 DupW2,
150 DupW3,
151 Swap1,
152 Swap2,
153 Swap3,
154 Swap4,
155 Swap5,
156 Swap6,
157 Swap7,
158 Swap8,
159 Swap9,
160 Swap10,
161 Swap11,
162 Swap12,
163 Swap13,
164 Swap14,
165 Swap15,
166 SwapW1,
167 SwapW2,
168 SwapW3,
169 SwapDw,
170 MovUp2,
171 MovUp3,
172 MovUp4,
173 MovUp5,
174 MovUp6,
175 MovUp7,
176 MovUp8,
177 MovUp9,
178 MovUp10,
179 MovUp11,
180 MovUp12,
181 MovUp13,
182 MovUp14,
183 MovUp15,
184 MovUpW2,
185 MovUpW3,
186 MovDn2,
187 MovDn3,
188 MovDn4,
189 MovDn5,
190 MovDn6,
191 MovDn7,
192 MovDn8,
193 MovDn9,
194 MovDn10,
195 MovDn11,
196 MovDn12,
197 MovDn13,
198 MovDn14,
199 MovDn15,
200 MovDnW2,
201 MovDnW3,
202 CSwap,
203 CSwapW,
204 CDrop,
205 CDropW,
206
207 Push(Immediate<IntValue>),
209 PushU8(u8),
210 PushU16(u16),
211 PushU32(u32),
212 PushFelt(Felt),
213 PushWord(WordValue),
214 PushU8List(Vec<u8>),
215 PushU16List(Vec<u16>),
216 PushU32List(Vec<u32>),
217 PushFeltList(Vec<Felt>),
218 Locaddr(ImmU16),
219 Sdepth,
220 Caller,
221 Clk,
222
223 MemLoad,
224 MemLoadImm(ImmU32),
225 MemLoadW,
226 MemLoadWImm(ImmU32),
227 LocLoad(ImmU16),
228 LocLoadW(ImmU16),
229
230 MemStore,
231 MemStoreImm(ImmU32),
232 LocStore(ImmU16),
233 MemStoreW,
234 MemStoreWImm(ImmU32),
235 LocStoreW(ImmU16),
236
237 MemStream,
238 AdvPipe,
239
240 AdvPush(ImmU8),
241 AdvLoadW,
242
243 SysEvent(SystemEventNode),
244
245 Hash,
247 HMerge,
248 HPerm,
249 MTreeGet,
250 MTreeSet,
251 MTreeMerge,
252 MTreeVerify,
253 MTreeVerifyWithError(ErrorMsg),
254
255 FriExt2Fold4,
257 HornerBase,
258 HornerExt,
259 EvalCircuit,
260
261 Exec(InvocationTarget),
263 Call(InvocationTarget),
264 SysCall(InvocationTarget),
265 DynExec,
266 DynCall,
267 ProcRef(InvocationTarget),
268
269 Breakpoint,
271 Debug(DebugOptions),
272
273 Emit(ImmU32),
275 Trace(ImmU32),
276}
277
278impl Instruction {
279 pub const fn should_break(&self) -> bool {
281 matches!(self, Self::Breakpoint)
282 }
283}
284
285impl core::fmt::Display for Instruction {
286 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
287 use crate::prettier::PrettyPrint;
288
289 self.pretty_print(f)
290 }
291}