add memory::splat_mask to generate mask types from a Bool
This commit is contained in:
parent
a701f99fd6
commit
f6146048d1
|
@ -7,7 +7,7 @@ use crate::{
|
||||||
array::{Array, ArrayType},
|
array::{Array, ArrayType},
|
||||||
bundle::{Bundle, BundleType},
|
bundle::{Bundle, BundleType},
|
||||||
clock::Clock,
|
clock::Clock,
|
||||||
expr::{Expr, Flow, ToExpr, ToLiteralBits},
|
expr::{ops::BundleLiteral, repeat, Expr, Flow, ToExpr, ToLiteralBits},
|
||||||
hdl,
|
hdl,
|
||||||
int::{Bool, DynSize, Size, UInt, UIntType},
|
int::{Bool, DynSize, Size, UInt, UIntType},
|
||||||
intern::{Intern, Interned},
|
intern::{Intern, Interned},
|
||||||
|
@ -1050,3 +1050,32 @@ impl<Element: Type, Len: Size> MemBuilder<Element, Len> {
|
||||||
.extend(annotations.into_annotations());
|
.extend(annotations.into_annotations());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn splat_mask<T: Type>(ty: T, value: Expr<Bool>) -> Expr<AsMask<T>> {
|
||||||
|
let canonical_ty = ty.canonical();
|
||||||
|
match canonical_ty {
|
||||||
|
CanonicalType::UInt(_)
|
||||||
|
| CanonicalType::SInt(_)
|
||||||
|
| CanonicalType::Bool(_)
|
||||||
|
| CanonicalType::AsyncReset(_)
|
||||||
|
| CanonicalType::SyncReset(_)
|
||||||
|
| CanonicalType::Reset(_)
|
||||||
|
| CanonicalType::Clock(_)
|
||||||
|
| CanonicalType::Enum(_) => Expr::from_canonical(Expr::canonical(value)),
|
||||||
|
CanonicalType::Array(array) => Expr::from_canonical(Expr::canonical(repeat(
|
||||||
|
splat_mask(array.element(), value),
|
||||||
|
array.len(),
|
||||||
|
))),
|
||||||
|
CanonicalType::Bundle(bundle) => Expr::from_canonical(Expr::canonical(
|
||||||
|
BundleLiteral::new(
|
||||||
|
bundle.mask_type(),
|
||||||
|
bundle
|
||||||
|
.fields()
|
||||||
|
.iter()
|
||||||
|
.map(|field| splat_mask(field.ty, value))
|
||||||
|
.collect(),
|
||||||
|
)
|
||||||
|
.to_expr(),
|
||||||
|
)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue