forked from libre-chip/fayalite
implement #[hdl(cmp_eq)] for enums
This commit is contained in:
parent
8e4eeef723
commit
7516ec3c24
3 changed files with 530 additions and 7 deletions
|
|
@ -1223,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);
|
||||||
|
|
|
||||||
|
|
@ -159,14 +159,11 @@ 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_debug: _,
|
||||||
custom_sim_display: _,
|
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");
|
||||||
}
|
}
|
||||||
|
|
@ -249,7 +246,7 @@ 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_debug: _,
|
||||||
custom_sim_display,
|
custom_sim_display,
|
||||||
|
|
@ -938,6 +935,172 @@ impl ToTokens for ParsedEnum {
|
||||||
}
|
}
|
||||||
}.to_tokens(tokens);
|
}.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,
|
||||||
|
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]
|
||||||
|
|
|
||||||
|
|
@ -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]
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue