miden_assembly_syntax/ast/instruction/
mod.rs

1pub mod advice;
2pub mod debug;
3mod print;
4
5use alloc::vec::Vec;
6
7pub use self::{advice::SystemEventNode, debug::DebugOptions};
8use crate::{
9    Felt,
10    ast::{InvocationTarget, immediate::*},
11    parser::{IntValue, 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    Lte,
58    Gt,
59    Gte,
60    IsOdd,
61
62    // ----- ext2 operations ---------------------------------------------------------------------
63    Ext2Add,
64    Ext2Sub,
65    Ext2Mul,
66    Ext2Div,
67    Ext2Neg,
68    Ext2Inv,
69
70    // ----- u32 manipulation --------------------------------------------------------------------
71    U32Test,
72    U32TestW,
73    U32Assert,
74    U32AssertWithError(ErrorMsg),
75    U32Assert2,
76    U32Assert2WithError(ErrorMsg),
77    U32AssertW,
78    U32AssertWWithError(ErrorMsg),
79    U32Split,
80    U32Cast,
81    U32WrappingAdd,
82    U32WrappingAddImm(ImmU32),
83    U32OverflowingAdd,
84    U32OverflowingAddImm(ImmU32),
85    U32OverflowingAdd3,
86    U32WrappingAdd3,
87    U32WrappingSub,
88    U32WrappingSubImm(ImmU32),
89    U32OverflowingSub,
90    U32OverflowingSubImm(ImmU32),
91    U32WrappingMul,
92    U32WrappingMulImm(ImmU32),
93    U32OverflowingMul,
94    U32OverflowingMulImm(ImmU32),
95    U32OverflowingMadd,
96    U32WrappingMadd,
97    U32Div,
98    U32DivImm(ImmU32),
99    U32Mod,
100    U32ModImm(ImmU32),
101    U32DivMod,
102    U32DivModImm(ImmU32),
103    U32And,
104    U32Or,
105    U32Xor,
106    U32Not,
107    U32Shr,
108    U32ShrImm(ImmU8),
109    U32Shl,
110    U32ShlImm(ImmU8),
111    U32Rotr,
112    U32RotrImm(ImmU8),
113    U32Rotl,
114    U32RotlImm(ImmU8),
115    U32Popcnt,
116    U32Ctz,
117    U32Clz,
118    U32Clo,
119    U32Cto,
120    U32Lt,
121    U32Lte,
122    U32Gt,
123    U32Gte,
124    U32Min,
125    U32Max,
126
127    // ----- stack manipulation ------------------------------------------------------------------
128    Drop,
129    DropW,
130    PadW,
131    Dup0,
132    Dup1,
133    Dup2,
134    Dup3,
135    Dup4,
136    Dup5,
137    Dup6,
138    Dup7,
139    Dup8,
140    Dup9,
141    Dup10,
142    Dup11,
143    Dup12,
144    Dup13,
145    Dup14,
146    Dup15,
147    DupW0,
148    DupW1,
149    DupW2,
150    DupW3,
151    Swap1,
152    Swap2,
153    Swap3,
154    Swap4,
155    Swap5,
156    Swap6,
157    Swap7,
158    Swap8,
159    Swap9,
160    Swap10,
161    Swap11,
162    Swap12,
163    Swap13,
164    Swap14,
165    Swap15,
166    SwapW1,
167    SwapW2,
168    SwapW3,
169    SwapDw,
170    MovUp2,
171    MovUp3,
172    MovUp4,
173    MovUp5,
174    MovUp6,
175    MovUp7,
176    MovUp8,
177    MovUp9,
178    MovUp10,
179    MovUp11,
180    MovUp12,
181    MovUp13,
182    MovUp14,
183    MovUp15,
184    MovUpW2,
185    MovUpW3,
186    MovDn2,
187    MovDn3,
188    MovDn4,
189    MovDn5,
190    MovDn6,
191    MovDn7,
192    MovDn8,
193    MovDn9,
194    MovDn10,
195    MovDn11,
196    MovDn12,
197    MovDn13,
198    MovDn14,
199    MovDn15,
200    MovDnW2,
201    MovDnW3,
202    CSwap,
203    CSwapW,
204    CDrop,
205    CDropW,
206
207    // ----- input / output operations -----------------------------------------------------------
208    Push(Immediate<IntValue>),
209    PushU8(u8),
210    PushU16(u16),
211    PushU32(u32),
212    PushFelt(Felt),
213    PushWord(WordValue),
214    PushU8List(Vec<u8>),
215    PushU16List(Vec<u16>),
216    PushU32List(Vec<u32>),
217    PushFeltList(Vec<Felt>),
218    Locaddr(ImmU16),
219    Sdepth,
220    Caller,
221    Clk,
222
223    MemLoad,
224    MemLoadImm(ImmU32),
225    MemLoadW,
226    MemLoadWImm(ImmU32),
227    LocLoad(ImmU16),
228    LocLoadW(ImmU16),
229
230    MemStore,
231    MemStoreImm(ImmU32),
232    LocStore(ImmU16),
233    MemStoreW,
234    MemStoreWImm(ImmU32),
235    LocStoreW(ImmU16),
236
237    MemStream,
238    AdvPipe,
239
240    AdvPush(ImmU8),
241    AdvLoadW,
242
243    SysEvent(SystemEventNode),
244
245    // ----- cryptographic operations ------------------------------------------------------------
246    Hash,
247    HMerge,
248    HPerm,
249    MTreeGet,
250    MTreeSet,
251    MTreeMerge,
252    MTreeVerify,
253    MTreeVerifyWithError(ErrorMsg),
254
255    // ----- STARK proof verification ------------------------------------------------------------
256    FriExt2Fold4,
257    HornerBase,
258    HornerExt,
259    EvalCircuit,
260
261    // ----- exec / call -------------------------------------------------------------------------
262    Exec(InvocationTarget),
263    Call(InvocationTarget),
264    SysCall(InvocationTarget),
265    DynExec,
266    DynCall,
267    ProcRef(InvocationTarget),
268
269    // ----- debug decorators --------------------------------------------------------------------
270    Breakpoint,
271    Debug(DebugOptions),
272
273    // ----- event decorators --------------------------------------------------------------------
274    Emit(ImmU32),
275    Trace(ImmU32),
276}
277
278impl Instruction {
279    /// Returns true if the instruction should yield a breakpoint.
280    pub const fn should_break(&self) -> bool {
281        matches!(self, Self::Breakpoint)
282    }
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}