pub mod csr;
pub mod execution;
pub mod memory;
pub mod stage;
pub mod trap;
pub use stage::StageCtx;
use std::ops::{Deref, DerefMut};
use crate::arch::Hart;
use crate::common::PhysAddr;
use crate::isa::op::MemWidth;
use crate::sim::memory::write_log::Writer;
use crate::sim::stats::paths::HartPaths;
use crate::soc::uncore::Uncore;
use crate::uarch::CoreUnits;
#[derive(Debug)]
pub struct CoreCtx<'a> {
pub hart: &'a mut Hart,
pub core: &'a mut CoreUnits,
pub uncore: &'a mut Uncore,
}
impl Deref for CoreCtx<'_> {
type Target = Uncore;
fn deref(&self) -> &Uncore {
self.uncore
}
}
impl DerefMut for CoreCtx<'_> {
fn deref_mut(&mut self) -> &mut Uncore {
self.uncore
}
}
impl CoreCtx<'_> {
#[inline]
pub const fn stage(&mut self) -> StageCtx<'_> {
StageCtx::new(self.hart, self.core, self.uncore)
}
#[inline]
#[must_use]
pub fn hart_paths(&self) -> HartPaths {
self.uncore.hart_stat_paths[self.hart.hart_id.as_index()]
}
#[inline]
pub fn set_reservation(&mut self, addr: PhysAddr) {
let hart = self.hart.hart_id;
self.uncore.memory.reservations_mut().set(hart, addr);
}
#[inline]
pub fn check_reservation(&self, addr: PhysAddr) -> bool {
self.uncore.memory.reservations().check(self.hart.hart_id, addr)
}
#[inline]
pub fn clear_reservation(&mut self) {
let hart = self.hart.hart_id;
self.uncore.memory.reservations_mut().clear(hart);
}
#[inline]
pub fn publish_write(&mut self, paddr: PhysAddr, data: u64, width: MemWidth) {
let writer = Writer::Hart(self.hart.hart_id);
self.uncore.publish_write(writer, paddr, data, width);
}
}