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,
246    AdvPushW,
247    AdvLoadW,
248
249    SysEvent(SystemEventNode),
250
251    // ----- cryptographic operations ------------------------------------------------------------
252    Hash,
253    HMerge,
254    HPerm,
255    MTreeGet,
256    MTreeSet,
257    MTreeMerge,
258    MTreeVerify,
259    MTreeVerifyWithError(ErrorMsg),
260    CryptoStream,
261
262    // ----- STARK proof verification ------------------------------------------------------------
263    FriExt2Fold4,
264    HornerBase,
265    HornerExt,
266    EvalCircuit,
267    LogPrecompile,
268
269    // ----- exec / call -------------------------------------------------------------------------
270    Exec(InvocationTarget),
271    Call(InvocationTarget),
272    SysCall(InvocationTarget),
273    DynExec,
274    DynCall,
275    ProcRef(InvocationTarget),
276
277    // ----- debug decorators --------------------------------------------------------------------
278    Debug(DebugOptions),
279    DebugVar(miden_core::operations::DebugVarInfo),
280
281    // ----- event decorators --------------------------------------------------------------------
282    Emit,
283    EmitImm(ImmFelt),
284    Trace(ImmU32),
285}
286
287impl Instruction {
288    /// Returns true if this instruction has a textual representation in Miden Assembly.
289    ///
290    /// Some instructions (like [`DebugVar`](Self::DebugVar)) are compiler-internal and have
291    /// no surface syntax. They should be skipped during pretty-printing.
292    pub const fn has_textual_representation(&self) -> bool {
293        !matches!(self, Self::DebugVar(_))
294    }
295}
296
297impl core::fmt::Display for Instruction {
298    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
299        use crate::prettier::PrettyPrint;
300
301        self.pretty_print(f)
302    }
303}