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    U32OverflowingAdd3,
87    U32WrappingAdd3,
88    U32WrappingSub,
89    U32WrappingSubImm(ImmU32),
90    U32OverflowingSub,
91    U32OverflowingSubImm(ImmU32),
92    U32WrappingMul,
93    U32WrappingMulImm(ImmU32),
94    U32OverflowingMul,
95    U32OverflowingMulImm(ImmU32),
96    U32OverflowingMadd,
97    U32WrappingMadd,
98    U32Div,
99    U32DivImm(ImmU32),
100    U32Mod,
101    U32ModImm(ImmU32),
102    U32DivMod,
103    U32DivModImm(ImmU32),
104    U32And,
105    U32Or,
106    U32Xor,
107    U32Not,
108    U32Shr,
109    U32ShrImm(ImmU8),
110    U32Shl,
111    U32ShlImm(ImmU8),
112    U32Rotr,
113    U32RotrImm(ImmU8),
114    U32Rotl,
115    U32RotlImm(ImmU8),
116    U32Popcnt,
117    U32Ctz,
118    U32Clz,
119    U32Clo,
120    U32Cto,
121    U32Lt,
122    U32Lte,
123    U32Gt,
124    U32Gte,
125    U32Min,
126    U32Max,
127
128    // ----- stack manipulation ------------------------------------------------------------------
129    Drop,
130    DropW,
131    PadW,
132    Dup0,
133    Dup1,
134    Dup2,
135    Dup3,
136    Dup4,
137    Dup5,
138    Dup6,
139    Dup7,
140    Dup8,
141    Dup9,
142    Dup10,
143    Dup11,
144    Dup12,
145    Dup13,
146    Dup14,
147    Dup15,
148    DupW0,
149    DupW1,
150    DupW2,
151    DupW3,
152    Swap1,
153    Swap2,
154    Swap3,
155    Swap4,
156    Swap5,
157    Swap6,
158    Swap7,
159    Swap8,
160    Swap9,
161    Swap10,
162    Swap11,
163    Swap12,
164    Swap13,
165    Swap14,
166    Swap15,
167    SwapW1,
168    SwapW2,
169    SwapW3,
170    SwapDw,
171    MovUp2,
172    MovUp3,
173    MovUp4,
174    MovUp5,
175    MovUp6,
176    MovUp7,
177    MovUp8,
178    MovUp9,
179    MovUp10,
180    MovUp11,
181    MovUp12,
182    MovUp13,
183    MovUp14,
184    MovUp15,
185    MovUpW2,
186    MovUpW3,
187    MovDn2,
188    MovDn3,
189    MovDn4,
190    MovDn5,
191    MovDn6,
192    MovDn7,
193    MovDn8,
194    MovDn9,
195    MovDn10,
196    MovDn11,
197    MovDn12,
198    MovDn13,
199    MovDn14,
200    MovDn15,
201    MovDnW2,
202    MovDnW3,
203    Reversew,
204    Reversedw,
205    CSwap,
206    CSwapW,
207    CDrop,
208    CDropW,
209
210    // ----- input / output operations -----------------------------------------------------------
211    Push(Immediate<PushValue>),
212    PushSlice(Immediate<WordValue>, Range<usize>),
213    PushFeltList(Vec<Felt>),
214    Locaddr(ImmU16),
215    Sdepth,
216    Caller,
217    Clk,
218
219    MemLoad,
220    MemLoadImm(ImmU32),
221    MemLoadWBe,
222    MemLoadWBeImm(ImmU32),
223    MemLoadWLe,
224    MemLoadWLeImm(ImmU32),
225    LocLoad(ImmU16),
226    LocLoadWBe(ImmU16),
227    LocLoadWLe(ImmU16),
228
229    MemStore,
230    MemStoreImm(ImmU32),
231    MemStoreWBe,
232    MemStoreWBeImm(ImmU32),
233    MemStoreWLe,
234    MemStoreWLeImm(ImmU32),
235    LocStore(ImmU16),
236    LocStoreWBe(ImmU16),
237    LocStoreWLe(ImmU16),
238
239    MemStream,
240    AdvPipe,
241
242    AdvPush(ImmU8),
243    AdvLoadW,
244
245    SysEvent(SystemEventNode),
246
247    // ----- cryptographic operations ------------------------------------------------------------
248    Hash,
249    HMerge,
250    HPerm,
251    MTreeGet,
252    MTreeSet,
253    MTreeMerge,
254    MTreeVerify,
255    MTreeVerifyWithError(ErrorMsg),
256
257    // ----- STARK proof verification ------------------------------------------------------------
258    FriExt2Fold4,
259    HornerBase,
260    HornerExt,
261    EvalCircuit,
262    LogPrecompile,
263
264    // ----- exec / call -------------------------------------------------------------------------
265    Exec(InvocationTarget),
266    Call(InvocationTarget),
267    SysCall(InvocationTarget),
268    DynExec,
269    DynCall,
270    ProcRef(InvocationTarget),
271
272    // ----- debug decorators --------------------------------------------------------------------
273    Breakpoint,
274    Debug(DebugOptions),
275
276    // ----- event decorators --------------------------------------------------------------------
277    Emit,
278    EmitImm(ImmFelt),
279    Trace(ImmU32),
280}
281
282impl Instruction {
283    /// Returns true if the instruction should yield a breakpoint.
284    pub const fn should_break(&self) -> bool {
285        matches!(self, Self::Breakpoint)
286    }
287}
288
289impl core::fmt::Display for Instruction {
290    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
291        use crate::prettier::PrettyPrint;
292
293        self.pretty_print(f)
294    }
295}