Skip to main content

miden_assembly_syntax/ast/instruction/
mod.rs

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