Skip to main content

Simulator

Struct Simulator 

Source
pub struct Simulator<B: SimBackend = DefaultBackend> { /* private fields */ }
Expand description

The core logic evaluation engine.

Encapsulates the backend, the original SIR program, and an optional VCD writer. Provides low-level, event-driven control.

The default type parameter B = DefaultBackend means that bare Simulator uses the custom native backend on a matching host and Cranelift for cross-codegen builds or unsupported hosts.

Implementations§

Source§

impl<B: SimBackend> Simulator<B>

Source

pub fn with_backend_and_program( backend: B, program: RuntimeProgram, warnings: Vec<CompilationWarning>, ) -> Self

Source

pub fn drain_runtime_events(&mut self) -> Vec<RuntimeEvent>

Source

pub fn drain_runtime_events_with_context( &mut self, ctx: RuntimeFormatContext<'_>, ) -> Vec<RuntimeEvent>

Source

pub fn runtime_event_drain(&mut self) -> Option<RuntimeEventDrain>

Source

pub fn program(&self) -> &RuntimeProgram

Returns a reference to the compiled SIR program.

Source

pub fn backend_ref(&self) -> &B

Returns a reference to the backend (for signal/event resolution).

Source

pub fn warnings(&self) -> &[CompilationWarning]

Returns warnings emitted during compilation.

Source

pub fn dump(&mut self, timestamp: u64)

Captures the current state of all signals and writes them to the VCD file.

Source

pub fn set<T: Copy>(&mut self, signal: SignalRef, val: T)

Sets a signal value and marks combinational logic as dirty.

Source

pub fn set_wide(&mut self, signal: SignalRef, val: BigUint)

Sets a wide signal value and marks combinational logic as dirty.

Source

pub fn set_four_state(&mut self, signal: SignalRef, val: BigUint, mask: BigUint)

Sets a four-state signal value and marks combinational logic as dirty.

Source

pub fn modify<F>(&mut self, f: F) -> Result<(), RuntimeErrorCode>
where F: FnOnce(&mut IOContext<'_, B>),

Modifies internal state via a callback and marks combinational logic as dirty.

Source

pub fn tick(&mut self, event: B::Event) -> Result<(), RuntimeErrorCode>

Manually triggers a clock or event to process sequential logic.

Source

pub fn signal(&self, path: &str) -> SignalRef

Resolves a signal path into a performance-optimized SignalRef. This handle allows for direct memory access without HashMap lookups.

Source

pub fn event(&self, port: &str) -> B::Event

Resolve a port name to an event handle.

Source

pub fn try_signal(&self, path: &str) -> Result<SignalRef, AddrLookupError>

Try to resolve a signal path. Returns Err if the path is not found or ambiguous.

Source

pub fn try_event(&self, port: &str) -> Result<B::Event, AddrLookupError>

Try to resolve a port name to an event handle.

Source

pub fn get_as<T: Default + Copy>(&mut self, signal: SignalRef) -> T

Retrieves the current value as a fixed-size type without BigUint allocation. Lazily evaluates combinational logic if the state is dirty.

Source

pub fn get(&mut self, signal: SignalRef) -> BigUint

Retrieves the current value of a variable using a pre-resolved SignalRef handle. Lazily evaluates combinational logic if the state is dirty.

Source

pub fn get_four_state(&mut self, signal: SignalRef) -> (BigUint, BigUint)

Retrieves the current 4-state value (value, mask) of a variable using a SignalRef handle. Lazily evaluates combinational logic if the state is dirty.

Source

pub fn eval_comb(&mut self) -> Result<(), RuntimeErrorCode>

Directly execute combinational logic evaluation.

Source

pub fn memory_as_ptr(&self) -> (*const u8, usize)

Returns a raw pointer to the backend memory and its total size in bytes.

Source

pub fn memory_as_mut_ptr(&mut self) -> (*mut u8, usize)

Returns a mutable raw pointer to the backend memory and its total size in bytes.

Source

pub fn stable_region_size(&self) -> usize

Returns the stable region size in bytes.

Source

pub fn layout(&self) -> &MemoryLayout

Returns a reference to the memory layout.

Source

pub fn take_vcd_writer(&mut self) -> Option<VcdWriter>

Take ownership of the VCD writer, if one was configured at build time.

Builders create the writer themselves so that layout selection can account for VCD recording; callers building handles around a backend use this to keep tracing alive without rebuilding descriptors.

Source

pub fn build_vcd_descs(&self, four_state_mode: bool) -> Vec<VcdSignalDesc>

Build VCD signal descriptors for all instances.

The returned descriptors are self-contained (no IR references) and can be cached alongside SharedJitCode so that VCD works on cache-hit paths without the original RuntimeProgram.

Source

pub fn named_signals(&self) -> Vec<NamedSignal>

Returns all ports of the top-level module with their resolved signal references.

Source

pub fn instance_signals( &self, instance_path: &[(&str, usize)], ) -> Vec<NamedSignal>

Returns all signals for the instance at the given hierarchical path.

The path is specified as a slice of (instance_name, index) pairs. Returns an empty Vec if the path does not exist.

Source

pub fn named_events(&self) -> Vec<NamedEvent<B>>

Returns all events (clock/reset signals) with their IDs and event references.

Source

pub fn tick_by_id(&mut self, event_id: usize) -> Result<(), RuntimeErrorCode>

Triggers a clock/event by its numeric ID.

§Errors

Returns RuntimeErrorCode::NotAnEvent if event_id is not a known event ID, or a runtime error if evaluating the event fails.

Source

pub fn tick_by_id_n( &mut self, event_id: usize, count: u32, ) -> Result<(), RuntimeErrorCode>

Triggers a clock/event N times by its numeric ID. Avoids repeated cross-boundary calls when used from FFI. The event ID is validated even when count is zero.

§Errors

Returns RuntimeErrorCode::NotAnEvent if event_id is not a known event ID, or a runtime error if evaluating an event fails.

Source

pub fn child_signal( &self, instance_path: &[(&str, usize)], var: &str, ) -> SignalRef

Resolves a signal inside a child instance.

Source

pub fn try_child_signal( &self, instance_path: &[(&str, usize)], var: &str, ) -> Result<SignalRef, AddrLookupError>

Try to resolve a signal inside a child instance.

Source

pub fn named_hierarchy(&self) -> InstanceHierarchy

Returns the full instance hierarchy starting from the top module.

Source§

impl Simulator

Source

pub fn builder<'a>( code: &'a str, top: &'a str, ) -> SimulatorBuilder<'a, Simulator>

Source

pub fn from_sources<'a>( sources: Vec<(&'a str, &'a Path)>, top: &'a str, ) -> SimulatorBuilder<'a, Simulator>

Source

pub fn from_frontend( artifact: FrontendArtifact, ) -> SimulatorBuilder<'static, Simulator>

Low-level adapter hook for an elaborated external frontend artifact.

Frontend crates should wrap this with a constructor named for their own artifact type instead of exposing celox_frontend_sdk::FrontendArtifact to applications.

Source

pub fn from_frontend_with_testbench<'a>( artifact: FrontendArtifact, sources: Vec<(&'a str, &'a Path)>, top: &'a str, ) -> SimulatorBuilder<'a, Simulator>

Low-level adapter hook for a Veryl testbench around an external module.

Source§

impl Simulator<JitBackend>

Source

pub fn shared_code(&self) -> Arc<SharedJitCode>

Returns the shared compiled JIT code, allowing it to be reused for creating additional simulator instances without recompilation.

Source

pub fn into_backend(self) -> JitBackend

Consume the simulator and return the inner JIT backend.

Source§

impl Simulator<WasmBackend>

Source

pub fn into_backend(self) -> WasmBackend

Consume the simulator and return the inner Wasmtime backend.

Source§

impl Simulator<TieredBackend>

Source

pub fn is_compiled(&self) -> bool

Whether this tiered simulation has adopted its compiled tier.

False while background compilation is still running or after it failed (the interpreter then remains the permanent tier).

Source

pub fn tiered_execution_stats(&self) -> TieredExecutionStats

Return deterministic tier lifecycle and evaluation measurements.

The snapshot contains counts rather than ad-hoc wall-clock samples; use a statistical benchmark harness to measure elapsed time.

Source

pub fn start_tiered_execution_timing(&mut self)

Start opt-in wall-clock measurement from workload execution to promotion. Ordinary tiered simulation does not read the host clock.

Source

pub fn finish_tiered_execution_timing( &mut self, ) -> Option<TieredExecutionTiming>

Stop tiered execution timing and return the promotion interval.

Source

pub fn promotion_error(&self) -> Option<&SimulatorError>

Why promotion has not happened yet, for diagnostics.

Source

pub fn cancel_background_compilation(&mut self) -> bool

Request cancellation of background compilation.

The simulation stays on the interpreter permanently and Simulator::promotion_error reports the cancellation. Returns whether a background compilation was still pending.

Source

pub fn into_backend(self) -> TieredBackend

Consume the simulator and return the inner tiered backend.

Source§

impl Simulator<NativeBackend>

Source

pub fn shared_code(&self) -> Arc<SharedNativeCode>

Returns the shared compiled native code, allowing it to be reused for creating additional simulator instances without recompilation.

Source

pub fn start_native_execution_timing(&mut self)

Start measuring time spent inside generated native simulator functions.

The measurement is disabled by default, so ordinary simulation does not read the host clock. Native tick loops are measured once per host-side batch rather than once per simulated tick.

Source

pub fn finish_native_execution_timing( &mut self, ) -> Option<NativeExecutionTiming>

Stop native execution timing and return the accumulated measurement.

Source

pub fn from_shared(shared: Arc<SharedNativeCode>, program: OptimizedSir) -> Self

Create a simulator from pre-compiled shared native code.

Source

pub fn into_backend(self) -> NativeBackend

Consume the simulator and return the inner native backend.

Trait Implementations§

Source§

impl<B: SimBackend> Debug for Simulator<B>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<B: SimBackend> SimulationExecutor for Simulator<B>

Source§

type Backend = B

Source§

fn backend(&self) -> &B

Source§

fn backend_mut(&mut self) -> &mut B

Source§

fn eval_comb(&mut self) -> Result<(), RuntimeErrorCode>

Source§

fn eval_apply_ff_at(&mut self, event: B::Event) -> Result<(), RuntimeErrorCode>

Source§

fn eval_only_ff_at(&mut self, event: B::Event) -> Result<(), RuntimeErrorCode>

Source§

fn apply_ff_at(&mut self, event: B::Event) -> Result<(), RuntimeErrorCode>

Source§

fn stage_external_event( &mut self, event: B::Event, _timestamp: u64, ) -> Result<(), RuntimeErrorCode>

Snapshot external-component inputs immediately before an event domain evaluates its sequential logic.
Source§

fn fire_external_event( &mut self, event: B::Event, timestamp: u64, ) -> Result<(), RuntimeErrorCode>

Fire external-component hooks after the event domain commits and before the following combinational settle.
Source§

fn finish_timed_step(&mut self, timestamp: u64)

Called after the state for a simulation timestamp has stabilized.

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 underlined
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> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
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 = !

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<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