improve debug formatting of PRegValue and PRegFlags
This commit is contained in:
parent
559e2967a2
commit
33b5d59507
2 changed files with 49 additions and 21 deletions
|
|
@ -6,7 +6,7 @@ use fayalite::{
|
|||
expr::CastToImpl,
|
||||
int::{BoolOrIntType, UIntInRange},
|
||||
prelude::*,
|
||||
ty::StaticType,
|
||||
ty::{SimValueDebug, StaticType},
|
||||
};
|
||||
use std::{any::Any, fmt};
|
||||
|
||||
|
|
@ -49,6 +49,7 @@ pub trait PRegFlagsViewTrait: Type + PRegFlagsViewTraitSealed {
|
|||
fn view_into_view_unused<T>(view: Self::View<T>) -> ViewUnused<T, PRegFlagsAllUnused>;
|
||||
fn debug_fmt<'a, T: 'a, F: FnMut(&'a T, bool) -> Option<D>, D: fmt::Debug>(
|
||||
view: &'a Self::View<T>,
|
||||
type_name: Option<&str>,
|
||||
field: F,
|
||||
f: &mut fmt::Formatter<'_>,
|
||||
) -> fmt::Result;
|
||||
|
|
@ -475,6 +476,7 @@ macro_rules! impl_view_trait {
|
|||
|
||||
fn debug_fmt<'a, T: 'a, F: FnMut(&'a T, bool) -> Option<D>, D: fmt::Debug>(
|
||||
view: &'a Self::View<T>,
|
||||
type_name: Option<&str>,
|
||||
mut field: F,
|
||||
f: &mut fmt::Formatter<'_>,
|
||||
) -> fmt::Result {
|
||||
|
|
@ -482,7 +484,7 @@ macro_rules! impl_view_trait {
|
|||
$unused: ViewUnused([$($unused_field,)*]),
|
||||
$($view_field: $flags_field,)*
|
||||
} = view;
|
||||
let mut debug_struct = f.debug_struct(stringify!($FlagsMode));
|
||||
let mut debug_struct = f.debug_struct(type_name.unwrap_or(stringify!($FlagsMode)));
|
||||
#[allow(unused_mut)]
|
||||
let mut any_skipped = false;
|
||||
$(if let Some(v) = field($flags_field, true) {
|
||||
|
|
@ -774,25 +776,40 @@ impl<T: Type> PRegFlags<T> {
|
|||
#[hdl]
|
||||
pub fn debug_fmt<V: PRegFlagsViewTrait>(
|
||||
this: &SimValue<Self>,
|
||||
type_name: Option<&str>,
|
||||
f: &mut fmt::Formatter<'_>,
|
||||
) -> fmt::Result {
|
||||
if let Some(this) = <dyn Any>::downcast_ref::<SimValue<PRegFlags>>(this) {
|
||||
V::debug_fmt(
|
||||
&PRegFlags::view_sim_ref::<V>(this),
|
||||
type_name,
|
||||
|v, _| v.then_some(*v),
|
||||
f,
|
||||
)
|
||||
} else {
|
||||
V::debug_fmt(&PRegFlags::view_sim_ref::<V>(this), |v, _| Some(*v), f)
|
||||
V::debug_fmt(
|
||||
&PRegFlags::view_sim_ref::<V>(this),
|
||||
type_name,
|
||||
|v, _| Some(*v),
|
||||
f,
|
||||
)
|
||||
}
|
||||
}
|
||||
#[hdl]
|
||||
pub fn debug_fmt_mode(this: &SimValue<Self>, mode: &SimValue<FlagsMode>) -> impl fmt::Debug {
|
||||
pub fn debug_fmt_mode(
|
||||
this: &SimValue<Self>,
|
||||
short_name: bool,
|
||||
mode: &SimValue<FlagsMode>,
|
||||
) -> impl fmt::Debug {
|
||||
fmt::from_fn(move |f| {
|
||||
#[hdl(sim)]
|
||||
match mode {
|
||||
FlagsMode::PowerISA(_) => Self::debug_fmt::<PRegFlagsPowerISA>(this, f),
|
||||
FlagsMode::X86(_) => Self::debug_fmt::<PRegFlagsX86>(this, f),
|
||||
FlagsMode::PowerISA(_) => {
|
||||
Self::debug_fmt::<PRegFlagsPowerISA>(this, short_name.then_some("Pwr"), f)
|
||||
}
|
||||
FlagsMode::X86(_) => {
|
||||
Self::debug_fmt::<PRegFlagsX86>(this, short_name.then_some("X86"), f)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
|
@ -819,7 +836,7 @@ impl PRegFlags {
|
|||
pub const FLAG_COUNT: usize = PRegFlagsAllUnused::UNUSED_INNER_LEN;
|
||||
}
|
||||
|
||||
#[hdl(cmp_eq)]
|
||||
#[hdl(cmp_eq, custom_debug(sim))]
|
||||
/// Unit output register's value -- a combination of an integer/fp register
|
||||
/// and flags register and CR field.
|
||||
///
|
||||
|
|
@ -830,6 +847,15 @@ pub struct PRegValue {
|
|||
pub flags: PRegFlags,
|
||||
}
|
||||
|
||||
impl SimValueDebug for PRegValue {
|
||||
fn sim_value_debug(
|
||||
value: &<Self as Type>::SimValue,
|
||||
f: &mut fmt::Formatter<'_>,
|
||||
) -> fmt::Result {
|
||||
fmt::Debug::fmt(&Self::debug_fmt::<PRegFlagsPowerISA>(value, Some("Pwr")), f)
|
||||
}
|
||||
}
|
||||
|
||||
impl PRegValue {
|
||||
#[hdl]
|
||||
pub fn zeroed() -> Expr<Self> {
|
||||
|
|
@ -848,7 +874,10 @@ impl PRegValue {
|
|||
}
|
||||
}
|
||||
#[hdl]
|
||||
pub fn debug_fmt<V: PRegFlagsViewTrait>(this: &SimValue<Self>) -> impl fmt::Debug {
|
||||
pub fn debug_fmt<V: PRegFlagsViewTrait>(
|
||||
this: &<Self as Type>::SimValue,
|
||||
flags_type_name: Option<&str>,
|
||||
) -> impl fmt::Debug {
|
||||
fmt::from_fn(move |f| {
|
||||
#[hdl(sim)]
|
||||
let Self { int_fp, flags } = this;
|
||||
|
|
@ -856,19 +885,26 @@ impl PRegValue {
|
|||
.field("int_fp", int_fp)
|
||||
.field(
|
||||
"flags",
|
||||
&fmt::from_fn(|f| PRegFlags::debug_fmt::<V>(flags, f)),
|
||||
&fmt::from_fn(|f| PRegFlags::debug_fmt::<V>(flags, flags_type_name, f)),
|
||||
)
|
||||
.finish()
|
||||
})
|
||||
}
|
||||
#[hdl]
|
||||
pub fn debug_fmt_mode(this: &SimValue<Self>, mode: &SimValue<FlagsMode>) -> impl fmt::Debug {
|
||||
pub fn debug_fmt_mode(
|
||||
this: &SimValue<Self>,
|
||||
flags_short_name: bool,
|
||||
mode: &SimValue<FlagsMode>,
|
||||
) -> impl fmt::Debug {
|
||||
fmt::from_fn(move |f| {
|
||||
#[hdl(sim)]
|
||||
let Self { int_fp, flags } = this;
|
||||
f.debug_struct("PRegValue")
|
||||
.field("int_fp", int_fp)
|
||||
.field("flags", &PRegFlags::debug_fmt_mode(flags, mode))
|
||||
.field(
|
||||
"flags",
|
||||
&PRegFlags::debug_fmt_mode(flags, flags_short_name, mode),
|
||||
)
|
||||
.finish()
|
||||
})
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1835,17 +1835,9 @@ impl<C: PhantomConstCpuConfig> MockUnitOp<C> {
|
|||
execution_state.run_mop(&self.mop, &self.src_values, self.config);
|
||||
assert!(output.is_some() || caused_cancel.is_some());
|
||||
println!("try_run: {:#x}: {:?}", self.mop.pc.as_int(), self.mop.mop);
|
||||
println!(
|
||||
"<- {:?}",
|
||||
self.src_values
|
||||
.each_ref()
|
||||
.map(PRegValue::debug_fmt::<PRegFlagsPowerISA>),
|
||||
);
|
||||
println!("<- {:?}", self.src_values);
|
||||
self.output_ready = output.map(|(dest_value, predictor_op)| {
|
||||
println!(
|
||||
"-> {:?}",
|
||||
PRegValue::debug_fmt::<PRegFlagsPowerISA>(&dest_value),
|
||||
);
|
||||
println!("-> {dest_value:?}");
|
||||
#[hdl(sim)]
|
||||
let NextPcPredictorOp::<_> {
|
||||
call_stack_op,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue