Compare commits

...
Sign in to create a new pull request.

8 commits

92 changed files with 9668 additions and 615 deletions

View file

@ -257,5 +257,6 @@ no_op_fold!(syn::Token![let]);
no_op_fold!(syn::Token![mut]); no_op_fold!(syn::Token![mut]);
no_op_fold!(syn::Token![static]); no_op_fold!(syn::Token![static]);
no_op_fold!(syn::Token![struct]); no_op_fold!(syn::Token![struct]);
no_op_fold!(syn::Token![type]);
no_op_fold!(syn::Token![where]); no_op_fold!(syn::Token![where]);
no_op_fold!(usize); no_op_fold!(usize);

View file

@ -3,8 +3,9 @@
use crate::{ use crate::{
Errors, HdlAttr, PairsIterExt, Errors, HdlAttr, PairsIterExt,
hdl_type_common::{ hdl_type_common::{
ItemOptions, MakeHdlTypeExpr, MaybeParsed, ParsedField, ParsedFieldsNamed, ParsedGenerics, CustomDebugOptions, CustomDebugTrait, ItemOptions, MakeHdlTypeExpr, MaybeParsed,
SplitForImpl, TypesParser, WrappedInConst, common_derives, get_target, ParsedField, ParsedFieldsNamed, ParsedGenerics, SplitForImpl, TypesParser, WrappedInConst,
common_derives, create_struct_debug_impl, get_target,
}, },
kw, kw,
}; };
@ -30,6 +31,7 @@ pub(crate) struct ParsedBundle {
pub(crate) fields: MaybeParsed<ParsedFieldsNamed, FieldsNamed>, pub(crate) fields: MaybeParsed<ParsedFieldsNamed, FieldsNamed>,
pub(crate) field_flips: Vec<Option<HdlAttr<kw::flip, kw::hdl>>>, pub(crate) field_flips: Vec<Option<HdlAttr<kw::flip, kw::hdl>>>,
pub(crate) mask_type_ident: Ident, pub(crate) mask_type_ident: Ident,
pub(crate) mask_type_name: String,
pub(crate) mask_type_match_variant_ident: Ident, pub(crate) mask_type_match_variant_ident: Ident,
pub(crate) mask_type_sim_value_ident: Ident, pub(crate) mask_type_sim_value_ident: Ident,
pub(crate) match_variant_ident: Ident, pub(crate) match_variant_ident: Ident,
@ -88,6 +90,8 @@ impl ParsedBundle {
no_runtime_generics: _, no_runtime_generics: _,
cmp_eq: _, cmp_eq: _,
ref get, ref get,
custom_debug: _,
custom_sim_display: _,
} = options.body; } = options.body;
if let Some((get, ..)) = get { if let Some((get, ..)) = get {
errors.error(get, "#[hdl(get(...))] is not allowed on structs"); errors.error(get, "#[hdl(get(...))] is not allowed on structs");
@ -131,6 +135,7 @@ impl ParsedBundle {
fields, fields,
field_flips, field_flips,
mask_type_ident: format_ident!("__{}__MaskType", ident), mask_type_ident: format_ident!("__{}__MaskType", ident),
mask_type_name: format!("MaskType<{}>", ident),
mask_type_match_variant_ident: format_ident!("__{}__MaskType__MatchVariant", ident), mask_type_match_variant_ident: format_ident!("__{}__MaskType__MatchVariant", ident),
mask_type_sim_value_ident: format_ident!("__{}__MaskType__SimValue", ident), mask_type_sim_value_ident: format_ident!("__{}__MaskType__SimValue", ident),
match_variant_ident: format_ident!("__{}__MatchVariant", ident), match_variant_ident: format_ident!("__{}__MatchVariant", ident),
@ -448,6 +453,7 @@ impl ToTokens for ParsedBundle {
fields, fields,
field_flips, field_flips,
mask_type_ident, mask_type_ident,
mask_type_name,
mask_type_match_variant_ident, mask_type_match_variant_ident,
mask_type_sim_value_ident, mask_type_sim_value_ident,
match_variant_ident, match_variant_ident,
@ -464,11 +470,20 @@ impl ToTokens for ParsedBundle {
no_runtime_generics, no_runtime_generics,
cmp_eq, cmp_eq,
get: _, get: _,
custom_debug: _,
custom_sim_display,
} = &options.body; } = &options.body;
let CustomDebugOptions {
type_: custom_debug_type,
sim: custom_debug_sim,
mask_type: custom_debug_mask_type,
mask_sim: custom_debug_mask_sim,
} = options.body.custom_debug();
let target = get_target(target, ident); let target = get_target(target, ident);
let struct_name = ident.to_string();
let mut item_attrs = attrs.clone(); let mut item_attrs = attrs.clone();
item_attrs.push(common_derives(span)); item_attrs.push(common_derives(span, false));
ItemStruct { let type_struct = ItemStruct {
attrs: item_attrs, attrs: item_attrs,
vis: vis.clone(), vis: vis.clone(),
struct_token: *struct_token, struct_token: *struct_token,
@ -476,8 +491,8 @@ impl ToTokens for ParsedBundle {
generics: generics.into(), generics: generics.into(),
fields: Fields::Named(fields.clone().into()), fields: Fields::Named(fields.clone().into()),
semi_token: None, semi_token: None,
} };
.to_tokens(tokens); type_struct.to_tokens(tokens);
let (impl_generics, type_generics, where_clause) = generics.split_for_impl(); let (impl_generics, type_generics, where_clause) = generics.split_for_impl();
if let (MaybeParsed::Parsed(generics), MaybeParsed::Parsed(fields), None) = if let (MaybeParsed::Parsed(generics), MaybeParsed::Parsed(fields), None) =
(generics, fields, no_runtime_generics) (generics, fields, no_runtime_generics)
@ -503,6 +518,9 @@ impl ToTokens for ParsedBundle {
} }
let mut wrapped_in_const = WrappedInConst::new(tokens, span); let mut wrapped_in_const = WrappedInConst::new(tokens, span);
let tokens = wrapped_in_const.inner(); let tokens = wrapped_in_const.inner();
if custom_debug_type.is_none() {
create_struct_debug_impl(&type_struct, &struct_name, None).to_tokens(tokens);
}
let builder = Builder { let builder = Builder {
vis: vis.clone(), vis: vis.clone(),
struct_token: *struct_token, struct_token: *struct_token,
@ -530,9 +548,9 @@ impl ToTokens for ParsedBundle {
mask_type_builder.to_tokens(tokens); mask_type_builder.to_tokens(tokens);
let unfilled_mask_type_builder_ty = let unfilled_mask_type_builder_ty =
mask_type_builder.builder_struct_ty(|_| BuilderFieldState::Unfilled); mask_type_builder.builder_struct_ty(|_| BuilderFieldState::Unfilled);
ItemStruct { let mask_type_struct = ItemStruct {
attrs: vec![ attrs: vec![
common_derives(span), common_derives(span, false),
parse_quote_spanned! {span=> parse_quote_spanned! {span=>
#[allow(non_camel_case_types, dead_code)] #[allow(non_camel_case_types, dead_code)]
}, },
@ -543,17 +561,20 @@ impl ToTokens for ParsedBundle {
generics: generics.into(), generics: generics.into(),
fields: Fields::Named(mask_type_fields.clone()), fields: Fields::Named(mask_type_fields.clone()),
semi_token: None, semi_token: None,
};
mask_type_struct.to_tokens(tokens);
if custom_debug_mask_type.is_none() {
create_struct_debug_impl(&mask_type_struct, mask_type_name, None).to_tokens(tokens);
} }
.to_tokens(tokens);
let mut mask_type_match_variant_fields = mask_type_fields.clone(); let mut mask_type_match_variant_fields = mask_type_fields.clone();
for Field { ty, .. } in &mut mask_type_match_variant_fields.named { for Field { ty, .. } in &mut mask_type_match_variant_fields.named {
*ty = parse_quote_spanned! {span=> *ty = parse_quote_spanned! {span=>
::fayalite::expr::Expr<#ty> ::fayalite::expr::Expr<#ty>
}; };
} }
ItemStruct { let mask_type_match_variant_struct = ItemStruct {
attrs: vec![ attrs: vec![
common_derives(span), common_derives(span, false),
parse_quote_spanned! {span=> parse_quote_spanned! {span=>
#[allow(non_camel_case_types, dead_code)] #[allow(non_camel_case_types, dead_code)]
}, },
@ -564,17 +585,19 @@ impl ToTokens for ParsedBundle {
generics: generics.into(), generics: generics.into(),
fields: Fields::Named(mask_type_match_variant_fields), fields: Fields::Named(mask_type_match_variant_fields),
semi_token: None, semi_token: None,
} };
.to_tokens(tokens); mask_type_match_variant_struct.to_tokens(tokens);
create_struct_debug_impl(&mask_type_match_variant_struct, mask_type_name, None)
.to_tokens(tokens);
let mut match_variant_fields = FieldsNamed::from(fields.clone()); let mut match_variant_fields = FieldsNamed::from(fields.clone());
for Field { ty, .. } in &mut match_variant_fields.named { for Field { ty, .. } in &mut match_variant_fields.named {
*ty = parse_quote_spanned! {span=> *ty = parse_quote_spanned! {span=>
::fayalite::expr::Expr<#ty> ::fayalite::expr::Expr<#ty>
}; };
} }
ItemStruct { let match_variant_struct = ItemStruct {
attrs: vec![ attrs: vec![
common_derives(span), common_derives(span, false),
parse_quote_spanned! {span=> parse_quote_spanned! {span=>
#[allow(non_camel_case_types, dead_code)] #[allow(non_camel_case_types, dead_code)]
}, },
@ -585,19 +608,19 @@ impl ToTokens for ParsedBundle {
generics: generics.into(), generics: generics.into(),
fields: Fields::Named(match_variant_fields), fields: Fields::Named(match_variant_fields),
semi_token: None, semi_token: None,
} };
.to_tokens(tokens); match_variant_struct.to_tokens(tokens);
create_struct_debug_impl(&match_variant_struct, &struct_name, None).to_tokens(tokens);
let mut mask_type_sim_value_fields = mask_type_fields; let mut mask_type_sim_value_fields = mask_type_fields;
for Field { ty, .. } in &mut mask_type_sim_value_fields.named { for Field { ty, .. } in &mut mask_type_sim_value_fields.named {
*ty = parse_quote_spanned! {span=> *ty = parse_quote_spanned! {span=>
::fayalite::sim::value::SimValue<#ty> ::fayalite::sim::value::SimValue<#ty>
}; };
} }
ItemStruct { let mask_type_sim_value_struct = ItemStruct {
attrs: vec![ attrs: vec![
parse_quote_spanned! {span=> parse_quote_spanned! {span=>
#[::fayalite::__std::prelude::v1::derive( #[::fayalite::__std::prelude::v1::derive(
::fayalite::__std::fmt::Debug,
::fayalite::__std::clone::Clone, ::fayalite::__std::clone::Clone,
)] )]
}, },
@ -611,19 +634,34 @@ impl ToTokens for ParsedBundle {
generics: generics.into(), generics: generics.into(),
fields: Fields::Named(mask_type_sim_value_fields), fields: Fields::Named(mask_type_sim_value_fields),
semi_token: None, semi_token: None,
};
mask_type_sim_value_struct.to_tokens(tokens);
if custom_debug_mask_sim.is_none() {
create_struct_debug_impl(
&mask_type_struct,
mask_type_name,
Some(CustomDebugTrait {
trait_path: &parse_quote_spanned! {span=>
::fayalite::ty::SimValueDebug
},
fn_name: &format_ident!("sim_value_debug", span = span),
this_arg: &parse_quote_spanned! {span=>
value: &<Self as ::fayalite::ty::Type>::SimValue
},
}),
)
.to_tokens(tokens);
} }
.to_tokens(tokens);
let mut sim_value_fields = FieldsNamed::from(fields.clone()); let mut sim_value_fields = FieldsNamed::from(fields.clone());
for Field { ty, .. } in &mut sim_value_fields.named { for Field { ty, .. } in &mut sim_value_fields.named {
*ty = parse_quote_spanned! {span=> *ty = parse_quote_spanned! {span=>
::fayalite::sim::value::SimValue<#ty> ::fayalite::sim::value::SimValue<#ty>
}; };
} }
ItemStruct { let sim_value_struct = ItemStruct {
attrs: vec![ attrs: vec![
parse_quote_spanned! {span=> parse_quote_spanned! {span=>
#[::fayalite::__std::prelude::v1::derive( #[::fayalite::__std::prelude::v1::derive(
::fayalite::__std::fmt::Debug,
::fayalite::__std::clone::Clone, ::fayalite::__std::clone::Clone,
)] )]
}, },
@ -637,8 +675,36 @@ impl ToTokens for ParsedBundle {
generics: generics.into(), generics: generics.into(),
fields: Fields::Named(sim_value_fields), fields: Fields::Named(sim_value_fields),
semi_token: None, semi_token: None,
};
sim_value_struct.to_tokens(tokens);
if custom_debug_sim.is_none() {
create_struct_debug_impl(
&type_struct,
&struct_name,
Some(CustomDebugTrait {
trait_path: &parse_quote_spanned! {span=>
::fayalite::ty::SimValueDebug
},
fn_name: &format_ident!("sim_value_debug", span = span),
this_arg: &parse_quote_spanned! {span=>
value: &<Self as ::fayalite::ty::Type>::SimValue
},
}),
)
.to_tokens(tokens);
}
if custom_sim_display.is_some() {
quote_spanned! {span=>
#[automatically_derived]
impl #impl_generics ::fayalite::__std::fmt::Display for #sim_value_ident #type_generics
#where_clause
{
fn fmt(&self, f: &mut ::fayalite::__std::fmt::Formatter<'_>) -> ::fayalite::__std::fmt::Result {
<#target #type_generics as ::fayalite::ty::SimValueDisplay>::sim_value_display(self, f)
}
}
}.to_tokens(tokens);
} }
.to_tokens(tokens);
let this_token = Ident::new("__this", span); let this_token = Ident::new("__this", span);
let fields_token = Ident::new("__fields", span); let fields_token = Ident::new("__fields", span);
let self_token = Token![self](span); let self_token = Token![self](span);
@ -820,6 +886,14 @@ impl ToTokens for ParsedBundle {
} }
} }
#[automatically_derived] #[automatically_derived]
impl #impl_generics ::fayalite::__std::fmt::Debug for #mask_type_sim_value_ident #type_generics
#where_clause
{
fn fmt(&self, f: &mut ::fayalite::__std::fmt::Formatter<'_>) -> ::fayalite::__std::fmt::Result {
<#mask_type_ident #type_generics as ::fayalite::ty::SimValueDebug>::sim_value_debug(self, f)
}
}
#[automatically_derived]
impl #impl_generics ::fayalite::expr::ValueType for #mask_type_sim_value_ident #type_generics impl #impl_generics ::fayalite::expr::ValueType for #mask_type_sim_value_ident #type_generics
#where_clause #where_clause
{ {
@ -980,6 +1054,14 @@ impl ToTokens for ParsedBundle {
} }
} }
#[automatically_derived] #[automatically_derived]
impl #impl_generics ::fayalite::__std::fmt::Debug for #sim_value_ident #type_generics
#where_clause
{
fn fmt(&self, f: &mut ::fayalite::__std::fmt::Formatter<'_>) -> ::fayalite::__std::fmt::Result {
<#target #type_generics as ::fayalite::ty::SimValueDebug>::sim_value_debug(self, f)
}
}
#[automatically_derived]
impl #impl_generics ::fayalite::expr::ValueType for #sim_value_ident #type_generics impl #impl_generics ::fayalite::expr::ValueType for #sim_value_ident #type_generics
#where_clause #where_clause
{ {
@ -1141,7 +1223,7 @@ impl ToTokens for ParsedBundle {
valueless_eq_body = quote_spanned! {span=> valueless_eq_body = quote_spanned! {span=>
let __lhs = ::fayalite::expr::ValueType::ty(&__lhs); let __lhs = ::fayalite::expr::ValueType::ty(&__lhs);
let __rhs = ::fayalite::expr::ValueType::ty(&__rhs); let __rhs = ::fayalite::expr::ValueType::ty(&__rhs);
#(#fields_valueless_eq)|* #(#fields_valueless_eq)&*
}; };
valueless_ne_body = quote_spanned! {span=> valueless_ne_body = quote_spanned! {span=>
let __lhs = ::fayalite::expr::ValueType::ty(&__lhs); let __lhs = ::fayalite::expr::ValueType::ty(&__lhs);

View file

@ -3,8 +3,9 @@
use crate::{ use crate::{
Errors, HdlAttr, PairsIterExt, Errors, HdlAttr, PairsIterExt,
hdl_type_common::{ hdl_type_common::{
ItemOptions, MakeHdlTypeExpr, MaybeParsed, ParsedGenerics, ParsedType, SplitForImpl, CustomDebugOptions, ItemOptions, MakeHdlTypeExpr, MaybeParsed, ParsedGenerics, ParsedType,
TypesParser, WrappedInConst, common_derives, get_target, SplitForImpl, TypesParser, WrappedInConst, common_derives, create_struct_debug_impl,
get_target,
}, },
kw, kw,
}; };
@ -158,15 +159,32 @@ impl ParsedEnum {
custom_bounds, custom_bounds,
no_static: _, no_static: _,
no_runtime_generics: _, no_runtime_generics: _,
cmp_eq, cmp_eq: _,
ref get, ref get,
custom_debug: _,
custom_sim_display: _,
} = options.body; } = options.body;
if let Some((cmp_eq,)) = cmp_eq {
errors.error(cmp_eq, "#[hdl(cmp_eq)] is not yet implemented for enums");
}
if let Some((get, ..)) = get { if let Some((get, ..)) = get {
errors.error(get, "#[hdl(get(...))] is not allowed on enums"); errors.error(get, "#[hdl(get(...))] is not allowed on enums");
} }
let CustomDebugOptions {
type_: _,
sim: _,
mask_type,
mask_sim,
} = options.body.custom_debug();
if let Some((mask_type,)) = mask_type {
errors.error(
mask_type,
"#[hdl(custom_debug(mask_type)] is not allowed on enums",
);
}
if let Some((mask_sim,)) = mask_sim {
errors.error(
mask_sim,
"#[hdl(custom_debug(mask_sim)] is not allowed on enums",
);
}
attrs.retain(|attr| { attrs.retain(|attr| {
if attr.path().is_ident("repr") { if attr.path().is_ident("repr") {
errors.error(attr, "#[repr] is not supported on #[hdl] enums"); errors.error(attr, "#[repr] is not supported on #[hdl] enums");
@ -228,12 +246,21 @@ impl ToTokens for ParsedEnum {
custom_bounds: _, custom_bounds: _,
no_static, no_static,
no_runtime_generics, no_runtime_generics,
cmp_eq: _, // TODO: implement cmp_eq for enums cmp_eq,
get: _, get: _,
custom_debug: _,
custom_sim_display,
} = &options.body; } = &options.body;
let CustomDebugOptions {
type_: custom_debug_type,
sim: custom_debug_sim,
mask_type: _,
mask_sim: _,
} = options.body.custom_debug();
let target = get_target(target, ident); let target = get_target(target, ident);
let enum_name = ident.to_string();
let mut struct_attrs = attrs.clone(); let mut struct_attrs = attrs.clone();
struct_attrs.push(common_derives(span)); struct_attrs.push(common_derives(span, false));
struct_attrs.push(parse_quote_spanned! {span=> struct_attrs.push(parse_quote_spanned! {span=>
#[allow(non_snake_case)] #[allow(non_snake_case)]
}); });
@ -273,7 +300,7 @@ impl ToTokens for ParsedEnum {
} }
}, },
)); ));
ItemStruct { let type_struct = ItemStruct {
attrs: struct_attrs, attrs: struct_attrs,
vis: vis.clone(), vis: vis.clone(),
struct_token: Token![struct](enum_token.span), struct_token: Token![struct](enum_token.span),
@ -288,8 +315,8 @@ impl ToTokens for ParsedEnum {
}) })
}, },
semi_token: None, semi_token: None,
} };
.to_tokens(tokens); type_struct.to_tokens(tokens);
let (impl_generics, type_generics, where_clause) = generics.split_for_impl(); let (impl_generics, type_generics, where_clause) = generics.split_for_impl();
if let (MaybeParsed::Parsed(generics), None) = (generics, no_runtime_generics) { if let (MaybeParsed::Parsed(generics), None) = (generics, no_runtime_generics) {
generics.make_runtime_generics(tokens, vis, ident, &target, |context| { generics.make_runtime_generics(tokens, vis, ident, &target, |context| {
@ -373,6 +400,9 @@ impl ToTokens for ParsedEnum {
} }
.to_tokens(tokens); .to_tokens(tokens);
} }
if custom_debug_type.is_none() {
create_struct_debug_impl(&type_struct, &enum_name, None).to_tokens(tokens);
}
let mut enum_attrs = attrs.clone(); let mut enum_attrs = attrs.clone();
enum_attrs.push(parse_quote_spanned! {span=> enum_attrs.push(parse_quote_spanned! {span=>
#[allow(dead_code, non_camel_case_types)] #[allow(dead_code, non_camel_case_types)]
@ -453,7 +483,6 @@ impl ToTokens for ParsedEnum {
let mut enum_attrs = attrs.clone(); let mut enum_attrs = attrs.clone();
enum_attrs.push(parse_quote_spanned! {span=> enum_attrs.push(parse_quote_spanned! {span=>
#[::fayalite::__std::prelude::v1::derive( #[::fayalite::__std::prelude::v1::derive(
::fayalite::__std::fmt::Debug,
::fayalite::__std::clone::Clone, ::fayalite::__std::clone::Clone,
)] )]
}); });
@ -838,6 +867,240 @@ impl ToTokens for ParsedEnum {
}, },
)), )),
); );
if custom_debug_sim.is_none() {
let debug_match_arms = Vec::from_iter(
variants
.iter()
.map(
|ParsedVariant {
attrs: _,
options: _,
ident,
field,
}| {
let variant_name = ident.to_string();
if let Some(_) = field {
quote_spanned! {span=>
#sim_value_ident::#ident(field, _) => {
f.debug_tuple(#variant_name).field(field).finish()
}
}
} else {
quote_spanned! {span=>
#sim_value_ident::#ident(_) => {
f.write_str(#variant_name)
}
}
}
},
)
.chain(sim_value_unknown_variant_name.as_ref().map(
|sim_value_unknown_variant_name| {
let sim_value_unknown_variant_name_str =
sim_value_unknown_variant_name.to_string();
quote_spanned! {span=>
#sim_value_ident::#sim_value_unknown_variant_name(_) => {
f.write_str(#sim_value_unknown_variant_name_str)
}
}
},
)),
);
quote_spanned! {span=>
#[automatically_derived]
impl #impl_generics ::fayalite::ty::SimValueDebug for #target #type_generics
#where_clause
{
fn sim_value_debug(
value: &<Self as ::fayalite::ty::Type>::SimValue,
f: &mut ::fayalite::__std::fmt::Formatter<'_>,
) -> ::fayalite::__std::fmt::Result {
match value {
#(#debug_match_arms)*
}
}
}
}
.to_tokens(tokens);
}
if custom_sim_display.is_some() {
quote_spanned! {span=>
#[automatically_derived]
impl #impl_generics ::fayalite::__std::fmt::Display for #sim_value_ident #type_generics
#where_clause
{
fn fmt(&self, f: &mut ::fayalite::__std::fmt::Formatter<'_>) -> ::fayalite::__std::fmt::Result {
<#target #type_generics as ::fayalite::ty::SimValueDisplay>::sim_value_display(self, f)
}
}
}.to_tokens(tokens);
}
if let Some((cmp_eq,)) = cmp_eq {
let mut cmp_eq_where_clause =
Generics::from(generics)
.where_clause
.unwrap_or_else(|| syn::WhereClause {
where_token: Token![where](span),
predicates: Punctuated::new(),
});
let mut variants_value_eq = vec![];
let mut variants_expr_eq = vec![];
let mut fields_valueless_eq = vec![];
for (
variant_index,
ParsedVariant {
attrs: _,
options: variant_options,
ident: variant_ident,
field,
},
) in variants.iter().enumerate()
{
let VariantOptions {} = variant_options.body;
if let Some(ParsedVariantField {
paren_token: _,
attrs: _,
options: field_options,
ty: field_ty,
comma_token: _,
}) = field
{
let FieldOptions {} = field_options.body;
cmp_eq_where_clause
.predicates
.push(parse_quote_spanned! {cmp_eq.span=>
#field_ty: ::fayalite::expr::HdlPartialEqImpl<#field_ty>
});
variants_value_eq.push(quote_spanned! {span=>
(#sim_value_ident::#variant_ident(__lhs_field, _), #sim_value_ident::#variant_ident(__rhs_field, _)) => {
::fayalite::expr::HdlPartialEqImpl::cmp_value_eq(
__lhs.#variant_ident,
::fayalite::__std::borrow::Cow::Borrowed(__lhs_field),
__rhs.#variant_ident,
::fayalite::__std::borrow::Cow::Borrowed(__rhs_field),
)
}
});
variants_expr_eq.push(quote_spanned! {span=>
{
let (#match_variant_ident::#variant_ident(__lhs), __scope) =
::fayalite::ty::MatchVariantAndInactiveScope::match_activate_scope(
::fayalite::__std::iter::Iterator::next(&mut __lhs_match_variant_iter)
.expect("known to have enough variants"),
)
else {
::fayalite::__std::unreachable!();
};
let (#match_variant_ident::#variant_ident(__rhs), __scope) =
::fayalite::ty::MatchVariantAndInactiveScope::match_activate_scope(
::fayalite::__std::iter::Iterator::nth(
&mut ::fayalite::module::match_(__rhs),
#variant_index,
)
.expect("known to have variant"),
)
else {
::fayalite::__std::unreachable!();
};
::fayalite::module::connect(__retval, ::fayalite::expr::HdlPartialEqImpl::cmp_expr_eq(__lhs, __rhs));
}
});
fields_valueless_eq.push(quote_spanned! {span=>
::fayalite::expr::HdlPartialEqImpl::cmp_valueless_eq(
::fayalite::expr::Valueless::new(__lhs.#variant_ident),
::fayalite::expr::Valueless::new(__rhs.#variant_ident),
)
});
} else {
variants_value_eq.push(quote_spanned! {span=>
(#sim_value_ident::#variant_ident(_), #sim_value_ident::#variant_ident(_)) => true,
});
variants_expr_eq.push(quote_spanned! {span=>
{
let (#match_variant_ident::#variant_ident, __scope) =
::fayalite::ty::MatchVariantAndInactiveScope::match_activate_scope(
::fayalite::__std::iter::Iterator::next(&mut __lhs_match_variant_iter)
.expect("known to have enough variants"),
)
else {
::fayalite::__std::unreachable!();
};
let (#match_variant_ident::#variant_ident, __scope) =
::fayalite::ty::MatchVariantAndInactiveScope::match_activate_scope(
::fayalite::__std::iter::Iterator::nth(
&mut ::fayalite::module::match_(__rhs),
#variant_index,
)
.expect("known to have variant"),
)
else {
::fayalite::__std::unreachable!();
};
::fayalite::module::connect(__retval, true);
}
});
}
}
if let Some(sim_value_unknown_variant_name) = &sim_value_unknown_variant_name {
variants_value_eq.push(quote_spanned! {span=>
(#sim_value_ident::#sim_value_unknown_variant_name(__lhs_unknown), #sim_value_ident::#sim_value_unknown_variant_name(__rhs_unknown)) => {
__lhs_unknown == __rhs_unknown
}
});
}
let valueless_eq_body = if fields_valueless_eq.is_empty() {
quote_spanned! {span=>
::fayalite::expr::Valueless::new(::fayalite::int::Bool)
}
} else {
quote_spanned! {span=>
let __lhs = ::fayalite::expr::ValueType::ty(&__lhs);
let __rhs = ::fayalite::expr::ValueType::ty(&__rhs);
#(#fields_valueless_eq)&*
}
};
let cmp_expr_eq_wire_name = format!("{ident}_cmp_eq");
quote_spanned! {span=>
#[automatically_derived]
impl #impl_generics ::fayalite::expr::HdlPartialEqImpl<Self> for #target #type_generics
#cmp_eq_where_clause
{
#[track_caller]
fn cmp_value_eq(
__lhs: Self,
__lhs_value: ::fayalite::__std::borrow::Cow<'_, <Self as ::fayalite::ty::Type>::SimValue>,
__rhs: Self,
__rhs_value: ::fayalite::__std::borrow::Cow<'_, <Self as ::fayalite::ty::Type>::SimValue>,
) -> ::fayalite::__std::primitive::bool {
match (&*__lhs_value, &*__rhs_value) {
#(#variants_value_eq)*
_ => false,
}
}
#[track_caller]
fn cmp_expr_eq(
__lhs: ::fayalite::expr::Expr<Self>,
__rhs: ::fayalite::expr::Expr<Self>,
) -> ::fayalite::expr::Expr<::fayalite::int::Bool> {
let __retval = ::fayalite::module::wire(::fayalite::module::ImplicitName(#cmp_expr_eq_wire_name), ::fayalite::int::Bool);
::fayalite::module::connect(__retval, false);
let mut __lhs_match_variant_iter = ::fayalite::module::match_(__lhs);
#(#variants_expr_eq)*
__retval
}
#[track_caller]
fn cmp_valueless_eq(
__lhs: ::fayalite::expr::Valueless<Self>,
__rhs: ::fayalite::expr::Valueless<Self>,
) -> ::fayalite::expr::Valueless<::fayalite::int::Bool> {
#valueless_eq_body
}
}
}
.to_tokens(tokens);
}
let variants_len = variants.len(); let variants_len = variants.len();
quote_spanned! {span=> quote_spanned! {span=>
#[automatically_derived] #[automatically_derived]
@ -934,6 +1197,14 @@ impl ToTokens for ParsedEnum {
} }
} }
#[automatically_derived] #[automatically_derived]
impl #impl_generics ::fayalite::__std::fmt::Debug for #sim_value_ident #type_generics
#where_clause
{
fn fmt(&self, f: &mut ::fayalite::__std::fmt::Formatter<'_>) -> ::fayalite::__std::fmt::Result {
<#target #type_generics as ::fayalite::ty::SimValueDebug>::sim_value_debug(self, f)
}
}
#[automatically_derived]
impl #impl_generics ::fayalite::sim::value::ToSimValueWithType<#target #type_generics> impl #impl_generics ::fayalite::sim::value::ToSimValueWithType<#target #type_generics>
for #sim_value_ident #type_generics for #sim_value_ident #type_generics
#where_clause #where_clause

View file

@ -215,6 +215,8 @@ impl ParsedTypeAlias {
no_runtime_generics, no_runtime_generics,
cmp_eq, cmp_eq,
get: _, get: _,
ref custom_debug,
custom_sim_display,
} = options.body; } = options.body;
if let Some((no_static,)) = no_static { if let Some((no_static,)) = no_static {
errors.error(no_static, "no_static is not valid on type aliases"); errors.error(no_static, "no_static is not valid on type aliases");
@ -234,6 +236,15 @@ impl ParsedTypeAlias {
if let Some((cmp_eq,)) = cmp_eq { if let Some((cmp_eq,)) = cmp_eq {
errors.error(cmp_eq, "cmp_eq is not valid on type aliases"); errors.error(cmp_eq, "cmp_eq is not valid on type aliases");
} }
if let Some((custom_debug, _, _)) = custom_debug {
errors.error(custom_debug, "custom_debug is not valid on type aliases");
}
if let Some((custom_sim_display,)) = custom_sim_display {
errors.error(
custom_sim_display,
"custom_sim_display is not valid on type aliases",
);
}
if let Some((custom_bounds,)) = custom_bounds { if let Some((custom_bounds,)) = custom_bounds {
errors.error( errors.error(
custom_bounds, custom_bounds,
@ -287,6 +298,8 @@ impl ParsedTypeAlias {
no_runtime_generics: _, no_runtime_generics: _,
cmp_eq, cmp_eq,
ref mut get, ref mut get,
ref custom_debug,
custom_sim_display,
} = options.body; } = options.body;
if let Some(get) = get.take() { if let Some(get) = get.take() {
return Self::parse_phantom_const_accessor( return Self::parse_phantom_const_accessor(
@ -311,6 +324,15 @@ impl ParsedTypeAlias {
if let Some((cmp_eq,)) = cmp_eq { if let Some((cmp_eq,)) = cmp_eq {
errors.error(cmp_eq, "cmp_eq is not valid on type aliases"); errors.error(cmp_eq, "cmp_eq is not valid on type aliases");
} }
if let Some((custom_debug, _, _)) = custom_debug {
errors.error(custom_debug, "custom_debug is not valid on type aliases");
}
if let Some((custom_sim_display,)) = custom_sim_display {
errors.error(
custom_sim_display,
"custom_sim_display is not valid on type aliases",
);
}
let generics = if custom_bounds.is_some() { let generics = if custom_bounds.is_some() {
MaybeParsed::Unrecognized(generics) MaybeParsed::Unrecognized(generics)
} else if let Some(generics) = errors.ok(ParsedGenerics::parse(&mut generics)) { } else if let Some(generics) = errors.ok(ParsedGenerics::parse(&mut generics)) {
@ -356,6 +378,8 @@ impl ToTokens for ParsedTypeAlias {
no_runtime_generics, no_runtime_generics,
cmp_eq: _, cmp_eq: _,
get: _, get: _,
custom_debug: _,
custom_sim_display: _,
} = &options.body; } = &options.body;
let target = get_target(target, ident); let target = get_target(target, ident);
let mut type_attrs = attrs.clone(); let mut type_attrs = attrs.clone();
@ -402,6 +426,8 @@ impl ToTokens for ParsedTypeAlias {
no_runtime_generics: _, no_runtime_generics: _,
cmp_eq: _, cmp_eq: _,
get: _, get: _,
custom_debug: _,
custom_sim_display: _,
} = &options.body; } = &options.body;
let span = ident.span(); let span = ident.span();
let mut type_attrs = attrs.clone(); let mut type_attrs = attrs.clone();
@ -427,7 +453,7 @@ impl ToTokens for ParsedTypeAlias {
format_ident!("__{}__GenericsAccumulation", ident); format_ident!("__{}__GenericsAccumulation", ident);
ItemStruct { ItemStruct {
attrs: vec![ attrs: vec![
common_derives(span), common_derives(span, true),
parse_quote_spanned! {span=> parse_quote_spanned! {span=>
#[allow(non_camel_case_types)] #[allow(non_camel_case_types)]
}, },

View file

@ -7,10 +7,10 @@ use std::{collections::HashMap, fmt, mem};
use syn::{ use syn::{
AngleBracketedGenericArguments, Attribute, Block, ConstParam, Expr, ExprBlock, ExprGroup, AngleBracketedGenericArguments, Attribute, Block, ConstParam, Expr, ExprBlock, ExprGroup,
ExprIndex, ExprParen, ExprPath, ExprTuple, Field, FieldMutability, Fields, FieldsNamed, ExprIndex, ExprParen, ExprPath, ExprTuple, Field, FieldMutability, Fields, FieldsNamed,
FieldsUnnamed, GenericArgument, GenericParam, Generics, Ident, ImplGenerics, Index, ItemStruct, FieldsUnnamed, FnArg, GenericArgument, GenericParam, Generics, Ident, ImplGenerics, Index,
Path, PathArguments, PathSegment, PredicateType, QSelf, Stmt, Token, TraitBound, Turbofish, ItemStruct, Path, PathArguments, PathSegment, PredicateType, QSelf, Stmt, Token, TraitBound,
Type, TypeGenerics, TypeGroup, TypeParam, TypeParamBound, TypeParen, TypePath, TypeTuple, Turbofish, Type, TypeGenerics, TypeGroup, TypeParam, TypeParamBound, TypeParen, TypePath,
Visibility, WhereClause, WherePredicate, TypeTuple, Visibility, WhereClause, WherePredicate,
parse::{Parse, ParseStream}, parse::{Parse, ParseStream},
parse_quote, parse_quote_spanned, parse_quote, parse_quote_spanned,
punctuated::{Pair, Punctuated}, punctuated::{Pair, Punctuated},
@ -18,6 +18,17 @@ use syn::{
token::{Brace, Bracket, Paren}, token::{Brace, Bracket, Paren},
}; };
crate::options! {
#[options = CustomDebugOptions]
#[no_ident_fragment]
pub(crate) enum CustomDebugOption {
Type(type_),
Sim(sim),
MaskType(mask_type),
MaskSim(mask_sim),
}
}
crate::options! { crate::options! {
#[options = ItemOptions] #[options = ItemOptions]
pub(crate) enum ItemOption { pub(crate) enum ItemOption {
@ -28,6 +39,8 @@ crate::options! {
NoRuntimeGenerics(no_runtime_generics), NoRuntimeGenerics(no_runtime_generics),
CmpEq(cmp_eq), CmpEq(cmp_eq),
Get(get, Expr), Get(get, Expr),
CustomDebug(custom_debug, CustomDebugOptions),
CustomSimDisplay(custom_sim_display),
} }
} }
@ -41,8 +54,36 @@ impl ItemOptions {
{ {
self.no_static = Some((kw::no_static(custom_bounds.span),)); self.no_static = Some((kw::no_static(custom_bounds.span),));
} }
if let Some((kw, _, custom_debug)) = &mut self.custom_debug {
if let CustomDebugOptions {
type_: None,
sim: None,
mask_type: None,
mask_sim: None,
} = custom_debug
{
*custom_debug = CustomDebugOptions {
type_: Some((kw::type_(kw.span),)),
sim: Some((kw::sim(kw.span),)),
mask_type: None,
mask_sim: None,
};
}
}
Ok(()) Ok(())
} }
pub(crate) fn custom_debug(&self) -> &CustomDebugOptions {
self.custom_debug.as_ref().map(|v| &v.2).unwrap_or(
const {
&CustomDebugOptions {
type_: None,
sim: None,
mask_type: None,
mask_sim: None,
}
},
)
}
} }
pub(crate) struct WrappedInConst<'a> { pub(crate) struct WrappedInConst<'a> {
@ -84,10 +125,17 @@ pub(crate) fn get_target(target: &Option<(kw::target, Paren, Path)>, item_ident:
} }
} }
pub(crate) fn common_derives(span: Span) -> Attribute { pub(crate) fn common_derives(span: Span, include_debug: bool) -> Attribute {
let debug = include_debug
.then(|| {
quote_spanned! {span=>
::fayalite::__std::fmt::Debug
}
})
.into_iter();
parse_quote_spanned! {span=> parse_quote_spanned! {span=>
#[::fayalite::__std::prelude::v1::derive( #[::fayalite::__std::prelude::v1::derive(
::fayalite::__std::fmt::Debug, #(#debug,)*
::fayalite::__std::cmp::Eq, ::fayalite::__std::cmp::Eq,
::fayalite::__std::cmp::PartialEq, ::fayalite::__std::cmp::PartialEq,
::fayalite::__std::hash::Hash, ::fayalite::__std::hash::Hash,
@ -2975,7 +3023,7 @@ impl ParsedGenerics {
let span = ident.span(); let span = ident.span();
ItemStruct { ItemStruct {
attrs: vec![ attrs: vec![
common_derives(span), common_derives(span, true),
parse_quote_spanned! {span=> parse_quote_spanned! {span=>
#[allow(non_camel_case_types)] #[allow(non_camel_case_types)]
}, },
@ -4733,3 +4781,109 @@ impl ParsedVisibility {
.map(|ord| if ord.is_lt() { self } else { other }) .map(|ord| if ord.is_lt() { self } else { other })
} }
} }
pub(crate) struct CustomDebugTrait<'a> {
pub(crate) trait_path: &'a Path,
pub(crate) fn_name: &'a Ident,
pub(crate) this_arg: &'a FnArg,
}
#[must_use]
pub(crate) fn create_struct_debug_impl(
item_struct: &ItemStruct,
debug_struct_name: &str,
custom_debug_trait: Option<CustomDebugTrait<'_>>,
) -> TokenStream {
let ident = &item_struct.ident;
let span = ident.span();
let (impl_generics, type_generics, where_clause) = item_struct.generics.split_for_impl();
let trait_path;
let fn_name;
let this_arg;
let CustomDebugTrait {
trait_path,
fn_name,
this_arg,
} = match custom_debug_trait {
Some(v) => v,
None => {
trait_path = parse_quote_spanned! {span=>
::fayalite::__std::fmt::Debug
};
fn_name = parse_quote_spanned! {span=>
fmt
};
this_arg = parse_quote_spanned! {span=>
&self
};
CustomDebugTrait {
trait_path: &trait_path,
fn_name: &fn_name,
this_arg: &this_arg,
}
}
};
let this_arg_name = match this_arg {
FnArg::Receiver(this_arg) => this_arg.self_token.to_token_stream(),
FnArg::Typed(this_arg) => match &*this_arg.pat {
syn::Pat::Ident(pat_ident) => pat_ident.ident.to_token_stream(),
_ => unreachable!(),
},
};
match &item_struct.fields {
Fields::Named(fields) => {
let field_idents = fields
.named
.iter()
.map(|v| v.ident.as_ref().expect("known to have field name"));
let field_names = field_idents.clone().map(|v| v.to_string());
quote_spanned! {span=>
#[automatically_derived]
impl #impl_generics #trait_path for #ident #type_generics
#where_clause
{
fn #fn_name(#this_arg, f: &mut ::fayalite::__std::fmt::Formatter<'_>) -> ::fayalite::__std::fmt::Result {
let _ = #this_arg_name;
f.debug_struct(#debug_struct_name)
#(.field(#field_names, &#this_arg_name.#field_idents))*
.finish()
}
}
}
}
Fields::Unnamed(fields) => {
let field_members = fields
.unnamed
.iter()
.enumerate()
.map(|(index, _)| syn::Index {
index: index as _,
span,
});
quote_spanned! {span=>
#[automatically_derived]
impl #impl_generics #trait_path for #ident #type_generics
#where_clause
{
fn #fn_name(#this_arg, f: &mut ::fayalite::__std::fmt::Formatter<'_>) -> ::fayalite::__std::fmt::Result {
let _ = #this_arg_name;
f.debug_tuple(#debug_struct_name)
#(.field(&#this_arg_name.#field_members))*
.finish()
}
}
}
}
Fields::Unit => quote_spanned! {ident.span()=>
#[automatically_derived]
impl #impl_generics #trait_path for #ident #type_generics
#where_clause
{
fn #fn_name(#this_arg, f: &mut ::fayalite::__std::fmt::Formatter<'_>) -> ::fayalite::__std::fmt::Result {
let _ = #this_arg_name;
f.write_str(#debug_struct_name)
}
}
},
}
}

View file

@ -42,6 +42,7 @@ pub(crate) trait CustomToken:
mod kw { mod kw {
pub(crate) use syn::token::Extern as extern_; pub(crate) use syn::token::Extern as extern_;
pub(crate) use syn::token::Type as type_;
macro_rules! custom_keyword { macro_rules! custom_keyword {
($kw:ident) => { ($kw:ident) => {
@ -75,6 +76,8 @@ mod kw {
custom_keyword!(cmp_eq); custom_keyword!(cmp_eq);
custom_keyword!(connect_inexact); custom_keyword!(connect_inexact);
custom_keyword!(custom_bounds); custom_keyword!(custom_bounds);
custom_keyword!(custom_debug);
custom_keyword!(custom_sim_display);
custom_keyword!(flip); custom_keyword!(flip);
custom_keyword!(get); custom_keyword!(get);
custom_keyword!(hdl); custom_keyword!(hdl);
@ -83,6 +86,8 @@ mod kw {
custom_keyword!(input); custom_keyword!(input);
custom_keyword!(instance); custom_keyword!(instance);
custom_keyword!(m); custom_keyword!(m);
custom_keyword!(mask_sim);
custom_keyword!(mask_type);
custom_keyword!(memory); custom_keyword!(memory);
custom_keyword!(memory_array); custom_keyword!(memory_array);
custom_keyword!(memory_with_init); custom_keyword!(memory_with_init);

View file

@ -1096,11 +1096,9 @@ impl Visitor<'_> {
let (#(#bindings,)*) = { let (#(#bindings,)*) = {
type __MatchTy<T> = <T as ::fayalite::ty::Type>::SimValue; type __MatchTy<T> = <T as ::fayalite::ty::Type>::SimValue;
let __match_value = #expr; let __match_value = #expr;
let __match_value = { // use method syntax to deduce what type to convert to
use ::fayalite::sim::value::match_sim_value::*; let __match_value = ::fayalite::sim::value::match_sim_value::MatchSimValueHelper::new(__match_value)
// use method syntax to deduce the correct trait to call .__fayalite_match_sim_value();
::fayalite::sim::value::match_sim_value::MatchSimValueHelper::new(__match_value).__fayalite_match_sim_value()
};
#let_token #pat #eq_token __match_value #semi_token #let_token #pat #eq_token __match_value #semi_token
(#(#bindings_idents,)*) (#(#bindings_idents,)*)
}; };
@ -1172,11 +1170,9 @@ impl Visitor<'_> {
{ {
type __MatchTy<T> = <T as ::fayalite::ty::Type>::SimValue; type __MatchTy<T> = <T as ::fayalite::ty::Type>::SimValue;
let __match_value = #expr; let __match_value = #expr;
let __match_value = { // use method syntax to deduce what type to convert to
use ::fayalite::sim::value::match_sim_value::*; let __match_value = ::fayalite::sim::value::match_sim_value::MatchSimValueHelper::new(__match_value)
// use method syntax to deduce the correct trait to call .__fayalite_match_sim_value();
::fayalite::sim::value::match_sim_value::MatchSimValueHelper::new(__match_value).__fayalite_match_sim_value()
};
#match_token __match_value { #match_token __match_value {
#(#arms)* #(#arms)*
} }

View file

@ -95,7 +95,23 @@
//! } //! }
//! //!
//! #[hdl] //! #[hdl]
//! fn destructure_to_sim_value<'a, T: Type>(v: impl ToSimValue<Type = MyStruct<T>>) { //! fn destructure_inner<T: Type>(v: <MyStruct<T> as Type>::SimValue) {
//! #[hdl(sim)]
//! let MyStruct::<T> {
//! a,
//! mut b,
//! c,
//! } = v;
//!
//! // that gives these types:
//! let _: SimValue<UInt<8>> = a;
//! let _: SimValue<Bool> = b;
//! let _: SimValue<T> = c;
//! *b = false; // can modify b since mut was used
//! }
//!
//! #[hdl]
//! fn destructure_inner_ref<'a, T: Type>(v: &'a <MyStruct<T> as Type>::SimValue) {
//! #[hdl(sim)] //! #[hdl(sim)]
//! let MyStruct::<T> { //! let MyStruct::<T> {
//! a, //! a,
@ -104,8 +120,25 @@
//! } = v; //! } = v;
//! //!
//! // that gives these types: //! // that gives these types:
//! let _: SimValue<UInt<8>> = a; //! let _: &'a SimValue<UInt<8>> = a;
//! let _: SimValue<Bool> = b; //! let _: &'a SimValue<Bool> = b;
//! let _: SimValue<T> = c; //! let _: &'a SimValue<T> = c;
//! }
//!
//! #[hdl]
//! fn destructure_inner_mut<'a, T: Type>(v: &'a mut <MyStruct<T> as Type>::SimValue) {
//! #[hdl(sim)]
//! let MyStruct::<T> {
//! a,
//! b,
//! c,
//! } = v;
//!
//! **b = true; // you can modify v by modifying b which borrows from it
//!
//! // that gives these types:
//! let _: &'a mut SimValue<UInt<8>> = a;
//! let _: &'a mut SimValue<Bool> = b;
//! let _: &'a mut SimValue<T> = c;
//! } //! }
//! ``` //! ```

View file

@ -72,15 +72,47 @@
//! } //! }
//! //!
//! #[hdl] //! #[hdl]
//! fn match_to_sim_value<'a, T: Type>(v: impl ToSimValue<Type = MyEnum<T>>) { //! fn match_inner_move<T: Type>(v: <MyEnum<T> as Type>::SimValue) -> String {
//! #[hdl(sim)] //! #[hdl(sim)]
//! match v { //! match v {
//! MyEnum::<T>::A => println!("got A"), //! MyEnum::<T>::A => String::from("got A"),
//! MyEnum::<T>::B(b) => { //! MyEnum::<T>::B(mut b) => {
//! let _: SimValue<Bool> = b; // b has this type //! let _: SimValue<Bool> = b; // b has this type
//! println!("got B({b})"); //! let text = format!("got B({b})");
//! *b = true; // can modify b since mut was used
//! text
//! } //! }
//! _ => println!("something else"), //! _ => String::from("something else"),
//! }
//! }
//!
//! #[hdl]
//! fn match_inner_ref<'a, T: Type>(v: &'a <MyEnum<T> as Type>::SimValue) -> u32 {
//! #[hdl(sim)]
//! match v {
//! MyEnum::<T>::A => 1,
//! MyEnum::<T>::B(b) => {
//! let _: &'a SimValue<Bool> = b; // b has this type
//! println!("got B({b})");
//! 5
//! }
//! _ => 42,
//! }
//! }
//!
//! #[hdl]
//! fn match_inner_mut<'a, T: Type>(v: &'a mut <MyEnum<T> as Type>::SimValue) -> Option<&'a mut SimValue<T>> {
//! #[hdl(sim)]
//! match v {
//! MyEnum::<T>::A => None,
//! MyEnum::<T>::B(b) => {
//! println!("got B({b})");
//! **b = true; // you can modify v by modifying b which borrows from it
//! let _: &'a mut SimValue<Bool> = b; // b has this type
//! None
//! }
//! MyEnum::<T>::C(v) => Some(v), // you can return matched values
//! _ => None, // HDL enums can have invalid discriminants, so we need this extra match arm
//! } //! }
//! } //! }
//! ``` //! ```

View file

@ -13,13 +13,13 @@ use crate::{
source_location::SourceLocation, source_location::SourceLocation,
ty::{ ty::{
CanonicalType, MatchVariantWithoutScope, OpaqueSimValueSlice, OpaqueSimValueWriter, CanonicalType, MatchVariantWithoutScope, OpaqueSimValueSlice, OpaqueSimValueWriter,
OpaqueSimValueWritten, StaticType, Type, TypeProperties, TypeWithDeref, OpaqueSimValueWritten, SimValueDebug, StaticType, Type, TypeProperties, TypeWithDeref,
serde_impls::SerdeCanonicalType, serde_impls::SerdeCanonicalType,
}, },
util::ConstUsize, util::ConstUsize,
}; };
use serde::{Deserialize, Deserializer, Serialize, Serializer, de::Error}; use serde::{Deserialize, Deserializer, Serialize, Serializer, de::Error};
use std::{borrow::Cow, iter::FusedIterator, ops::Index}; use std::{borrow::Cow, fmt, iter::FusedIterator, ops::Index};
#[derive(Copy, Clone, PartialEq, Eq, Hash)] #[derive(Copy, Clone, PartialEq, Eq, Hash)]
pub struct ArrayType<T: Type = CanonicalType, Len: Size = DynSize> { pub struct ArrayType<T: Type = CanonicalType, Len: Size = DynSize> {
@ -28,8 +28,8 @@ pub struct ArrayType<T: Type = CanonicalType, Len: Size = DynSize> {
type_properties: TypeProperties, type_properties: TypeProperties,
} }
impl<T: Type, Len: Size> std::fmt::Debug for ArrayType<T, Len> { impl<T: Type, Len: Size> fmt::Debug for ArrayType<T, Len> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "Array<{:?}, {}>", self.element, self.len()) write!(f, "Array<{:?}, {}>", self.element, self.len())
} }
} }
@ -182,6 +182,15 @@ impl<T: Type + Visit<State>, Len: Size, State: Visitor + ?Sized> Visit<State>
} }
} }
impl<T: Type, Len: Size> SimValueDebug for ArrayType<T, Len> {
fn sim_value_debug(
value: &<Self as Type>::SimValue,
f: &mut fmt::Formatter<'_>,
) -> fmt::Result {
fmt::Debug::fmt(value, f)
}
}
impl<T: Type, Len: Size> Type for ArrayType<T, Len> { impl<T: Type, Len: Size> Type for ArrayType<T, Len> {
type BaseType = Array; type BaseType = Array;
type MaskType = ArrayType<T::MaskType, Len>; type MaskType = ArrayType<T::MaskType, Len>;

View file

@ -14,8 +14,8 @@ use crate::{
source_location::SourceLocation, source_location::SourceLocation,
ty::{ ty::{
CanonicalType, MatchVariantWithoutScope, OpaqueSimValue, OpaqueSimValueSize, CanonicalType, MatchVariantWithoutScope, OpaqueSimValue, OpaqueSimValueSize,
OpaqueSimValueSlice, OpaqueSimValueWriter, OpaqueSimValueWritten, StaticType, Type, OpaqueSimValueSlice, OpaqueSimValueWriter, OpaqueSimValueWritten, SimValueDebug,
TypeProperties, TypeWithDeref, impl_match_variant_as_self, StaticType, Type, TypeProperties, TypeWithDeref, impl_match_variant_as_self,
}, },
util::HashMap, util::HashMap,
}; };
@ -271,6 +271,15 @@ impl Type for Bundle {
} }
} }
impl SimValueDebug for Bundle {
fn sim_value_debug(
value: &<Self as Type>::SimValue,
f: &mut fmt::Formatter<'_>,
) -> fmt::Result {
fmt::Debug::fmt(value, f)
}
}
pub trait BundleType: Type<BaseType = Bundle> { pub trait BundleType: Type<BaseType = Bundle> {
type Builder: Default; type Builder: Default;
fn fields(&self) -> Interned<[BundleField]>; fn fields(&self) -> Interned<[BundleField]>;
@ -471,6 +480,14 @@ macro_rules! impl_tuples {
#[var($var)] #[var($var)]
})*] })*]
} }
impl<$($T: Type,)*> SimValueDebug for ($($T,)*) {
fn sim_value_debug(
value: &<Self as Type>::SimValue,
f: &mut fmt::Formatter<'_>,
) -> fmt::Result {
fmt::Debug::fmt(value, f)
}
}
impl<$($T: Type,)*> Type for ($($T,)*) { impl<$($T: Type,)*> Type for ($($T,)*) {
type BaseType = Bundle; type BaseType = Bundle;
type MaskType = ($($T::MaskType,)*); type MaskType = ($($T::MaskType,)*);
@ -773,6 +790,15 @@ impl_tuples! {
] ]
} }
impl<T: ?Sized + Send + Sync + 'static> SimValueDebug for PhantomData<T> {
fn sim_value_debug(
value: &<Self as Type>::SimValue,
f: &mut fmt::Formatter<'_>,
) -> fmt::Result {
fmt::Debug::fmt(value, f)
}
}
impl<T: ?Sized + Send + Sync + 'static> Type for PhantomData<T> { impl<T: ?Sized + Send + Sync + 'static> Type for PhantomData<T> {
type BaseType = Bundle; type BaseType = Bundle;
type MaskType = (); type MaskType = ();

View file

@ -1,5 +1,6 @@
// SPDX-License-Identifier: LGPL-3.0-or-later // SPDX-License-Identifier: LGPL-3.0-or-later
// See Notices.txt for copyright information // See Notices.txt for copyright information
use crate::{ use crate::{
expr::{Expr, ValueType}, expr::{Expr, ValueType},
hdl, hdl,
@ -9,10 +10,12 @@ use crate::{
source_location::SourceLocation, source_location::SourceLocation,
ty::{ ty::{
CanonicalType, OpaqueSimValueSize, OpaqueSimValueSlice, OpaqueSimValueWriter, CanonicalType, OpaqueSimValueSize, OpaqueSimValueSlice, OpaqueSimValueWriter,
OpaqueSimValueWritten, StaticType, Type, TypeProperties, impl_match_variant_as_self, OpaqueSimValueWritten, SimValueDebug, StaticType, Type, TypeProperties,
impl_match_variant_as_self,
}, },
}; };
use bitvec::{bits, order::Lsb0}; use bitvec::{bits, order::Lsb0};
use std::fmt;
#[derive(Copy, Clone, Eq, PartialEq, Hash, Debug, Default)] #[derive(Copy, Clone, Eq, PartialEq, Hash, Debug, Default)]
pub struct Clock; pub struct Clock;
@ -69,6 +72,15 @@ impl Type for Clock {
} }
} }
impl SimValueDebug for Clock {
fn sim_value_debug(
value: &<Self as Type>::SimValue,
f: &mut fmt::Formatter<'_>,
) -> fmt::Result {
fmt::Debug::fmt(value, f)
}
}
impl Clock { impl Clock {
pub fn type_properties(self) -> TypeProperties { pub fn type_properties(self) -> TypeProperties {
Self::TYPE_PROPERTIES Self::TYPE_PROPERTIES

View file

@ -2,7 +2,7 @@
// See Notices.txt for copyright information // See Notices.txt for copyright information
use crate::{ use crate::{
expr::{Expr, HdlPartialEq, HdlPartialEqImpl, ToExpr, ValueType, ops::VariantAccess}, expr::{Expr, ToExpr, ValueType, ops::VariantAccess},
hdl, hdl,
int::{Bool, UIntValue}, int::{Bool, UIntValue},
intern::{Intern, Interned}, intern::{Intern, Interned},
@ -10,18 +10,18 @@ use crate::{
EnumMatchVariantAndInactiveScopeImpl, EnumMatchVariantsIterImpl, Scope, connect, EnumMatchVariantAndInactiveScopeImpl, EnumMatchVariantsIterImpl, Scope, connect,
enum_match_variants_helper, incomplete_wire, wire, enum_match_variants_helper, incomplete_wire, wire,
}, },
sim::value::SimValue, sim::value::{SimValue, ToSimValue, ToSimValueWithType},
source_location::SourceLocation, source_location::SourceLocation,
ty::{ ty::{
CanonicalType, MatchVariantAndInactiveScope, OpaqueSimValue, OpaqueSimValueSize, CanonicalType, MatchVariantAndInactiveScope, OpaqueSimValue, OpaqueSimValueSize,
OpaqueSimValueSlice, OpaqueSimValueWriter, OpaqueSimValueWritten, StaticType, Type, OpaqueSimValueSlice, OpaqueSimValueWriter, OpaqueSimValueWritten, SimValueDebug,
TypeProperties, StaticType, Type, TypeProperties,
}, },
util::HashMap, util::HashMap,
}; };
use bitvec::{order::Lsb0, slice::BitSlice, view::BitView}; use bitvec::{order::Lsb0, slice::BitSlice, view::BitView};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use std::{borrow::Cow, convert::Infallible, fmt, iter::FusedIterator, sync::Arc}; use std::{convert::Infallible, fmt, iter::FusedIterator, sync::Arc};
#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, Serialize, Deserialize)] #[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, Serialize, Deserialize)]
pub struct EnumVariant { pub struct EnumVariant {
@ -410,6 +410,15 @@ impl Type for Enum {
} }
} }
impl SimValueDebug for Enum {
fn sim_value_debug(
value: &<Self as Type>::SimValue,
f: &mut fmt::Formatter<'_>,
) -> fmt::Result {
fmt::Debug::fmt(value, f)
}
}
#[derive(Clone, PartialEq, Eq, Hash, Debug, Default)] #[derive(Clone, PartialEq, Eq, Hash, Debug, Default)]
pub struct EnumPaddingSimValue { pub struct EnumPaddingSimValue {
bits: Option<UIntValue>, bits: Option<UIntValue>,
@ -723,95 +732,12 @@ pub fn enum_type_to_sim_builder<T: EnumType>(v: T) -> T::SimBuilder {
v.into() v.into()
} }
#[hdl] #[hdl(cmp_eq)]
pub enum HdlOption<T: Type> { pub enum HdlOption<T: Type> {
HdlNone, HdlNone,
HdlSome(T), HdlSome(T),
} }
impl<Lhs: Type + HdlPartialEqImpl<Rhs>, Rhs: Type> HdlPartialEqImpl<HdlOption<Rhs>>
for HdlOption<Lhs>
{
fn cmp_value_eq(
lhs: Self,
lhs_value: Cow<'_, Self::SimValue>,
rhs: HdlOption<Rhs>,
rhs_value: Cow<'_, <HdlOption<Rhs> as Type>::SimValue>,
) -> bool {
type SimValueMatch<T> = <T as Type>::SimValue;
match (&*lhs_value, &*rhs_value) {
(SimValueMatch::<Self>::HdlNone(_), SimValueMatch::<HdlOption<Rhs>>::HdlNone(_)) => {
true
}
(SimValueMatch::<Self>::HdlSome(..), SimValueMatch::<HdlOption<Rhs>>::HdlNone(_))
| (SimValueMatch::<Self>::HdlNone(_), SimValueMatch::<HdlOption<Rhs>>::HdlSome(..)) => {
false
}
(
SimValueMatch::<Self>::HdlSome(l, _),
SimValueMatch::<HdlOption<Rhs>>::HdlSome(r, _),
) => HdlPartialEqImpl::cmp_value_eq(
lhs.HdlSome,
Cow::Borrowed(&**l),
rhs.HdlSome,
Cow::Borrowed(&**r),
),
}
}
#[hdl]
fn cmp_expr_eq(lhs: Expr<Self>, rhs: Expr<HdlOption<Rhs>>) -> Expr<Bool> {
#[hdl]
let cmp_eq = wire();
#[hdl]
match lhs {
HdlSome(lhs) =>
{
#[hdl]
match rhs {
HdlSome(rhs) => connect(cmp_eq, lhs.cmp_eq(rhs)),
HdlNone => connect(cmp_eq, false),
}
}
HdlNone =>
{
#[hdl]
match rhs {
HdlSome(_) => connect(cmp_eq, false),
HdlNone => connect(cmp_eq, true),
}
}
}
cmp_eq
}
#[hdl]
fn cmp_expr_ne(lhs: Expr<Self>, rhs: Expr<HdlOption<Rhs>>) -> Expr<Bool> {
#[hdl]
let cmp_ne = wire();
#[hdl]
match lhs {
HdlSome(lhs) =>
{
#[hdl]
match rhs {
HdlSome(rhs) => connect(cmp_ne, lhs.cmp_ne(rhs)),
HdlNone => connect(cmp_ne, true),
}
}
HdlNone =>
{
#[hdl]
match rhs {
HdlSome(_) => connect(cmp_ne, true),
HdlNone => connect(cmp_ne, false),
}
}
}
cmp_ne
}
}
#[allow(non_snake_case)] #[allow(non_snake_case)]
pub fn HdlNone<T: StaticType>() -> Expr<HdlOption<T>> { pub fn HdlNone<T: StaticType>() -> Expr<HdlOption<T>> {
HdlOption[T::TYPE].HdlNone() HdlOption[T::TYPE].HdlNone()
@ -823,6 +749,123 @@ pub fn HdlSome<T: Type>(value: impl ToExpr<Type = T>) -> Expr<HdlOption<T>> {
HdlOption[value.ty()].HdlSome(value) HdlOption[value.ty()].HdlSome(value)
} }
impl<T: Type> From<SimValue<HdlOption<T>>> for Option<SimValue<T>> {
#[hdl]
fn from(value: SimValue<HdlOption<T>>) -> Self {
#[hdl(sim)]
match value {
HdlSome(v) => Some(v),
HdlNone => None,
}
}
}
impl<'a, T: Type> From<&'a SimValue<HdlOption<T>>> for Option<&'a SimValue<T>> {
#[hdl]
fn from(value: &'a SimValue<HdlOption<T>>) -> Self {
#[hdl(sim)]
match value {
HdlSome(v) => Some(v),
HdlNone => None,
}
}
}
impl<'a, T: Type> From<&'a mut SimValue<HdlOption<T>>> for Option<&'a mut SimValue<T>> {
#[hdl]
fn from(value: &'a mut SimValue<HdlOption<T>>) -> Self {
#[hdl(sim)]
match value {
HdlSome(v) => Some(v),
HdlNone => None,
}
}
}
impl<T: ValueType<Type: StaticType<MaskType: StaticType>>> ValueType for Option<T> {
type Type = HdlOption<T::Type>;
type ValueCategory = T::ValueCategory;
fn ty(&self) -> Self::Type {
StaticType::TYPE
}
}
impl<T: Type, V: ToSimValueWithType<T>> ToSimValueWithType<HdlOption<T>> for Option<V> {
#[hdl]
fn to_sim_value_with_type(&self, ty: HdlOption<T>) -> SimValue<HdlOption<T>> {
match self {
Some(v) =>
{
#[hdl(sim)]
ty.HdlSome(v)
}
None =>
{
#[hdl(sim)]
ty.HdlNone()
}
}
}
#[hdl]
fn into_sim_value_with_type(self, ty: HdlOption<T>) -> SimValue<HdlOption<T>> {
match self {
Some(v) =>
{
#[hdl(sim)]
ty.HdlSome(v)
}
None =>
{
#[hdl(sim)]
ty.HdlNone()
}
}
}
}
impl<T: ToSimValue<Type: StaticType<MaskType: StaticType>>> ToSimValue for Option<T> {
#[hdl]
fn to_sim_value(&self) -> SimValue<Self::Type> {
match self {
Some(v) =>
{
#[hdl(sim)]
HdlSome(v)
}
None =>
{
#[hdl(sim)]
HdlNone()
}
}
}
#[hdl]
fn into_sim_value(self) -> SimValue<Self::Type> {
match self {
Some(v) =>
{
#[hdl(sim)]
HdlSome(v)
}
None =>
{
#[hdl(sim)]
HdlNone()
}
}
}
}
impl<T: ToExpr<Type: StaticType<MaskType: StaticType>>> ToExpr for Option<T> {
fn to_expr(&self) -> Expr<Self::Type> {
match self {
Some(v) => HdlSome(v),
None => HdlNone(),
}
}
}
impl<T: Type> HdlOption<T> { impl<T: Type> HdlOption<T> {
#[track_caller] #[track_caller]
pub fn try_map<R: Type, E>( pub fn try_map<R: Type, E>(

View file

@ -17,7 +17,7 @@ use crate::{
reg::Reg, reg::Reg,
reset::{AsyncReset, Reset, ResetType, ResetTypeDispatch, SyncReset}, reset::{AsyncReset, Reset, ResetType, ResetTypeDispatch, SyncReset},
sim::value::{SimValue, ToSimValue, ToSimValueWithType}, sim::value::{SimValue, ToSimValue, ToSimValueWithType},
ty::{CanonicalType, OpaqueSimValue, StaticType, Type, TypeWithDeref}, ty::{CanonicalType, OpaqueSimValue, StaticType, TraceAsString, Type, TypeWithDeref},
util::{ConstBool, ConstUsize}, util::{ConstBool, ConstUsize},
wire::Wire, wire::Wire,
}; };
@ -218,6 +218,8 @@ expr_enum! {
SliceSInt(ops::SliceSInt), SliceSInt(ops::SliceSInt),
CastToBits(ops::CastToBits), CastToBits(ops::CastToBits),
CastBitsTo(ops::CastBitsTo), CastBitsTo(ops::CastBitsTo),
ToTraceAsString(ops::ToTraceAsString),
TraceAsStringAsInner(ops::TraceAsStringAsInner),
ModuleIO(ModuleIO<CanonicalType>), ModuleIO(ModuleIO<CanonicalType>),
Instance(Instance<Bundle>), Instance(Instance<Bundle>),
Wire(Wire<CanonicalType>), Wire(Wire<CanonicalType>),
@ -389,6 +391,35 @@ impl<T: Type> Expr<T> {
__flow: this.__flow, __flow: this.__flow,
} }
} }
#[track_caller]
pub fn as_trace_as_string(this: Self, ty: TraceAsString<T>) -> Expr<TraceAsString<T>> {
assert_eq!(this.ty(), ty.inner_ty());
ops::ToTraceAsString::new(Expr::canonical(this), ty).to_expr()
}
}
impl Expr<CanonicalType> {
pub fn unwrap_transparent_types(mut this: Self) -> Expr<CanonicalType> {
loop {
match this.ty() {
CanonicalType::UInt(_)
| CanonicalType::SInt(_)
| CanonicalType::Bool(_)
| CanonicalType::Array(_)
| CanonicalType::Enum(_)
| CanonicalType::Bundle(_)
| CanonicalType::AsyncReset(_)
| CanonicalType::SyncReset(_)
| CanonicalType::Reset(_)
| CanonicalType::Clock(_)
| CanonicalType::PhantomConst(_)
| CanonicalType::DynSimOnly(_) => return this,
CanonicalType::TraceAsString(_) => {
this = *Expr::<TraceAsString>::from_canonical(this);
}
}
}
}
} }
impl<T: Type> ToLiteralBits for Expr<T> { impl<T: Type> ToLiteralBits for Expr<T> {
@ -1692,3 +1723,188 @@ impl<'a, T: Type> ToSimValueInner<'a> for &'a SimValue<T> {
Cow::Borrowed(&**this) Cow::Borrowed(&**this)
} }
} }
pub trait ToTraceAsString: ValueType {
type Output: ValueType<Type = TraceAsString<Self::Type>, ValueCategory = Self::ValueCategory>;
fn to_trace_as_string_with_ty(&self, ty: TraceAsString<Self::Type>) -> Self::Output;
fn into_trace_as_string_with_ty(self, ty: TraceAsString<Self::Type>) -> Self::Output
where
Self: Sized;
fn to_trace_as_string(&self) -> Self::Output;
fn into_trace_as_string(self) -> Self::Output
where
Self: Sized;
}
impl<
T: ?Sized
+ ValueType
+ ToTraceAsStringImpl<<Self as ValueType>::Type, <Self as ValueType>::ValueCategory>,
> ToTraceAsString for T
{
type Output = T::ImplOutput;
fn to_trace_as_string_with_ty(&self, ty: TraceAsString<Self::Type>) -> Self::Output {
Self::to_trace_as_string_with_ty_impl(self, ty)
}
fn into_trace_as_string_with_ty(self, ty: TraceAsString<Self::Type>) -> Self::Output
where
Self: Sized,
{
Self::into_trace_as_string_with_ty_impl(self, ty)
}
fn to_trace_as_string(&self) -> Self::Output {
Self::to_trace_as_string_impl(self)
}
fn into_trace_as_string(self) -> Self::Output
where
Self: Sized,
{
Self::into_trace_as_string_impl(self)
}
}
pub trait ToTraceAsStringImpl<Ty: Type, C: value_category::ValueCategory> {
type ImplOutput: ValueType<Type = TraceAsString<Ty>, ValueCategory = C>;
fn to_trace_as_string_impl(this: &Self) -> Self::ImplOutput;
fn into_trace_as_string_impl(this: Self) -> Self::ImplOutput
where
Self: Sized;
fn to_trace_as_string_with_ty_impl(this: &Self, ty: TraceAsString<Ty>) -> Self::ImplOutput;
fn into_trace_as_string_with_ty_impl(this: Self, ty: TraceAsString<Ty>) -> Self::ImplOutput
where
Self: Sized;
}
impl<T: ?Sized + crate::sim::value::ToSimValue>
ToTraceAsStringImpl<T::Type, value_category::ValueCategoryValue> for T
{
type ImplOutput = crate::ty::TraceAsStringSimValue<T::Type>;
fn to_trace_as_string_impl(this: &Self) -> Self::ImplOutput {
crate::ty::TraceAsStringSimValue::new(this)
}
fn into_trace_as_string_impl(this: Self) -> Self::ImplOutput
where
Self: Sized,
{
crate::ty::TraceAsStringSimValue::new(this)
}
fn to_trace_as_string_with_ty_impl(
this: &Self,
ty: TraceAsString<T::Type>,
) -> Self::ImplOutput {
crate::ty::TraceAsStringSimValue::new_with_ty(this, ty)
}
fn into_trace_as_string_with_ty_impl(this: Self, ty: TraceAsString<T::Type>) -> Self::ImplOutput
where
Self: Sized,
{
crate::ty::TraceAsStringSimValue::new_with_ty(this, ty)
}
}
impl<T: ?Sized + crate::sim::value::ToSimValue>
ToTraceAsStringImpl<T::Type, value_category::ValueCategorySimValue> for T
{
type ImplOutput = SimValue<TraceAsString<T::Type>>;
fn to_trace_as_string_impl(this: &Self) -> Self::ImplOutput {
crate::ty::TraceAsStringSimValue::new(this).into_sim_value()
}
fn into_trace_as_string_impl(this: Self) -> Self::ImplOutput
where
Self: Sized,
{
crate::ty::TraceAsStringSimValue::new(this).into_sim_value()
}
fn to_trace_as_string_with_ty_impl(
this: &Self,
ty: TraceAsString<T::Type>,
) -> Self::ImplOutput {
crate::ty::TraceAsStringSimValue::new_with_ty(this, ty).into_sim_value()
}
fn into_trace_as_string_with_ty_impl(this: Self, ty: TraceAsString<T::Type>) -> Self::ImplOutput
where
Self: Sized,
{
crate::ty::TraceAsStringSimValue::new_with_ty(this, ty).into_sim_value()
}
}
impl<T: ?Sized + ToExpr> ToTraceAsStringImpl<T::Type, value_category::ValueCategoryExpr> for T {
type ImplOutput = Expr<TraceAsString<T::Type>>;
fn to_trace_as_string_impl(this: &Self) -> Self::ImplOutput {
let this = this.to_expr();
ops::ToTraceAsString::new(Expr::canonical(this), TraceAsString::new(this.ty())).to_expr()
}
fn into_trace_as_string_impl(this: Self) -> Self::ImplOutput
where
Self: Sized,
{
let this = this.to_expr();
ops::ToTraceAsString::new(Expr::canonical(this), TraceAsString::new(this.ty())).to_expr()
}
fn to_trace_as_string_with_ty_impl(
this: &Self,
ty: TraceAsString<T::Type>,
) -> Self::ImplOutput {
let this = this.to_expr();
ops::ToTraceAsString::new(
Expr::canonical(this),
ty.with_new_inner_ty(this.ty().intern_sized()),
)
.to_expr()
}
fn into_trace_as_string_with_ty_impl(this: Self, ty: TraceAsString<T::Type>) -> Self::ImplOutput
where
Self: Sized,
{
let this = this.to_expr();
ops::ToTraceAsString::new(
Expr::canonical(this),
ty.with_new_inner_ty(this.ty().intern_sized()),
)
.to_expr()
}
}
impl<T: ?Sized + ValueType> ToTraceAsStringImpl<T::Type, value_category::ValueCategoryValueless>
for T
{
type ImplOutput = Valueless<TraceAsString<T::Type>>;
fn to_trace_as_string_impl(this: &Self) -> Self::ImplOutput {
Valueless::new(TraceAsString::new(this.ty()))
}
fn into_trace_as_string_impl(this: Self) -> Self::ImplOutput
where
Self: Sized,
{
Valueless::new(TraceAsString::new(this.ty()))
}
fn to_trace_as_string_with_ty_impl(
this: &Self,
ty: TraceAsString<T::Type>,
) -> Self::ImplOutput {
Valueless::new(ty.with_new_inner_ty(this.ty().intern_sized()))
}
fn into_trace_as_string_with_ty_impl(this: Self, ty: TraceAsString<T::Type>) -> Self::ImplOutput
where
Self: Sized,
{
Valueless::new(ty.with_new_inner_ty(this.ty().intern_sized()))
}
}

View file

@ -12,7 +12,8 @@ use crate::{
ToExpr, ToLiteralBits, ToSimValueInner, ToValueless, ValueType, Valueless, ToExpr, ToLiteralBits, ToSimValueInner, ToValueless, ValueType, Valueless,
target::{ target::{
GetTarget, Target, TargetPathArrayElement, TargetPathBundleField, GetTarget, Target, TargetPathArrayElement, TargetPathBundleField,
TargetPathDynArrayElement, TargetPathElement, TargetPathDynArrayElement, TargetPathElement, TargetPathToTraceAsString,
TargetPathTraceAsStringInner,
}, },
value_category::ValueCategoryExpr, value_category::ValueCategoryExpr,
}, },
@ -27,7 +28,7 @@ use crate::{
ToSyncReset, ToSyncReset,
}, },
sim::value::{SimValue, ToSimValue}, sim::value::{SimValue, ToSimValue},
ty::{CanonicalType, StaticType, Type}, ty::{CanonicalType, StaticType, TraceAsString, Type},
util::ConstUsize, util::ConstUsize,
}; };
use bitvec::{order::Lsb0, slice::BitSlice, vec::BitVec, view::BitView}; use bitvec::{order::Lsb0, slice::BitSlice, vec::BitVec, view::BitView};
@ -44,6 +45,9 @@ use std::{
}, },
}; };
#[cfg(test)]
mod test_ops_impls;
macro_rules! make_impls { macro_rules! make_impls {
( (
$([$($args:tt)*])? $([$($args:tt)*])?
@ -583,9 +587,6 @@ macro_rules! make_impls {
#[cfg(test)] #[cfg(test)]
pub(crate) use make_impls; pub(crate) use make_impls;
#[cfg(test)]
mod test_ops_impls;
macro_rules! impl_simple_binary_op_trait { macro_rules! impl_simple_binary_op_trait {
( (
[$($LLifetimes:tt)*][$($LBounds:tt)*] ($($L:tt)*), [$($LLifetimes:tt)*][$($LBounds:tt)*] ($($L:tt)*),
@ -4694,3 +4695,189 @@ impl<This: ExprFromIterator<A>, A> FromIterator<A> for Expr<This> {
This::expr_from_iter(iter) This::expr_from_iter(iter)
} }
} }
#[derive(Copy, Clone, PartialEq, Eq, Hash)]
pub struct ToTraceAsString<T: Type = CanonicalType> {
inner: Expr<CanonicalType>,
ty: TraceAsString<T>,
literal_bits: Result<Interned<BitSlice>, NotALiteralExpr>,
target: Option<Interned<Target>>,
}
impl<T: Type> fmt::Debug for ToTraceAsString<T> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let Self {
inner,
ty: _,
literal_bits: _,
target: _,
} = self;
f.debug_struct("ToTraceAsString")
.field("inner", inner)
.finish_non_exhaustive()
}
}
impl<T: Type> ToTraceAsString<T> {
pub fn new(inner: Expr<CanonicalType>, ty: TraceAsString<T>) -> Self {
assert_eq!(inner.ty(), ty.inner_ty().canonical());
let literal_bits = inner.to_literal_bits();
let target = inner.target().map(|base| {
Intern::intern_sized(
base.join(TargetPathElement::intern_sized(
TargetPathToTraceAsString {
ty: ty.canonical_trace_as_string(),
}
.into(),
))
.canonicalized(),
)
});
Self {
inner,
ty,
literal_bits,
target,
}
}
pub fn inner(self) -> Expr<CanonicalType> {
self.inner
}
}
impl<T: Type> GetTarget for ToTraceAsString<T> {
fn target(&self) -> Option<Interned<Target>> {
self.target
}
}
impl<T: Type> ToLiteralBits for ToTraceAsString<T> {
fn to_literal_bits(&self) -> Result<Interned<BitSlice>, NotALiteralExpr> {
self.literal_bits
}
}
impl<T: Type> ValueType for ToTraceAsString<T> {
type Type = TraceAsString<T>;
type ValueCategory = ValueCategoryExpr;
fn ty(&self) -> Self::Type {
self.ty
}
}
impl<T: Type> ToExpr for ToTraceAsString<T> {
fn to_expr(&self) -> Expr<Self::Type> {
Expr {
__enum: ExprEnum::ToTraceAsString(ToTraceAsString {
inner: self.inner,
ty: self.ty.canonical_trace_as_string(),
literal_bits: self.literal_bits,
target: self.target,
})
.intern(),
__ty: self.ty,
__flow: Expr::flow(self.inner),
}
}
}
#[derive(Copy, Clone, PartialEq, Eq, Hash)]
pub struct TraceAsStringAsInner<T: Type = CanonicalType> {
arg: Expr<TraceAsString<CanonicalType>>,
ty: T,
literal_bits: Result<Interned<BitSlice>, NotALiteralExpr>,
target: Option<Interned<Target>>,
}
impl<T: Type> fmt::Debug for TraceAsStringAsInner<T> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let Self {
arg,
ty: _,
literal_bits: _,
target: _,
} = self;
f.debug_struct("TraceAsStringAsInner")
.field("arg", arg)
.finish_non_exhaustive()
}
}
impl<T: Type> TraceAsStringAsInner<T> {
pub fn from_arg_and_ty(arg: Expr<TraceAsString<CanonicalType>>, ty: T) -> Self {
assert_eq!(arg.ty().inner_ty(), ty.canonical());
let literal_bits = arg.to_literal_bits();
let target = arg.target().map(|base| {
Intern::intern_sized(
base.join(TargetPathElement::intern_sized(
TargetPathTraceAsStringInner {}.into(),
))
.canonicalized(),
)
});
Self {
arg,
ty,
literal_bits,
target,
}
}
pub fn new(arg: Expr<TraceAsString<T>>) -> Self {
Self::from_arg_and_ty(
Expr {
__enum: arg.__enum,
__ty: arg.__ty.canonical_trace_as_string(),
__flow: arg.__flow,
},
arg.ty().inner_ty(),
)
}
pub fn arg(self) -> Expr<TraceAsString<CanonicalType>> {
self.arg
}
pub fn arg_typed(self) -> Expr<TraceAsString<T>> {
Expr {
__enum: self.arg.__enum,
__ty: TraceAsString::from_canonical_trace_as_string(self.arg.__ty),
__flow: self.arg.__flow,
}
}
}
impl<T: Type> GetTarget for TraceAsStringAsInner<T> {
fn target(&self) -> Option<Interned<Target>> {
self.target
}
}
impl<T: Type> ToLiteralBits for TraceAsStringAsInner<T> {
fn to_literal_bits(&self) -> Result<Interned<BitSlice>, NotALiteralExpr> {
self.literal_bits
}
}
impl<T: Type> ValueType for TraceAsStringAsInner<T> {
type Type = T;
type ValueCategory = ValueCategoryExpr;
fn ty(&self) -> Self::Type {
self.ty
}
}
impl<T: Type> ToExpr for TraceAsStringAsInner<T> {
fn to_expr(&self) -> Expr<Self::Type> {
Expr {
__enum: ExprEnum::TraceAsStringAsInner(TraceAsStringAsInner {
arg: self.arg,
ty: self.ty.canonical(),
literal_bits: self.literal_bits,
target: self.target,
})
.intern(),
__ty: self.ty,
__flow: Expr::flow(self.arg),
}
}
}

View file

@ -10,7 +10,7 @@ use crate::{
reg::Reg, reg::Reg,
reset::{AsyncReset, Reset, ResetType, ResetTypeDispatch, SyncReset}, reset::{AsyncReset, Reset, ResetType, ResetTypeDispatch, SyncReset},
source_location::SourceLocation, source_location::SourceLocation,
ty::{CanonicalType, Type}, ty::{CanonicalType, TraceAsString, Type},
wire::Wire, wire::Wire,
}; };
use std::fmt; use std::fmt;
@ -46,11 +46,33 @@ impl fmt::Display for TargetPathDynArrayElement {
} }
} }
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub struct TargetPathTraceAsStringInner {}
impl fmt::Display for TargetPathTraceAsStringInner {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, ".<inner>")
}
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub struct TargetPathToTraceAsString {
pub ty: TraceAsString<CanonicalType>,
}
impl fmt::Display for TargetPathToTraceAsString {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, ".to_trace_as_string(...)")
}
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub enum TargetPathElement { pub enum TargetPathElement {
BundleField(TargetPathBundleField), BundleField(TargetPathBundleField),
ArrayElement(TargetPathArrayElement), ArrayElement(TargetPathArrayElement),
DynArrayElement(TargetPathDynArrayElement), DynArrayElement(TargetPathDynArrayElement),
TraceAsStringInner(TargetPathTraceAsStringInner),
ToTraceAsString(TargetPathToTraceAsString),
} }
impl From<TargetPathBundleField> for TargetPathElement { impl From<TargetPathBundleField> for TargetPathElement {
@ -71,12 +93,26 @@ impl From<TargetPathDynArrayElement> for TargetPathElement {
} }
} }
impl From<TargetPathTraceAsStringInner> for TargetPathElement {
fn from(value: TargetPathTraceAsStringInner) -> Self {
Self::TraceAsStringInner(value)
}
}
impl From<TargetPathToTraceAsString> for TargetPathElement {
fn from(value: TargetPathToTraceAsString) -> Self {
Self::ToTraceAsString(value)
}
}
impl fmt::Display for TargetPathElement { impl fmt::Display for TargetPathElement {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self { match self {
Self::BundleField(v) => v.fmt(f), Self::BundleField(v) => v.fmt(f),
Self::ArrayElement(v) => v.fmt(f), Self::ArrayElement(v) => v.fmt(f),
Self::DynArrayElement(v) => v.fmt(f), Self::DynArrayElement(v) => v.fmt(f),
Self::TraceAsStringInner(v) => v.fmt(f),
Self::ToTraceAsString(v) => v.fmt(f),
} }
} }
} }
@ -100,6 +136,15 @@ impl TargetPathElement {
let parent_ty = Array::<CanonicalType>::from_canonical(parent.canonical_ty()); let parent_ty = Array::<CanonicalType>::from_canonical(parent.canonical_ty());
parent_ty.element() parent_ty.element()
} }
Self::TraceAsStringInner(_) => {
let parent_ty =
TraceAsString::<CanonicalType>::from_canonical(parent.canonical_ty());
parent_ty.inner_ty()
}
&Self::ToTraceAsString(TargetPathToTraceAsString { ty }) => {
assert_eq!(parent.canonical_ty(), ty.inner_ty());
ty.canonical()
}
} }
} }
pub fn flow(&self, parent: Interned<Target>) -> Flow { pub fn flow(&self, parent: Interned<Target>) -> Flow {
@ -111,13 +156,18 @@ impl TargetPathElement {
.expect("field name is known to be a valid field of parent type"); .expect("field name is known to be a valid field of parent type");
parent.flow().flip_if(field.flipped) parent.flow().flip_if(field.flipped)
} }
Self::ArrayElement(_) => parent.flow(), Self::ArrayElement(_)
Self::DynArrayElement(_) => parent.flow(), | Self::DynArrayElement(_)
| Self::TraceAsStringInner(_)
| Self::ToTraceAsString(_) => parent.flow(),
} }
} }
pub fn is_static(&self) -> bool { pub fn is_static(&self) -> bool {
match self { match self {
Self::BundleField(_) | Self::ArrayElement(_) => true, Self::BundleField(_)
| Self::ArrayElement(_)
| Self::TraceAsStringInner(_)
| Self::ToTraceAsString(_) => true,
Self::DynArrayElement(_) => false, Self::DynArrayElement(_) => false,
} }
} }
@ -314,6 +364,7 @@ pub struct TargetChild {
path_element: Interned<TargetPathElement>, path_element: Interned<TargetPathElement>,
canonical_ty: CanonicalType, canonical_ty: CanonicalType,
flow: Flow, flow: Flow,
canonicalized_if_different: Option<Interned<Target>>,
} }
impl fmt::Debug for TargetChild { impl fmt::Debug for TargetChild {
@ -323,6 +374,7 @@ impl fmt::Debug for TargetChild {
path_element, path_element,
canonical_ty: _, canonical_ty: _,
flow: _, flow: _,
canonicalized_if_different: _,
} = self; } = self;
parent.fmt(f)?; parent.fmt(f)?;
fmt::Display::fmt(path_element, f) fmt::Display::fmt(path_element, f)
@ -336,6 +388,7 @@ impl fmt::Display for TargetChild {
path_element, path_element,
canonical_ty: _, canonical_ty: _,
flow: _, flow: _,
canonicalized_if_different: _,
} = self; } = self;
parent.fmt(f)?; parent.fmt(f)?;
path_element.fmt(f) path_element.fmt(f)
@ -343,14 +396,69 @@ impl fmt::Display for TargetChild {
} }
impl TargetChild { impl TargetChild {
pub fn new(parent: Interned<Target>, path_element: Interned<TargetPathElement>) -> Self { fn new_helper(
parent: Interned<Target>,
path_element: Interned<TargetPathElement>,
canonicalized_if_different: Option<Interned<Target>>,
) -> Self {
Self { Self {
parent, parent,
path_element, path_element,
canonical_ty: path_element.canonical_ty(parent), canonical_ty: path_element.canonical_ty(parent),
flow: path_element.flow(parent), flow: path_element.flow(parent),
canonicalized_if_different,
} }
} }
fn make_canonicalized_if_different(
parent: Interned<Target>,
path_element: Interned<TargetPathElement>,
) -> Option<Interned<Target>> {
use TargetPathElement::*;
match *path_element {
BundleField(_) => {}
ArrayElement(_) => {}
DynArrayElement(_) => {}
TraceAsStringInner(_) => {
if let Some(child) = parent.canonicalized().child() {
match *child.path_element() {
BundleField(_)
| ArrayElement(_)
| DynArrayElement(_)
| TraceAsStringInner(_) => {}
ToTraceAsString(_) => return Some(child.parent()),
}
}
}
ToTraceAsString(TargetPathToTraceAsString { ty }) => {
if let Some(child) = parent.canonicalized().child() {
match *child.path_element() {
BundleField(_) | ArrayElement(_) | DynArrayElement(_)
| ToTraceAsString(_) => {}
TraceAsStringInner(_) => {
if ty.canonical() == child.parent().canonical_ty() {
return Some(child.parent());
}
}
}
}
}
}
Some(
Target::Child(Self::new_helper(
parent.canonicalized_if_different()?,
path_element,
None,
))
.intern_sized(),
)
}
pub fn new(parent: Interned<Target>, path_element: Interned<TargetPathElement>) -> Self {
Self::new_helper(
parent,
path_element,
Self::make_canonicalized_if_different(parent, path_element),
)
}
pub fn parent(self) -> Interned<Target> { pub fn parent(self) -> Interned<Target> {
self.parent self.parent
} }
@ -363,6 +471,19 @@ impl TargetChild {
pub fn flow(self) -> Flow { pub fn flow(self) -> Flow {
self.flow self.flow
} }
pub fn is_canonicalized(self) -> bool {
self.canonicalized_if_different.is_none()
}
pub fn canonicalized_if_different(self) -> Option<Interned<Target>> {
self.canonicalized_if_different
}
#[must_use]
pub fn canonicalized(self) -> Target {
match self.canonicalized_if_different {
Some(v) => *v,
None => Target::Child(self),
}
}
pub fn bundle_field(self) -> Option<BundleField> { pub fn bundle_field(self) -> Option<BundleField> {
if let TargetPathElement::BundleField(TargetPathBundleField { name }) = *self.path_element { if let TargetPathElement::BundleField(TargetPathBundleField { name }) = *self.path_element {
let parent_ty = Bundle::from_canonical(self.parent.canonical_ty()); let parent_ty = Bundle::from_canonical(self.parent.canonical_ty());
@ -443,6 +564,82 @@ impl Target {
Target::Child(v) => v.canonical_ty(), Target::Child(v) => v.canonical_ty(),
} }
} }
pub fn is_canonicalized(self) -> bool {
match self {
Self::Base(_) => true,
Self::Child(child) => child.is_canonicalized(),
}
}
pub fn canonicalized_if_different(self) -> Option<Interned<Self>> {
match self {
Self::Base(_) => None,
Self::Child(child) => child.canonicalized_if_different(),
}
}
#[must_use]
pub fn canonicalized(self) -> Target {
match self.canonicalized_if_different() {
Some(v) => *v,
None => self,
}
}
#[must_use]
pub fn canonicalized_interned(this: Interned<Target>) -> Interned<Target> {
this.canonicalized_if_different().unwrap_or(this)
}
#[must_use]
pub fn unwrap_transparent_types(mut self) -> Target {
loop {
self = self.canonicalized();
match self.canonical_ty() {
CanonicalType::UInt(_)
| CanonicalType::SInt(_)
| CanonicalType::Bool(_)
| CanonicalType::Array(_)
| CanonicalType::Enum(_)
| CanonicalType::Bundle(_)
| CanonicalType::AsyncReset(_)
| CanonicalType::SyncReset(_)
| CanonicalType::Reset(_)
| CanonicalType::Clock(_)
| CanonicalType::PhantomConst(_)
| CanonicalType::DynSimOnly(_) => return self,
CanonicalType::TraceAsString(_) => {
if let Self::Child(child) = self
&& let TargetPathElement::ToTraceAsString(_) = *child.path_element()
{
self = *child.parent();
} else {
self = self.join(TargetPathElement::intern_sized(
TargetPathTraceAsStringInner {}.into(),
));
}
}
}
}
}
#[must_use]
pub fn unwrap_transparent_types_interned(this: Interned<Target>) -> Interned<Target> {
let retval = this.unwrap_transparent_types();
if retval != *this {
retval.intern_sized()
} else {
this
}
}
#[must_use]
pub fn without_trailing_transparent_path_elements(mut self) -> Target {
use TargetPathElement::*;
loop {
match self {
Self::Base(_) => return self,
Self::Child(child) => match *child.path_element() {
BundleField(_) | ArrayElement(_) | DynArrayElement(_) => return self,
TraceAsStringInner(_) | ToTraceAsString(_) => self = *child.parent(),
},
}
}
}
} }
impl fmt::Display for Target { impl fmt::Display for Target {

View file

@ -16,6 +16,7 @@ use crate::{
ops::{self, VariantAccess}, ops::{self, VariantAccess},
target::{ target::{
Target, TargetBase, TargetPathArrayElement, TargetPathBundleField, TargetPathElement, Target, TargetBase, TargetPathArrayElement, TargetPathBundleField, TargetPathElement,
TargetPathTraceAsStringInner,
}, },
}, },
formal::FormalKind, formal::FormalKind,
@ -471,7 +472,7 @@ impl TypeState {
Ok(self.enum_def(ty)?.1.variants.borrow_mut().get(name)) Ok(self.enum_def(ty)?.1.variants.borrow_mut().get(name))
} }
fn ty<T: Type>(&self, ty: T) -> Result<String, FirrtlError> { fn ty<T: Type>(&self, ty: T) -> Result<String, FirrtlError> {
Ok(match ty.canonical() { Ok(match ty.canonical().unwrap_transparent_types() {
CanonicalType::Bundle(ty) => self.bundle_ty(ty)?.to_string(), CanonicalType::Bundle(ty) => self.bundle_ty(ty)?.to_string(),
CanonicalType::Enum(ty) => self.enum_ty(ty)?.to_string(), CanonicalType::Enum(ty) => self.enum_ty(ty)?.to_string(),
CanonicalType::Array(ty) => { CanonicalType::Array(ty) => {
@ -490,6 +491,7 @@ impl TypeState {
CanonicalType::DynSimOnly(_) => { CanonicalType::DynSimOnly(_) => {
return Err(FirrtlError::SimOnlyValuesAreNotPermitted); return Err(FirrtlError::SimOnlyValuesAreNotPermitted);
} }
CanonicalType::TraceAsString(_) => unreachable!("handled by unwrap_transparent_types"),
}) })
} }
} }
@ -1191,7 +1193,7 @@ impl<'a> Exporter<'a> {
definitions: &RcDefinitions, definitions: &RcDefinitions,
extra_indent: Indent<'_>, extra_indent: Indent<'_>,
) -> Result<String> { ) -> Result<String> {
match ty { match ty.unwrap_transparent_types() {
CanonicalType::Bundle(ty) => { CanonicalType::Bundle(ty) => {
self.expr_cast_bundle_to_bits(value_str, ty, definitions, extra_indent) self.expr_cast_bundle_to_bits(value_str, ty, definitions, extra_indent)
} }
@ -1210,6 +1212,7 @@ impl<'a> Exporter<'a> {
| CanonicalType::Reset(_) => Ok(format!("asUInt({value_str})")), | CanonicalType::Reset(_) => Ok(format!("asUInt({value_str})")),
CanonicalType::PhantomConst(_) => Ok("UInt<0>(0)".into()), CanonicalType::PhantomConst(_) => Ok("UInt<0>(0)".into()),
CanonicalType::DynSimOnly(_) => Err(FirrtlError::SimOnlyValuesAreNotPermitted.into()), CanonicalType::DynSimOnly(_) => Err(FirrtlError::SimOnlyValuesAreNotPermitted.into()),
CanonicalType::TraceAsString(_) => unreachable!("handled by unwrap_transparent_types"),
} }
} }
fn expr_cast_bits_to_bundle( fn expr_cast_bits_to_bundle(
@ -1407,7 +1410,7 @@ impl<'a> Exporter<'a> {
definitions: &RcDefinitions, definitions: &RcDefinitions,
extra_indent: Indent<'_>, extra_indent: Indent<'_>,
) -> Result<String> { ) -> Result<String> {
match ty { match ty.unwrap_transparent_types() {
CanonicalType::Bundle(ty) => { CanonicalType::Bundle(ty) => {
self.expr_cast_bits_to_bundle(value_str, ty, definitions, extra_indent) self.expr_cast_bits_to_bundle(value_str, ty, definitions, extra_indent)
} }
@ -1431,6 +1434,7 @@ impl<'a> Exporter<'a> {
return Ok(retval.to_string()); return Ok(retval.to_string());
} }
CanonicalType::DynSimOnly(_) => Err(FirrtlError::SimOnlyValuesAreNotPermitted.into()), CanonicalType::DynSimOnly(_) => Err(FirrtlError::SimOnlyValuesAreNotPermitted.into()),
CanonicalType::TraceAsString(_) => unreachable!("handled by unwrap_transparent_types"),
} }
} }
fn expr_unary<T: Type>( fn expr_unary<T: Type>(
@ -1798,6 +1802,10 @@ impl<'a> Exporter<'a> {
write!(out, "[{index}]").unwrap(); write!(out, "[{index}]").unwrap();
Ok(out) Ok(out)
} }
ExprEnum::ToTraceAsString(expr) => self.expr(expr.inner(), definitions, const_ty),
ExprEnum::TraceAsStringAsInner(expr) => {
self.expr(Expr::canonical(expr.arg()), definitions, const_ty)
}
ExprEnum::ModuleIO(expr) => Ok(self.module.ns.get(expr.name_id()).to_string()), ExprEnum::ModuleIO(expr) => Ok(self.module.ns.get(expr.name_id()).to_string()),
ExprEnum::Instance(expr) => { ExprEnum::Instance(expr) => {
assert!(!const_ty, "not a constant"); assert!(!const_ty, "not a constant");
@ -1957,6 +1965,10 @@ impl<'a> Exporter<'a> {
.segments .segments
.push(AnnotationTargetRefSegment::Index { index }), .push(AnnotationTargetRefSegment::Index { index }),
TargetPathElement::DynArrayElement(_) => unreachable!(), TargetPathElement::DynArrayElement(_) => unreachable!(),
TargetPathElement::ToTraceAsString(_)
| TargetPathElement::TraceAsStringInner(_) => {
// ignored
}
} }
Ok(retval) Ok(retval)
} }
@ -3211,6 +3223,8 @@ impl ScalarizeTreeNode {
TargetPathElement::DynArrayElement(_) => { TargetPathElement::DynArrayElement(_) => {
unreachable!("annotations are only on static targets"); unreachable!("annotations are only on static targets");
} }
TargetPathElement::ToTraceAsString(_)
| TargetPathElement::TraceAsStringInner(_) => parent,
} }
} }
} }
@ -3337,6 +3351,13 @@ impl ScalarizeTreeBuilder {
CanonicalType::DynSimOnly(_) => { CanonicalType::DynSimOnly(_) => {
return Err(ScalarizedModuleABIError::SimOnlyValuesAreNotPermitted); return Err(ScalarizedModuleABIError::SimOnlyValuesAreNotPermitted);
} }
CanonicalType::TraceAsString(_) => self.build(
target
.join(TargetPathElement::intern_sized(
TargetPathTraceAsStringInner {}.into(),
))
.intern_sized(),
)?,
}) })
} }
} }

View file

@ -15,8 +15,8 @@ use crate::{
source_location::SourceLocation, source_location::SourceLocation,
ty::{ ty::{
CanonicalType, FillInDefaultedGenerics, OpaqueSimValueSize, OpaqueSimValueSlice, CanonicalType, FillInDefaultedGenerics, OpaqueSimValueSize, OpaqueSimValueSlice,
OpaqueSimValueWriter, OpaqueSimValueWritten, StaticType, Type, TypeProperties, OpaqueSimValueWriter, OpaqueSimValueWritten, SimValueDebug, SimValueDisplay, StaticType,
impl_match_variant_as_self, Type, TypeProperties, impl_match_variant_as_self,
}, },
util::{ConstBool, ConstUsize, GenericConstBool, GenericConstUsize, interned_bit, slice_range}, util::{ConstBool, ConstUsize, GenericConstBool, GenericConstUsize, interned_bit, slice_range},
}; };
@ -1019,6 +1019,24 @@ macro_rules! impl_int {
} }
} }
impl<Width: Size> SimValueDebug for $name<Width> {
fn sim_value_debug(
value: &<Self as Type>::SimValue,
f: &mut fmt::Formatter<'_>,
) -> fmt::Result {
fmt::Debug::fmt(value, f)
}
}
impl<Width: Size> SimValueDisplay for $name<Width> {
fn sim_value_display(
value: &<Self as Type>::SimValue,
f: &mut fmt::Formatter<'_>,
) -> fmt::Result {
fmt::Display::fmt(value, f)
}
}
impl<Width: KnownSize> Default for $name<Width> { impl<Width: KnownSize> Default for $name<Width> {
fn default() -> Self { fn default() -> Self {
Self::TYPE Self::TYPE
@ -1259,6 +1277,9 @@ macro_rules! impl_int {
pub fn bitvec_mut(&mut self) -> &mut BitVec { pub fn bitvec_mut(&mut self) -> &mut BitVec {
Arc::make_mut(&mut self.bits) Arc::make_mut(&mut self.bits)
} }
pub fn arc_bitvec_mut(&mut self) -> &mut Arc<BitVec> {
&mut self.bits
}
} }
}; };
} }
@ -1899,6 +1920,15 @@ impl Type for Bool {
} }
} }
impl SimValueDebug for Bool {
fn sim_value_debug(
value: &<Self as Type>::SimValue,
f: &mut fmt::Formatter<'_>,
) -> fmt::Result {
fmt::Debug::fmt(value, f)
}
}
impl StaticType for Bool { impl StaticType for Bool {
const TYPE: Self = Bool; const TYPE: Self = Bool;
const MASK_TYPE: Self::MaskType = Bool; const MASK_TYPE: Self::MaskType = Bool;

View file

@ -14,7 +14,7 @@ use crate::{
source_location::SourceLocation, source_location::SourceLocation,
ty::{ ty::{
CanonicalType, OpaqueSimValueSlice, OpaqueSimValueWriter, OpaqueSimValueWritten, CanonicalType, OpaqueSimValueSlice, OpaqueSimValueWriter, OpaqueSimValueWritten,
StaticType, Type, TypeProperties, impl_match_variant_as_self, SimValueDebug, StaticType, Type, TypeProperties, impl_match_variant_as_self,
}, },
}; };
use bitvec::{order::Lsb0, view::BitView}; use bitvec::{order::Lsb0, view::BitView};
@ -94,6 +94,15 @@ impl Type for UIntInRangeMaskType {
} }
} }
impl SimValueDebug for UIntInRangeMaskType {
fn sim_value_debug(
value: &<Self as Type>::SimValue,
f: &mut fmt::Formatter<'_>,
) -> fmt::Result {
fmt::Debug::fmt(value, f)
}
}
impl BundleType for UIntInRangeMaskType { impl BundleType for UIntInRangeMaskType {
type Builder = NoBuilder; type Builder = NoBuilder;
@ -339,6 +348,15 @@ macro_rules! define_uint_in_range_type {
} }
} }
impl<Start: Size, End: Size> SimValueDebug for $UIntInRangeType<Start, End> {
fn sim_value_debug(
value: &<Self as Type>::SimValue,
f: &mut fmt::Formatter<'_>,
) -> fmt::Result {
fmt::Debug::fmt(value, f)
}
}
impl<Start: Size, End: Size> fmt::Debug for $UIntInRangeType<Start, End> { impl<Start: Size, End: Size> fmt::Debug for $UIntInRangeType<Start, End> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let Self { value, range } = self; let Self { value, range } = self;

View file

@ -1093,6 +1093,7 @@ pub fn splat_mask<T: Type>(ty: T, value: Expr<Bool>) -> Expr<AsMask<T>> {
.to_expr(), .to_expr(),
)), )),
CanonicalType::PhantomConst(_) => Expr::from_canonical(Expr::canonical(().to_expr())), CanonicalType::PhantomConst(_) => Expr::from_canonical(Expr::canonical(().to_expr())),
CanonicalType::TraceAsString(ty) => Expr::from_canonical(splat_mask(ty.inner_ty(), value)),
} }
} }

View file

@ -1111,7 +1111,10 @@ fn validate_clock_for_past<S: ModuleBuildingStatus>(
let mut target = clock_for_past; let mut target = clock_for_past;
while let Target::Child(child) = target { while let Target::Child(child) = target {
match *child.path_element() { match *child.path_element() {
TargetPathElement::BundleField(_) | TargetPathElement::ArrayElement(_) => {} TargetPathElement::BundleField(_)
| TargetPathElement::ArrayElement(_)
| TargetPathElement::ToTraceAsString(_)
| TargetPathElement::TraceAsStringInner(_) => {}
TargetPathElement::DynArrayElement(_) => { TargetPathElement::DynArrayElement(_) => {
panic!( panic!(
"clock_for_past: clock must be a static target (you can't use `Expr<UInt>` array indexes):\n{clock_for_past:?}" "clock_for_past: clock must be a static target (you can't use `Expr<UInt>` array indexes):\n{clock_for_past:?}"
@ -1535,6 +1538,7 @@ impl TargetState {
} }
} }
fn new(target: Interned<Target>, declared_in_block: usize) -> Self { fn new(target: Interned<Target>, declared_in_block: usize) -> Self {
let target = Target::unwrap_transparent_types_interned(target);
Self { Self {
target, target,
inner: match target.canonical_ty() { inner: match target.canonical_ty() {
@ -1586,6 +1590,9 @@ impl TargetState {
declared_in_block, declared_in_block,
written_in_blocks: RefCell::default(), written_in_blocks: RefCell::default(),
}, },
CanonicalType::TraceAsString(_) => {
unreachable!("handled by Target::unwrap_transparent_types_interned")
}
}, },
} }
} }
@ -1605,44 +1612,59 @@ impl AssertValidityState {
} }
fn get_target_states<'a>( fn get_target_states<'a>(
&'a self, &'a self,
target: &Target, target: Target,
process_target_state: &dyn Fn(&'a TargetState, bool), process_target_state: &dyn Fn(&'a TargetState, bool),
) -> Result<(), ()> { ) -> Result<(), ()> {
match target { let mut target = target.unwrap_transparent_types();
Target::Base(target_base) => { loop {
let target_state = self.get_base_state(*target_base)?; break match target {
process_target_state(target_state, false); Target::Base(target_base) => {
Ok(()) let target_state = self.get_base_state(target_base)?;
} process_target_state(target_state, false);
Target::Child(target_child) => self.get_target_states( Ok(())
&target_child.parent(), }
&|target_state, exact_target_unknown| { Target::Child(target_child) => match *target_child.path_element() {
let TargetStateInner::Decomposed { subtargets } = &target_state.inner else { TargetPathElement::BundleField(_)
unreachable!( | TargetPathElement::ArrayElement(_)
"TargetState::new makes TargetState tree match the Target type" | TargetPathElement::DynArrayElement(_) => self.get_target_states(
); *target_child.parent(),
}; &|target_state, exact_target_unknown| {
match *target_child.path_element() { let TargetStateInner::Decomposed { subtargets } = &target_state.inner
TargetPathElement::BundleField(_) => process_target_state( else {
subtargets unreachable!(
.get(&target_child.path_element()) "TargetState::new makes TargetState tree match the Target type"
.expect("bundle fields filled in by TargetState::new"), );
exact_target_unknown, };
), match *target_child.path_element() {
TargetPathElement::ArrayElement(_) => process_target_state( TargetPathElement::BundleField(_) => process_target_state(
subtargets subtargets
.get(&target_child.path_element()) .get(&target_child.path_element())
.expect("array elements filled in by TargetState::new"), .expect("bundle fields filled in by TargetState::new"),
exact_target_unknown, exact_target_unknown,
), ),
TargetPathElement::DynArrayElement(_) => { TargetPathElement::ArrayElement(_) => process_target_state(
for target_state in subtargets.values() { subtargets
process_target_state(target_state, true); .get(&target_child.path_element())
.expect("array elements filled in by TargetState::new"),
exact_target_unknown,
),
TargetPathElement::DynArrayElement(_) => {
for target_state in subtargets.values() {
process_target_state(target_state, true);
}
}
TargetPathElement::TraceAsStringInner(_)
| TargetPathElement::ToTraceAsString(_) => unreachable!(),
} }
} },
),
TargetPathElement::TraceAsStringInner(_)
| TargetPathElement::ToTraceAsString(_) => {
target = *target_child.parent();
continue;
} }
}, },
), };
} }
} }
fn get_base_state(&self, target_base: Interned<TargetBase>) -> Result<&TargetState, ()> { fn get_base_state(&self, target_base: Interned<TargetBase>) -> Result<&TargetState, ()> {
@ -1693,6 +1715,7 @@ impl AssertValidityState {
&TargetPathElement::BundleField(_) => { &TargetPathElement::BundleField(_) => {
let field = sub_target_state let field = sub_target_state
.target .target
.without_trailing_transparent_path_elements()
.child() .child()
.expect("known to be a child") .expect("known to be a child")
.bundle_field() .bundle_field()
@ -1716,6 +1739,8 @@ impl AssertValidityState {
TargetPathElement::DynArrayElement { .. } => { TargetPathElement::DynArrayElement { .. } => {
Self::set_connect_target_written(sub_target_state, is_lhs, block, true); Self::set_connect_target_written(sub_target_state, is_lhs, block, true);
} }
TargetPathElement::TraceAsStringInner(_)
| TargetPathElement::ToTraceAsString(_) => unreachable!("never added"),
} }
} }
} }
@ -1733,7 +1758,7 @@ impl AssertValidityState {
debug_assert!(!is_lhs, "the ModuleBuilder asserts lhs.target().is_some()"); debug_assert!(!is_lhs, "the ModuleBuilder asserts lhs.target().is_some()");
return; return;
}; };
let result = self.get_target_states(&target, &|target_state, exact_target_unknown| { let result = self.get_target_states(*target, &|target_state, exact_target_unknown| {
Self::set_connect_target_written(target_state, is_lhs, block, exact_target_unknown); Self::set_connect_target_written(target_state, is_lhs, block, exact_target_unknown);
}); });
if result.is_err() { if result.is_err() {

View file

@ -10,7 +10,8 @@ use crate::{
ops::{self, ArrayLiteral}, ops::{self, ArrayLiteral},
target::{ target::{
Target, TargetBase, TargetChild, TargetPathArrayElement, TargetPathBundleField, Target, TargetBase, TargetChild, TargetPathArrayElement, TargetPathBundleField,
TargetPathDynArrayElement, TargetPathElement, TargetPathDynArrayElement, TargetPathElement, TargetPathToTraceAsString,
TargetPathTraceAsStringInner,
}, },
}, },
formal::FormalKind, formal::FormalKind,
@ -26,6 +27,7 @@ use crate::{
prelude::*, prelude::*,
reset::{ResetType, ResetTypeDispatch}, reset::{ResetType, ResetTypeDispatch},
sim::ExternModuleSimulation, sim::ExternModuleSimulation,
ty::TraceAsString,
util::{HashMap, HashSet}, util::{HashMap, HashSet},
}; };
use hashbrown::hash_map::Entry; use hashbrown::hash_map::Entry;
@ -103,6 +105,10 @@ enum ResetsLayout {
element: Interned<ResetsLayout>, element: Interned<ResetsLayout>,
reset_count: usize, reset_count: usize,
}, },
Transparent {
inner: Interned<ResetsLayout>,
reset_count: usize,
},
} }
impl ResetsLayout { impl ResetsLayout {
@ -112,7 +118,8 @@ impl ResetsLayout {
ResetsLayout::Reset | ResetsLayout::SyncReset | ResetsLayout::AsyncReset => 1, ResetsLayout::Reset | ResetsLayout::SyncReset | ResetsLayout::AsyncReset => 1,
ResetsLayout::Bundle { reset_count, .. } ResetsLayout::Bundle { reset_count, .. }
| ResetsLayout::Enum { reset_count, .. } | ResetsLayout::Enum { reset_count, .. }
| ResetsLayout::Array { reset_count, .. } => reset_count, | ResetsLayout::Array { reset_count, .. }
| ResetsLayout::Transparent { reset_count, .. } => reset_count,
} }
} }
fn new(ty: CanonicalType) -> Self { fn new(ty: CanonicalType) -> Self {
@ -166,6 +173,13 @@ impl ResetsLayout {
CanonicalType::Clock(_) => ResetsLayout::NoResets, CanonicalType::Clock(_) => ResetsLayout::NoResets,
CanonicalType::PhantomConst(_) => ResetsLayout::NoResets, CanonicalType::PhantomConst(_) => ResetsLayout::NoResets,
CanonicalType::DynSimOnly(_) => ResetsLayout::NoResets, CanonicalType::DynSimOnly(_) => ResetsLayout::NoResets,
CanonicalType::TraceAsString(ty) => {
let inner = ResetsLayout::new(ty.inner_ty()).intern_sized();
ResetsLayout::Transparent {
inner,
reset_count: inner.reset_count(),
}
}
} }
} }
} }
@ -315,6 +329,12 @@ impl ResetGraph {
} => { } => {
self.append_new_nodes_for_layout(*element, node_indexes, source_location); self.append_new_nodes_for_layout(*element, node_indexes, source_location);
} }
ResetsLayout::Transparent {
inner,
reset_count: _,
} => {
self.append_new_nodes_for_layout(*inner, node_indexes, source_location);
}
} }
} }
} }
@ -357,6 +377,21 @@ impl Resets {
node_indexes: self.node_indexes, node_indexes: self.node_indexes,
} }
} }
fn trace_as_string_inner(self) -> Self {
let trace_as_string = TraceAsString::from_canonical(self.ty);
let ResetsLayout::Transparent {
inner,
reset_count: _,
} = self.layout
else {
unreachable!();
};
Self {
ty: trace_as_string.inner_ty(),
layout: *inner,
node_indexes: self.node_indexes,
}
}
fn bundle_fields(self) -> impl Iterator<Item = Self> { fn bundle_fields(self) -> impl Iterator<Item = Self> {
let bundle = Bundle::from_canonical(self.ty); let bundle = Bundle::from_canonical(self.ty);
let ResetsLayout::Bundle { let ResetsLayout::Bundle {
@ -480,6 +515,17 @@ impl Resets {
CanonicalType::SyncReset(SyncReset) CanonicalType::SyncReset(SyncReset)
}, },
), ),
CanonicalType::TraceAsString(ty) => Ok(CanonicalType::TraceAsString(
ty.with_new_inner_ty(
self.array_elements()
.substituted_type(
reset_graph,
fallback_to_sync_reset,
fallback_error_source_location,
)?
.intern_sized(),
),
)),
} }
} }
} }
@ -1013,7 +1059,8 @@ fn cast_bit_op<P: Pass, T: Type, A: Type>(
| CanonicalType::Bundle(_) | CanonicalType::Bundle(_)
| CanonicalType::Reset(_) | CanonicalType::Reset(_)
| CanonicalType::PhantomConst(_) | CanonicalType::PhantomConst(_)
| CanonicalType::DynSimOnly(_) => unreachable!(), | CanonicalType::DynSimOnly(_)
| CanonicalType::TraceAsString(_) => unreachable!(),
$(CanonicalType::$Variant(ty) => Expr::expr_enum($arg.cast_to(ty)),)* $(CanonicalType::$Variant(ty) => Expr::expr_enum($arg.cast_to(ty)),)*
} }
}; };
@ -1024,7 +1071,8 @@ fn cast_bit_op<P: Pass, T: Type, A: Type>(
CanonicalType::Array(_) CanonicalType::Array(_)
| CanonicalType::Enum(_) | CanonicalType::Enum(_)
| CanonicalType::Bundle(_) | CanonicalType::Bundle(_)
| CanonicalType::Reset(_) => unreachable!(), | CanonicalType::Reset(_)
| CanonicalType::TraceAsString(_) => unreachable!(),
CanonicalType::PhantomConst(_) | CanonicalType::PhantomConst(_) |
CanonicalType::DynSimOnly(_) => Expr::expr_enum(arg), CanonicalType::DynSimOnly(_) => Expr::expr_enum(arg),
$(CanonicalType::$Variant(_) => { $(CanonicalType::$Variant(_) => {
@ -1156,6 +1204,10 @@ impl<P: Pass> RunPass<P> for ExprEnum {
ExprEnum::SliceSInt(expr) => Ok(expr.run_pass(pass_args)?.map(ExprEnum::from)), ExprEnum::SliceSInt(expr) => Ok(expr.run_pass(pass_args)?.map(ExprEnum::from)),
ExprEnum::CastToBits(expr) => Ok(expr.run_pass(pass_args)?.map(ExprEnum::from)), ExprEnum::CastToBits(expr) => Ok(expr.run_pass(pass_args)?.map(ExprEnum::from)),
ExprEnum::CastBitsTo(expr) => Ok(expr.run_pass(pass_args)?.map(ExprEnum::from)), ExprEnum::CastBitsTo(expr) => Ok(expr.run_pass(pass_args)?.map(ExprEnum::from)),
ExprEnum::TraceAsStringAsInner(expr) => {
Ok(expr.run_pass(pass_args)?.map(ExprEnum::from))
}
ExprEnum::ToTraceAsString(expr) => Ok(expr.run_pass(pass_args)?.map(ExprEnum::from)),
ExprEnum::ModuleIO(expr) => Ok(expr.run_pass(pass_args)?.map(ExprEnum::from)), ExprEnum::ModuleIO(expr) => Ok(expr.run_pass(pass_args)?.map(ExprEnum::from)),
ExprEnum::Instance(expr) => Ok(expr.run_pass(pass_args)?.map(ExprEnum::from)), ExprEnum::Instance(expr) => Ok(expr.run_pass(pass_args)?.map(ExprEnum::from)),
ExprEnum::Wire(expr) => Ok(expr.run_pass(pass_args)?.map(ExprEnum::from)), ExprEnum::Wire(expr) => Ok(expr.run_pass(pass_args)?.map(ExprEnum::from)),
@ -1536,6 +1588,67 @@ impl RunPassExpr for ops::CastBitsTo {
} }
} }
impl RunPassExpr for ops::TraceAsStringAsInner {
type Args<'a> = [Expr<CanonicalType>; 1];
fn args<'a>(&'a self) -> Self::Args<'a> {
[Expr::canonical(self.arg())]
}
fn source_location(&self) -> Option<SourceLocation> {
None
}
fn union_parts(
&self,
resets: Resets,
args_resets: Vec<Resets>,
mut pass_args: PassArgs<'_, BuildResetGraph>,
) -> Result<(), DeduceResetsError> {
pass_args.union(resets, args_resets[0].trace_as_string_inner(), None)
}
fn new(
&self,
_ty: CanonicalType,
new_args: Vec<Expr<CanonicalType>>,
) -> Result<Self, DeduceResetsError> {
Ok(Self::new(Expr::from_canonical(new_args[0])))
}
}
impl RunPassExpr for ops::ToTraceAsString {
type Args<'a> = [Expr<CanonicalType>; 1];
fn args<'a>(&'a self) -> Self::Args<'a> {
[Expr::canonical(self.inner())]
}
fn source_location(&self) -> Option<SourceLocation> {
None
}
fn union_parts(
&self,
resets: Resets,
args_resets: Vec<Resets>,
mut pass_args: PassArgs<'_, BuildResetGraph>,
) -> Result<(), DeduceResetsError> {
pass_args.union(resets.trace_as_string_inner(), args_resets[0], None)
}
fn new(
&self,
_ty: CanonicalType,
new_args: Vec<Expr<CanonicalType>>,
) -> Result<Self, DeduceResetsError> {
Ok(Self::new(
new_args[0],
self.ty().with_new_inner_ty(new_args[0].ty().intern_sized()),
))
}
}
impl RunPassExpr for ModuleIO<CanonicalType> { impl RunPassExpr for ModuleIO<CanonicalType> {
type Args<'a> = [Expr<CanonicalType>; 0]; type Args<'a> = [Expr<CanonicalType>; 0];
@ -1691,7 +1804,8 @@ impl RunPassDispatch for AnyReg {
| CanonicalType::Reset(_) | CanonicalType::Reset(_)
| CanonicalType::Clock(_) | CanonicalType::Clock(_)
| CanonicalType::PhantomConst(_) | CanonicalType::PhantomConst(_)
| CanonicalType::DynSimOnly(_) => unreachable!(), | CanonicalType::DynSimOnly(_)
| CanonicalType::TraceAsString(_) => unreachable!(),
} }
}) })
} }
@ -2173,30 +2287,6 @@ impl<P: Pass> RunPass<P> for StmtDeclaration {
} }
} }
impl_run_pass_for_struct! {
impl[] RunPass for TargetPathBundleField {
name: _,
}
}
impl_run_pass_for_struct! {
impl[] RunPass for TargetPathArrayElement {
index: _,
}
}
impl_run_pass_for_struct! {
impl[] RunPass for TargetPathDynArrayElement {}
}
impl_run_pass_for_enum! {
impl[] RunPass for TargetPathElement {
BundleField(v),
ArrayElement(v),
DynArrayElement(v),
}
}
impl_run_pass_for_enum! { impl_run_pass_for_enum! {
impl[] RunPass for Target { impl[] RunPass for Target {
Base(v), Base(v),
@ -2204,11 +2294,28 @@ impl_run_pass_for_enum! {
} }
} }
impl_run_pass_for_struct! { impl<P: Pass> RunPass<P> for TargetChild {
#[constructor = TargetChild::new(parent, path_element)] fn run_pass(
impl[] RunPass for TargetChild { &self,
parent(): _, mut pass_args: PassArgs<'_, P>,
path_element(): _, ) -> Result<PassOutput<Self, P>, DeduceResetsError> {
Ok(self.parent().run_pass(pass_args.as_mut())?.map(|parent| {
let path_element = match *self.path_element() {
TargetPathElement::BundleField(TargetPathBundleField { name: _ })
| TargetPathElement::ArrayElement(TargetPathArrayElement { index: _ })
| TargetPathElement::DynArrayElement(TargetPathDynArrayElement {})
| TargetPathElement::TraceAsStringInner(TargetPathTraceAsStringInner {}) => {
self.path_element()
}
TargetPathElement::ToTraceAsString(TargetPathToTraceAsString { ty }) => {
TargetPathElement::from(TargetPathToTraceAsString {
ty: ty.with_new_inner_ty(parent.canonical_ty().intern_sized()),
})
.intern_sized()
}
};
TargetChild::new(parent, path_element)
}))
} }
} }

View file

@ -17,7 +17,7 @@ use crate::{
transform::visit::{Fold, Folder}, transform::visit::{Fold, Folder},
}, },
source_location::SourceLocation, source_location::SourceLocation,
ty::{CanonicalType, Type}, ty::{CanonicalType, TraceAsString, Type},
util::HashMap, util::HashMap,
wire::Wire, wire::Wire,
}; };
@ -64,6 +64,7 @@ fn contains_any_enum_types(ty: CanonicalType) -> bool {
.fields() .fields()
.iter() .iter()
.any(|field| contains_any_enum_types(field.ty)), .any(|field| contains_any_enum_types(field.ty)),
CanonicalType::TraceAsString(ty) => contains_any_enum_types(ty.inner_ty()),
CanonicalType::UInt(_) CanonicalType::UInt(_)
| CanonicalType::SInt(_) | CanonicalType::SInt(_)
| CanonicalType::Bool(_) | CanonicalType::Bool(_)
@ -313,6 +314,24 @@ impl State {
} }
Ok(()) Ok(())
} }
fn handle_stmt_connect_trace_as_string(
&mut self,
unfolded_lhs_ty: TraceAsString,
unfolded_rhs_ty: TraceAsString,
folded_lhs: Expr<TraceAsString>,
folded_rhs: Expr<TraceAsString>,
source_location: SourceLocation,
output_stmts: &mut Vec<Stmt>,
) -> Result<(), SimplifyEnumsError> {
self.handle_stmt_connect(
unfolded_lhs_ty.inner_ty(),
unfolded_rhs_ty.inner_ty(),
ops::TraceAsStringAsInner::new(folded_lhs).to_expr(),
ops::TraceAsStringAsInner::new(folded_rhs).to_expr(),
source_location,
output_stmts,
)
}
fn handle_stmt_connect_bundle( fn handle_stmt_connect_bundle(
&mut self, &mut self,
unfolded_lhs_ty: Bundle, unfolded_lhs_ty: Bundle,
@ -509,6 +528,15 @@ impl State {
source_location, source_location,
output_stmts, output_stmts,
), ),
CanonicalType::TraceAsString(unfolded_lhs_ty) => self
.handle_stmt_connect_trace_as_string(
unfolded_lhs_ty,
TraceAsString::from_canonical(unfolded_rhs_ty),
Expr::from_canonical(folded_lhs),
Expr::from_canonical(folded_rhs),
source_location,
output_stmts,
),
CanonicalType::UInt(_) CanonicalType::UInt(_)
| CanonicalType::SInt(_) | CanonicalType::SInt(_)
| CanonicalType::Bool(_) | CanonicalType::Bool(_)
@ -528,6 +556,8 @@ fn connect_port(
rhs: Expr<CanonicalType>, rhs: Expr<CanonicalType>,
source_location: SourceLocation, source_location: SourceLocation,
) { ) {
let lhs = Expr::unwrap_transparent_types(lhs);
let rhs = Expr::unwrap_transparent_types(rhs);
if lhs.ty() == rhs.ty() { if lhs.ty() == rhs.ty() {
stmts.push( stmts.push(
StmtConnect { StmtConnect {
@ -573,6 +603,9 @@ fn connect_port(
connect_port(stmts, lhs[index], rhs[index], source_location); connect_port(stmts, lhs[index], rhs[index], source_location);
} }
} }
(CanonicalType::TraceAsString(_), CanonicalType::TraceAsString(_)) => {
unreachable!("handled by unwrap_transparent_types")
}
(CanonicalType::Bundle(_), _) (CanonicalType::Bundle(_), _)
| (CanonicalType::Enum(_), _) | (CanonicalType::Enum(_), _)
| (CanonicalType::Array(_), _) | (CanonicalType::Array(_), _)
@ -584,7 +617,8 @@ fn connect_port(
| (CanonicalType::SyncReset(_), _) | (CanonicalType::SyncReset(_), _)
| (CanonicalType::Reset(_), _) | (CanonicalType::Reset(_), _)
| (CanonicalType::PhantomConst(_), _) | (CanonicalType::PhantomConst(_), _)
| (CanonicalType::DynSimOnly(_), _) => unreachable!( | (CanonicalType::DynSimOnly(_), _)
| (CanonicalType::TraceAsString(_), _) => unreachable!(
"trying to connect memory ports:\n{:?}\n{:?}", "trying to connect memory ports:\n{:?}\n{:?}",
lhs.ty(), lhs.ty(),
rhs.ty(), rhs.ty(),
@ -772,6 +806,8 @@ impl Folder for State {
| ExprEnum::SliceSInt(_) | ExprEnum::SliceSInt(_)
| ExprEnum::CastToBits(_) | ExprEnum::CastToBits(_)
| ExprEnum::CastBitsTo(_) | ExprEnum::CastBitsTo(_)
| ExprEnum::TraceAsStringAsInner(_)
| ExprEnum::ToTraceAsString(_)
| ExprEnum::ModuleIO(_) | ExprEnum::ModuleIO(_)
| ExprEnum::Instance(_) | ExprEnum::Instance(_)
| ExprEnum::Wire(_) | ExprEnum::Wire(_)
@ -936,7 +972,8 @@ impl Folder for State {
| CanonicalType::SyncReset(_) | CanonicalType::SyncReset(_)
| CanonicalType::Reset(_) | CanonicalType::Reset(_)
| CanonicalType::PhantomConst(_) | CanonicalType::PhantomConst(_)
| CanonicalType::DynSimOnly(_) => canonical_type.default_fold(self), | CanonicalType::DynSimOnly(_)
| CanonicalType::TraceAsString(_) => canonical_type.default_fold(self),
} }
} }

View file

@ -90,7 +90,7 @@ impl MemSplit {
} }
} }
fn new(element_type: CanonicalType) -> Self { fn new(element_type: CanonicalType) -> Self {
match element_type { match element_type.unwrap_transparent_types() {
CanonicalType::Bundle(bundle_ty) => MemSplit::Bundle { CanonicalType::Bundle(bundle_ty) => MemSplit::Bundle {
fields: bundle_ty fields: bundle_ty
.fields() .fields()
@ -195,6 +195,7 @@ impl MemSplit {
| CanonicalType::SyncReset(_) | CanonicalType::SyncReset(_)
| CanonicalType::Reset(_) => unreachable!("memory element type is a storable type"), | CanonicalType::Reset(_) => unreachable!("memory element type is a storable type"),
CanonicalType::DynSimOnly(_) => todo!("memory containing sim-only values"), CanonicalType::DynSimOnly(_) => todo!("memory containing sim-only values"),
CanonicalType::TraceAsString(_) => unreachable!("handled by unwrap_transparent_types"),
} }
} }
} }
@ -306,7 +307,9 @@ impl SplitMemState<'_, '_> {
let outer_mem_name_path_len = self.mem_name_path.len(); let outer_mem_name_path_len = self.mem_name_path.len();
match self.split { match self.split {
MemSplit::Bundle { fields } => { MemSplit::Bundle { fields } => {
let CanonicalType::Bundle(bundle_type) = self.element_type else { let CanonicalType::Bundle(bundle_type) =
self.element_type.unwrap_transparent_types()
else {
unreachable!(); unreachable!();
}; };
for ((field, field_offset), split) in bundle_type for ((field, field_offset), split) in bundle_type
@ -321,7 +324,10 @@ impl SplitMemState<'_, '_> {
let field_ty_bit_width = field.ty.bit_width(); let field_ty_bit_width = field.ty.bit_width();
self.split_state_stack.push_map( self.split_state_stack.push_map(
|e: Expr<CanonicalType>| { |e: Expr<CanonicalType>| {
Expr::field(Expr::<Bundle>::from_canonical(e), &field.name) Expr::field(
Expr::<Bundle>::from_canonical(Expr::unwrap_transparent_types(e)),
&field.name,
)
}, },
|initial_value_element| { |initial_value_element| {
let Some(field_offset) = field_offset.only_bit_width() else { let Some(field_offset) = field_offset.only_bit_width() else {
@ -377,8 +383,8 @@ impl SplitMemState<'_, '_> {
}; };
self.output_stmts.push( self.output_stmts.push(
StmtConnect { StmtConnect {
lhs: Expr::field(port_expr, name), lhs: Expr::unwrap_transparent_types(Expr::field(port_expr, name)),
rhs: Expr::field(wire_expr, name), rhs: Expr::unwrap_transparent_types(Expr::field(wire_expr, name)),
source_location: port.source_location(), source_location: port.source_location(),
} }
.into(), .into(),
@ -389,7 +395,8 @@ impl SplitMemState<'_, '_> {
self.output_mems.push(new_mem); self.output_mems.push(new_mem);
} }
MemSplit::Array { elements } => { MemSplit::Array { elements } => {
let CanonicalType::Array(array_type) = self.element_type else { let CanonicalType::Array(array_type) = self.element_type.unwrap_transparent_types()
else {
unreachable!(); unreachable!();
}; };
let element_type = array_type.element(); let element_type = array_type.element();
@ -398,7 +405,7 @@ impl SplitMemState<'_, '_> {
self.mem_name_path.truncate(outer_mem_name_path_len); self.mem_name_path.truncate(outer_mem_name_path_len);
write!(self.mem_name_path, "_{index}").unwrap(); write!(self.mem_name_path, "_{index}").unwrap();
self.split_state_stack.push_map( self.split_state_stack.push_map(
|e| Expr::<Array>::from_canonical(e)[index], |e| Expr::<Array>::from_canonical(Expr::unwrap_transparent_types(e))[index],
|initial_value_element| { |initial_value_element| {
&initial_value_element[index * element_bit_width..][..element_bit_width] &initial_value_element[index * element_bit_width..][..element_bit_width]
}, },
@ -464,7 +471,7 @@ impl ModuleState {
assert_eq!(memory_element_array_range_len % input_array_type.len(), 0); assert_eq!(memory_element_array_range_len % input_array_type.len(), 0);
let chunk_size = memory_element_array_range_len / input_array_type.len(); let chunk_size = memory_element_array_range_len / input_array_type.len();
for index in 0..input_array_type.len() { for index in 0..input_array_type.len() {
let map = |e| Expr::<Array>::from_canonical(e)[index]; let map = |e| Expr::<Array>::from_canonical(Expr::unwrap_transparent_types(e))[index];
let wire_rdata = wire_rdata.map(map); let wire_rdata = wire_rdata.map(map);
let wire_wdata = wire_wdata.map(map); let wire_wdata = wire_wdata.map(map);
let wire_wmask = wire_wmask.map(map); let wire_wmask = wire_wmask.map(map);
@ -505,8 +512,8 @@ impl ModuleState {
port_read: Expr<CanonicalType>| { port_read: Expr<CanonicalType>| {
output_stmts.push( output_stmts.push(
StmtConnect { StmtConnect {
lhs: wire_read, lhs: Expr::unwrap_transparent_types(wire_read),
rhs: port_read, rhs: Expr::unwrap_transparent_types(port_read),
source_location, source_location,
} }
.into(), .into(),
@ -517,8 +524,8 @@ impl ModuleState {
port_write: Expr<CanonicalType>| { port_write: Expr<CanonicalType>| {
output_stmts.push( output_stmts.push(
StmtConnect { StmtConnect {
lhs: port_write, lhs: Expr::unwrap_transparent_types(port_write),
rhs: wire_write, rhs: Expr::unwrap_transparent_types(wire_write),
source_location, source_location,
} }
.into(), .into(),
@ -530,7 +537,8 @@ impl ModuleState {
connect_read( connect_read(
output_stmts, output_stmts,
wire_read, wire_read,
Expr::<UInt>::from_canonical(port_read).cast_bits_to(wire_read.ty()), Expr::<UInt>::from_canonical(Expr::unwrap_transparent_types(port_read))
.cast_bits_to(wire_read.ty()),
); );
}; };
let connect_write_enum = let connect_write_enum =
@ -544,7 +552,7 @@ impl ModuleState {
); );
}; };
loop { loop {
match input_element_type { match input_element_type.unwrap_transparent_types() {
CanonicalType::Bundle(_) => { CanonicalType::Bundle(_) => {
unreachable!("bundle types are always split") unreachable!("bundle types are always split")
} }
@ -625,6 +633,9 @@ impl ModuleState {
| CanonicalType::SyncReset(_) | CanonicalType::SyncReset(_)
| CanonicalType::Reset(_) => unreachable!("memory element type is a storable type"), | CanonicalType::Reset(_) => unreachable!("memory element type is a storable type"),
CanonicalType::DynSimOnly(_) => todo!("memory containing sim-only values"), CanonicalType::DynSimOnly(_) => todo!("memory containing sim-only values"),
CanonicalType::TraceAsString(_) => {
unreachable!("handled by unwrap_transparent_types")
}
} }
break; break;
} }

View file

@ -14,7 +14,8 @@ use crate::{
Expr, ExprEnum, ValueType, ops, Expr, ExprEnum, ValueType, ops,
target::{ target::{
Target, TargetBase, TargetChild, TargetPathArrayElement, TargetPathBundleField, Target, TargetBase, TargetChild, TargetPathArrayElement, TargetPathBundleField,
TargetPathDynArrayElement, TargetPathElement, TargetPathDynArrayElement, TargetPathElement, TargetPathToTraceAsString,
TargetPathTraceAsStringInner,
}, },
}, },
formal::FormalKind, formal::FormalKind,
@ -32,7 +33,7 @@ use crate::{
reset::{AsyncReset, Reset, ResetType, SyncReset}, reset::{AsyncReset, Reset, ResetType, SyncReset},
sim::{ExternModuleSimulation, value::DynSimOnly}, sim::{ExternModuleSimulation, value::DynSimOnly},
source_location::SourceLocation, source_location::SourceLocation,
ty::{CanonicalType, Type}, ty::{CanonicalType, TraceAsString, Type},
vendor::xilinx::{ vendor::xilinx::{
XdcCreateClockAnnotation, XdcIOStandardAnnotation, XdcLocationAnnotation, XilinxAnnotation, XdcCreateClockAnnotation, XdcIOStandardAnnotation, XdcLocationAnnotation, XilinxAnnotation,
}, },

View file

@ -9,7 +9,7 @@ use crate::{
source_location::SourceLocation, source_location::SourceLocation,
ty::{ ty::{
CanonicalType, OpaqueSimValueSlice, OpaqueSimValueWriter, OpaqueSimValueWritten, CanonicalType, OpaqueSimValueSlice, OpaqueSimValueWriter, OpaqueSimValueWritten,
StaticType, Type, TypeProperties, impl_match_variant_as_self, SimValueDebug, StaticType, Type, TypeProperties, impl_match_variant_as_self,
serde_impls::{SerdeCanonicalType, SerdePhantomConst}, serde_impls::{SerdeCanonicalType, SerdePhantomConst},
}, },
}; };
@ -327,6 +327,15 @@ impl<T: ?Sized + PhantomConstValue> Type for PhantomConst<T> {
} }
} }
impl<T: ?Sized + PhantomConstValue> SimValueDebug for PhantomConst<T> {
fn sim_value_debug(
value: &<Self as Type>::SimValue,
f: &mut fmt::Formatter<'_>,
) -> fmt::Result {
fmt::Debug::fmt(value, f)
}
}
impl<T: ?Sized + PhantomConstValue> Default for PhantomConst<T> impl<T: ?Sized + PhantomConstValue> Default for PhantomConst<T>
where where
Interned<T>: Default, Interned<T>: Default,

View file

@ -13,7 +13,7 @@ pub use crate::{
enum_::{Enum, HdlNone, HdlOption, HdlSome}, enum_::{Enum, HdlNone, HdlOption, HdlSome},
expr::{ expr::{
CastBitsTo, CastTo, CastToBits, Expr, HdlPartialEq, HdlPartialOrd, MakeUninitExpr, CastBitsTo, CastTo, CastToBits, Expr, HdlPartialEq, HdlPartialOrd, MakeUninitExpr,
ReduceBits, ToExpr, ValueType, repeat, ReduceBits, ToExpr, ToTraceAsString, ValueType, repeat,
}, },
formal::{ formal::{
MakeFormalExpr, all_const, all_seq, any_const, any_seq, formal_global_clock, formal_reset, MakeFormalExpr, all_const, all_seq, any_const, any_seq, formal_global_clock, formal_reset,
@ -38,7 +38,7 @@ pub use crate::{
}, },
source_location::SourceLocation, source_location::SourceLocation,
testing::{FormalMode, assert_formal}, testing::{FormalMode, assert_formal},
ty::{AsMask, CanonicalType, Type}, ty::{AsMask, CanonicalType, TraceAsString, Type},
util::{ConstUsize, GenericConstUsize}, util::{ConstUsize, GenericConstUsize},
wire::Wire, wire::Wire,
}; };

View file

@ -1,5 +1,6 @@
// SPDX-License-Identifier: LGPL-3.0-or-later // SPDX-License-Identifier: LGPL-3.0-or-later
// See Notices.txt for copyright information // See Notices.txt for copyright information
use crate::{ use crate::{
clock::Clock, clock::Clock,
expr::{CastToImpl, Expr, ValueType}, expr::{CastToImpl, Expr, ValueType},
@ -8,11 +9,13 @@ use crate::{
source_location::SourceLocation, source_location::SourceLocation,
ty::{ ty::{
CanonicalType, OpaqueSimValueSize, OpaqueSimValueSlice, OpaqueSimValueWriter, CanonicalType, OpaqueSimValueSize, OpaqueSimValueSlice, OpaqueSimValueWriter,
OpaqueSimValueWritten, StaticType, Type, TypeProperties, impl_match_variant_as_self, OpaqueSimValueWritten, SimValueDebug, StaticType, Type, TypeProperties,
impl_match_variant_as_self,
}, },
util::ConstUsize, util::ConstUsize,
}; };
use bitvec::{bits, order::Lsb0}; use bitvec::{bits, order::Lsb0};
use std::fmt;
mod sealed { mod sealed {
pub trait ResetTypeSealed {} pub trait ResetTypeSealed {}
@ -100,6 +103,15 @@ macro_rules! reset_type {
} }
} }
impl SimValueDebug for $name {
fn sim_value_debug(
value: &<Self as Type>::SimValue,
f: &mut fmt::Formatter<'_>,
) -> fmt::Result {
fmt::Debug::fmt(value, f)
}
}
impl $name { impl $name {
pub fn type_properties(self) -> TypeProperties { pub fn type_properties(self) -> TypeProperties {
Self::TYPE_PROPERTIES Self::TYPE_PROPERTIES

View file

@ -9,6 +9,7 @@ use crate::{
Flow, Flow,
target::{ target::{
GetTarget, Target, TargetPathArrayElement, TargetPathBundleField, TargetPathElement, GetTarget, Target, TargetPathArrayElement, TargetPathBundleField, TargetPathElement,
TargetPathTraceAsStringInner,
}, },
}, },
int::BoolOrIntType, int::BoolOrIntType,
@ -38,7 +39,7 @@ use crate::{
}, },
ty::{ ty::{
OpaqueSimValue, OpaqueSimValueSize, OpaqueSimValueSizeRange, OpaqueSimValueSlice, OpaqueSimValue, OpaqueSimValueSize, OpaqueSimValueSizeRange, OpaqueSimValueSlice,
OpaqueSimValueWriter, OpaqueSimValueWriter, TraceAsString,
}, },
util::{BitSliceWriteWithBase, DebugAsDisplay, HashMap, HashSet, copy_le_bytes_to_bitslice}, util::{BitSliceWriteWithBase, DebugAsDisplay, HashMap, HashSet, copy_le_bytes_to_bitslice},
}; };
@ -432,6 +433,15 @@ impl_trace_decl! {
ty: DynSimOnly, ty: DynSimOnly,
flow: Flow, flow: Flow,
}), }),
TraceAsString(TraceTraceAsString {
fn location(self) -> _ {
self.location
}
location: TraceLocation,
name: Interned<str>,
ty: TraceAsString,
flow: Flow,
}),
}), }),
} }
@ -543,6 +553,7 @@ pub trait TraceWriter: fmt::Debug + 'static {
id: TraceScalarId, id: TraceScalarId,
value: &DynSimOnlyValue, value: &DynSimOnlyValue,
) -> Result<(), Self::Error>; ) -> Result<(), Self::Error>;
fn set_signal_string(&mut self, id: TraceScalarId, value: &str) -> Result<(), Self::Error>;
} }
pub struct DynTraceWriterDecls(Box<dyn TraceWriterDeclsDynTrait>); pub struct DynTraceWriterDecls(Box<dyn TraceWriterDeclsDynTrait>);
@ -607,6 +618,7 @@ trait TraceWriterDynTrait: fmt::Debug + 'static {
id: TraceScalarId, id: TraceScalarId,
value: &DynSimOnlyValue, value: &DynSimOnlyValue,
) -> std::io::Result<()>; ) -> std::io::Result<()>;
fn set_signal_string_dyn(&mut self, id: TraceScalarId, value: &str) -> std::io::Result<()>;
} }
impl<T: TraceWriter> TraceWriterDynTrait for T { impl<T: TraceWriter> TraceWriterDynTrait for T {
@ -680,6 +692,9 @@ impl<T: TraceWriter> TraceWriterDynTrait for T {
) -> std::io::Result<()> { ) -> std::io::Result<()> {
Ok(TraceWriter::set_signal_sim_only_value(self, id, value).map_err(err_into_io)?) Ok(TraceWriter::set_signal_sim_only_value(self, id, value).map_err(err_into_io)?)
} }
fn set_signal_string_dyn(&mut self, id: TraceScalarId, value: &str) -> std::io::Result<()> {
Ok(TraceWriter::set_signal_string(self, id, value).map_err(err_into_io)?)
}
} }
pub struct DynTraceWriter(Box<dyn TraceWriterDynTrait>); pub struct DynTraceWriter(Box<dyn TraceWriterDynTrait>);
@ -758,6 +773,9 @@ impl TraceWriter for DynTraceWriter {
) -> Result<(), Self::Error> { ) -> Result<(), Self::Error> {
self.0.set_signal_sim_only_value_dyn(id, value) self.0.set_signal_sim_only_value_dyn(id, value)
} }
fn set_signal_string(&mut self, id: TraceScalarId, value: &str) -> Result<(), Self::Error> {
self.0.set_signal_string_dyn(id, value)
}
} }
#[derive(Debug)] #[derive(Debug)]
@ -828,6 +846,7 @@ where
#[derive(Clone, PartialEq, Eq, Hash, Debug)] #[derive(Clone, PartialEq, Eq, Hash, Debug)]
pub(crate) struct SimTrace<K, S> { pub(crate) struct SimTrace<K, S> {
kind: K, kind: K,
maybe_changed: bool,
state: S, state: S,
last_state: S, last_state: S,
} }
@ -848,12 +867,14 @@ impl<K: fmt::Debug> SimTraceDebug<TraceScalarId> for SimTrace<K, ()> {
fn fmt(&self, id: TraceScalarId, f: &mut fmt::Formatter<'_>) -> fmt::Result { fn fmt(&self, id: TraceScalarId, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let Self { let Self {
kind, kind,
maybe_changed,
state, state,
last_state, last_state,
} = self; } = self;
f.debug_struct("SimTrace") f.debug_struct("SimTrace")
.field("id", &id) .field("id", &id)
.field("kind", kind) .field("kind", kind)
.field("maybe_changed", maybe_changed)
.field("state", state) .field("state", state)
.field("last_state", last_state) .field("last_state", last_state)
.finish() .finish()
@ -864,12 +885,14 @@ impl<K: fmt::Debug> SimTraceDebug<TraceScalarId> for SimTrace<K, SimTraceState>
fn fmt(&self, id: TraceScalarId, f: &mut fmt::Formatter<'_>) -> fmt::Result { fn fmt(&self, id: TraceScalarId, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let Self { let Self {
kind, kind,
maybe_changed,
state, state,
last_state, last_state,
} = self; } = self;
f.debug_struct("SimTrace") f.debug_struct("SimTrace")
.field("id", &id) .field("id", &id)
.field("kind", kind) .field("kind", kind)
.field("maybe_changed", maybe_changed)
.field("state", state) .field("state", state)
.field("last_state", last_state) .field("last_state", last_state)
.finish() .finish()
@ -929,6 +952,10 @@ pub(crate) enum SimTraceKind {
PhantomConst { PhantomConst {
ty: PhantomConst, ty: PhantomConst,
}, },
TraceAsString {
layout: compiler::CompiledTypeLayout<TraceAsString>,
range: TypeIndexRange,
},
} }
#[derive(PartialEq, Eq)] #[derive(PartialEq, Eq)]
@ -936,6 +963,7 @@ pub(crate) enum SimTraceState {
Bits(BitVec), Bits(BitVec),
SimOnly(DynSimOnlyValue), SimOnly(DynSimOnlyValue),
PhantomConst, PhantomConst,
OpaqueSimValue(OpaqueSimValue),
} }
impl Clone for SimTraceState { impl Clone for SimTraceState {
@ -944,6 +972,7 @@ impl Clone for SimTraceState {
Self::Bits(v) => Self::Bits(v.clone()), Self::Bits(v) => Self::Bits(v.clone()),
Self::SimOnly(v) => Self::SimOnly(v.clone()), Self::SimOnly(v) => Self::SimOnly(v.clone()),
Self::PhantomConst => Self::PhantomConst, Self::PhantomConst => Self::PhantomConst,
Self::OpaqueSimValue(v) => Self::OpaqueSimValue(v.clone()),
} }
} }
fn clone_from(&mut self, source: &Self) { fn clone_from(&mut self, source: &Self) {
@ -951,6 +980,9 @@ impl Clone for SimTraceState {
(SimTraceState::Bits(dest), SimTraceState::Bits(source)) => { (SimTraceState::Bits(dest), SimTraceState::Bits(source)) => {
dest.clone_from_bitslice(source); dest.clone_from_bitslice(source);
} }
(SimTraceState::OpaqueSimValue(dest), SimTraceState::OpaqueSimValue(source)) => {
dest.clone_from(source);
}
_ => *self = source.clone(), _ => *self = source.clone(),
} }
} }
@ -985,6 +1017,20 @@ impl SimTraceState {
unreachable!() unreachable!()
} }
} }
fn unwrap_opaque_sim_value_ref(&self) -> &OpaqueSimValue {
if let SimTraceState::OpaqueSimValue(v) = self {
v
} else {
unreachable!()
}
}
fn unwrap_opaque_sim_value_mut(&mut self) -> &mut OpaqueSimValue {
if let SimTraceState::OpaqueSimValue(v) = self {
v
} else {
unreachable!()
}
}
} }
impl fmt::Debug for SimTraceState { impl fmt::Debug for SimTraceState {
@ -993,6 +1039,7 @@ impl fmt::Debug for SimTraceState {
SimTraceState::Bits(v) => BitSliceWriteWithBase(v).fmt(f), SimTraceState::Bits(v) => BitSliceWriteWithBase(v).fmt(f),
SimTraceState::SimOnly(v) => v.fmt(f), SimTraceState::SimOnly(v) => v.fmt(f),
SimTraceState::PhantomConst => f.debug_tuple("PhantomConst").finish(), SimTraceState::PhantomConst => f.debug_tuple("PhantomConst").finish(),
SimTraceState::OpaqueSimValue(v) => v.fmt(f),
} }
} }
} }
@ -1021,6 +1068,13 @@ impl SimTraceKind {
} }
SimTraceKind::PhantomConst { .. } => SimTraceState::PhantomConst, SimTraceKind::PhantomConst { .. } => SimTraceState::PhantomConst,
SimTraceKind::SimOnly { index: _, ty } => SimTraceState::SimOnly(ty.default_value()), SimTraceKind::SimOnly { index: _, ty } => SimTraceState::SimOnly(ty.default_value()),
SimTraceKind::TraceAsString { layout, range: _ } => {
let type_properties = layout.ty.type_properties();
SimTraceState::OpaqueSimValue(OpaqueSimValue::from_bits_and_sim_only_values(
UIntValue::new_dyn(Arc::new(BitVec::repeat(false, type_properties.bit_width))),
Vec::with_capacity(type_properties.sim_only_values_len),
))
}
} }
} }
} }
@ -1175,6 +1229,31 @@ impl SimulationModuleState {
true true
} }
} }
CompiledTypeLayoutBody::Transparent { .. } => {
let value = value.map_ty(|ty| match ty {
CanonicalType::UInt(_)
| CanonicalType::SInt(_)
| CanonicalType::Bool(_)
| CanonicalType::Array(_)
| CanonicalType::Enum(_)
| CanonicalType::Bundle(_)
| CanonicalType::AsyncReset(_)
| CanonicalType::SyncReset(_)
| CanonicalType::Reset(_)
| CanonicalType::Clock(_)
| CanonicalType::PhantomConst(_)
| CanonicalType::DynSimOnly(_) => unreachable!(),
CanonicalType::TraceAsString(ty) => ty,
});
let sub_target = target
.join(TargetPathElement::from(TargetPathTraceAsStringInner {}).intern_sized());
if self.parse_io(sub_target, value.inner()) {
self.uninitialized_ios.insert(target, vec![sub_target]);
true
} else {
false
}
}
} }
} }
fn mark_target_as_initialized(&mut self, mut target: Target) { fn mark_target_as_initialized(&mut self, mut target: Target) {
@ -1225,7 +1304,10 @@ impl SimulationModuleState {
Target::Base(_) => break, Target::Base(_) => break,
Target::Child(child) => { Target::Child(child) => {
match *child.path_element() { match *child.path_element() {
TargetPathElement::BundleField(_) | TargetPathElement::ArrayElement(_) => {} TargetPathElement::BundleField(_)
| TargetPathElement::ArrayElement(_)
| TargetPathElement::TraceAsStringInner(_)
| TargetPathElement::ToTraceAsString(_) => {}
TargetPathElement::DynArrayElement(_) => panic!( TargetPathElement::DynArrayElement(_) => panic!(
"simulator read/write expression must not have dynamic array indexes" "simulator read/write expression must not have dynamic array indexes"
), ),
@ -1268,7 +1350,8 @@ impl SimulationModuleState {
| CanonicalType::Reset(_) | CanonicalType::Reset(_)
| CanonicalType::Clock(_) | CanonicalType::Clock(_)
| CanonicalType::PhantomConst(_) | CanonicalType::PhantomConst(_)
| CanonicalType::DynSimOnly(_) => unreachable!(), | CanonicalType::DynSimOnly(_)
| CanonicalType::TraceAsString(_) => unreachable!(),
CanonicalType::AsyncReset(_) => true, CanonicalType::AsyncReset(_) => true,
CanonicalType::SyncReset(_) => false, CanonicalType::SyncReset(_) => false,
} }
@ -1433,6 +1516,26 @@ impl SimulationExternModuleClockForPast {
); );
} }
} }
CompiledTypeLayoutBody::Transparent { .. } => {
let map_ty_fn = |ty| match ty {
CanonicalType::UInt(_)
| CanonicalType::SInt(_)
| CanonicalType::Bool(_)
| CanonicalType::Array(_)
| CanonicalType::Enum(_)
| CanonicalType::Bundle(_)
| CanonicalType::AsyncReset(_)
| CanonicalType::SyncReset(_)
| CanonicalType::Reset(_)
| CanonicalType::Clock(_)
| CanonicalType::PhantomConst(_)
| CanonicalType::DynSimOnly(_) => unreachable!(),
CanonicalType::TraceAsString(ty) => ty,
};
let current = current.map_ty(map_ty_fn);
let past = past.map_ty(map_ty_fn);
self.add_current_to_past_mapping(current.inner(), past.inner());
}
} }
} }
} }
@ -1901,6 +2004,7 @@ struct SimulationImpl {
), ),
>, >,
waiting_sensitivity_sets_by_address: HashMap<*const SensitivitySet, Rc<SensitivitySet>>, waiting_sensitivity_sets_by_address: HashMap<*const SensitivitySet, Rc<SensitivitySet>>,
trace_as_string_buf: String,
} }
impl fmt::Debug for SimulationImpl { impl fmt::Debug for SimulationImpl {
@ -1990,6 +2094,7 @@ impl SimulationImpl {
next_sensitivity_set_debug_id: _, next_sensitivity_set_debug_id: _,
waiting_sensitivity_sets_by_compiled_value, waiting_sensitivity_sets_by_compiled_value,
waiting_sensitivity_sets_by_address, waiting_sensitivity_sets_by_address,
trace_as_string_buf: _,
} = self; } = self;
f.debug_struct("Simulation") f.debug_struct("Simulation")
.field("state", state) .field("state", state)
@ -2078,10 +2183,12 @@ impl SimulationImpl {
traces: SimTraces(Box::from_iter(compiled.traces.0.iter().map( traces: SimTraces(Box::from_iter(compiled.traces.0.iter().map(
|&SimTrace { |&SimTrace {
kind, kind,
maybe_changed: _,
state: _, state: _,
last_state: _, last_state: _,
}| SimTrace { }| SimTrace {
kind, kind,
maybe_changed: true,
state: kind.make_state(), state: kind.make_state(),
last_state: kind.make_state(), last_state: kind.make_state(),
}, },
@ -2094,6 +2201,7 @@ impl SimulationImpl {
next_sensitivity_set_debug_id: 0, next_sensitivity_set_debug_id: 0,
waiting_sensitivity_sets_by_compiled_value: HashMap::default(), waiting_sensitivity_sets_by_compiled_value: HashMap::default(),
waiting_sensitivity_sets_by_address: HashMap::default(), waiting_sensitivity_sets_by_address: HashMap::default(),
trace_as_string_buf: String::with_capacity(256),
} }
} }
fn write_traces<const ONLY_IF_CHANGED: bool>( fn write_traces<const ONLY_IF_CHANGED: bool>(
@ -2126,13 +2234,16 @@ impl SimulationImpl {
id, id,
&SimTrace { &SimTrace {
kind, kind,
maybe_changed,
ref state, ref state,
ref last_state, ref last_state,
}, },
) in self.traces.0.iter().enumerate() ) in self.traces.0.iter().enumerate()
{ {
if ONLY_IF_CHANGED && state == last_state { if ONLY_IF_CHANGED {
continue; if !(maybe_changed && state != last_state) {
continue;
}
} }
let id = TraceScalarId(id); let id = TraceScalarId(id);
match kind { match kind {
@ -2171,6 +2282,15 @@ impl SimulationImpl {
SimTraceKind::SimOnly { .. } => { SimTraceKind::SimOnly { .. } => {
trace_writer.set_signal_sim_only_value(id, state.unwrap_sim_only_ref())? trace_writer.set_signal_sim_only_value(id, state.unwrap_sim_only_ref())?
} }
SimTraceKind::TraceAsString { layout, .. } => {
self.trace_as_string_buf.clear();
layout.ty.trace_fmt_append_to_string(
&mut self.trace_as_string_buf,
state.unwrap_opaque_sim_value_ref().as_slice(),
);
trace_writer.set_signal_string(id, &self.trace_as_string_buf)?;
self.trace_as_string_buf.clear();
}
} }
} }
Ok(trace_writer) Ok(trace_writer)
@ -2193,10 +2313,48 @@ impl SimulationImpl {
fn read_traces<const IS_INITIAL_STEP: bool>(&mut self) { fn read_traces<const IS_INITIAL_STEP: bool>(&mut self) {
for &mut SimTrace { for &mut SimTrace {
kind, kind,
ref mut maybe_changed,
ref mut state, ref mut state,
ref mut last_state, ref mut last_state,
} in &mut self.traces.0 } in &mut self.traces.0
{ {
let new_maybe_changed = match kind {
SimTraceKind::BigUInt { index, ty: _ }
| SimTraceKind::BigSInt { index, ty: _ }
| SimTraceKind::BigBool { index }
| SimTraceKind::BigAsyncReset { index }
| SimTraceKind::BigSyncReset { index }
| SimTraceKind::BigClock { index } => self
.state
.big_slots
.state_index_fetch_maybe_modified_flag(index),
SimTraceKind::SmallUInt { index, ty: _ }
| SimTraceKind::SmallSInt { index, ty: _ }
| SimTraceKind::SmallBool { index }
| SimTraceKind::SmallAsyncReset { index }
| SimTraceKind::SmallSyncReset { index }
| SimTraceKind::SmallClock { index }
| SimTraceKind::EnumDiscriminant { index, ty: _ } => self
.state
.small_slots
.state_index_fetch_maybe_modified_flag(index),
SimTraceKind::SimOnly { index, ty: _ } => self
.state
.sim_only_slots
.state_index_fetch_maybe_modified_flag(index),
SimTraceKind::PhantomConst { ty: _ } => IS_INITIAL_STEP,
SimTraceKind::TraceAsString { layout: _, range } => self
.state
.type_index_range_fetch_maybe_modified_flags(range),
};
if !new_maybe_changed && !IS_INITIAL_STEP {
if *maybe_changed {
last_state.clone_from(state);
}
*maybe_changed = false;
continue;
}
*maybe_changed = new_maybe_changed;
if !IS_INITIAL_STEP { if !IS_INITIAL_STEP {
mem::swap(state, last_state); mem::swap(state, last_state);
} }
@ -2241,11 +2399,26 @@ impl SimulationImpl {
.unwrap_sim_only_mut() .unwrap_sim_only_mut()
.clone_from(&self.state.sim_only_slots[index]); .clone_from(&self.state.sim_only_slots[index]);
} }
SimTraceKind::TraceAsString { layout, range } => {
let CompiledTypeLayoutBody::Transparent { inner } = layout.body else {
unreachable!()
};
Self::read_opaque_no_settle(
&mut self.state,
CompiledValue {
layout: *inner,
range,
write: None,
},
state.unwrap_opaque_sim_value_mut(),
);
}
} }
if IS_INITIAL_STEP { if IS_INITIAL_STEP {
last_state.clone_from(state); last_state.clone_from(state);
} }
} }
self.state.clear_all_maybe_modified_flags();
} }
#[track_caller] #[track_caller]
fn advance_time(this_ref: &Rc<RefCell<Self>>, duration: SimDuration) { fn advance_time(this_ref: &Rc<RefCell<Self>>, duration: SimDuration) {
@ -2772,6 +2945,7 @@ impl SimulationImpl {
+ Copy, + Copy,
read_write_sim_only_scalar: impl Fn(usize, &mut Opaque, &mut DynSimOnlyValue) + Copy, read_write_sim_only_scalar: impl Fn(usize, &mut Opaque, &mut DynSimOnlyValue) + Copy,
) { ) {
let compiled_value = compiled_value.unwrap_transparent_types();
match compiled_value.layout.body { match compiled_value.layout.body {
CompiledTypeLayoutBody::Scalar => { CompiledTypeLayoutBody::Scalar => {
let signed = match compiled_value.layout.ty { let signed = match compiled_value.layout.ty {
@ -2787,6 +2961,7 @@ impl SimulationImpl {
CanonicalType::Clock(_) => false, CanonicalType::Clock(_) => false,
CanonicalType::PhantomConst(_) => unreachable!(), CanonicalType::PhantomConst(_) => unreachable!(),
CanonicalType::DynSimOnly(_) => false, CanonicalType::DynSimOnly(_) => false,
CanonicalType::TraceAsString(_) => unreachable!(),
}; };
let indexes = OpaqueSimValueSizeRange::from( let indexes = OpaqueSimValueSizeRange::from(
start_index..start_index + compiled_value.layout.ty.size(), start_index..start_index + compiled_value.layout.ty.size(),
@ -2863,14 +3038,17 @@ impl SimulationImpl {
); );
} }
} }
CompiledTypeLayoutBody::Transparent { .. } => {
unreachable!("handled by unwrap_transparent_types")
}
} }
} }
#[track_caller] #[track_caller]
fn read_no_settle_helper( fn read_opaque_no_settle(
state: &mut interpreter::State, state: &mut interpreter::State,
io: Expr<CanonicalType>,
compiled_value: CompiledValue<CanonicalType>, compiled_value: CompiledValue<CanonicalType>,
) -> SimValue<CanonicalType> { opaque: &mut OpaqueSimValue,
) {
#[track_caller] #[track_caller]
fn read_write_sim_only_scalar( fn read_write_sim_only_scalar(
index: usize, index: usize,
@ -2891,8 +3069,7 @@ impl SimulationImpl {
}, },
); );
} }
let size = io.ty().size(); let size = compiled_value.layout.ty.size();
let mut opaque = OpaqueSimValue::with_capacity(size);
opaque.rewrite_with(size, |mut writer| { opaque.rewrite_with(size, |mut writer| {
SimulationImpl::read_write_sim_value_helper( SimulationImpl::read_write_sim_value_helper(
state, state,
@ -2924,6 +3101,16 @@ impl SimulationImpl {
); );
writer.fill_cloned_from_slice(OpaqueSimValueSlice::empty()) writer.fill_cloned_from_slice(OpaqueSimValueSlice::empty())
}); });
}
#[track_caller]
fn read_no_settle_helper(
state: &mut interpreter::State,
io: Expr<CanonicalType>,
compiled_value: CompiledValue<CanonicalType>,
) -> SimValue<CanonicalType> {
let size = io.ty().size();
let mut opaque = OpaqueSimValue::with_capacity(size);
Self::read_opaque_no_settle(state, compiled_value, &mut opaque);
SimValue::from_opaque(io.ty(), opaque) SimValue::from_opaque(io.ty(), opaque)
} }
/// doesn't modify `opaque` /// doesn't modify `opaque`

View file

@ -10,7 +10,7 @@ use crate::{
ExprEnum, Flow, ValueType, ops, ExprEnum, Flow, ValueType, ops,
target::{ target::{
GetTarget, Target, TargetBase, TargetPathArrayElement, TargetPathBundleField, GetTarget, Target, TargetBase, TargetPathArrayElement, TargetPathBundleField,
TargetPathElement, TargetPathElement, TargetPathToTraceAsString, TargetPathTraceAsStringInner,
}, },
}, },
int::BoolOrIntType, int::BoolOrIntType,
@ -29,7 +29,8 @@ use crate::{
TraceBool, TraceBundle, TraceClock, TraceDecl, TraceEnumDiscriminant, TraceEnumWithFields, TraceBool, TraceBundle, TraceClock, TraceDecl, TraceEnumDiscriminant, TraceEnumWithFields,
TraceFieldlessEnum, TraceInstance, TraceLocation, TraceMem, TraceMemPort, TraceMemoryId, TraceFieldlessEnum, TraceInstance, TraceLocation, TraceMem, TraceMemPort, TraceMemoryId,
TraceMemoryLocation, TraceModule, TraceModuleIO, TracePhantomConst, TraceReg, TraceSInt, TraceMemoryLocation, TraceModule, TraceModuleIO, TracePhantomConst, TraceReg, TraceSInt,
TraceScalarId, TraceScope, TraceSimOnly, TraceSyncReset, TraceUInt, TraceWire, TraceScalarId, TraceScope, TraceSimOnly, TraceSyncReset, TraceTraceAsString, TraceUInt,
TraceWire,
interpreter::{ interpreter::{
self, Insn, InsnField, InsnFieldKind, InsnFieldType, InsnOrLabel, Insns, InsnsBuilding, self, Insn, InsnField, InsnFieldKind, InsnFieldType, InsnOrLabel, Insns, InsnsBuilding,
InsnsBuildingDone, InsnsBuildingKind, Label, PrefixLinesWrapper, SmallUInt, InsnsBuildingDone, InsnsBuildingKind, Label, PrefixLinesWrapper, SmallUInt,
@ -42,7 +43,7 @@ use crate::{
}, },
}, },
}, },
ty::{OpaqueSimValueSize, StaticType}, ty::{OpaqueSimValueSize, StaticType, TraceAsString},
util::{HashMap, chain}, util::{HashMap, chain},
}; };
use bitvec::vec::BitVec; use bitvec::vec::BitVec;
@ -110,6 +111,9 @@ pub(crate) enum CompiledTypeLayoutBody {
Bundle { Bundle {
fields: Interned<[CompiledBundleField]>, fields: Interned<[CompiledBundleField]>,
}, },
Transparent {
inner: Interned<CompiledTypeLayout<CanonicalType>>,
},
} }
impl CompiledTypeLayoutBody { impl CompiledTypeLayoutBody {
@ -128,6 +132,9 @@ impl CompiledTypeLayoutBody {
.map(|field| field.with_prefixed_debug_names(prefix)) .map(|field| field.with_prefixed_debug_names(prefix))
.collect(), .collect(),
}, },
CompiledTypeLayoutBody::Transparent { inner } => CompiledTypeLayoutBody::Transparent {
inner: inner.with_prefixed_debug_names(prefix).intern_sized(),
},
} }
} }
fn with_anonymized_debug_info(self) -> Self { fn with_anonymized_debug_info(self) -> Self {
@ -145,6 +152,9 @@ impl CompiledTypeLayoutBody {
.map(|field| field.with_anonymized_debug_info()) .map(|field| field.with_anonymized_debug_info())
.collect(), .collect(),
}, },
CompiledTypeLayoutBody::Transparent { inner } => CompiledTypeLayoutBody::Transparent {
inner: inner.with_anonymized_debug_info().intern_sized(),
},
} }
} }
} }
@ -179,7 +189,7 @@ impl<T: Type> CompiledTypeLayout<T> {
impl Memoize for MyMemoize { impl Memoize for MyMemoize {
type Input = CanonicalType; type Input = CanonicalType;
type InputOwned = CanonicalType; type InputOwned = CanonicalType;
type Output = CompiledTypeLayout<CanonicalType>; type Output = (TypeLayout<InsnsBuildingDone>, CompiledTypeLayoutBody);
fn inner(self, input: &Self::Input) -> Self::Output { fn inner(self, input: &Self::Input) -> Self::Output {
match input { match input {
@ -197,11 +207,7 @@ impl<T: Type> CompiledTypeLayout<T> {
ty: *input, ty: *input,
}; };
layout.big_slots = StatePartLayout::scalar(debug_data, ()); layout.big_slots = StatePartLayout::scalar(debug_data, ());
CompiledTypeLayout { (layout.into(), CompiledTypeLayoutBody::Scalar)
ty: *input,
layout: layout.into(),
body: CompiledTypeLayoutBody::Scalar,
}
} }
CanonicalType::Array(array) => { CanonicalType::Array(array) => {
let mut layout = TypeLayout::empty(); let mut layout = TypeLayout::empty();
@ -215,19 +221,16 @@ impl<T: Type> CompiledTypeLayout<T> {
if array.is_empty() { if array.is_empty() {
elements_non_empty.push(element.with_prefixed_debug_names("[<none>]")); elements_non_empty.push(element.with_prefixed_debug_names("[<none>]"));
} }
CompiledTypeLayout { (
ty: *input, layout.into(),
layout: layout.into(), CompiledTypeLayoutBody::Array {
body: CompiledTypeLayoutBody::Array {
elements_non_empty: elements_non_empty.intern_deref(), elements_non_empty: elements_non_empty.intern_deref(),
}, },
} )
}
CanonicalType::PhantomConst(_) => {
(TypeLayout::empty(), CompiledTypeLayoutBody::PhantomConst)
} }
CanonicalType::PhantomConst(_) => CompiledTypeLayout {
ty: *input,
layout: TypeLayout::empty(),
body: CompiledTypeLayoutBody::PhantomConst,
},
CanonicalType::Bundle(bundle) => { CanonicalType::Bundle(bundle) => {
let mut layout = TypeLayout::empty(); let mut layout = TypeLayout::empty();
let fields = bundle let fields = bundle
@ -246,11 +249,7 @@ impl<T: Type> CompiledTypeLayout<T> {
}, },
) )
.collect(); .collect();
CompiledTypeLayout { (layout.into(), CompiledTypeLayoutBody::Bundle { fields })
ty: *input,
layout: layout.into(),
body: CompiledTypeLayoutBody::Bundle { fields },
}
} }
CanonicalType::DynSimOnly(ty) => { CanonicalType::DynSimOnly(ty) => {
let mut layout = TypeLayout::empty(); let mut layout = TypeLayout::empty();
@ -259,24 +258,30 @@ impl<T: Type> CompiledTypeLayout<T> {
ty: *input, ty: *input,
}; };
layout.sim_only_slots = StatePartLayout::scalar(debug_data, *ty); layout.sim_only_slots = StatePartLayout::scalar(debug_data, *ty);
CompiledTypeLayout { (layout.into(), CompiledTypeLayoutBody::Scalar)
ty: *input, }
layout: layout.into(), CanonicalType::TraceAsString(ty) => {
body: CompiledTypeLayoutBody::Scalar, let inner = CompiledTypeLayout::get(ty.inner_ty()).intern_sized();
} (inner.layout, CompiledTypeLayoutBody::Transparent { inner })
} }
} }
} }
} }
let CompiledTypeLayout { let (layout, body) = MyMemoize.get_owned(ty.canonical());
ty: _,
layout,
body,
} = MyMemoize.get_owned(ty.canonical());
Self { ty, layout, body } Self { ty, layout, body }
} }
} }
impl CompiledTypeLayout<CanonicalType> {
#[must_use]
fn unwrap_transparent_types(mut self) -> Self {
while let CompiledTypeLayoutBody::Transparent { inner } = self.body {
self = *inner;
}
self
}
}
#[derive(Debug, PartialEq, Eq, Hash, Clone, Copy)] #[derive(Debug, PartialEq, Eq, Hash, Clone, Copy)]
pub(crate) struct CompiledValue<T: Type> { pub(crate) struct CompiledValue<T: Type> {
pub(crate) layout: CompiledTypeLayout<T>, pub(crate) layout: CompiledTypeLayout<T>,
@ -324,6 +329,29 @@ impl<T: Type> CompiledValue<T> {
} }
} }
impl CompiledValue<CanonicalType> {
#[must_use]
pub(crate) fn unwrap_transparent_types(self) -> Self {
let Self {
layout,
range,
write,
} = self;
Self {
layout: layout.unwrap_transparent_types(),
range,
write: write.map(|(layout, range)| (layout.unwrap_transparent_types(), range)),
}
}
#[must_use]
pub(crate) fn wrap_in_trace_as_string(self, ty: TraceAsString) -> CompiledValue<TraceAsString> {
self.map(|layout, range| {
assert_eq!(layout.ty, ty.inner_ty());
(CompiledTypeLayout::get(ty), range)
})
}
}
pub(crate) struct DebugCompiledValueStateAsMap<'a> { pub(crate) struct DebugCompiledValueStateAsMap<'a> {
pub(crate) compiled_value: CompiledValue<CanonicalType>, pub(crate) compiled_value: CompiledValue<CanonicalType>,
pub(crate) state_layout: &'a interpreter::parts::StateLayout<InsnsBuildingDone>, pub(crate) state_layout: &'a interpreter::parts::StateLayout<InsnsBuildingDone>,
@ -402,6 +430,17 @@ impl CompiledValue<Array> {
} }
} }
impl CompiledValue<TraceAsString> {
pub(crate) fn inner(self) -> CompiledValue<CanonicalType> {
self.map(|layout, range| {
let CompiledTypeLayoutBody::Transparent { inner } = layout.body else {
unreachable!();
};
(*inner, range)
})
}
}
macro_rules! make_type_array_indexes { macro_rules! make_type_array_indexes {
( (
type_plural_fields = [$($type_plural_field:ident,)*]; type_plural_fields = [$($type_plural_field:ident,)*];
@ -618,6 +657,16 @@ impl<T: Type> CompiledExpr<T> {
} }
} }
impl CompiledExpr<CanonicalType> {
#[must_use]
pub(crate) fn wrap_in_trace_as_string(self, ty: TraceAsString) -> CompiledExpr<TraceAsString> {
CompiledExpr {
static_part: self.static_part.wrap_in_trace_as_string(ty),
indexes: self.indexes,
}
}
}
impl CompiledExpr<Bundle> { impl CompiledExpr<Bundle> {
fn field_by_index(self, field_index: usize) -> CompiledExpr<CanonicalType> { fn field_by_index(self, field_index: usize) -> CompiledExpr<CanonicalType> {
CompiledExpr { CompiledExpr {
@ -666,6 +715,15 @@ impl CompiledExpr<Array> {
} }
} }
impl CompiledExpr<TraceAsString> {
pub(crate) fn inner(self) -> CompiledExpr<CanonicalType> {
CompiledExpr {
static_part: self.static_part.inner(),
indexes: self.indexes,
}
}
}
macro_rules! make_assignment_graph { macro_rules! make_assignment_graph {
( (
type_plural_fields = [$($type_plural_field:ident,)*]; type_plural_fields = [$($type_plural_field:ident,)*];
@ -1977,6 +2035,39 @@ macro_rules! impl_compiler {
flow, flow,
} }
.into(), .into(),
CanonicalType::TraceAsString(ty) => {
let location = match target {
MakeTraceDeclTarget::Expr(target) => {
let compiled_value = self.compile_expr(instantiated_module, target);
let CompiledValue { layout, range, write: _ } =
self.compiled_expr_to_value(compiled_value, source_location).map_ty(Type::from_canonical);
TraceLocation::Scalar(self.new_sim_trace(SimTraceKind::TraceAsString {
layout,
range,
}))
}
MakeTraceDeclTarget::Memory {
id,
depth,
stride,
start,
ty: _,
} => TraceLocation::Memory(TraceMemoryLocation {
id,
depth,
stride,
start,
len: ty.type_properties().bit_width,
}),
};
TraceTraceAsString {
location,
name,
ty,
flow,
}
.into()
}
} }
} }
fn compiled_expr_to_value( fn compiled_expr_to_value(
@ -2234,6 +2325,7 @@ impl Compiler {
let id = TraceScalarId(self.traces.0.len()); let id = TraceScalarId(self.traces.0.len());
self.traces.0.push(SimTrace { self.traces.0.push(SimTrace {
kind, kind,
maybe_changed: true,
state: (), state: (),
last_state: (), last_state: (),
}); });
@ -2420,7 +2512,8 @@ impl Compiler {
| CanonicalType::Reset(_) | CanonicalType::Reset(_)
| CanonicalType::Clock(_) | CanonicalType::Clock(_)
| CanonicalType::DynSimOnly(_) | CanonicalType::DynSimOnly(_)
| CanonicalType::PhantomConst(_) => { | CanonicalType::PhantomConst(_)
| CanonicalType::TraceAsString(_) => {
self.make_trace_scalar(instantiated_module, target, name, source_location) self.make_trace_scalar(instantiated_module, target, name, source_location)
} }
} }
@ -2590,6 +2683,12 @@ impl Compiler {
parent.map_ty(Array::from_canonical).element(index) parent.map_ty(Array::from_canonical).element(index)
} }
TargetPathElement::DynArrayElement(_) => unreachable!(), TargetPathElement::DynArrayElement(_) => unreachable!(),
TargetPathElement::TraceAsStringInner(TargetPathTraceAsStringInner {}) => {
parent.map_ty(TraceAsString::from_canonical).inner()
}
TargetPathElement::ToTraceAsString(TargetPathToTraceAsString { ty }) => parent
.wrap_in_trace_as_string(ty)
.map_ty(|ty| ty.canonical()),
} }
} }
}; };
@ -2822,6 +2921,12 @@ impl Compiler {
CanonicalType::PhantomConst(_) | CanonicalType::DynSimOnly(_) => { CanonicalType::PhantomConst(_) | CanonicalType::DynSimOnly(_) => {
self.compile_cast_aggregate_to_bits(instantiated_module, []) self.compile_cast_aggregate_to_bits(instantiated_module, [])
} }
CanonicalType::TraceAsString(_) => self.compile_cast_to_bits(
instantiated_module,
ops::CastToBits::new(
ops::TraceAsStringAsInner::new(Expr::from_canonical(expr.arg())).to_expr(),
),
),
} }
} }
fn compile_cast_bits_to_or_uninit( fn compile_cast_bits_to_or_uninit(
@ -2911,6 +3016,16 @@ impl Compiler {
vec![] vec![]
}); });
} }
CanonicalType::TraceAsString(ty) => Expr::canonical(
ops::ToTraceAsString::new(
match arg {
Some(arg) => arg.cast_bits_to(ty.inner_ty()),
None => ty.inner_ty().uninit(),
},
ty,
)
.to_expr(),
),
}; };
let retval = self.compile_expr(instantiated_module, Expr::canonical(retval)); let retval = self.compile_expr(instantiated_module, Expr::canonical(retval));
self.compiled_expr_to_value(retval, instantiated_module.leaf_module().source_location()) self.compiled_expr_to_value(retval, instantiated_module.leaf_module().source_location())
@ -2962,6 +3077,7 @@ impl Compiler {
CanonicalType::Clock(_) => false, CanonicalType::Clock(_) => false,
CanonicalType::PhantomConst(_) => unreachable!(), CanonicalType::PhantomConst(_) => unreachable!(),
CanonicalType::DynSimOnly(_) => unreachable!(), CanonicalType::DynSimOnly(_) => unreachable!(),
CanonicalType::TraceAsString(_) => unreachable!(),
}; };
let dest_signed = match expr.ty() { let dest_signed = match expr.ty() {
CanonicalType::UInt(_) => false, CanonicalType::UInt(_) => false,
@ -2976,6 +3092,7 @@ impl Compiler {
CanonicalType::Clock(_) => false, CanonicalType::Clock(_) => false,
CanonicalType::PhantomConst(_) => unreachable!(), CanonicalType::PhantomConst(_) => unreachable!(),
CanonicalType::DynSimOnly(_) => unreachable!(), CanonicalType::DynSimOnly(_) => unreachable!(),
CanonicalType::TraceAsString(_) => unreachable!(),
}; };
self.simple_nary_big_expr(instantiated_module, expr.ty(), [arg], |dest, [src]| match ( self.simple_nary_big_expr(instantiated_module, expr.ty(), [arg], |dest, [src]| match (
src_signed, src_signed,
@ -3721,6 +3838,14 @@ impl Compiler {
ExprEnum::CastBitsTo(expr) => self ExprEnum::CastBitsTo(expr) => self
.compile_cast_bits_to_or_uninit(instantiated_module, Some(expr.arg()), expr.ty()) .compile_cast_bits_to_or_uninit(instantiated_module, Some(expr.arg()), expr.ty())
.into(), .into(),
ExprEnum::ToTraceAsString(expr) => self
.compile_expr(instantiated_module, expr.inner())
.wrap_in_trace_as_string(expr.ty())
.map_ty(|ty| ty.canonical()),
ExprEnum::TraceAsStringAsInner(expr) => self
.compile_expr(instantiated_module, Expr::canonical(expr.arg()))
.map_ty(TraceAsString::from_canonical)
.inner(),
ExprEnum::ModuleIO(expr) => self ExprEnum::ModuleIO(expr) => self
.compile_value(TargetInInstantiatedModule { .compile_value(TargetInInstantiatedModule {
instantiated_module, instantiated_module,
@ -3868,6 +3993,21 @@ impl Compiler {
CanonicalType::DynSimOnly(_) => { CanonicalType::DynSimOnly(_) => {
unreachable!("DynSimOnly mismatch"); unreachable!("DynSimOnly mismatch");
} }
CanonicalType::TraceAsString(_) => {
let lhs = Expr::<TraceAsString>::from_canonical(lhs);
let rhs = Expr::<TraceAsString>::from_canonical(rhs);
let lhs_expr = ops::TraceAsStringAsInner::new(lhs).to_expr();
let rhs_expr = ops::TraceAsStringAsInner::new(rhs).to_expr();
return self.compile_connect(
lhs_instantiated_module,
lhs_conditions,
lhs_expr,
rhs_instantiated_module,
rhs_conditions,
rhs_expr,
source_location,
);
}
} }
} }
let Some(target) = lhs.target() else { let Some(target) = lhs.target() else {
@ -4243,6 +4383,8 @@ impl Compiler {
mut read: Option<MemoryPortReadInsns<'_>>, mut read: Option<MemoryPortReadInsns<'_>>,
mut write: Option<MemoryPortWriteInsns<'_>>, mut write: Option<MemoryPortWriteInsns<'_>>,
) { ) {
let data_layout = data_layout.unwrap_transparent_types();
let mask_layout = mask_layout.unwrap_transparent_types();
match data_layout.body { match data_layout.body {
CompiledTypeLayoutBody::Scalar => { CompiledTypeLayoutBody::Scalar => {
let CompiledTypeLayoutBody::Scalar = mask_layout.body else { let CompiledTypeLayoutBody::Scalar = mask_layout.body else {
@ -4261,6 +4403,7 @@ impl Compiler {
CanonicalType::Clock(_) => false, CanonicalType::Clock(_) => false,
CanonicalType::PhantomConst(_) => unreachable!(), CanonicalType::PhantomConst(_) => unreachable!(),
CanonicalType::DynSimOnly(_) => false, CanonicalType::DynSimOnly(_) => false,
CanonicalType::TraceAsString(_) => unreachable!(),
}; };
let width = data_layout.ty.bit_width(); let width = data_layout.ty.bit_width();
if let Some(MemoryPortReadInsns { if let Some(MemoryPortReadInsns {
@ -4483,6 +4626,9 @@ impl Compiler {
start = start + field.ty.ty.bit_width(); start = start + field.ty.ty.bit_width();
} }
} }
CompiledTypeLayoutBody::Transparent { .. } => {
unreachable!("handled by unwrap_transparent_types")
}
} }
} }
fn compile_memory_port_rw( fn compile_memory_port_rw(

View file

@ -6,9 +6,9 @@ use crate::{
int::{BoolOrIntType, SInt, UInt}, int::{BoolOrIntType, SInt, UInt},
intern::{Intern, Interned, Memoize}, intern::{Intern, Interned, Memoize},
sim::interpreter::parts::{ sim::interpreter::parts::{
StateLayout, StatePartIndex, StatePartKind, StatePartKindBigSlots, StatePartKindMemories, StateLayout, StatePartIndex, StatePartIndexRange, StatePartKind, StatePartKindBigSlots,
StatePartKindSimOnlySlots, StatePartKindSmallSlots, StatePartLen, TypeIndexRange, StatePartKindMemories, StatePartKindSimOnlySlots, StatePartKindSmallSlots, StatePartLen,
TypeLayout, get_state_part_kinds, TypeIndexRange, TypeLayout, get_state_part_kinds,
}, },
source_location::SourceLocation, source_location::SourceLocation,
util::{HashMap, HashSet}, util::{HashMap, HashSet},
@ -17,12 +17,11 @@ use bitvec::slice::BitSlice;
use num_bigint::BigInt; use num_bigint::BigInt;
use num_traits::{One, Signed, ToPrimitive, Zero}; use num_traits::{One, Signed, ToPrimitive, Zero};
use std::{ use std::{
borrow::BorrowMut,
convert::Infallible, convert::Infallible,
fmt::{self, Write}, fmt::{self, Write},
hash::Hash, hash::Hash,
marker::PhantomData, marker::PhantomData,
ops::{ControlFlow, Deref, DerefMut, Index, IndexMut}, ops::{ControlFlow, Deref, Index, IndexMut},
}; };
use vec_map::VecMap; use vec_map::VecMap;
@ -915,6 +914,21 @@ impl<K: StatePartKind> StatePart<K> {
value: K::borrow_state(&mut self.value), value: K::borrow_state(&mut self.value),
} }
} }
pub(crate) fn state_index_fetch_maybe_modified_flag(
&self,
part_index: StatePartIndex<K>,
) -> bool {
K::state_index_fetch_maybe_modified_flag(&self.value, part_index)
}
pub(crate) fn state_index_range_fetch_maybe_modified_flags(
&self,
part_index_range: StatePartIndexRange<K>,
) -> bool {
K::state_index_range_fetch_maybe_modified_flags(&self.value, part_index_range)
}
pub(crate) fn clear_all_maybe_modified_flags(&mut self) {
K::clear_all_maybe_modified_flags(&mut self.value)
}
} }
#[derive(Clone, PartialEq, Eq, Hash, Debug)] #[derive(Clone, PartialEq, Eq, Hash, Debug)]
@ -922,56 +936,38 @@ pub(crate) struct BorrowedStatePart<'a, K: StatePartKind> {
pub(crate) value: K::BorrowedState<'a>, pub(crate) value: K::BorrowedState<'a>,
} }
impl< impl<K: StatePartKind> BorrowedStatePart<'_, K> {
'a,
K: StatePartKind<
BorrowedState<'a>: DerefMut<Target: IndexMut<usize, Output = T> + BorrowMut<[T]>>,
>,
T,
> BorrowedStatePart<'a, K>
{
pub(crate) fn get_disjoint_mut<const N: usize>( pub(crate) fn get_disjoint_mut<const N: usize>(
&mut self, &mut self,
indexes: [StatePartIndex<K>; N], indexes: [StatePartIndex<K>; N],
) -> [&mut T; N] { ) -> [&mut K::StateElement; N] {
(*self.value) K::borrowed_state_get_disjoint_mut(&mut self.value, indexes)
.borrow_mut()
.get_disjoint_mut(indexes.map(|v| v.value as usize))
.expect("indexes are disjoint")
} }
} }
impl<K: StatePartKind<State: Deref<Target: Index<usize, Output = T>>>, T> Index<StatePartIndex<K>> impl<K: StatePartKind> Index<StatePartIndex<K>> for StatePart<K> {
for StatePart<K> type Output = K::StateElement;
{
type Output = T;
fn index(&self, index: StatePartIndex<K>) -> &Self::Output { fn index(&self, index: StatePartIndex<K>) -> &Self::Output {
&self.value[index.value as usize] K::state_index(&self.value, index)
} }
} }
impl<K: StatePartKind<State: DerefMut<Target: IndexMut<usize, Output = T>>>, T> impl<K: StatePartKind> IndexMut<StatePartIndex<K>> for StatePart<K> {
IndexMut<StatePartIndex<K>> for StatePart<K>
{
fn index_mut(&mut self, index: StatePartIndex<K>) -> &mut Self::Output { fn index_mut(&mut self, index: StatePartIndex<K>) -> &mut Self::Output {
&mut self.value[index.value as usize] K::state_index_mut(&mut self.value, index)
} }
} }
impl<'a, K: StatePartKind<BorrowedState<'a>: Deref<Target: Index<usize, Output = T>>>, T> impl<K: StatePartKind> Index<StatePartIndex<K>> for BorrowedStatePart<'_, K> {
Index<StatePartIndex<K>> for BorrowedStatePart<'a, K> type Output = K::StateElement;
{
type Output = T;
fn index(&self, index: StatePartIndex<K>) -> &Self::Output { fn index(&self, index: StatePartIndex<K>) -> &Self::Output {
&self.value[index.value as usize] K::borrowed_state_index(&self.value, index)
} }
} }
impl<'a, K: StatePartKind<BorrowedState<'a>: DerefMut<Target: IndexMut<usize, Output = T>>>, T> impl<K: StatePartKind> IndexMut<StatePartIndex<K>> for BorrowedStatePart<'_, K> {
IndexMut<StatePartIndex<K>> for BorrowedStatePart<'a, K>
{
fn index_mut(&mut self, index: StatePartIndex<K>) -> &mut Self::Output { fn index_mut(&mut self, index: StatePartIndex<K>) -> &mut Self::Output {
&mut self.value[index.value as usize] K::borrowed_state_index_mut(&mut self.value, index)
} }
} }
@ -1028,6 +1024,15 @@ macro_rules! make_state {
$($type_plural_field: self.$type_plural_field.borrow(),)* $($type_plural_field: self.$type_plural_field.borrow(),)*
} }
} }
pub(crate) fn type_index_range_fetch_maybe_modified_flags(&self, range: TypeIndexRange) -> bool {
$(self.$type_plural_field.state_index_range_fetch_maybe_modified_flags(
range.$type_plural_field,
))||*
}
pub(crate) fn clear_all_maybe_modified_flags(&mut self) {
$(self.$state_plural_field.clear_all_maybe_modified_flags();)*
$(self.$type_plural_field.clear_all_maybe_modified_flags();)*
}
} }
#[derive(Debug)] #[derive(Debug)]

View file

@ -236,6 +236,7 @@ pub(crate) trait StatePartKind:
type LayoutData: Send + Sync + Eq + Hash + fmt::Debug + 'static + Copy; type LayoutData: Send + Sync + Eq + Hash + fmt::Debug + 'static + Copy;
type State: fmt::Debug + 'static + Clone; type State: fmt::Debug + 'static + Clone;
type BorrowedState<'a>: 'a; type BorrowedState<'a>: 'a;
type StateElement;
fn new_state(layout_data: &[Self::LayoutData]) -> Self::State; fn new_state(layout_data: &[Self::LayoutData]) -> Self::State;
fn borrow_state<'a>(state: &'a mut Self::State) -> Self::BorrowedState<'a>; fn borrow_state<'a>(state: &'a mut Self::State) -> Self::BorrowedState<'a>;
fn part_debug_data<BK: InsnsBuildingKind>( fn part_debug_data<BK: InsnsBuildingKind>(
@ -247,6 +248,35 @@ pub(crate) trait StatePartKind:
index: StatePartIndex<Self>, index: StatePartIndex<Self>,
f: &mut impl fmt::Write, f: &mut impl fmt::Write,
) -> fmt::Result; ) -> fmt::Result;
fn state_index<'a>(
state: &'a Self::State,
part_index: StatePartIndex<Self>,
) -> &'a Self::StateElement;
fn state_index_mut<'a>(
state: &'a mut Self::State,
part_index: StatePartIndex<Self>,
) -> &'a mut Self::StateElement;
fn state_index_fetch_maybe_modified_flag(
state: &Self::State,
part_index: StatePartIndex<Self>,
) -> bool;
fn state_index_range_fetch_maybe_modified_flags(
state: &Self::State,
part_index_range: StatePartIndexRange<Self>,
) -> bool;
fn clear_all_maybe_modified_flags(state: &mut Self::State);
fn borrowed_state_index<'a, 'b>(
state: &'a Self::BorrowedState<'b>,
part_index: StatePartIndex<Self>,
) -> &'a Self::StateElement;
fn borrowed_state_index_mut<'a, 'b>(
state: &'a mut Self::BorrowedState<'b>,
part_index: StatePartIndex<Self>,
) -> &'a mut Self::StateElement;
fn borrowed_state_get_disjoint_mut<'a, 'b, const N: usize>(
state: &'a mut Self::BorrowedState<'b>,
part_indexes: [StatePartIndex<Self>; N],
) -> [&'a mut Self::StateElement; N];
} }
macro_rules! make_state_part_kinds { macro_rules! make_state_part_kinds {
@ -272,6 +302,7 @@ impl StatePartKind for StatePartKindMemories {
type LayoutData = MemoryData<Interned<BitSlice>>; type LayoutData = MemoryData<Interned<BitSlice>>;
type State = Box<[MemoryData<BitBox>]>; type State = Box<[MemoryData<BitBox>]>;
type BorrowedState<'a> = &'a mut [MemoryData<BitBox>]; type BorrowedState<'a> = &'a mut [MemoryData<BitBox>];
type StateElement = MemoryData<BitBox>;
fn new_state(layout_data: &[Self::LayoutData]) -> Self::State { fn new_state(layout_data: &[Self::LayoutData]) -> Self::State {
layout_data layout_data
.iter() .iter()
@ -297,19 +328,95 @@ impl StatePartKind for StatePartKindMemories {
) -> fmt::Result { ) -> fmt::Result {
write!(f, "{:#?}", &state.memories[index]) write!(f, "{:#?}", &state.memories[index])
} }
fn state_index<'a>(
state: &'a Self::State,
part_index: StatePartIndex<Self>,
) -> &'a Self::StateElement {
&state[part_index.as_usize()]
}
fn state_index_mut<'a>(
state: &'a mut Self::State,
part_index: StatePartIndex<Self>,
) -> &'a mut Self::StateElement {
&mut state[part_index.as_usize()]
}
fn state_index_fetch_maybe_modified_flag(
_state: &Self::State,
_part_index: StatePartIndex<Self>,
) -> bool {
true
}
fn state_index_range_fetch_maybe_modified_flags(
_state: &Self::State,
part_index_range: StatePartIndexRange<Self>,
) -> bool {
part_index_range.len.value > 0
}
fn clear_all_maybe_modified_flags(_state: &mut Self::State) {}
fn borrowed_state_index<'a, 'b>(
state: &'a Self::BorrowedState<'b>,
part_index: StatePartIndex<Self>,
) -> &'a Self::StateElement {
&state[part_index.as_usize()]
}
fn borrowed_state_index_mut<'a, 'b>(
state: &'a mut Self::BorrowedState<'b>,
part_index: StatePartIndex<Self>,
) -> &'a mut Self::StateElement {
&mut state[part_index.as_usize()]
}
fn borrowed_state_get_disjoint_mut<'a, 'b, const N: usize>(
state: &'a mut Self::BorrowedState<'b>,
part_indexes: [StatePartIndex<Self>; N],
) -> [&'a mut Self::StateElement; N] {
state
.get_disjoint_mut(part_indexes.map(StatePartIndex::as_usize))
.expect("indexes are disjoint")
}
}
#[derive(Copy, Clone, PartialEq, Eq, Hash, Default)]
pub(crate) struct StateAndModified<T, M> {
pub(crate) state: T,
pub(crate) modified: M,
}
impl<T: Deref<Target = [E]>, M: Deref<Target = [bool]>, E: fmt::Debug> fmt::Debug
for StateAndModified<T, M>
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_list()
.entries(self.state.iter().zip(self.modified.iter().copied()).map(
|(state, modified)| {
fmt::from_fn(move |f| {
state.fmt(f)?;
if modified {
f.write_str(" (modified)")?;
}
Ok(())
})
},
))
.finish()
}
} }
impl StatePartKind for StatePartKindSmallSlots { impl StatePartKind for StatePartKindSmallSlots {
const NAME: &'static str = "SmallSlots"; const NAME: &'static str = "SmallSlots";
type DebugData = SlotDebugData; type DebugData = SlotDebugData;
type LayoutData = (); type LayoutData = ();
type State = Box<[SmallUInt]>; type State = StateAndModified<Box<[Self::StateElement]>, Box<[bool]>>;
type BorrowedState<'a> = &'a mut [SmallUInt]; type BorrowedState<'a> = StateAndModified<&'a mut [Self::StateElement], &'a mut [bool]>;
type StateElement = SmallUInt;
fn new_state(layout_data: &[Self::LayoutData]) -> Self::State { fn new_state(layout_data: &[Self::LayoutData]) -> Self::State {
vec![0; layout_data.len()].into_boxed_slice() StateAndModified {
state: vec![0; layout_data.len()].into_boxed_slice(),
modified: vec![false; layout_data.len()].into_boxed_slice(),
}
} }
fn borrow_state<'a>(state: &'a mut Self::State) -> Self::BorrowedState<'a> { fn borrow_state<'a>(state: &'a mut Self::State) -> Self::BorrowedState<'a> {
state let StateAndModified { state, modified } = state;
StateAndModified { state, modified }
} }
fn part_debug_data<BK: InsnsBuildingKind>( fn part_debug_data<BK: InsnsBuildingKind>(
state_layout: &StateLayout<BK>, state_layout: &StateLayout<BK>,
@ -330,19 +437,80 @@ impl StatePartKind for StatePartKindSmallSlots {
write!(f, "{value:#x} {}", value as SmallSInt)?; write!(f, "{value:#x} {}", value as SmallSInt)?;
Ok(()) Ok(())
} }
fn state_index<'a>(
state: &'a Self::State,
part_index: StatePartIndex<Self>,
) -> &'a Self::StateElement {
&state.state[part_index.as_usize()]
}
fn state_index_mut<'a>(
state: &'a mut Self::State,
part_index: StatePartIndex<Self>,
) -> &'a mut Self::StateElement {
state.modified[part_index.as_usize()] = true;
&mut state.state[part_index.as_usize()]
}
fn state_index_fetch_maybe_modified_flag(
state: &Self::State,
part_index: StatePartIndex<Self>,
) -> bool {
state.modified[part_index.as_usize()]
}
fn state_index_range_fetch_maybe_modified_flags(
state: &Self::State,
part_index_range: StatePartIndexRange<Self>,
) -> bool {
state.modified[part_index_range.start.as_usize()..]
[..part_index_range.len.as_index().as_usize()]
.contains(&true)
}
fn clear_all_maybe_modified_flags(state: &mut Self::State) {
state.modified.fill(false);
}
fn borrowed_state_index<'a, 'b>(
state: &'a Self::BorrowedState<'b>,
part_index: StatePartIndex<Self>,
) -> &'a Self::StateElement {
&state.state[part_index.as_usize()]
}
fn borrowed_state_index_mut<'a, 'b>(
state: &'a mut Self::BorrowedState<'b>,
part_index: StatePartIndex<Self>,
) -> &'a mut Self::StateElement {
state.modified[part_index.as_usize()] = true;
&mut state.state[part_index.as_usize()]
}
fn borrowed_state_get_disjoint_mut<'a, 'b, const N: usize>(
state: &'a mut Self::BorrowedState<'b>,
part_indexes: [StatePartIndex<Self>; N],
) -> [&'a mut Self::StateElement; N] {
for part_index in part_indexes {
state.modified[part_index.as_usize()] = true;
}
state
.state
.get_disjoint_mut(part_indexes.map(StatePartIndex::as_usize))
.expect("indexes are disjoint")
}
} }
impl StatePartKind for StatePartKindBigSlots { impl StatePartKind for StatePartKindBigSlots {
const NAME: &'static str = "BigSlots"; const NAME: &'static str = "BigSlots";
type DebugData = SlotDebugData; type DebugData = SlotDebugData;
type LayoutData = (); type LayoutData = ();
type State = Box<[BigInt]>; type State = StateAndModified<Box<[Self::StateElement]>, Box<[bool]>>;
type BorrowedState<'a> = &'a mut [BigInt]; type BorrowedState<'a> = StateAndModified<&'a mut [Self::StateElement], &'a mut [bool]>;
type StateElement = BigInt;
fn new_state(layout_data: &[Self::LayoutData]) -> Self::State { fn new_state(layout_data: &[Self::LayoutData]) -> Self::State {
layout_data.iter().map(|_| BigInt::default()).collect() let state: Box<[_]> = layout_data.iter().map(|_| BigInt::default()).collect();
StateAndModified {
modified: vec![false; state.len()].into_boxed_slice(),
state,
}
} }
fn borrow_state<'a>(state: &'a mut Self::State) -> Self::BorrowedState<'a> { fn borrow_state<'a>(state: &'a mut Self::State) -> Self::BorrowedState<'a> {
state let StateAndModified { state, modified } = state;
StateAndModified { state, modified }
} }
fn part_debug_data<BK: InsnsBuildingKind>( fn part_debug_data<BK: InsnsBuildingKind>(
state_layout: &StateLayout<BK>, state_layout: &StateLayout<BK>,
@ -361,19 +529,80 @@ impl StatePartKind for StatePartKindBigSlots {
) -> fmt::Result { ) -> fmt::Result {
write!(f, "{:#x}", state.big_slots[index]) write!(f, "{:#x}", state.big_slots[index])
} }
fn state_index<'a>(
state: &'a Self::State,
part_index: StatePartIndex<Self>,
) -> &'a Self::StateElement {
&state.state[part_index.as_usize()]
}
fn state_index_mut<'a>(
state: &'a mut Self::State,
part_index: StatePartIndex<Self>,
) -> &'a mut Self::StateElement {
state.modified[part_index.as_usize()] = true;
&mut state.state[part_index.as_usize()]
}
fn state_index_fetch_maybe_modified_flag(
state: &Self::State,
part_index: StatePartIndex<Self>,
) -> bool {
state.modified[part_index.as_usize()]
}
fn state_index_range_fetch_maybe_modified_flags(
state: &Self::State,
part_index_range: StatePartIndexRange<Self>,
) -> bool {
state.modified[part_index_range.start.as_usize()..]
[..part_index_range.len.as_index().as_usize()]
.contains(&true)
}
fn clear_all_maybe_modified_flags(state: &mut Self::State) {
state.modified.fill(false);
}
fn borrowed_state_index<'a, 'b>(
state: &'a Self::BorrowedState<'b>,
part_index: StatePartIndex<Self>,
) -> &'a Self::StateElement {
&state.state[part_index.as_usize()]
}
fn borrowed_state_index_mut<'a, 'b>(
state: &'a mut Self::BorrowedState<'b>,
part_index: StatePartIndex<Self>,
) -> &'a mut Self::StateElement {
state.modified[part_index.as_usize()] = true;
&mut state.state[part_index.as_usize()]
}
fn borrowed_state_get_disjoint_mut<'a, 'b, const N: usize>(
state: &'a mut Self::BorrowedState<'b>,
part_indexes: [StatePartIndex<Self>; N],
) -> [&'a mut Self::StateElement; N] {
for part_index in part_indexes {
state.modified[part_index.as_usize()] = true;
}
state
.state
.get_disjoint_mut(part_indexes.map(StatePartIndex::as_usize))
.expect("indexes are disjoint")
}
} }
impl StatePartKind for StatePartKindSimOnlySlots { impl StatePartKind for StatePartKindSimOnlySlots {
const NAME: &'static str = "SimOnlySlots"; const NAME: &'static str = "SimOnlySlots";
type DebugData = SlotDebugData; type DebugData = SlotDebugData;
type LayoutData = DynSimOnly; type LayoutData = DynSimOnly;
type State = Box<[DynSimOnlyValue]>; type State = StateAndModified<Box<[Self::StateElement]>, Box<[bool]>>;
type BorrowedState<'a> = &'a mut [DynSimOnlyValue]; type BorrowedState<'a> = StateAndModified<&'a mut [Self::StateElement], &'a mut [bool]>;
type StateElement = DynSimOnlyValue;
fn new_state(layout_data: &[Self::LayoutData]) -> Self::State { fn new_state(layout_data: &[Self::LayoutData]) -> Self::State {
layout_data.iter().map(|ty| ty.default_value()).collect() let state: Box<[_]> = layout_data.iter().map(|ty| ty.default_value()).collect();
StateAndModified {
modified: vec![false; state.len()].into_boxed_slice(),
state,
}
} }
fn borrow_state<'a>(state: &'a mut Self::State) -> Self::BorrowedState<'a> { fn borrow_state<'a>(state: &'a mut Self::State) -> Self::BorrowedState<'a> {
state let StateAndModified { state, modified } = state;
StateAndModified { state, modified }
} }
fn part_debug_data<BK: InsnsBuildingKind>( fn part_debug_data<BK: InsnsBuildingKind>(
state_layout: &StateLayout<BK>, state_layout: &StateLayout<BK>,
@ -392,6 +621,61 @@ impl StatePartKind for StatePartKindSimOnlySlots {
) -> fmt::Result { ) -> fmt::Result {
write!(f, "{:?}", state.sim_only_slots[index]) write!(f, "{:?}", state.sim_only_slots[index])
} }
fn state_index<'a>(
state: &'a Self::State,
part_index: StatePartIndex<Self>,
) -> &'a Self::StateElement {
&state.state[part_index.as_usize()]
}
fn state_index_mut<'a>(
state: &'a mut Self::State,
part_index: StatePartIndex<Self>,
) -> &'a mut Self::StateElement {
state.modified[part_index.as_usize()] = true;
&mut state.state[part_index.as_usize()]
}
fn state_index_fetch_maybe_modified_flag(
state: &Self::State,
part_index: StatePartIndex<Self>,
) -> bool {
state.modified[part_index.as_usize()]
}
fn state_index_range_fetch_maybe_modified_flags(
state: &Self::State,
part_index_range: StatePartIndexRange<Self>,
) -> bool {
state.modified[part_index_range.start.as_usize()..]
[..part_index_range.len.as_index().as_usize()]
.contains(&true)
}
fn clear_all_maybe_modified_flags(state: &mut Self::State) {
state.modified.fill(false);
}
fn borrowed_state_index<'a, 'b>(
state: &'a Self::BorrowedState<'b>,
part_index: StatePartIndex<Self>,
) -> &'a Self::StateElement {
&state.state[part_index.as_usize()]
}
fn borrowed_state_index_mut<'a, 'b>(
state: &'a mut Self::BorrowedState<'b>,
part_index: StatePartIndex<Self>,
) -> &'a mut Self::StateElement {
state.modified[part_index.as_usize()] = true;
&mut state.state[part_index.as_usize()]
}
fn borrowed_state_get_disjoint_mut<'a, 'b, const N: usize>(
state: &'a mut Self::BorrowedState<'b>,
part_indexes: [StatePartIndex<Self>; N],
) -> [&'a mut Self::StateElement; N] {
for part_index in part_indexes {
state.modified[part_index.as_usize()] = true;
}
state
.state
.get_disjoint_mut(part_indexes.map(StatePartIndex::as_usize))
.expect("indexes are disjoint")
}
} }
#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)] #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]

View file

@ -15,23 +15,23 @@ use crate::{
source_location::SourceLocation, source_location::SourceLocation,
ty::{ ty::{
CanonicalType, OpaqueSimValue, OpaqueSimValueSize, OpaqueSimValueSlice, CanonicalType, OpaqueSimValue, OpaqueSimValueSize, OpaqueSimValueSlice,
OpaqueSimValueWriter, StaticType, Type, TypeProperties, impl_match_variant_as_self, OpaqueSimValueWriter, SimValueDebug, StaticType, Type, TypeProperties,
impl_match_variant_as_self,
}, },
util::{ util::{
ConstUsize, HashMap, ConstUsize,
alternating_cell::{AlternatingCell, AlternatingCellMethods}, alternating_cell::{AlternatingCell, AlternatingCellMethods},
serde_by_id::{SerdeById, SerdeByIdProperties, SerdeByIdTable, SerdeByIdTrait},
}, },
}; };
use bitvec::{slice::BitSlice, vec::BitVec}; use bitvec::{slice::BitSlice, vec::BitVec};
use hashbrown::hash_map::Entry;
use serde::{Deserialize, Deserializer, Serialize, Serializer, de::Error as _, ser::Error as _}; use serde::{Deserialize, Deserializer, Serialize, Serializer, de::Error as _, ser::Error as _};
use std::{ use std::{
borrow::{Borrow, BorrowMut, Cow}, borrow::{Borrow, BorrowMut, Cow},
fmt::{self, Write}, fmt,
hash::{BuildHasher, Hash, Hasher, RandomState},
num::NonZero, num::NonZero,
ops::{Deref, DerefMut, Index, IndexMut}, ops::{Deref, DerefMut, Index, IndexMut},
sync::{Arc, Mutex}, sync::Arc,
}; };
pub(crate) mod sim_only_value_unsafe; pub(crate) mod sim_only_value_unsafe;
@ -551,113 +551,119 @@ impl_sim_value_cmp_as_bool!(AsyncReset);
#[doc(hidden)] #[doc(hidden)]
pub mod match_sim_value { pub mod match_sim_value {
use crate::{ use crate::{sim::value::SimValue, ty::Type};
sim::value::{SimValue, ToSimValue}, use std::ops::{Deref, DerefMut};
ty::Type,
}; macro_rules! wrapper {
(
$(pub struct $wrapper:ident<$T:ident>($inner:ty);)*
) => {
$(#[doc(hidden)]
pub struct $wrapper<$T>($inner);
impl<$T> $wrapper<$T> {
#[inline(always)]
pub fn new(value: $T) -> Self {
Self(<$inner>::new(value))
}
}
impl<$T> Deref for $wrapper<$T> {
type Target = $inner;
#[inline(always)]
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl<$T> DerefMut for $wrapper<$T> {
#[inline(always)]
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.0
}
})*
};
}
wrapper! {
pub struct MatchSimValueHelperCheckSimValue<T>(MatchSimValueHelperCheckMutSimValue<T>);
pub struct MatchSimValueHelperCheckMutSimValue<T>(MatchSimValueHelperCheckRefSimValue<T>);
pub struct MatchSimValueHelperCheckRefSimValue<T>(MatchSimValueHelperCheckRefRefSimValue<T>);
pub struct MatchSimValueHelperCheckRefRefSimValue<T>(MatchSimValueHelperCheckRefMutSimValue<T>);
pub struct MatchSimValueHelperCheckRefMutSimValue<T>(MatchSimValueHelperCheckMutRefSimValue<T>);
pub struct MatchSimValueHelperCheckMutRefSimValue<T>(MatchSimValueHelperCheckMutMutSimValue<T>);
pub struct MatchSimValueHelperCheckMutMutSimValue<T>(MatchSimValueHelperIdentity<T>);
}
impl<T: Type> MatchSimValueHelperCheckSimValue<SimValue<T>> {
#[inline(always)]
pub fn __fayalite_match_sim_value(&mut self) -> T::SimValue {
SimValue::into_value(self.take())
}
}
impl<'a, T: Type> MatchSimValueHelperCheckMutSimValue<&'a mut SimValue<T>> {
#[inline(always)]
pub fn __fayalite_match_sim_value(&mut self) -> &'a mut T::SimValue {
self.take()
}
}
impl<'a, T: Type> MatchSimValueHelperCheckRefSimValue<&'a SimValue<T>> {
#[inline(always)]
pub fn __fayalite_match_sim_value(&mut self) -> &'a T::SimValue {
self.take()
}
}
impl<'a, 'b, T: Type> MatchSimValueHelperCheckRefRefSimValue<&'a &'b SimValue<T>> {
#[inline(always)]
pub fn __fayalite_match_sim_value(&mut self) -> &'b T::SimValue {
self.take()
}
}
impl<'a, 'b, T: Type> MatchSimValueHelperCheckRefMutSimValue<&'a &'b mut SimValue<T>> {
#[inline(always)]
pub fn __fayalite_match_sim_value(&mut self) -> &'a T::SimValue {
self.take()
}
}
impl<'a, 'b, T: Type> MatchSimValueHelperCheckMutRefSimValue<&'a mut &'b SimValue<T>> {
#[inline(always)]
pub fn __fayalite_match_sim_value(&mut self) -> &'b T::SimValue {
self.take()
}
}
impl<'a, 'b, T: Type> MatchSimValueHelperCheckMutMutSimValue<&'a mut &'b mut SimValue<T>> {
#[inline(always)]
pub fn __fayalite_match_sim_value(&mut self) -> &'a mut T::SimValue {
self.take()
}
}
#[doc(hidden)] #[doc(hidden)]
pub struct MatchSimValueHelper<T>(Option<T>); pub struct MatchSimValueHelperIdentity<T>(Option<T>);
impl<T> MatchSimValueHelper<T> { impl<T> MatchSimValueHelperIdentity<T> {
pub fn new(v: T) -> Self { fn new(v: T) -> Self {
Self(Some(v)) Self(Some(v))
} }
} #[inline(always)]
fn take(&mut self) -> T {
#[doc(hidden)] self.0.take().expect("known to be Some")
pub trait MatchSimValue {
type MatchValue;
/// use `self` so it comes first in the method resolution order
fn __fayalite_match_sim_value(self) -> Self::MatchValue
where
Self: Sized;
}
impl<T: Type> MatchSimValue for MatchSimValueHelper<SimValue<T>> {
type MatchValue = T::SimValue;
fn __fayalite_match_sim_value(self) -> Self::MatchValue {
SimValue::into_value(self.0.expect("should be Some"))
} }
} #[inline(always)]
pub fn __fayalite_match_sim_value(&mut self) -> T {
impl<'a, T: Type> MatchSimValue for MatchSimValueHelper<&'a SimValue<T>> { self.take()
type MatchValue = &'a T::SimValue;
fn __fayalite_match_sim_value(self) -> Self::MatchValue {
SimValue::value(self.0.expect("should be Some"))
}
}
impl<'a, T: Type> MatchSimValue for MatchSimValueHelper<&'a mut SimValue<T>> {
type MatchValue = &'a mut T::SimValue;
fn __fayalite_match_sim_value(self) -> Self::MatchValue {
SimValue::value_mut(self.0.expect("should be Some"))
}
}
impl<'a, T> MatchSimValue for MatchSimValueHelper<&'_ &'a T>
where
MatchSimValueHelper<&'a T>: MatchSimValue,
{
type MatchValue = <MatchSimValueHelper<&'a T> as MatchSimValue>::MatchValue;
fn __fayalite_match_sim_value(self) -> Self::MatchValue {
MatchSimValue::__fayalite_match_sim_value(MatchSimValueHelper(self.0.map(|v| *v)))
}
}
impl<'a, T> MatchSimValue for MatchSimValueHelper<&'_ mut &'a T>
where
MatchSimValueHelper<&'a T>: MatchSimValue,
{
type MatchValue = <MatchSimValueHelper<&'a T> as MatchSimValue>::MatchValue;
fn __fayalite_match_sim_value(self) -> Self::MatchValue {
MatchSimValue::__fayalite_match_sim_value(MatchSimValueHelper(self.0.map(|v| *v)))
}
}
impl<'a, T> MatchSimValue for MatchSimValueHelper<&'a &'_ mut T>
where
MatchSimValueHelper<&'a T>: MatchSimValue,
{
type MatchValue = <MatchSimValueHelper<&'a T> as MatchSimValue>::MatchValue;
fn __fayalite_match_sim_value(self) -> Self::MatchValue {
MatchSimValue::__fayalite_match_sim_value(MatchSimValueHelper(self.0.map(|v| &**v)))
}
}
impl<'a, T> MatchSimValue for MatchSimValueHelper<&'a mut &'_ mut T>
where
MatchSimValueHelper<&'a mut T>: MatchSimValue,
{
type MatchValue = <MatchSimValueHelper<&'a mut T> as MatchSimValue>::MatchValue;
fn __fayalite_match_sim_value(self) -> Self::MatchValue {
MatchSimValue::__fayalite_match_sim_value(MatchSimValueHelper(self.0.map(|v| &mut **v)))
} }
} }
#[doc(hidden)] #[doc(hidden)]
pub trait MatchSimValueFallback { pub type MatchSimValueHelper<T> = MatchSimValueHelperCheckSimValue<T>;
type MatchValue;
/// use `&mut self` so it comes later in the method resolution order than MatchSimValue
fn __fayalite_match_sim_value(&mut self) -> Self::MatchValue;
}
impl<T: ToSimValue> MatchSimValueFallback for MatchSimValueHelper<T> {
type MatchValue = <T::Type as Type>::SimValue;
fn __fayalite_match_sim_value(&mut self) -> Self::MatchValue {
SimValue::into_value(self.0.take().expect("should be Some").into_sim_value())
}
}
} }
pub trait ToSimValue: ToSimValueWithType<<Self as ValueType>::Type> + ValueType { pub trait ToSimValue: ToSimValueWithType<<Self as ValueType>::Type> + ValueType {
@ -1091,7 +1097,8 @@ impl ToSimValueWithType<CanonicalType> for bool {
| CanonicalType::Enum(_) | CanonicalType::Enum(_)
| CanonicalType::Bundle(_) | CanonicalType::Bundle(_)
| CanonicalType::PhantomConst(_) | CanonicalType::PhantomConst(_)
| CanonicalType::DynSimOnly(_) => { | CanonicalType::DynSimOnly(_)
| CanonicalType::TraceAsString(_) => {
panic!("can't create SimValue from bool: expected value of type: {ty:?}"); panic!("can't create SimValue from bool: expected value of type: {ty:?}");
} }
CanonicalType::Bool(_) CanonicalType::Bool(_)
@ -1220,80 +1227,17 @@ macro_rules! impl_to_sim_value_for_int_value {
impl_to_sim_value_for_int_value!(UIntValue, UInt, UIntType); impl_to_sim_value_for_int_value!(UIntValue, UInt, UIntType);
impl_to_sim_value_for_int_value!(SIntValue, SInt, SIntType); impl_to_sim_value_for_int_value!(SIntValue, SInt, SIntType);
#[derive(Default)] impl SerdeByIdTrait for DynSimOnly {
struct DynSimOnlySerdeTableRest { fn serde_by_id_properties(&self) -> SerdeByIdProperties<Self> {
from_serde: HashMap<DynSimOnlySerdeId, DynSimOnly>, self.serde_by_id_properties_inner()
serde_id_random_state: RandomState,
buffer: String,
}
impl DynSimOnlySerdeTableRest {
#[cold]
fn add_new(&mut self, ty: DynSimOnly) -> DynSimOnlySerdeId {
let mut try_number = 0u64;
let mut hasher = self.serde_id_random_state.build_hasher();
// extract more bits of randomness from TypeId -- its Hash impl only hashes 64-bits
write!(self.buffer, "{:?}", ty.type_id()).expect("shouldn't ever fail");
self.buffer.hash(&mut hasher);
loop {
let mut hasher = hasher.clone();
try_number.hash(&mut hasher);
try_number += 1;
let retval = DynSimOnlySerdeId(std::array::from_fn(|i| {
let mut hasher = hasher.clone();
i.hash(&mut hasher);
hasher.finish() as u32
}));
match self.from_serde.entry(retval) {
Entry::Occupied(_) => continue,
Entry::Vacant(e) => {
e.insert(ty);
return retval;
}
}
}
} }
}
#[derive(Default)] fn static_table() -> &'static SerdeByIdTable<Self> {
struct DynSimOnlySerdeTable { static TABLE: SerdeByIdTable<DynSimOnly> = SerdeByIdTable::new();
to_serde: HashMap<DynSimOnly, DynSimOnlySerdeId>, &TABLE
rest: DynSimOnlySerdeTableRest,
}
static DYN_SIM_ONLY_VALUE_TYPE_SERDE_TABLE: Mutex<Option<DynSimOnlySerdeTable>> = Mutex::new(None);
#[derive(Copy, Clone, Eq, PartialEq, Hash, Debug, Serialize, Deserialize)]
#[serde(transparent)]
struct DynSimOnlySerdeId([u32; 4]);
impl From<DynSimOnly> for DynSimOnlySerdeId {
fn from(ty: DynSimOnly) -> Self {
let mut locked = DYN_SIM_ONLY_VALUE_TYPE_SERDE_TABLE
.lock()
.expect("shouldn't be poison");
let DynSimOnlySerdeTable { to_serde, rest } = locked.get_or_insert_default();
match to_serde.entry(ty) {
Entry::Occupied(occupied_entry) => *occupied_entry.get(),
Entry::Vacant(vacant_entry) => *vacant_entry.insert(rest.add_new(ty)),
}
} }
}
impl DynSimOnlySerdeId { const NAME: &'static str = "DynSimOnly";
fn ty(self) -> Option<DynSimOnly> {
let locked = DYN_SIM_ONLY_VALUE_TYPE_SERDE_TABLE
.lock()
.expect("shouldn't be poison");
Some(*locked.as_ref()?.rest.from_serde.get(&self)?)
}
}
#[derive(Clone, Eq, PartialEq, Hash, Debug, Serialize, Deserialize)]
struct DynSimOnlySerde<'a> {
random_id: DynSimOnlySerdeId,
#[serde(borrow)]
type_name: Cow<'a, str>,
} }
impl Serialize for DynSimOnly { impl Serialize for DynSimOnly {
@ -1301,11 +1245,7 @@ impl Serialize for DynSimOnly {
where where
S: Serializer, S: Serializer,
{ {
DynSimOnlySerde { SerdeById { inner: *self }.serialize(serializer)
random_id: (*self).into(),
type_name: Cow::Borrowed(self.type_name()),
}
.serialize(serializer)
} }
} }
@ -1314,16 +1254,7 @@ impl<'de> Deserialize<'de> for DynSimOnly {
where where
D: Deserializer<'de>, D: Deserializer<'de>,
{ {
let deserialized = DynSimOnlySerde::deserialize(deserializer)?; Ok(SerdeById::deserialize(deserializer)?.inner)
let retval = deserialized
.random_id
.ty()
.filter(|ty| ty.type_name() == deserialized.type_name);
retval.ok_or_else(|| {
D::Error::custom(
"doesn't match any DynSimOnly that was serialized this time this program was run",
)
})
} }
} }
@ -1394,6 +1325,15 @@ impl Type for DynSimOnly {
} }
} }
impl SimValueDebug for DynSimOnly {
fn sim_value_debug(
value: &<Self as Type>::SimValue,
f: &mut fmt::Formatter<'_>,
) -> fmt::Result {
fmt::Debug::fmt(value, f)
}
}
impl<T: SimOnlyValueTrait> Type for SimOnly<T> { impl<T: SimOnlyValueTrait> Type for SimOnly<T> {
type BaseType = DynSimOnly; type BaseType = DynSimOnly;
type MaskType = Bool; type MaskType = Bool;
@ -1459,6 +1399,15 @@ impl<T: SimOnlyValueTrait> Type for SimOnly<T> {
} }
} }
impl<T: SimOnlyValueTrait> SimValueDebug for SimOnly<T> {
fn sim_value_debug(
value: &<Self as Type>::SimValue,
f: &mut fmt::Formatter<'_>,
) -> fmt::Result {
fmt::Debug::fmt(value, f)
}
}
impl<T: SimOnlyValueTrait> StaticType for SimOnly<T> { impl<T: SimOnlyValueTrait> StaticType for SimOnly<T> {
const TYPE: Self = Self::new(); const TYPE: Self = Self::new();

View file

@ -3,7 +3,10 @@
//! `unsafe` parts of [`DynSimOnlyValue`] //! `unsafe` parts of [`DynSimOnlyValue`]
use crate::expr::{ValueType, value_category::ValueCategoryValue}; use crate::{
expr::{ValueType, value_category::ValueCategoryValue},
util::serde_by_id::SerdeByIdProperties,
};
use serde::{Serialize, de::DeserializeOwned}; use serde::{Serialize, de::DeserializeOwned};
use std::{ use std::{
any::{self, TypeId}, any::{self, TypeId},
@ -33,6 +36,7 @@ unsafe trait DynSimOnlyTrait: 'static + Send + Sync {
&self, &self,
json_str: &str, json_str: &str,
) -> serde_json::Result<Rc<dyn DynSimOnlyValueTrait>>; ) -> serde_json::Result<Rc<dyn DynSimOnlyValueTrait>>;
fn serde_by_id_properties_inner(&self) -> SerdeByIdProperties<DynSimOnly>;
} }
/// Safety: `type_id_dyn` is implemented correctly /// Safety: `type_id_dyn` is implemented correctly
@ -55,6 +59,9 @@ unsafe impl<T: SimOnlyValueTrait> DynSimOnlyTrait for SimOnly<T> {
) -> serde_json::Result<Rc<dyn DynSimOnlyValueTrait>> { ) -> serde_json::Result<Rc<dyn DynSimOnlyValueTrait>> {
Ok(Rc::<T>::new(serde_json::from_str(json_str)?)) Ok(Rc::<T>::new(serde_json::from_str(json_str)?))
} }
fn serde_by_id_properties_inner(&self) -> SerdeByIdProperties<DynSimOnly> {
SerdeByIdProperties::of::<T>()
}
} }
/// Safety: /// Safety:
@ -151,6 +158,9 @@ impl DynSimOnly {
pub fn default_value(self) -> DynSimOnlyValue { pub fn default_value(self) -> DynSimOnlyValue {
DynSimOnlyValue(self.ty.default_value()) DynSimOnlyValue(self.ty.default_value())
} }
pub(super) fn serde_by_id_properties_inner(self) -> SerdeByIdProperties<Self> {
self.ty.serde_by_id_properties_inner()
}
} }
impl PartialEq for DynSimOnly { impl PartialEq for DynSimOnly {

View file

@ -12,11 +12,12 @@ use crate::{
TraceEnumDiscriminant, TraceEnumWithFields, TraceFieldlessEnum, TraceInstance, TraceEnumDiscriminant, TraceEnumWithFields, TraceFieldlessEnum, TraceInstance,
TraceLocation, TraceMem, TraceMemPort, TraceMemoryId, TraceMemoryLocation, TraceModule, TraceLocation, TraceMem, TraceMemPort, TraceMemoryId, TraceMemoryLocation, TraceModule,
TraceModuleIO, TracePhantomConst, TraceReg, TraceSInt, TraceScalar, TraceScalarId, TraceModuleIO, TracePhantomConst, TraceReg, TraceSInt, TraceScalar, TraceScalarId,
TraceScope, TraceSimOnly, TraceSyncReset, TraceUInt, TraceWire, TraceWriter, TraceScope, TraceSimOnly, TraceSyncReset, TraceTraceAsString, TraceUInt, TraceWire,
TraceWriterDecls, TraceWriter, TraceWriterDecls,
time::{SimDuration, SimInstant}, time::{SimDuration, SimInstant},
value::DynSimOnlyValue, value::DynSimOnlyValue,
}, },
ty::{OpaqueSimValueSlice, TraceAsString},
util::HashMap, util::HashMap,
}; };
use bitvec::{order::Lsb0, slice::BitSlice}; use bitvec::{order::Lsb0, slice::BitSlice};
@ -331,6 +332,7 @@ impl WriteTrace for TraceScalar {
Self::AsyncReset(v) => v.write_trace(writer, arg), Self::AsyncReset(v) => v.write_trace(writer, arg),
Self::PhantomConst(v) => v.write_trace(writer, arg), Self::PhantomConst(v) => v.write_trace(writer, arg),
Self::SimOnly(v) => v.write_trace(writer, arg), Self::SimOnly(v) => v.write_trace(writer, arg),
Self::TraceAsString(v) => v.write_trace(writer, arg),
} }
} }
} }
@ -726,6 +728,34 @@ impl WriteTrace for TraceSimOnly {
} }
} }
impl WriteTrace for TraceTraceAsString {
fn write_trace<W: io::Write, A: Arg>(self, writer: &mut W, mut arg: A) -> io::Result<()> {
let ArgInType {
source_var_type: _,
sink_var_type: _,
duplex_var_type: _,
properties,
scope,
} = arg.in_type();
let Self {
location,
name,
ty,
flow: _,
} = self;
write_vcd_var(
properties,
scope,
MemoryElementPartBody::TraceAsString { ty },
writer,
"string",
1,
location,
name,
)
}
}
impl WriteTrace for TraceScope { impl WriteTrace for TraceScope {
fn write_trace<W: io::Write, A: Arg>(self, writer: &mut W, arg: A) -> io::Result<()> { fn write_trace<W: io::Write, A: Arg>(self, writer: &mut W, arg: A) -> io::Result<()> {
match self { match self {
@ -1093,6 +1123,7 @@ impl<W: io::Write> TraceWriterDecls for VcdWriterDecls<W> {
finished_init: false, finished_init: false,
timescale, timescale,
properties, properties,
trace_as_string_buf: String::with_capacity(256),
}) })
} }
} }
@ -1100,6 +1131,7 @@ impl<W: io::Write> TraceWriterDecls for VcdWriterDecls<W> {
enum MemoryElementPartBody { enum MemoryElementPartBody {
Scalar, Scalar,
EnumDiscriminant { ty: Enum }, EnumDiscriminant { ty: Enum },
TraceAsString { ty: TraceAsString },
} }
struct MemoryElementPart { struct MemoryElementPart {
@ -1217,6 +1249,7 @@ pub struct VcdWriter<W: io::Write + 'static> {
finished_init: bool, finished_init: bool,
timescale: SimDuration, timescale: SimDuration,
properties: VcdWriterProperties, properties: VcdWriterProperties,
trace_as_string_buf: String,
} }
impl<W: io::Write + 'static> VcdWriter<W> { impl<W: io::Write + 'static> VcdWriter<W> {
@ -1326,6 +1359,21 @@ impl<W: io::Write> TraceWriter for VcdWriter<W> {
.built_scalar_id_to_vcd_id(first_id + element_index), .built_scalar_id_to_vcd_id(first_id + element_index),
)? )?
} }
MemoryElementPartBody::TraceAsString { ty } => {
self.trace_as_string_buf.clear();
ty.trace_fmt_append_to_string(
&mut self.trace_as_string_buf,
OpaqueSimValueSlice::from_bitslice(&element_data[start..start + len]),
);
write_string_value_change(
&mut self.writer,
&self.trace_as_string_buf,
self.properties
.scalar_id_to_vcd_id_map
.built_scalar_id_to_vcd_id(first_id + element_index),
)?;
self.trace_as_string_buf.clear();
}
} }
} }
Ok(()) Ok(())
@ -1419,6 +1467,16 @@ impl<W: io::Write> TraceWriter for VcdWriter<W> {
.built_scalar_id_to_vcd_id(id.as_usize()), .built_scalar_id_to_vcd_id(id.as_usize()),
) )
} }
fn set_signal_string(&mut self, id: TraceScalarId, value: &str) -> Result<(), Self::Error> {
write_string_value_change(
&mut self.writer,
value,
self.properties
.scalar_id_to_vcd_id_map
.built_scalar_id_to_vcd_id(id.as_usize()),
)
}
} }
impl<W: io::Write> fmt::Debug for VcdWriter<W> { impl<W: io::Write> fmt::Debug for VcdWriter<W> {
@ -1428,6 +1486,7 @@ impl<W: io::Write> fmt::Debug for VcdWriter<W> {
finished_init, finished_init,
timescale, timescale,
properties: _, properties: _,
trace_as_string_buf: _,
} = self; } = self;
f.debug_struct("VcdWriter") f.debug_struct("VcdWriter")
.field("finished_init", finished_init) .field("finished_init", finished_init)

File diff suppressed because it is too large Load diff

View file

@ -12,7 +12,8 @@ use crate::{
prelude::PhantomConst, prelude::PhantomConst,
reset::{AsyncReset, Reset, SyncReset}, reset::{AsyncReset, Reset, SyncReset},
sim::value::DynSimOnly, sim::value::DynSimOnly,
ty::{BaseType, CanonicalType}, ty::{BaseType, CanonicalType, TraceAsString, TraceAsStringTrait},
util::serde_by_id::SerdeById,
}; };
use serde::{Deserialize, Deserializer, Serialize, Serializer}; use serde::{Deserialize, Deserializer, Serialize, Serializer};
@ -38,6 +39,7 @@ impl<'de, T: ?Sized + PhantomConstValue> Deserialize<'de> for SerdePhantomConst<
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
#[serde(rename = "CanonicalType")] #[serde(rename = "CanonicalType")]
#[expect(private_interfaces)]
pub(crate) enum SerdeCanonicalType< pub(crate) enum SerdeCanonicalType<
ArrayElement = CanonicalType, ArrayElement = CanonicalType,
ThePhantomConst = SerdePhantomConst<Interned<PhantomConstCanonicalValue>>, ThePhantomConst = SerdePhantomConst<Interned<PhantomConstCanonicalValue>>,
@ -65,6 +67,10 @@ pub(crate) enum SerdeCanonicalType<
Clock, Clock,
PhantomConst(ThePhantomConst), PhantomConst(ThePhantomConst),
DynSimOnly(DynSimOnly), DynSimOnly(DynSimOnly),
TraceAsString {
inner_ty: Interned<CanonicalType>,
trace_as_string: SerdeById<Interned<dyn TraceAsStringTrait>>,
},
} }
impl<ArrayElement, PhantomConstInner> SerdeCanonicalType<ArrayElement, PhantomConstInner> { impl<ArrayElement, PhantomConstInner> SerdeCanonicalType<ArrayElement, PhantomConstInner> {
@ -82,6 +88,7 @@ impl<ArrayElement, PhantomConstInner> SerdeCanonicalType<ArrayElement, PhantomCo
Self::Clock => "a Clock", Self::Clock => "a Clock",
Self::PhantomConst(_) => "a PhantomConst", Self::PhantomConst(_) => "a PhantomConst",
Self::DynSimOnly(_) => "a SimOnlyValue", Self::DynSimOnly(_) => "a SimOnlyValue",
Self::TraceAsString { .. } => "a TraceAsString",
} }
} }
} }
@ -109,6 +116,15 @@ impl<T: BaseType> From<T> for SerdeCanonicalType {
CanonicalType::Clock(Clock {}) => Self::Clock, CanonicalType::Clock(Clock {}) => Self::Clock,
CanonicalType::PhantomConst(ty) => Self::PhantomConst(SerdePhantomConst(ty.get())), CanonicalType::PhantomConst(ty) => Self::PhantomConst(SerdePhantomConst(ty.get())),
CanonicalType::DynSimOnly(ty) => Self::DynSimOnly(ty), CanonicalType::DynSimOnly(ty) => Self::DynSimOnly(ty),
CanonicalType::TraceAsString(TraceAsString {
inner_ty,
trace_as_string,
}) => Self::TraceAsString {
inner_ty: inner_ty.interned(),
trace_as_string: SerdeById {
inner: trace_as_string.interned(),
},
},
} }
} }
} }
@ -130,6 +146,13 @@ impl From<SerdeCanonicalType> for CanonicalType {
Self::PhantomConst(PhantomConst::new_interned(value.0)) Self::PhantomConst(PhantomConst::new_interned(value.0))
} }
SerdeCanonicalType::DynSimOnly(value) => Self::DynSimOnly(value), SerdeCanonicalType::DynSimOnly(value) => Self::DynSimOnly(value),
SerdeCanonicalType::TraceAsString {
inner_ty,
trace_as_string,
} => Self::TraceAsString(TraceAsString {
inner_ty: crate::intern::LazyInterned::Interned(inner_ty),
trace_as_string: crate::intern::LazyInterned::Interned(trace_as_string.inner),
}),
} }
} }
} }

View file

@ -46,3 +46,4 @@ pub(crate) use misc::{InternedStrCompareAsStr, chain, copy_le_bytes_to_bitslice}
pub mod job_server; pub mod job_server;
pub mod prefix_sum; pub mod prefix_sum;
pub mod ready_valid; pub mod ready_valid;
pub(crate) mod serde_by_id;

View file

@ -0,0 +1,234 @@
// SPDX-License-Identifier: LGPL-3.0-or-later
// See Notices.txt for copyright information
use crate::util::HashMap;
use hashbrown::hash_map::Entry;
use serde::{Deserialize, Serialize, de::Error};
use std::{
any::TypeId,
borrow::Cow,
fmt::Write,
hash::{BuildHasher, Hash, Hasher},
marker::PhantomData,
sync::Mutex,
};
pub(crate) struct SerdeByIdProperties<T: SerdeByIdTrait> {
type_id: TypeId,
type_name: &'static str,
_phantom: PhantomData<fn(T) -> T>,
}
impl<T: SerdeByIdTrait> Clone for SerdeByIdProperties<T> {
fn clone(&self) -> Self {
*self
}
}
impl<T: SerdeByIdTrait> Copy for SerdeByIdProperties<T> {}
impl<T: SerdeByIdTrait> SerdeByIdProperties<T> {
pub fn of<U: ?Sized + 'static>() -> Self {
Self {
type_id: TypeId::of::<U>(),
type_name: std::any::type_name::<U>(),
_phantom: PhantomData,
}
}
}
pub(crate) trait SerdeByIdTrait: Hash + Eq + Clone + 'static + Send {
fn serde_by_id_properties(&self) -> SerdeByIdProperties<Self>;
fn static_table() -> &'static SerdeByIdTable<Self>;
const NAME: &'static str;
}
#[derive(Copy, Clone, Eq, PartialEq, Hash, Debug, Serialize, Deserialize)]
#[serde(transparent)]
struct SerdeRandomId([u32; 4]);
#[derive(Serialize, Deserialize)]
pub(crate) struct SerdeId<'a, T: SerdeByIdTrait> {
random_id: SerdeRandomId,
#[serde(borrow)]
type_name: Cow<'a, str>,
#[serde(skip)]
_phantom: PhantomData<fn(T) -> T>,
}
impl<'a, T: SerdeByIdTrait> Clone for SerdeId<'a, T> {
fn clone(&self) -> Self {
Self {
random_id: self.random_id,
type_name: self.type_name.clone(),
_phantom: PhantomData,
}
}
}
impl<'a, T: SerdeByIdTrait> Eq for SerdeId<'a, T> {}
impl<'a, 'b, T: SerdeByIdTrait> PartialEq<SerdeId<'b, T>> for SerdeId<'a, T> {
fn eq(&self, other: &SerdeId<'b, T>) -> bool {
let Self {
random_id,
type_name,
_phantom: _,
} = self;
*random_id == other.random_id && *type_name == other.type_name
}
}
impl<'a, T: SerdeByIdTrait> Hash for SerdeId<'a, T> {
fn hash<H: Hasher>(&self, state: &mut H) {
let Self {
random_id,
type_name: _,
_phantom: _,
} = self;
random_id.hash(state);
}
}
struct SerdeByIdTableRest<T: SerdeByIdTrait> {
from_serde: HashMap<SerdeId<'static, T>, T>,
serde_id_random_state: std::hash::RandomState,
buffer: String,
}
impl<T: SerdeByIdTrait> Default for SerdeByIdTableRest<T> {
fn default() -> Self {
Self {
from_serde: Default::default(),
serde_id_random_state: Default::default(),
buffer: Default::default(),
}
}
}
impl<T: SerdeByIdTrait> SerdeByIdTableRest<T> {
fn add_new(&mut self, value: T) -> SerdeId<'static, T> {
let properties = value.serde_by_id_properties();
let mut try_number = 0u64;
let mut hasher = self.serde_id_random_state.build_hasher();
// extract more bits of randomness from TypeId -- its Hash impl only hashes 64-bits
write!(self.buffer, "{:?}", properties.type_id).expect("shouldn't ever fail");
self.buffer.hash(&mut hasher);
loop {
let mut hasher = hasher.clone();
try_number.hash(&mut hasher);
try_number += 1;
let key = SerdeId {
random_id: SerdeRandomId(std::array::from_fn(|i| {
let mut hasher = hasher.clone();
i.hash(&mut hasher);
hasher.finish() as u32
})),
type_name: Cow::Borrowed(properties.type_name),
_phantom: PhantomData,
};
match self.from_serde.entry(key) {
Entry::Occupied(_) => continue,
Entry::Vacant(e) => {
let key = e.key().clone();
e.insert(value);
return key;
}
}
}
}
}
pub(crate) struct SerdeByIdTableMut<T: SerdeByIdTrait> {
to_serde: HashMap<T, SerdeId<'static, T>>,
rest: SerdeByIdTableRest<T>,
}
impl<T: SerdeByIdTrait> Default for SerdeByIdTableMut<T> {
fn default() -> Self {
Self {
to_serde: Default::default(),
rest: Default::default(),
}
}
}
impl<T: SerdeByIdTrait> SerdeByIdTableMut<T> {
pub(crate) fn to_serde(&mut self, value: &T) -> SerdeId<'static, T> {
if let Some(retval) = self.to_serde.get(value) {
return retval.clone();
}
self.to_serde_insert(value)
}
#[cold]
fn to_serde_insert(&mut self, value: &T) -> SerdeId<'static, T> {
let value = value.clone();
let retval = self.rest.add_new(value.clone());
self.to_serde.insert(value, retval.clone());
retval
}
pub(crate) fn from_serde(&self, id: &SerdeId<'_, T>) -> Option<T> {
self.rest.from_serde.get(id).cloned()
}
}
pub(crate) struct SerdeByIdTable<T: SerdeByIdTrait>(Mutex<Option<SerdeByIdTableMut<T>>>);
impl<T: SerdeByIdTrait> SerdeByIdTable<T> {
pub(crate) const fn new() -> Self {
Self(Mutex::new(None))
}
pub(crate) fn to_serde(&self, value: &T) -> SerdeId<'static, T> {
self.0
.lock()
.expect("shouldn't be poison")
.get_or_insert_with(
#[cold]
|| Default::default(),
)
.to_serde(value)
}
pub(crate) fn from_serde(&self, id: &SerdeId<'_, T>) -> Option<T> {
self.0
.lock()
.expect("shouldn't be poison")
.get_or_insert_with(
#[cold]
|| Default::default(),
)
.from_serde(id)
}
}
#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug, Default, Ord, PartialOrd)]
pub(crate) struct SerdeById<T: SerdeByIdTrait> {
pub(crate) inner: T,
}
impl<'de, T: SerdeByIdTrait> Deserialize<'de> for SerdeById<T> {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
let id = SerdeId::deserialize(deserializer)?;
let inner = T::static_table().from_serde(&id).ok_or_else(|| {
D::Error::custom(format_args!(
"doesn't match any {} that was serialized this time this program was run: type_name={:?}",
T::NAME,
id.type_name,
))
})?;
Ok(Self { inner })
}
}
impl<T: SerdeByIdTrait> Serialize for SerdeById<T> {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
T::static_table()
.to_serde(&self.inner)
.serialize(serializer)
}
}

View file

@ -546,7 +546,7 @@ impl<W: fmt::Write> Visitor for XdcFileWriter<W> {
base.source_location(), base.source_location(),
)? {}, )? {},
} }
match base.canonical_ty() { match base.canonical_ty().unwrap_transparent_types() {
CanonicalType::UInt(_) CanonicalType::UInt(_)
| CanonicalType::SInt(_) | CanonicalType::SInt(_)
| CanonicalType::Bool(_) | CanonicalType::Bool(_)
@ -563,6 +563,9 @@ impl<W: fmt::Write> Visitor for XdcFileWriter<W> {
v, v,
base.source_location(), base.source_location(),
)? {}, )? {},
CanonicalType::TraceAsString(_) => {
unreachable!("handled by unwrap_transparent_types")
}
} }
self.required_dont_touch_targets.insert(target); self.required_dont_touch_targets.insert(target);
match v { match v {

View file

@ -0,0 +1,166 @@
// SPDX-License-Identifier: LGPL-3.0-or-later
// See Notices.txt for copyright information
use fayalite::{prelude::*, ty::SimValueDebug};
use std::fmt;
#[hdl(outline_generated)]
struct MyStruct0<T, S: Size> {
v: T,
a: ArrayType<UInt<8>, S>,
}
#[hdl]
#[test]
fn check_my_struct0() {
let ty = MyStruct0[UInt[8]][3];
assert_eq!(
format!("{ty:?}"),
"MyStruct0 { v: UInt<8>, a: Array<UInt<8>, 3> }",
);
assert_eq!(
format!("{:?}", ty.mask_type()),
"MaskType<MyStruct0> { v: Bool, a: Array<Bool, 3> }",
);
let v = #[hdl(sim)]
MyStruct0::<_, _> {
v: 0x23u8,
a: [1u8, 2, 3],
};
assert_eq!(
format!("{v:?}"),
"MyStruct0 { v: 0x23_u8, a: [0x1_u8, 0x2_u8, 0x3_u8] }",
);
}
#[hdl(outline_generated, custom_debug())]
struct MyStruct1<T, S: Size> {
v: T,
a: ArrayType<UInt<8>, S>,
}
impl<T: Type, S: Size> fmt::Debug for MyStruct1<T, S> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let Self { v, a } = self;
f.debug_struct("Custom<MyStruct1>")
.field("v", v)
.field("a", a)
.finish()
}
}
impl<T: Type, S: Size> SimValueDebug for MyStruct1<T, S> {
#[hdl]
fn sim_value_debug(
value: &<Self as Type>::SimValue,
f: &mut fmt::Formatter<'_>,
) -> fmt::Result {
#[hdl(sim)]
let Self { v, a } = value;
f.debug_struct("Custom<MyStruct1>")
.field("v", &v)
.field("a", &a)
.finish()
}
}
#[hdl]
#[test]
fn check_my_struct1() {
let ty = MyStruct1[UInt[8]][3];
assert_eq!(
format!("{ty:?}"),
"Custom<MyStruct1> { v: UInt<8>, a: Array<UInt<8>, 3> }",
);
assert_eq!(
format!("{:?}", ty.mask_type()),
"MaskType<MyStruct1> { v: Bool, a: Array<Bool, 3> }",
);
let v = #[hdl(sim)]
MyStruct1::<_, _> {
v: 0x23u8,
a: [1u8, 2, 3],
};
assert_eq!(
format!("{v:?}"),
"Custom<MyStruct1> { v: 0x23_u8, a: [0x1_u8, 0x2_u8, 0x3_u8] }",
);
}
#[hdl(outline_generated)]
enum MyEnum0<T, S: Size> {
Unit,
V(T),
A(ArrayType<UInt<8>, S>),
}
#[hdl]
#[test]
fn check_my_enum0() {
let ty = MyEnum0[UInt[8]][3];
assert_eq!(
format!("{ty:?}"),
"MyEnum0 { Unit: (), V: UInt<8>, A: Array<UInt<8>, 3> }",
);
let v = #[hdl(sim)]
ty.Unit();
assert_eq!(format!("{v:?}"), "Unit");
let v = #[hdl(sim)]
ty.V(0x23u8);
assert_eq!(format!("{v:?}"), "V(0x23_u8)");
let v = #[hdl(sim)]
ty.A([1u8, 2, 3]);
assert_eq!(format!("{v:?}"), "A([0x1_u8, 0x2_u8, 0x3_u8])");
}
#[hdl(outline_generated, custom_debug())]
enum MyEnum1<T, S: Size> {
Unit,
V(T),
A(ArrayType<UInt<8>, S>),
}
impl<T: Type, S: Size> fmt::Debug for MyEnum1<T, S> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let Self { Unit, V, A } = self;
f.debug_struct("Custom<MyEnum1>")
.field("Unit", Unit)
.field("V", V)
.field("A", A)
.finish()
}
}
impl<T: Type, S: Size> SimValueDebug for MyEnum1<T, S> {
#[hdl]
fn sim_value_debug(
value: &<Self as Type>::SimValue,
f: &mut fmt::Formatter<'_>,
) -> fmt::Result {
type SimValueT<T> = <T as Type>::SimValue;
match value {
SimValueT::<Self>::Unit(_) => f.write_str("MyEnum1::Unit"),
SimValueT::<Self>::V(v, _) => f.debug_tuple("MyEnum1::V").field(v).finish(),
SimValueT::<Self>::A(a, _) => f.debug_tuple("MyEnum1::A").field(a).finish(),
SimValueT::<Self>::Unknown(_) => f.write_str("MyEnum1::Unknown"),
}
}
}
#[hdl]
#[test]
fn check_my_enum1() {
let ty = MyEnum1[UInt[8]][3];
assert_eq!(
format!("{ty:?}"),
"Custom<MyEnum1> { Unit: (), V: UInt<8>, A: Array<UInt<8>, 3> }",
);
let v = #[hdl(sim)]
ty.Unit();
assert_eq!(format!("{v:?}"), "MyEnum1::Unit");
let v = #[hdl(sim)]
ty.V(0x23u8);
assert_eq!(format!("{v:?}"), "MyEnum1::V(0x23_u8)");
let v = #[hdl(sim)]
ty.A([1u8, 2, 3]);
assert_eq!(format!("{v:?}"), "MyEnum1::A([0x1_u8, 0x2_u8, 0x3_u8])");
}

View file

@ -13,7 +13,7 @@ use fayalite::{
}; };
use serde_json::json; use serde_json::json;
#[hdl(outline_generated)] #[hdl(outline_generated, cmp_eq)]
pub enum TestEnum { pub enum TestEnum {
A, A,
B(UInt<8>), B(UInt<8>),
@ -679,6 +679,366 @@ circuit check_enum_literals:
}; };
} }
#[hdl_module(outline_generated)]
pub fn check_enum_cmp_eq() {
#[hdl]
let lhs: TestEnum = m.input();
#[hdl]
let rhs: TestEnum = m.input();
#[hdl]
let eq: Bool = m.output();
connect(eq, lhs.cmp_eq(rhs));
}
#[test]
fn test_enum_cmp_eq() {
let _n = SourceLocation::normalize_files_for_tests();
let m = check_enum_cmp_eq();
dbg!(m);
#[rustfmt::skip] // work around https://github.com/rust-lang/rustfmt/issues/6161
assert_export_firrtl! {
m =>
options: ExportOptions {
simplify_enums: None,
..ExportOptions::default()
},
"/test/check_enum_cmp_eq.fir": r"FIRRTL version 3.2.0
circuit check_enum_cmp_eq:
type Ty0 = {|A, B: UInt<8>, C: UInt<1>[3]|}
module check_enum_cmp_eq: @[module-XXXXXXXXXX.rs 1:1]
input lhs: Ty0 @[module-XXXXXXXXXX.rs 2:1]
input rhs: Ty0 @[module-XXXXXXXXXX.rs 3:1]
output eq: UInt<1> @[module-XXXXXXXXXX.rs 4:1]
wire TestEnum_cmp_eq: UInt<1> @[module-XXXXXXXXXX.rs 5:1]
connect TestEnum_cmp_eq, UInt<1>(0h0) @[module-XXXXXXXXXX.rs 5:1]
match lhs: @[module-XXXXXXXXXX.rs 5:1]
A:
match rhs: @[module-XXXXXXXXXX.rs 5:1]
A:
connect TestEnum_cmp_eq, UInt<1>(0h1) @[module-XXXXXXXXXX.rs 5:1]
B(_match_arm_value):
skip
C(_match_arm_value_1):
skip
B(_match_arm_value_2):
match rhs: @[module-XXXXXXXXXX.rs 5:1]
A:
skip
B(_match_arm_value_3):
connect TestEnum_cmp_eq, eq(_match_arm_value_2, _match_arm_value_3) @[module-XXXXXXXXXX.rs 5:1]
C(_match_arm_value_4):
skip
C(_match_arm_value_5):
match rhs: @[module-XXXXXXXXXX.rs 5:1]
A:
skip
B(_match_arm_value_6):
skip
C(_match_arm_value_7):
wire _array_literal_expr: UInt<1>[3]
connect _array_literal_expr[0], eq(_match_arm_value_5[0], _match_arm_value_7[0])
connect _array_literal_expr[1], eq(_match_arm_value_5[1], _match_arm_value_7[1])
connect _array_literal_expr[2], eq(_match_arm_value_5[2], _match_arm_value_7[2])
wire _cast_array_to_bits_expr: UInt<1>[3]
connect _cast_array_to_bits_expr[0], _array_literal_expr[0]
connect _cast_array_to_bits_expr[1], _array_literal_expr[1]
connect _cast_array_to_bits_expr[2], _array_literal_expr[2]
wire _cast_to_bits_expr: UInt<3>
connect _cast_to_bits_expr, cat(_cast_array_to_bits_expr[2], cat(_cast_array_to_bits_expr[1], _cast_array_to_bits_expr[0]))
connect TestEnum_cmp_eq, andr(_cast_to_bits_expr) @[module-XXXXXXXXXX.rs 5:1]
connect eq, TestEnum_cmp_eq @[module-XXXXXXXXXX.rs 6:1]
",
};
#[rustfmt::skip] // work around https://github.com/rust-lang/rustfmt/issues/6161
assert_export_firrtl! {
m =>
options: ExportOptions {
simplify_enums: Some(SimplifyEnumsKind::SimplifyToEnumsWithNoBody),
..ExportOptions::default()
},
"/test/check_enum_cmp_eq.fir": r"FIRRTL version 3.2.0
circuit check_enum_cmp_eq:
type Ty0 = {|A, B, C|}
type Ty1 = {tag: Ty0, body: UInt<8>}
module check_enum_cmp_eq: @[module-XXXXXXXXXX.rs 1:1]
input lhs: Ty1 @[module-XXXXXXXXXX.rs 2:1]
input rhs: Ty1 @[module-XXXXXXXXXX.rs 3:1]
output eq: UInt<1> @[module-XXXXXXXXXX.rs 4:1]
wire TestEnum_cmp_eq: UInt<1> @[module-XXXXXXXXXX.rs 5:1]
connect TestEnum_cmp_eq, UInt<1>(0h0) @[module-XXXXXXXXXX.rs 5:1]
match lhs.tag: @[module-XXXXXXXXXX.rs 5:1]
A:
match rhs.tag: @[module-XXXXXXXXXX.rs 5:1]
A:
connect TestEnum_cmp_eq, UInt<1>(0h1) @[module-XXXXXXXXXX.rs 5:1]
B:
skip
C:
skip
B:
match rhs.tag: @[module-XXXXXXXXXX.rs 5:1]
A:
skip
B:
connect TestEnum_cmp_eq, eq(bits(lhs.body, 7, 0), bits(rhs.body, 7, 0)) @[module-XXXXXXXXXX.rs 5:1]
C:
skip
C:
match rhs.tag: @[module-XXXXXXXXXX.rs 5:1]
A:
skip
B:
skip
C:
wire _array_literal_expr: UInt<1>[3]
wire _cast_bits_to_array_expr: UInt<1>[3]
wire _cast_bits_to_array_expr_flattened: UInt<1>[3]
connect _cast_bits_to_array_expr_flattened[0], bits(bits(lhs.body, 2, 0), 0, 0)
connect _cast_bits_to_array_expr[0], _cast_bits_to_array_expr_flattened[0]
connect _cast_bits_to_array_expr_flattened[1], bits(bits(lhs.body, 2, 0), 1, 1)
connect _cast_bits_to_array_expr[1], _cast_bits_to_array_expr_flattened[1]
connect _cast_bits_to_array_expr_flattened[2], bits(bits(lhs.body, 2, 0), 2, 2)
connect _cast_bits_to_array_expr[2], _cast_bits_to_array_expr_flattened[2]
wire _cast_bits_to_array_expr_1: UInt<1>[3]
wire _cast_bits_to_array_expr_flattened_1: UInt<1>[3]
connect _cast_bits_to_array_expr_flattened_1[0], bits(bits(rhs.body, 2, 0), 0, 0)
connect _cast_bits_to_array_expr_1[0], _cast_bits_to_array_expr_flattened_1[0]
connect _cast_bits_to_array_expr_flattened_1[1], bits(bits(rhs.body, 2, 0), 1, 1)
connect _cast_bits_to_array_expr_1[1], _cast_bits_to_array_expr_flattened_1[1]
connect _cast_bits_to_array_expr_flattened_1[2], bits(bits(rhs.body, 2, 0), 2, 2)
connect _cast_bits_to_array_expr_1[2], _cast_bits_to_array_expr_flattened_1[2]
connect _array_literal_expr[0], eq(_cast_bits_to_array_expr[0], _cast_bits_to_array_expr_1[0])
wire _cast_bits_to_array_expr_2: UInt<1>[3]
wire _cast_bits_to_array_expr_flattened_2: UInt<1>[3]
connect _cast_bits_to_array_expr_flattened_2[0], bits(bits(lhs.body, 2, 0), 0, 0)
connect _cast_bits_to_array_expr_2[0], _cast_bits_to_array_expr_flattened_2[0]
connect _cast_bits_to_array_expr_flattened_2[1], bits(bits(lhs.body, 2, 0), 1, 1)
connect _cast_bits_to_array_expr_2[1], _cast_bits_to_array_expr_flattened_2[1]
connect _cast_bits_to_array_expr_flattened_2[2], bits(bits(lhs.body, 2, 0), 2, 2)
connect _cast_bits_to_array_expr_2[2], _cast_bits_to_array_expr_flattened_2[2]
wire _cast_bits_to_array_expr_3: UInt<1>[3]
wire _cast_bits_to_array_expr_flattened_3: UInt<1>[3]
connect _cast_bits_to_array_expr_flattened_3[0], bits(bits(rhs.body, 2, 0), 0, 0)
connect _cast_bits_to_array_expr_3[0], _cast_bits_to_array_expr_flattened_3[0]
connect _cast_bits_to_array_expr_flattened_3[1], bits(bits(rhs.body, 2, 0), 1, 1)
connect _cast_bits_to_array_expr_3[1], _cast_bits_to_array_expr_flattened_3[1]
connect _cast_bits_to_array_expr_flattened_3[2], bits(bits(rhs.body, 2, 0), 2, 2)
connect _cast_bits_to_array_expr_3[2], _cast_bits_to_array_expr_flattened_3[2]
connect _array_literal_expr[1], eq(_cast_bits_to_array_expr_2[1], _cast_bits_to_array_expr_3[1])
wire _cast_bits_to_array_expr_4: UInt<1>[3]
wire _cast_bits_to_array_expr_flattened_4: UInt<1>[3]
connect _cast_bits_to_array_expr_flattened_4[0], bits(bits(lhs.body, 2, 0), 0, 0)
connect _cast_bits_to_array_expr_4[0], _cast_bits_to_array_expr_flattened_4[0]
connect _cast_bits_to_array_expr_flattened_4[1], bits(bits(lhs.body, 2, 0), 1, 1)
connect _cast_bits_to_array_expr_4[1], _cast_bits_to_array_expr_flattened_4[1]
connect _cast_bits_to_array_expr_flattened_4[2], bits(bits(lhs.body, 2, 0), 2, 2)
connect _cast_bits_to_array_expr_4[2], _cast_bits_to_array_expr_flattened_4[2]
wire _cast_bits_to_array_expr_5: UInt<1>[3]
wire _cast_bits_to_array_expr_flattened_5: UInt<1>[3]
connect _cast_bits_to_array_expr_flattened_5[0], bits(bits(rhs.body, 2, 0), 0, 0)
connect _cast_bits_to_array_expr_5[0], _cast_bits_to_array_expr_flattened_5[0]
connect _cast_bits_to_array_expr_flattened_5[1], bits(bits(rhs.body, 2, 0), 1, 1)
connect _cast_bits_to_array_expr_5[1], _cast_bits_to_array_expr_flattened_5[1]
connect _cast_bits_to_array_expr_flattened_5[2], bits(bits(rhs.body, 2, 0), 2, 2)
connect _cast_bits_to_array_expr_5[2], _cast_bits_to_array_expr_flattened_5[2]
connect _array_literal_expr[2], eq(_cast_bits_to_array_expr_4[2], _cast_bits_to_array_expr_5[2])
wire _cast_array_to_bits_expr: UInt<1>[3]
connect _cast_array_to_bits_expr[0], _array_literal_expr[0]
connect _cast_array_to_bits_expr[1], _array_literal_expr[1]
connect _cast_array_to_bits_expr[2], _array_literal_expr[2]
wire _cast_to_bits_expr: UInt<3>
connect _cast_to_bits_expr, cat(_cast_array_to_bits_expr[2], cat(_cast_array_to_bits_expr[1], _cast_array_to_bits_expr[0]))
connect TestEnum_cmp_eq, andr(_cast_to_bits_expr) @[module-XXXXXXXXXX.rs 5:1]
connect eq, TestEnum_cmp_eq @[module-XXXXXXXXXX.rs 6:1]
",
};
#[rustfmt::skip] // work around https://github.com/rust-lang/rustfmt/issues/6161
assert_export_firrtl! {
m =>
options: ExportOptions {
simplify_enums: Some(SimplifyEnumsKind::ReplaceWithBundleOfUInts),
..ExportOptions::default()
},
"/test/check_enum_cmp_eq.fir": r"FIRRTL version 3.2.0
circuit check_enum_cmp_eq:
type Ty0 = {tag: UInt<2>, body: UInt<8>}
module check_enum_cmp_eq: @[module-XXXXXXXXXX.rs 1:1]
input lhs: Ty0 @[module-XXXXXXXXXX.rs 2:1]
input rhs: Ty0 @[module-XXXXXXXXXX.rs 3:1]
output eq: UInt<1> @[module-XXXXXXXXXX.rs 4:1]
wire TestEnum_cmp_eq: UInt<1> @[module-XXXXXXXXXX.rs 5:1]
connect TestEnum_cmp_eq, UInt<1>(0h0) @[module-XXXXXXXXXX.rs 5:1]
when eq(lhs.tag, UInt<2>(0h0)): @[module-XXXXXXXXXX.rs 5:1]
when eq(rhs.tag, UInt<2>(0h0)): @[module-XXXXXXXXXX.rs 5:1]
connect TestEnum_cmp_eq, UInt<1>(0h1) @[module-XXXXXXXXXX.rs 5:1]
else when eq(rhs.tag, UInt<2>(0h1)): @[module-XXXXXXXXXX.rs 5:1]
skip
else when eq(lhs.tag, UInt<2>(0h1)): @[module-XXXXXXXXXX.rs 5:1]
when eq(rhs.tag, UInt<2>(0h0)): @[module-XXXXXXXXXX.rs 5:1]
skip
else when eq(rhs.tag, UInt<2>(0h1)): @[module-XXXXXXXXXX.rs 5:1]
connect TestEnum_cmp_eq, eq(bits(lhs.body, 7, 0), bits(rhs.body, 7, 0)) @[module-XXXXXXXXXX.rs 5:1]
else when eq(rhs.tag, UInt<2>(0h0)): @[module-XXXXXXXXXX.rs 5:1]
skip
else when eq(rhs.tag, UInt<2>(0h1)): @[module-XXXXXXXXXX.rs 5:1]
skip
else:
wire _array_literal_expr: UInt<1>[3]
wire _cast_bits_to_array_expr: UInt<1>[3]
wire _cast_bits_to_array_expr_flattened: UInt<1>[3]
connect _cast_bits_to_array_expr_flattened[0], bits(bits(lhs.body, 2, 0), 0, 0)
connect _cast_bits_to_array_expr[0], _cast_bits_to_array_expr_flattened[0]
connect _cast_bits_to_array_expr_flattened[1], bits(bits(lhs.body, 2, 0), 1, 1)
connect _cast_bits_to_array_expr[1], _cast_bits_to_array_expr_flattened[1]
connect _cast_bits_to_array_expr_flattened[2], bits(bits(lhs.body, 2, 0), 2, 2)
connect _cast_bits_to_array_expr[2], _cast_bits_to_array_expr_flattened[2]
wire _cast_bits_to_array_expr_1: UInt<1>[3]
wire _cast_bits_to_array_expr_flattened_1: UInt<1>[3]
connect _cast_bits_to_array_expr_flattened_1[0], bits(bits(rhs.body, 2, 0), 0, 0)
connect _cast_bits_to_array_expr_1[0], _cast_bits_to_array_expr_flattened_1[0]
connect _cast_bits_to_array_expr_flattened_1[1], bits(bits(rhs.body, 2, 0), 1, 1)
connect _cast_bits_to_array_expr_1[1], _cast_bits_to_array_expr_flattened_1[1]
connect _cast_bits_to_array_expr_flattened_1[2], bits(bits(rhs.body, 2, 0), 2, 2)
connect _cast_bits_to_array_expr_1[2], _cast_bits_to_array_expr_flattened_1[2]
connect _array_literal_expr[0], eq(_cast_bits_to_array_expr[0], _cast_bits_to_array_expr_1[0])
wire _cast_bits_to_array_expr_2: UInt<1>[3]
wire _cast_bits_to_array_expr_flattened_2: UInt<1>[3]
connect _cast_bits_to_array_expr_flattened_2[0], bits(bits(lhs.body, 2, 0), 0, 0)
connect _cast_bits_to_array_expr_2[0], _cast_bits_to_array_expr_flattened_2[0]
connect _cast_bits_to_array_expr_flattened_2[1], bits(bits(lhs.body, 2, 0), 1, 1)
connect _cast_bits_to_array_expr_2[1], _cast_bits_to_array_expr_flattened_2[1]
connect _cast_bits_to_array_expr_flattened_2[2], bits(bits(lhs.body, 2, 0), 2, 2)
connect _cast_bits_to_array_expr_2[2], _cast_bits_to_array_expr_flattened_2[2]
wire _cast_bits_to_array_expr_3: UInt<1>[3]
wire _cast_bits_to_array_expr_flattened_3: UInt<1>[3]
connect _cast_bits_to_array_expr_flattened_3[0], bits(bits(rhs.body, 2, 0), 0, 0)
connect _cast_bits_to_array_expr_3[0], _cast_bits_to_array_expr_flattened_3[0]
connect _cast_bits_to_array_expr_flattened_3[1], bits(bits(rhs.body, 2, 0), 1, 1)
connect _cast_bits_to_array_expr_3[1], _cast_bits_to_array_expr_flattened_3[1]
connect _cast_bits_to_array_expr_flattened_3[2], bits(bits(rhs.body, 2, 0), 2, 2)
connect _cast_bits_to_array_expr_3[2], _cast_bits_to_array_expr_flattened_3[2]
connect _array_literal_expr[1], eq(_cast_bits_to_array_expr_2[1], _cast_bits_to_array_expr_3[1])
wire _cast_bits_to_array_expr_4: UInt<1>[3]
wire _cast_bits_to_array_expr_flattened_4: UInt<1>[3]
connect _cast_bits_to_array_expr_flattened_4[0], bits(bits(lhs.body, 2, 0), 0, 0)
connect _cast_bits_to_array_expr_4[0], _cast_bits_to_array_expr_flattened_4[0]
connect _cast_bits_to_array_expr_flattened_4[1], bits(bits(lhs.body, 2, 0), 1, 1)
connect _cast_bits_to_array_expr_4[1], _cast_bits_to_array_expr_flattened_4[1]
connect _cast_bits_to_array_expr_flattened_4[2], bits(bits(lhs.body, 2, 0), 2, 2)
connect _cast_bits_to_array_expr_4[2], _cast_bits_to_array_expr_flattened_4[2]
wire _cast_bits_to_array_expr_5: UInt<1>[3]
wire _cast_bits_to_array_expr_flattened_5: UInt<1>[3]
connect _cast_bits_to_array_expr_flattened_5[0], bits(bits(rhs.body, 2, 0), 0, 0)
connect _cast_bits_to_array_expr_5[0], _cast_bits_to_array_expr_flattened_5[0]
connect _cast_bits_to_array_expr_flattened_5[1], bits(bits(rhs.body, 2, 0), 1, 1)
connect _cast_bits_to_array_expr_5[1], _cast_bits_to_array_expr_flattened_5[1]
connect _cast_bits_to_array_expr_flattened_5[2], bits(bits(rhs.body, 2, 0), 2, 2)
connect _cast_bits_to_array_expr_5[2], _cast_bits_to_array_expr_flattened_5[2]
connect _array_literal_expr[2], eq(_cast_bits_to_array_expr_4[2], _cast_bits_to_array_expr_5[2])
wire _cast_array_to_bits_expr: UInt<1>[3]
connect _cast_array_to_bits_expr[0], _array_literal_expr[0]
connect _cast_array_to_bits_expr[1], _array_literal_expr[1]
connect _cast_array_to_bits_expr[2], _array_literal_expr[2]
wire _cast_to_bits_expr: UInt<3>
connect _cast_to_bits_expr, cat(_cast_array_to_bits_expr[2], cat(_cast_array_to_bits_expr[1], _cast_array_to_bits_expr[0]))
connect TestEnum_cmp_eq, andr(_cast_to_bits_expr) @[module-XXXXXXXXXX.rs 5:1]
connect eq, TestEnum_cmp_eq @[module-XXXXXXXXXX.rs 6:1]
",
};
#[rustfmt::skip] // work around https://github.com/rust-lang/rustfmt/issues/6161
assert_export_firrtl! {
m =>
options: ExportOptions {
simplify_enums: Some(SimplifyEnumsKind::ReplaceWithUInt),
..ExportOptions::default()
},
"/test/check_enum_cmp_eq.fir": r"FIRRTL version 3.2.0
circuit check_enum_cmp_eq:
module check_enum_cmp_eq: @[module-XXXXXXXXXX.rs 1:1]
input lhs: UInt<10> @[module-XXXXXXXXXX.rs 2:1]
input rhs: UInt<10> @[module-XXXXXXXXXX.rs 3:1]
output eq: UInt<1> @[module-XXXXXXXXXX.rs 4:1]
wire TestEnum_cmp_eq: UInt<1> @[module-XXXXXXXXXX.rs 5:1]
connect TestEnum_cmp_eq, UInt<1>(0h0) @[module-XXXXXXXXXX.rs 5:1]
when eq(bits(lhs, 1, 0), UInt<2>(0h0)): @[module-XXXXXXXXXX.rs 5:1]
when eq(bits(rhs, 1, 0), UInt<2>(0h0)): @[module-XXXXXXXXXX.rs 5:1]
connect TestEnum_cmp_eq, UInt<1>(0h1) @[module-XXXXXXXXXX.rs 5:1]
else when eq(bits(rhs, 1, 0), UInt<2>(0h1)): @[module-XXXXXXXXXX.rs 5:1]
skip
else when eq(bits(lhs, 1, 0), UInt<2>(0h1)): @[module-XXXXXXXXXX.rs 5:1]
when eq(bits(rhs, 1, 0), UInt<2>(0h0)): @[module-XXXXXXXXXX.rs 5:1]
skip
else when eq(bits(rhs, 1, 0), UInt<2>(0h1)): @[module-XXXXXXXXXX.rs 5:1]
connect TestEnum_cmp_eq, eq(bits(bits(lhs, 9, 2), 7, 0), bits(bits(rhs, 9, 2), 7, 0)) @[module-XXXXXXXXXX.rs 5:1]
else when eq(bits(rhs, 1, 0), UInt<2>(0h0)): @[module-XXXXXXXXXX.rs 5:1]
skip
else when eq(bits(rhs, 1, 0), UInt<2>(0h1)): @[module-XXXXXXXXXX.rs 5:1]
skip
else:
wire _array_literal_expr: UInt<1>[3]
wire _cast_bits_to_array_expr: UInt<1>[3]
wire _cast_bits_to_array_expr_flattened: UInt<1>[3]
connect _cast_bits_to_array_expr_flattened[0], bits(bits(bits(lhs, 9, 2), 2, 0), 0, 0)
connect _cast_bits_to_array_expr[0], _cast_bits_to_array_expr_flattened[0]
connect _cast_bits_to_array_expr_flattened[1], bits(bits(bits(lhs, 9, 2), 2, 0), 1, 1)
connect _cast_bits_to_array_expr[1], _cast_bits_to_array_expr_flattened[1]
connect _cast_bits_to_array_expr_flattened[2], bits(bits(bits(lhs, 9, 2), 2, 0), 2, 2)
connect _cast_bits_to_array_expr[2], _cast_bits_to_array_expr_flattened[2]
wire _cast_bits_to_array_expr_1: UInt<1>[3]
wire _cast_bits_to_array_expr_flattened_1: UInt<1>[3]
connect _cast_bits_to_array_expr_flattened_1[0], bits(bits(bits(rhs, 9, 2), 2, 0), 0, 0)
connect _cast_bits_to_array_expr_1[0], _cast_bits_to_array_expr_flattened_1[0]
connect _cast_bits_to_array_expr_flattened_1[1], bits(bits(bits(rhs, 9, 2), 2, 0), 1, 1)
connect _cast_bits_to_array_expr_1[1], _cast_bits_to_array_expr_flattened_1[1]
connect _cast_bits_to_array_expr_flattened_1[2], bits(bits(bits(rhs, 9, 2), 2, 0), 2, 2)
connect _cast_bits_to_array_expr_1[2], _cast_bits_to_array_expr_flattened_1[2]
connect _array_literal_expr[0], eq(_cast_bits_to_array_expr[0], _cast_bits_to_array_expr_1[0])
wire _cast_bits_to_array_expr_2: UInt<1>[3]
wire _cast_bits_to_array_expr_flattened_2: UInt<1>[3]
connect _cast_bits_to_array_expr_flattened_2[0], bits(bits(bits(lhs, 9, 2), 2, 0), 0, 0)
connect _cast_bits_to_array_expr_2[0], _cast_bits_to_array_expr_flattened_2[0]
connect _cast_bits_to_array_expr_flattened_2[1], bits(bits(bits(lhs, 9, 2), 2, 0), 1, 1)
connect _cast_bits_to_array_expr_2[1], _cast_bits_to_array_expr_flattened_2[1]
connect _cast_bits_to_array_expr_flattened_2[2], bits(bits(bits(lhs, 9, 2), 2, 0), 2, 2)
connect _cast_bits_to_array_expr_2[2], _cast_bits_to_array_expr_flattened_2[2]
wire _cast_bits_to_array_expr_3: UInt<1>[3]
wire _cast_bits_to_array_expr_flattened_3: UInt<1>[3]
connect _cast_bits_to_array_expr_flattened_3[0], bits(bits(bits(rhs, 9, 2), 2, 0), 0, 0)
connect _cast_bits_to_array_expr_3[0], _cast_bits_to_array_expr_flattened_3[0]
connect _cast_bits_to_array_expr_flattened_3[1], bits(bits(bits(rhs, 9, 2), 2, 0), 1, 1)
connect _cast_bits_to_array_expr_3[1], _cast_bits_to_array_expr_flattened_3[1]
connect _cast_bits_to_array_expr_flattened_3[2], bits(bits(bits(rhs, 9, 2), 2, 0), 2, 2)
connect _cast_bits_to_array_expr_3[2], _cast_bits_to_array_expr_flattened_3[2]
connect _array_literal_expr[1], eq(_cast_bits_to_array_expr_2[1], _cast_bits_to_array_expr_3[1])
wire _cast_bits_to_array_expr_4: UInt<1>[3]
wire _cast_bits_to_array_expr_flattened_4: UInt<1>[3]
connect _cast_bits_to_array_expr_flattened_4[0], bits(bits(bits(lhs, 9, 2), 2, 0), 0, 0)
connect _cast_bits_to_array_expr_4[0], _cast_bits_to_array_expr_flattened_4[0]
connect _cast_bits_to_array_expr_flattened_4[1], bits(bits(bits(lhs, 9, 2), 2, 0), 1, 1)
connect _cast_bits_to_array_expr_4[1], _cast_bits_to_array_expr_flattened_4[1]
connect _cast_bits_to_array_expr_flattened_4[2], bits(bits(bits(lhs, 9, 2), 2, 0), 2, 2)
connect _cast_bits_to_array_expr_4[2], _cast_bits_to_array_expr_flattened_4[2]
wire _cast_bits_to_array_expr_5: UInt<1>[3]
wire _cast_bits_to_array_expr_flattened_5: UInt<1>[3]
connect _cast_bits_to_array_expr_flattened_5[0], bits(bits(bits(rhs, 9, 2), 2, 0), 0, 0)
connect _cast_bits_to_array_expr_5[0], _cast_bits_to_array_expr_flattened_5[0]
connect _cast_bits_to_array_expr_flattened_5[1], bits(bits(bits(rhs, 9, 2), 2, 0), 1, 1)
connect _cast_bits_to_array_expr_5[1], _cast_bits_to_array_expr_flattened_5[1]
connect _cast_bits_to_array_expr_flattened_5[2], bits(bits(bits(rhs, 9, 2), 2, 0), 2, 2)
connect _cast_bits_to_array_expr_5[2], _cast_bits_to_array_expr_flattened_5[2]
connect _array_literal_expr[2], eq(_cast_bits_to_array_expr_4[2], _cast_bits_to_array_expr_5[2])
wire _cast_array_to_bits_expr: UInt<1>[3]
connect _cast_array_to_bits_expr[0], _array_literal_expr[0]
connect _cast_array_to_bits_expr[1], _array_literal_expr[1]
connect _cast_array_to_bits_expr[2], _array_literal_expr[2]
wire _cast_to_bits_expr: UInt<3>
connect _cast_to_bits_expr, cat(_cast_array_to_bits_expr[2], cat(_cast_array_to_bits_expr[1], _cast_array_to_bits_expr[0]))
connect TestEnum_cmp_eq, andr(_cast_to_bits_expr) @[module-XXXXXXXXXX.rs 5:1]
connect eq, TestEnum_cmp_eq @[module-XXXXXXXXXX.rs 6:1]
",
};
}
#[hdl_module(outline_generated)] #[hdl_module(outline_generated)]
pub fn check_struct_enum_match() { pub fn check_struct_enum_match() {
#[hdl] #[hdl]

View file

@ -1,12 +1,19 @@
// SPDX-License-Identifier: LGPL-3.0-or-later // SPDX-License-Identifier: LGPL-3.0-or-later
// See Notices.txt for copyright information // See Notices.txt for copyright information
use bitvec::{order::Lsb0, view::BitView};
use fayalite::{ use fayalite::{
memory::{ReadStruct, ReadWriteStruct, WriteStruct}, assert_export_firrtl,
module::{instance_with_loc, memory_with_init_and_loc, reg_builder_with_loc}, firrtl::ExportOptions,
memory::{ReadStruct, ReadWriteStruct, WriteStruct, splat_mask},
module::{
instance_with_loc, memory_with_init_and_loc, reg_builder_with_loc,
transform::simplify_enums::SimplifyEnumsKind,
},
prelude::*, prelude::*,
reset::ResetType, reset::ResetType,
sim::vcd::VcdWriterDecls, sim::vcd::VcdWriterDecls,
ty::SimValueDebug,
util::{RcWriter, ready_valid::queue}, util::{RcWriter, ready_valid::queue},
}; };
use std::{collections::BTreeMap, num::NonZeroUsize, rc::Rc}; use std::{collections::BTreeMap, num::NonZeroUsize, rc::Rc};
@ -550,6 +557,150 @@ fn test_enums() {
} }
} }
#[hdl]
pub enum EnumWithSimpleBody {
A(UInt<8>),
B(UInt<8>),
C(UInt<8>),
}
#[hdl_module(outline_generated)]
pub fn enum_with_simple_body() {
#[hdl]
let which_in: UInt<8> = m.input();
#[hdl]
let data_in: UInt<8> = m.input();
#[hdl]
let which_out: UInt<8> = m.output();
#[hdl]
let data_out: UInt<8> = m.output();
#[hdl]
let enum_out: EnumWithSimpleBody = m.output();
#[hdl]
if which_in.cmp_eq(0u8) {
connect(enum_out, EnumWithSimpleBody.A(data_in));
} else if which_in.cmp_eq(1u8) {
connect(enum_out, EnumWithSimpleBody.B(data_in));
} else {
connect(enum_out, EnumWithSimpleBody.C(data_in));
}
#[hdl]
match enum_out {
EnumWithSimpleBody::A(v) => {
connect(which_out, 0u8);
connect(data_out, v);
}
EnumWithSimpleBody::B(v) => {
connect(which_out, 1u8);
connect(data_out, v);
}
EnumWithSimpleBody::C(v) => {
connect(which_out, 2u8);
connect(data_out, v);
}
}
}
#[hdl]
#[test]
fn test_enum_with_simple_body() {
let _n = SourceLocation::normalize_files_for_tests();
let mut sim = Simulation::new(enum_with_simple_body());
let mut writer = RcWriter::default();
sim.add_trace_writer(VcdWriterDecls::new(writer.clone()));
for which in 0u8..=2 {
for data in (0..u8::MAX).step_by(45) {
sim.write(sim.io().which_in, which);
sim.write(sim.io().data_in, data);
sim.advance_time(SimDuration::from_micros(1));
assert_eq!(sim.read(sim.io().which_out).as_int(), which);
assert_eq!(sim.read(sim.io().data_out).as_int(), data);
}
}
sim.flush_traces().unwrap();
let vcd = String::from_utf8(writer.take()).unwrap();
println!("####### VCD:\n{vcd}\n#######");
#[derive(Debug)]
struct WireState<'a> {
name: &'a str,
space_then_id: Option<&'a str>,
value: Option<&'a str>,
}
impl<'a> WireState<'a> {
fn new(name: &'a str) -> Self {
Self {
name,
space_then_id: None,
value: None,
}
}
}
let mut variant_wires = [
WireState::new("A"),
WireState::new("B"),
WireState::new("C"),
];
// check that output .vcd has the proper values for all variants' wires
for (is_last, line) in vcd.lines().map(|line| (false, line)).chain([(true, "")]) {
if let Some(line) = line.strip_prefix("$var wire 8")
&& let Some(line) = line.strip_suffix(" $end")
&& let Some((space_then_id, state)) = variant_wires
.iter_mut()
.find_map(|state| Some((line.strip_suffix(state.name)?.strip_suffix(" ")?, state)))
{
assert_eq!(space_then_id.chars().next(), Some(' '));
assert!(
space_then_id
.chars()
.skip(1)
.all(|ch| matches!(ch, '!'..='~'))
);
assert_eq!(state.space_then_id.replace(space_then_id), None);
} else if line.starts_with("#") || is_last {
let Some(expected_value) = variant_wires[0].value else {
panic!(
"variant {} hasn't been initialized before a timestamp or EOF: {variant_wires:#?}\n\
line={line:?}",
variant_wires[0].name,
);
};
for state in &variant_wires {
assert_eq!(
state.value,
Some(expected_value),
"at a timestamp or EOF: variant value for {} doesn't match expected value.\n\
{variant_wires:#?}\nline={line:?}",
state.name,
);
}
} else if line.starts_with("b") {
for state in &mut variant_wires {
let Some(space_then_id) = state.space_then_id else {
let name = state.name;
panic!(
"variant {name} hasn't had an id assigned yet: {variant_wires:#?}\n\
line={line:?}",
);
};
if let Some(value) = line.strip_suffix(space_then_id) {
state.value = Some(value);
break;
}
}
}
}
if vcd != include_str!("sim/expected/enum_with_simple_body.vcd") {
panic!();
}
let sim_debug = format!("{sim:#?}");
println!("#######\n{sim_debug}\n#######");
if sim_debug != include_str!("sim/expected/enum_with_simple_body.txt") {
panic!();
}
}
#[hdl_module(outline_generated)] #[hdl_module(outline_generated)]
pub fn memories() { pub fn memories() {
#[hdl] #[hdl]
@ -2841,3 +2992,621 @@ fn test_queue_4_true_true() {
include_str!("sim/expected/queue_4_true_true.txt"), include_str!("sim/expected/queue_4_true_true.txt"),
); );
} }
#[hdl(outline_generated, custom_debug(sim), cmp_eq)]
pub enum HasCustomDebug {
Text(UInt<512>),
FmtError,
}
impl HasCustomDebug {
#[hdl]
pub fn new_sim(text: Result<&str, std::fmt::Error>) -> SimValue<Self> {
match text {
Ok(text) => {
let mut retval = HasCustomDebug.Text.zero();
let src = text.as_bytes().view_bits::<Lsb0>();
let dest = retval.bits_mut();
let len = src.len().min(dest.len());
dest[..len].clone_from_bitslice(&src[..len]);
#[hdl(sim)]
HasCustomDebug.Text(retval)
}
Err(std::fmt::Error) =>
{
#[hdl(sim)]
HasCustomDebug.FmtError()
}
}
}
pub fn new(text: Result<&str, std::fmt::Error>) -> Expr<Self> {
Self::new_sim(text).to_expr()
}
}
impl SimValueDebug for HasCustomDebug {
#[hdl]
fn sim_value_debug(
value: &<Self as Type>::SimValue,
f: &mut std::fmt::Formatter<'_>,
) -> std::fmt::Result {
if f.alternate() {
return #[hdl(sim)]
match value {
Self::FmtError => f.write_str("FmtError"),
Self::Text(text) => f.debug_tuple("Text").field(text).finish(),
};
}
#[hdl(sim)]
match value {
Self::FmtError => Err(std::fmt::Error),
Self::Text(text) => {
assert_eq!(text.ty().width() % u8::BITS as usize, 0);
let mut bytes = vec![0u8; text.ty().width() / u8::BITS as usize];
bytes
.view_bits_mut::<Lsb0>()
.clone_from_bitslice(text.bits());
if let Some(len) = bytes.iter().position(|b| *b == 0) {
bytes.truncate(len);
}
f.write_str(&String::from_utf8_lossy(&bytes))
}
}
}
}
#[hdl_module(outline_generated)]
pub fn sim_trace_as_string() {
#[hdl]
let clk: Clock = m.input();
#[hdl]
let read: ReadStruct<TraceAsString<Array<HasCustomDebug, 2>>, ConstUsize<8>> = m.input();
#[hdl]
let write: WriteStruct<Array<TraceAsString<HasCustomDebug>, 2>, ConstUsize<8>> = m.input();
#[hdl]
let mut mem = memory_with_init([[HasCustomDebug::new(Ok("")).to_trace_as_string(); 2]; 4]);
let read_port = mem.new_read_port();
connect(read_port.clk, clk);
connect_any(read_port.addr, read.addr);
connect(read_port.en, read.en);
for (l, r) in read.data.iter().zip(read_port.data.iter()) {
connect(l, &**r);
}
let write_port = mem.new_write_port();
connect(write_port.clk, clk);
connect_any(write_port.addr, write.addr);
connect(write_port.data, write.data);
connect(write_port.en, write.en);
connect(write_port.mask, write.mask);
}
#[hdl]
#[test]
fn test_sim_trace_as_string() {
let _n = SourceLocation::normalize_files_for_tests();
let m = sim_trace_as_string();
let mut sim = Simulation::new(m);
// sim.set_breakpoints_unstable(Default::default(), true);
let mut writer = RcWriter::default();
sim.add_trace_writer(VcdWriterDecls::new(writer.clone()));
sim.write(sim.io().clk, false);
sim.write(sim.io().read.clk, false);
sim.write(sim.io().write.clk, false);
#[derive(Debug)]
struct TestCase {
read: Option<(u8, [Result<&'static str, std::fmt::Error>; 2])>,
write_addr: Option<u8>,
write_data: [Result<&'static str, std::fmt::Error>; 2],
write_mask: [bool; 2],
}
const TEST_CASES: &[TestCase] = &[
TestCase {
read: None,
write_addr: None,
write_data: [Ok(""); 2],
write_mask: [false; 2],
},
TestCase {
read: None,
write_addr: Some(0),
write_data: [Ok("mem[0][0]"), Ok("mem[0][1]")],
write_mask: [true; 2],
},
TestCase {
read: None,
write_addr: Some(1),
write_data: [Ok("mem[1][0]"), Ok("mem[1][1]")],
write_mask: [true; 2],
},
TestCase {
read: None,
write_addr: Some(2),
write_data: [Ok("mem[2][0]"), Ok("mem[2][1]")],
write_mask: [true; 2],
},
TestCase {
read: None,
write_addr: Some(3),
write_data: [Ok("mem[3][0]"), Ok("mem[3][1]")],
write_mask: [true; 2],
},
TestCase {
read: Some((1, [Ok("mem[1][0]"), Ok("mem[1][1]")])),
write_addr: None,
write_data: [Err(std::fmt::Error), Err(std::fmt::Error)],
write_mask: [true; 2],
},
TestCase {
read: Some((1, [Err(std::fmt::Error), Err(std::fmt::Error)])),
write_addr: Some(1),
write_data: [Err(std::fmt::Error), Err(std::fmt::Error)],
write_mask: [true; 2],
},
];
for test_case in TEST_CASES {
let TestCase {
read,
write_addr,
write_data,
write_mask,
} = test_case;
sim.write(sim.io().read.addr, read.map(|v| v.0).unwrap_or(0));
sim.write(sim.io().read.en, read.is_some());
sim.write(sim.io().write.addr, write_addr.unwrap_or(0));
sim.write(sim.io().write.en, write_addr.is_some());
sim.write(
sim.io().write.data,
write_data.map(|v| HasCustomDebug::new_sim(v).to_trace_as_string()),
);
sim.write(
sim.io().write.mask,
write_mask.map(|v| splat_mask(TraceAsString[HasCustomDebug], v.to_expr())),
);
sim.write(sim.io().clk, false);
sim.advance_time(SimDuration::from_nanos(500));
sim.write(sim.io().clk, true);
sim.advance_time(SimDuration::from_nanos(500));
if let Some((_, expected_read_data)) = read {
let read_data = sim.read(sim.io().read.data);
let expected_read_data = expected_read_data
.map(HasCustomDebug::new_sim)
.into_sim_value();
assert!(
*read_data.inner() == expected_read_data,
"{read_data:#?}\n!= {expected_read_data:#?}",
);
}
}
sim.flush_traces().unwrap();
let vcd = String::from_utf8(writer.take()).unwrap();
println!("####### VCD:\n{vcd}\n#######");
if vcd != include_str!("sim/expected/sim_trace_as_string.vcd") {
panic!();
}
let sim_debug = format!("{sim:#?}");
println!("#######\n{sim_debug}\n#######");
if sim_debug != include_str!("sim/expected/sim_trace_as_string.txt") {
panic!();
}
}
#[test]
fn test_firrtl_trace_as_string() {
let _n = SourceLocation::normalize_files_for_tests();
let m = sim_trace_as_string();
#[rustfmt::skip] // work around https://github.com/rust-lang/rustfmt/issues/6161
assert_export_firrtl! {
m =>
options: ExportOptions {
simplify_memories: false,
simplify_enums: None,
..ExportOptions::default()
},
"/test/sim_trace_as_string.fir": r#"FIRRTL version 3.2.0
circuit sim_trace_as_string: %[[
{
"class": "firrtl.annotations.MemoryFileInlineAnnotation",
"filename": "/test/sim_trace_as_string/mem.mem",
"hexOrBinary": "b",
"target": "~sim_trace_as_string|sim_trace_as_string>mem"
}
]]
type Ty0 = {|Text: UInt<512>, FmtError|}
type Ty1 = {addr: UInt<8>, en: UInt<1>, clk: Clock, flip data: Ty0[2]}
type Ty2 = {addr: UInt<8>, en: UInt<1>, clk: Clock, data: Ty0[2], mask: UInt<1>[2]}
type Ty3 = {addr: UInt<2>, en: UInt<1>, clk: Clock, flip data: Ty0[2]}
type Ty4 = {addr: UInt<2>, en: UInt<1>, clk: Clock, data: Ty0[2], mask: UInt<1>[2]}
module sim_trace_as_string: @[module-XXXXXXXXXX.rs 1:1]
input clk: Clock @[module-XXXXXXXXXX.rs 2:1]
input `read`: Ty1 @[module-XXXXXXXXXX.rs 3:1]
input `write`: Ty2 @[module-XXXXXXXXXX.rs 4:1]
mem `mem`: @[module-XXXXXXXXXX.rs 5:1]
data-type => Ty0[2]
depth => 4
read-latency => 0
write-latency => 1
read-under-write => old
reader => r0
writer => w1
connect `mem`.r0.clk, clk @[module-XXXXXXXXXX.rs 7:1]
; connect different types:
; lhs: UInt<2>
; rhs: UInt<8>
connect `mem`.r0.addr, `read`.addr @[module-XXXXXXXXXX.rs 8:1]
connect `mem`.r0.en, `read`.en @[module-XXXXXXXXXX.rs 9:1]
connect `read`.data[0], `mem`.r0.data[0] @[module-XXXXXXXXXX.rs 10:1]
connect `read`.data[1], `mem`.r0.data[1] @[module-XXXXXXXXXX.rs 10:1]
connect `mem`.w1.clk, clk @[module-XXXXXXXXXX.rs 12:1]
; connect different types:
; lhs: UInt<2>
; rhs: UInt<8>
connect `mem`.w1.addr, `write`.addr @[module-XXXXXXXXXX.rs 13:1]
connect `mem`.w1.data, `write`.data @[module-XXXXXXXXXX.rs 14:1]
connect `mem`.w1.en, `write`.en @[module-XXXXXXXXXX.rs 15:1]
connect `mem`.w1.mask, `write`.mask @[module-XXXXXXXXXX.rs 16:1]
"#,
"/test/sim_trace_as_string/mem.mem": r"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
",
};
#[rustfmt::skip] // work around https://github.com/rust-lang/rustfmt/issues/6161
assert_export_firrtl! {
m =>
options: ExportOptions {
simplify_memories: true,
simplify_enums: None,
..ExportOptions::default()
},
"/test/sim_trace_as_string.fir": r#"FIRRTL version 3.2.0
circuit sim_trace_as_string: %[[
{
"class": "firrtl.annotations.MemoryFileInlineAnnotation",
"filename": "/test/sim_trace_as_string/mem.mem",
"hexOrBinary": "b",
"target": "~sim_trace_as_string|sim_trace_as_string>mem"
}
]]
type Ty0 = {|Text: UInt<512>, FmtError|}
type Ty1 = {addr: UInt<8>, en: UInt<1>, clk: Clock, flip data: Ty0[2]}
type Ty2 = {addr: UInt<8>, en: UInt<1>, clk: Clock, data: Ty0[2], mask: UInt<1>[2]}
type Ty3 = {addr: UInt<2>, en: UInt<1>, clk: Clock, flip data: Ty0[2]}
type Ty4 = {addr: UInt<2>, en: UInt<1>, clk: Clock, data: Ty0[2], mask: UInt<1>[2]}
type Ty5 = {addr: UInt<2>, en: UInt<1>, clk: Clock, flip data: UInt<513>[2]}
type Ty6 = {addr: UInt<2>, en: UInt<1>, clk: Clock, data: UInt<513>[2], mask: UInt<1>[2]}
module sim_trace_as_string: @[module-XXXXXXXXXX.rs 1:1]
input clk: Clock @[module-XXXXXXXXXX.rs 2:1]
input `read`: Ty1 @[module-XXXXXXXXXX.rs 3:1]
input `write`: Ty2 @[module-XXXXXXXXXX.rs 4:1]
mem `mem`: @[module-XXXXXXXXXX.rs 5:1]
data-type => UInt<513>[2]
depth => 4
read-latency => 0
write-latency => 1
read-under-write => old
reader => r0
writer => w1
wire mem_r0: Ty3 @[module-XXXXXXXXXX.rs 6:1]
wire mem_w1: Ty4 @[module-XXXXXXXXXX.rs 11:1]
wire _cast_bits_to_enum_expr: Ty0
wire _cast_bits_to_enum_expr_body: UInt<512>
connect _cast_bits_to_enum_expr_body, head(`mem`.r0.data[0], 512)
when eq(UInt<1>(0), tail(`mem`.r0.data[0], 512)):
connect _cast_bits_to_enum_expr, {|Text: UInt<512>, FmtError|}(Text, _cast_bits_to_enum_expr_body)
else:
connect _cast_bits_to_enum_expr, {|Text: UInt<512>, FmtError|}(FmtError)
connect mem_r0.data[0], _cast_bits_to_enum_expr @[module-XXXXXXXXXX.rs 6:1]
wire _cast_bits_to_enum_expr_1: Ty0
wire _cast_bits_to_enum_expr_body_1: UInt<512>
connect _cast_bits_to_enum_expr_body_1, head(`mem`.r0.data[1], 512)
when eq(UInt<1>(0), tail(`mem`.r0.data[1], 512)):
connect _cast_bits_to_enum_expr_1, {|Text: UInt<512>, FmtError|}(Text, _cast_bits_to_enum_expr_body_1)
else:
connect _cast_bits_to_enum_expr_1, {|Text: UInt<512>, FmtError|}(FmtError)
connect mem_r0.data[1], _cast_bits_to_enum_expr_1 @[module-XXXXXXXXXX.rs 6:1]
wire _cast_enum_to_bits_expr: UInt<513>
match mem_w1.data[0]:
Text(_cast_enum_to_bits_expr_Text):
connect _cast_enum_to_bits_expr, pad(cat(_cast_enum_to_bits_expr_Text, UInt<1>(0)), 513)
FmtError:
connect _cast_enum_to_bits_expr, UInt<513>(1)
connect `mem`.w1.data[0], _cast_enum_to_bits_expr @[module-XXXXXXXXXX.rs 11:1]
connect `mem`.w1.mask[0], mem_w1.mask[0] @[module-XXXXXXXXXX.rs 11:1]
wire _cast_enum_to_bits_expr_1: UInt<513>
match mem_w1.data[1]:
Text(_cast_enum_to_bits_expr_Text_1):
connect _cast_enum_to_bits_expr_1, pad(cat(_cast_enum_to_bits_expr_Text_1, UInt<1>(0)), 513)
FmtError:
connect _cast_enum_to_bits_expr_1, UInt<513>(1)
connect `mem`.w1.data[1], _cast_enum_to_bits_expr_1 @[module-XXXXXXXXXX.rs 11:1]
connect `mem`.w1.mask[1], mem_w1.mask[1] @[module-XXXXXXXXXX.rs 11:1]
connect `mem`.r0.addr, mem_r0.addr @[module-XXXXXXXXXX.rs 6:1]
connect `mem`.r0.clk, mem_r0.clk @[module-XXXXXXXXXX.rs 6:1]
connect `mem`.r0.en, mem_r0.en @[module-XXXXXXXXXX.rs 6:1]
connect `mem`.w1.addr, mem_w1.addr @[module-XXXXXXXXXX.rs 11:1]
connect `mem`.w1.clk, mem_w1.clk @[module-XXXXXXXXXX.rs 11:1]
connect `mem`.w1.en, mem_w1.en @[module-XXXXXXXXXX.rs 11:1]
connect mem_r0.clk, clk @[module-XXXXXXXXXX.rs 7:1]
; connect different types:
; lhs: UInt<2>
; rhs: UInt<8>
connect mem_r0.addr, `read`.addr @[module-XXXXXXXXXX.rs 8:1]
connect mem_r0.en, `read`.en @[module-XXXXXXXXXX.rs 9:1]
connect `read`.data[0], mem_r0.data[0] @[module-XXXXXXXXXX.rs 10:1]
connect `read`.data[1], mem_r0.data[1] @[module-XXXXXXXXXX.rs 10:1]
connect mem_w1.clk, clk @[module-XXXXXXXXXX.rs 12:1]
; connect different types:
; lhs: UInt<2>
; rhs: UInt<8>
connect mem_w1.addr, `write`.addr @[module-XXXXXXXXXX.rs 13:1]
connect mem_w1.data, `write`.data @[module-XXXXXXXXXX.rs 14:1]
connect mem_w1.en, `write`.en @[module-XXXXXXXXXX.rs 15:1]
connect mem_w1.mask, `write`.mask @[module-XXXXXXXXXX.rs 16:1]
"#,
"/test/sim_trace_as_string/mem.mem": r"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
",
};
#[rustfmt::skip] // work around https://github.com/rust-lang/rustfmt/issues/6161
assert_export_firrtl! {
m =>
options: ExportOptions {
simplify_memories: false,
simplify_enums: Some(SimplifyEnumsKind::SimplifyToEnumsWithNoBody),
..ExportOptions::default()
},
"/test/sim_trace_as_string.fir": r#"FIRRTL version 3.2.0
circuit sim_trace_as_string: %[[
{
"class": "firrtl.annotations.MemoryFileInlineAnnotation",
"filename": "/test/sim_trace_as_string/mem.mem",
"hexOrBinary": "b",
"target": "~sim_trace_as_string|sim_trace_as_string>mem"
}
]]
type Ty0 = {|Text, FmtError|}
type Ty1 = {tag: Ty0, body: UInt<512>}
type Ty2 = {addr: UInt<8>, en: UInt<1>, clk: Clock, flip data: Ty1[2]}
type Ty3 = {addr: UInt<8>, en: UInt<1>, clk: Clock, data: Ty1[2], mask: UInt<1>[2]}
type Ty4 = {addr: UInt<2>, en: UInt<1>, clk: Clock, data: Ty1[2], mask: UInt<1>[2]}
type Ty5 = {tag: UInt<1>, body: UInt<1>}
type Ty6 = {addr: UInt<2>, en: UInt<1>, clk: Clock, data: Ty1[2], mask: Ty5[2]}
type Ty7 = {addr: UInt<2>, en: UInt<1>, clk: Clock, flip data: Ty1[2]}
module sim_trace_as_string: @[module-XXXXXXXXXX.rs 1:1]
input clk: Clock @[module-XXXXXXXXXX.rs 2:1]
input `read`: Ty2 @[module-XXXXXXXXXX.rs 3:1]
input `write`: Ty3 @[module-XXXXXXXXXX.rs 4:1]
mem `mem`: @[module-XXXXXXXXXX.rs 5:1]
data-type => Ty1[2]
depth => 4
read-latency => 0
write-latency => 1
read-under-write => old
reader => r0
writer => w1
wire mem_w1: Ty4 @[module-XXXXXXXXXX.rs 11:1]
connect `mem`.w1.addr, mem_w1.addr @[module-XXXXXXXXXX.rs 11:1]
connect `mem`.w1.en, mem_w1.en @[module-XXXXXXXXXX.rs 11:1]
connect `mem`.w1.clk, mem_w1.clk @[module-XXXXXXXXXX.rs 11:1]
connect `mem`.w1.data, mem_w1.data @[module-XXXXXXXXXX.rs 11:1]
connect `mem`.w1.mask[0].tag, mem_w1.mask[0] @[module-XXXXXXXXXX.rs 11:1]
connect `mem`.w1.mask[0].body, mem_w1.mask[0] @[module-XXXXXXXXXX.rs 11:1]
connect `mem`.w1.mask[1].tag, mem_w1.mask[1] @[module-XXXXXXXXXX.rs 11:1]
connect `mem`.w1.mask[1].body, mem_w1.mask[1] @[module-XXXXXXXXXX.rs 11:1]
connect `mem`.r0.clk, clk @[module-XXXXXXXXXX.rs 7:1]
; connect different types:
; lhs: UInt<2>
; rhs: UInt<8>
connect `mem`.r0.addr, `read`.addr @[module-XXXXXXXXXX.rs 8:1]
connect `mem`.r0.en, `read`.en @[module-XXXXXXXXXX.rs 9:1]
connect `read`.data[0], `mem`.r0.data[0] @[module-XXXXXXXXXX.rs 10:1]
connect `read`.data[1], `mem`.r0.data[1] @[module-XXXXXXXXXX.rs 10:1]
connect mem_w1.clk, clk @[module-XXXXXXXXXX.rs 12:1]
; connect different types:
; lhs: UInt<2>
; rhs: UInt<8>
connect mem_w1.addr, `write`.addr @[module-XXXXXXXXXX.rs 13:1]
connect mem_w1.data, `write`.data @[module-XXXXXXXXXX.rs 14:1]
connect mem_w1.en, `write`.en @[module-XXXXXXXXXX.rs 15:1]
connect mem_w1.mask, `write`.mask @[module-XXXXXXXXXX.rs 16:1]
"#,
"/test/sim_trace_as_string/mem.mem": r"000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
",
};
#[rustfmt::skip] // work around https://github.com/rust-lang/rustfmt/issues/6161
assert_export_firrtl! {
m =>
options: ExportOptions {
simplify_memories: true,
simplify_enums: Some(SimplifyEnumsKind::SimplifyToEnumsWithNoBody),
..ExportOptions::default()
},
"/test/sim_trace_as_string.fir": r#"FIRRTL version 3.2.0
circuit sim_trace_as_string: %[[
{
"class": "firrtl.annotations.MemoryFileInlineAnnotation",
"filename": "/test/sim_trace_as_string/mem_0_tag.mem",
"hexOrBinary": "b",
"target": "~sim_trace_as_string|sim_trace_as_string>mem_0_tag"
},
{
"class": "firrtl.annotations.MemoryFileInlineAnnotation",
"filename": "/test/sim_trace_as_string/mem_0_body.mem",
"hexOrBinary": "h",
"target": "~sim_trace_as_string|sim_trace_as_string>mem_0_body"
},
{
"class": "firrtl.annotations.MemoryFileInlineAnnotation",
"filename": "/test/sim_trace_as_string/mem_1_tag.mem",
"hexOrBinary": "b",
"target": "~sim_trace_as_string|sim_trace_as_string>mem_1_tag"
},
{
"class": "firrtl.annotations.MemoryFileInlineAnnotation",
"filename": "/test/sim_trace_as_string/mem_1_body.mem",
"hexOrBinary": "h",
"target": "~sim_trace_as_string|sim_trace_as_string>mem_1_body"
}
]]
type Ty0 = {|Text, FmtError|}
type Ty1 = {tag: Ty0, body: UInt<512>}
type Ty2 = {addr: UInt<8>, en: UInt<1>, clk: Clock, flip data: Ty1[2]}
type Ty3 = {addr: UInt<8>, en: UInt<1>, clk: Clock, data: Ty1[2], mask: UInt<1>[2]}
type Ty4 = {addr: UInt<2>, en: UInt<1>, clk: Clock, flip data: Ty1[2]}
type Ty5 = {tag: UInt<1>, body: UInt<1>}
type Ty6 = {addr: UInt<2>, en: UInt<1>, clk: Clock, data: Ty1[2], mask: Ty5[2]}
type Ty7 = {addr: UInt<2>, en: UInt<1>, clk: Clock, flip data: UInt<1>}
type Ty8 = {addr: UInt<2>, en: UInt<1>, clk: Clock, data: UInt<1>, mask: UInt<1>}
type Ty9 = {addr: UInt<2>, en: UInt<1>, clk: Clock, flip data: UInt<512>}
type Ty10 = {addr: UInt<2>, en: UInt<1>, clk: Clock, data: UInt<512>, mask: UInt<1>}
type Ty11 = {addr: UInt<2>, en: UInt<1>, clk: Clock, data: Ty1[2], mask: UInt<1>[2]}
module sim_trace_as_string: @[module-XXXXXXXXXX.rs 1:1]
input clk: Clock @[module-XXXXXXXXXX.rs 2:1]
input `read`: Ty2 @[module-XXXXXXXXXX.rs 3:1]
input `write`: Ty3 @[module-XXXXXXXXXX.rs 4:1]
mem mem_0_tag: @[module-XXXXXXXXXX.rs 5:1]
data-type => UInt<1>
depth => 4
read-latency => 0
write-latency => 1
read-under-write => old
reader => r0
writer => w1
mem mem_0_body: @[module-XXXXXXXXXX.rs 5:1]
data-type => UInt<512>
depth => 4
read-latency => 0
write-latency => 1
read-under-write => old
reader => r0
writer => w1
mem mem_1_tag: @[module-XXXXXXXXXX.rs 5:1]
data-type => UInt<1>
depth => 4
read-latency => 0
write-latency => 1
read-under-write => old
reader => r0
writer => w1
mem mem_1_body: @[module-XXXXXXXXXX.rs 5:1]
data-type => UInt<512>
depth => 4
read-latency => 0
write-latency => 1
read-under-write => old
reader => r0
writer => w1
wire mem_r0: Ty4 @[module-XXXXXXXXXX.rs 6:1]
wire mem_w1: Ty6 @[module-XXXXXXXXXX.rs 11:1]
wire _cast_bits_to_enum_expr: Ty0
when eq(UInt<1>(0), tail(mem_0_tag.r0.data, 0)):
connect _cast_bits_to_enum_expr, {|Text, FmtError|}(Text)
else:
connect _cast_bits_to_enum_expr, {|Text, FmtError|}(FmtError)
connect mem_r0.data[0].tag, _cast_bits_to_enum_expr @[module-XXXXXXXXXX.rs 6:1]
wire _cast_enum_to_bits_expr: UInt<1>
match mem_w1.data[0].tag:
Text:
connect _cast_enum_to_bits_expr, UInt<1>(0)
FmtError:
connect _cast_enum_to_bits_expr, UInt<1>(1)
connect mem_0_tag.w1.data, _cast_enum_to_bits_expr @[module-XXXXXXXXXX.rs 11:1]
connect mem_0_tag.w1.mask, mem_w1.mask[0].tag @[module-XXXXXXXXXX.rs 11:1]
connect mem_0_tag.r0.addr, mem_r0.addr @[module-XXXXXXXXXX.rs 6:1]
connect mem_0_tag.r0.clk, mem_r0.clk @[module-XXXXXXXXXX.rs 6:1]
connect mem_0_tag.r0.en, mem_r0.en @[module-XXXXXXXXXX.rs 6:1]
connect mem_0_tag.w1.addr, mem_w1.addr @[module-XXXXXXXXXX.rs 11:1]
connect mem_0_tag.w1.clk, mem_w1.clk @[module-XXXXXXXXXX.rs 11:1]
connect mem_0_tag.w1.en, mem_w1.en @[module-XXXXXXXXXX.rs 11:1]
connect mem_r0.data[0].body, mem_0_body.r0.data @[module-XXXXXXXXXX.rs 6:1]
connect mem_0_body.w1.data, mem_w1.data[0].body @[module-XXXXXXXXXX.rs 11:1]
connect mem_0_body.w1.mask, mem_w1.mask[0].body @[module-XXXXXXXXXX.rs 11:1]
connect mem_0_body.r0.addr, mem_r0.addr @[module-XXXXXXXXXX.rs 6:1]
connect mem_0_body.r0.clk, mem_r0.clk @[module-XXXXXXXXXX.rs 6:1]
connect mem_0_body.r0.en, mem_r0.en @[module-XXXXXXXXXX.rs 6:1]
connect mem_0_body.w1.addr, mem_w1.addr @[module-XXXXXXXXXX.rs 11:1]
connect mem_0_body.w1.clk, mem_w1.clk @[module-XXXXXXXXXX.rs 11:1]
connect mem_0_body.w1.en, mem_w1.en @[module-XXXXXXXXXX.rs 11:1]
wire _cast_bits_to_enum_expr_1: Ty0
when eq(UInt<1>(0), tail(mem_1_tag.r0.data, 0)):
connect _cast_bits_to_enum_expr_1, {|Text, FmtError|}(Text)
else:
connect _cast_bits_to_enum_expr_1, {|Text, FmtError|}(FmtError)
connect mem_r0.data[1].tag, _cast_bits_to_enum_expr_1 @[module-XXXXXXXXXX.rs 6:1]
wire _cast_enum_to_bits_expr_1: UInt<1>
match mem_w1.data[1].tag:
Text:
connect _cast_enum_to_bits_expr_1, UInt<1>(0)
FmtError:
connect _cast_enum_to_bits_expr_1, UInt<1>(1)
connect mem_1_tag.w1.data, _cast_enum_to_bits_expr_1 @[module-XXXXXXXXXX.rs 11:1]
connect mem_1_tag.w1.mask, mem_w1.mask[1].tag @[module-XXXXXXXXXX.rs 11:1]
connect mem_1_tag.r0.addr, mem_r0.addr @[module-XXXXXXXXXX.rs 6:1]
connect mem_1_tag.r0.clk, mem_r0.clk @[module-XXXXXXXXXX.rs 6:1]
connect mem_1_tag.r0.en, mem_r0.en @[module-XXXXXXXXXX.rs 6:1]
connect mem_1_tag.w1.addr, mem_w1.addr @[module-XXXXXXXXXX.rs 11:1]
connect mem_1_tag.w1.clk, mem_w1.clk @[module-XXXXXXXXXX.rs 11:1]
connect mem_1_tag.w1.en, mem_w1.en @[module-XXXXXXXXXX.rs 11:1]
connect mem_r0.data[1].body, mem_1_body.r0.data @[module-XXXXXXXXXX.rs 6:1]
connect mem_1_body.w1.data, mem_w1.data[1].body @[module-XXXXXXXXXX.rs 11:1]
connect mem_1_body.w1.mask, mem_w1.mask[1].body @[module-XXXXXXXXXX.rs 11:1]
connect mem_1_body.r0.addr, mem_r0.addr @[module-XXXXXXXXXX.rs 6:1]
connect mem_1_body.r0.clk, mem_r0.clk @[module-XXXXXXXXXX.rs 6:1]
connect mem_1_body.r0.en, mem_r0.en @[module-XXXXXXXXXX.rs 6:1]
connect mem_1_body.w1.addr, mem_w1.addr @[module-XXXXXXXXXX.rs 11:1]
connect mem_1_body.w1.clk, mem_w1.clk @[module-XXXXXXXXXX.rs 11:1]
connect mem_1_body.w1.en, mem_w1.en @[module-XXXXXXXXXX.rs 11:1]
wire mem_w1_1: Ty11 @[module-XXXXXXXXXX.rs 11:1]
connect mem_w1.addr, mem_w1_1.addr @[module-XXXXXXXXXX.rs 11:1]
connect mem_w1.en, mem_w1_1.en @[module-XXXXXXXXXX.rs 11:1]
connect mem_w1.clk, mem_w1_1.clk @[module-XXXXXXXXXX.rs 11:1]
connect mem_w1.data, mem_w1_1.data @[module-XXXXXXXXXX.rs 11:1]
connect mem_w1.mask[0].tag, mem_w1_1.mask[0] @[module-XXXXXXXXXX.rs 11:1]
connect mem_w1.mask[0].body, mem_w1_1.mask[0] @[module-XXXXXXXXXX.rs 11:1]
connect mem_w1.mask[1].tag, mem_w1_1.mask[1] @[module-XXXXXXXXXX.rs 11:1]
connect mem_w1.mask[1].body, mem_w1_1.mask[1] @[module-XXXXXXXXXX.rs 11:1]
connect mem_r0.clk, clk @[module-XXXXXXXXXX.rs 7:1]
; connect different types:
; lhs: UInt<2>
; rhs: UInt<8>
connect mem_r0.addr, `read`.addr @[module-XXXXXXXXXX.rs 8:1]
connect mem_r0.en, `read`.en @[module-XXXXXXXXXX.rs 9:1]
connect `read`.data[0], mem_r0.data[0] @[module-XXXXXXXXXX.rs 10:1]
connect `read`.data[1], mem_r0.data[1] @[module-XXXXXXXXXX.rs 10:1]
connect mem_w1_1.clk, clk @[module-XXXXXXXXXX.rs 12:1]
; connect different types:
; lhs: UInt<2>
; rhs: UInt<8>
connect mem_w1_1.addr, `write`.addr @[module-XXXXXXXXXX.rs 13:1]
connect mem_w1_1.data, `write`.data @[module-XXXXXXXXXX.rs 14:1]
connect mem_w1_1.en, `write`.en @[module-XXXXXXXXXX.rs 15:1]
connect mem_w1_1.mask, `write`.mask @[module-XXXXXXXXXX.rs 16:1]
"#,
"/test/sim_trace_as_string/mem_0_body.mem": r"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
",
"/test/sim_trace_as_string/mem_0_tag.mem": r"0
0
0
0
",
"/test/sim_trace_as_string/mem_1_body.mem": r"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
",
"/test/sim_trace_as_string/mem_1_tag.mem": r"0
0
0
0
",
};
}

View file

@ -1218,6 +1218,7 @@ Simulation {
index: StatePartIndex<BigSlots>(0), index: StatePartIndex<BigSlots>(0),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0xff, state: 0xff,
last_state: 0xff, last_state: 0xff,
}, },
@ -1227,6 +1228,7 @@ Simulation {
index: StatePartIndex<BigSlots>(1), index: StatePartIndex<BigSlots>(1),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x7f, state: 0x7f,
last_state: 0x7f, last_state: 0x7f,
}, },
@ -1236,6 +1238,7 @@ Simulation {
index: StatePartIndex<BigSlots>(2), index: StatePartIndex<BigSlots>(2),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x3f, state: 0x3f,
last_state: 0x3f, last_state: 0x3f,
}, },
@ -1245,6 +1248,7 @@ Simulation {
index: StatePartIndex<BigSlots>(3), index: StatePartIndex<BigSlots>(3),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x1f, state: 0x1f,
last_state: 0x1f, last_state: 0x1f,
}, },
@ -1254,6 +1258,7 @@ Simulation {
index: StatePartIndex<BigSlots>(4), index: StatePartIndex<BigSlots>(4),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x0f, state: 0x0f,
last_state: 0x0f, last_state: 0x0f,
}, },
@ -1263,6 +1268,7 @@ Simulation {
index: StatePartIndex<BigSlots>(5), index: StatePartIndex<BigSlots>(5),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x07, state: 0x07,
last_state: 0x07, last_state: 0x07,
}, },
@ -1272,6 +1278,7 @@ Simulation {
index: StatePartIndex<BigSlots>(6), index: StatePartIndex<BigSlots>(6),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x03, state: 0x03,
last_state: 0x03, last_state: 0x03,
}, },
@ -1281,6 +1288,7 @@ Simulation {
index: StatePartIndex<BigSlots>(7), index: StatePartIndex<BigSlots>(7),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x01, state: 0x01,
last_state: 0x01, last_state: 0x01,
}, },
@ -1290,6 +1298,7 @@ Simulation {
index: StatePartIndex<BigSlots>(8), index: StatePartIndex<BigSlots>(8),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x00, state: 0x00,
last_state: 0x00, last_state: 0x00,
}, },
@ -1299,6 +1308,7 @@ Simulation {
index: StatePartIndex<BigSlots>(9), index: StatePartIndex<BigSlots>(9),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x80, state: 0x80,
last_state: 0x80, last_state: 0x80,
}, },
@ -1308,6 +1318,7 @@ Simulation {
index: StatePartIndex<BigSlots>(10), index: StatePartIndex<BigSlots>(10),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0xc0, state: 0xc0,
last_state: 0xc0, last_state: 0xc0,
}, },
@ -1317,6 +1328,7 @@ Simulation {
index: StatePartIndex<BigSlots>(11), index: StatePartIndex<BigSlots>(11),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0xe0, state: 0xe0,
last_state: 0xe0, last_state: 0xe0,
}, },
@ -1326,6 +1338,7 @@ Simulation {
index: StatePartIndex<BigSlots>(12), index: StatePartIndex<BigSlots>(12),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0xf0, state: 0xf0,
last_state: 0xf0, last_state: 0xf0,
}, },
@ -1335,6 +1348,7 @@ Simulation {
index: StatePartIndex<BigSlots>(13), index: StatePartIndex<BigSlots>(13),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0xf8, state: 0xf8,
last_state: 0xf8, last_state: 0xf8,
}, },
@ -1344,6 +1358,7 @@ Simulation {
index: StatePartIndex<BigSlots>(14), index: StatePartIndex<BigSlots>(14),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0xfc, state: 0xfc,
last_state: 0xfc, last_state: 0xfc,
}, },
@ -1353,6 +1368,7 @@ Simulation {
index: StatePartIndex<BigSlots>(15), index: StatePartIndex<BigSlots>(15),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0xfe, state: 0xfe,
last_state: 0xfe, last_state: 0xfe,
}, },
@ -1362,6 +1378,7 @@ Simulation {
index: StatePartIndex<BigSlots>(16), index: StatePartIndex<BigSlots>(16),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0xff, state: 0xff,
last_state: 0xff, last_state: 0xff,
}, },
@ -1371,6 +1388,7 @@ Simulation {
index: StatePartIndex<BigSlots>(17), index: StatePartIndex<BigSlots>(17),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x7f, state: 0x7f,
last_state: 0x7f, last_state: 0x7f,
}, },
@ -1380,6 +1398,7 @@ Simulation {
index: StatePartIndex<BigSlots>(18), index: StatePartIndex<BigSlots>(18),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x3f, state: 0x3f,
last_state: 0x3f, last_state: 0x3f,
}, },
@ -1389,6 +1408,7 @@ Simulation {
index: StatePartIndex<BigSlots>(19), index: StatePartIndex<BigSlots>(19),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x1f, state: 0x1f,
last_state: 0x1f, last_state: 0x1f,
}, },
@ -1398,6 +1418,7 @@ Simulation {
index: StatePartIndex<BigSlots>(20), index: StatePartIndex<BigSlots>(20),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x0f, state: 0x0f,
last_state: 0x0f, last_state: 0x0f,
}, },
@ -1407,6 +1428,7 @@ Simulation {
index: StatePartIndex<BigSlots>(21), index: StatePartIndex<BigSlots>(21),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x07, state: 0x07,
last_state: 0x07, last_state: 0x07,
}, },
@ -1416,6 +1438,7 @@ Simulation {
index: StatePartIndex<BigSlots>(22), index: StatePartIndex<BigSlots>(22),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x03, state: 0x03,
last_state: 0x03, last_state: 0x03,
}, },
@ -1425,6 +1448,7 @@ Simulation {
index: StatePartIndex<BigSlots>(23), index: StatePartIndex<BigSlots>(23),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x01, state: 0x01,
last_state: 0x01, last_state: 0x01,
}, },
@ -1434,6 +1458,7 @@ Simulation {
index: StatePartIndex<BigSlots>(24), index: StatePartIndex<BigSlots>(24),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x00, state: 0x00,
last_state: 0x00, last_state: 0x00,
}, },
@ -1443,6 +1468,7 @@ Simulation {
index: StatePartIndex<BigSlots>(25), index: StatePartIndex<BigSlots>(25),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x80, state: 0x80,
last_state: 0x80, last_state: 0x80,
}, },
@ -1452,6 +1478,7 @@ Simulation {
index: StatePartIndex<BigSlots>(26), index: StatePartIndex<BigSlots>(26),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0xc0, state: 0xc0,
last_state: 0xc0, last_state: 0xc0,
}, },
@ -1461,6 +1488,7 @@ Simulation {
index: StatePartIndex<BigSlots>(27), index: StatePartIndex<BigSlots>(27),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0xe0, state: 0xe0,
last_state: 0xe0, last_state: 0xe0,
}, },
@ -1470,6 +1498,7 @@ Simulation {
index: StatePartIndex<BigSlots>(28), index: StatePartIndex<BigSlots>(28),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0xf0, state: 0xf0,
last_state: 0xf0, last_state: 0xf0,
}, },
@ -1479,6 +1508,7 @@ Simulation {
index: StatePartIndex<BigSlots>(29), index: StatePartIndex<BigSlots>(29),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0xf8, state: 0xf8,
last_state: 0xf8, last_state: 0xf8,
}, },
@ -1488,6 +1518,7 @@ Simulation {
index: StatePartIndex<BigSlots>(30), index: StatePartIndex<BigSlots>(30),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0xfc, state: 0xfc,
last_state: 0xfc, last_state: 0xfc,
}, },
@ -1497,6 +1528,7 @@ Simulation {
index: StatePartIndex<BigSlots>(31), index: StatePartIndex<BigSlots>(31),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0xfe, state: 0xfe,
last_state: 0xe1, last_state: 0xe1,
}, },
@ -1506,6 +1538,7 @@ Simulation {
index: StatePartIndex<BigSlots>(32), index: StatePartIndex<BigSlots>(32),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x00, state: 0x00,
last_state: 0x00, last_state: 0x00,
}, },
@ -1515,6 +1548,7 @@ Simulation {
index: StatePartIndex<BigSlots>(33), index: StatePartIndex<BigSlots>(33),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0xff, state: 0xff,
last_state: 0xff, last_state: 0xff,
}, },
@ -1524,6 +1558,7 @@ Simulation {
index: StatePartIndex<BigSlots>(34), index: StatePartIndex<BigSlots>(34),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x10, state: 0x10,
last_state: 0x0f, last_state: 0x0f,
}, },
@ -1533,6 +1568,7 @@ Simulation {
index: StatePartIndex<BigSlots>(35), index: StatePartIndex<BigSlots>(35),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x00, state: 0x00,
last_state: 0xe1, last_state: 0xe1,
}, },
@ -1541,6 +1577,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(36), index: StatePartIndex<BigSlots>(36),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1550,6 +1587,7 @@ Simulation {
index: StatePartIndex<BigSlots>(37), index: StatePartIndex<BigSlots>(37),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0xff, state: 0xff,
last_state: 0xff, last_state: 0xff,
}, },
@ -1559,6 +1597,7 @@ Simulation {
index: StatePartIndex<BigSlots>(38), index: StatePartIndex<BigSlots>(38),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x7f, state: 0x7f,
last_state: 0x7f, last_state: 0x7f,
}, },
@ -1568,6 +1607,7 @@ Simulation {
index: StatePartIndex<BigSlots>(39), index: StatePartIndex<BigSlots>(39),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x3f, state: 0x3f,
last_state: 0x3f, last_state: 0x3f,
}, },
@ -1577,6 +1617,7 @@ Simulation {
index: StatePartIndex<BigSlots>(40), index: StatePartIndex<BigSlots>(40),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x1f, state: 0x1f,
last_state: 0x1f, last_state: 0x1f,
}, },
@ -1586,6 +1627,7 @@ Simulation {
index: StatePartIndex<BigSlots>(41), index: StatePartIndex<BigSlots>(41),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x0f, state: 0x0f,
last_state: 0x0f, last_state: 0x0f,
}, },
@ -1595,6 +1637,7 @@ Simulation {
index: StatePartIndex<BigSlots>(42), index: StatePartIndex<BigSlots>(42),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x07, state: 0x07,
last_state: 0x07, last_state: 0x07,
}, },
@ -1604,6 +1647,7 @@ Simulation {
index: StatePartIndex<BigSlots>(43), index: StatePartIndex<BigSlots>(43),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x03, state: 0x03,
last_state: 0x03, last_state: 0x03,
}, },
@ -1613,6 +1657,7 @@ Simulation {
index: StatePartIndex<BigSlots>(44), index: StatePartIndex<BigSlots>(44),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x01, state: 0x01,
last_state: 0x01, last_state: 0x01,
}, },
@ -1622,6 +1667,7 @@ Simulation {
index: StatePartIndex<BigSlots>(45), index: StatePartIndex<BigSlots>(45),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x00, state: 0x00,
last_state: 0x00, last_state: 0x00,
}, },
@ -1631,6 +1677,7 @@ Simulation {
index: StatePartIndex<BigSlots>(46), index: StatePartIndex<BigSlots>(46),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x80, state: 0x80,
last_state: 0x80, last_state: 0x80,
}, },
@ -1640,6 +1687,7 @@ Simulation {
index: StatePartIndex<BigSlots>(47), index: StatePartIndex<BigSlots>(47),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0xc0, state: 0xc0,
last_state: 0xc0, last_state: 0xc0,
}, },
@ -1649,6 +1697,7 @@ Simulation {
index: StatePartIndex<BigSlots>(48), index: StatePartIndex<BigSlots>(48),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0xe0, state: 0xe0,
last_state: 0xe0, last_state: 0xe0,
}, },
@ -1658,6 +1707,7 @@ Simulation {
index: StatePartIndex<BigSlots>(49), index: StatePartIndex<BigSlots>(49),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0xf0, state: 0xf0,
last_state: 0xf0, last_state: 0xf0,
}, },
@ -1667,6 +1717,7 @@ Simulation {
index: StatePartIndex<BigSlots>(50), index: StatePartIndex<BigSlots>(50),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0xf8, state: 0xf8,
last_state: 0xf8, last_state: 0xf8,
}, },
@ -1676,6 +1727,7 @@ Simulation {
index: StatePartIndex<BigSlots>(51), index: StatePartIndex<BigSlots>(51),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0xfc, state: 0xfc,
last_state: 0xfc, last_state: 0xfc,
}, },
@ -1685,6 +1737,7 @@ Simulation {
index: StatePartIndex<BigSlots>(52), index: StatePartIndex<BigSlots>(52),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0xfe, state: 0xfe,
last_state: 0xe1, last_state: 0xe1,
}, },

View file

@ -155,6 +155,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(0), index: StatePartIndex<BigSlots>(0),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x0, last_state: 0x0,
}, },
@ -163,6 +164,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(1), index: StatePartIndex<BigSlots>(1),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x1, last_state: 0x1,
}, },

View file

@ -124,6 +124,7 @@ Simulation {
index: StatePartIndex<BigSlots>(0), index: StatePartIndex<BigSlots>(0),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x05, state: 0x05,
last_state: 0x05, last_state: 0x05,
}, },

View file

@ -175,6 +175,7 @@ Simulation {
kind: BigAsyncReset { kind: BigAsyncReset {
index: StatePartIndex<BigSlots>(0), index: StatePartIndex<BigSlots>(0),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -183,6 +184,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(1), index: StatePartIndex<BigSlots>(1),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },

View file

@ -332,6 +332,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(0), index: StatePartIndex<BigSlots>(0),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x0, last_state: 0x0,
}, },
@ -340,6 +341,7 @@ Simulation {
kind: BigAsyncReset { kind: BigAsyncReset {
index: StatePartIndex<BigSlots>(1), index: StatePartIndex<BigSlots>(1),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -349,6 +351,7 @@ Simulation {
index: StatePartIndex<BigSlots>(2), index: StatePartIndex<BigSlots>(2),
ty: UInt<4>, ty: UInt<4>,
}, },
maybe_changed: true,
state: 0x3, state: 0x3,
last_state: 0x2, last_state: 0x2,
}, },
@ -358,6 +361,7 @@ Simulation {
index: StatePartIndex<BigSlots>(3), index: StatePartIndex<BigSlots>(3),
ty: UInt<4>, ty: UInt<4>,
}, },
maybe_changed: true,
state: 0x3, state: 0x3,
last_state: 0x2, last_state: 0x2,
}, },

View file

@ -313,6 +313,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(0), index: StatePartIndex<BigSlots>(0),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x0, last_state: 0x0,
}, },
@ -321,6 +322,7 @@ Simulation {
kind: BigSyncReset { kind: BigSyncReset {
index: StatePartIndex<BigSlots>(1), index: StatePartIndex<BigSlots>(1),
}, },
maybe_changed: false,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -330,6 +332,7 @@ Simulation {
index: StatePartIndex<BigSlots>(2), index: StatePartIndex<BigSlots>(2),
ty: UInt<4>, ty: UInt<4>,
}, },
maybe_changed: true,
state: 0x3, state: 0x3,
last_state: 0x2, last_state: 0x2,
}, },
@ -339,6 +342,7 @@ Simulation {
index: StatePartIndex<BigSlots>(3), index: StatePartIndex<BigSlots>(3),
ty: UInt<4>, ty: UInt<4>,
}, },
maybe_changed: true,
state: 0x3, state: 0x3,
last_state: 0x2, last_state: 0x2,
}, },

View file

@ -137,6 +137,7 @@ Simulation {
index: StatePartIndex<BigSlots>(0), index: StatePartIndex<BigSlots>(0),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x05, state: 0x05,
last_state: 0x05, last_state: 0x05,
}, },
@ -146,6 +147,7 @@ Simulation {
index: StatePartIndex<BigSlots>(2), index: StatePartIndex<BigSlots>(2),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x06, state: 0x06,
last_state: 0x06, last_state: 0x06,
}, },

View file

@ -0,0 +1,749 @@
Simulation {
state: State {
insns: Insns {
state_layout: StateLayout {
ty: TypeLayout {
small_slots: StatePartLayout<SmallSlots> {
len: 1,
debug_data: [
SlotDebugData {
name: "",
ty: Enum {
A,
B,
C,
},
},
],
..
},
big_slots: StatePartLayout<BigSlots> {
len: 33,
debug_data: [
SlotDebugData {
name: "InstantiatedModule(enum_with_simple_body: enum_with_simple_body).enum_with_simple_body::which_in",
ty: UInt<8>,
},
SlotDebugData {
name: "InstantiatedModule(enum_with_simple_body: enum_with_simple_body).enum_with_simple_body::data_in",
ty: UInt<8>,
},
SlotDebugData {
name: "InstantiatedModule(enum_with_simple_body: enum_with_simple_body).enum_with_simple_body::which_out",
ty: UInt<8>,
},
SlotDebugData {
name: "InstantiatedModule(enum_with_simple_body: enum_with_simple_body).enum_with_simple_body::data_out",
ty: UInt<8>,
},
SlotDebugData {
name: "InstantiatedModule(enum_with_simple_body: enum_with_simple_body).enum_with_simple_body::enum_out",
ty: Enum {
A(UInt<8>),
B(UInt<8>),
C(UInt<8>),
},
},
SlotDebugData {
name: "",
ty: UInt<10>,
},
SlotDebugData {
name: "",
ty: UInt<8>,
},
SlotDebugData {
name: "",
ty: UInt<8>,
},
SlotDebugData {
name: "",
ty: Bool,
},
SlotDebugData {
name: ".0",
ty: UInt<2>,
},
SlotDebugData {
name: ".1",
ty: UInt<8>,
},
SlotDebugData {
name: "",
ty: UInt<2>,
},
SlotDebugData {
name: "",
ty: UInt<10>,
},
SlotDebugData {
name: "",
ty: UInt<10>,
},
SlotDebugData {
name: "",
ty: UInt<10>,
},
SlotDebugData {
name: "",
ty: Enum {
A(UInt<8>),
B(UInt<8>),
C(UInt<8>),
},
},
SlotDebugData {
name: "",
ty: UInt<8>,
},
SlotDebugData {
name: "",
ty: Bool,
},
SlotDebugData {
name: ".0",
ty: UInt<2>,
},
SlotDebugData {
name: ".1",
ty: UInt<8>,
},
SlotDebugData {
name: "",
ty: UInt<2>,
},
SlotDebugData {
name: "",
ty: UInt<10>,
},
SlotDebugData {
name: "",
ty: UInt<10>,
},
SlotDebugData {
name: "",
ty: UInt<10>,
},
SlotDebugData {
name: "",
ty: Enum {
A(UInt<8>),
B(UInt<8>),
C(UInt<8>),
},
},
SlotDebugData {
name: ".0",
ty: UInt<2>,
},
SlotDebugData {
name: ".1",
ty: UInt<8>,
},
SlotDebugData {
name: "",
ty: UInt<2>,
},
SlotDebugData {
name: "",
ty: UInt<10>,
},
SlotDebugData {
name: "",
ty: UInt<10>,
},
SlotDebugData {
name: "",
ty: UInt<10>,
},
SlotDebugData {
name: "",
ty: Enum {
A(UInt<8>),
B(UInt<8>),
C(UInt<8>),
},
},
SlotDebugData {
name: "",
ty: UInt<8>,
},
],
..
},
sim_only_slots: StatePartLayout<SimOnlySlots> {
len: 0,
debug_data: [],
layout_data: [],
..
},
},
memories: StatePartLayout<Memories> {
len: 0,
debug_data: [],
layout_data: [],
..
},
},
insns: [
// at: module-XXXXXXXXXX.rs:1:1
0: Const {
dest: StatePartIndex<BigSlots>(32), // (0x2) SlotDebugData { name: "", ty: UInt<8> },
value: 0x2,
},
1: Const {
dest: StatePartIndex<BigSlots>(27), // (0x2) SlotDebugData { name: "", ty: UInt<2> },
value: 0x2,
},
2: Copy {
dest: StatePartIndex<BigSlots>(25), // (0x2) SlotDebugData { name: ".0", ty: UInt<2> },
src: StatePartIndex<BigSlots>(27), // (0x2) SlotDebugData { name: "", ty: UInt<2> },
},
3: Copy {
dest: StatePartIndex<BigSlots>(26), // (0xe1) SlotDebugData { name: ".1", ty: UInt<8> },
src: StatePartIndex<BigSlots>(1), // (0xe1) SlotDebugData { name: "InstantiatedModule(enum_with_simple_body: enum_with_simple_body).enum_with_simple_body::data_in", ty: UInt<8> },
},
4: Shl {
dest: StatePartIndex<BigSlots>(28), // (0x384) SlotDebugData { name: "", ty: UInt<10> },
lhs: StatePartIndex<BigSlots>(26), // (0xe1) SlotDebugData { name: ".1", ty: UInt<8> },
rhs: 2,
},
5: Or {
dest: StatePartIndex<BigSlots>(29), // (0x386) SlotDebugData { name: "", ty: UInt<10> },
lhs: StatePartIndex<BigSlots>(25), // (0x2) SlotDebugData { name: ".0", ty: UInt<2> },
rhs: StatePartIndex<BigSlots>(28), // (0x384) SlotDebugData { name: "", ty: UInt<10> },
},
6: CastToUInt {
dest: StatePartIndex<BigSlots>(30), // (0x386) SlotDebugData { name: "", ty: UInt<10> },
src: StatePartIndex<BigSlots>(29), // (0x386) SlotDebugData { name: "", ty: UInt<10> },
dest_width: 10,
},
7: Copy {
dest: StatePartIndex<BigSlots>(31), // (0x386) SlotDebugData { name: "", ty: Enum {A(UInt<8>), B(UInt<8>), C(UInt<8>)} },
src: StatePartIndex<BigSlots>(30), // (0x386) SlotDebugData { name: "", ty: UInt<10> },
},
8: Const {
dest: StatePartIndex<BigSlots>(20), // (0x1) SlotDebugData { name: "", ty: UInt<2> },
value: 0x1,
},
9: Copy {
dest: StatePartIndex<BigSlots>(18), // (0x1) SlotDebugData { name: ".0", ty: UInt<2> },
src: StatePartIndex<BigSlots>(20), // (0x1) SlotDebugData { name: "", ty: UInt<2> },
},
10: Copy {
dest: StatePartIndex<BigSlots>(19), // (0xe1) SlotDebugData { name: ".1", ty: UInt<8> },
src: StatePartIndex<BigSlots>(1), // (0xe1) SlotDebugData { name: "InstantiatedModule(enum_with_simple_body: enum_with_simple_body).enum_with_simple_body::data_in", ty: UInt<8> },
},
11: Shl {
dest: StatePartIndex<BigSlots>(21), // (0x384) SlotDebugData { name: "", ty: UInt<10> },
lhs: StatePartIndex<BigSlots>(19), // (0xe1) SlotDebugData { name: ".1", ty: UInt<8> },
rhs: 2,
},
12: Or {
dest: StatePartIndex<BigSlots>(22), // (0x385) SlotDebugData { name: "", ty: UInt<10> },
lhs: StatePartIndex<BigSlots>(18), // (0x1) SlotDebugData { name: ".0", ty: UInt<2> },
rhs: StatePartIndex<BigSlots>(21), // (0x384) SlotDebugData { name: "", ty: UInt<10> },
},
13: CastToUInt {
dest: StatePartIndex<BigSlots>(23), // (0x385) SlotDebugData { name: "", ty: UInt<10> },
src: StatePartIndex<BigSlots>(22), // (0x385) SlotDebugData { name: "", ty: UInt<10> },
dest_width: 10,
},
14: Copy {
dest: StatePartIndex<BigSlots>(24), // (0x385) SlotDebugData { name: "", ty: Enum {A(UInt<8>), B(UInt<8>), C(UInt<8>)} },
src: StatePartIndex<BigSlots>(23), // (0x385) SlotDebugData { name: "", ty: UInt<10> },
},
15: Const {
dest: StatePartIndex<BigSlots>(16), // (0x1) SlotDebugData { name: "", ty: UInt<8> },
value: 0x1,
},
16: CmpEq {
dest: StatePartIndex<BigSlots>(17), // (0x0) SlotDebugData { name: "", ty: Bool },
lhs: StatePartIndex<BigSlots>(0), // (0x2) SlotDebugData { name: "InstantiatedModule(enum_with_simple_body: enum_with_simple_body).enum_with_simple_body::which_in", ty: UInt<8> },
rhs: StatePartIndex<BigSlots>(16), // (0x1) SlotDebugData { name: "", ty: UInt<8> },
},
17: Const {
dest: StatePartIndex<BigSlots>(11), // (0x0) SlotDebugData { name: "", ty: UInt<2> },
value: 0x0,
},
18: Copy {
dest: StatePartIndex<BigSlots>(9), // (0x0) SlotDebugData { name: ".0", ty: UInt<2> },
src: StatePartIndex<BigSlots>(11), // (0x0) SlotDebugData { name: "", ty: UInt<2> },
},
19: Copy {
dest: StatePartIndex<BigSlots>(10), // (0xe1) SlotDebugData { name: ".1", ty: UInt<8> },
src: StatePartIndex<BigSlots>(1), // (0xe1) SlotDebugData { name: "InstantiatedModule(enum_with_simple_body: enum_with_simple_body).enum_with_simple_body::data_in", ty: UInt<8> },
},
20: Shl {
dest: StatePartIndex<BigSlots>(12), // (0x384) SlotDebugData { name: "", ty: UInt<10> },
lhs: StatePartIndex<BigSlots>(10), // (0xe1) SlotDebugData { name: ".1", ty: UInt<8> },
rhs: 2,
},
21: Or {
dest: StatePartIndex<BigSlots>(13), // (0x384) SlotDebugData { name: "", ty: UInt<10> },
lhs: StatePartIndex<BigSlots>(9), // (0x0) SlotDebugData { name: ".0", ty: UInt<2> },
rhs: StatePartIndex<BigSlots>(12), // (0x384) SlotDebugData { name: "", ty: UInt<10> },
},
22: CastToUInt {
dest: StatePartIndex<BigSlots>(14), // (0x384) SlotDebugData { name: "", ty: UInt<10> },
src: StatePartIndex<BigSlots>(13), // (0x384) SlotDebugData { name: "", ty: UInt<10> },
dest_width: 10,
},
23: Copy {
dest: StatePartIndex<BigSlots>(15), // (0x384) SlotDebugData { name: "", ty: Enum {A(UInt<8>), B(UInt<8>), C(UInt<8>)} },
src: StatePartIndex<BigSlots>(14), // (0x384) SlotDebugData { name: "", ty: UInt<10> },
},
24: Const {
dest: StatePartIndex<BigSlots>(7), // (0x0) SlotDebugData { name: "", ty: UInt<8> },
value: 0x0,
},
25: CmpEq {
dest: StatePartIndex<BigSlots>(8), // (0x0) SlotDebugData { name: "", ty: Bool },
lhs: StatePartIndex<BigSlots>(0), // (0x2) SlotDebugData { name: "InstantiatedModule(enum_with_simple_body: enum_with_simple_body).enum_with_simple_body::which_in", ty: UInt<8> },
rhs: StatePartIndex<BigSlots>(7), // (0x0) SlotDebugData { name: "", ty: UInt<8> },
},
// at: module-XXXXXXXXXX.rs:7:1
26: BranchIfZero {
target: 28,
value: StatePartIndex<BigSlots>(8), // (0x0) SlotDebugData { name: "", ty: Bool },
},
// at: module-XXXXXXXXXX.rs:8:1
27: Copy {
dest: StatePartIndex<BigSlots>(4), // (0x386) SlotDebugData { name: "InstantiatedModule(enum_with_simple_body: enum_with_simple_body).enum_with_simple_body::enum_out", ty: Enum {A(UInt<8>), B(UInt<8>), C(UInt<8>)} },
src: StatePartIndex<BigSlots>(15), // (0x384) SlotDebugData { name: "", ty: Enum {A(UInt<8>), B(UInt<8>), C(UInt<8>)} },
},
// at: module-XXXXXXXXXX.rs:7:1
28: BranchIfNonZero {
target: 33,
value: StatePartIndex<BigSlots>(8), // (0x0) SlotDebugData { name: "", ty: Bool },
},
// at: module-XXXXXXXXXX.rs:9:1
29: BranchIfZero {
target: 31,
value: StatePartIndex<BigSlots>(17), // (0x0) SlotDebugData { name: "", ty: Bool },
},
// at: module-XXXXXXXXXX.rs:10:1
30: Copy {
dest: StatePartIndex<BigSlots>(4), // (0x386) SlotDebugData { name: "InstantiatedModule(enum_with_simple_body: enum_with_simple_body).enum_with_simple_body::enum_out", ty: Enum {A(UInt<8>), B(UInt<8>), C(UInt<8>)} },
src: StatePartIndex<BigSlots>(24), // (0x385) SlotDebugData { name: "", ty: Enum {A(UInt<8>), B(UInt<8>), C(UInt<8>)} },
},
// at: module-XXXXXXXXXX.rs:9:1
31: BranchIfNonZero {
target: 33,
value: StatePartIndex<BigSlots>(17), // (0x0) SlotDebugData { name: "", ty: Bool },
},
// at: module-XXXXXXXXXX.rs:11:1
32: Copy {
dest: StatePartIndex<BigSlots>(4), // (0x386) SlotDebugData { name: "InstantiatedModule(enum_with_simple_body: enum_with_simple_body).enum_with_simple_body::enum_out", ty: Enum {A(UInt<8>), B(UInt<8>), C(UInt<8>)} },
src: StatePartIndex<BigSlots>(31), // (0x386) SlotDebugData { name: "", ty: Enum {A(UInt<8>), B(UInt<8>), C(UInt<8>)} },
},
// at: module-XXXXXXXXXX.rs:1:1
33: Copy {
dest: StatePartIndex<BigSlots>(5), // (0x386) SlotDebugData { name: "", ty: UInt<10> },
src: StatePartIndex<BigSlots>(4), // (0x386) SlotDebugData { name: "InstantiatedModule(enum_with_simple_body: enum_with_simple_body).enum_with_simple_body::enum_out", ty: Enum {A(UInt<8>), B(UInt<8>), C(UInt<8>)} },
},
34: SliceInt {
dest: StatePartIndex<BigSlots>(6), // (0xe1) SlotDebugData { name: "", ty: UInt<8> },
src: StatePartIndex<BigSlots>(5), // (0x386) SlotDebugData { name: "", ty: UInt<10> },
start: 2,
len: 8,
},
// at: module-XXXXXXXXXX.rs:6:1
35: AndBigWithSmallImmediate {
dest: StatePartIndex<SmallSlots>(0), // (0x2 2) SlotDebugData { name: "", ty: Enum {A, B, C} },
lhs: StatePartIndex<BigSlots>(4), // (0x386) SlotDebugData { name: "InstantiatedModule(enum_with_simple_body: enum_with_simple_body).enum_with_simple_body::enum_out", ty: Enum {A(UInt<8>), B(UInt<8>), C(UInt<8>)} },
rhs: 0x3,
},
// at: module-XXXXXXXXXX.rs:12:1
36: BranchIfSmallNeImmediate {
target: 39,
lhs: StatePartIndex<SmallSlots>(0), // (0x2 2) SlotDebugData { name: "", ty: Enum {A, B, C} },
rhs: 0x0,
},
// at: module-XXXXXXXXXX.rs:13:1
37: Copy {
dest: StatePartIndex<BigSlots>(2), // (0x2) SlotDebugData { name: "InstantiatedModule(enum_with_simple_body: enum_with_simple_body).enum_with_simple_body::which_out", ty: UInt<8> },
src: StatePartIndex<BigSlots>(7), // (0x0) SlotDebugData { name: "", ty: UInt<8> },
},
// at: module-XXXXXXXXXX.rs:14:1
38: Copy {
dest: StatePartIndex<BigSlots>(3), // (0xe1) SlotDebugData { name: "InstantiatedModule(enum_with_simple_body: enum_with_simple_body).enum_with_simple_body::data_out", ty: UInt<8> },
src: StatePartIndex<BigSlots>(6), // (0xe1) SlotDebugData { name: "", ty: UInt<8> },
},
// at: module-XXXXXXXXXX.rs:12:1
39: BranchIfSmallNeImmediate {
target: 42,
lhs: StatePartIndex<SmallSlots>(0), // (0x2 2) SlotDebugData { name: "", ty: Enum {A, B, C} },
rhs: 0x1,
},
// at: module-XXXXXXXXXX.rs:15:1
40: Copy {
dest: StatePartIndex<BigSlots>(2), // (0x2) SlotDebugData { name: "InstantiatedModule(enum_with_simple_body: enum_with_simple_body).enum_with_simple_body::which_out", ty: UInt<8> },
src: StatePartIndex<BigSlots>(16), // (0x1) SlotDebugData { name: "", ty: UInt<8> },
},
// at: module-XXXXXXXXXX.rs:16:1
41: Copy {
dest: StatePartIndex<BigSlots>(3), // (0xe1) SlotDebugData { name: "InstantiatedModule(enum_with_simple_body: enum_with_simple_body).enum_with_simple_body::data_out", ty: UInt<8> },
src: StatePartIndex<BigSlots>(6), // (0xe1) SlotDebugData { name: "", ty: UInt<8> },
},
// at: module-XXXXXXXXXX.rs:12:1
42: BranchIfSmallNeImmediate {
target: 45,
lhs: StatePartIndex<SmallSlots>(0), // (0x2 2) SlotDebugData { name: "", ty: Enum {A, B, C} },
rhs: 0x2,
},
// at: module-XXXXXXXXXX.rs:17:1
43: Copy {
dest: StatePartIndex<BigSlots>(2), // (0x2) SlotDebugData { name: "InstantiatedModule(enum_with_simple_body: enum_with_simple_body).enum_with_simple_body::which_out", ty: UInt<8> },
src: StatePartIndex<BigSlots>(32), // (0x2) SlotDebugData { name: "", ty: UInt<8> },
},
// at: module-XXXXXXXXXX.rs:18:1
44: Copy {
dest: StatePartIndex<BigSlots>(3), // (0xe1) SlotDebugData { name: "InstantiatedModule(enum_with_simple_body: enum_with_simple_body).enum_with_simple_body::data_out", ty: UInt<8> },
src: StatePartIndex<BigSlots>(6), // (0xe1) SlotDebugData { name: "", ty: UInt<8> },
},
// at: module-XXXXXXXXXX.rs:1:1
45: Return,
],
..
},
pc: 45,
memory_write_log: [],
memories: StatePart {
value: [],
},
small_slots: StatePart {
value: [
2,
],
},
big_slots: StatePart {
value: [
2,
225,
2 (modified),
225 (modified),
902,
902,
225,
0,
0,
0,
225,
0,
900,
900,
900,
900,
1,
0,
1,
225,
1,
900,
901,
901,
901,
2,
225,
2,
900,
902,
902,
902,
2,
],
},
sim_only_slots: StatePart {
value: [],
},
},
io: Instance {
name: <simulator>::enum_with_simple_body,
instantiated: Module {
name: enum_with_simple_body,
..
},
},
main_module: SimulationModuleState {
base_targets: [
Instance {
name: <simulator>::enum_with_simple_body,
instantiated: Module {
name: enum_with_simple_body,
..
},
}.which_in,
Instance {
name: <simulator>::enum_with_simple_body,
instantiated: Module {
name: enum_with_simple_body,
..
},
}.data_in,
Instance {
name: <simulator>::enum_with_simple_body,
instantiated: Module {
name: enum_with_simple_body,
..
},
}.which_out,
Instance {
name: <simulator>::enum_with_simple_body,
instantiated: Module {
name: enum_with_simple_body,
..
},
}.data_out,
Instance {
name: <simulator>::enum_with_simple_body,
instantiated: Module {
name: enum_with_simple_body,
..
},
}.enum_out,
],
uninitialized_ios: {},
io_targets: {
Instance {
name: <simulator>::enum_with_simple_body,
instantiated: Module {
name: enum_with_simple_body,
..
},
}.data_in,
Instance {
name: <simulator>::enum_with_simple_body,
instantiated: Module {
name: enum_with_simple_body,
..
},
}.data_out,
Instance {
name: <simulator>::enum_with_simple_body,
instantiated: Module {
name: enum_with_simple_body,
..
},
}.enum_out,
Instance {
name: <simulator>::enum_with_simple_body,
instantiated: Module {
name: enum_with_simple_body,
..
},
}.which_in,
Instance {
name: <simulator>::enum_with_simple_body,
instantiated: Module {
name: enum_with_simple_body,
..
},
}.which_out,
},
did_initial_settle: true,
clocks_for_past: {},
},
extern_modules: [],
trace_decls: TraceModule {
name: "enum_with_simple_body",
children: [
TraceModuleIO {
name: "which_in",
child: TraceUInt {
location: TraceScalarId(0),
name: "which_in",
ty: UInt<8>,
flow: Source,
},
ty: UInt<8>,
flow: Source,
},
TraceModuleIO {
name: "data_in",
child: TraceUInt {
location: TraceScalarId(1),
name: "data_in",
ty: UInt<8>,
flow: Source,
},
ty: UInt<8>,
flow: Source,
},
TraceModuleIO {
name: "which_out",
child: TraceUInt {
location: TraceScalarId(2),
name: "which_out",
ty: UInt<8>,
flow: Sink,
},
ty: UInt<8>,
flow: Sink,
},
TraceModuleIO {
name: "data_out",
child: TraceUInt {
location: TraceScalarId(3),
name: "data_out",
ty: UInt<8>,
flow: Sink,
},
ty: UInt<8>,
flow: Sink,
},
TraceModuleIO {
name: "enum_out",
child: TraceEnumWithFields {
name: "enum_out",
discriminant: TraceEnumDiscriminant {
location: TraceScalarId(4),
name: "$tag",
ty: Enum {
A(UInt<8>),
B(UInt<8>),
C(UInt<8>),
},
flow: Sink,
},
non_empty_fields: [
TraceUInt {
location: TraceScalarId(5),
name: "A",
ty: UInt<8>,
flow: Source,
},
TraceUInt {
location: TraceScalarId(6),
name: "B",
ty: UInt<8>,
flow: Source,
},
TraceUInt {
location: TraceScalarId(7),
name: "C",
ty: UInt<8>,
flow: Source,
},
],
ty: Enum {
A(UInt<8>),
B(UInt<8>),
C(UInt<8>),
},
flow: Sink,
},
ty: Enum {
A(UInt<8>),
B(UInt<8>),
C(UInt<8>),
},
flow: Sink,
},
],
},
traces: [
SimTrace {
id: TraceScalarId(0),
kind: BigUInt {
index: StatePartIndex<BigSlots>(0),
ty: UInt<8>,
},
maybe_changed: true,
state: 0x02,
last_state: 0x02,
},
SimTrace {
id: TraceScalarId(1),
kind: BigUInt {
index: StatePartIndex<BigSlots>(1),
ty: UInt<8>,
},
maybe_changed: true,
state: 0xe1,
last_state: 0xb4,
},
SimTrace {
id: TraceScalarId(2),
kind: BigUInt {
index: StatePartIndex<BigSlots>(2),
ty: UInt<8>,
},
maybe_changed: true,
state: 0x02,
last_state: 0x02,
},
SimTrace {
id: TraceScalarId(3),
kind: BigUInt {
index: StatePartIndex<BigSlots>(3),
ty: UInt<8>,
},
maybe_changed: true,
state: 0xe1,
last_state: 0xb4,
},
SimTrace {
id: TraceScalarId(4),
kind: EnumDiscriminant {
index: StatePartIndex<SmallSlots>(0),
ty: Enum {
A(UInt<8>),
B(UInt<8>),
C(UInt<8>),
},
},
maybe_changed: true,
state: 0x2,
last_state: 0x2,
},
SimTrace {
id: TraceScalarId(5),
kind: BigUInt {
index: StatePartIndex<BigSlots>(6),
ty: UInt<8>,
},
maybe_changed: true,
state: 0xe1,
last_state: 0xb4,
},
SimTrace {
id: TraceScalarId(6),
kind: BigUInt {
index: StatePartIndex<BigSlots>(6),
ty: UInt<8>,
},
maybe_changed: true,
state: 0xe1,
last_state: 0xb4,
},
SimTrace {
id: TraceScalarId(7),
kind: BigUInt {
index: StatePartIndex<BigSlots>(6),
ty: UInt<8>,
},
maybe_changed: true,
state: 0xe1,
last_state: 0xb4,
},
],
trace_memories: {},
trace_writers: [
Running(
VcdWriter {
finished_init: true,
timescale: 1 ps,
..
},
),
],
clocks_triggered: [],
event_queue: EventQueue(EventQueueData {
instant: 18 μs,
events: {},
}),
waiting_sensitivity_sets_by_address: {},
waiting_sensitivity_sets_by_compiled_value: {},
..
}

View file

@ -0,0 +1,133 @@
$timescale 1 ps $end
$scope module enum_with_simple_body $end
$var wire 8 J&-ne which_in $end
$var wire 8 \7mo/ data_in $end
$var wire 8 ,`>ir which_out $end
$var wire 8 0_gMP data_out $end
$scope struct enum_out $end
$var string 1 kFH/w \$tag $end
$var wire 8 |EI_= A $end
$var wire 8 !pRd4 B $end
$var wire 8 &RAbd C $end
$upscope $end
$upscope $end
$enddefinitions $end
$dumpvars
b0 J&-ne
b0 \7mo/
b0 ,`>ir
b0 0_gMP
sA\x20(0) kFH/w
b0 |EI_=
b0 !pRd4
b0 &RAbd
$end
#1000000
b101101 \7mo/
b101101 0_gMP
b101101 |EI_=
b101101 !pRd4
b101101 &RAbd
#2000000
b1011010 \7mo/
b1011010 0_gMP
b1011010 |EI_=
b1011010 !pRd4
b1011010 &RAbd
#3000000
b10000111 \7mo/
b10000111 0_gMP
b10000111 |EI_=
b10000111 !pRd4
b10000111 &RAbd
#4000000
b10110100 \7mo/
b10110100 0_gMP
b10110100 |EI_=
b10110100 !pRd4
b10110100 &RAbd
#5000000
b11100001 \7mo/
b11100001 0_gMP
b11100001 |EI_=
b11100001 !pRd4
b11100001 &RAbd
#6000000
b1 J&-ne
b0 \7mo/
b1 ,`>ir
b0 0_gMP
sB\x20(1) kFH/w
b0 |EI_=
b0 !pRd4
b0 &RAbd
#7000000
b101101 \7mo/
b101101 0_gMP
b101101 |EI_=
b101101 !pRd4
b101101 &RAbd
#8000000
b1011010 \7mo/
b1011010 0_gMP
b1011010 |EI_=
b1011010 !pRd4
b1011010 &RAbd
#9000000
b10000111 \7mo/
b10000111 0_gMP
b10000111 |EI_=
b10000111 !pRd4
b10000111 &RAbd
#10000000
b10110100 \7mo/
b10110100 0_gMP
b10110100 |EI_=
b10110100 !pRd4
b10110100 &RAbd
#11000000
b11100001 \7mo/
b11100001 0_gMP
b11100001 |EI_=
b11100001 !pRd4
b11100001 &RAbd
#12000000
b10 J&-ne
b0 \7mo/
b10 ,`>ir
b0 0_gMP
sC\x20(2) kFH/w
b0 |EI_=
b0 !pRd4
b0 &RAbd
#13000000
b101101 \7mo/
b101101 0_gMP
b101101 |EI_=
b101101 !pRd4
b101101 &RAbd
#14000000
b1011010 \7mo/
b1011010 0_gMP
b1011010 |EI_=
b1011010 !pRd4
b1011010 &RAbd
#15000000
b10000111 \7mo/
b10000111 0_gMP
b10000111 |EI_=
b10000111 !pRd4
b10000111 &RAbd
#16000000
b10110100 \7mo/
b10110100 0_gMP
b10110100 |EI_=
b10110100 !pRd4
b10110100 &RAbd
#17000000
b11100001 \7mo/
b11100001 0_gMP
b11100001 |EI_=
b11100001 !pRd4
b11100001 &RAbd
#18000000

View file

@ -1746,6 +1746,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(0), index: StatePartIndex<BigSlots>(0),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x0, last_state: 0x0,
}, },
@ -1754,6 +1755,7 @@ Simulation {
kind: BigSyncReset { kind: BigSyncReset {
index: StatePartIndex<BigSlots>(1), index: StatePartIndex<BigSlots>(1),
}, },
maybe_changed: false,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1762,6 +1764,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(2), index: StatePartIndex<BigSlots>(2),
}, },
maybe_changed: false,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1771,6 +1774,7 @@ Simulation {
index: StatePartIndex<BigSlots>(3), index: StatePartIndex<BigSlots>(3),
ty: UInt<2>, ty: UInt<2>,
}, },
maybe_changed: false,
state: 0x2, state: 0x2,
last_state: 0x2, last_state: 0x2,
}, },
@ -1780,6 +1784,7 @@ Simulation {
index: StatePartIndex<BigSlots>(4), index: StatePartIndex<BigSlots>(4),
ty: UInt<4>, ty: UInt<4>,
}, },
maybe_changed: false,
state: 0xf, state: 0xf,
last_state: 0xf, last_state: 0xf,
}, },
@ -1789,6 +1794,7 @@ Simulation {
index: StatePartIndex<BigSlots>(5), index: StatePartIndex<BigSlots>(5),
ty: UInt<2>, ty: UInt<2>,
}, },
maybe_changed: true,
state: 0x2, state: 0x2,
last_state: 0x2, last_state: 0x2,
}, },
@ -1798,6 +1804,7 @@ Simulation {
index: StatePartIndex<BigSlots>(6), index: StatePartIndex<BigSlots>(6),
ty: UInt<4>, ty: UInt<4>,
}, },
maybe_changed: true,
state: 0xf, state: 0xf,
last_state: 0xf, last_state: 0xf,
}, },
@ -1810,6 +1817,7 @@ Simulation {
HdlSome(Bundle {0: UInt<1>, 1: Bool}), HdlSome(Bundle {0: UInt<1>, 1: Bool}),
}, },
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1819,6 +1827,7 @@ Simulation {
index: StatePartIndex<BigSlots>(8), index: StatePartIndex<BigSlots>(8),
ty: UInt<1>, ty: UInt<1>,
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1827,6 +1836,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(9), index: StatePartIndex<BigSlots>(9),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1839,6 +1849,7 @@ Simulation {
HdlSome(Bundle {0: UInt<1>, 1: Bool}), HdlSome(Bundle {0: UInt<1>, 1: Bool}),
}, },
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1848,6 +1859,7 @@ Simulation {
index: StatePartIndex<BigSlots>(16), index: StatePartIndex<BigSlots>(16),
ty: UInt<1>, ty: UInt<1>,
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1856,6 +1868,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(17), index: StatePartIndex<BigSlots>(17),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1869,6 +1882,7 @@ Simulation {
C(Bundle {a: Array<UInt<1>, 2>, b: SInt<2>}), C(Bundle {a: Array<UInt<1>, 2>, b: SInt<2>}),
}, },
}, },
maybe_changed: true,
state: 0x2, state: 0x2,
last_state: 0x2, last_state: 0x2,
}, },
@ -1878,6 +1892,7 @@ Simulation {
index: StatePartIndex<BigSlots>(27), index: StatePartIndex<BigSlots>(27),
ty: UInt<1>, ty: UInt<1>,
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1886,6 +1901,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(28), index: StatePartIndex<BigSlots>(28),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1895,6 +1911,7 @@ Simulation {
index: StatePartIndex<BigSlots>(34), index: StatePartIndex<BigSlots>(34),
ty: UInt<1>, ty: UInt<1>,
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1904,6 +1921,7 @@ Simulation {
index: StatePartIndex<BigSlots>(35), index: StatePartIndex<BigSlots>(35),
ty: UInt<1>, ty: UInt<1>,
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1913,6 +1931,7 @@ Simulation {
index: StatePartIndex<BigSlots>(36), index: StatePartIndex<BigSlots>(36),
ty: SInt<2>, ty: SInt<2>,
}, },
maybe_changed: true,
state: 0x3, state: 0x3,
last_state: 0x3, last_state: 0x3,
}, },

View file

@ -221,6 +221,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(0), index: StatePartIndex<BigSlots>(0),
}, },
maybe_changed: false,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -229,6 +230,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(1), index: StatePartIndex<BigSlots>(1),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x0, last_state: 0x0,
}, },

View file

@ -57,7 +57,7 @@ Simulation {
big_slots: StatePart { big_slots: StatePart {
value: [ value: [
0, 0,
1, 1 (modified),
101, 101,
], ],
}, },
@ -280,6 +280,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(0), index: StatePartIndex<BigSlots>(0),
}, },
maybe_changed: false,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -288,6 +289,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(1), index: StatePartIndex<BigSlots>(1),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -297,6 +299,7 @@ Simulation {
index: StatePartIndex<BigSlots>(2), index: StatePartIndex<BigSlots>(2),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: false,
state: 0x65, state: 0x65,
last_state: 0x65, last_state: 0x65,
}, },

View file

@ -433,7 +433,7 @@ Simulation {
1, 1,
1, 1,
1, 1,
7, 7 (modified),
7, 7,
3, 3,
0, 0,
@ -614,6 +614,7 @@ Simulation {
HdlSome(Array<Bool, 4>), HdlSome(Array<Bool, 4>),
}, },
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -622,6 +623,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(1), index: StatePartIndex<BigSlots>(1),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -630,6 +632,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(2), index: StatePartIndex<BigSlots>(2),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -638,6 +641,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(3), index: StatePartIndex<BigSlots>(3),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -646,6 +650,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(4), index: StatePartIndex<BigSlots>(4),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x0, last_state: 0x0,
}, },
@ -658,6 +663,7 @@ Simulation {
HdlSome(UInt<8>), HdlSome(UInt<8>),
}, },
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -667,6 +673,7 @@ Simulation {
index: StatePartIndex<BigSlots>(17), index: StatePartIndex<BigSlots>(17),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x03, state: 0x03,
last_state: 0x02, last_state: 0x02,
}, },
@ -676,6 +683,7 @@ Simulation {
index: StatePartIndex<BigSlots>(20), index: StatePartIndex<BigSlots>(20),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x03, state: 0x03,
last_state: 0x02, last_state: 0x02,
}, },

File diff suppressed because it is too large Load diff

View file

@ -1168,6 +1168,7 @@ Simulation {
index: StatePartIndex<BigSlots>(0), index: StatePartIndex<BigSlots>(0),
ty: UInt<4>, ty: UInt<4>,
}, },
maybe_changed: true,
state: 0x2, state: 0x2,
last_state: 0x2, last_state: 0x2,
}, },
@ -1176,6 +1177,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(1), index: StatePartIndex<BigSlots>(1),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1184,6 +1186,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(2), index: StatePartIndex<BigSlots>(2),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x1, last_state: 0x1,
}, },
@ -1193,6 +1196,7 @@ Simulation {
index: StatePartIndex<BigSlots>(3), index: StatePartIndex<BigSlots>(3),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0xb0, state: 0xb0,
last_state: 0xb0, last_state: 0xb0,
}, },
@ -1202,6 +1206,7 @@ Simulation {
index: StatePartIndex<BigSlots>(4), index: StatePartIndex<BigSlots>(4),
ty: SInt<8>, ty: SInt<8>,
}, },
maybe_changed: true,
state: 0xc0, state: 0xc0,
last_state: 0xc0, last_state: 0xc0,
}, },
@ -1211,6 +1216,7 @@ Simulation {
index: StatePartIndex<BigSlots>(5), index: StatePartIndex<BigSlots>(5),
ty: UInt<4>, ty: UInt<4>,
}, },
maybe_changed: true,
state: 0x2, state: 0x2,
last_state: 0x2, last_state: 0x2,
}, },
@ -1219,6 +1225,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(6), index: StatePartIndex<BigSlots>(6),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1227,6 +1234,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(7), index: StatePartIndex<BigSlots>(7),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x1, last_state: 0x1,
}, },
@ -1236,6 +1244,7 @@ Simulation {
index: StatePartIndex<BigSlots>(8), index: StatePartIndex<BigSlots>(8),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0xd0, state: 0xd0,
last_state: 0xd0, last_state: 0xd0,
}, },
@ -1245,6 +1254,7 @@ Simulation {
index: StatePartIndex<BigSlots>(9), index: StatePartIndex<BigSlots>(9),
ty: SInt<8>, ty: SInt<8>,
}, },
maybe_changed: true,
state: 0xe0, state: 0xe0,
last_state: 0xe0, last_state: 0xe0,
}, },
@ -1253,6 +1263,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(10), index: StatePartIndex<BigSlots>(10),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1261,6 +1272,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(11), index: StatePartIndex<BigSlots>(11),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1270,6 +1282,7 @@ Simulation {
index: StatePartIndex<BigSlots>(12), index: StatePartIndex<BigSlots>(12),
ty: UInt<4>, ty: UInt<4>,
}, },
maybe_changed: true,
state: 0x2, state: 0x2,
last_state: 0x2, last_state: 0x2,
}, },
@ -1278,6 +1291,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(13), index: StatePartIndex<BigSlots>(13),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1286,6 +1300,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(14), index: StatePartIndex<BigSlots>(14),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x1, last_state: 0x1,
}, },
@ -1295,6 +1310,7 @@ Simulation {
index: StatePartIndex<BigSlots>(15), index: StatePartIndex<BigSlots>(15),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0xb0, state: 0xb0,
last_state: 0xb0, last_state: 0xb0,
}, },
@ -1304,6 +1320,7 @@ Simulation {
index: StatePartIndex<BigSlots>(16), index: StatePartIndex<BigSlots>(16),
ty: SInt<8>, ty: SInt<8>,
}, },
maybe_changed: true,
state: 0xc0, state: 0xc0,
last_state: 0xc0, last_state: 0xc0,
}, },
@ -1313,6 +1330,7 @@ Simulation {
index: StatePartIndex<BigSlots>(17), index: StatePartIndex<BigSlots>(17),
ty: UInt<4>, ty: UInt<4>,
}, },
maybe_changed: true,
state: 0x2, state: 0x2,
last_state: 0x2, last_state: 0x2,
}, },
@ -1321,6 +1339,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(18), index: StatePartIndex<BigSlots>(18),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1329,6 +1348,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(19), index: StatePartIndex<BigSlots>(19),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x1, last_state: 0x1,
}, },
@ -1338,6 +1358,7 @@ Simulation {
index: StatePartIndex<BigSlots>(20), index: StatePartIndex<BigSlots>(20),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0xd0, state: 0xd0,
last_state: 0xd0, last_state: 0xd0,
}, },
@ -1347,6 +1368,7 @@ Simulation {
index: StatePartIndex<BigSlots>(21), index: StatePartIndex<BigSlots>(21),
ty: SInt<8>, ty: SInt<8>,
}, },
maybe_changed: true,
state: 0xe0, state: 0xe0,
last_state: 0xe0, last_state: 0xe0,
}, },
@ -1355,6 +1377,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(22), index: StatePartIndex<BigSlots>(22),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1363,6 +1386,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(23), index: StatePartIndex<BigSlots>(23),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },

View file

@ -943,6 +943,7 @@ Simulation {
index: StatePartIndex<BigSlots>(0), index: StatePartIndex<BigSlots>(0),
ty: UInt<3>, ty: UInt<3>,
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -951,6 +952,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(1), index: StatePartIndex<BigSlots>(1),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -959,6 +961,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(2), index: StatePartIndex<BigSlots>(2),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x1, last_state: 0x1,
}, },
@ -968,6 +971,7 @@ Simulation {
index: StatePartIndex<BigSlots>(3), index: StatePartIndex<BigSlots>(3),
ty: UInt<2>, ty: UInt<2>,
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -976,6 +980,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(4), index: StatePartIndex<BigSlots>(4),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -985,6 +990,7 @@ Simulation {
index: StatePartIndex<BigSlots>(5), index: StatePartIndex<BigSlots>(5),
ty: UInt<2>, ty: UInt<2>,
}, },
maybe_changed: false,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -993,6 +999,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(6), index: StatePartIndex<BigSlots>(6),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1002,6 +1009,7 @@ Simulation {
index: StatePartIndex<BigSlots>(7), index: StatePartIndex<BigSlots>(7),
ty: UInt<3>, ty: UInt<3>,
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1010,6 +1018,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(8), index: StatePartIndex<BigSlots>(8),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1018,6 +1027,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(9), index: StatePartIndex<BigSlots>(9),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x1, last_state: 0x1,
}, },
@ -1030,6 +1040,7 @@ Simulation {
HdlSome(Bool), HdlSome(Bool),
}, },
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1038,6 +1049,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(16), index: StatePartIndex<BigSlots>(16),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1046,6 +1058,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(11), index: StatePartIndex<BigSlots>(11),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1058,6 +1071,7 @@ Simulation {
HdlSome(Bool), HdlSome(Bool),
}, },
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1066,6 +1080,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(19), index: StatePartIndex<BigSlots>(19),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1074,6 +1089,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(13), index: StatePartIndex<BigSlots>(13),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },

View file

@ -2391,6 +2391,7 @@ Simulation {
index: StatePartIndex<BigSlots>(0), index: StatePartIndex<BigSlots>(0),
ty: UInt<3>, ty: UInt<3>,
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -2399,6 +2400,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(1), index: StatePartIndex<BigSlots>(1),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -2407,6 +2409,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(2), index: StatePartIndex<BigSlots>(2),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x1, last_state: 0x1,
}, },
@ -2416,6 +2419,7 @@ Simulation {
index: StatePartIndex<BigSlots>(3), index: StatePartIndex<BigSlots>(3),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x00, state: 0x00,
last_state: 0x00, last_state: 0x00,
}, },
@ -2425,6 +2429,7 @@ Simulation {
index: StatePartIndex<BigSlots>(4), index: StatePartIndex<BigSlots>(4),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x00, state: 0x00,
last_state: 0x00, last_state: 0x00,
}, },
@ -2434,6 +2439,7 @@ Simulation {
index: StatePartIndex<BigSlots>(5), index: StatePartIndex<BigSlots>(5),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x00, state: 0x00,
last_state: 0x00, last_state: 0x00,
}, },
@ -2443,6 +2449,7 @@ Simulation {
index: StatePartIndex<BigSlots>(6), index: StatePartIndex<BigSlots>(6),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x00, state: 0x00,
last_state: 0x00, last_state: 0x00,
}, },
@ -2452,6 +2459,7 @@ Simulation {
index: StatePartIndex<BigSlots>(7), index: StatePartIndex<BigSlots>(7),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x00, state: 0x00,
last_state: 0x00, last_state: 0x00,
}, },
@ -2461,6 +2469,7 @@ Simulation {
index: StatePartIndex<BigSlots>(8), index: StatePartIndex<BigSlots>(8),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x00, state: 0x00,
last_state: 0x00, last_state: 0x00,
}, },
@ -2470,6 +2479,7 @@ Simulation {
index: StatePartIndex<BigSlots>(9), index: StatePartIndex<BigSlots>(9),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x00, state: 0x00,
last_state: 0x00, last_state: 0x00,
}, },
@ -2479,6 +2489,7 @@ Simulation {
index: StatePartIndex<BigSlots>(10), index: StatePartIndex<BigSlots>(10),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x00, state: 0x00,
last_state: 0x00, last_state: 0x00,
}, },
@ -2488,6 +2499,7 @@ Simulation {
index: StatePartIndex<BigSlots>(11), index: StatePartIndex<BigSlots>(11),
ty: UInt<3>, ty: UInt<3>,
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -2496,6 +2508,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(12), index: StatePartIndex<BigSlots>(12),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -2504,6 +2517,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(13), index: StatePartIndex<BigSlots>(13),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x1, last_state: 0x1,
}, },
@ -2513,6 +2527,7 @@ Simulation {
index: StatePartIndex<BigSlots>(14), index: StatePartIndex<BigSlots>(14),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x00, state: 0x00,
last_state: 0x00, last_state: 0x00,
}, },
@ -2522,6 +2537,7 @@ Simulation {
index: StatePartIndex<BigSlots>(15), index: StatePartIndex<BigSlots>(15),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x00, state: 0x00,
last_state: 0x00, last_state: 0x00,
}, },
@ -2531,6 +2547,7 @@ Simulation {
index: StatePartIndex<BigSlots>(16), index: StatePartIndex<BigSlots>(16),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x00, state: 0x00,
last_state: 0x00, last_state: 0x00,
}, },
@ -2540,6 +2557,7 @@ Simulation {
index: StatePartIndex<BigSlots>(17), index: StatePartIndex<BigSlots>(17),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x00, state: 0x00,
last_state: 0x00, last_state: 0x00,
}, },
@ -2549,6 +2567,7 @@ Simulation {
index: StatePartIndex<BigSlots>(18), index: StatePartIndex<BigSlots>(18),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x00, state: 0x00,
last_state: 0x00, last_state: 0x00,
}, },
@ -2558,6 +2577,7 @@ Simulation {
index: StatePartIndex<BigSlots>(19), index: StatePartIndex<BigSlots>(19),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x00, state: 0x00,
last_state: 0x00, last_state: 0x00,
}, },
@ -2567,6 +2587,7 @@ Simulation {
index: StatePartIndex<BigSlots>(20), index: StatePartIndex<BigSlots>(20),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x00, state: 0x00,
last_state: 0x00, last_state: 0x00,
}, },
@ -2576,6 +2597,7 @@ Simulation {
index: StatePartIndex<BigSlots>(21), index: StatePartIndex<BigSlots>(21),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x00, state: 0x00,
last_state: 0x00, last_state: 0x00,
}, },
@ -2584,6 +2606,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(22), index: StatePartIndex<BigSlots>(22),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -2592,6 +2615,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(23), index: StatePartIndex<BigSlots>(23),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -2600,6 +2624,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(24), index: StatePartIndex<BigSlots>(24),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -2608,6 +2633,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(25), index: StatePartIndex<BigSlots>(25),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -2616,6 +2642,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(26), index: StatePartIndex<BigSlots>(26),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -2624,6 +2651,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(27), index: StatePartIndex<BigSlots>(27),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -2632,6 +2660,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(28), index: StatePartIndex<BigSlots>(28),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -2640,6 +2669,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(29), index: StatePartIndex<BigSlots>(29),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -2649,6 +2679,7 @@ Simulation {
index: StatePartIndex<BigSlots>(30), index: StatePartIndex<BigSlots>(30),
ty: UInt<3>, ty: UInt<3>,
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -2657,6 +2688,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(31), index: StatePartIndex<BigSlots>(31),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -2665,6 +2697,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(32), index: StatePartIndex<BigSlots>(32),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x1, last_state: 0x1,
}, },
@ -2674,6 +2707,7 @@ Simulation {
index: StatePartIndex<BigSlots>(33), index: StatePartIndex<BigSlots>(33),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x00, state: 0x00,
last_state: 0x00, last_state: 0x00,
}, },
@ -2683,6 +2717,7 @@ Simulation {
index: StatePartIndex<BigSlots>(34), index: StatePartIndex<BigSlots>(34),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x00, state: 0x00,
last_state: 0x00, last_state: 0x00,
}, },
@ -2692,6 +2727,7 @@ Simulation {
index: StatePartIndex<BigSlots>(35), index: StatePartIndex<BigSlots>(35),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x00, state: 0x00,
last_state: 0x00, last_state: 0x00,
}, },
@ -2701,6 +2737,7 @@ Simulation {
index: StatePartIndex<BigSlots>(36), index: StatePartIndex<BigSlots>(36),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x00, state: 0x00,
last_state: 0x00, last_state: 0x00,
}, },
@ -2710,6 +2747,7 @@ Simulation {
index: StatePartIndex<BigSlots>(37), index: StatePartIndex<BigSlots>(37),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x00, state: 0x00,
last_state: 0x00, last_state: 0x00,
}, },
@ -2719,6 +2757,7 @@ Simulation {
index: StatePartIndex<BigSlots>(38), index: StatePartIndex<BigSlots>(38),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x00, state: 0x00,
last_state: 0x00, last_state: 0x00,
}, },
@ -2728,6 +2767,7 @@ Simulation {
index: StatePartIndex<BigSlots>(39), index: StatePartIndex<BigSlots>(39),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x00, state: 0x00,
last_state: 0x00, last_state: 0x00,
}, },
@ -2737,6 +2777,7 @@ Simulation {
index: StatePartIndex<BigSlots>(40), index: StatePartIndex<BigSlots>(40),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x00, state: 0x00,
last_state: 0x00, last_state: 0x00,
}, },
@ -2746,6 +2787,7 @@ Simulation {
index: StatePartIndex<BigSlots>(57), index: StatePartIndex<BigSlots>(57),
ty: UInt<3>, ty: UInt<3>,
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -2754,6 +2796,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(58), index: StatePartIndex<BigSlots>(58),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -2762,6 +2805,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(59), index: StatePartIndex<BigSlots>(59),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x1, last_state: 0x1,
}, },
@ -2771,6 +2815,7 @@ Simulation {
index: StatePartIndex<BigSlots>(60), index: StatePartIndex<BigSlots>(60),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x00, state: 0x00,
last_state: 0x00, last_state: 0x00,
}, },
@ -2780,6 +2825,7 @@ Simulation {
index: StatePartIndex<BigSlots>(61), index: StatePartIndex<BigSlots>(61),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x00, state: 0x00,
last_state: 0x00, last_state: 0x00,
}, },
@ -2789,6 +2835,7 @@ Simulation {
index: StatePartIndex<BigSlots>(62), index: StatePartIndex<BigSlots>(62),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x00, state: 0x00,
last_state: 0x00, last_state: 0x00,
}, },
@ -2798,6 +2845,7 @@ Simulation {
index: StatePartIndex<BigSlots>(63), index: StatePartIndex<BigSlots>(63),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x00, state: 0x00,
last_state: 0x00, last_state: 0x00,
}, },
@ -2807,6 +2855,7 @@ Simulation {
index: StatePartIndex<BigSlots>(64), index: StatePartIndex<BigSlots>(64),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x00, state: 0x00,
last_state: 0x00, last_state: 0x00,
}, },
@ -2816,6 +2865,7 @@ Simulation {
index: StatePartIndex<BigSlots>(65), index: StatePartIndex<BigSlots>(65),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x00, state: 0x00,
last_state: 0x00, last_state: 0x00,
}, },
@ -2825,6 +2875,7 @@ Simulation {
index: StatePartIndex<BigSlots>(66), index: StatePartIndex<BigSlots>(66),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x00, state: 0x00,
last_state: 0x00, last_state: 0x00,
}, },
@ -2834,6 +2885,7 @@ Simulation {
index: StatePartIndex<BigSlots>(67), index: StatePartIndex<BigSlots>(67),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x00, state: 0x00,
last_state: 0x00, last_state: 0x00,
}, },
@ -2842,6 +2894,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(68), index: StatePartIndex<BigSlots>(68),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -2850,6 +2903,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(69), index: StatePartIndex<BigSlots>(69),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -2858,6 +2912,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(70), index: StatePartIndex<BigSlots>(70),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -2866,6 +2921,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(71), index: StatePartIndex<BigSlots>(71),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -2874,6 +2930,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(72), index: StatePartIndex<BigSlots>(72),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -2882,6 +2939,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(73), index: StatePartIndex<BigSlots>(73),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -2890,6 +2948,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(74), index: StatePartIndex<BigSlots>(74),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -2898,6 +2957,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(75), index: StatePartIndex<BigSlots>(75),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },

View file

@ -445,6 +445,7 @@ Simulation {
index: StatePartIndex<BigSlots>(0), index: StatePartIndex<BigSlots>(0),
ty: UInt<4>, ty: UInt<4>,
}, },
maybe_changed: true,
state: 0xa, state: 0xa,
last_state: 0x3, last_state: 0x3,
}, },
@ -454,6 +455,7 @@ Simulation {
index: StatePartIndex<BigSlots>(1), index: StatePartIndex<BigSlots>(1),
ty: SInt<2>, ty: SInt<2>,
}, },
maybe_changed: true,
state: 0x2, state: 0x2,
last_state: 0x3, last_state: 0x3,
}, },
@ -463,6 +465,7 @@ Simulation {
index: StatePartIndex<BigSlots>(2), index: StatePartIndex<BigSlots>(2),
ty: SInt<2>, ty: SInt<2>,
}, },
maybe_changed: true,
state: 0x2, state: 0x2,
last_state: 0x2, last_state: 0x2,
}, },
@ -472,6 +475,7 @@ Simulation {
index: StatePartIndex<BigSlots>(3), index: StatePartIndex<BigSlots>(3),
ty: UInt<4>, ty: UInt<4>,
}, },
maybe_changed: true,
state: 0xf, state: 0xf,
last_state: 0xe, last_state: 0xe,
}, },
@ -481,6 +485,7 @@ Simulation {
index: StatePartIndex<BigSlots>(8), index: StatePartIndex<BigSlots>(8),
ty: UInt<4>, ty: UInt<4>,
}, },
maybe_changed: true,
state: 0xa, state: 0xa,
last_state: 0x3, last_state: 0x3,
}, },
@ -490,6 +495,7 @@ Simulation {
index: StatePartIndex<BigSlots>(9), index: StatePartIndex<BigSlots>(9),
ty: SInt<2>, ty: SInt<2>,
}, },
maybe_changed: true,
state: 0x2, state: 0x2,
last_state: 0x3, last_state: 0x3,
}, },
@ -499,6 +505,7 @@ Simulation {
index: StatePartIndex<BigSlots>(10), index: StatePartIndex<BigSlots>(10),
ty: SInt<2>, ty: SInt<2>,
}, },
maybe_changed: true,
state: 0x2, state: 0x2,
last_state: 0x2, last_state: 0x2,
}, },
@ -508,6 +515,7 @@ Simulation {
index: StatePartIndex<BigSlots>(11), index: StatePartIndex<BigSlots>(11),
ty: UInt<4>, ty: UInt<4>,
}, },
maybe_changed: true,
state: 0xf, state: 0xf,
last_state: 0xe, last_state: 0xe,
}, },
@ -517,6 +525,7 @@ Simulation {
index: StatePartIndex<BigSlots>(4), index: StatePartIndex<BigSlots>(4),
ty: UInt<4>, ty: UInt<4>,
}, },
maybe_changed: true,
state: 0xa, state: 0xa,
last_state: 0x3, last_state: 0x3,
}, },
@ -526,6 +535,7 @@ Simulation {
index: StatePartIndex<BigSlots>(5), index: StatePartIndex<BigSlots>(5),
ty: SInt<2>, ty: SInt<2>,
}, },
maybe_changed: true,
state: 0x2, state: 0x2,
last_state: 0x3, last_state: 0x3,
}, },
@ -535,6 +545,7 @@ Simulation {
index: StatePartIndex<BigSlots>(6), index: StatePartIndex<BigSlots>(6),
ty: SInt<2>, ty: SInt<2>,
}, },
maybe_changed: true,
state: 0x2, state: 0x2,
last_state: 0x2, last_state: 0x2,
}, },
@ -544,6 +555,7 @@ Simulation {
index: StatePartIndex<BigSlots>(7), index: StatePartIndex<BigSlots>(7),
ty: UInt<4>, ty: UInt<4>,
}, },
maybe_changed: true,
state: 0xf, state: 0xf,
last_state: 0xe, last_state: 0xe,
}, },

View file

@ -373,6 +373,7 @@ Simulation {
["a","b"], ["a","b"],
), ),
}, },
maybe_changed: true,
state: PhantomConst, state: PhantomConst,
last_state: PhantomConst, last_state: PhantomConst,
}, },
@ -383,6 +384,7 @@ Simulation {
["a","b"], ["a","b"],
), ),
}, },
maybe_changed: true,
state: PhantomConst, state: PhantomConst,
last_state: PhantomConst, last_state: PhantomConst,
}, },
@ -392,6 +394,7 @@ Simulation {
index: StatePartIndex<BigSlots>(0), index: StatePartIndex<BigSlots>(0),
ty: UInt<0>, ty: UInt<0>,
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -400,6 +403,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(1), index: StatePartIndex<BigSlots>(1),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -408,6 +412,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(2), index: StatePartIndex<BigSlots>(2),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -418,6 +423,7 @@ Simulation {
"mem_element", "mem_element",
), ),
}, },
maybe_changed: true,
state: PhantomConst, state: PhantomConst,
last_state: PhantomConst, last_state: PhantomConst,
}, },

View file

@ -1722,6 +1722,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(0), index: StatePartIndex<BigSlots>(0),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x1, last_state: 0x1,
}, },
@ -1730,6 +1731,7 @@ Simulation {
kind: BigSyncReset { kind: BigSyncReset {
index: StatePartIndex<BigSlots>(1), index: StatePartIndex<BigSlots>(1),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1742,6 +1744,7 @@ Simulation {
HdlSome(UInt<8>), HdlSome(UInt<8>),
}, },
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1751,6 +1754,7 @@ Simulation {
index: StatePartIndex<BigSlots>(5), index: StatePartIndex<BigSlots>(5),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x19, state: 0x19,
last_state: 0x19, last_state: 0x19,
}, },
@ -1759,6 +1763,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(3), index: StatePartIndex<BigSlots>(3),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1771,6 +1776,7 @@ Simulation {
HdlSome(UInt<8>), HdlSome(UInt<8>),
}, },
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1780,6 +1786,7 @@ Simulation {
index: StatePartIndex<BigSlots>(9), index: StatePartIndex<BigSlots>(9),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x19, state: 0x19,
last_state: 0x19, last_state: 0x19,
}, },
@ -1788,6 +1795,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(7), index: StatePartIndex<BigSlots>(7),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1797,6 +1805,7 @@ Simulation {
index: StatePartIndex<BigSlots>(10), index: StatePartIndex<BigSlots>(10),
ty: UInt<1>, ty: UInt<1>,
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1806,6 +1815,7 @@ Simulation {
index: StatePartIndex<BigSlots>(11), index: StatePartIndex<BigSlots>(11),
ty: UInt<0>, ty: UInt<0>,
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1814,6 +1824,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(12), index: StatePartIndex<BigSlots>(12),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1822,6 +1833,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(13), index: StatePartIndex<BigSlots>(13),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x1, last_state: 0x1,
}, },
@ -1831,6 +1843,7 @@ Simulation {
index: StatePartIndex<BigSlots>(14), index: StatePartIndex<BigSlots>(14),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x19, state: 0x19,
last_state: 0x19, last_state: 0x19,
}, },
@ -1840,6 +1853,7 @@ Simulation {
index: StatePartIndex<BigSlots>(15), index: StatePartIndex<BigSlots>(15),
ty: UInt<0>, ty: UInt<0>,
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1848,6 +1862,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(16), index: StatePartIndex<BigSlots>(16),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1856,6 +1871,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(17), index: StatePartIndex<BigSlots>(17),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x1, last_state: 0x1,
}, },
@ -1865,6 +1881,7 @@ Simulation {
index: StatePartIndex<BigSlots>(18), index: StatePartIndex<BigSlots>(18),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x19, state: 0x19,
last_state: 0x19, last_state: 0x19,
}, },
@ -1873,6 +1890,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(19), index: StatePartIndex<BigSlots>(19),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1882,6 +1900,7 @@ Simulation {
index: StatePartIndex<BigSlots>(22), index: StatePartIndex<BigSlots>(22),
ty: UInt<0>, ty: UInt<0>,
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1891,6 +1910,7 @@ Simulation {
index: StatePartIndex<BigSlots>(25), index: StatePartIndex<BigSlots>(25),
ty: UInt<0>, ty: UInt<0>,
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1899,6 +1919,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(27), index: StatePartIndex<BigSlots>(27),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1907,6 +1928,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(30), index: StatePartIndex<BigSlots>(30),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1915,6 +1937,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(31), index: StatePartIndex<BigSlots>(31),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1923,6 +1946,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(32), index: StatePartIndex<BigSlots>(32),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1931,6 +1955,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(33), index: StatePartIndex<BigSlots>(33),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1939,6 +1964,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(34), index: StatePartIndex<BigSlots>(34),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1947,6 +1973,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(36), index: StatePartIndex<BigSlots>(36),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1955,6 +1982,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(39), index: StatePartIndex<BigSlots>(39),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1964,6 +1992,7 @@ Simulation {
index: StatePartIndex<BigSlots>(42), index: StatePartIndex<BigSlots>(42),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x19, state: 0x19,
last_state: 0x19, last_state: 0x19,
}, },
@ -1973,6 +2002,7 @@ Simulation {
index: StatePartIndex<BigSlots>(66), index: StatePartIndex<BigSlots>(66),
ty: UInt<0>, ty: UInt<0>,
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },

View file

@ -1701,6 +1701,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(0), index: StatePartIndex<BigSlots>(0),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x1, last_state: 0x1,
}, },
@ -1709,6 +1710,7 @@ Simulation {
kind: BigSyncReset { kind: BigSyncReset {
index: StatePartIndex<BigSlots>(1), index: StatePartIndex<BigSlots>(1),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1721,6 +1723,7 @@ Simulation {
HdlSome(UInt<8>), HdlSome(UInt<8>),
}, },
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1730,6 +1733,7 @@ Simulation {
index: StatePartIndex<BigSlots>(5), index: StatePartIndex<BigSlots>(5),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x1f, state: 0x1f,
last_state: 0x1f, last_state: 0x1f,
}, },
@ -1738,6 +1742,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(3), index: StatePartIndex<BigSlots>(3),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1750,6 +1755,7 @@ Simulation {
HdlSome(UInt<8>), HdlSome(UInt<8>),
}, },
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1759,6 +1765,7 @@ Simulation {
index: StatePartIndex<BigSlots>(9), index: StatePartIndex<BigSlots>(9),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x1f, state: 0x1f,
last_state: 0x1f, last_state: 0x1f,
}, },
@ -1767,6 +1774,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(7), index: StatePartIndex<BigSlots>(7),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1776,6 +1784,7 @@ Simulation {
index: StatePartIndex<BigSlots>(10), index: StatePartIndex<BigSlots>(10),
ty: UInt<1>, ty: UInt<1>,
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1785,6 +1794,7 @@ Simulation {
index: StatePartIndex<BigSlots>(11), index: StatePartIndex<BigSlots>(11),
ty: UInt<0>, ty: UInt<0>,
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1793,6 +1803,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(12), index: StatePartIndex<BigSlots>(12),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1801,6 +1812,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(13), index: StatePartIndex<BigSlots>(13),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x1, last_state: 0x1,
}, },
@ -1810,6 +1822,7 @@ Simulation {
index: StatePartIndex<BigSlots>(14), index: StatePartIndex<BigSlots>(14),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x1f, state: 0x1f,
last_state: 0x1f, last_state: 0x1f,
}, },
@ -1819,6 +1832,7 @@ Simulation {
index: StatePartIndex<BigSlots>(15), index: StatePartIndex<BigSlots>(15),
ty: UInt<0>, ty: UInt<0>,
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1827,6 +1841,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(16), index: StatePartIndex<BigSlots>(16),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1835,6 +1850,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(17), index: StatePartIndex<BigSlots>(17),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x1, last_state: 0x1,
}, },
@ -1844,6 +1860,7 @@ Simulation {
index: StatePartIndex<BigSlots>(18), index: StatePartIndex<BigSlots>(18),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x1f, state: 0x1f,
last_state: 0x1f, last_state: 0x1f,
}, },
@ -1852,6 +1869,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(19), index: StatePartIndex<BigSlots>(19),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1861,6 +1879,7 @@ Simulation {
index: StatePartIndex<BigSlots>(22), index: StatePartIndex<BigSlots>(22),
ty: UInt<0>, ty: UInt<0>,
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1870,6 +1889,7 @@ Simulation {
index: StatePartIndex<BigSlots>(25), index: StatePartIndex<BigSlots>(25),
ty: UInt<0>, ty: UInt<0>,
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1878,6 +1898,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(27), index: StatePartIndex<BigSlots>(27),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1886,6 +1907,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(30), index: StatePartIndex<BigSlots>(30),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1894,6 +1916,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(31), index: StatePartIndex<BigSlots>(31),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1902,6 +1925,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(32), index: StatePartIndex<BigSlots>(32),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1910,6 +1934,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(33), index: StatePartIndex<BigSlots>(33),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1918,6 +1943,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(34), index: StatePartIndex<BigSlots>(34),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1926,6 +1952,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(36), index: StatePartIndex<BigSlots>(36),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1934,6 +1961,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(39), index: StatePartIndex<BigSlots>(39),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1943,6 +1971,7 @@ Simulation {
index: StatePartIndex<BigSlots>(42), index: StatePartIndex<BigSlots>(42),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x1f, state: 0x1f,
last_state: 0x1f, last_state: 0x1f,
}, },
@ -1952,6 +1981,7 @@ Simulation {
index: StatePartIndex<BigSlots>(64), index: StatePartIndex<BigSlots>(64),
ty: UInt<0>, ty: UInt<0>,
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },

View file

@ -1732,6 +1732,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(0), index: StatePartIndex<BigSlots>(0),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x1, last_state: 0x1,
}, },
@ -1740,6 +1741,7 @@ Simulation {
kind: BigSyncReset { kind: BigSyncReset {
index: StatePartIndex<BigSlots>(1), index: StatePartIndex<BigSlots>(1),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1752,6 +1754,7 @@ Simulation {
HdlSome(UInt<8>), HdlSome(UInt<8>),
}, },
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1761,6 +1764,7 @@ Simulation {
index: StatePartIndex<BigSlots>(5), index: StatePartIndex<BigSlots>(5),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x1f, state: 0x1f,
last_state: 0x1f, last_state: 0x1f,
}, },
@ -1769,6 +1773,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(3), index: StatePartIndex<BigSlots>(3),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1781,6 +1786,7 @@ Simulation {
HdlSome(UInt<8>), HdlSome(UInt<8>),
}, },
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1790,6 +1796,7 @@ Simulation {
index: StatePartIndex<BigSlots>(9), index: StatePartIndex<BigSlots>(9),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x1f, state: 0x1f,
last_state: 0x1f, last_state: 0x1f,
}, },
@ -1798,6 +1805,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(7), index: StatePartIndex<BigSlots>(7),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1807,6 +1815,7 @@ Simulation {
index: StatePartIndex<BigSlots>(10), index: StatePartIndex<BigSlots>(10),
ty: UInt<1>, ty: UInt<1>,
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1816,6 +1825,7 @@ Simulation {
index: StatePartIndex<BigSlots>(11), index: StatePartIndex<BigSlots>(11),
ty: UInt<0>, ty: UInt<0>,
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1824,6 +1834,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(12), index: StatePartIndex<BigSlots>(12),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1832,6 +1843,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(13), index: StatePartIndex<BigSlots>(13),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x1, last_state: 0x1,
}, },
@ -1841,6 +1853,7 @@ Simulation {
index: StatePartIndex<BigSlots>(14), index: StatePartIndex<BigSlots>(14),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x1f, state: 0x1f,
last_state: 0x1f, last_state: 0x1f,
}, },
@ -1850,6 +1863,7 @@ Simulation {
index: StatePartIndex<BigSlots>(15), index: StatePartIndex<BigSlots>(15),
ty: UInt<0>, ty: UInt<0>,
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1858,6 +1872,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(16), index: StatePartIndex<BigSlots>(16),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1866,6 +1881,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(17), index: StatePartIndex<BigSlots>(17),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x1, last_state: 0x1,
}, },
@ -1875,6 +1891,7 @@ Simulation {
index: StatePartIndex<BigSlots>(18), index: StatePartIndex<BigSlots>(18),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x1f, state: 0x1f,
last_state: 0x1f, last_state: 0x1f,
}, },
@ -1883,6 +1900,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(19), index: StatePartIndex<BigSlots>(19),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1892,6 +1910,7 @@ Simulation {
index: StatePartIndex<BigSlots>(22), index: StatePartIndex<BigSlots>(22),
ty: UInt<0>, ty: UInt<0>,
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1901,6 +1920,7 @@ Simulation {
index: StatePartIndex<BigSlots>(25), index: StatePartIndex<BigSlots>(25),
ty: UInt<0>, ty: UInt<0>,
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1909,6 +1929,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(27), index: StatePartIndex<BigSlots>(27),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1917,6 +1938,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(30), index: StatePartIndex<BigSlots>(30),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1925,6 +1947,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(31), index: StatePartIndex<BigSlots>(31),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1933,6 +1956,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(32), index: StatePartIndex<BigSlots>(32),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1941,6 +1965,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(33), index: StatePartIndex<BigSlots>(33),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1949,6 +1974,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(34), index: StatePartIndex<BigSlots>(34),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1957,6 +1983,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(36), index: StatePartIndex<BigSlots>(36),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1965,6 +1992,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(39), index: StatePartIndex<BigSlots>(39),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1974,6 +2002,7 @@ Simulation {
index: StatePartIndex<BigSlots>(42), index: StatePartIndex<BigSlots>(42),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x1f, state: 0x1f,
last_state: 0x1f, last_state: 0x1f,
}, },
@ -1983,6 +2012,7 @@ Simulation {
index: StatePartIndex<BigSlots>(66), index: StatePartIndex<BigSlots>(66),
ty: UInt<0>, ty: UInt<0>,
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },

View file

@ -1711,6 +1711,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(0), index: StatePartIndex<BigSlots>(0),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x1, last_state: 0x1,
}, },
@ -1719,6 +1720,7 @@ Simulation {
kind: BigSyncReset { kind: BigSyncReset {
index: StatePartIndex<BigSlots>(1), index: StatePartIndex<BigSlots>(1),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1731,6 +1733,7 @@ Simulation {
HdlSome(UInt<8>), HdlSome(UInt<8>),
}, },
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1740,6 +1743,7 @@ Simulation {
index: StatePartIndex<BigSlots>(5), index: StatePartIndex<BigSlots>(5),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x23, state: 0x23,
last_state: 0x23, last_state: 0x23,
}, },
@ -1748,6 +1752,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(3), index: StatePartIndex<BigSlots>(3),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1760,6 +1765,7 @@ Simulation {
HdlSome(UInt<8>), HdlSome(UInt<8>),
}, },
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1769,6 +1775,7 @@ Simulation {
index: StatePartIndex<BigSlots>(9), index: StatePartIndex<BigSlots>(9),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x23, state: 0x23,
last_state: 0x23, last_state: 0x23,
}, },
@ -1777,6 +1784,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(7), index: StatePartIndex<BigSlots>(7),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1786,6 +1794,7 @@ Simulation {
index: StatePartIndex<BigSlots>(10), index: StatePartIndex<BigSlots>(10),
ty: UInt<1>, ty: UInt<1>,
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1795,6 +1804,7 @@ Simulation {
index: StatePartIndex<BigSlots>(11), index: StatePartIndex<BigSlots>(11),
ty: UInt<0>, ty: UInt<0>,
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1803,6 +1813,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(12), index: StatePartIndex<BigSlots>(12),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1811,6 +1822,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(13), index: StatePartIndex<BigSlots>(13),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x1, last_state: 0x1,
}, },
@ -1820,6 +1832,7 @@ Simulation {
index: StatePartIndex<BigSlots>(14), index: StatePartIndex<BigSlots>(14),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x23, state: 0x23,
last_state: 0x23, last_state: 0x23,
}, },
@ -1829,6 +1842,7 @@ Simulation {
index: StatePartIndex<BigSlots>(15), index: StatePartIndex<BigSlots>(15),
ty: UInt<0>, ty: UInt<0>,
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1837,6 +1851,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(16), index: StatePartIndex<BigSlots>(16),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1845,6 +1860,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(17), index: StatePartIndex<BigSlots>(17),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x1, last_state: 0x1,
}, },
@ -1854,6 +1870,7 @@ Simulation {
index: StatePartIndex<BigSlots>(18), index: StatePartIndex<BigSlots>(18),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x23, state: 0x23,
last_state: 0x23, last_state: 0x23,
}, },
@ -1862,6 +1879,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(19), index: StatePartIndex<BigSlots>(19),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1871,6 +1889,7 @@ Simulation {
index: StatePartIndex<BigSlots>(22), index: StatePartIndex<BigSlots>(22),
ty: UInt<0>, ty: UInt<0>,
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1880,6 +1899,7 @@ Simulation {
index: StatePartIndex<BigSlots>(25), index: StatePartIndex<BigSlots>(25),
ty: UInt<0>, ty: UInt<0>,
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1888,6 +1908,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(27), index: StatePartIndex<BigSlots>(27),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1896,6 +1917,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(30), index: StatePartIndex<BigSlots>(30),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1904,6 +1926,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(31), index: StatePartIndex<BigSlots>(31),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1912,6 +1935,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(32), index: StatePartIndex<BigSlots>(32),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1920,6 +1944,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(33), index: StatePartIndex<BigSlots>(33),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1928,6 +1953,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(34), index: StatePartIndex<BigSlots>(34),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1936,6 +1962,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(36), index: StatePartIndex<BigSlots>(36),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1944,6 +1971,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(39), index: StatePartIndex<BigSlots>(39),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1953,6 +1981,7 @@ Simulation {
index: StatePartIndex<BigSlots>(42), index: StatePartIndex<BigSlots>(42),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x23, state: 0x23,
last_state: 0x23, last_state: 0x23,
}, },
@ -1962,6 +1991,7 @@ Simulation {
index: StatePartIndex<BigSlots>(64), index: StatePartIndex<BigSlots>(64),
ty: UInt<0>, ty: UInt<0>,
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },

View file

@ -1740,6 +1740,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(0), index: StatePartIndex<BigSlots>(0),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x1, last_state: 0x1,
}, },
@ -1748,6 +1749,7 @@ Simulation {
kind: BigSyncReset { kind: BigSyncReset {
index: StatePartIndex<BigSlots>(1), index: StatePartIndex<BigSlots>(1),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1760,6 +1762,7 @@ Simulation {
HdlSome(UInt<8>), HdlSome(UInt<8>),
}, },
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1769,6 +1772,7 @@ Simulation {
index: StatePartIndex<BigSlots>(5), index: StatePartIndex<BigSlots>(5),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x23, state: 0x23,
last_state: 0x23, last_state: 0x23,
}, },
@ -1777,6 +1781,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(3), index: StatePartIndex<BigSlots>(3),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1789,6 +1794,7 @@ Simulation {
HdlSome(UInt<8>), HdlSome(UInt<8>),
}, },
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1798,6 +1804,7 @@ Simulation {
index: StatePartIndex<BigSlots>(9), index: StatePartIndex<BigSlots>(9),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x23, state: 0x23,
last_state: 0x23, last_state: 0x23,
}, },
@ -1806,6 +1813,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(7), index: StatePartIndex<BigSlots>(7),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1815,6 +1823,7 @@ Simulation {
index: StatePartIndex<BigSlots>(10), index: StatePartIndex<BigSlots>(10),
ty: UInt<2>, ty: UInt<2>,
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1824,6 +1833,7 @@ Simulation {
index: StatePartIndex<BigSlots>(11), index: StatePartIndex<BigSlots>(11),
ty: UInt<1>, ty: UInt<1>,
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1832,6 +1842,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(12), index: StatePartIndex<BigSlots>(12),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1840,6 +1851,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(13), index: StatePartIndex<BigSlots>(13),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x1, last_state: 0x1,
}, },
@ -1849,6 +1861,7 @@ Simulation {
index: StatePartIndex<BigSlots>(14), index: StatePartIndex<BigSlots>(14),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x23, state: 0x23,
last_state: 0x23, last_state: 0x23,
}, },
@ -1858,6 +1871,7 @@ Simulation {
index: StatePartIndex<BigSlots>(15), index: StatePartIndex<BigSlots>(15),
ty: UInt<1>, ty: UInt<1>,
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1866,6 +1880,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(16), index: StatePartIndex<BigSlots>(16),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1874,6 +1889,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(17), index: StatePartIndex<BigSlots>(17),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x1, last_state: 0x1,
}, },
@ -1883,6 +1899,7 @@ Simulation {
index: StatePartIndex<BigSlots>(18), index: StatePartIndex<BigSlots>(18),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x23, state: 0x23,
last_state: 0x23, last_state: 0x23,
}, },
@ -1891,6 +1908,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(19), index: StatePartIndex<BigSlots>(19),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1900,6 +1918,7 @@ Simulation {
index: StatePartIndex<BigSlots>(22), index: StatePartIndex<BigSlots>(22),
ty: UInt<1>, ty: UInt<1>,
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1909,6 +1928,7 @@ Simulation {
index: StatePartIndex<BigSlots>(25), index: StatePartIndex<BigSlots>(25),
ty: UInt<1>, ty: UInt<1>,
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1917,6 +1937,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(27), index: StatePartIndex<BigSlots>(27),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1925,6 +1946,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(30), index: StatePartIndex<BigSlots>(30),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1933,6 +1955,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(31), index: StatePartIndex<BigSlots>(31),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1941,6 +1964,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(32), index: StatePartIndex<BigSlots>(32),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1949,6 +1973,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(33), index: StatePartIndex<BigSlots>(33),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1957,6 +1982,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(34), index: StatePartIndex<BigSlots>(34),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1965,6 +1991,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(36), index: StatePartIndex<BigSlots>(36),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1973,6 +2000,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(39), index: StatePartIndex<BigSlots>(39),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1982,6 +2010,7 @@ Simulation {
index: StatePartIndex<BigSlots>(42), index: StatePartIndex<BigSlots>(42),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x23, state: 0x23,
last_state: 0x23, last_state: 0x23,
}, },
@ -1991,6 +2020,7 @@ Simulation {
index: StatePartIndex<BigSlots>(68), index: StatePartIndex<BigSlots>(68),
ty: UInt<1>, ty: UInt<1>,
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },

View file

@ -1719,6 +1719,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(0), index: StatePartIndex<BigSlots>(0),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x1, last_state: 0x1,
}, },
@ -1727,6 +1728,7 @@ Simulation {
kind: BigSyncReset { kind: BigSyncReset {
index: StatePartIndex<BigSlots>(1), index: StatePartIndex<BigSlots>(1),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1739,6 +1741,7 @@ Simulation {
HdlSome(UInt<8>), HdlSome(UInt<8>),
}, },
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1748,6 +1751,7 @@ Simulation {
index: StatePartIndex<BigSlots>(5), index: StatePartIndex<BigSlots>(5),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x26, state: 0x26,
last_state: 0x26, last_state: 0x26,
}, },
@ -1756,6 +1760,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(3), index: StatePartIndex<BigSlots>(3),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1768,6 +1773,7 @@ Simulation {
HdlSome(UInt<8>), HdlSome(UInt<8>),
}, },
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1777,6 +1783,7 @@ Simulation {
index: StatePartIndex<BigSlots>(9), index: StatePartIndex<BigSlots>(9),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x26, state: 0x26,
last_state: 0x26, last_state: 0x26,
}, },
@ -1785,6 +1792,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(7), index: StatePartIndex<BigSlots>(7),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1794,6 +1802,7 @@ Simulation {
index: StatePartIndex<BigSlots>(10), index: StatePartIndex<BigSlots>(10),
ty: UInt<2>, ty: UInt<2>,
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1803,6 +1812,7 @@ Simulation {
index: StatePartIndex<BigSlots>(11), index: StatePartIndex<BigSlots>(11),
ty: UInt<1>, ty: UInt<1>,
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1811,6 +1821,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(12), index: StatePartIndex<BigSlots>(12),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1819,6 +1830,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(13), index: StatePartIndex<BigSlots>(13),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x1, last_state: 0x1,
}, },
@ -1828,6 +1840,7 @@ Simulation {
index: StatePartIndex<BigSlots>(14), index: StatePartIndex<BigSlots>(14),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x26, state: 0x26,
last_state: 0x26, last_state: 0x26,
}, },
@ -1837,6 +1850,7 @@ Simulation {
index: StatePartIndex<BigSlots>(15), index: StatePartIndex<BigSlots>(15),
ty: UInt<1>, ty: UInt<1>,
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1845,6 +1859,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(16), index: StatePartIndex<BigSlots>(16),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1853,6 +1868,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(17), index: StatePartIndex<BigSlots>(17),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x1, last_state: 0x1,
}, },
@ -1862,6 +1878,7 @@ Simulation {
index: StatePartIndex<BigSlots>(18), index: StatePartIndex<BigSlots>(18),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x26, state: 0x26,
last_state: 0x26, last_state: 0x26,
}, },
@ -1870,6 +1887,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(19), index: StatePartIndex<BigSlots>(19),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1879,6 +1897,7 @@ Simulation {
index: StatePartIndex<BigSlots>(22), index: StatePartIndex<BigSlots>(22),
ty: UInt<1>, ty: UInt<1>,
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1888,6 +1907,7 @@ Simulation {
index: StatePartIndex<BigSlots>(25), index: StatePartIndex<BigSlots>(25),
ty: UInt<1>, ty: UInt<1>,
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1896,6 +1916,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(27), index: StatePartIndex<BigSlots>(27),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1904,6 +1925,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(30), index: StatePartIndex<BigSlots>(30),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1912,6 +1934,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(31), index: StatePartIndex<BigSlots>(31),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1920,6 +1943,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(32), index: StatePartIndex<BigSlots>(32),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1928,6 +1952,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(33), index: StatePartIndex<BigSlots>(33),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1936,6 +1961,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(34), index: StatePartIndex<BigSlots>(34),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1944,6 +1970,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(36), index: StatePartIndex<BigSlots>(36),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1952,6 +1979,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(39), index: StatePartIndex<BigSlots>(39),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1961,6 +1989,7 @@ Simulation {
index: StatePartIndex<BigSlots>(42), index: StatePartIndex<BigSlots>(42),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x26, state: 0x26,
last_state: 0x26, last_state: 0x26,
}, },
@ -1970,6 +1999,7 @@ Simulation {
index: StatePartIndex<BigSlots>(66), index: StatePartIndex<BigSlots>(66),
ty: UInt<1>, ty: UInt<1>,
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },

View file

@ -1750,6 +1750,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(0), index: StatePartIndex<BigSlots>(0),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x1, last_state: 0x1,
}, },
@ -1758,6 +1759,7 @@ Simulation {
kind: BigSyncReset { kind: BigSyncReset {
index: StatePartIndex<BigSlots>(1), index: StatePartIndex<BigSlots>(1),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1770,6 +1772,7 @@ Simulation {
HdlSome(UInt<8>), HdlSome(UInt<8>),
}, },
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1779,6 +1782,7 @@ Simulation {
index: StatePartIndex<BigSlots>(5), index: StatePartIndex<BigSlots>(5),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x27, state: 0x27,
last_state: 0x27, last_state: 0x27,
}, },
@ -1787,6 +1791,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(3), index: StatePartIndex<BigSlots>(3),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1799,6 +1804,7 @@ Simulation {
HdlSome(UInt<8>), HdlSome(UInt<8>),
}, },
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1808,6 +1814,7 @@ Simulation {
index: StatePartIndex<BigSlots>(9), index: StatePartIndex<BigSlots>(9),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x26, state: 0x26,
last_state: 0x26, last_state: 0x26,
}, },
@ -1816,6 +1823,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(7), index: StatePartIndex<BigSlots>(7),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1825,6 +1833,7 @@ Simulation {
index: StatePartIndex<BigSlots>(10), index: StatePartIndex<BigSlots>(10),
ty: UInt<2>, ty: UInt<2>,
}, },
maybe_changed: true,
state: 0x2, state: 0x2,
last_state: 0x2, last_state: 0x2,
}, },
@ -1834,6 +1843,7 @@ Simulation {
index: StatePartIndex<BigSlots>(11), index: StatePartIndex<BigSlots>(11),
ty: UInt<1>, ty: UInt<1>,
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1842,6 +1852,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(12), index: StatePartIndex<BigSlots>(12),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1850,6 +1861,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(13), index: StatePartIndex<BigSlots>(13),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x1, last_state: 0x1,
}, },
@ -1859,6 +1871,7 @@ Simulation {
index: StatePartIndex<BigSlots>(14), index: StatePartIndex<BigSlots>(14),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x26, state: 0x26,
last_state: 0x26, last_state: 0x26,
}, },
@ -1868,6 +1881,7 @@ Simulation {
index: StatePartIndex<BigSlots>(15), index: StatePartIndex<BigSlots>(15),
ty: UInt<1>, ty: UInt<1>,
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1876,6 +1890,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(16), index: StatePartIndex<BigSlots>(16),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1884,6 +1899,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(17), index: StatePartIndex<BigSlots>(17),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x1, last_state: 0x1,
}, },
@ -1893,6 +1909,7 @@ Simulation {
index: StatePartIndex<BigSlots>(18), index: StatePartIndex<BigSlots>(18),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x27, state: 0x27,
last_state: 0x27, last_state: 0x27,
}, },
@ -1901,6 +1918,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(19), index: StatePartIndex<BigSlots>(19),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1910,6 +1928,7 @@ Simulation {
index: StatePartIndex<BigSlots>(22), index: StatePartIndex<BigSlots>(22),
ty: UInt<1>, ty: UInt<1>,
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1919,6 +1938,7 @@ Simulation {
index: StatePartIndex<BigSlots>(25), index: StatePartIndex<BigSlots>(25),
ty: UInt<1>, ty: UInt<1>,
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1927,6 +1947,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(27), index: StatePartIndex<BigSlots>(27),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1935,6 +1956,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(30), index: StatePartIndex<BigSlots>(30),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1943,6 +1965,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(31), index: StatePartIndex<BigSlots>(31),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1951,6 +1974,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(32), index: StatePartIndex<BigSlots>(32),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1959,6 +1983,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(33), index: StatePartIndex<BigSlots>(33),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1967,6 +1992,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(34), index: StatePartIndex<BigSlots>(34),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1975,6 +2001,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(36), index: StatePartIndex<BigSlots>(36),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1983,6 +2010,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(39), index: StatePartIndex<BigSlots>(39),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1992,6 +2020,7 @@ Simulation {
index: StatePartIndex<BigSlots>(42), index: StatePartIndex<BigSlots>(42),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x27, state: 0x27,
last_state: 0x27, last_state: 0x27,
}, },
@ -2001,6 +2030,7 @@ Simulation {
index: StatePartIndex<BigSlots>(68), index: StatePartIndex<BigSlots>(68),
ty: UInt<1>, ty: UInt<1>,
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },

View file

@ -1729,6 +1729,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(0), index: StatePartIndex<BigSlots>(0),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x1, last_state: 0x1,
}, },
@ -1737,6 +1738,7 @@ Simulation {
kind: BigSyncReset { kind: BigSyncReset {
index: StatePartIndex<BigSlots>(1), index: StatePartIndex<BigSlots>(1),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1749,6 +1751,7 @@ Simulation {
HdlSome(UInt<8>), HdlSome(UInt<8>),
}, },
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1758,6 +1761,7 @@ Simulation {
index: StatePartIndex<BigSlots>(5), index: StatePartIndex<BigSlots>(5),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x2a, state: 0x2a,
last_state: 0x2a, last_state: 0x2a,
}, },
@ -1766,6 +1770,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(3), index: StatePartIndex<BigSlots>(3),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1778,6 +1783,7 @@ Simulation {
HdlSome(UInt<8>), HdlSome(UInt<8>),
}, },
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1787,6 +1793,7 @@ Simulation {
index: StatePartIndex<BigSlots>(9), index: StatePartIndex<BigSlots>(9),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x29, state: 0x29,
last_state: 0x29, last_state: 0x29,
}, },
@ -1795,6 +1802,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(7), index: StatePartIndex<BigSlots>(7),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1804,6 +1812,7 @@ Simulation {
index: StatePartIndex<BigSlots>(10), index: StatePartIndex<BigSlots>(10),
ty: UInt<2>, ty: UInt<2>,
}, },
maybe_changed: true,
state: 0x2, state: 0x2,
last_state: 0x2, last_state: 0x2,
}, },
@ -1813,6 +1822,7 @@ Simulation {
index: StatePartIndex<BigSlots>(11), index: StatePartIndex<BigSlots>(11),
ty: UInt<1>, ty: UInt<1>,
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1821,6 +1831,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(12), index: StatePartIndex<BigSlots>(12),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1829,6 +1840,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(13), index: StatePartIndex<BigSlots>(13),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x1, last_state: 0x1,
}, },
@ -1838,6 +1850,7 @@ Simulation {
index: StatePartIndex<BigSlots>(14), index: StatePartIndex<BigSlots>(14),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x29, state: 0x29,
last_state: 0x29, last_state: 0x29,
}, },
@ -1847,6 +1860,7 @@ Simulation {
index: StatePartIndex<BigSlots>(15), index: StatePartIndex<BigSlots>(15),
ty: UInt<1>, ty: UInt<1>,
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1855,6 +1869,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(16), index: StatePartIndex<BigSlots>(16),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1863,6 +1878,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(17), index: StatePartIndex<BigSlots>(17),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x1, last_state: 0x1,
}, },
@ -1872,6 +1888,7 @@ Simulation {
index: StatePartIndex<BigSlots>(18), index: StatePartIndex<BigSlots>(18),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x2a, state: 0x2a,
last_state: 0x2a, last_state: 0x2a,
}, },
@ -1880,6 +1897,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(19), index: StatePartIndex<BigSlots>(19),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1889,6 +1907,7 @@ Simulation {
index: StatePartIndex<BigSlots>(22), index: StatePartIndex<BigSlots>(22),
ty: UInt<1>, ty: UInt<1>,
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1898,6 +1917,7 @@ Simulation {
index: StatePartIndex<BigSlots>(25), index: StatePartIndex<BigSlots>(25),
ty: UInt<1>, ty: UInt<1>,
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1906,6 +1926,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(27), index: StatePartIndex<BigSlots>(27),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1914,6 +1935,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(30), index: StatePartIndex<BigSlots>(30),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1922,6 +1944,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(31), index: StatePartIndex<BigSlots>(31),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1930,6 +1953,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(32), index: StatePartIndex<BigSlots>(32),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1938,6 +1962,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(33), index: StatePartIndex<BigSlots>(33),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1946,6 +1971,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(34), index: StatePartIndex<BigSlots>(34),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1954,6 +1980,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(36), index: StatePartIndex<BigSlots>(36),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1962,6 +1989,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(39), index: StatePartIndex<BigSlots>(39),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1971,6 +1999,7 @@ Simulation {
index: StatePartIndex<BigSlots>(42), index: StatePartIndex<BigSlots>(42),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x2a, state: 0x2a,
last_state: 0x2a, last_state: 0x2a,
}, },
@ -1980,6 +2009,7 @@ Simulation {
index: StatePartIndex<BigSlots>(66), index: StatePartIndex<BigSlots>(66),
ty: UInt<1>, ty: UInt<1>,
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },

View file

@ -1759,6 +1759,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(0), index: StatePartIndex<BigSlots>(0),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x1, last_state: 0x1,
}, },
@ -1767,6 +1768,7 @@ Simulation {
kind: BigSyncReset { kind: BigSyncReset {
index: StatePartIndex<BigSlots>(1), index: StatePartIndex<BigSlots>(1),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1779,6 +1781,7 @@ Simulation {
HdlSome(UInt<8>), HdlSome(UInt<8>),
}, },
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1788,6 +1791,7 @@ Simulation {
index: StatePartIndex<BigSlots>(5), index: StatePartIndex<BigSlots>(5),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x28, state: 0x28,
last_state: 0x28, last_state: 0x28,
}, },
@ -1796,6 +1800,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(3), index: StatePartIndex<BigSlots>(3),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1808,6 +1813,7 @@ Simulation {
HdlSome(UInt<8>), HdlSome(UInt<8>),
}, },
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1817,6 +1823,7 @@ Simulation {
index: StatePartIndex<BigSlots>(9), index: StatePartIndex<BigSlots>(9),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x27, state: 0x27,
last_state: 0x27, last_state: 0x27,
}, },
@ -1825,6 +1832,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(7), index: StatePartIndex<BigSlots>(7),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1834,6 +1842,7 @@ Simulation {
index: StatePartIndex<BigSlots>(10), index: StatePartIndex<BigSlots>(10),
ty: UInt<2>, ty: UInt<2>,
}, },
maybe_changed: true,
state: 0x2, state: 0x2,
last_state: 0x2, last_state: 0x2,
}, },
@ -1843,6 +1852,7 @@ Simulation {
index: StatePartIndex<BigSlots>(11), index: StatePartIndex<BigSlots>(11),
ty: UInt<2>, ty: UInt<2>,
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1851,6 +1861,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(12), index: StatePartIndex<BigSlots>(12),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1859,6 +1870,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(13), index: StatePartIndex<BigSlots>(13),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x1, last_state: 0x1,
}, },
@ -1868,6 +1880,7 @@ Simulation {
index: StatePartIndex<BigSlots>(14), index: StatePartIndex<BigSlots>(14),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x27, state: 0x27,
last_state: 0x27, last_state: 0x27,
}, },
@ -1877,6 +1890,7 @@ Simulation {
index: StatePartIndex<BigSlots>(15), index: StatePartIndex<BigSlots>(15),
ty: UInt<2>, ty: UInt<2>,
}, },
maybe_changed: true,
state: 0x2, state: 0x2,
last_state: 0x2, last_state: 0x2,
}, },
@ -1885,6 +1899,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(16), index: StatePartIndex<BigSlots>(16),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1893,6 +1908,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(17), index: StatePartIndex<BigSlots>(17),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x1, last_state: 0x1,
}, },
@ -1902,6 +1918,7 @@ Simulation {
index: StatePartIndex<BigSlots>(18), index: StatePartIndex<BigSlots>(18),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x28, state: 0x28,
last_state: 0x28, last_state: 0x28,
}, },
@ -1910,6 +1927,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(19), index: StatePartIndex<BigSlots>(19),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1919,6 +1937,7 @@ Simulation {
index: StatePartIndex<BigSlots>(22), index: StatePartIndex<BigSlots>(22),
ty: UInt<2>, ty: UInt<2>,
}, },
maybe_changed: true,
state: 0x2, state: 0x2,
last_state: 0x2, last_state: 0x2,
}, },
@ -1928,6 +1947,7 @@ Simulation {
index: StatePartIndex<BigSlots>(25), index: StatePartIndex<BigSlots>(25),
ty: UInt<2>, ty: UInt<2>,
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1936,6 +1956,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(27), index: StatePartIndex<BigSlots>(27),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1944,6 +1965,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(30), index: StatePartIndex<BigSlots>(30),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1952,6 +1974,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(31), index: StatePartIndex<BigSlots>(31),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1960,6 +1983,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(32), index: StatePartIndex<BigSlots>(32),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1968,6 +1992,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(33), index: StatePartIndex<BigSlots>(33),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1976,6 +2001,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(34), index: StatePartIndex<BigSlots>(34),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1984,6 +2010,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(36), index: StatePartIndex<BigSlots>(36),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1992,6 +2019,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(39), index: StatePartIndex<BigSlots>(39),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -2001,6 +2029,7 @@ Simulation {
index: StatePartIndex<BigSlots>(42), index: StatePartIndex<BigSlots>(42),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x28, state: 0x28,
last_state: 0x28, last_state: 0x28,
}, },

View file

@ -1738,6 +1738,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(0), index: StatePartIndex<BigSlots>(0),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x1, last_state: 0x1,
}, },
@ -1746,6 +1747,7 @@ Simulation {
kind: BigSyncReset { kind: BigSyncReset {
index: StatePartIndex<BigSlots>(1), index: StatePartIndex<BigSlots>(1),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1758,6 +1760,7 @@ Simulation {
HdlSome(UInt<8>), HdlSome(UInt<8>),
}, },
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1767,6 +1770,7 @@ Simulation {
index: StatePartIndex<BigSlots>(5), index: StatePartIndex<BigSlots>(5),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x2a, state: 0x2a,
last_state: 0x2a, last_state: 0x2a,
}, },
@ -1775,6 +1779,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(3), index: StatePartIndex<BigSlots>(3),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1787,6 +1792,7 @@ Simulation {
HdlSome(UInt<8>), HdlSome(UInt<8>),
}, },
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1796,6 +1802,7 @@ Simulation {
index: StatePartIndex<BigSlots>(9), index: StatePartIndex<BigSlots>(9),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x29, state: 0x29,
last_state: 0x29, last_state: 0x29,
}, },
@ -1804,6 +1811,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(7), index: StatePartIndex<BigSlots>(7),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1813,6 +1821,7 @@ Simulation {
index: StatePartIndex<BigSlots>(10), index: StatePartIndex<BigSlots>(10),
ty: UInt<2>, ty: UInt<2>,
}, },
maybe_changed: true,
state: 0x2, state: 0x2,
last_state: 0x2, last_state: 0x2,
}, },
@ -1822,6 +1831,7 @@ Simulation {
index: StatePartIndex<BigSlots>(11), index: StatePartIndex<BigSlots>(11),
ty: UInt<2>, ty: UInt<2>,
}, },
maybe_changed: true,
state: 0x2, state: 0x2,
last_state: 0x2, last_state: 0x2,
}, },
@ -1830,6 +1840,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(12), index: StatePartIndex<BigSlots>(12),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1838,6 +1849,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(13), index: StatePartIndex<BigSlots>(13),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x1, last_state: 0x1,
}, },
@ -1847,6 +1859,7 @@ Simulation {
index: StatePartIndex<BigSlots>(14), index: StatePartIndex<BigSlots>(14),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x29, state: 0x29,
last_state: 0x29, last_state: 0x29,
}, },
@ -1856,6 +1869,7 @@ Simulation {
index: StatePartIndex<BigSlots>(15), index: StatePartIndex<BigSlots>(15),
ty: UInt<2>, ty: UInt<2>,
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1864,6 +1878,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(16), index: StatePartIndex<BigSlots>(16),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1872,6 +1887,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(17), index: StatePartIndex<BigSlots>(17),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x1, last_state: 0x1,
}, },
@ -1881,6 +1897,7 @@ Simulation {
index: StatePartIndex<BigSlots>(18), index: StatePartIndex<BigSlots>(18),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x2a, state: 0x2a,
last_state: 0x2a, last_state: 0x2a,
}, },
@ -1889,6 +1906,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(19), index: StatePartIndex<BigSlots>(19),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1898,6 +1916,7 @@ Simulation {
index: StatePartIndex<BigSlots>(22), index: StatePartIndex<BigSlots>(22),
ty: UInt<2>, ty: UInt<2>,
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1907,6 +1926,7 @@ Simulation {
index: StatePartIndex<BigSlots>(25), index: StatePartIndex<BigSlots>(25),
ty: UInt<2>, ty: UInt<2>,
}, },
maybe_changed: true,
state: 0x2, state: 0x2,
last_state: 0x2, last_state: 0x2,
}, },
@ -1915,6 +1935,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(27), index: StatePartIndex<BigSlots>(27),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1923,6 +1944,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(30), index: StatePartIndex<BigSlots>(30),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1931,6 +1953,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(31), index: StatePartIndex<BigSlots>(31),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1939,6 +1962,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(32), index: StatePartIndex<BigSlots>(32),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1947,6 +1971,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(33), index: StatePartIndex<BigSlots>(33),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1955,6 +1980,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(34), index: StatePartIndex<BigSlots>(34),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1963,6 +1989,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(36), index: StatePartIndex<BigSlots>(36),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1971,6 +1998,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(39), index: StatePartIndex<BigSlots>(39),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1980,6 +2008,7 @@ Simulation {
index: StatePartIndex<BigSlots>(42), index: StatePartIndex<BigSlots>(42),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x2a, state: 0x2a,
last_state: 0x2a, last_state: 0x2a,
}, },

View file

@ -1769,6 +1769,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(0), index: StatePartIndex<BigSlots>(0),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x1, last_state: 0x1,
}, },
@ -1777,6 +1778,7 @@ Simulation {
kind: BigSyncReset { kind: BigSyncReset {
index: StatePartIndex<BigSlots>(1), index: StatePartIndex<BigSlots>(1),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1789,6 +1791,7 @@ Simulation {
HdlSome(UInt<8>), HdlSome(UInt<8>),
}, },
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1798,6 +1801,7 @@ Simulation {
index: StatePartIndex<BigSlots>(5), index: StatePartIndex<BigSlots>(5),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x2b, state: 0x2b,
last_state: 0x2b, last_state: 0x2b,
}, },
@ -1806,6 +1810,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(3), index: StatePartIndex<BigSlots>(3),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1818,6 +1823,7 @@ Simulation {
HdlSome(UInt<8>), HdlSome(UInt<8>),
}, },
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1827,6 +1833,7 @@ Simulation {
index: StatePartIndex<BigSlots>(9), index: StatePartIndex<BigSlots>(9),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x29, state: 0x29,
last_state: 0x29, last_state: 0x29,
}, },
@ -1835,6 +1842,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(7), index: StatePartIndex<BigSlots>(7),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1844,6 +1852,7 @@ Simulation {
index: StatePartIndex<BigSlots>(10), index: StatePartIndex<BigSlots>(10),
ty: UInt<2>, ty: UInt<2>,
}, },
maybe_changed: true,
state: 0x3, state: 0x3,
last_state: 0x3, last_state: 0x3,
}, },
@ -1853,6 +1862,7 @@ Simulation {
index: StatePartIndex<BigSlots>(11), index: StatePartIndex<BigSlots>(11),
ty: UInt<2>, ty: UInt<2>,
}, },
maybe_changed: true,
state: 0x2, state: 0x2,
last_state: 0x2, last_state: 0x2,
}, },
@ -1861,6 +1871,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(12), index: StatePartIndex<BigSlots>(12),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1869,6 +1880,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(13), index: StatePartIndex<BigSlots>(13),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x1, last_state: 0x1,
}, },
@ -1878,6 +1890,7 @@ Simulation {
index: StatePartIndex<BigSlots>(14), index: StatePartIndex<BigSlots>(14),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x29, state: 0x29,
last_state: 0x29, last_state: 0x29,
}, },
@ -1887,6 +1900,7 @@ Simulation {
index: StatePartIndex<BigSlots>(15), index: StatePartIndex<BigSlots>(15),
ty: UInt<2>, ty: UInt<2>,
}, },
maybe_changed: true,
state: 0x2, state: 0x2,
last_state: 0x2, last_state: 0x2,
}, },
@ -1895,6 +1909,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(16), index: StatePartIndex<BigSlots>(16),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1903,6 +1918,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(17), index: StatePartIndex<BigSlots>(17),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x1, last_state: 0x1,
}, },
@ -1912,6 +1928,7 @@ Simulation {
index: StatePartIndex<BigSlots>(18), index: StatePartIndex<BigSlots>(18),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x2b, state: 0x2b,
last_state: 0x2b, last_state: 0x2b,
}, },
@ -1920,6 +1937,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(19), index: StatePartIndex<BigSlots>(19),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1929,6 +1947,7 @@ Simulation {
index: StatePartIndex<BigSlots>(22), index: StatePartIndex<BigSlots>(22),
ty: UInt<2>, ty: UInt<2>,
}, },
maybe_changed: true,
state: 0x2, state: 0x2,
last_state: 0x2, last_state: 0x2,
}, },
@ -1938,6 +1957,7 @@ Simulation {
index: StatePartIndex<BigSlots>(25), index: StatePartIndex<BigSlots>(25),
ty: UInt<2>, ty: UInt<2>,
}, },
maybe_changed: true,
state: 0x2, state: 0x2,
last_state: 0x2, last_state: 0x2,
}, },
@ -1946,6 +1966,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(27), index: StatePartIndex<BigSlots>(27),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1954,6 +1975,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(30), index: StatePartIndex<BigSlots>(30),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1962,6 +1984,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(31), index: StatePartIndex<BigSlots>(31),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1970,6 +1993,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(32), index: StatePartIndex<BigSlots>(32),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1978,6 +2002,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(33), index: StatePartIndex<BigSlots>(33),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1986,6 +2011,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(34), index: StatePartIndex<BigSlots>(34),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1994,6 +2020,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(36), index: StatePartIndex<BigSlots>(36),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -2002,6 +2029,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(39), index: StatePartIndex<BigSlots>(39),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -2011,6 +2039,7 @@ Simulation {
index: StatePartIndex<BigSlots>(42), index: StatePartIndex<BigSlots>(42),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x2b, state: 0x2b,
last_state: 0x2b, last_state: 0x2b,
}, },

View file

@ -1748,6 +1748,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(0), index: StatePartIndex<BigSlots>(0),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x1, last_state: 0x1,
}, },
@ -1756,6 +1757,7 @@ Simulation {
kind: BigSyncReset { kind: BigSyncReset {
index: StatePartIndex<BigSlots>(1), index: StatePartIndex<BigSlots>(1),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1768,6 +1770,7 @@ Simulation {
HdlSome(UInt<8>), HdlSome(UInt<8>),
}, },
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1777,6 +1780,7 @@ Simulation {
index: StatePartIndex<BigSlots>(5), index: StatePartIndex<BigSlots>(5),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x2b, state: 0x2b,
last_state: 0x2b, last_state: 0x2b,
}, },
@ -1785,6 +1789,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(3), index: StatePartIndex<BigSlots>(3),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1797,6 +1802,7 @@ Simulation {
HdlSome(UInt<8>), HdlSome(UInt<8>),
}, },
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1806,6 +1812,7 @@ Simulation {
index: StatePartIndex<BigSlots>(9), index: StatePartIndex<BigSlots>(9),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x29, state: 0x29,
last_state: 0x29, last_state: 0x29,
}, },
@ -1814,6 +1821,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(7), index: StatePartIndex<BigSlots>(7),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1823,6 +1831,7 @@ Simulation {
index: StatePartIndex<BigSlots>(10), index: StatePartIndex<BigSlots>(10),
ty: UInt<2>, ty: UInt<2>,
}, },
maybe_changed: true,
state: 0x3, state: 0x3,
last_state: 0x3, last_state: 0x3,
}, },
@ -1832,6 +1841,7 @@ Simulation {
index: StatePartIndex<BigSlots>(11), index: StatePartIndex<BigSlots>(11),
ty: UInt<2>, ty: UInt<2>,
}, },
maybe_changed: true,
state: 0x2, state: 0x2,
last_state: 0x2, last_state: 0x2,
}, },
@ -1840,6 +1850,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(12), index: StatePartIndex<BigSlots>(12),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1848,6 +1859,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(13), index: StatePartIndex<BigSlots>(13),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x1, last_state: 0x1,
}, },
@ -1857,6 +1869,7 @@ Simulation {
index: StatePartIndex<BigSlots>(14), index: StatePartIndex<BigSlots>(14),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x29, state: 0x29,
last_state: 0x29, last_state: 0x29,
}, },
@ -1866,6 +1879,7 @@ Simulation {
index: StatePartIndex<BigSlots>(15), index: StatePartIndex<BigSlots>(15),
ty: UInt<2>, ty: UInt<2>,
}, },
maybe_changed: true,
state: 0x2, state: 0x2,
last_state: 0x2, last_state: 0x2,
}, },
@ -1874,6 +1888,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(16), index: StatePartIndex<BigSlots>(16),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1882,6 +1897,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(17), index: StatePartIndex<BigSlots>(17),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x1, last_state: 0x1,
}, },
@ -1891,6 +1907,7 @@ Simulation {
index: StatePartIndex<BigSlots>(18), index: StatePartIndex<BigSlots>(18),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x2b, state: 0x2b,
last_state: 0x2b, last_state: 0x2b,
}, },
@ -1899,6 +1916,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(19), index: StatePartIndex<BigSlots>(19),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1908,6 +1926,7 @@ Simulation {
index: StatePartIndex<BigSlots>(22), index: StatePartIndex<BigSlots>(22),
ty: UInt<2>, ty: UInt<2>,
}, },
maybe_changed: true,
state: 0x2, state: 0x2,
last_state: 0x2, last_state: 0x2,
}, },
@ -1917,6 +1936,7 @@ Simulation {
index: StatePartIndex<BigSlots>(25), index: StatePartIndex<BigSlots>(25),
ty: UInt<2>, ty: UInt<2>,
}, },
maybe_changed: true,
state: 0x2, state: 0x2,
last_state: 0x2, last_state: 0x2,
}, },
@ -1925,6 +1945,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(27), index: StatePartIndex<BigSlots>(27),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1933,6 +1954,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(30), index: StatePartIndex<BigSlots>(30),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1941,6 +1963,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(31), index: StatePartIndex<BigSlots>(31),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1949,6 +1972,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(32), index: StatePartIndex<BigSlots>(32),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1957,6 +1981,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(33), index: StatePartIndex<BigSlots>(33),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1965,6 +1990,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(34), index: StatePartIndex<BigSlots>(34),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1973,6 +1999,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(36), index: StatePartIndex<BigSlots>(36),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1981,6 +2008,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(39), index: StatePartIndex<BigSlots>(39),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1990,6 +2018,7 @@ Simulation {
index: StatePartIndex<BigSlots>(42), index: StatePartIndex<BigSlots>(42),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x2b, state: 0x2b,
last_state: 0x2b, last_state: 0x2b,
}, },

View file

@ -1748,6 +1748,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(0), index: StatePartIndex<BigSlots>(0),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x1, last_state: 0x1,
}, },
@ -1756,6 +1757,7 @@ Simulation {
kind: BigSyncReset { kind: BigSyncReset {
index: StatePartIndex<BigSlots>(1), index: StatePartIndex<BigSlots>(1),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1768,6 +1770,7 @@ Simulation {
HdlSome(UInt<8>), HdlSome(UInt<8>),
}, },
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1777,6 +1780,7 @@ Simulation {
index: StatePartIndex<BigSlots>(5), index: StatePartIndex<BigSlots>(5),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x2b, state: 0x2b,
last_state: 0x2b, last_state: 0x2b,
}, },
@ -1785,6 +1789,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(3), index: StatePartIndex<BigSlots>(3),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1797,6 +1802,7 @@ Simulation {
HdlSome(UInt<8>), HdlSome(UInt<8>),
}, },
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1806,6 +1812,7 @@ Simulation {
index: StatePartIndex<BigSlots>(9), index: StatePartIndex<BigSlots>(9),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x29, state: 0x29,
last_state: 0x29, last_state: 0x29,
}, },
@ -1814,6 +1821,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(7), index: StatePartIndex<BigSlots>(7),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1823,6 +1831,7 @@ Simulation {
index: StatePartIndex<BigSlots>(10), index: StatePartIndex<BigSlots>(10),
ty: UInt<3>, ty: UInt<3>,
}, },
maybe_changed: true,
state: 0x3, state: 0x3,
last_state: 0x3, last_state: 0x3,
}, },
@ -1832,6 +1841,7 @@ Simulation {
index: StatePartIndex<BigSlots>(11), index: StatePartIndex<BigSlots>(11),
ty: UInt<2>, ty: UInt<2>,
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1840,6 +1850,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(12), index: StatePartIndex<BigSlots>(12),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1848,6 +1859,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(13), index: StatePartIndex<BigSlots>(13),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x1, last_state: 0x1,
}, },
@ -1857,6 +1869,7 @@ Simulation {
index: StatePartIndex<BigSlots>(14), index: StatePartIndex<BigSlots>(14),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x29, state: 0x29,
last_state: 0x29, last_state: 0x29,
}, },
@ -1866,6 +1879,7 @@ Simulation {
index: StatePartIndex<BigSlots>(15), index: StatePartIndex<BigSlots>(15),
ty: UInt<2>, ty: UInt<2>,
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1874,6 +1888,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(16), index: StatePartIndex<BigSlots>(16),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1882,6 +1897,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(17), index: StatePartIndex<BigSlots>(17),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x1, last_state: 0x1,
}, },
@ -1891,6 +1907,7 @@ Simulation {
index: StatePartIndex<BigSlots>(18), index: StatePartIndex<BigSlots>(18),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x2b, state: 0x2b,
last_state: 0x2b, last_state: 0x2b,
}, },
@ -1899,6 +1916,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(19), index: StatePartIndex<BigSlots>(19),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1908,6 +1926,7 @@ Simulation {
index: StatePartIndex<BigSlots>(22), index: StatePartIndex<BigSlots>(22),
ty: UInt<2>, ty: UInt<2>,
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1917,6 +1936,7 @@ Simulation {
index: StatePartIndex<BigSlots>(25), index: StatePartIndex<BigSlots>(25),
ty: UInt<2>, ty: UInt<2>,
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1925,6 +1945,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(27), index: StatePartIndex<BigSlots>(27),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1933,6 +1954,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(30), index: StatePartIndex<BigSlots>(30),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1941,6 +1963,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(31), index: StatePartIndex<BigSlots>(31),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1949,6 +1972,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(32), index: StatePartIndex<BigSlots>(32),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1957,6 +1981,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(33), index: StatePartIndex<BigSlots>(33),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1965,6 +1990,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(34), index: StatePartIndex<BigSlots>(34),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1973,6 +1999,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(36), index: StatePartIndex<BigSlots>(36),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1981,6 +2008,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(39), index: StatePartIndex<BigSlots>(39),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1990,6 +2018,7 @@ Simulation {
index: StatePartIndex<BigSlots>(42), index: StatePartIndex<BigSlots>(42),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x2b, state: 0x2b,
last_state: 0x2b, last_state: 0x2b,
}, },
@ -1999,6 +2028,7 @@ Simulation {
index: StatePartIndex<BigSlots>(68), index: StatePartIndex<BigSlots>(68),
ty: UInt<2>, ty: UInt<2>,
}, },
maybe_changed: true,
state: 0x3, state: 0x3,
last_state: 0x3, last_state: 0x3,
}, },

View file

@ -1727,6 +1727,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(0), index: StatePartIndex<BigSlots>(0),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x1, last_state: 0x1,
}, },
@ -1735,6 +1736,7 @@ Simulation {
kind: BigSyncReset { kind: BigSyncReset {
index: StatePartIndex<BigSlots>(1), index: StatePartIndex<BigSlots>(1),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1747,6 +1749,7 @@ Simulation {
HdlSome(UInt<8>), HdlSome(UInt<8>),
}, },
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1756,6 +1759,7 @@ Simulation {
index: StatePartIndex<BigSlots>(5), index: StatePartIndex<BigSlots>(5),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x2b, state: 0x2b,
last_state: 0x2b, last_state: 0x2b,
}, },
@ -1764,6 +1768,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(3), index: StatePartIndex<BigSlots>(3),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1776,6 +1781,7 @@ Simulation {
HdlSome(UInt<8>), HdlSome(UInt<8>),
}, },
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1785,6 +1791,7 @@ Simulation {
index: StatePartIndex<BigSlots>(9), index: StatePartIndex<BigSlots>(9),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x29, state: 0x29,
last_state: 0x29, last_state: 0x29,
}, },
@ -1793,6 +1800,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(7), index: StatePartIndex<BigSlots>(7),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1802,6 +1810,7 @@ Simulation {
index: StatePartIndex<BigSlots>(10), index: StatePartIndex<BigSlots>(10),
ty: UInt<3>, ty: UInt<3>,
}, },
maybe_changed: true,
state: 0x3, state: 0x3,
last_state: 0x3, last_state: 0x3,
}, },
@ -1811,6 +1820,7 @@ Simulation {
index: StatePartIndex<BigSlots>(11), index: StatePartIndex<BigSlots>(11),
ty: UInt<2>, ty: UInt<2>,
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1819,6 +1829,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(12), index: StatePartIndex<BigSlots>(12),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1827,6 +1838,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(13), index: StatePartIndex<BigSlots>(13),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x1, last_state: 0x1,
}, },
@ -1836,6 +1848,7 @@ Simulation {
index: StatePartIndex<BigSlots>(14), index: StatePartIndex<BigSlots>(14),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x29, state: 0x29,
last_state: 0x29, last_state: 0x29,
}, },
@ -1845,6 +1858,7 @@ Simulation {
index: StatePartIndex<BigSlots>(15), index: StatePartIndex<BigSlots>(15),
ty: UInt<2>, ty: UInt<2>,
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1853,6 +1867,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(16), index: StatePartIndex<BigSlots>(16),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1861,6 +1876,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(17), index: StatePartIndex<BigSlots>(17),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x1, last_state: 0x1,
}, },
@ -1870,6 +1886,7 @@ Simulation {
index: StatePartIndex<BigSlots>(18), index: StatePartIndex<BigSlots>(18),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x2b, state: 0x2b,
last_state: 0x2b, last_state: 0x2b,
}, },
@ -1878,6 +1895,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(19), index: StatePartIndex<BigSlots>(19),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1887,6 +1905,7 @@ Simulation {
index: StatePartIndex<BigSlots>(22), index: StatePartIndex<BigSlots>(22),
ty: UInt<2>, ty: UInt<2>,
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1896,6 +1915,7 @@ Simulation {
index: StatePartIndex<BigSlots>(25), index: StatePartIndex<BigSlots>(25),
ty: UInt<2>, ty: UInt<2>,
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1904,6 +1924,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(27), index: StatePartIndex<BigSlots>(27),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1912,6 +1933,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(30), index: StatePartIndex<BigSlots>(30),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1920,6 +1942,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(31), index: StatePartIndex<BigSlots>(31),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1928,6 +1951,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(32), index: StatePartIndex<BigSlots>(32),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1936,6 +1960,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(33), index: StatePartIndex<BigSlots>(33),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1944,6 +1969,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(34), index: StatePartIndex<BigSlots>(34),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1952,6 +1978,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(36), index: StatePartIndex<BigSlots>(36),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1960,6 +1987,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(39), index: StatePartIndex<BigSlots>(39),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1969,6 +1997,7 @@ Simulation {
index: StatePartIndex<BigSlots>(42), index: StatePartIndex<BigSlots>(42),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x2b, state: 0x2b,
last_state: 0x2b, last_state: 0x2b,
}, },
@ -1978,6 +2007,7 @@ Simulation {
index: StatePartIndex<BigSlots>(66), index: StatePartIndex<BigSlots>(66),
ty: UInt<2>, ty: UInt<2>,
}, },
maybe_changed: true,
state: 0x3, state: 0x3,
last_state: 0x3, last_state: 0x3,
}, },

View file

@ -1758,6 +1758,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(0), index: StatePartIndex<BigSlots>(0),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x1, last_state: 0x1,
}, },
@ -1766,6 +1767,7 @@ Simulation {
kind: BigSyncReset { kind: BigSyncReset {
index: StatePartIndex<BigSlots>(1), index: StatePartIndex<BigSlots>(1),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1778,6 +1780,7 @@ Simulation {
HdlSome(UInt<8>), HdlSome(UInt<8>),
}, },
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1787,6 +1790,7 @@ Simulation {
index: StatePartIndex<BigSlots>(5), index: StatePartIndex<BigSlots>(5),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x2c, state: 0x2c,
last_state: 0x2c, last_state: 0x2c,
}, },
@ -1795,6 +1799,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(3), index: StatePartIndex<BigSlots>(3),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1807,6 +1812,7 @@ Simulation {
HdlSome(UInt<8>), HdlSome(UInt<8>),
}, },
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1816,6 +1822,7 @@ Simulation {
index: StatePartIndex<BigSlots>(9), index: StatePartIndex<BigSlots>(9),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x29, state: 0x29,
last_state: 0x29, last_state: 0x29,
}, },
@ -1824,6 +1831,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(7), index: StatePartIndex<BigSlots>(7),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1833,6 +1841,7 @@ Simulation {
index: StatePartIndex<BigSlots>(10), index: StatePartIndex<BigSlots>(10),
ty: UInt<3>, ty: UInt<3>,
}, },
maybe_changed: true,
state: 0x4, state: 0x4,
last_state: 0x4, last_state: 0x4,
}, },
@ -1842,6 +1851,7 @@ Simulation {
index: StatePartIndex<BigSlots>(11), index: StatePartIndex<BigSlots>(11),
ty: UInt<2>, ty: UInt<2>,
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1850,6 +1860,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(12), index: StatePartIndex<BigSlots>(12),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1858,6 +1869,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(13), index: StatePartIndex<BigSlots>(13),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x1, last_state: 0x1,
}, },
@ -1867,6 +1879,7 @@ Simulation {
index: StatePartIndex<BigSlots>(14), index: StatePartIndex<BigSlots>(14),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x29, state: 0x29,
last_state: 0x29, last_state: 0x29,
}, },
@ -1876,6 +1889,7 @@ Simulation {
index: StatePartIndex<BigSlots>(15), index: StatePartIndex<BigSlots>(15),
ty: UInt<2>, ty: UInt<2>,
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1884,6 +1898,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(16), index: StatePartIndex<BigSlots>(16),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1892,6 +1907,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(17), index: StatePartIndex<BigSlots>(17),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x1, last_state: 0x1,
}, },
@ -1901,6 +1917,7 @@ Simulation {
index: StatePartIndex<BigSlots>(18), index: StatePartIndex<BigSlots>(18),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x2c, state: 0x2c,
last_state: 0x2c, last_state: 0x2c,
}, },
@ -1909,6 +1926,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(19), index: StatePartIndex<BigSlots>(19),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1918,6 +1936,7 @@ Simulation {
index: StatePartIndex<BigSlots>(22), index: StatePartIndex<BigSlots>(22),
ty: UInt<2>, ty: UInt<2>,
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1927,6 +1946,7 @@ Simulation {
index: StatePartIndex<BigSlots>(25), index: StatePartIndex<BigSlots>(25),
ty: UInt<2>, ty: UInt<2>,
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1935,6 +1955,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(27), index: StatePartIndex<BigSlots>(27),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1943,6 +1964,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(30), index: StatePartIndex<BigSlots>(30),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1951,6 +1973,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(31), index: StatePartIndex<BigSlots>(31),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1959,6 +1982,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(32), index: StatePartIndex<BigSlots>(32),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1967,6 +1991,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(33), index: StatePartIndex<BigSlots>(33),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1975,6 +2000,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(34), index: StatePartIndex<BigSlots>(34),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1983,6 +2009,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(36), index: StatePartIndex<BigSlots>(36),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1991,6 +2018,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(39), index: StatePartIndex<BigSlots>(39),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -2000,6 +2028,7 @@ Simulation {
index: StatePartIndex<BigSlots>(42), index: StatePartIndex<BigSlots>(42),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x2c, state: 0x2c,
last_state: 0x2c, last_state: 0x2c,
}, },
@ -2009,6 +2038,7 @@ Simulation {
index: StatePartIndex<BigSlots>(68), index: StatePartIndex<BigSlots>(68),
ty: UInt<2>, ty: UInt<2>,
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },

View file

@ -1737,6 +1737,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(0), index: StatePartIndex<BigSlots>(0),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x1, last_state: 0x1,
}, },
@ -1745,6 +1746,7 @@ Simulation {
kind: BigSyncReset { kind: BigSyncReset {
index: StatePartIndex<BigSlots>(1), index: StatePartIndex<BigSlots>(1),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1757,6 +1759,7 @@ Simulation {
HdlSome(UInt<8>), HdlSome(UInt<8>),
}, },
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1766,6 +1769,7 @@ Simulation {
index: StatePartIndex<BigSlots>(5), index: StatePartIndex<BigSlots>(5),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x2c, state: 0x2c,
last_state: 0x2c, last_state: 0x2c,
}, },
@ -1774,6 +1778,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(3), index: StatePartIndex<BigSlots>(3),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1786,6 +1791,7 @@ Simulation {
HdlSome(UInt<8>), HdlSome(UInt<8>),
}, },
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1795,6 +1801,7 @@ Simulation {
index: StatePartIndex<BigSlots>(9), index: StatePartIndex<BigSlots>(9),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x29, state: 0x29,
last_state: 0x29, last_state: 0x29,
}, },
@ -1803,6 +1810,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(7), index: StatePartIndex<BigSlots>(7),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1812,6 +1820,7 @@ Simulation {
index: StatePartIndex<BigSlots>(10), index: StatePartIndex<BigSlots>(10),
ty: UInt<3>, ty: UInt<3>,
}, },
maybe_changed: true,
state: 0x4, state: 0x4,
last_state: 0x4, last_state: 0x4,
}, },
@ -1821,6 +1830,7 @@ Simulation {
index: StatePartIndex<BigSlots>(11), index: StatePartIndex<BigSlots>(11),
ty: UInt<2>, ty: UInt<2>,
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1829,6 +1839,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(12), index: StatePartIndex<BigSlots>(12),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1837,6 +1848,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(13), index: StatePartIndex<BigSlots>(13),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x1, last_state: 0x1,
}, },
@ -1846,6 +1858,7 @@ Simulation {
index: StatePartIndex<BigSlots>(14), index: StatePartIndex<BigSlots>(14),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x29, state: 0x29,
last_state: 0x29, last_state: 0x29,
}, },
@ -1855,6 +1868,7 @@ Simulation {
index: StatePartIndex<BigSlots>(15), index: StatePartIndex<BigSlots>(15),
ty: UInt<2>, ty: UInt<2>,
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1863,6 +1877,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(16), index: StatePartIndex<BigSlots>(16),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1871,6 +1886,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(17), index: StatePartIndex<BigSlots>(17),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x1, last_state: 0x1,
}, },
@ -1880,6 +1896,7 @@ Simulation {
index: StatePartIndex<BigSlots>(18), index: StatePartIndex<BigSlots>(18),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x2c, state: 0x2c,
last_state: 0x2c, last_state: 0x2c,
}, },
@ -1888,6 +1905,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(19), index: StatePartIndex<BigSlots>(19),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1897,6 +1915,7 @@ Simulation {
index: StatePartIndex<BigSlots>(22), index: StatePartIndex<BigSlots>(22),
ty: UInt<2>, ty: UInt<2>,
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1906,6 +1925,7 @@ Simulation {
index: StatePartIndex<BigSlots>(25), index: StatePartIndex<BigSlots>(25),
ty: UInt<2>, ty: UInt<2>,
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1914,6 +1934,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(27), index: StatePartIndex<BigSlots>(27),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1922,6 +1943,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(30), index: StatePartIndex<BigSlots>(30),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1930,6 +1952,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(31), index: StatePartIndex<BigSlots>(31),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1938,6 +1961,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(32), index: StatePartIndex<BigSlots>(32),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1946,6 +1970,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(33), index: StatePartIndex<BigSlots>(33),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1954,6 +1979,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(34), index: StatePartIndex<BigSlots>(34),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1962,6 +1988,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(36), index: StatePartIndex<BigSlots>(36),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1970,6 +1997,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(39), index: StatePartIndex<BigSlots>(39),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1979,6 +2007,7 @@ Simulation {
index: StatePartIndex<BigSlots>(42), index: StatePartIndex<BigSlots>(42),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: true,
state: 0x2c, state: 0x2c,
last_state: 0x2c, last_state: 0x2c,
}, },
@ -1988,6 +2017,7 @@ Simulation {
index: StatePartIndex<BigSlots>(66), index: StatePartIndex<BigSlots>(66),
ty: UInt<2>, ty: UInt<2>,
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },

View file

@ -687,18 +687,7 @@ Simulation {
1, 1,
0, 0,
0, 0,
0, 0 (modified),
0,
0,
0,
1,
0,
0,
0,
1,
0,
0,
0,
0, 0,
0, 0,
0, 0,
@ -709,9 +698,20 @@ Simulation {
1, 1,
0, 0,
0, 0,
0 (modified),
0, 0,
0, 0,
0, 0,
1,
0,
0,
0,
1,
0,
0,
0 (modified),
0,
0,
], ],
}, },
sim_only_slots: StatePart { sim_only_slots: StatePart {
@ -1284,6 +1284,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(0), index: StatePartIndex<BigSlots>(0),
}, },
maybe_changed: false,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1293,6 +1294,7 @@ Simulation {
index: StatePartIndex<BigSlots>(1), index: StatePartIndex<BigSlots>(1),
ty: UInt<6>, ty: UInt<6>,
}, },
maybe_changed: false,
state: 0x00, state: 0x00,
last_state: 0x00, last_state: 0x00,
}, },
@ -1301,6 +1303,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(2), index: StatePartIndex<BigSlots>(2),
}, },
maybe_changed: false,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1309,6 +1312,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(3), index: StatePartIndex<BigSlots>(3),
}, },
maybe_changed: false,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1317,6 +1321,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(4), index: StatePartIndex<BigSlots>(4),
}, },
maybe_changed: false,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1325,6 +1330,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(5), index: StatePartIndex<BigSlots>(5),
}, },
maybe_changed: false,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1333,6 +1339,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(6), index: StatePartIndex<BigSlots>(6),
}, },
maybe_changed: false,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1341,6 +1348,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(7), index: StatePartIndex<BigSlots>(7),
}, },
maybe_changed: false,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1349,6 +1357,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(24), index: StatePartIndex<BigSlots>(24),
}, },
maybe_changed: false,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1357,6 +1366,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(33), index: StatePartIndex<BigSlots>(33),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1365,6 +1375,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(34), index: StatePartIndex<BigSlots>(34),
}, },
maybe_changed: false,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1373,6 +1384,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(31), index: StatePartIndex<BigSlots>(31),
}, },
maybe_changed: false,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1381,6 +1393,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(32), index: StatePartIndex<BigSlots>(32),
}, },
maybe_changed: false,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1389,6 +1402,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(36), index: StatePartIndex<BigSlots>(36),
}, },
maybe_changed: false,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1397,6 +1411,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(44), index: StatePartIndex<BigSlots>(44),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1405,6 +1420,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(45), index: StatePartIndex<BigSlots>(45),
}, },
maybe_changed: false,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1413,6 +1429,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(42), index: StatePartIndex<BigSlots>(42),
}, },
maybe_changed: false,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1421,6 +1438,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(43), index: StatePartIndex<BigSlots>(43),
}, },
maybe_changed: false,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1429,6 +1447,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(47), index: StatePartIndex<BigSlots>(47),
}, },
maybe_changed: false,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1437,6 +1456,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(55), index: StatePartIndex<BigSlots>(55),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1445,6 +1465,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(56), index: StatePartIndex<BigSlots>(56),
}, },
maybe_changed: false,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1453,6 +1474,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(53), index: StatePartIndex<BigSlots>(53),
}, },
maybe_changed: false,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1461,6 +1483,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(54), index: StatePartIndex<BigSlots>(54),
}, },
maybe_changed: false,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },

View file

@ -458,6 +458,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(0), index: StatePartIndex<BigSlots>(0),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x0, last_state: 0x0,
}, },
@ -466,6 +467,7 @@ Simulation {
kind: BigSyncReset { kind: BigSyncReset {
index: StatePartIndex<BigSlots>(1), index: StatePartIndex<BigSlots>(1),
}, },
maybe_changed: false,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -474,6 +476,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(2), index: StatePartIndex<BigSlots>(2),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -482,6 +485,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(3), index: StatePartIndex<BigSlots>(3),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -490,6 +494,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(4), index: StatePartIndex<BigSlots>(4),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -498,6 +503,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(7), index: StatePartIndex<BigSlots>(7),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -506,6 +512,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(9), index: StatePartIndex<BigSlots>(9),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -514,6 +521,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(11), index: StatePartIndex<BigSlots>(11),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },

View file

@ -68,12 +68,12 @@ Simulation {
}, },
big_slots: StatePart { big_slots: StatePart {
value: [ value: [
0 (modified),
0, 0,
0, 0,
0, 49 (modified),
49, 50 (modified),
50, 50 (modified),
50,
], ],
}, },
sim_only_slots: StatePart { sim_only_slots: StatePart {
@ -356,6 +356,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(0), index: StatePartIndex<BigSlots>(0),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -364,6 +365,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(1), index: StatePartIndex<BigSlots>(1),
}, },
maybe_changed: false,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -372,6 +374,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(2), index: StatePartIndex<BigSlots>(2),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x1, last_state: 0x1,
}, },
@ -381,6 +384,7 @@ Simulation {
index: StatePartIndex<BigSlots>(3), index: StatePartIndex<BigSlots>(3),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: false,
state: 0x31, state: 0x31,
last_state: 0x31, last_state: 0x31,
}, },
@ -390,6 +394,7 @@ Simulation {
index: StatePartIndex<BigSlots>(4), index: StatePartIndex<BigSlots>(4),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: false,
state: 0x32, state: 0x32,
last_state: 0x32, last_state: 0x32,
}, },
@ -399,6 +404,7 @@ Simulation {
index: StatePartIndex<BigSlots>(5), index: StatePartIndex<BigSlots>(5),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: false,
state: 0x32, state: 0x32,
last_state: 0x32, last_state: 0x32,
}, },

View file

@ -68,12 +68,12 @@ Simulation {
}, },
big_slots: StatePart { big_slots: StatePart {
value: [ value: [
0 (modified),
0, 0,
0, 0,
0, 49 (modified),
49, 50 (modified),
50, 50 (modified),
50,
], ],
}, },
sim_only_slots: StatePart { sim_only_slots: StatePart {
@ -356,6 +356,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(0), index: StatePartIndex<BigSlots>(0),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -364,6 +365,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(1), index: StatePartIndex<BigSlots>(1),
}, },
maybe_changed: false,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -372,6 +374,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(2), index: StatePartIndex<BigSlots>(2),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x1, last_state: 0x1,
}, },
@ -381,6 +384,7 @@ Simulation {
index: StatePartIndex<BigSlots>(3), index: StatePartIndex<BigSlots>(3),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: false,
state: 0x31, state: 0x31,
last_state: 0x31, last_state: 0x31,
}, },
@ -390,6 +394,7 @@ Simulation {
index: StatePartIndex<BigSlots>(4), index: StatePartIndex<BigSlots>(4),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: false,
state: 0x32, state: 0x32,
last_state: 0x32, last_state: 0x32,
}, },
@ -399,6 +404,7 @@ Simulation {
index: StatePartIndex<BigSlots>(5), index: StatePartIndex<BigSlots>(5),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: false,
state: 0x32, state: 0x32,
last_state: 0x32, last_state: 0x32,
}, },

View file

@ -392,7 +392,7 @@ Simulation {
0, 0,
1, 1,
0, 0,
1, 1 (modified),
0, 0,
0, 0,
0, 0,
@ -400,7 +400,7 @@ Simulation {
0, 0,
1, 1,
0, 0,
1, 1 (modified),
0, 0,
], ],
}, },
@ -1252,6 +1252,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(0), index: StatePartIndex<BigSlots>(0),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1260,6 +1261,7 @@ Simulation {
kind: BigSyncReset { kind: BigSyncReset {
index: StatePartIndex<BigSlots>(1), index: StatePartIndex<BigSlots>(1),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1269,6 +1271,7 @@ Simulation {
index: StatePartIndex<SimOnlySlots>(0), index: StatePartIndex<SimOnlySlots>(0),
ty: SimOnly<alloc::collections::btree::map::BTreeMap<alloc::string::String, alloc::rc::Rc<str>>>, ty: SimOnly<alloc::collections::btree::map::BTreeMap<alloc::string::String, alloc::rc::Rc<str>>>,
}, },
maybe_changed: true,
state: { state: {
"extra": "value", "extra": "value",
}, },
@ -1282,6 +1285,7 @@ Simulation {
index: StatePartIndex<SimOnlySlots>(1), index: StatePartIndex<SimOnlySlots>(1),
ty: SimOnly<alloc::collections::btree::map::BTreeMap<alloc::string::String, alloc::rc::Rc<str>>>, ty: SimOnly<alloc::collections::btree::map::BTreeMap<alloc::string::String, alloc::rc::Rc<str>>>,
}, },
maybe_changed: true,
state: { state: {
"extra": "value", "extra": "value",
}, },
@ -1295,6 +1299,7 @@ Simulation {
index: StatePartIndex<SimOnlySlots>(2), index: StatePartIndex<SimOnlySlots>(2),
ty: SimOnly<alloc::collections::btree::map::BTreeMap<alloc::string::String, alloc::rc::Rc<str>>>, ty: SimOnly<alloc::collections::btree::map::BTreeMap<alloc::string::String, alloc::rc::Rc<str>>>,
}, },
maybe_changed: true,
state: { state: {
"bar": "", "bar": "",
"extra": "value", "extra": "value",
@ -1312,6 +1317,7 @@ Simulation {
index: StatePartIndex<SimOnlySlots>(3), index: StatePartIndex<SimOnlySlots>(3),
ty: SimOnly<alloc::collections::btree::map::BTreeMap<alloc::string::String, alloc::rc::Rc<str>>>, ty: SimOnly<alloc::collections::btree::map::BTreeMap<alloc::string::String, alloc::rc::Rc<str>>>,
}, },
maybe_changed: true,
state: { state: {
"bar": "baz", "bar": "baz",
"extra": "value", "extra": "value",
@ -1328,6 +1334,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(4), index: StatePartIndex<BigSlots>(4),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1336,6 +1343,7 @@ Simulation {
kind: BigSyncReset { kind: BigSyncReset {
index: StatePartIndex<BigSlots>(5), index: StatePartIndex<BigSlots>(5),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1345,6 +1353,7 @@ Simulation {
index: StatePartIndex<SimOnlySlots>(6), index: StatePartIndex<SimOnlySlots>(6),
ty: SimOnly<alloc::collections::btree::map::BTreeMap<alloc::string::String, alloc::rc::Rc<str>>>, ty: SimOnly<alloc::collections::btree::map::BTreeMap<alloc::string::String, alloc::rc::Rc<str>>>,
}, },
maybe_changed: true,
state: { state: {
"extra": "value", "extra": "value",
}, },
@ -1358,6 +1367,7 @@ Simulation {
index: StatePartIndex<SimOnlySlots>(7), index: StatePartIndex<SimOnlySlots>(7),
ty: SimOnly<alloc::collections::btree::map::BTreeMap<alloc::string::String, alloc::rc::Rc<str>>>, ty: SimOnly<alloc::collections::btree::map::BTreeMap<alloc::string::String, alloc::rc::Rc<str>>>,
}, },
maybe_changed: true,
state: { state: {
"bar": "", "bar": "",
"extra": "value", "extra": "value",
@ -1374,6 +1384,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(2), index: StatePartIndex<BigSlots>(2),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1382,6 +1393,7 @@ Simulation {
kind: BigSyncReset { kind: BigSyncReset {
index: StatePartIndex<BigSlots>(3), index: StatePartIndex<BigSlots>(3),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1391,6 +1403,7 @@ Simulation {
index: StatePartIndex<SimOnlySlots>(4), index: StatePartIndex<SimOnlySlots>(4),
ty: SimOnly<alloc::collections::btree::map::BTreeMap<alloc::string::String, alloc::rc::Rc<str>>>, ty: SimOnly<alloc::collections::btree::map::BTreeMap<alloc::string::String, alloc::rc::Rc<str>>>,
}, },
maybe_changed: true,
state: { state: {
"extra": "value", "extra": "value",
}, },
@ -1404,6 +1417,7 @@ Simulation {
index: StatePartIndex<SimOnlySlots>(5), index: StatePartIndex<SimOnlySlots>(5),
ty: SimOnly<alloc::collections::btree::map::BTreeMap<alloc::string::String, alloc::rc::Rc<str>>>, ty: SimOnly<alloc::collections::btree::map::BTreeMap<alloc::string::String, alloc::rc::Rc<str>>>,
}, },
maybe_changed: true,
state: { state: {
"bar": "", "bar": "",
"extra": "value", "extra": "value",
@ -1421,6 +1435,7 @@ Simulation {
index: StatePartIndex<SimOnlySlots>(8), index: StatePartIndex<SimOnlySlots>(8),
ty: SimOnly<alloc::collections::btree::map::BTreeMap<alloc::string::String, alloc::rc::Rc<str>>>, ty: SimOnly<alloc::collections::btree::map::BTreeMap<alloc::string::String, alloc::rc::Rc<str>>>,
}, },
maybe_changed: true,
state: { state: {
"extra": "value", "extra": "value",
}, },
@ -1433,6 +1448,7 @@ Simulation {
kind: BigBool { kind: BigBool {
index: StatePartIndex<BigSlots>(6), index: StatePartIndex<BigSlots>(6),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1441,6 +1457,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(12), index: StatePartIndex<BigSlots>(12),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1449,6 +1466,7 @@ Simulation {
kind: BigSyncReset { kind: BigSyncReset {
index: StatePartIndex<BigSlots>(13), index: StatePartIndex<BigSlots>(13),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1458,6 +1476,7 @@ Simulation {
index: StatePartIndex<SimOnlySlots>(13), index: StatePartIndex<SimOnlySlots>(13),
ty: SimOnly<alloc::collections::btree::map::BTreeMap<alloc::string::String, alloc::rc::Rc<str>>>, ty: SimOnly<alloc::collections::btree::map::BTreeMap<alloc::string::String, alloc::rc::Rc<str>>>,
}, },
maybe_changed: true,
state: { state: {
"bar": "", "bar": "",
"extra": "value", "extra": "value",
@ -1475,6 +1494,7 @@ Simulation {
index: StatePartIndex<SimOnlySlots>(14), index: StatePartIndex<SimOnlySlots>(14),
ty: SimOnly<alloc::collections::btree::map::BTreeMap<alloc::string::String, alloc::rc::Rc<str>>>, ty: SimOnly<alloc::collections::btree::map::BTreeMap<alloc::string::String, alloc::rc::Rc<str>>>,
}, },
maybe_changed: true,
state: { state: {
"bar": "baz", "bar": "baz",
"extra": "value", "extra": "value",
@ -1491,6 +1511,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(10), index: StatePartIndex<BigSlots>(10),
}, },
maybe_changed: true,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -1499,6 +1520,7 @@ Simulation {
kind: BigSyncReset { kind: BigSyncReset {
index: StatePartIndex<BigSlots>(11), index: StatePartIndex<BigSlots>(11),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -1508,6 +1530,7 @@ Simulation {
index: StatePartIndex<SimOnlySlots>(11), index: StatePartIndex<SimOnlySlots>(11),
ty: SimOnly<alloc::collections::btree::map::BTreeMap<alloc::string::String, alloc::rc::Rc<str>>>, ty: SimOnly<alloc::collections::btree::map::BTreeMap<alloc::string::String, alloc::rc::Rc<str>>>,
}, },
maybe_changed: true,
state: { state: {
"bar": "", "bar": "",
"extra": "value", "extra": "value",
@ -1525,6 +1548,7 @@ Simulation {
index: StatePartIndex<SimOnlySlots>(12), index: StatePartIndex<SimOnlySlots>(12),
ty: SimOnly<alloc::collections::btree::map::BTreeMap<alloc::string::String, alloc::rc::Rc<str>>>, ty: SimOnly<alloc::collections::btree::map::BTreeMap<alloc::string::String, alloc::rc::Rc<str>>>,
}, },
maybe_changed: true,
state: { state: {
"bar": "baz", "bar": "baz",
"extra": "value", "extra": "value",

View file

@ -530,18 +530,18 @@ Simulation {
}, },
big_slots: StatePart { big_slots: StatePart {
value: [ value: [
0 (modified),
0, 0,
0, 0,
0, 49 (modified),
49, 50 (modified),
50, 50 (modified),
50, 0 (modified),
0, 1 (modified),
1, 0 (modified),
0, 49 (modified),
49, 49 (modified),
49, 50 (modified),
50,
1, 1,
0, 0,
0, 0,
@ -9500,6 +9500,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(0), index: StatePartIndex<BigSlots>(0),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -9508,6 +9509,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(1), index: StatePartIndex<BigSlots>(1),
}, },
maybe_changed: false,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -9516,6 +9518,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(2), index: StatePartIndex<BigSlots>(2),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x1, last_state: 0x1,
}, },
@ -9525,6 +9528,7 @@ Simulation {
index: StatePartIndex<BigSlots>(3), index: StatePartIndex<BigSlots>(3),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: false,
state: 0x31, state: 0x31,
last_state: 0x31, last_state: 0x31,
}, },
@ -9534,6 +9538,7 @@ Simulation {
index: StatePartIndex<BigSlots>(4), index: StatePartIndex<BigSlots>(4),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: false,
state: 0x32, state: 0x32,
last_state: 0x32, last_state: 0x32,
}, },
@ -9543,6 +9548,7 @@ Simulation {
index: StatePartIndex<BigSlots>(5), index: StatePartIndex<BigSlots>(5),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: false,
state: 0x32, state: 0x32,
last_state: 0x32, last_state: 0x32,
}, },
@ -9551,6 +9557,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(6), index: StatePartIndex<BigSlots>(6),
}, },
maybe_changed: false,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -9559,6 +9566,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(7), index: StatePartIndex<BigSlots>(7),
}, },
maybe_changed: false,
state: 0x1, state: 0x1,
last_state: 0x1, last_state: 0x1,
}, },
@ -9567,6 +9575,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(8), index: StatePartIndex<BigSlots>(8),
}, },
maybe_changed: false,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -9576,6 +9585,7 @@ Simulation {
index: StatePartIndex<BigSlots>(9), index: StatePartIndex<BigSlots>(9),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: false,
state: 0x31, state: 0x31,
last_state: 0x31, last_state: 0x31,
}, },
@ -9585,6 +9595,7 @@ Simulation {
index: StatePartIndex<BigSlots>(10), index: StatePartIndex<BigSlots>(10),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: false,
state: 0x31, state: 0x31,
last_state: 0x31, last_state: 0x31,
}, },
@ -9594,6 +9605,7 @@ Simulation {
index: StatePartIndex<BigSlots>(11), index: StatePartIndex<BigSlots>(11),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: false,
state: 0x32, state: 0x32,
last_state: 0x32, last_state: 0x32,
}, },

View file

@ -56,8 +56,8 @@ Simulation {
}, },
big_slots: StatePart { big_slots: StatePart {
value: [ value: [
0, 0 (modified),
0, 0 (modified),
3, 3,
], ],
}, },
@ -310,6 +310,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(0), index: StatePartIndex<BigSlots>(0),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -318,6 +319,7 @@ Simulation {
kind: BigAsyncReset { kind: BigAsyncReset {
index: StatePartIndex<BigSlots>(1), index: StatePartIndex<BigSlots>(1),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -327,6 +329,7 @@ Simulation {
index: StatePartIndex<BigSlots>(2), index: StatePartIndex<BigSlots>(2),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: false,
state: 0x03, state: 0x03,
last_state: 0x03, last_state: 0x03,
}, },

View file

@ -56,8 +56,8 @@ Simulation {
}, },
big_slots: StatePart { big_slots: StatePart {
value: [ value: [
0, 0 (modified),
0, 0 (modified),
3, 3,
], ],
}, },
@ -310,6 +310,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(0), index: StatePartIndex<BigSlots>(0),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -318,6 +319,7 @@ Simulation {
kind: BigAsyncReset { kind: BigAsyncReset {
index: StatePartIndex<BigSlots>(1), index: StatePartIndex<BigSlots>(1),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -327,6 +329,7 @@ Simulation {
index: StatePartIndex<BigSlots>(2), index: StatePartIndex<BigSlots>(2),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: false,
state: 0x03, state: 0x03,
last_state: 0x03, last_state: 0x03,
}, },

View file

@ -56,7 +56,7 @@ Simulation {
}, },
big_slots: StatePart { big_slots: StatePart {
value: [ value: [
0, 0 (modified),
0, 0,
3, 3,
], ],
@ -310,6 +310,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(0), index: StatePartIndex<BigSlots>(0),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -318,6 +319,7 @@ Simulation {
kind: BigSyncReset { kind: BigSyncReset {
index: StatePartIndex<BigSlots>(1), index: StatePartIndex<BigSlots>(1),
}, },
maybe_changed: false,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -327,6 +329,7 @@ Simulation {
index: StatePartIndex<BigSlots>(2), index: StatePartIndex<BigSlots>(2),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: false,
state: 0x03, state: 0x03,
last_state: 0x03, last_state: 0x03,
}, },

View file

@ -56,7 +56,7 @@ Simulation {
}, },
big_slots: StatePart { big_slots: StatePart {
value: [ value: [
0, 0 (modified),
0, 0,
3, 3,
], ],
@ -310,6 +310,7 @@ Simulation {
kind: BigClock { kind: BigClock {
index: StatePartIndex<BigSlots>(0), index: StatePartIndex<BigSlots>(0),
}, },
maybe_changed: true,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -318,6 +319,7 @@ Simulation {
kind: BigSyncReset { kind: BigSyncReset {
index: StatePartIndex<BigSlots>(1), index: StatePartIndex<BigSlots>(1),
}, },
maybe_changed: false,
state: 0x0, state: 0x0,
last_state: 0x0, last_state: 0x0,
}, },
@ -327,6 +329,7 @@ Simulation {
index: StatePartIndex<BigSlots>(2), index: StatePartIndex<BigSlots>(2),
ty: UInt<8>, ty: UInt<8>,
}, },
maybe_changed: false,
state: 0x03, state: 0x03,
last_state: 0x03, last_state: 0x03,
}, },

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,221 @@
$timescale 1 ps $end
$scope module sim_trace_as_string $end
$var wire 1 J(7*b clk $end
$scope struct read $end
$var wire 8 @t0}\ addr $end
$var wire 1 78"T5 en $end
$var wire 1 G7v@m clk $end
$var string 1 F&^FN data $end
$upscope $end
$scope struct write $end
$var wire 8 "fUdW addr $end
$var wire 1 r1OK) en $end
$var wire 1 ,ADvU clk $end
$scope struct data $end
$var string 1 pD.mP \[0] $end
$var string 1 !V!em \[1] $end
$upscope $end
$scope struct mask $end
$var wire 1 l8dgD \[0] $end
$var wire 1 1/sDs \[1] $end
$upscope $end
$upscope $end
$scope struct mem $end
$scope struct contents $end
$scope struct \[0] $end
$scope struct mem $end
$var string 1 sz>#| \[0] $end
$var string 1 G._83 \[1] $end
$upscope $end
$upscope $end
$scope struct \[1] $end
$scope struct mem $end
$var string 1 2r3#W \[0] $end
$var string 1 AbGF% \[1] $end
$upscope $end
$upscope $end
$scope struct \[2] $end
$scope struct mem $end
$var string 1 .^<$p \[0] $end
$var string 1 ?s@Dc \[1] $end
$upscope $end
$upscope $end
$scope struct \[3] $end
$scope struct mem $end
$var string 1 {*||o \[0] $end
$var string 1 Bg,vB \[1] $end
$upscope $end
$upscope $end
$upscope $end
$scope struct r0 $end
$var wire 2 .0()- addr $end
$var wire 1 GEbRA en $end
$var wire 1 ;`9BK clk $end
$scope struct data $end
$var string 1 _Xe"P \[0] $end
$var string 1 jXrsx \[1] $end
$upscope $end
$upscope $end
$scope struct w1 $end
$var wire 2 '8u?z addr $end
$var wire 1 ~o=`& en $end
$var wire 1 *q>M1 clk $end
$scope struct data $end
$var string 1 N\zBe \[0] $end
$var string 1 c3h8{ \[1] $end
$upscope $end
$scope struct mask $end
$var wire 1 .SYGD \[0] $end
$var wire 1 />wYd \[1] $end
$upscope $end
$upscope $end
$upscope $end
$upscope $end
$enddefinitions $end
$dumpvars
s sz>#|
s G._83
s 2r3#W
s AbGF%
s .^<$p
s ?s@Dc
s {*||o
s Bg,vB
0J(7*b
b0 @t0}\
078"T5
0G7v@m
s[,\x20] F&^FN
b0 "fUdW
0r1OK)
0,ADvU
s pD.mP
s !V!em
0l8dgD
01/sDs
b0 .0()-
0GEbRA
0;`9BK
s _Xe"P
s jXrsx
b0 '8u?z
0~o=`&
0*q>M1
s N\zBe
s c3h8{
0.SYGD
0/>wYd
$end
#500000
1J(7*b
1;`9BK
1*q>M1
#1000000
0J(7*b
1r1OK)
smem[0][0] pD.mP
smem[0][1] !V!em
1l8dgD
11/sDs
0;`9BK
1~o=`&
0*q>M1
smem[0][0] N\zBe
smem[0][1] c3h8{
1.SYGD
1/>wYd
#1500000
smem[0][0] sz>#|
smem[0][1] G._83
1J(7*b
1;`9BK
1*q>M1
#2000000
0J(7*b
b1 "fUdW
smem[1][0] pD.mP
smem[1][1] !V!em
0;`9BK
b1 '8u?z
0*q>M1
smem[1][0] N\zBe
smem[1][1] c3h8{
#2500000
smem[1][0] 2r3#W
smem[1][1] AbGF%
1J(7*b
1;`9BK
1*q>M1
#3000000
0J(7*b
b10 "fUdW
smem[2][0] pD.mP
smem[2][1] !V!em
0;`9BK
b10 '8u?z
0*q>M1
smem[2][0] N\zBe
smem[2][1] c3h8{
#3500000
smem[2][0] .^<$p
smem[2][1] ?s@Dc
1J(7*b
1;`9BK
1*q>M1
#4000000
0J(7*b
b11 "fUdW
smem[3][0] pD.mP
smem[3][1] !V!em
0;`9BK
b11 '8u?z
0*q>M1
smem[3][0] N\zBe
smem[3][1] c3h8{
#4500000
smem[3][0] {*||o
smem[3][1] Bg,vB
1J(7*b
1;`9BK
1*q>M1
#5000000
0J(7*b
b1 @t0}\
178"T5
s[mem[1][0],\x20mem[1][1]] F&^FN
b0 "fUdW
0r1OK)
s<!!!failed\x20to\x20format!!!> pD.mP
s<!!!failed\x20to\x20format!!!> !V!em
b1 .0()-
1GEbRA
0;`9BK
smem[1][0] _Xe"P
smem[1][1] jXrsx
b0 '8u?z
0~o=`&
0*q>M1
s<!!!failed\x20to\x20format!!!> N\zBe
s<!!!failed\x20to\x20format!!!> c3h8{
#5500000
1J(7*b
1;`9BK
1*q>M1
#6000000
0J(7*b
b1 "fUdW
1r1OK)
0;`9BK
b1 '8u?z
1~o=`&
0*q>M1
#6500000
s<!!!failed\x20to\x20format!!!> 2r3#W
s<!!!failed\x20to\x20format!!!> AbGF%
1J(7*b
s<!!!failed\x20to\x20format!!!> F&^FN
1;`9BK
s<!!!failed\x20to\x20format!!!> _Xe"P
s<!!!failed\x20to\x20format!!!> jXrsx
1*q>M1
#7000000

View file

@ -55,7 +55,7 @@ error[E0277]: `Rc<(dyn value::sim_only_value_unsafe::DynSimOnlyValueTrait + 'sta
note: required because it appears within the type `DynSimOnlyValue` note: required because it appears within the type `DynSimOnlyValue`
--> src/sim/value/sim_only_value_unsafe.rs --> src/sim/value/sim_only_value_unsafe.rs
| |
271 | pub struct DynSimOnlyValue(Rc<dyn DynSimOnlyValueTrait>); 281 | pub struct DynSimOnlyValue(Rc<dyn DynSimOnlyValueTrait>);
| ^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^
note: required because it appears within the type `PhantomData<DynSimOnlyValue>` note: required because it appears within the type `PhantomData<DynSimOnlyValue>`
--> $RUST/core/src/marker.rs --> $RUST/core/src/marker.rs
@ -75,7 +75,7 @@ note: required because it appears within the type `Vec<DynSimOnlyValue>`
note: required because it appears within the type `OpaqueSimValue` note: required because it appears within the type `OpaqueSimValue`
--> src/ty.rs --> src/ty.rs
| |
734 | pub struct OpaqueSimValue { 896 | pub struct OpaqueSimValue {
| ^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^
note: required because it appears within the type `value::SimValueInner<()>` note: required because it appears within the type `value::SimValueInner<()>`
--> src/sim/value.rs --> src/sim/value.rs
@ -194,7 +194,7 @@ error[E0277]: `Rc<(dyn value::sim_only_value_unsafe::DynSimOnlyValueTrait + 'sta
note: required because it appears within the type `DynSimOnlyValue` note: required because it appears within the type `DynSimOnlyValue`
--> src/sim/value/sim_only_value_unsafe.rs --> src/sim/value/sim_only_value_unsafe.rs
| |
271 | pub struct DynSimOnlyValue(Rc<dyn DynSimOnlyValueTrait>); 281 | pub struct DynSimOnlyValue(Rc<dyn DynSimOnlyValueTrait>);
| ^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^
note: required because it appears within the type `PhantomData<DynSimOnlyValue>` note: required because it appears within the type `PhantomData<DynSimOnlyValue>`
--> $RUST/core/src/marker.rs --> $RUST/core/src/marker.rs
@ -214,7 +214,7 @@ note: required because it appears within the type `Vec<DynSimOnlyValue>`
note: required because it appears within the type `OpaqueSimValue` note: required because it appears within the type `OpaqueSimValue`
--> src/ty.rs --> src/ty.rs
| |
734 | pub struct OpaqueSimValue { 896 | pub struct OpaqueSimValue {
| ^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^
note: required because it appears within the type `value::SimValueInner<()>` note: required because it appears within the type `value::SimValueInner<()>`
--> src/sim/value.rs --> src/sim/value.rs
@ -306,7 +306,7 @@ error[E0277]: `Rc<(dyn value::sim_only_value_unsafe::DynSimOnlyValueTrait + 'sta
note: required because it appears within the type `DynSimOnlyValue` note: required because it appears within the type `DynSimOnlyValue`
--> src/sim/value/sim_only_value_unsafe.rs --> src/sim/value/sim_only_value_unsafe.rs
| |
271 | pub struct DynSimOnlyValue(Rc<dyn DynSimOnlyValueTrait>); 281 | pub struct DynSimOnlyValue(Rc<dyn DynSimOnlyValueTrait>);
| ^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^
note: required because it appears within the type `PhantomData<DynSimOnlyValue>` note: required because it appears within the type `PhantomData<DynSimOnlyValue>`
--> $RUST/core/src/marker.rs --> $RUST/core/src/marker.rs
@ -326,7 +326,7 @@ note: required because it appears within the type `Vec<DynSimOnlyValue>`
note: required because it appears within the type `OpaqueSimValue` note: required because it appears within the type `OpaqueSimValue`
--> src/ty.rs --> src/ty.rs
| |
734 | pub struct OpaqueSimValue { 896 | pub struct OpaqueSimValue {
| ^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^
note: required because it appears within the type `value::SimValueInner<()>` note: required because it appears within the type `value::SimValueInner<()>`
--> src/sim/value.rs --> src/sim/value.rs

View file

@ -51,7 +51,8 @@
"Reset": "Visible", "Reset": "Visible",
"Clock": "Visible", "Clock": "Visible",
"PhantomConst": "Visible", "PhantomConst": "Visible",
"DynSimOnly": "Visible" "DynSimOnly": "Visible",
"TraceAsString": "Visible"
} }
}, },
"Bundle": { "Bundle": {
@ -1021,6 +1022,27 @@
"fold_where": "T: Fold<State>", "fold_where": "T: Fold<State>",
"visit_where": "T: Visit<State>" "visit_where": "T: Visit<State>"
}, },
"ops::ToTraceAsString": {
"data": {
"$kind": "Struct",
"$constructor": "ops::ToTraceAsString::new",
"inner()": "Visible",
"ty()": "Visible"
},
"generics": "<T: Type>",
"fold_where": "T: Fold<State>",
"visit_where": "T: Visit<State>"
},
"ops::TraceAsStringAsInner": {
"data": {
"$kind": "Struct",
"$constructor": "ops::TraceAsStringAsInner::new",
"arg_typed()": "Visible"
},
"generics": "<T: Type>",
"fold_where": "T: Fold<State>",
"visit_where": "T: Visit<State>"
},
"BlockId": { "BlockId": {
"data": { "data": {
"$kind": "Opaque" "$kind": "Opaque"
@ -1283,12 +1305,25 @@
"$kind": "Struct" "$kind": "Struct"
} }
}, },
"TargetPathTraceAsStringInner": {
"data": {
"$kind": "Struct"
}
},
"TargetPathToTraceAsString": {
"data": {
"$kind": "Struct",
"ty": "Visible"
}
},
"TargetPathElement": { "TargetPathElement": {
"data": { "data": {
"$kind": "Enum", "$kind": "Enum",
"BundleField": "Visible", "BundleField": "Visible",
"ArrayElement": "Visible", "ArrayElement": "Visible",
"DynArrayElement": "Visible" "DynArrayElement": "Visible",
"TraceAsStringInner": "Visible",
"ToTraceAsString": "Visible"
} }
}, },
"PhantomConst": { "PhantomConst": {
@ -1306,6 +1341,14 @@
"data": { "data": {
"$kind": "ManualImpl" "$kind": "ManualImpl"
} }
},
"TraceAsString": {
"data": {
"$kind": "ManualImpl"
},
"generics": "<T: Type>",
"fold_where": "T: Fold<State>",
"visit_where": "T: Visit<State>"
} }
} }
} }