Skip to main content

PinScanner

Struct PinScanner 

Source
pub struct PinScanner { /* private fields */ }
Expand description

Basic structure for doing boundary scanning. Expects a fixed chain of devices.

Implementations§

Source§

impl PinScanner

Source

pub fn tap_count(&self) -> usize

Count of TAPs on the chain.

Source

pub fn tap_infos(&self) -> &[TapInfo]

Information for TAPs on the chain.

Source

pub fn get_tap_info(&self, i: usize) -> Result<TapInfo, Error>

TapInfo of a TAP; the index is of Self::tap_infos.

Source

pub fn get_tap_state(&self, i: usize) -> Result<TapState, Error>

Current state of a TAP; the index is of Self::tap_infos.

Source

pub fn set_tap_state( &mut self, i: usize, new_state: TapState, ) -> Result<(), Error>

Switches the state of a TAP with index i; the index can be determined by finding in Self::tap_infos.

Source

pub fn pin_ids_for_tap(&self, i_tap: usize) -> Result<PinIdIter, Error>

Iterates through all PinIds for a TAP in the chain. i_tap can be determined by finding in Self::tap_infos.

Source

pub fn get_pin_id(&self, i_tap: usize, pin_name: &str) -> Result<PinId, Error>

Gets a pin identifier by its port name in the BSDL file. i_tap can be determined by finding in Self::tap_infos.

For a pin in a bus port, pin_name should be “PORT_NAME(i)”.

Source

pub fn get_pin_state(&self, pin_id: &PinId) -> Result<PinState, Error>

Gets the pin state at the timepoint before the last Self::update call applied newly set pin states.

Source

pub fn set_pin_state( &mut self, pin_id: &PinId, new_state: Option<bool>, ) -> Result<(), Error>

Sets the new pin state that will be applyed on the next Self::update call. Only for setting pins with output cell in EXTEST mode.

If new_state is Some(state), state will be set in the output cell, and true will be set in the output enable cell if the pin is tristated.

If new_state is None, false will be set in the output enable cell if the pin is tristated, otherwise an error is returned.

Source

pub fn update(&mut self) -> Result<(), Error>

Applies Self::set_pin_state calls since last Self::update and refreshes the capture buffer for later Self::get_pin_state calls with the values before setting new pin states.

Source

pub fn write_update(&mut self) -> Result<(), Error>

Applies Self::set_pin_state calls and then does Self::update, so that later Self::get_pin_state calls will be influenced by the newly set values. This makes no sense if no TAP is in EXTEST mode.

Source

pub fn release(&mut self) -> Result<(), Error>

Switches all TAPs to BYPASS state.

Source§

impl PinScanner

Source

pub fn batch( &mut self, count: usize, writer: impl FnMut(usize, &mut BsrEdit<'_, '_>) -> Result<(), Error>, reader: impl FnMut(usize, &BsrView<'_, '_>) -> Result<(), Error>, ) -> Result<(), Error>

Executes queued read + write operations for count times.

This can be used to speed up a group of transfers if each item in the group does not depend on the result of the previous item.

writer and reader will both be called for count times. The cycle counter counts towards count starting from 0. On startup, the current BSR output buffer is copied as the buffer for writer.

At the beginning of each cycle, writer is called with the output buffer and the cycle counter value; any change to the buffer made by writer will be captured and queued for writing to the device, and preserved for the next writer call. When it is actually executed, the captured states before this write is passed to the corresponding call to reader, along with the same cycle counter value.

Returns successfully when the last write is finished; before returning, the output buffer (possibly modified by the last writer call) is applied back to self, and Self::update is called.

ⓘ
let pins = [
    "PB0", "PB1", "PB5", "PB6", "PB7", "PB8", "PB9", "PB10", "PB11", "PB12", "PB13", "PB14",
    "PB15", "PC13", "PC14", "PC15",
];
let pins: Vec<_> = pins
    .iter()
    .map(|n| scanner.get_pin_id(i_c6t6, *n).unwrap())
    .collect();

scanner.set_tap_state(i_c6t6, TapState::Extest)?;
scanner.batch(
    65536,
    |i, edit| {
        // sets value `i` to the 16-bit "bus".
        for (i_pin, pin) in pins.iter().enumerate() {
            let val = ((i >> i_pin) & 1) == 1;
            edit.set(pin, Some(val))?;
        }
        Ok(())
    },
    |i, view| {
        let i_prev = if i > 0 {
            i - 1
        } else {
            return Ok(());
        };
        // `view` provides pin states before the `i`th edit is applied,
        // which equals the values set in `i - 1`th edit.
        let mut val = 0;
        for (i_pin, pin) in pins.iter().enumerate() {
            if view.get(pin)?.input().unwrap() {
                val |= 1 << i_pin;
            }
        }
        assert_eq!(val, i_prev);
        Ok(())
    },
)?;

Trait Implementations§

Source§

impl Drop for PinScanner

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more
Source§

fn pin_drop(self: Pin<&mut Self>)

🔬This is a nightly-only experimental API. (pin_ergonomics)
Execute the destructor for this type, but different to Drop::drop, it requires self to be pinned. 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> 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> 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, 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> 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> 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 = !

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

fn try_from(value: U) -> Result<T, !>

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.