Skip to main content

miden_assembly_syntax/ast/instruction/
mod.rs

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// INSTRUCTION
19// ================================================================================================
20
21/// Represents the set of primitive instructions in Miden Assembly syntax.
22///
23/// NOTE: For control flow instructions, see [crate::ast::Op].
24#[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    // ----- ext2 operations ---------------------------------------------------------------------
71    Ext2Add,
72    Ext2Sub,
73    Ext2Mul,
74    Ext2Div,
75    Ext2Neg,
76    Ext2Inv,
77
78    // ----- u32 manipulation --------------------------------------------------------------------
79    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    // ----- stack manipulation ------------------------------------------------------------------
139    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    // ----- input / output operations -----------------------------------------------------------
221    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    // ----- cryptographic operations ------------------------------------------------------------
259    Hash,
260    HMerge,
261    HPerm,
262    MTreeGet,
263    MTreeSet,
264    MTreeMerge,
265    MTreeVerify,
266    MTreeVerifyWithError(ErrorMsg),
267    CryptoStream,
268
269    // ----- STARK proof verification ------------------------------------------------------------
270    FriExt2Fold4,
271    HornerBase,
272    HornerExt,
273    EvalCircuit,
274    LogPrecompile,
275
276    // ----- exec / call -------------------------------------------------------------------------
277    Exec(InvocationTarget),
278    Call(InvocationTarget),
279    SysCall(InvocationTarget),
280    DynExec,
281    DynCall,
282    ProcRef(InvocationTarget),
283
284    // ----- debug decorators --------------------------------------------------------------------
285    DebugVar(DebugVarInfo),
286
287    // ----- event decorators --------------------------------------------------------------------
288    Emit,
289    EmitImm(ImmFelt),
290}
291
292impl Instruction {
293    /// Returns true if this instruction has a textual representation in Miden Assembly.
294    ///
295    /// Some instructions (like [`DebugVar`](Self::DebugVar)) are compiler-internal and have
296    /// no surface syntax. They should be skipped during pretty-printing.
297    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}