Skip to main content

Dcache

Struct Dcache 

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

The 8 KiB write-back data cache.

Implementations§

Source§

impl Dcache

Source

pub const fn new() -> Self

A cache with every line invalid.

Source

pub const fn hits(&self, addr: u32) -> bool

Does addr hit a valid line?

Source

pub const fn miss_plan(&self, addr: u32) -> Option<Option<Writeback<16>>>

Prepare the line covering addr for access, reporting what the caller must do to the bus first.

Returns the eviction that must be written back (if any). After the caller has performed it and supplied the fill data through Dcache::install, the line is resident.

Source

pub const fn install(&mut self, addr: u32, data: [u8; 16])

Install a freshly filled line.

Source

pub fn read(&self, addr: u32, len: usize) -> u64

Read len bytes at addr from a resident line.

The caller must have made the line resident first. An access never straddles two lines: every access reaching the cache is naturally aligned to its own width, and the widest is 8 bytes into a 16-byte line.

Source

pub fn write(&mut self, addr: u32, len: usize, value: u64)

Write the low len bytes of value at addr into a resident line, marking it dirty.

Source

pub const fn load_tag(&self, addr: u32) -> u32

Index_Load_Tag: the tag at the index addr selects, in TagLo form.

A dirty line and a clean one both report PState = 3. The write-back bit has no TagLo field on this part, so the distinction is genuinely not visible to software — reporting it would be inventing an encoding.

Source

pub const fn store_tag(&mut self, addr: u32, tag_lo: u32)

Index_Store_Tag: overwrite the tag at the index addr selects.

Source

pub const fn flush_index( &mut self, addr: u32, invalidate: bool, clean: bool, ) -> Option<Writeback<16>>

Take the line at the index addr selects for write-back, if it is dirty.

clean clears the dirty bit (Hit_Write_Back leaves the line resident); invalidate additionally clears the valid bit.

Source

pub const fn create_dirty_exclusive( &mut self, addr: u32, ) -> Option<Writeback<16>>

Create_Dirty_Exclusive: claim the line for addr without filling it.

Returns any dirty line evicted in the process. The new line’s data is whatever the old line held — the operation exists precisely so software can avoid the fill when it is about to overwrite the whole line, so leaving stale bytes is the point, not an oversight.

Trait Implementations§

Source§

impl Clone for Dcache

Source§

fn clone(&self) -> Dcache

Returns a duplicate of the value. Read more
1.0.0 · Source§

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

Performs copy-assignment from source. Read more
Source§

impl Debug for Dcache

Source§

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

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

impl Default for Dcache

Source§

fn default() -> Self

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

impl<'de> Deserialize<'de> for Dcache

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl PartialEq for Dcache

Source§

fn eq(&self, other: &Dcache) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl Serialize for Dcache

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for Dcache

Source§

impl StructuralPartialEq for Dcache

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> 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<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> 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.
Source§

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,