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 U32WideningAdd,
87 U32WideningAddImm(ImmU32),
88 U32OverflowingAdd3,
89 U32WideningAdd3,
90 U32WrappingAdd3,
91 U32WrappingSub,
92 U32WrappingSubImm(ImmU32),
93 U32OverflowingSub,
94 U32OverflowingSubImm(ImmU32),
95 U32WrappingMul,
96 U32WrappingMulImm(ImmU32),
97 U32WideningMul,
98 U32WideningMulImm(ImmU32),
99 U32WideningMadd,
100 U32WrappingMadd,
101 U32Div,
102 U32DivImm(ImmU32),
103 U32Mod,
104 U32ModImm(ImmU32),
105 U32DivMod,
106 U32DivModImm(ImmU32),
107 U32And,
108 U32Or,
109 U32Xor,
110 U32Not,
111 U32Shr,
112 U32ShrImm(ImmU8),
113 U32Shl,
114 U32ShlImm(ImmU8),
115 U32Rotr,
116 U32RotrImm(ImmU8),
117 U32Rotl,
118 U32RotlImm(ImmU8),
119 U32Popcnt,
120 U32Ctz,
121 U32Clz,
122 U32Clo,
123 U32Cto,
124 U32Lt,
125 U32Lte,
126 U32Gt,
127 U32Gte,
128 U32Min,
129 U32Max,
130
131 Drop,
133 DropW,
134 PadW,
135 Dup0,
136 Dup1,
137 Dup2,
138 Dup3,
139 Dup4,
140 Dup5,
141 Dup6,
142 Dup7,
143 Dup8,
144 Dup9,
145 Dup10,
146 Dup11,
147 Dup12,
148 Dup13,
149 Dup14,
150 Dup15,
151 DupW0,
152 DupW1,
153 DupW2,
154 DupW3,
155 Swap1,
156 Swap2,
157 Swap3,
158 Swap4,
159 Swap5,
160 Swap6,
161 Swap7,
162 Swap8,
163 Swap9,
164 Swap10,
165 Swap11,
166 Swap12,
167 Swap13,
168 Swap14,
169 Swap15,
170 SwapW1,
171 SwapW2,
172 SwapW3,
173 SwapDw,
174 MovUp2,
175 MovUp3,
176 MovUp4,
177 MovUp5,
178 MovUp6,
179 MovUp7,
180 MovUp8,
181 MovUp9,
182 MovUp10,
183 MovUp11,
184 MovUp12,
185 MovUp13,
186 MovUp14,
187 MovUp15,
188 MovUpW2,
189 MovUpW3,
190 MovDn2,
191 MovDn3,
192 MovDn4,
193 MovDn5,
194 MovDn6,
195 MovDn7,
196 MovDn8,
197 MovDn9,
198 MovDn10,
199 MovDn11,
200 MovDn12,
201 MovDn13,
202 MovDn14,
203 MovDn15,
204 MovDnW2,
205 MovDnW3,
206 Reversew,
207 Reversedw,
208 CSwap,
209 CSwapW,
210 CDrop,
211 CDropW,
212
213 Push(Immediate<PushValue>),
215 PushSlice(Immediate<WordValue>, Range<usize>),
216 PushFeltList(Vec<Felt>),
217 Locaddr(ImmU16),
218 Sdepth,
219 Caller,
220 Clk,
221
222 MemLoad,
223 MemLoadImm(ImmU32),
224 MemLoadWBe,
225 MemLoadWBeImm(ImmU32),
226 MemLoadWLe,
227 MemLoadWLeImm(ImmU32),
228 LocLoad(ImmU16),
229 LocLoadWBe(ImmU16),
230 LocLoadWLe(ImmU16),
231
232 MemStore,
233 MemStoreImm(ImmU32),
234 MemStoreWBe,
235 MemStoreWBeImm(ImmU32),
236 MemStoreWLe,
237 MemStoreWLeImm(ImmU32),
238 LocStore(ImmU16),
239 LocStoreWBe(ImmU16),
240 LocStoreWLe(ImmU16),
241
242 MemStream,
243 AdvPipe,
244
245 AdvPush(ImmU8),
246 AdvLoadW,
247
248 SysEvent(SystemEventNode),
249
250 Hash,
252 HMerge,
253 HPerm,
254 MTreeGet,
255 MTreeSet,
256 MTreeMerge,
257 MTreeVerify,
258 MTreeVerifyWithError(ErrorMsg),
259 CryptoStream,
260
261 FriExt2Fold4,
263 HornerBase,
264 HornerExt,
265 EvalCircuit,
266 LogPrecompile,
267
268 Exec(InvocationTarget),
270 Call(InvocationTarget),
271 SysCall(InvocationTarget),
272 DynExec,
273 DynCall,
274 ProcRef(InvocationTarget),
275
276 Debug(DebugOptions),
278
279 Emit,
281 EmitImm(ImmFelt),
282 Trace(ImmU32),
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}