Skip to main content

DebugBackend

Struct DebugBackend 

Source
pub struct DebugBackend<B: RiscvTranspiler> { /* private fields */ }

Implementations§

Source§

impl<B: RiscvTranspiler> DebugBackend<B>

Source

pub const fn new(backend: B) -> Self

Trait Implementations§

Source§

impl<B: RiscvTranspiler> ComputeInstructions for DebugBackend<B>

Source§

fn add(&mut self, rd: RiscRegister, rs1: RiscOperand, rs2: RiscOperand)

Add the values of two registers together, using 64bit arithmetic. Read more
Source§

fn sub(&mut self, rd: RiscRegister, rs1: RiscOperand, rs2: RiscOperand)

Subtract the values of two registers from each other, using 64bit arithmetic. Read more
Source§

fn xor(&mut self, rd: RiscRegister, rs1: RiscOperand, rs2: RiscOperand)

Bitwise XOR the values of two registers together. Read more
Source§

fn or(&mut self, rd: RiscRegister, rs1: RiscOperand, rs2: RiscOperand)

Bitwise OR the values of two registers together. Read more
Source§

fn and(&mut self, rd: RiscRegister, rs1: RiscOperand, rs2: RiscOperand)

Bitwise AND the values of two registers together. Read more
Source§

fn sll(&mut self, rd: RiscRegister, rs1: RiscOperand, rs2: RiscOperand)

Shift the values of two registers left by the amount specified by the second register. Read more
Source§

fn srl(&mut self, rd: RiscRegister, rs1: RiscOperand, rs2: RiscOperand)

Shift the values of two registers right by the amount specified by the second register. Read more
Source§

fn sra(&mut self, rd: RiscRegister, rs1: RiscOperand, rs2: RiscOperand)

Shift the values of two registers right by the amount specified by the second register, using arithmetic right shift. Read more
Source§

fn slt(&mut self, rd: RiscRegister, rs1: RiscOperand, rs2: RiscOperand)

Set if less than (signed comparison). Read more
Source§

fn sltu(&mut self, rd: RiscRegister, rs1: RiscOperand, rs2: RiscOperand)

Set if less than (unsigned comparison). Read more
Source§

fn mul(&mut self, rd: RiscRegister, rs1: RiscOperand, rs2: RiscOperand)

Multiply the values of two registers together, using 64bit arithmetic. Read more
Source§

fn mulh(&mut self, rd: RiscRegister, rs1: RiscOperand, rs2: RiscOperand)

Multiply the values of two registers together and return the high 64 bits (signed). Read more
Source§

fn mulhu(&mut self, rd: RiscRegister, rs1: RiscOperand, rs2: RiscOperand)

Multiply the values of two registers together and return the high 64 bits (unsigned). Read more
Source§

fn mulhsu(&mut self, rd: RiscRegister, rs1: RiscOperand, rs2: RiscOperand)

Multiply signed rs1 by unsigned rs2 and return the high 64 bits. Read more
Source§

fn div(&mut self, rd: RiscRegister, rs1: RiscOperand, rs2: RiscOperand)

Divide the values of two registers (signed). Read more
Source§

fn divu(&mut self, rd: RiscRegister, rs1: RiscOperand, rs2: RiscOperand)

Divide the values of two registers (unsigned). Read more
Source§

fn rem(&mut self, rd: RiscRegister, rs1: RiscOperand, rs2: RiscOperand)

Remainder of two registers (signed). Read more
Source§

fn remu(&mut self, rd: RiscRegister, rs1: RiscOperand, rs2: RiscOperand)

Remainder of two registers (unsigned). Read more
Source§

fn addw(&mut self, rd: RiscRegister, rs1: RiscOperand, rs2: RiscOperand)

Add the values of two registers together, using 64bit arithmetic, but only keeping lower 32 bits. Read more
Source§

fn subw(&mut self, rd: RiscRegister, rs1: RiscOperand, rs2: RiscOperand)

Subtract the values of two registers, using 64bit arithmetic, but only keeping lower 32 bits. Read more
Source§

fn sllw(&mut self, rd: RiscRegister, rs1: RiscOperand, rs2: RiscOperand)

Shift the values of two registers left by the amount specified by the second register (32-bit). Read more
Source§

fn srlw(&mut self, rd: RiscRegister, rs1: RiscOperand, rs2: RiscOperand)

Shift the values of two registers right by the amount specified by the second register (32-bit logical). Read more
Source§

fn sraw(&mut self, rd: RiscRegister, rs1: RiscOperand, rs2: RiscOperand)

Shift the values of two registers right by the amount specified by the second register (32-bit arithmetic). Read more
Source§

fn mulw(&mut self, rd: RiscRegister, rs1: RiscOperand, rs2: RiscOperand)

Multiply the values of two registers together, using 32bit arithmetic (sign-extended to 64-bit). Read more
Source§

fn divw(&mut self, rd: RiscRegister, rs1: RiscOperand, rs2: RiscOperand)

Divide the values of two registers together, using 32bit arithmetic (sign-extended to 64-bit). Read more
Source§

fn divuw(&mut self, rd: RiscRegister, rs1: RiscOperand, rs2: RiscOperand)

Divide the values of two registers, unsigned 32bit (sign-extended to 64-bit). Read more
Source§

fn remw(&mut self, rd: RiscRegister, rs1: RiscOperand, rs2: RiscOperand)

Remainder the values of two registers together, using 32bit arithmetic (sign-extended to 64-bit). Read more
Source§

fn remuw(&mut self, rd: RiscRegister, rs1: RiscOperand, rs2: RiscOperand)

Remainder the values of two registers, unsigned 32bit (sign-extended to 64-bit). Read more
Source§

fn auipc(&mut self, rd: RiscRegister, imm: u64)

Advance to the next pc, storing the current (pc + imm) in a register. Read more
Source§

fn lui(&mut self, rd: RiscRegister, imm: u64)

Load upper immediate into a register. Read more
Source§

impl<B: RiscvTranspiler> ControlFlowInstructions for DebugBackend<B>

Source§

fn beq(&mut self, rs1: RiscRegister, rs2: RiscRegister, imm: u64)

Compare the values of two registers, and jump to an address if they are equal. Read more
Source§

fn bne(&mut self, rs1: RiscRegister, rs2: RiscRegister, imm: u64)

Compare the values of two registers, and jump to an address if they are not equal. Read more
Source§

fn blt(&mut self, rs1: RiscRegister, rs2: RiscRegister, imm: u64)

Compare the values of two registers, and jump to an address if the first is less than the second. Read more
Source§

fn bge(&mut self, rs1: RiscRegister, rs2: RiscRegister, imm: u64)

Compare the values of two registers, and jump to an address if the first is greater than or equal to the second. Read more
Source§

fn bltu(&mut self, rs1: RiscRegister, rs2: RiscRegister, imm: u64)

Compare the values of two registers, and jump to an address if the first is less than the second, unsigned. Read more
Source§

fn bgeu(&mut self, rs1: RiscRegister, rs2: RiscRegister, imm: u64)

Compare the values of two registers, and jump to an address if the first is greater than or equal to the second, unsigned. Read more
Source§

fn jal(&mut self, rd: RiscRegister, imm: u64)

Jump to an address. Read more
Source§

fn jalr(&mut self, rd: RiscRegister, rs1: RiscRegister, imm: u64)

Jump to an address, and return to the previous address. Read more
Source§

impl<B: RiscvTranspiler> MemoryInstructions for DebugBackend<B>

Source§

fn lb(&mut self, rd: RiscRegister, rs1: RiscRegister, imm: u64)

Load a byte from memory into a register. Read more
Source§

fn lh(&mut self, rd: RiscRegister, rs1: RiscRegister, imm: u64)

Load a half word from memory into a register. Read more
Source§

fn lw(&mut self, rd: RiscRegister, rs1: RiscRegister, imm: u64)

Load a word from memory into a register. Read more
Source§

fn lbu(&mut self, rd: RiscRegister, rs1: RiscRegister, imm: u64)

Load a byte from memory into a register, zero extended. Read more
Source§

fn lhu(&mut self, rd: RiscRegister, rs1: RiscRegister, imm: u64)

Load a half word from memory into a register, zero extended. Read more
Source§

fn ld(&mut self, rd: RiscRegister, rs1: RiscRegister, imm: u64)

Load a double word from memory into a register. Read more
Source§

fn lwu(&mut self, rd: RiscRegister, rs1: RiscRegister, imm: u64)

Load a word from memory into a register, zero extended. Read more
Source§

fn sb(&mut self, rs1: RiscRegister, rs2: RiscRegister, imm: u64)

Store a byte into memory. Read more
Source§

fn sh(&mut self, rs1: RiscRegister, rs2: RiscRegister, imm: u64)

Store a half word into memory. Read more
Source§

fn sw(&mut self, rs1: RiscRegister, rs2: RiscRegister, imm: u64)

Store a word into memory. Read more
Source§

fn sd(&mut self, rs1: RiscRegister, rs2: RiscRegister, imm: u64)

Store a double word into memory. Read more
Source§

impl<B: RiscvTranspiler + Debuggable> RiscvTranspiler for DebugBackend<B>

Source§

fn new( program_size: usize, memory_size: usize, max_trace_size: u64, pc_start: u64, pc_base: u64, clk_bump: u64, ) -> Result<Self, Error>

Create a new transpiler. Read more
Source§

fn register_ecall_handler(&mut self, handler: EcallHandler)

Register a rust function of the form EcallHandler that will be used as the ECALL.
Source§

fn start_instr(&mut self)

Populates a jump table entry for the current instruction being transpiled. Read more
Source§

fn end_instr(&mut self)

This method should be called for “each pc” in the program. Handle logics when finishing execution of an instruction such as bumping clk and jump to branch destination.
Source§

fn inspect_register(&mut self, reg: RiscRegister, handler: DebugFn)

Inspcet a RiscRegister using a function pointer. Read more
Source§

fn inspect_immediate(&mut self, imm: u64, handler: DebugFn)

Print an immediate value. Read more
Source§

fn call_extern_fn(&mut self, handler: ExternFn)

Call an ExternFn from the outputted assembly. Read more
Source§

fn finalize<M: JitMemory>(self) -> Result<JitFunction<M>>

Returns the function pointer to the generated code. Read more
Source§

impl<B: RiscvTranspiler> SystemInstructions for DebugBackend<B>

Source§

fn ecall(&mut self)

Transfer control to the operating system.
Source§

fn unimp(&mut self)

Source§

impl<B: RiscvTranspiler> TraceCollector for DebugBackend<B>

Source§

fn trace_clk_end(&mut self)

Write the end clk of the trace chunk.
Source§

fn trace_clk_start(&mut self)

Write the start clk of the trace chunk.
Source§

fn trace_mem_value(&mut self, rs1: RiscRegister, imm: u64)

Write the value located at rs1 + imm into the trace buf.
Source§

fn trace_pc_start(&mut self)

Write the start pc of the trace chunk.
Source§

fn trace_registers(&mut self)

Write the current state of the registers into the trace buf. Read more

Auto Trait Implementations§

§

impl<B> Freeze for DebugBackend<B>
where B: Freeze,

§

impl<B> RefUnwindSafe for DebugBackend<B>
where B: RefUnwindSafe,

§

impl<B> Send for DebugBackend<B>
where B: Send,

§

impl<B> Sync for DebugBackend<B>
where B: Sync,

§

impl<B> Unpin for DebugBackend<B>
where B: Unpin,

§

impl<B> UnsafeUnpin for DebugBackend<B>
where B: UnsafeUnpin,

§

impl<B> UnwindSafe for DebugBackend<B>
where B: UnwindSafe,

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> Conv for T

Source§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
Source§

impl<T> Debuggable for T
where T: RiscvTranspiler,

Source§

fn print_ctx(&mut self)

Source§

impl<T> FmtForward for T

Source§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
Source§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
Source§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
Source§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
Source§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
Source§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
Source§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
Source§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
Source§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. 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<T> Pipe for T
where T: ?Sized,

Source§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
Source§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
Source§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
Source§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
Source§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe function.
Source§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
Source§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> Tap for T

Source§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
Source§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
Source§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
Source§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
Source§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
Source§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
Source§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
Source§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
Source§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
Source§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release builds.
Source§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
Source§

impl<T> TryConv for T

Source§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
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