Struct midenc_codegen_masm::Emulator

source ·
pub struct Emulator { /* private fields */ }
Expand description

Emulator provides us with a means to execute our MASM IR directly without having to emit “real” MASM and run it via the Miden VM. In other words, it’s a convenient way to run tests to verify the expected behavior of a program without all of the baggage of the Miden VM.

Emulator is necessarily a more limited execution environment:

  • It only handles instructions which are defined in the Op enum
  • Anything related to proving, calling contracts, etc. is not supported
  • The default environment is empty, i.e. there are no Miden VM standard library functions available. Users must emit Miden IR for all functions they wish to call, or alternatively, provide native stubs.

Implementations§

source§

impl Emulator

source

pub const DEFAULT_HEAP_SIZE: u32 = 16_384u32

source

pub const DEFAULT_HEAP_START: u32 = 8_192u32

source

pub const DEFAULT_LOCALS_START: u32 = 12_288u32

source

pub fn new(memory_size: u32, hp: u32, lp: u32, print_stack: bool) -> Self

Construct a new, empty emulator with:

  • A linear memory heap of memory_size words
  • The start of the usable heap set to hp (an address in words)
  • The start of the reserved heap used for locals set to lp (an address in words)
source

pub fn set_max_cycles(&mut self, max: usize)

Place a cap on the number of cycles the emulator will execute before failing with an error

source

pub fn watchpoints(&self) -> impl Iterator<Item = Watchpoint> + '_

Returns all watchpoints that are currently managed by this [BreakpointManager]

source

pub fn breakpoints(&self) -> impl Iterator<Item = Breakpoint>

Returns all breakpoints that are currently managed by this [BreakpointManager]

source

pub fn set_breakpoint(&mut self, bp: Breakpoint)

Sets a breakpoint for the emulator

source

pub fn clear_breakpoint(&mut self, bp: Breakpoint)

Removes the given breakpoint from the emulator

source

pub fn clear_breakpoints(&mut self)

Removes the all breakpoints from the emulator

source

pub fn set_watchpoint( &mut self, addr: u32, size: u32, mode: WatchMode, ) -> WatchpointId

Sets a watchpoint in the emulator

source

pub fn clear_watchpoint(&mut self, id: WatchpointId)

Sets a watchpoint in the emulator

source

pub fn watchpoint_mode(&mut self, id: WatchpointId, mode: WatchMode)

Set the watch mode for a Watchpoint using the identifier returned by [watch]

source

pub fn clear_watchpoints(&mut self)

Clears all watchpoints

source

pub fn clear_break_and_watchpoints(&mut self)

Clear all breakpoints and watchpoints

source

pub fn info(&self) -> Option<DebugInfo<'_>>

Get’s debug information about the current emulator state

source

pub fn stacktrace(&self) -> Vec<CallFrame>

Get a stacktrace for the code running in the emulator

source

pub fn current_ip(&self) -> Option<Instruction>

Get the instruction pointer that will be next executed by the emulator

source

pub fn current_function(&self) -> Option<FunctionIdent>

Get the name of the function that is currently executing

source

pub fn stack(&mut self) -> &OperandStack<Felt>

Get access to the current state of the operand stack

source

pub fn stack_mut(&mut self) -> &mut OperandStack<Felt>

Get mutable access to the current state of the operand stack

source

pub fn load_program( &mut self, program: Arc<Program>, ) -> Result<(), EmulationError>

Load program into this emulator

This resets the emulator state, as only one program may be loaded at a time.

source

pub fn load_module(&mut self, module: Arc<Module>) -> Result<(), EmulationError>

Load module into this emulator

An error is returned if a module with the same name is already loaded.

source

pub fn reload_module( &mut self, module: Arc<Module>, ) -> Result<(), EmulationError>

Reloads a loaded module, name.

This function will panic if the named module is not currently loaded.

source

pub fn unload_module(&mut self, name: Ident)

Unloads a loaded module, name.

This function will panic if the named module is not currently loaded.

source

pub fn load_nif( &mut self, id: FunctionIdent, function: Box<dyn FnMut(&mut Emulator, &[Felt]) -> Result<(), EmulationError>>, ) -> Result<(), EmulationError>

Load function into this emulator, with the given identifier

Because we don’t know the set of [FuncId] that have already been allocated, we leave the choice up to the caller. We assert that functions do not get defined twice to catch conflicts, just in case.

source

pub fn write_bytes_to_memory(&mut self, value: &[u8]) -> u32

Allocate space for value on the emulator heap, and copy it’s contents there.

NOTE: The smallest unit of addressable memory is 4 bytes (32 bits). If you provide a value that is smaller than this, or is not a multiple of 4, the data will be padded with zeroes to ensure that it is.

source

pub fn malloc(&mut self, size: usize) -> u32

Allocate enough words to hold size bytes of memory

Returns the pointer as a byte-addressable address

source

pub fn store(&mut self, addr: usize, value: Felt)

Write value to the word at addr, and element index

source

pub fn start(&mut self) -> Result<OperandStack<Felt>, EmulationError>

Start executing the current program by invokeing the top-level initialization block (the entrypoint).

This function will run the program to completion, and return the state of the operand stack on exit.

NOTE: If no entrypoint has been loaded, an error is returned.

The emulator is automatically reset when it exits successfully.

source

pub fn init(&mut self) -> Result<EmulatorEvent, EmulationError>

Start emulation by entering the top-level initialization block (the entrypoint).

This should be called instead of start when stepping through a program rather than executing it to completion in one call.

NOTE: If no entrypoint has been loaded, an error is returned.

It is up to the caller to reset the emulator when the program exits, unlike start.

source

pub fn stop(&mut self)

Stop running the currently executing function, and reset the cycle counter, operand stack, and linear memory.

This function preserves loaded code, breakpoints, and other configuration items.

If an attempt is made to run the emulator in the stopped state, a panic will occur

source

pub fn reset(&mut self)

Reset the emulator state to its initial state at creation.

In addition to resetting the cycle counter, operand stack, and linear memory, this function also unloads all code, and clears all breakpoints. Only the configuration used to initialize the emulator is preserved.

To use the emulator after calling this function, you must load a program or module again.

source

pub fn invoke( &mut self, callee: FunctionIdent, args: &[Felt], ) -> Result<OperandStack<Felt>, EmulationError>

Run the emulator by invoking callee with args placed on the operand stack in FIFO order.

If a fatal error occurs during emulation, Err is returned, e.g. if callee has not been loaded.

When callee returns, it’s result will be returned wrapped in Ok. For functions with no return value, this will be Ok(None), or all others it will be Ok(Some(value)).

source

pub fn enter( &mut self, callee: FunctionIdent, args: &[Felt], ) -> Result<EmulatorEvent, EmulationError>

Run the emulator by invoking callee with args placed on the operand stack in FIFO order.

If a fatal error occurs during emulation, Err is returned, e.g. if callee has not been loaded.

When callee returns, it’s result will be returned wrapped in Ok. For functions with no return value, this will be Ok(None), or all others it will be Ok(Some(value)).

source

pub fn resume(&mut self) -> Result<EmulatorEvent, EmulationError>

Resume execution when the emulator suspended due to a breakpoint

source§

impl Emulator

source

pub fn step(&mut self) -> Result<EmulatorEvent, EmulationError>

Step the emulator forward one cycle, returning the type of event produced during that cycle, or an error.

source

pub fn step_over(&mut self) -> Result<EmulatorEvent, EmulationError>

Step the emulator forward one step, but stepping past any nested blocks or function calls, returning the type of event produced during that cycle, or an error.

source

pub fn step_out(&mut self) -> Result<EmulatorEvent, EmulationError>

Step the emulator forward until control returns from the current function.

Trait Implementations§

source§

impl Default for Emulator

source§

fn default() -> Self

Returns the “default value” for a type. Read more

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T> Instrument for T

source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T> IntoEither for T

source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
source§

impl<D> OwoColorize for D

source§

fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>
where C: Color,

Set the foreground color generically Read more
source§

fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>
where C: Color,

Set the background color generically. Read more
source§

fn black(&self) -> FgColorDisplay<'_, Black, Self>

Change the foreground color to black
source§

fn on_black(&self) -> BgColorDisplay<'_, Black, Self>

Change the background color to black
source§

fn red(&self) -> FgColorDisplay<'_, Red, Self>

Change the foreground color to red
source§

fn on_red(&self) -> BgColorDisplay<'_, Red, Self>

Change the background color to red
source§

fn green(&self) -> FgColorDisplay<'_, Green, Self>

Change the foreground color to green
source§

fn on_green(&self) -> BgColorDisplay<'_, Green, Self>

Change the background color to green
source§

fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>

Change the foreground color to yellow
source§

fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>

Change the background color to yellow
source§

fn blue(&self) -> FgColorDisplay<'_, Blue, Self>

Change the foreground color to blue
source§

fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>

Change the background color to blue
source§

fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>

Change the foreground color to magenta
source§

fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>

Change the background color to magenta
source§

fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>

Change the foreground color to purple
source§

fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>

Change the background color to purple
source§

fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>

Change the foreground color to cyan
source§

fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>

Change the background color to cyan
source§

fn white(&self) -> FgColorDisplay<'_, White, Self>

Change the foreground color to white
source§

fn on_white(&self) -> BgColorDisplay<'_, White, Self>

Change the background color to white
source§

fn default_color(&self) -> FgColorDisplay<'_, Default, Self>

Change the foreground color to the terminal default
source§

fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>

Change the background color to the terminal default
source§

fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>

Change the foreground color to bright black
source§

fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>

Change the background color to bright black
source§

fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>

Change the foreground color to bright red
source§

fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>

Change the background color to bright red
source§

fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>

Change the foreground color to bright green
source§

fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>

Change the background color to bright green
source§

fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>

Change the foreground color to bright yellow
source§

fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>

Change the background color to bright yellow
source§

fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>

Change the foreground color to bright blue
source§

fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>

Change the background color to bright blue
source§

fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>

Change the foreground color to bright magenta
source§

fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>

Change the background color to bright magenta
source§

fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>

Change the foreground color to bright purple
source§

fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>

Change the background color to bright purple
source§

fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>

Change the foreground color to bright cyan
source§

fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>

Change the background color to bright cyan
source§

fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>

Change the foreground color to bright white
source§

fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>

Change the background color to bright white
source§

fn bold(&self) -> BoldDisplay<'_, Self>

Make the text bold
source§

fn dimmed(&self) -> DimDisplay<'_, Self>

Make the text dim
source§

fn italic(&self) -> ItalicDisplay<'_, Self>

Make the text italicized
source§

fn underline(&self) -> UnderlineDisplay<'_, Self>

Make the text italicized
Make the text blink
Make the text blink (but fast!)
source§

fn reversed(&self) -> ReversedDisplay<'_, Self>

Swap the foreground and background colors
source§

fn hidden(&self) -> HiddenDisplay<'_, Self>

Hide the text
source§

fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>

Cross out the text
source§

fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>
where Color: DynColor,

Set the foreground color at runtime. Only use if you do not know which color will be used at compile-time. If the color is constant, use either OwoColorize::fg or a color-specific method, such as OwoColorize::green, Read more
source§

fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>
where Color: DynColor,

Set the background color at runtime. Only use if you do not know what color to use at compile-time. If the color is constant, use either OwoColorize::bg or a color-specific method, such as OwoColorize::on_yellow, Read more
source§

fn fg_rgb<const R: u8, const G: u8, const B: u8>( &self, ) -> FgColorDisplay<'_, CustomColor<R, G, B>, Self>

Set the foreground color to a specific RGB value.
source§

fn bg_rgb<const R: u8, const G: u8, const B: u8>( &self, ) -> BgColorDisplay<'_, CustomColor<R, G, B>, Self>

Set the background color to a specific RGB value.
source§

fn truecolor(&self, r: u8, g: u8, b: u8) -> FgDynColorDisplay<'_, Rgb, Self>

Sets the foreground color to an RGB value.
source§

fn on_truecolor(&self, r: u8, g: u8, b: u8) -> BgDynColorDisplay<'_, Rgb, Self>

Sets the background color to an RGB value.
source§

fn style(&self, style: Style) -> Styled<&Self>

Apply a runtime-determined style
source§

impl<T> Same for T

source§

type Output = T

Should always be Self
source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

source§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

source§

fn vzip(self) -> V

source§

impl<T> WithSubscriber for T

source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more