Compare commits
2 commits
25aa90ec60
...
929e9f8b16
Author | SHA1 | Date | |
---|---|---|---|
Jacob Lifshay | 929e9f8b16 | ||
Jacob Lifshay | 28f32d7d1a |
|
@ -15,3 +15,4 @@ jobs:
|
||||||
with:
|
with:
|
||||||
save-if: ${{ github.ref == 'refs/heads/master' }}
|
save-if: ${{ github.ref == 'refs/heads/master' }}
|
||||||
- run: cargo test
|
- run: cargo test
|
||||||
|
- run: cargo doc
|
||||||
|
|
|
@ -4,7 +4,7 @@ use crate::{
|
||||||
array::ArrayType,
|
array::ArrayType,
|
||||||
bundle::{BundleType, BundleValue, DynBundle, DynBundleType, FieldType},
|
bundle::{BundleType, BundleValue, DynBundle, DynBundleType, FieldType},
|
||||||
enum_::{DynEnumType, EnumType, EnumValue},
|
enum_::{DynEnumType, EnumType, EnumValue},
|
||||||
int::{DynSIntType, DynUIntType, FixedOrDynIntType, IntValue, UInt, UIntType},
|
int::{DynSIntType, DynUInt, DynUIntType, FixedOrDynIntType, IntValue, UInt, UIntType},
|
||||||
intern::{Intern, Interned, InternedCompare, PtrEqWithTypeId, SupportsPtrEqWithTypeId},
|
intern::{Intern, Interned, InternedCompare, PtrEqWithTypeId, SupportsPtrEqWithTypeId},
|
||||||
memory::{DynPortType, MemPort, PortType},
|
memory::{DynPortType, MemPort, PortType},
|
||||||
module::{
|
module::{
|
||||||
|
@ -288,7 +288,12 @@ impl<T> Hash for Expr<T> {
|
||||||
|
|
||||||
impl<T> Expr<IntValue<T>>
|
impl<T> Expr<IntValue<T>>
|
||||||
where
|
where
|
||||||
T: FixedOrDynIntType<1, Signed = ConstBool<false>>,
|
T: FixedOrDynIntType<
|
||||||
|
1,
|
||||||
|
Signed = ConstBool<false>,
|
||||||
|
CanonicalType = DynUIntType,
|
||||||
|
CanonicalValue = DynUInt,
|
||||||
|
>,
|
||||||
{
|
{
|
||||||
pub fn as_bool(self) -> Expr<UInt<1>> {
|
pub fn as_bool(self) -> Expr<UInt<1>> {
|
||||||
assert_eq!(self.canonical_type().width, 1);
|
assert_eq!(self.canonical_type().width, 1);
|
||||||
|
|
|
@ -10,8 +10,8 @@ use crate::{
|
||||||
TargetPathDynArrayElement, TargetPathElement, ToExpr,
|
TargetPathDynArrayElement, TargetPathElement, ToExpr,
|
||||||
},
|
},
|
||||||
int::{
|
int::{
|
||||||
DynIntType, DynSInt, DynSIntType, DynUInt, DynUIntType, FixedOrDynIntType, Int, IntCmp,
|
DynInt, DynIntType, DynSInt, DynSIntType, DynUInt, DynUIntType, FixedOrDynIntType, Int,
|
||||||
IntTypeTrait, IntValue, UInt, UIntType,
|
IntCmp, IntTypeTrait, IntValue, UInt, UIntType,
|
||||||
},
|
},
|
||||||
intern::{Intern, Interned},
|
intern::{Intern, Interned},
|
||||||
reset::{
|
reset::{
|
||||||
|
@ -242,7 +242,7 @@ unary_op! {
|
||||||
#[method = not]
|
#[method = not]
|
||||||
impl<T> Not for _
|
impl<T> Not for _
|
||||||
where (
|
where (
|
||||||
T: IntTypeTrait,
|
T: IntTypeTrait<CanonicalType = DynIntType<<T as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<T as IntTypeTrait>::Signed>>,
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
fn expr_enum(&self) -> _ {
|
fn expr_enum(&self) -> _ {
|
||||||
|
@ -262,7 +262,7 @@ unary_op! {
|
||||||
#[method = neg]
|
#[method = neg]
|
||||||
impl<T> Neg for _
|
impl<T> Neg for _
|
||||||
where (
|
where (
|
||||||
T: IntTypeTrait<Signed = ConstBool<true>>,
|
T: IntTypeTrait<Signed = ConstBool<true>, CanonicalType = DynSIntType, CanonicalValue = DynSInt>,
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
fn expr_enum(&self) -> _ {
|
fn expr_enum(&self) -> _ {
|
||||||
|
@ -361,48 +361,48 @@ binary_op! {
|
||||||
#[method = bitand, rhs_to_canonical_dyn = to_canonical_dyn, expr_enum_u = BitAndU, expr_enum_s = BitAndS]
|
#[method = bitand, rhs_to_canonical_dyn = to_canonical_dyn, expr_enum_u = BitAndU, expr_enum_s = BitAndS]
|
||||||
impl<L, R> BitAnd for _
|
impl<L, R> BitAnd for _
|
||||||
where
|
where
|
||||||
L: IntTypeTrait,
|
L: IntTypeTrait<CanonicalType = DynIntType<<L as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<L as IntTypeTrait>::Signed>>,
|
||||||
R: IntTypeTrait<Signed = L::Signed>,
|
R: IntTypeTrait<Signed = L::Signed, CanonicalType = DynIntType<<R as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<R as IntTypeTrait>::Signed>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
binary_op! {
|
binary_op! {
|
||||||
#[method = bitor, rhs_to_canonical_dyn = to_canonical_dyn, expr_enum_u = BitOrU, expr_enum_s = BitOrS]
|
#[method = bitor, rhs_to_canonical_dyn = to_canonical_dyn, expr_enum_u = BitOrU, expr_enum_s = BitOrS]
|
||||||
impl<L, R> BitOr for _
|
impl<L, R> BitOr for _
|
||||||
where
|
where
|
||||||
L: IntTypeTrait,
|
L: IntTypeTrait<CanonicalType = DynIntType<<L as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<L as IntTypeTrait>::Signed>>,
|
||||||
R: IntTypeTrait<Signed = L::Signed>,
|
R: IntTypeTrait<Signed = L::Signed, CanonicalType = DynIntType<<R as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<R as IntTypeTrait>::Signed>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
binary_op! {
|
binary_op! {
|
||||||
#[method = bitxor, rhs_to_canonical_dyn = to_canonical_dyn, expr_enum_u = BitXorU, expr_enum_s = BitXorS]
|
#[method = bitxor, rhs_to_canonical_dyn = to_canonical_dyn, expr_enum_u = BitXorU, expr_enum_s = BitXorS]
|
||||||
impl<L, R> BitXor for _
|
impl<L, R> BitXor for _
|
||||||
where
|
where
|
||||||
L: IntTypeTrait,
|
L: IntTypeTrait<CanonicalType = DynIntType<<L as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<L as IntTypeTrait>::Signed>>,
|
||||||
R: IntTypeTrait<Signed = L::Signed>,
|
R: IntTypeTrait<Signed = L::Signed, CanonicalType = DynIntType<<R as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<R as IntTypeTrait>::Signed>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
binary_op! {
|
binary_op! {
|
||||||
#[method = add, rhs_to_canonical_dyn = to_canonical_dyn, expr_enum_u = AddU, expr_enum_s = AddS]
|
#[method = add, rhs_to_canonical_dyn = to_canonical_dyn, expr_enum_u = AddU, expr_enum_s = AddS]
|
||||||
impl<L, R> Add for _
|
impl<L, R> Add for _
|
||||||
where
|
where
|
||||||
L: IntTypeTrait,
|
L: IntTypeTrait<CanonicalType = DynIntType<<L as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<L as IntTypeTrait>::Signed>>,
|
||||||
R: IntTypeTrait<Signed = L::Signed>,
|
R: IntTypeTrait<Signed = L::Signed, CanonicalType = DynIntType<<R as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<R as IntTypeTrait>::Signed>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
binary_op! {
|
binary_op! {
|
||||||
#[method = sub, rhs_to_canonical_dyn = to_canonical_dyn, expr_enum_u = SubU, expr_enum_s = SubS]
|
#[method = sub, rhs_to_canonical_dyn = to_canonical_dyn, expr_enum_u = SubU, expr_enum_s = SubS]
|
||||||
impl<L, R> Sub for _
|
impl<L, R> Sub for _
|
||||||
where
|
where
|
||||||
L: IntTypeTrait,
|
L: IntTypeTrait<CanonicalType = DynIntType<<L as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<L as IntTypeTrait>::Signed>>,
|
||||||
R: IntTypeTrait<Signed = L::Signed>,
|
R: IntTypeTrait<Signed = L::Signed, CanonicalType = DynIntType<<R as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<R as IntTypeTrait>::Signed>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
binary_op! {
|
binary_op! {
|
||||||
#[method = mul, rhs_to_canonical_dyn = to_canonical_dyn, expr_enum_u = MulU, expr_enum_s = MulS]
|
#[method = mul, rhs_to_canonical_dyn = to_canonical_dyn, expr_enum_u = MulU, expr_enum_s = MulS]
|
||||||
impl<L, R> Mul for _
|
impl<L, R> Mul for _
|
||||||
where
|
where
|
||||||
L: IntTypeTrait,
|
L: IntTypeTrait<CanonicalType = DynIntType<<L as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<L as IntTypeTrait>::Signed>>,
|
||||||
R: IntTypeTrait<Signed = L::Signed>,
|
R: IntTypeTrait<Signed = L::Signed, CanonicalType = DynIntType<<R as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<R as IntTypeTrait>::Signed>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
macro_rules! dyn_shift_op {
|
macro_rules! dyn_shift_op {
|
||||||
|
@ -413,7 +413,7 @@ macro_rules! dyn_shift_op {
|
||||||
fixed_ary_op! {
|
fixed_ary_op! {
|
||||||
pub struct $DynOp<LhsType,>
|
pub struct $DynOp<LhsType,>
|
||||||
where (
|
where (
|
||||||
LhsType: IntTypeTrait,
|
LhsType: IntTypeTrait<CanonicalType = DynIntType<<LhsType as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<LhsType as IntTypeTrait>::Signed>>,
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
pub lhs: Expr<LhsType::CanonicalValue>,
|
pub lhs: Expr<LhsType::CanonicalValue>,
|
||||||
|
@ -458,8 +458,8 @@ macro_rules! dyn_shift_op {
|
||||||
|
|
||||||
impl<Lhs: Value<Type = LhsType>, LhsType, RhsType, Rhs: Value<Type = RhsType>> ops::$Op<Expr<Rhs>> for Expr<Lhs>
|
impl<Lhs: Value<Type = LhsType>, LhsType, RhsType, Rhs: Value<Type = RhsType>> ops::$Op<Expr<Rhs>> for Expr<Lhs>
|
||||||
where
|
where
|
||||||
LhsType: IntTypeTrait,
|
LhsType: IntTypeTrait<CanonicalType = DynIntType<<LhsType as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<LhsType as IntTypeTrait>::Signed>>,
|
||||||
RhsType: IntTypeTrait<Signed = ConstBool<false>>,
|
RhsType: IntTypeTrait<Signed = ConstBool<false>, CanonicalType = DynUIntType, CanonicalValue = DynUInt>,
|
||||||
{
|
{
|
||||||
type Output = Expr<<<Valueless<LhsType> as ops::$Op<Valueless<RhsType>>>::Output as ValuelessTr>::Value>;
|
type Output = Expr<<<Valueless<LhsType> as ops::$Op<Valueless<RhsType>>>::Output as ValuelessTr>::Value>;
|
||||||
|
|
||||||
|
@ -470,8 +470,8 @@ macro_rules! dyn_shift_op {
|
||||||
|
|
||||||
impl<LhsType, RhsType, Rhs: Value<Type = RhsType>> ops::$Op<Expr<Rhs>> for IntValue<LhsType>
|
impl<LhsType, RhsType, Rhs: Value<Type = RhsType>> ops::$Op<Expr<Rhs>> for IntValue<LhsType>
|
||||||
where
|
where
|
||||||
LhsType: IntTypeTrait,
|
LhsType: IntTypeTrait<CanonicalType = DynIntType<<LhsType as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<LhsType as IntTypeTrait>::Signed>>,
|
||||||
RhsType: IntTypeTrait<Signed = ConstBool<false>>,
|
RhsType: IntTypeTrait<Signed = ConstBool<false>, CanonicalType = DynUIntType, CanonicalValue = DynUInt>,
|
||||||
{
|
{
|
||||||
type Output = Expr<<<Valueless<LhsType> as ops::$Op<Valueless<RhsType>>>::Output as ValuelessTr>::Value>;
|
type Output = Expr<<<Valueless<LhsType> as ops::$Op<Valueless<RhsType>>>::Output as ValuelessTr>::Value>;
|
||||||
|
|
||||||
|
@ -490,7 +490,7 @@ macro_rules! fixed_shift_op {
|
||||||
fixed_ary_op! {
|
fixed_ary_op! {
|
||||||
pub struct $FixedOp<LhsType,>
|
pub struct $FixedOp<LhsType,>
|
||||||
where (
|
where (
|
||||||
LhsType: IntTypeTrait,
|
LhsType: IntTypeTrait<CanonicalType = DynIntType<<LhsType as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<LhsType as IntTypeTrait>::Signed>>,
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
pub lhs: Expr<LhsType::CanonicalValue>,
|
pub lhs: Expr<LhsType::CanonicalValue>,
|
||||||
|
@ -532,7 +532,7 @@ macro_rules! fixed_shift_op {
|
||||||
|
|
||||||
impl<Lhs: Value<Type = LhsType>, LhsType> ops::$Op<usize> for Expr<Lhs>
|
impl<Lhs: Value<Type = LhsType>, LhsType> ops::$Op<usize> for Expr<Lhs>
|
||||||
where
|
where
|
||||||
LhsType: IntTypeTrait,
|
LhsType: IntTypeTrait<CanonicalType = DynIntType<<LhsType as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<LhsType as IntTypeTrait>::Signed>>,
|
||||||
{
|
{
|
||||||
type Output = Expr<<<Valueless<LhsType> as ops::$Op<usize>>::Output as ValuelessTr>::Value>;
|
type Output = Expr<<<Valueless<LhsType> as ops::$Op<usize>>::Output as ValuelessTr>::Value>;
|
||||||
|
|
||||||
|
@ -568,9 +568,9 @@ macro_rules! cmp_op {
|
||||||
$(fixed_ary_op! {
|
$(fixed_ary_op! {
|
||||||
pub struct $CmpOp<LhsType, RhsType, Output,>
|
pub struct $CmpOp<LhsType, RhsType, Output,>
|
||||||
where (
|
where (
|
||||||
LhsType: IntTypeTrait,
|
LhsType: IntTypeTrait<CanonicalType = DynIntType<<LhsType as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<LhsType as IntTypeTrait>::Signed>>,
|
||||||
RhsType: IntTypeTrait<Signed = LhsType::Signed>,
|
RhsType: IntTypeTrait<Signed = LhsType::Signed, CanonicalType = DynIntType<<RhsType as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<RhsType as IntTypeTrait>::Signed>>,
|
||||||
Output: FixedOrDynIntType<1, Signed = ConstBool<false>>,
|
Output: FixedOrDynIntType<1, Signed = ConstBool<false>, CanonicalType = DynUIntType, CanonicalValue = DynUInt>,
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
pub lhs: Expr<LhsType::CanonicalValue>,
|
pub lhs: Expr<LhsType::CanonicalValue>,
|
||||||
|
@ -612,7 +612,7 @@ macro_rules! cmp_op {
|
||||||
}
|
}
|
||||||
})*
|
})*
|
||||||
|
|
||||||
impl<LhsType: IntTypeTrait, RhsType: IntTypeTrait<Signed = LhsType::Signed>, Rhs: Value<Type = RhsType>, Lhs: Value<Type = LhsType>> IntCmp<Expr<Rhs>> for Expr<Lhs> {
|
impl<LhsType: IntTypeTrait<CanonicalType = DynIntType<<LhsType as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<LhsType as IntTypeTrait>::Signed>>, RhsType: IntTypeTrait<Signed = LhsType::Signed, CanonicalType = DynIntType<<RhsType as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<RhsType as IntTypeTrait>::Signed>>, Rhs: Value<Type = RhsType>, Lhs: Value<Type = LhsType>> IntCmp<Expr<Rhs>> for Expr<Lhs> {
|
||||||
type Output = Expr<UInt<1>>;
|
type Output = Expr<UInt<1>>;
|
||||||
|
|
||||||
$(fn $fn(self, rhs: Expr<Rhs>) -> Self::Output {
|
$(fn $fn(self, rhs: Expr<Rhs>) -> Self::Output {
|
||||||
|
@ -620,7 +620,7 @@ macro_rules! cmp_op {
|
||||||
})*
|
})*
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<LhsType: IntTypeTrait, RhsType: IntTypeTrait<Signed = LhsType::Signed>, Rhs: Value<Type = RhsType>, Lhs: Value<Type = LhsType>> IntCmp<Rhs> for Expr<Lhs> {
|
impl<LhsType: IntTypeTrait<CanonicalType = DynIntType<<LhsType as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<LhsType as IntTypeTrait>::Signed>>, RhsType: IntTypeTrait<Signed = LhsType::Signed, CanonicalType = DynIntType<<RhsType as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<RhsType as IntTypeTrait>::Signed>>, Rhs: Value<Type = RhsType>, Lhs: Value<Type = LhsType>> IntCmp<Rhs> for Expr<Lhs> {
|
||||||
type Output = Expr<UInt<1>>;
|
type Output = Expr<UInt<1>>;
|
||||||
|
|
||||||
$(fn $fn(self, rhs: Rhs) -> Self::Output {
|
$(fn $fn(self, rhs: Rhs) -> Self::Output {
|
||||||
|
@ -628,7 +628,7 @@ macro_rules! cmp_op {
|
||||||
})*
|
})*
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<LhsType: IntTypeTrait, RhsType: IntTypeTrait<Signed = LhsType::Signed>, Rhs: Value<Type = RhsType>> IntCmp<Expr<Rhs>> for IntValue<LhsType> {
|
impl<LhsType: IntTypeTrait<CanonicalType = DynIntType<<LhsType as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<LhsType as IntTypeTrait>::Signed>>, RhsType: IntTypeTrait<Signed = LhsType::Signed, CanonicalType = DynIntType<<RhsType as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<RhsType as IntTypeTrait>::Signed>>, Rhs: Value<Type = RhsType>> IntCmp<Expr<Rhs>> for IntValue<LhsType> {
|
||||||
type Output = Expr<UInt<1>>;
|
type Output = Expr<UInt<1>>;
|
||||||
|
|
||||||
$(fn $fn(self, rhs: Expr<Rhs>) -> Self::Output {
|
$(fn $fn(self, rhs: Expr<Rhs>) -> Self::Output {
|
||||||
|
@ -658,8 +658,8 @@ cmp_op! {
|
||||||
fixed_ary_op! {
|
fixed_ary_op! {
|
||||||
pub struct CastInt<FromType, ToType,>
|
pub struct CastInt<FromType, ToType,>
|
||||||
where (
|
where (
|
||||||
FromType: IntTypeTrait,
|
FromType: IntTypeTrait<CanonicalType = DynIntType<<FromType as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<FromType as IntTypeTrait>::Signed>>,
|
||||||
ToType: IntTypeTrait,
|
ToType: IntTypeTrait<CanonicalType = DynIntType<<ToType as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<ToType as IntTypeTrait>::Signed>>,
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
pub value: Expr<FromType::CanonicalValue>,
|
pub value: Expr<FromType::CanonicalValue>,
|
||||||
|
@ -705,9 +705,18 @@ fixed_ary_op! {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<FromType: IntTypeTrait> Expr<IntValue<FromType>> {
|
impl<
|
||||||
|
FromType: IntTypeTrait<
|
||||||
|
CanonicalType = DynIntType<<FromType as IntTypeTrait>::Signed>,
|
||||||
|
CanonicalValue = DynInt<<FromType as IntTypeTrait>::Signed>,
|
||||||
|
>,
|
||||||
|
> Expr<IntValue<FromType>>
|
||||||
|
{
|
||||||
pub fn cast<
|
pub fn cast<
|
||||||
ToType: IntTypeTrait<CanonicalType = DynIntType<<ToType as IntTypeTrait>::Signed>>,
|
ToType: IntTypeTrait<
|
||||||
|
CanonicalType = DynIntType<<ToType as IntTypeTrait>::Signed>,
|
||||||
|
CanonicalValue = DynInt<<ToType as IntTypeTrait>::Signed>,
|
||||||
|
>,
|
||||||
>(
|
>(
|
||||||
self,
|
self,
|
||||||
ty: ToType,
|
ty: ToType,
|
||||||
|
@ -731,7 +740,7 @@ impl<FromType: IntTypeTrait> Expr<IntValue<FromType>> {
|
||||||
fixed_ary_op! {
|
fixed_ary_op! {
|
||||||
pub struct Slice<Base,>
|
pub struct Slice<Base,>
|
||||||
where (
|
where (
|
||||||
Base: IntTypeTrait,
|
Base: IntTypeTrait<CanonicalType = DynIntType<<Base as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<Base as IntTypeTrait>::Signed>>,
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
pub base: Expr<Base::CanonicalValue>,
|
pub base: Expr<Base::CanonicalValue>,
|
||||||
|
@ -765,7 +774,13 @@ fixed_ary_op! {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: IntTypeTrait> Expr<IntValue<T>> {
|
impl<
|
||||||
|
T: IntTypeTrait<
|
||||||
|
CanonicalType = DynIntType<<T as IntTypeTrait>::Signed>,
|
||||||
|
CanonicalValue = DynInt<<T as IntTypeTrait>::Signed>,
|
||||||
|
>,
|
||||||
|
> Expr<IntValue<T>>
|
||||||
|
{
|
||||||
pub fn slice<I: RangeBounds<usize>>(self, index: I) -> Expr<DynUInt> {
|
pub fn slice<I: RangeBounds<usize>>(self, index: I) -> Expr<DynUInt> {
|
||||||
Slice::<T>::new_unchecked(
|
Slice::<T>::new_unchecked(
|
||||||
self.canonical(),
|
self.canonical(),
|
||||||
|
@ -841,7 +856,14 @@ impl_built_in_range!(<T> std::ops::RangeInclusive<T>);
|
||||||
impl_built_in_range!(<T> std::ops::RangeTo<T>);
|
impl_built_in_range!(<T> std::ops::RangeTo<T>);
|
||||||
impl_built_in_range!(<T> std::ops::RangeToInclusive<T>);
|
impl_built_in_range!(<T> std::ops::RangeToInclusive<T>);
|
||||||
|
|
||||||
impl<T: IntTypeTrait, I: BuiltInRange<usize>> ExprIndex<I> for IntValue<T> {
|
impl<
|
||||||
|
T: IntTypeTrait<
|
||||||
|
CanonicalType = DynIntType<<T as IntTypeTrait>::Signed>,
|
||||||
|
CanonicalValue = DynInt<<T as IntTypeTrait>::Signed>,
|
||||||
|
>,
|
||||||
|
I: BuiltInRange<usize>,
|
||||||
|
> ExprIndex<I> for IntValue<T>
|
||||||
|
{
|
||||||
type OutputValue = DynUInt;
|
type OutputValue = DynUInt;
|
||||||
|
|
||||||
fn expr_index(this: Expr<Self>, index: I) -> Expr<Self::OutputValue> {
|
fn expr_index(this: Expr<Self>, index: I) -> Expr<Self::OutputValue> {
|
||||||
|
@ -849,7 +871,13 @@ impl<T: IntTypeTrait, I: BuiltInRange<usize>> ExprIndex<I> for IntValue<T> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: IntTypeTrait> ExprIndex<usize> for IntValue<T> {
|
impl<
|
||||||
|
T: IntTypeTrait<
|
||||||
|
CanonicalType = DynIntType<<T as IntTypeTrait>::Signed>,
|
||||||
|
CanonicalValue = DynInt<<T as IntTypeTrait>::Signed>,
|
||||||
|
>,
|
||||||
|
> ExprIndex<usize> for IntValue<T>
|
||||||
|
{
|
||||||
type OutputValue = UInt<1>;
|
type OutputValue = UInt<1>;
|
||||||
|
|
||||||
fn expr_index(this: Expr<Self>, index: usize) -> Expr<Self::OutputValue> {
|
fn expr_index(this: Expr<Self>, index: usize) -> Expr<Self::OutputValue> {
|
||||||
|
@ -862,7 +890,7 @@ macro_rules! reduce_bit_op {
|
||||||
fixed_ary_op! {
|
fixed_ary_op! {
|
||||||
pub struct $name<Output,>
|
pub struct $name<Output,>
|
||||||
where (
|
where (
|
||||||
Output: FixedOrDynIntType<1, Signed = ConstBool<false>>,
|
Output: FixedOrDynIntType<1, Signed = ConstBool<false>, CanonicalType = DynUIntType, CanonicalValue = DynUInt>,
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
pub arg: Expr<DynUInt>,
|
pub arg: Expr<DynUInt>,
|
||||||
|
@ -892,7 +920,14 @@ reduce_bit_op!(ReduceBitAnd; |bits| bits.all());
|
||||||
reduce_bit_op!(ReduceBitOr; |bits| bits.any());
|
reduce_bit_op!(ReduceBitOr; |bits| bits.any());
|
||||||
reduce_bit_op!(ReduceBitXor; |bits| bits.count_ones() % 2 == 1);
|
reduce_bit_op!(ReduceBitXor; |bits| bits.count_ones() % 2 == 1);
|
||||||
|
|
||||||
impl<T: IntTypeTrait<Signed = ConstBool<false>>> Expr<IntValue<T>> {
|
impl<
|
||||||
|
T: IntTypeTrait<
|
||||||
|
Signed = ConstBool<false>,
|
||||||
|
CanonicalType = DynUIntType,
|
||||||
|
CanonicalValue = DynUInt,
|
||||||
|
>,
|
||||||
|
> Expr<IntValue<T>>
|
||||||
|
{
|
||||||
pub fn reduce_bitand(self) -> Expr<UInt<1>> {
|
pub fn reduce_bitand(self) -> Expr<UInt<1>> {
|
||||||
ReduceBitAnd::<UIntType<1>>::new_unchecked(self.canonical()).to_expr()
|
ReduceBitAnd::<UIntType<1>>::new_unchecked(self.canonical()).to_expr()
|
||||||
}
|
}
|
||||||
|
@ -939,7 +974,9 @@ fixed_ary_op! {
|
||||||
},
|
},
|
||||||
#[target]
|
#[target]
|
||||||
target: Option<Interned<Target>> = base.target().map(|base| {
|
target: Option<Interned<Target>> = base.target().map(|base| {
|
||||||
Intern::intern_sized(base.join(TargetPathElement::intern_sized(TargetPathBundleField{name:field.name}.into())))
|
Intern::intern_sized(base.join(
|
||||||
|
TargetPathElement::intern_sized(TargetPathBundleField{ name: field.name }.into()),
|
||||||
|
))
|
||||||
}),
|
}),
|
||||||
fn simulate(&self, sim_state: &mut SimState) -> _ {
|
fn simulate(&self, sim_state: &mut SimState) -> _ {
|
||||||
todo!()
|
todo!()
|
||||||
|
@ -985,9 +1022,9 @@ fixed_ary_op! {
|
||||||
#[cache]
|
#[cache]
|
||||||
base_ty: DynEnumType = base.canonical_type(),
|
base_ty: DynEnumType = base.canonical_type(),
|
||||||
#[type]
|
#[type]
|
||||||
ty: VariantTy = VariantTy::from_dyn_canonical_type(base_ty.variants()[variant_index].ty.unwrap_or_else(
|
ty: VariantTy = VariantTy::from_dyn_canonical_type(
|
||||||
|| ().canonical_dyn(),
|
base_ty.variants()[variant_index].ty.unwrap_or_else(|| ().canonical_dyn()),
|
||||||
)),
|
),
|
||||||
#[cache]
|
#[cache]
|
||||||
literal_bits: Result<Interned<BitSlice>, ()> = {
|
literal_bits: Result<Interned<BitSlice>, ()> = {
|
||||||
base.to_literal_bits().map(|base| {
|
base.to_literal_bits().map(|base| {
|
||||||
|
@ -1086,7 +1123,9 @@ fixed_ary_op! {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn expr_enum(&self) -> _ {
|
fn expr_enum(&self) -> _ {
|
||||||
ExprEnum::CastBitsTo(CastBitsTo::new_unchecked(self.value, self.ty.canonical_dyn()).intern_sized())
|
ExprEnum::CastBitsTo(
|
||||||
|
CastBitsTo::new_unchecked(self.value, self.ty.canonical_dyn()).intern_sized(),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn to_literal_bits(&self) -> Result<Interned<BitSlice>, ()> {
|
fn to_literal_bits(&self) -> Result<Interned<BitSlice>, ()> {
|
||||||
|
@ -1105,7 +1144,14 @@ where
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: IntTypeTrait<Signed = ConstBool<false>>> Expr<IntValue<T>> {
|
impl<
|
||||||
|
T: IntTypeTrait<
|
||||||
|
Signed = ConstBool<false>,
|
||||||
|
CanonicalType = DynUIntType,
|
||||||
|
CanonicalValue = DynUInt,
|
||||||
|
>,
|
||||||
|
> Expr<IntValue<T>>
|
||||||
|
{
|
||||||
pub fn cast_bits_to<U: Value>(self, ty: U::Type) -> Expr<U>
|
pub fn cast_bits_to<U: Value>(self, ty: U::Type) -> Expr<U>
|
||||||
where
|
where
|
||||||
U::Type: Type<Value = U>,
|
U::Type: Type<Value = U>,
|
||||||
|
@ -1115,11 +1161,11 @@ impl<T: IntTypeTrait<Signed = ConstBool<false>>> Expr<IntValue<T>> {
|
||||||
}
|
}
|
||||||
|
|
||||||
macro_rules! cast_bit_to_typed_bit {
|
macro_rules! cast_bit_to_typed_bit {
|
||||||
(pub struct $Op:ident$(<$T:ident: $Bound:ident<$BoundArg:tt>>)?; $FromType:ty => $ToType:ty) => {
|
(pub struct $Op:ident$(<$T:ident: $Bound:path>)?; $FromType:ty => $ToType:ty) => {
|
||||||
fixed_ary_op! {
|
fixed_ary_op! {
|
||||||
pub struct $Op<$($T,)?>
|
pub struct $Op<$($T,)?>
|
||||||
where (
|
where (
|
||||||
$($T: $Bound<$BoundArg>,)?
|
$($T: $Bound,)?
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
pub value: Expr<<$FromType as Type>::Value>,
|
pub value: Expr<<$FromType as Type>::Value>,
|
||||||
|
@ -1244,7 +1290,7 @@ where
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cast_bit_to_typed_bit!(pub struct CastClockToBit<ToType: FixedOrDynIntType<1>>; ClockType => ToType);
|
cast_bit_to_typed_bit!(pub struct CastClockToBit<ToType: FixedOrDynIntType<1, CanonicalType = DynIntType<<ToType as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<ToType as IntTypeTrait>::Signed>>>; ClockType => ToType);
|
||||||
|
|
||||||
impl ToBit for Clock {
|
impl ToBit for Clock {
|
||||||
fn to_bit(v: Expr<Self>) -> Expr<UInt<1>> {
|
fn to_bit(v: Expr<Self>) -> Expr<UInt<1>> {
|
||||||
|
@ -1252,7 +1298,7 @@ impl ToBit for Clock {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cast_bit_to_typed_bit!(pub struct CastSyncResetToBit<ToType: FixedOrDynIntType<1>>; SyncResetType => ToType);
|
cast_bit_to_typed_bit!(pub struct CastSyncResetToBit<ToType: FixedOrDynIntType<1, CanonicalType = DynIntType<<ToType as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<ToType as IntTypeTrait>::Signed>>>; SyncResetType => ToType);
|
||||||
|
|
||||||
impl ToBit for SyncReset {
|
impl ToBit for SyncReset {
|
||||||
fn to_bit(v: Expr<Self>) -> Expr<UInt<1>> {
|
fn to_bit(v: Expr<Self>) -> Expr<UInt<1>> {
|
||||||
|
@ -1260,7 +1306,7 @@ impl ToBit for SyncReset {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cast_bit_to_typed_bit!(pub struct CastAsyncResetToBit<ToType: FixedOrDynIntType<1>>; AsyncResetType => ToType);
|
cast_bit_to_typed_bit!(pub struct CastAsyncResetToBit<ToType: FixedOrDynIntType<1, CanonicalType = DynIntType<<ToType as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<ToType as IntTypeTrait>::Signed>>>; AsyncResetType => ToType);
|
||||||
|
|
||||||
impl ToBit for AsyncReset {
|
impl ToBit for AsyncReset {
|
||||||
fn to_bit(v: Expr<Self>) -> Expr<UInt<1>> {
|
fn to_bit(v: Expr<Self>) -> Expr<UInt<1>> {
|
||||||
|
@ -1268,7 +1314,7 @@ impl ToBit for AsyncReset {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cast_bit_to_typed_bit!(pub struct CastResetToBit<ToType: FixedOrDynIntType<1>>; ResetType => ToType);
|
cast_bit_to_typed_bit!(pub struct CastResetToBit<ToType: FixedOrDynIntType<1, CanonicalType = DynIntType<<ToType as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<ToType as IntTypeTrait>::Signed>>>; ResetType => ToType);
|
||||||
|
|
||||||
impl ToBit for Reset {
|
impl ToBit for Reset {
|
||||||
fn to_bit(v: Expr<Self>) -> Expr<UInt<1>> {
|
fn to_bit(v: Expr<Self>) -> Expr<UInt<1>> {
|
||||||
|
@ -1355,7 +1401,9 @@ fixed_ary_op! {
|
||||||
},
|
},
|
||||||
#[target]
|
#[target]
|
||||||
target: Option<Interned<Target>> = base.target().map(|base| {
|
target: Option<Interned<Target>> = base.target().map(|base| {
|
||||||
Intern::intern_sized(base.join(TargetPathElement::ArrayElement(TargetPathArrayElement { index }).intern()))
|
Intern::intern_sized(base.join(
|
||||||
|
TargetPathElement::ArrayElement(TargetPathArrayElement { index }).intern(),
|
||||||
|
))
|
||||||
}),
|
}),
|
||||||
fn simulate(&self, sim_state: &mut SimState) -> _ {
|
fn simulate(&self, sim_state: &mut SimState) -> _ {
|
||||||
todo!()
|
todo!()
|
||||||
|
@ -1398,21 +1446,28 @@ fixed_ary_op! {
|
||||||
let base_ty = base.ty();
|
let base_ty = base.ty();
|
||||||
let element_bit_width = base_ty.element().bit_width();
|
let element_bit_width = base_ty.element().bit_width();
|
||||||
base.to_literal_bits().ok().zip(index.to_literal_bits().ok()).and_then(|(base, index)| {
|
base.to_literal_bits().ok().zip(index.to_literal_bits().ok()).and_then(|(base, index)| {
|
||||||
let start = DynUInt::from_bit_slice(&index).uint_value().to_usize()?.checked_mul(element_bit_width)?;
|
let start = DynUInt::from_bit_slice(&index)
|
||||||
|
.uint_value()
|
||||||
|
.to_usize()?
|
||||||
|
.checked_mul(element_bit_width)?;
|
||||||
let end = start.checked_add(element_bit_width)?;
|
let end = start.checked_add(element_bit_width)?;
|
||||||
Some(base.get(start..end)?.intern())
|
Some(base.get(start..end)?.intern())
|
||||||
}).ok_or(())
|
}).ok_or(())
|
||||||
},
|
},
|
||||||
#[target]
|
#[target]
|
||||||
target: Option<Interned<Target>> = base.target().map(|base| {
|
target: Option<Interned<Target>> = base.target().map(|base| {
|
||||||
Intern::intern_sized(base.join(TargetPathElement::DynArrayElement(TargetPathDynArrayElement {}).intern()))
|
Intern::intern_sized(base.join(
|
||||||
|
TargetPathElement::DynArrayElement(TargetPathDynArrayElement {}).intern(),
|
||||||
|
))
|
||||||
}),
|
}),
|
||||||
fn simulate(&self, sim_state: &mut SimState) -> _ {
|
fn simulate(&self, sim_state: &mut SimState) -> _ {
|
||||||
todo!()
|
todo!()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn expr_enum(&self) -> _ {
|
fn expr_enum(&self) -> _ {
|
||||||
ExprEnum::DynArrayIndex(DynArrayIndex::new_unchecked(self.base, self.index).intern_sized())
|
ExprEnum::DynArrayIndex(
|
||||||
|
DynArrayIndex::new_unchecked(self.base, self.index).intern_sized(),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn to_literal_bits(&self) -> Result<Interned<BitSlice>, ()> {
|
fn to_literal_bits(&self) -> Result<Interned<BitSlice>, ()> {
|
||||||
|
@ -1432,7 +1487,11 @@ impl<ElementType: Type> DynArrayIndex<ElementType> {
|
||||||
|
|
||||||
impl<
|
impl<
|
||||||
VA: ?Sized + ValueArrayOrSlice,
|
VA: ?Sized + ValueArrayOrSlice,
|
||||||
Idx: IntTypeTrait<Signed = ConstBool<false>, CanonicalType = DynUIntType>,
|
Idx: IntTypeTrait<
|
||||||
|
Signed = ConstBool<false>,
|
||||||
|
CanonicalType = DynUIntType,
|
||||||
|
CanonicalValue = DynUInt,
|
||||||
|
>,
|
||||||
> ExprIndex<IntValue<Idx>> for Array<VA>
|
> ExprIndex<IntValue<Idx>> for Array<VA>
|
||||||
{
|
{
|
||||||
type OutputValue = VA::Element;
|
type OutputValue = VA::Element;
|
||||||
|
@ -1445,7 +1504,11 @@ impl<
|
||||||
|
|
||||||
impl<
|
impl<
|
||||||
VA: ?Sized + ValueArrayOrSlice,
|
VA: ?Sized + ValueArrayOrSlice,
|
||||||
Idx: IntTypeTrait<Signed = ConstBool<false>, CanonicalType = DynUIntType>,
|
Idx: IntTypeTrait<
|
||||||
|
Signed = ConstBool<false>,
|
||||||
|
CanonicalType = DynUIntType,
|
||||||
|
CanonicalValue = DynUInt,
|
||||||
|
>,
|
||||||
> ExprIndex<Expr<IntValue<Idx>>> for Array<VA>
|
> ExprIndex<Expr<IntValue<Idx>>> for Array<VA>
|
||||||
{
|
{
|
||||||
type OutputValue = VA::Element;
|
type OutputValue = VA::Element;
|
||||||
|
@ -1555,7 +1618,8 @@ fixed_ary_op! {
|
||||||
ty
|
ty
|
||||||
},
|
},
|
||||||
#[cache]
|
#[cache]
|
||||||
literal_bits: Result<Interned<BitSlice>, ()> = ty.variant_to_bits(variant_index, variant_value.as_ref()),
|
literal_bits: Result<Interned<BitSlice>, ()> =
|
||||||
|
ty.variant_to_bits(variant_index, variant_value.as_ref()),
|
||||||
fn simulate(&self, sim_state: &mut SimState) -> _ {
|
fn simulate(&self, sim_state: &mut SimState) -> _ {
|
||||||
todo!()
|
todo!()
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,7 +35,13 @@ pub type Int<Signed, const WIDTH: usize> = IntValue<IntType<Signed, WIDTH>>;
|
||||||
pub type UInt<const WIDTH: usize> = Int<ConstBool<false>, WIDTH>;
|
pub type UInt<const WIDTH: usize> = Int<ConstBool<false>, WIDTH>;
|
||||||
pub type SInt<const WIDTH: usize> = Int<ConstBool<true>, WIDTH>;
|
pub type SInt<const WIDTH: usize> = Int<ConstBool<true>, WIDTH>;
|
||||||
|
|
||||||
impl<T: IntTypeTrait> ToExpr for IntValue<T> {
|
impl<
|
||||||
|
T: IntTypeTrait<
|
||||||
|
CanonicalType = DynIntType<<T as IntTypeTrait>::Signed>,
|
||||||
|
CanonicalValue = DynInt<<T as IntTypeTrait>::Signed>,
|
||||||
|
>,
|
||||||
|
> ToExpr for IntValue<T>
|
||||||
|
{
|
||||||
type Type = T;
|
type Type = T;
|
||||||
|
|
||||||
fn ty(&self) -> Self::Type {
|
fn ty(&self) -> Self::Type {
|
||||||
|
@ -47,13 +53,25 @@ impl<T: IntTypeTrait> ToExpr for IntValue<T> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: IntTypeTrait> fmt::Display for IntValue<T> {
|
impl<
|
||||||
|
T: IntTypeTrait<
|
||||||
|
CanonicalType = DynIntType<<T as IntTypeTrait>::Signed>,
|
||||||
|
CanonicalValue = DynInt<<T as IntTypeTrait>::Signed>,
|
||||||
|
>,
|
||||||
|
> fmt::Display for IntValue<T>
|
||||||
|
{
|
||||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
fmt::Debug::fmt(&self.to_canonical(), f)
|
fmt::Debug::fmt(&self.to_canonical(), f)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: IntTypeTrait> fmt::Debug for IntValue<T> {
|
impl<
|
||||||
|
T: IntTypeTrait<
|
||||||
|
CanonicalType = DynIntType<<T as IntTypeTrait>::Signed>,
|
||||||
|
CanonicalValue = DynInt<<T as IntTypeTrait>::Signed>,
|
||||||
|
>,
|
||||||
|
> fmt::Debug for IntValue<T>
|
||||||
|
{
|
||||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
let neg;
|
let neg;
|
||||||
let (sign, magnitude) = if self.is_negative() {
|
let (sign, magnitude) = if self.is_negative() {
|
||||||
|
@ -93,7 +111,13 @@ impl<Signed: GenericConstBool> DynInt<Signed> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: IntTypeTrait> IntValue<T> {
|
impl<
|
||||||
|
T: IntTypeTrait<
|
||||||
|
CanonicalType = DynIntType<<T as IntTypeTrait>::Signed>,
|
||||||
|
CanonicalValue = DynInt<<T as IntTypeTrait>::Signed>,
|
||||||
|
>,
|
||||||
|
> IntValue<T>
|
||||||
|
{
|
||||||
pub fn with_type<I: Into<BigInt>>(ty: T, value: I) -> Self {
|
pub fn with_type<I: Into<BigInt>>(ty: T, value: I) -> Self {
|
||||||
let int_type = ty.canonical();
|
let int_type = ty.canonical();
|
||||||
let mut value: BigInt = value.into();
|
let mut value: BigInt = value.into();
|
||||||
|
@ -172,14 +196,30 @@ impl<T: IntTypeTrait> IntValue<T> {
|
||||||
let width = self.ty.width();
|
let width = self.ty.width();
|
||||||
T::Signed::VALUE && width > 0 && self.uint_value.bit((width - 1).try_into().unwrap())
|
T::Signed::VALUE && width > 0 && self.uint_value.bit((width - 1).try_into().unwrap())
|
||||||
}
|
}
|
||||||
pub fn into_cast<NewType: IntTypeTrait>(self, new_type: NewType) -> IntValue<NewType> {
|
pub fn into_cast<
|
||||||
|
NewType: IntTypeTrait<
|
||||||
|
CanonicalType = DynIntType<<NewType as IntTypeTrait>::Signed>,
|
||||||
|
CanonicalValue = DynInt<<NewType as IntTypeTrait>::Signed>,
|
||||||
|
>,
|
||||||
|
>(
|
||||||
|
self,
|
||||||
|
new_type: NewType,
|
||||||
|
) -> IntValue<NewType> {
|
||||||
if new_type.width() > self.ty.width() && self.is_negative() {
|
if new_type.width() > self.ty.width() && self.is_negative() {
|
||||||
IntValue::with_type(new_type, self.into_value())
|
IntValue::with_type(new_type, self.into_value())
|
||||||
} else {
|
} else {
|
||||||
IntValue::with_type(new_type, self.into_uint_value())
|
IntValue::with_type(new_type, self.into_uint_value())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pub fn cast<NewType: IntTypeTrait>(&self, new_type: NewType) -> IntValue<NewType> {
|
pub fn cast<
|
||||||
|
NewType: IntTypeTrait<
|
||||||
|
CanonicalType = DynIntType<<NewType as IntTypeTrait>::Signed>,
|
||||||
|
CanonicalValue = DynInt<<NewType as IntTypeTrait>::Signed>,
|
||||||
|
>,
|
||||||
|
>(
|
||||||
|
&self,
|
||||||
|
new_type: NewType,
|
||||||
|
) -> IntValue<NewType> {
|
||||||
if new_type.width() > self.ty.width() && self.is_negative() {
|
if new_type.width() > self.ty.width() && self.is_negative() {
|
||||||
IntValue::with_type(new_type, self.value())
|
IntValue::with_type(new_type, self.value())
|
||||||
} else {
|
} else {
|
||||||
|
@ -221,7 +261,14 @@ impl<T: IntTypeTrait> IntValue<T> {
|
||||||
assert!(index < self.ty.width(), "bit index out of range");
|
assert!(index < self.ty.width(), "bit index out of range");
|
||||||
self.uint_value.set_bit(index.try_into().unwrap(), value)
|
self.uint_value.set_bit(index.try_into().unwrap(), value)
|
||||||
}
|
}
|
||||||
pub fn set_slice<I: RangeBounds<usize>, RhsType: IntTypeTrait<Signed = ConstBool<false>>>(
|
pub fn set_slice<
|
||||||
|
I: RangeBounds<usize>,
|
||||||
|
RhsType: IntTypeTrait<
|
||||||
|
Signed = ConstBool<false>,
|
||||||
|
CanonicalType = DynUIntType,
|
||||||
|
CanonicalValue = DynUInt,
|
||||||
|
>,
|
||||||
|
>(
|
||||||
&mut self,
|
&mut self,
|
||||||
index: I,
|
index: I,
|
||||||
value: impl Into<IntValue<RhsType>>,
|
value: impl Into<IntValue<RhsType>>,
|
||||||
|
@ -240,7 +287,11 @@ impl<T: IntTypeTrait> IntValue<T> {
|
||||||
}
|
}
|
||||||
pub fn with_replaced_slice<
|
pub fn with_replaced_slice<
|
||||||
I: RangeBounds<usize>,
|
I: RangeBounds<usize>,
|
||||||
RhsType: IntTypeTrait<Signed = ConstBool<false>>,
|
RhsType: IntTypeTrait<
|
||||||
|
Signed = ConstBool<false>,
|
||||||
|
CanonicalType = DynUIntType,
|
||||||
|
CanonicalValue = DynUInt,
|
||||||
|
>,
|
||||||
>(
|
>(
|
||||||
mut self,
|
mut self,
|
||||||
index: I,
|
index: I,
|
||||||
|
@ -249,7 +300,12 @@ impl<T: IntTypeTrait> IntValue<T> {
|
||||||
self.set_slice(index, value);
|
self.set_slice(index, value);
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
pub fn concat<HighType: IntTypeTrait>(
|
pub fn concat<
|
||||||
|
HighType: IntTypeTrait<
|
||||||
|
CanonicalType = DynIntType<<HighType as IntTypeTrait>::Signed>,
|
||||||
|
CanonicalValue = DynInt<<HighType as IntTypeTrait>::Signed>,
|
||||||
|
>,
|
||||||
|
>(
|
||||||
&self,
|
&self,
|
||||||
high_part: IntValue<HighType>,
|
high_part: IntValue<HighType>,
|
||||||
) -> IntValue<DynIntType<HighType::Signed>> {
|
) -> IntValue<DynIntType<HighType::Signed>> {
|
||||||
|
@ -279,7 +335,13 @@ impl<T: IntTypeTrait> IntValue<T> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<Ty: IntTypeTrait> Value for IntValue<Ty> {
|
impl<
|
||||||
|
Ty: IntTypeTrait<
|
||||||
|
CanonicalType = DynIntType<<Ty as IntTypeTrait>::Signed>,
|
||||||
|
CanonicalValue = DynInt<<Ty as IntTypeTrait>::Signed>,
|
||||||
|
>,
|
||||||
|
> Value for IntValue<Ty>
|
||||||
|
{
|
||||||
fn to_canonical(&self) -> <Self::Type as Type>::CanonicalValue {
|
fn to_canonical(&self) -> <Self::Type as Type>::CanonicalValue {
|
||||||
IntValue {
|
IntValue {
|
||||||
ty: self.ty.canonical(),
|
ty: self.ty.canonical(),
|
||||||
|
@ -295,7 +357,13 @@ impl<Ty: IntTypeTrait> Value for IntValue<Ty> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
impl<T> Copy for ToBitsMemoize<T> {}
|
impl<T> Copy for ToBitsMemoize<T> {}
|
||||||
impl<Ty: IntTypeTrait> Memoize for ToBitsMemoize<IntValue<Ty>> {
|
impl<
|
||||||
|
Ty: IntTypeTrait<
|
||||||
|
CanonicalType = DynIntType<<Ty as IntTypeTrait>::Signed>,
|
||||||
|
CanonicalValue = DynInt<<Ty as IntTypeTrait>::Signed>,
|
||||||
|
>,
|
||||||
|
> Memoize for ToBitsMemoize<IntValue<Ty>>
|
||||||
|
{
|
||||||
type Input = IntValue<Ty>;
|
type Input = IntValue<Ty>;
|
||||||
type InputOwned = IntValue<Ty>;
|
type InputOwned = IntValue<Ty>;
|
||||||
type Output = Interned<BitSlice>;
|
type Output = Interned<BitSlice>;
|
||||||
|
@ -321,8 +389,15 @@ macro_rules! impl_add_sub {
|
||||||
($Op:ident::$op:ident) => {
|
($Op:ident::$op:ident) => {
|
||||||
impl<LhsType, RhsType> $Op<IntValue<RhsType>> for IntValue<LhsType>
|
impl<LhsType, RhsType> $Op<IntValue<RhsType>> for IntValue<LhsType>
|
||||||
where
|
where
|
||||||
LhsType: IntTypeTrait,
|
LhsType: IntTypeTrait<
|
||||||
RhsType: IntTypeTrait<Signed = <LhsType as IntTypeTrait>::Signed>,
|
CanonicalType = DynIntType<<LhsType as IntTypeTrait>::Signed>,
|
||||||
|
CanonicalValue = DynInt<<LhsType as IntTypeTrait>::Signed>,
|
||||||
|
>,
|
||||||
|
RhsType: IntTypeTrait<
|
||||||
|
Signed = <LhsType as IntTypeTrait>::Signed,
|
||||||
|
CanonicalType = DynIntType<<RhsType as IntTypeTrait>::Signed>,
|
||||||
|
CanonicalValue = DynInt<<RhsType as IntTypeTrait>::Signed>,
|
||||||
|
>,
|
||||||
{
|
{
|
||||||
type Output = IntValue<DynIntType<LhsType::Signed>>;
|
type Output = IntValue<DynIntType<LhsType::Signed>>;
|
||||||
|
|
||||||
|
@ -334,8 +409,15 @@ macro_rules! impl_add_sub {
|
||||||
|
|
||||||
impl<LhsType, RhsType> $Op<Valueless<RhsType>> for Valueless<LhsType>
|
impl<LhsType, RhsType> $Op<Valueless<RhsType>> for Valueless<LhsType>
|
||||||
where
|
where
|
||||||
LhsType: IntTypeTrait,
|
LhsType: IntTypeTrait<
|
||||||
RhsType: IntTypeTrait<Signed = <LhsType as IntTypeTrait>::Signed>,
|
CanonicalType = DynIntType<<LhsType as IntTypeTrait>::Signed>,
|
||||||
|
CanonicalValue = DynInt<<LhsType as IntTypeTrait>::Signed>,
|
||||||
|
>,
|
||||||
|
RhsType: IntTypeTrait<
|
||||||
|
Signed = <LhsType as IntTypeTrait>::Signed,
|
||||||
|
CanonicalType = DynIntType<<RhsType as IntTypeTrait>::Signed>,
|
||||||
|
CanonicalValue = DynInt<<RhsType as IntTypeTrait>::Signed>,
|
||||||
|
>,
|
||||||
{
|
{
|
||||||
type Output = Valueless<DynIntType<LhsType::Signed>>;
|
type Output = Valueless<DynIntType<LhsType::Signed>>;
|
||||||
|
|
||||||
|
@ -357,8 +439,16 @@ macro_rules! impl_bitwise {
|
||||||
($Op:ident::$op:ident) => {
|
($Op:ident::$op:ident) => {
|
||||||
impl<
|
impl<
|
||||||
Signed: GenericConstBool,
|
Signed: GenericConstBool,
|
||||||
LhsType: IntTypeTrait<Signed = Signed>,
|
LhsType: IntTypeTrait<
|
||||||
RhsType: IntTypeTrait<Signed = Signed>,
|
Signed = Signed,
|
||||||
|
CanonicalType = DynIntType<<LhsType as IntTypeTrait>::Signed>,
|
||||||
|
CanonicalValue = DynInt<<LhsType as IntTypeTrait>::Signed>,
|
||||||
|
>,
|
||||||
|
RhsType: IntTypeTrait<
|
||||||
|
Signed = Signed,
|
||||||
|
CanonicalType = DynIntType<<RhsType as IntTypeTrait>::Signed>,
|
||||||
|
CanonicalValue = DynInt<<RhsType as IntTypeTrait>::Signed>,
|
||||||
|
>,
|
||||||
> $Op<IntValue<RhsType>> for IntValue<LhsType>
|
> $Op<IntValue<RhsType>> for IntValue<LhsType>
|
||||||
{
|
{
|
||||||
type Output = IntValue<DynIntType<Signed>>;
|
type Output = IntValue<DynIntType<Signed>>;
|
||||||
|
@ -371,8 +461,16 @@ macro_rules! impl_bitwise {
|
||||||
|
|
||||||
impl<
|
impl<
|
||||||
Signed: GenericConstBool,
|
Signed: GenericConstBool,
|
||||||
LhsType: IntTypeTrait<Signed = Signed>,
|
LhsType: IntTypeTrait<
|
||||||
RhsType: IntTypeTrait<Signed = Signed>,
|
Signed = Signed,
|
||||||
|
CanonicalType = DynIntType<<LhsType as IntTypeTrait>::Signed>,
|
||||||
|
CanonicalValue = DynInt<<LhsType as IntTypeTrait>::Signed>,
|
||||||
|
>,
|
||||||
|
RhsType: IntTypeTrait<
|
||||||
|
Signed = Signed,
|
||||||
|
CanonicalType = DynIntType<<RhsType as IntTypeTrait>::Signed>,
|
||||||
|
CanonicalValue = DynInt<<RhsType as IntTypeTrait>::Signed>,
|
||||||
|
>,
|
||||||
> $Op<Valueless<RhsType>> for Valueless<LhsType>
|
> $Op<Valueless<RhsType>> for Valueless<LhsType>
|
||||||
{
|
{
|
||||||
type Output = Valueless<DynIntType<Signed>>;
|
type Output = Valueless<DynIntType<Signed>>;
|
||||||
|
@ -390,8 +488,16 @@ impl_add_sub!(Sub::sub);
|
||||||
|
|
||||||
impl<
|
impl<
|
||||||
Signed: GenericConstBool,
|
Signed: GenericConstBool,
|
||||||
LhsType: IntTypeTrait<Signed = Signed>,
|
LhsType: IntTypeTrait<
|
||||||
RhsType: IntTypeTrait<Signed = Signed>,
|
Signed = Signed,
|
||||||
|
CanonicalType = DynIntType<<LhsType as IntTypeTrait>::Signed>,
|
||||||
|
CanonicalValue = DynInt<<LhsType as IntTypeTrait>::Signed>,
|
||||||
|
>,
|
||||||
|
RhsType: IntTypeTrait<
|
||||||
|
Signed = Signed,
|
||||||
|
CanonicalType = DynIntType<<RhsType as IntTypeTrait>::Signed>,
|
||||||
|
CanonicalValue = DynInt<<RhsType as IntTypeTrait>::Signed>,
|
||||||
|
>,
|
||||||
> Mul<IntValue<RhsType>> for IntValue<LhsType>
|
> Mul<IntValue<RhsType>> for IntValue<LhsType>
|
||||||
{
|
{
|
||||||
type Output = IntValue<DynIntType<Signed>>;
|
type Output = IntValue<DynIntType<Signed>>;
|
||||||
|
@ -403,8 +509,16 @@ impl<
|
||||||
|
|
||||||
impl<
|
impl<
|
||||||
Signed: GenericConstBool,
|
Signed: GenericConstBool,
|
||||||
LhsType: IntTypeTrait<Signed = Signed>,
|
LhsType: IntTypeTrait<
|
||||||
RhsType: IntTypeTrait<Signed = Signed>,
|
Signed = Signed,
|
||||||
|
CanonicalType = DynIntType<<LhsType as IntTypeTrait>::Signed>,
|
||||||
|
CanonicalValue = DynInt<<LhsType as IntTypeTrait>::Signed>,
|
||||||
|
>,
|
||||||
|
RhsType: IntTypeTrait<
|
||||||
|
Signed = Signed,
|
||||||
|
CanonicalType = DynIntType<<RhsType as IntTypeTrait>::Signed>,
|
||||||
|
CanonicalValue = DynInt<<RhsType as IntTypeTrait>::Signed>,
|
||||||
|
>,
|
||||||
> Mul<Valueless<RhsType>> for Valueless<LhsType>
|
> Mul<Valueless<RhsType>> for Valueless<LhsType>
|
||||||
{
|
{
|
||||||
type Output = Valueless<DynIntType<Signed>>;
|
type Output = Valueless<DynIntType<Signed>>;
|
||||||
|
@ -425,8 +539,16 @@ impl_bitwise!(BitXor::bitxor);
|
||||||
|
|
||||||
impl<
|
impl<
|
||||||
Signed: GenericConstBool,
|
Signed: GenericConstBool,
|
||||||
LhsType: IntTypeTrait<Signed = Signed>,
|
LhsType: IntTypeTrait<
|
||||||
RhsType: IntTypeTrait<Signed = ConstBool<false>>,
|
Signed = Signed,
|
||||||
|
CanonicalType = DynIntType<<LhsType as IntTypeTrait>::Signed>,
|
||||||
|
CanonicalValue = DynInt<<LhsType as IntTypeTrait>::Signed>,
|
||||||
|
>,
|
||||||
|
RhsType: IntTypeTrait<
|
||||||
|
Signed = ConstBool<false>,
|
||||||
|
CanonicalType = DynUIntType,
|
||||||
|
CanonicalValue = DynUInt,
|
||||||
|
>,
|
||||||
> Shl<IntValue<RhsType>> for IntValue<LhsType>
|
> Shl<IntValue<RhsType>> for IntValue<LhsType>
|
||||||
{
|
{
|
||||||
type Output = IntValue<DynIntType<Signed>>;
|
type Output = IntValue<DynIntType<Signed>>;
|
||||||
|
@ -447,8 +569,16 @@ impl<
|
||||||
|
|
||||||
impl<
|
impl<
|
||||||
Signed: GenericConstBool,
|
Signed: GenericConstBool,
|
||||||
LhsType: IntTypeTrait<Signed = Signed>,
|
LhsType: IntTypeTrait<
|
||||||
RhsType: IntTypeTrait<Signed = ConstBool<false>>,
|
Signed = Signed,
|
||||||
|
CanonicalType = DynIntType<<LhsType as IntTypeTrait>::Signed>,
|
||||||
|
CanonicalValue = DynInt<<LhsType as IntTypeTrait>::Signed>,
|
||||||
|
>,
|
||||||
|
RhsType: IntTypeTrait<
|
||||||
|
Signed = ConstBool<false>,
|
||||||
|
CanonicalType = DynUIntType,
|
||||||
|
CanonicalValue = DynUInt,
|
||||||
|
>,
|
||||||
> Shl<Valueless<RhsType>> for Valueless<LhsType>
|
> Shl<Valueless<RhsType>> for Valueless<LhsType>
|
||||||
{
|
{
|
||||||
type Output = Valueless<DynIntType<Signed>>;
|
type Output = Valueless<DynIntType<Signed>>;
|
||||||
|
@ -469,8 +599,16 @@ impl<
|
||||||
|
|
||||||
impl<
|
impl<
|
||||||
Signed: GenericConstBool,
|
Signed: GenericConstBool,
|
||||||
LhsType: IntTypeTrait<Signed = Signed>,
|
LhsType: IntTypeTrait<
|
||||||
RhsType: IntTypeTrait<Signed = ConstBool<false>>,
|
Signed = Signed,
|
||||||
|
CanonicalType = DynIntType<<LhsType as IntTypeTrait>::Signed>,
|
||||||
|
CanonicalValue = DynInt<<LhsType as IntTypeTrait>::Signed>,
|
||||||
|
>,
|
||||||
|
RhsType: IntTypeTrait<
|
||||||
|
Signed = ConstBool<false>,
|
||||||
|
CanonicalType = DynUIntType,
|
||||||
|
CanonicalValue = DynUInt,
|
||||||
|
>,
|
||||||
> Shr<IntValue<RhsType>> for IntValue<LhsType>
|
> Shr<IntValue<RhsType>> for IntValue<LhsType>
|
||||||
{
|
{
|
||||||
type Output = IntValue<DynIntType<Signed>>;
|
type Output = IntValue<DynIntType<Signed>>;
|
||||||
|
@ -488,8 +626,12 @@ impl<
|
||||||
|
|
||||||
impl<
|
impl<
|
||||||
Signed: GenericConstBool,
|
Signed: GenericConstBool,
|
||||||
LhsType: IntTypeTrait<Signed = Signed>,
|
LhsType: IntTypeTrait<Signed = Signed, CanonicalType = DynIntType<Signed>>,
|
||||||
RhsType: IntTypeTrait<Signed = ConstBool<false>>,
|
RhsType: IntTypeTrait<
|
||||||
|
Signed = ConstBool<false>,
|
||||||
|
CanonicalType = DynUIntType,
|
||||||
|
CanonicalValue = DynUInt,
|
||||||
|
>,
|
||||||
> Shr<Valueless<RhsType>> for Valueless<LhsType>
|
> Shr<Valueless<RhsType>> for Valueless<LhsType>
|
||||||
{
|
{
|
||||||
type Output = Valueless<DynIntType<Signed>>;
|
type Output = Valueless<DynIntType<Signed>>;
|
||||||
|
@ -501,8 +643,14 @@ impl<
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<Signed: GenericConstBool, LhsType: IntTypeTrait<Signed = Signed>> Shl<usize>
|
impl<
|
||||||
for IntValue<LhsType>
|
Signed: GenericConstBool,
|
||||||
|
LhsType: IntTypeTrait<
|
||||||
|
Signed = Signed,
|
||||||
|
CanonicalType = DynIntType<<LhsType as IntTypeTrait>::Signed>,
|
||||||
|
CanonicalValue = DynInt<<LhsType as IntTypeTrait>::Signed>,
|
||||||
|
>,
|
||||||
|
> Shl<usize> for IntValue<LhsType>
|
||||||
{
|
{
|
||||||
type Output = IntValue<DynIntType<Signed>>;
|
type Output = IntValue<DynIntType<Signed>>;
|
||||||
|
|
||||||
|
@ -512,8 +660,14 @@ impl<Signed: GenericConstBool, LhsType: IntTypeTrait<Signed = Signed>> Shl<usize
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<Signed: GenericConstBool, LhsType: IntTypeTrait<Signed = Signed>> Shl<usize>
|
impl<
|
||||||
for Valueless<LhsType>
|
Signed: GenericConstBool,
|
||||||
|
LhsType: IntTypeTrait<
|
||||||
|
Signed = Signed,
|
||||||
|
CanonicalType = DynIntType<<LhsType as IntTypeTrait>::Signed>,
|
||||||
|
CanonicalValue = DynInt<<LhsType as IntTypeTrait>::Signed>,
|
||||||
|
>,
|
||||||
|
> Shl<usize> for Valueless<LhsType>
|
||||||
{
|
{
|
||||||
type Output = Valueless<DynIntType<Signed>>;
|
type Output = Valueless<DynIntType<Signed>>;
|
||||||
|
|
||||||
|
@ -528,8 +682,14 @@ impl<Signed: GenericConstBool, LhsType: IntTypeTrait<Signed = Signed>> Shl<usize
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<Signed: GenericConstBool, LhsType: IntTypeTrait<Signed = Signed>> Shr<usize>
|
impl<
|
||||||
for IntValue<LhsType>
|
Signed: GenericConstBool,
|
||||||
|
LhsType: IntTypeTrait<
|
||||||
|
Signed = Signed,
|
||||||
|
CanonicalType = DynIntType<<LhsType as IntTypeTrait>::Signed>,
|
||||||
|
CanonicalValue = DynInt<<LhsType as IntTypeTrait>::Signed>,
|
||||||
|
>,
|
||||||
|
> Shr<usize> for IntValue<LhsType>
|
||||||
{
|
{
|
||||||
type Output = IntValue<DynIntType<Signed>>;
|
type Output = IntValue<DynIntType<Signed>>;
|
||||||
|
|
||||||
|
@ -541,8 +701,14 @@ impl<Signed: GenericConstBool, LhsType: IntTypeTrait<Signed = Signed>> Shr<usize
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<Signed: GenericConstBool, LhsType: IntTypeTrait<Signed = Signed>> Shr<usize>
|
impl<
|
||||||
for Valueless<LhsType>
|
Signed: GenericConstBool,
|
||||||
|
LhsType: IntTypeTrait<
|
||||||
|
Signed = Signed,
|
||||||
|
CanonicalType = DynIntType<<LhsType as IntTypeTrait>::Signed>,
|
||||||
|
CanonicalValue = DynInt<<LhsType as IntTypeTrait>::Signed>,
|
||||||
|
>,
|
||||||
|
> Shr<usize> for Valueless<LhsType>
|
||||||
{
|
{
|
||||||
type Output = Valueless<DynIntType<Signed>>;
|
type Output = Valueless<DynIntType<Signed>>;
|
||||||
|
|
||||||
|
@ -552,7 +718,14 @@ impl<Signed: GenericConstBool, LhsType: IntTypeTrait<Signed = Signed>> Shr<usize
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: IntTypeTrait<Signed = ConstBool<true>>> Neg for IntValue<T> {
|
impl<
|
||||||
|
T: IntTypeTrait<
|
||||||
|
Signed = ConstBool<true>,
|
||||||
|
CanonicalType = DynSIntType,
|
||||||
|
CanonicalValue = DynSInt,
|
||||||
|
>,
|
||||||
|
> Neg for IntValue<T>
|
||||||
|
{
|
||||||
type Output = IntValue<DynSIntType>;
|
type Output = IntValue<DynSIntType>;
|
||||||
fn neg(self) -> Self::Output {
|
fn neg(self) -> Self::Output {
|
||||||
let ty = self.valueless().neg().ty;
|
let ty = self.valueless().neg().ty;
|
||||||
|
@ -560,7 +733,14 @@ impl<T: IntTypeTrait<Signed = ConstBool<true>>> Neg for IntValue<T> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: IntTypeTrait<Signed = ConstBool<true>>> Neg for Valueless<T> {
|
impl<
|
||||||
|
T: IntTypeTrait<
|
||||||
|
Signed = ConstBool<true>,
|
||||||
|
CanonicalType = DynSIntType,
|
||||||
|
CanonicalValue = DynSInt,
|
||||||
|
>,
|
||||||
|
> Neg for Valueless<T>
|
||||||
|
{
|
||||||
type Output = Valueless<DynSIntType>;
|
type Output = Valueless<DynSIntType>;
|
||||||
fn neg(self) -> Self::Output {
|
fn neg(self) -> Self::Output {
|
||||||
let ty = DynIntType::new(
|
let ty = DynIntType::new(
|
||||||
|
@ -573,14 +753,26 @@ impl<T: IntTypeTrait<Signed = ConstBool<true>>> Neg for Valueless<T> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: IntTypeTrait> Not for IntValue<T> {
|
impl<
|
||||||
|
T: IntTypeTrait<
|
||||||
|
CanonicalType = DynIntType<<T as IntTypeTrait>::Signed>,
|
||||||
|
CanonicalValue = DynInt<<T as IntTypeTrait>::Signed>,
|
||||||
|
>,
|
||||||
|
> Not for IntValue<T>
|
||||||
|
{
|
||||||
type Output = IntValue<T>;
|
type Output = IntValue<T>;
|
||||||
fn not(self) -> Self::Output {
|
fn not(self) -> Self::Output {
|
||||||
IntValue::with_type(self.valueless().not().ty, Not::not(self.into_value()))
|
IntValue::with_type(self.valueless().not().ty, Not::not(self.into_value()))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: IntTypeTrait> Not for Valueless<T> {
|
impl<
|
||||||
|
T: IntTypeTrait<
|
||||||
|
CanonicalType = DynIntType<<T as IntTypeTrait>::Signed>,
|
||||||
|
CanonicalValue = DynInt<<T as IntTypeTrait>::Signed>,
|
||||||
|
>,
|
||||||
|
> Not for Valueless<T>
|
||||||
|
{
|
||||||
type Output = Valueless<T>;
|
type Output = Valueless<T>;
|
||||||
fn not(self) -> Self::Output {
|
fn not(self) -> Self::Output {
|
||||||
self
|
self
|
||||||
|
@ -626,7 +818,15 @@ impl_int!(i32, true);
|
||||||
impl_int!(i64, true);
|
impl_int!(i64, true);
|
||||||
impl_int!(i128, true);
|
impl_int!(i128, true);
|
||||||
|
|
||||||
impl<T: FixedOrDynIntType<1, Signed = ConstBool<false>>> From<bool> for IntValue<T> {
|
impl<
|
||||||
|
T: FixedOrDynIntType<
|
||||||
|
1,
|
||||||
|
Signed = ConstBool<false>,
|
||||||
|
CanonicalType = DynUIntType,
|
||||||
|
CanonicalValue = DynUInt,
|
||||||
|
>,
|
||||||
|
> From<bool> for IntValue<T>
|
||||||
|
{
|
||||||
fn from(v: bool) -> Self {
|
fn from(v: bool) -> Self {
|
||||||
IntValue::with_type(T::new(), v)
|
IntValue::with_type(T::new(), v)
|
||||||
}
|
}
|
||||||
|
@ -665,11 +865,7 @@ pub trait IntTypeTrait:
|
||||||
+ Eq
|
+ Eq
|
||||||
+ Hash
|
+ Hash
|
||||||
+ fmt::Debug
|
+ fmt::Debug
|
||||||
+ Type<
|
+ Type<Value = IntValue<Self>>
|
||||||
Value = IntValue<Self>,
|
|
||||||
CanonicalType = DynIntType<<Self as IntTypeTrait>::Signed>,
|
|
||||||
CanonicalValue = IntValue<DynIntType<<Self as IntTypeTrait>::Signed>>,
|
|
||||||
>
|
|
||||||
+ Connect<Self>
|
+ Connect<Self>
|
||||||
+ Connect<DynIntType<<Self as IntTypeTrait>::Signed>>
|
+ Connect<DynIntType<<Self as IntTypeTrait>::Signed>>
|
||||||
{
|
{
|
||||||
|
@ -678,11 +874,15 @@ pub trait IntTypeTrait:
|
||||||
Signed = ConstBool<false>,
|
Signed = ConstBool<false>,
|
||||||
SameWidthUInt = Self::SameWidthUInt,
|
SameWidthUInt = Self::SameWidthUInt,
|
||||||
SameWidthSInt = Self::SameWidthSInt,
|
SameWidthSInt = Self::SameWidthSInt,
|
||||||
|
CanonicalType = DynUIntType,
|
||||||
|
CanonicalValue = DynUInt,
|
||||||
>;
|
>;
|
||||||
type SameWidthSInt: IntTypeTrait<
|
type SameWidthSInt: IntTypeTrait<
|
||||||
Signed = ConstBool<true>,
|
Signed = ConstBool<true>,
|
||||||
SameWidthUInt = Self::SameWidthUInt,
|
SameWidthUInt = Self::SameWidthUInt,
|
||||||
SameWidthSInt = Self::SameWidthSInt,
|
SameWidthSInt = Self::SameWidthSInt,
|
||||||
|
CanonicalType = DynSIntType,
|
||||||
|
CanonicalValue = DynSInt,
|
||||||
>;
|
>;
|
||||||
fn from_width_unchecked(width: usize) -> Self;
|
fn from_width_unchecked(width: usize) -> Self;
|
||||||
fn width(self) -> usize;
|
fn width(self) -> usize;
|
||||||
|
@ -735,12 +935,12 @@ pub trait IntTypeTrait:
|
||||||
start..end
|
start..end
|
||||||
}
|
}
|
||||||
fn slice_and_shift<I: RangeBounds<usize>>(self, index: I) -> (DynUIntType, usize) {
|
fn slice_and_shift<I: RangeBounds<usize>>(self, index: I) -> (DynUIntType, usize) {
|
||||||
let range = self.canonical().slice_index_to_range(index);
|
let range = self.slice_index_to_range(index);
|
||||||
let width = range.end - range.start;
|
let width = range.end - range.start;
|
||||||
(DynUIntType::new(width), range.start)
|
(DynUIntType::new(width), range.start)
|
||||||
}
|
}
|
||||||
fn slice<I: RangeBounds<usize>>(self, index: I) -> DynUIntType {
|
fn slice<I: RangeBounds<usize>>(self, index: I) -> DynUIntType {
|
||||||
self.canonical().slice_and_shift(index).0
|
self.slice_and_shift(index).0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,7 @@ use crate::{
|
||||||
ops::VariantAccess, Expr, Flow, Target, TargetBase, TargetPathArrayElement,
|
ops::VariantAccess, Expr, Flow, Target, TargetBase, TargetPathArrayElement,
|
||||||
TargetPathBundleField, TargetPathElement, ToExpr,
|
TargetPathBundleField, TargetPathElement, ToExpr,
|
||||||
},
|
},
|
||||||
int::{FixedOrDynIntType, UInt},
|
int::{DynUInt, DynUIntType, FixedOrDynIntType, UInt},
|
||||||
intern::{Intern, Interned},
|
intern::{Intern, Interned},
|
||||||
memory::{Mem, MemBuilder, MemBuilderTarget, PortName},
|
memory::{Mem, MemBuilder, MemBuilderTarget, PortName},
|
||||||
reg::Reg,
|
reg::Reg,
|
||||||
|
@ -2254,7 +2254,12 @@ where
|
||||||
#[track_caller]
|
#[track_caller]
|
||||||
pub fn if_<Ty>(&mut self, cond: impl ToExpr<Type = Ty>) -> IfScope
|
pub fn if_<Ty>(&mut self, cond: impl ToExpr<Type = Ty>) -> IfScope
|
||||||
where
|
where
|
||||||
Ty: FixedOrDynIntType<1, Signed = ConstBool<false>>,
|
Ty: FixedOrDynIntType<
|
||||||
|
1,
|
||||||
|
Signed = ConstBool<false>,
|
||||||
|
CanonicalType = DynUIntType,
|
||||||
|
CanonicalValue = DynUInt,
|
||||||
|
>,
|
||||||
{
|
{
|
||||||
self.if_with_loc(cond, SourceLocation::caller())
|
self.if_with_loc(cond, SourceLocation::caller())
|
||||||
}
|
}
|
||||||
|
@ -2264,7 +2269,12 @@ where
|
||||||
source_location: SourceLocation,
|
source_location: SourceLocation,
|
||||||
) -> IfScope
|
) -> IfScope
|
||||||
where
|
where
|
||||||
Ty: FixedOrDynIntType<1, Signed = ConstBool<false>>,
|
Ty: FixedOrDynIntType<
|
||||||
|
1,
|
||||||
|
Signed = ConstBool<false>,
|
||||||
|
CanonicalType = DynUIntType,
|
||||||
|
CanonicalValue = DynUInt,
|
||||||
|
>,
|
||||||
{
|
{
|
||||||
let cond = cond.to_expr().as_bool();
|
let cond = cond.to_expr().as_bool();
|
||||||
let outer_block = self.block_stack.top();
|
let outer_block = self.block_stack.top();
|
||||||
|
|
|
@ -11,7 +11,10 @@ use crate::{
|
||||||
ops, Expr, ExprEnum, Literal, Target, TargetBase, TargetChild, TargetPathArrayElement,
|
ops, Expr, ExprEnum, Literal, Target, TargetBase, TargetChild, TargetPathArrayElement,
|
||||||
TargetPathBundleField, TargetPathDynArrayElement, TargetPathElement, ToExpr,
|
TargetPathBundleField, TargetPathDynArrayElement, TargetPathElement, ToExpr,
|
||||||
},
|
},
|
||||||
int::{DynInt, DynIntType, FixedOrDynIntType, IntType, IntTypeTrait},
|
int::{
|
||||||
|
DynInt, DynIntType, DynSInt, DynSIntType, DynUInt, DynUIntType, FixedOrDynIntType, IntType,
|
||||||
|
IntTypeTrait,
|
||||||
|
},
|
||||||
intern::{Intern, Interned},
|
intern::{Intern, Interned},
|
||||||
memory::{Mem, MemPort, PortKind, PortName, PortType, ReadUnderWrite},
|
memory::{Mem, MemPort, PortKind, PortName, PortType, ReadUnderWrite},
|
||||||
module::{
|
module::{
|
||||||
|
|
|
@ -68,10 +68,9 @@ impl<T: IntTypeTrait> Valueless<T> {
|
||||||
&self,
|
&self,
|
||||||
high_part: Valueless<HighType>,
|
high_part: Valueless<HighType>,
|
||||||
) -> Valueless<DynIntType<HighType::Signed>> {
|
) -> Valueless<DynIntType<HighType::Signed>> {
|
||||||
let self_type = self.ty.canonical();
|
|
||||||
let ty = DynIntType::new(
|
let ty = DynIntType::new(
|
||||||
self_type
|
self.ty
|
||||||
.width
|
.width()
|
||||||
.checked_add(high_part.ty.width())
|
.checked_add(high_part.ty.width())
|
||||||
.expect("result has too many bits"),
|
.expect("result has too many bits"),
|
||||||
);
|
);
|
||||||
|
|
|
@ -376,7 +376,7 @@
|
||||||
"$constructor": "ops::Not::new_unchecked",
|
"$constructor": "ops::Not::new_unchecked",
|
||||||
"arg": "Visible"
|
"arg": "Visible"
|
||||||
},
|
},
|
||||||
"generics": "<T: IntTypeTrait>"
|
"generics": "<T: IntTypeTrait<CanonicalType = DynIntType<<T as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<T as IntTypeTrait>::Signed>>>"
|
||||||
},
|
},
|
||||||
"ops::Neg": {
|
"ops::Neg": {
|
||||||
"data": {
|
"data": {
|
||||||
|
@ -384,7 +384,7 @@
|
||||||
"$constructor": "ops::Neg::new_unchecked",
|
"$constructor": "ops::Neg::new_unchecked",
|
||||||
"arg": "Visible"
|
"arg": "Visible"
|
||||||
},
|
},
|
||||||
"generics": "<T: IntTypeTrait<Signed = ConstBool<true>>>"
|
"generics": "<T: IntTypeTrait<Signed = ConstBool<true>, CanonicalType = DynSIntType, CanonicalValue = DynSInt>>"
|
||||||
},
|
},
|
||||||
"ops::BitAnd": {
|
"ops::BitAnd": {
|
||||||
"data": {
|
"data": {
|
||||||
|
@ -395,7 +395,7 @@
|
||||||
},
|
},
|
||||||
"generics": {
|
"generics": {
|
||||||
"generics": "<L, R>",
|
"generics": "<L, R>",
|
||||||
"where": "L: IntTypeTrait, R: IntTypeTrait<Signed = L::Signed>"
|
"where": "L: IntTypeTrait<CanonicalType = DynIntType<<L as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<L as IntTypeTrait>::Signed>>, R: IntTypeTrait<Signed = L::Signed, CanonicalType = DynIntType<<R as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<R as IntTypeTrait>::Signed>>"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"ops::BitOr": {
|
"ops::BitOr": {
|
||||||
|
@ -407,7 +407,7 @@
|
||||||
},
|
},
|
||||||
"generics": {
|
"generics": {
|
||||||
"generics": "<L, R>",
|
"generics": "<L, R>",
|
||||||
"where": "L: IntTypeTrait, R: IntTypeTrait<Signed = L::Signed>"
|
"where": "L: IntTypeTrait<CanonicalType = DynIntType<<L as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<L as IntTypeTrait>::Signed>>, R: IntTypeTrait<Signed = L::Signed, CanonicalType = DynIntType<<R as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<R as IntTypeTrait>::Signed>>"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"ops::BitXor": {
|
"ops::BitXor": {
|
||||||
|
@ -419,7 +419,7 @@
|
||||||
},
|
},
|
||||||
"generics": {
|
"generics": {
|
||||||
"generics": "<L, R>",
|
"generics": "<L, R>",
|
||||||
"where": "L: IntTypeTrait, R: IntTypeTrait<Signed = L::Signed>"
|
"where": "L: IntTypeTrait<CanonicalType = DynIntType<<L as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<L as IntTypeTrait>::Signed>>, R: IntTypeTrait<Signed = L::Signed, CanonicalType = DynIntType<<R as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<R as IntTypeTrait>::Signed>>"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"ops::Add": {
|
"ops::Add": {
|
||||||
|
@ -431,7 +431,7 @@
|
||||||
},
|
},
|
||||||
"generics": {
|
"generics": {
|
||||||
"generics": "<L, R>",
|
"generics": "<L, R>",
|
||||||
"where": "L: IntTypeTrait, R: IntTypeTrait<Signed = L::Signed>"
|
"where": "L: IntTypeTrait<CanonicalType = DynIntType<<L as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<L as IntTypeTrait>::Signed>>, R: IntTypeTrait<Signed = L::Signed, CanonicalType = DynIntType<<R as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<R as IntTypeTrait>::Signed>>"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"ops::Sub": {
|
"ops::Sub": {
|
||||||
|
@ -443,7 +443,7 @@
|
||||||
},
|
},
|
||||||
"generics": {
|
"generics": {
|
||||||
"generics": "<L, R>",
|
"generics": "<L, R>",
|
||||||
"where": "L: IntTypeTrait, R: IntTypeTrait<Signed = L::Signed>"
|
"where": "L: IntTypeTrait<CanonicalType = DynIntType<<L as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<L as IntTypeTrait>::Signed>>, R: IntTypeTrait<Signed = L::Signed, CanonicalType = DynIntType<<R as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<R as IntTypeTrait>::Signed>>"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"ops::Mul": {
|
"ops::Mul": {
|
||||||
|
@ -455,7 +455,7 @@
|
||||||
},
|
},
|
||||||
"generics": {
|
"generics": {
|
||||||
"generics": "<L, R>",
|
"generics": "<L, R>",
|
||||||
"where": "L: IntTypeTrait, R: IntTypeTrait<Signed = L::Signed>"
|
"where": "L: IntTypeTrait<CanonicalType = DynIntType<<L as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<L as IntTypeTrait>::Signed>>, R: IntTypeTrait<Signed = L::Signed, CanonicalType = DynIntType<<R as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<R as IntTypeTrait>::Signed>>"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"ops::DynShl": {
|
"ops::DynShl": {
|
||||||
|
@ -465,7 +465,7 @@
|
||||||
"lhs": "Visible",
|
"lhs": "Visible",
|
||||||
"rhs": "Visible"
|
"rhs": "Visible"
|
||||||
},
|
},
|
||||||
"generics": "<LhsType: IntTypeTrait>"
|
"generics": "<LhsType: IntTypeTrait<CanonicalType = DynIntType<<LhsType as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<LhsType as IntTypeTrait>::Signed>>>"
|
||||||
},
|
},
|
||||||
"ops::DynShr": {
|
"ops::DynShr": {
|
||||||
"data": {
|
"data": {
|
||||||
|
@ -474,7 +474,7 @@
|
||||||
"lhs": "Visible",
|
"lhs": "Visible",
|
||||||
"rhs": "Visible"
|
"rhs": "Visible"
|
||||||
},
|
},
|
||||||
"generics": "<LhsType: IntTypeTrait>"
|
"generics": "<LhsType: IntTypeTrait<CanonicalType = DynIntType<<LhsType as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<LhsType as IntTypeTrait>::Signed>>>"
|
||||||
},
|
},
|
||||||
"ops::FixedShl": {
|
"ops::FixedShl": {
|
||||||
"data": {
|
"data": {
|
||||||
|
@ -483,7 +483,7 @@
|
||||||
"lhs": "Visible",
|
"lhs": "Visible",
|
||||||
"rhs": "Visible"
|
"rhs": "Visible"
|
||||||
},
|
},
|
||||||
"generics": "<LhsType: IntTypeTrait>"
|
"generics": "<LhsType: IntTypeTrait<CanonicalType = DynIntType<<LhsType as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<LhsType as IntTypeTrait>::Signed>>>"
|
||||||
},
|
},
|
||||||
"ops::FixedShr": {
|
"ops::FixedShr": {
|
||||||
"data": {
|
"data": {
|
||||||
|
@ -492,7 +492,7 @@
|
||||||
"lhs": "Visible",
|
"lhs": "Visible",
|
||||||
"rhs": "Visible"
|
"rhs": "Visible"
|
||||||
},
|
},
|
||||||
"generics": "<LhsType: IntTypeTrait>"
|
"generics": "<LhsType: IntTypeTrait<CanonicalType = DynIntType<<LhsType as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<LhsType as IntTypeTrait>::Signed>>>"
|
||||||
},
|
},
|
||||||
"ops::CmpLt": {
|
"ops::CmpLt": {
|
||||||
"data": {
|
"data": {
|
||||||
|
@ -501,7 +501,7 @@
|
||||||
"lhs": "Visible",
|
"lhs": "Visible",
|
||||||
"rhs": "Visible"
|
"rhs": "Visible"
|
||||||
},
|
},
|
||||||
"generics": "<LhsType: IntTypeTrait, RhsType: IntTypeTrait<Signed = LhsType::Signed>, Output: FixedOrDynIntType<1, Signed = ConstBool<false>>>"
|
"generics": "<LhsType: IntTypeTrait<CanonicalType = DynIntType<<LhsType as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<LhsType as IntTypeTrait>::Signed>>, RhsType: IntTypeTrait<Signed = LhsType::Signed, CanonicalType = DynIntType<<RhsType as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<RhsType as IntTypeTrait>::Signed>>, Output: FixedOrDynIntType<1, Signed = ConstBool<false>, CanonicalType = DynUIntType, CanonicalValue = DynUInt>>"
|
||||||
},
|
},
|
||||||
"ops::CmpLe": {
|
"ops::CmpLe": {
|
||||||
"data": {
|
"data": {
|
||||||
|
@ -510,7 +510,7 @@
|
||||||
"lhs": "Visible",
|
"lhs": "Visible",
|
||||||
"rhs": "Visible"
|
"rhs": "Visible"
|
||||||
},
|
},
|
||||||
"generics": "<LhsType: IntTypeTrait, RhsType: IntTypeTrait<Signed = LhsType::Signed>, Output: FixedOrDynIntType<1, Signed = ConstBool<false>>>"
|
"generics": "<LhsType: IntTypeTrait<CanonicalType = DynIntType<<LhsType as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<LhsType as IntTypeTrait>::Signed>>, RhsType: IntTypeTrait<Signed = LhsType::Signed, CanonicalType = DynIntType<<RhsType as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<RhsType as IntTypeTrait>::Signed>>, Output: FixedOrDynIntType<1, Signed = ConstBool<false>, CanonicalType = DynUIntType, CanonicalValue = DynUInt>>"
|
||||||
},
|
},
|
||||||
"ops::CmpGt": {
|
"ops::CmpGt": {
|
||||||
"data": {
|
"data": {
|
||||||
|
@ -519,7 +519,7 @@
|
||||||
"lhs": "Visible",
|
"lhs": "Visible",
|
||||||
"rhs": "Visible"
|
"rhs": "Visible"
|
||||||
},
|
},
|
||||||
"generics": "<LhsType: IntTypeTrait, RhsType: IntTypeTrait<Signed = LhsType::Signed>, Output: FixedOrDynIntType<1, Signed = ConstBool<false>>>"
|
"generics": "<LhsType: IntTypeTrait<CanonicalType = DynIntType<<LhsType as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<LhsType as IntTypeTrait>::Signed>>, RhsType: IntTypeTrait<Signed = LhsType::Signed, CanonicalType = DynIntType<<RhsType as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<RhsType as IntTypeTrait>::Signed>>, Output: FixedOrDynIntType<1, Signed = ConstBool<false>, CanonicalType = DynUIntType, CanonicalValue = DynUInt>>"
|
||||||
},
|
},
|
||||||
"ops::CmpGe": {
|
"ops::CmpGe": {
|
||||||
"data": {
|
"data": {
|
||||||
|
@ -528,7 +528,7 @@
|
||||||
"lhs": "Visible",
|
"lhs": "Visible",
|
||||||
"rhs": "Visible"
|
"rhs": "Visible"
|
||||||
},
|
},
|
||||||
"generics": "<LhsType: IntTypeTrait, RhsType: IntTypeTrait<Signed = LhsType::Signed>, Output: FixedOrDynIntType<1, Signed = ConstBool<false>>>"
|
"generics": "<LhsType: IntTypeTrait<CanonicalType = DynIntType<<LhsType as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<LhsType as IntTypeTrait>::Signed>>, RhsType: IntTypeTrait<Signed = LhsType::Signed, CanonicalType = DynIntType<<RhsType as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<RhsType as IntTypeTrait>::Signed>>, Output: FixedOrDynIntType<1, Signed = ConstBool<false>, CanonicalType = DynUIntType, CanonicalValue = DynUInt>>"
|
||||||
},
|
},
|
||||||
"ops::CmpEq": {
|
"ops::CmpEq": {
|
||||||
"data": {
|
"data": {
|
||||||
|
@ -537,7 +537,7 @@
|
||||||
"lhs": "Visible",
|
"lhs": "Visible",
|
||||||
"rhs": "Visible"
|
"rhs": "Visible"
|
||||||
},
|
},
|
||||||
"generics": "<LhsType: IntTypeTrait, RhsType: IntTypeTrait<Signed = LhsType::Signed>, Output: FixedOrDynIntType<1, Signed = ConstBool<false>>>"
|
"generics": "<LhsType: IntTypeTrait<CanonicalType = DynIntType<<LhsType as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<LhsType as IntTypeTrait>::Signed>>, RhsType: IntTypeTrait<Signed = LhsType::Signed, CanonicalType = DynIntType<<RhsType as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<RhsType as IntTypeTrait>::Signed>>, Output: FixedOrDynIntType<1, Signed = ConstBool<false>, CanonicalType = DynUIntType, CanonicalValue = DynUInt>>"
|
||||||
},
|
},
|
||||||
"ops::CmpNe": {
|
"ops::CmpNe": {
|
||||||
"data": {
|
"data": {
|
||||||
|
@ -546,7 +546,7 @@
|
||||||
"lhs": "Visible",
|
"lhs": "Visible",
|
||||||
"rhs": "Visible"
|
"rhs": "Visible"
|
||||||
},
|
},
|
||||||
"generics": "<LhsType: IntTypeTrait, RhsType: IntTypeTrait<Signed = LhsType::Signed>, Output: FixedOrDynIntType<1, Signed = ConstBool<false>>>"
|
"generics": "<LhsType: IntTypeTrait<CanonicalType = DynIntType<<LhsType as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<LhsType as IntTypeTrait>::Signed>>, RhsType: IntTypeTrait<Signed = LhsType::Signed, CanonicalType = DynIntType<<RhsType as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<RhsType as IntTypeTrait>::Signed>>, Output: FixedOrDynIntType<1, Signed = ConstBool<false>, CanonicalType = DynUIntType, CanonicalValue = DynUInt>>"
|
||||||
},
|
},
|
||||||
"ops::CastInt": {
|
"ops::CastInt": {
|
||||||
"data": {
|
"data": {
|
||||||
|
@ -555,7 +555,7 @@
|
||||||
"value": "Visible",
|
"value": "Visible",
|
||||||
"ty()": "Visible"
|
"ty()": "Visible"
|
||||||
},
|
},
|
||||||
"generics": "<FromType: IntTypeTrait, ToType: IntTypeTrait>",
|
"generics": "<FromType: IntTypeTrait<CanonicalType = DynIntType<<FromType as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<FromType as IntTypeTrait>::Signed>>, ToType: IntTypeTrait<CanonicalType = DynIntType<<ToType as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<ToType as IntTypeTrait>::Signed>>>",
|
||||||
"fold_where": "ToType: Fold<State>",
|
"fold_where": "ToType: Fold<State>",
|
||||||
"visit_where": "ToType: Visit<State>"
|
"visit_where": "ToType: Visit<State>"
|
||||||
},
|
},
|
||||||
|
@ -566,7 +566,7 @@
|
||||||
"base": "Visible",
|
"base": "Visible",
|
||||||
"range": "Opaque"
|
"range": "Opaque"
|
||||||
},
|
},
|
||||||
"generics": "<Base: IntTypeTrait>"
|
"generics": "<Base: IntTypeTrait<CanonicalType = DynIntType<<Base as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<Base as IntTypeTrait>::Signed>>>"
|
||||||
},
|
},
|
||||||
"ops::ReduceBitAnd": {
|
"ops::ReduceBitAnd": {
|
||||||
"data": {
|
"data": {
|
||||||
|
@ -574,7 +574,7 @@
|
||||||
"$constructor": "ops::ReduceBitAnd::new_unchecked",
|
"$constructor": "ops::ReduceBitAnd::new_unchecked",
|
||||||
"arg": "Visible"
|
"arg": "Visible"
|
||||||
},
|
},
|
||||||
"generics": "<Output: FixedOrDynIntType<1, Signed = ConstBool<false>>>"
|
"generics": "<Output: FixedOrDynIntType<1, Signed = ConstBool<false>, CanonicalType = DynUIntType, CanonicalValue = DynUInt>>"
|
||||||
},
|
},
|
||||||
"ops::ReduceBitOr": {
|
"ops::ReduceBitOr": {
|
||||||
"data": {
|
"data": {
|
||||||
|
@ -582,7 +582,7 @@
|
||||||
"$constructor": "ops::ReduceBitOr::new_unchecked",
|
"$constructor": "ops::ReduceBitOr::new_unchecked",
|
||||||
"arg": "Visible"
|
"arg": "Visible"
|
||||||
},
|
},
|
||||||
"generics": "<Output: FixedOrDynIntType<1, Signed = ConstBool<false>>>"
|
"generics": "<Output: FixedOrDynIntType<1, Signed = ConstBool<false>, CanonicalType = DynUIntType, CanonicalValue = DynUInt>>"
|
||||||
},
|
},
|
||||||
"ops::ReduceBitXor": {
|
"ops::ReduceBitXor": {
|
||||||
"data": {
|
"data": {
|
||||||
|
@ -590,7 +590,7 @@
|
||||||
"$constructor": "ops::ReduceBitXor::new_unchecked",
|
"$constructor": "ops::ReduceBitXor::new_unchecked",
|
||||||
"arg": "Visible"
|
"arg": "Visible"
|
||||||
},
|
},
|
||||||
"generics": "<Output: FixedOrDynIntType<1, Signed = ConstBool<false>>>"
|
"generics": "<Output: FixedOrDynIntType<1, Signed = ConstBool<false>, CanonicalType = DynUIntType, CanonicalValue = DynUInt>>"
|
||||||
},
|
},
|
||||||
"ops::FieldAccess": {
|
"ops::FieldAccess": {
|
||||||
"data": {
|
"data": {
|
||||||
|
@ -696,7 +696,7 @@
|
||||||
"$constructor": "ops::CastClockToBit::new_unchecked",
|
"$constructor": "ops::CastClockToBit::new_unchecked",
|
||||||
"value": "Visible"
|
"value": "Visible"
|
||||||
},
|
},
|
||||||
"generics": "<ToType: FixedOrDynIntType<1>>"
|
"generics": "<ToType: FixedOrDynIntType<1, CanonicalType = DynIntType<<ToType as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<ToType as IntTypeTrait>::Signed>>>"
|
||||||
},
|
},
|
||||||
"ops::CastSyncResetToBit": {
|
"ops::CastSyncResetToBit": {
|
||||||
"data": {
|
"data": {
|
||||||
|
@ -704,7 +704,7 @@
|
||||||
"$constructor": "ops::CastSyncResetToBit::new_unchecked",
|
"$constructor": "ops::CastSyncResetToBit::new_unchecked",
|
||||||
"value": "Visible"
|
"value": "Visible"
|
||||||
},
|
},
|
||||||
"generics": "<ToType: FixedOrDynIntType<1>>"
|
"generics": "<ToType: FixedOrDynIntType<1, CanonicalType = DynIntType<<ToType as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<ToType as IntTypeTrait>::Signed>>>"
|
||||||
},
|
},
|
||||||
"ops::CastAsyncResetToBit": {
|
"ops::CastAsyncResetToBit": {
|
||||||
"data": {
|
"data": {
|
||||||
|
@ -712,7 +712,7 @@
|
||||||
"$constructor": "ops::CastAsyncResetToBit::new_unchecked",
|
"$constructor": "ops::CastAsyncResetToBit::new_unchecked",
|
||||||
"value": "Visible"
|
"value": "Visible"
|
||||||
},
|
},
|
||||||
"generics": "<ToType: FixedOrDynIntType<1>>"
|
"generics": "<ToType: FixedOrDynIntType<1, CanonicalType = DynIntType<<ToType as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<ToType as IntTypeTrait>::Signed>>>"
|
||||||
},
|
},
|
||||||
"ops::CastResetToBit": {
|
"ops::CastResetToBit": {
|
||||||
"data": {
|
"data": {
|
||||||
|
@ -720,7 +720,7 @@
|
||||||
"$constructor": "ops::CastResetToBit::new_unchecked",
|
"$constructor": "ops::CastResetToBit::new_unchecked",
|
||||||
"value": "Visible"
|
"value": "Visible"
|
||||||
},
|
},
|
||||||
"generics": "<ToType: FixedOrDynIntType<1>>"
|
"generics": "<ToType: FixedOrDynIntType<1, CanonicalType = DynIntType<<ToType as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<ToType as IntTypeTrait>::Signed>>>"
|
||||||
},
|
},
|
||||||
"BlockId": {
|
"BlockId": {
|
||||||
"data": {
|
"data": {
|
||||||
|
|
Loading…
Reference in a new issue