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