improve debug formatting of PRegValue and PRegFlags

This commit is contained in:
Jacob Lifshay 2026-05-07 21:36:47 -07:00
parent 559e2967a2
commit 33b5d59507
Signed by: programmerjake
SSH key fingerprint: SHA256:HnFTLGpSm4Q4Fj502oCFisjZSoakwEuTsJJMSke63RQ
2 changed files with 49 additions and 21 deletions

View file

@ -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()
})
}

View file

@ -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,