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