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