Skip to main content

Decoder

Struct Decoder 

Source
pub struct Decoder<'d, U> { /* private fields */ }
Expand description

A decoder for individual packets and/or payloads

Use this decoder to decode encap::Packets or smi::Packets.

A decoder is created via a Builder. From the supplied data, packets of different formats may be decoded using the corresponding fns such as decode_encap_packet or decode_smi_packet. After assessing whether a packet is relevant or not, its Payload may be decoded. Multiple packets from different harts may be sequentially decoded by a single decoder instance.

If a packet could not be decoded due to insufficient data, the decoder will report this by emitting an Error::InsufficientData error. Alternatively, the number of bytes left in the input can be queried via the fn bytes_left.

§Example

The follwing example demonstrates decoding of trace data in chunks with one decoder per input, including the recovery from attempting to decode an incomplete packet. We do not need to clone the Builder since it happens to be Copy in this case.

use riscv_etrace::packet;

let builder = packet::builder().with_params(&parameters);
let mut decoder = builder.decoder(trace_data);
loop {
    let packet = match decoder.decode_encap_packet() {
        Ok(packet) => packet,
        Err(packet::Error::InsufficientData(_)) => break,
        Err(e) => panic!("{e:?}"),
    };
    // ...
}
let mut decoder = builder.decoder(trace_data_next);
loop {
    let packet = match decoder.decode_encap_packet() {
        Ok(packet) => packet,
        Err(packet::Error::InsufficientData(_)) => break,
        Err(e) => panic!("{e:?}"),
    };
    // ...
}

Implementations§

Source§

impl<'d, U> Decoder<'d, U>

Source

pub fn bytes_left(&self) -> usize

Retrieve the number of bytes left in this decoder’s data

If the decoder is currently not at a byte boundary, the number returned includes the partially decoded byte.

Source

pub fn byte_pos(&self) -> usize

Retrieve the current byte position

Returns the zero-based position of the byte which is currently decoded. If the current bit position is on a byte boundary, the position of the byte after the boundary is returned.

§Example
use riscv_etrace::packet;

let mut decoder = packet::builder().decoder(trace_data);
assert_eq!(decoder.byte_pos(), 0);
Source

pub fn reset(&mut self, data: &'d [u8])

Reset the inner data to the given byte slice

Source

pub fn decode<T: Decode<'d, U>>(&mut self) -> Result<T, Error>

Decode a single item

Decodes a single item, consuming the associated data from the input and sign-extending the input if neccessary. Depending on the item’s type and Decode implementation, the decoder may be left at a bit boundary following the item after successful operation. A failure may leave the decoder in an unspecified state.

Source

pub fn decode_encap_packet(&mut self) -> Result<Packet<Self>, Error>
where U: Clone,

Decode a single encap::Packet

Decodes a single encap::Packet, consuming the associated data from the input. After successful operation, the decoder is left at the byte boundary following the packet, ready to decode the next one. A failure may leave the decoder in an unspecified state.

Source

pub fn decode_smi_packet(&mut self) -> Result<Packet<Self>, Error>
where U: Clone,

Decode a single smi::Packet consisting of header and payload

Decodes a single smi::Packet, consuming the associated data from the input. After successful operation, the decoder is left at the byte boundary following the packet, ready to decode the next one. A failure may leave the decoder in an unspecified state.

Source

pub fn decode_esp32_packet(&mut self) -> Result<Packet<Self>, Error>
where U: Clone,

Source

pub fn decode_payload( &mut self, ) -> Result<InstructionTrace<U::IOptions, U::DOptions>, Error>
where U: Unit,

Decode a single, stand-alone InstructionTrace payload

Decodes a single InstructionTrace payload, consuming the associated data from the input and sign-extending the input if neccessary. After successful operation, the decoder is left at the bit boundary following the payload. A failure may leave the decoder in an unspecified state.

Source

pub fn unit(&self) -> &U

Retrieve this decoder’s Unit

Source

pub fn remaining_data(&self) -> &'d [u8]

Retrieve the remaining inner data, including the current byte

If the current bit position is at a byte buondary, e.g. after successful decoding of a packet, the returned buffer contains only undecoded data.

Source

pub fn split_off_to(&mut self, pos: usize) -> Result<Self, Error>
where U: Clone,

Split off a sub-decoder covering the data to the given position

On success, the inner data will be reset to the portion of the original data starting at and including byte pos past the current byte position. A decoder with the original bit position covering the first half of the buffer will be returned.

Trait Implementations§

Source§

impl<'d, U: Clone> Clone for Decoder<'d, U>

Source§

fn clone(&self) -> Decoder<'d, U>

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more

Auto Trait Implementations§

§

impl<'d, U> Freeze for Decoder<'d, U>
where U: Freeze,

§

impl<'d, U> RefUnwindSafe for Decoder<'d, U>
where U: RefUnwindSafe,

§

impl<'d, U> Send for Decoder<'d, U>
where U: Send,

§

impl<'d, U> Sync for Decoder<'d, U>
where U: Sync,

§

impl<'d, U> Unpin for Decoder<'d, U>
where U: Unpin,

§

impl<'d, U> UnsafeUnpin for Decoder<'d, U>
where U: UnsafeUnpin,

§

impl<'d, U> UnwindSafe for Decoder<'d, U>
where U: UnwindSafe,

Blanket Implementations§

Source§

impl<T> Adaptable for T

Source§

fn with_offset(self, offset: u64) -> Offset<Self>

“Move” this binary by the given offset Read more
Source§

fn boxed<'a, I>(self) -> Binary<'a, I>
where I: Info, Self: Binary<I> + Send + Sync + 'a, Self::Error: MaybeMissError + 'static,

Available on crate feature alloc only.
Box this binary for dynamic dispatching Read more
Source§

fn boxer<'a, I>(self) -> Arc<dyn Fn() -> Binary<'a, I> + 'a>
where I: Info, Self: Binary<I> + Clone + Send + Sync + 'a, Self::Error: MaybeMissError + 'static,

Available on crate feature alloc only.
Transfer this binary into a factory producing boxed clones Read more
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> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<D, I> Decode<(I, Bits)> for D
where D: Decode<I>, I: Info, (I, Bits): Info,

Source§

fn decode_16(&self, insn: u16) -> (I, Bits)

Decode a 16bit (“compressed”) instruction Info
Source§

fn decode_32(&self, insn: u32) -> (I, Bits)

Decode a 32bit (“normal”) instruction Info
Source§

fn decode_48(&self, insn: u64) -> (I, Bits)

Decode a 48bit instruction Info
Source§

fn decode_64(&self, insn: u64) -> (I, Bits)

Decode a 64bit instruction Info
Source§

fn decode_bits(&self, bits: Bits) -> I

Decode instruction Info from Bits
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

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> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. 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.