Skip to main content

miden_assembly_syntax/ast/instruction/
mod.rs

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// INSTRUCTION
16// ================================================================================================
17
18/// Represents the set of primitive instructions in Miden Assembly syntax.
19///
20/// NOTE: For control flow instructions, see [crate::ast::Op].
21#[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    // ----- ext2 operations ---------------------------------------------------------------------
64    Ext2Add,
65    Ext2Sub,
66    Ext2Mul,
67    Ext2Div,
68    Ext2Neg,
69    Ext2Inv,
70
71    // ----- u32 manipulation --------------------------------------------------------------------
72    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    // ----- stack manipulation ------------------------------------------------------------------
132    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    // ----- input / output operations -----------------------------------------------------------
214    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    // ----- cryptographic operations ------------------------------------------------------------
251    Hash,
252    HMerge,
253    HPerm,
254    MTreeGet,
255    MTreeSet,
256    MTreeMerge,
257    MTreeVerify,
258    MTreeVerifyWithError(ErrorMsg),
259    CryptoStream,
260
261    // ----- STARK proof verification ------------------------------------------------------------
262    FriExt2Fold4,
263    HornerBase,
264    HornerExt,
265    EvalCircuit,
266    LogPrecompile,
267
268    // ----- exec / call -------------------------------------------------------------------------
269    Exec(InvocationTarget),
270    Call(InvocationTarget),
271    SysCall(InvocationTarget),
272    DynExec,
273    DynCall,
274    ProcRef(InvocationTarget),
275
276    // ----- debug decorators --------------------------------------------------------------------
277    Debug(DebugOptions),
278
279    // ----- event decorators --------------------------------------------------------------------
280    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}