Compare commits

..

2 commits

Author SHA1 Message Date
Jacob Lifshay 5cf638c74a
fix broken doc tests
All checks were successful
/ test (push) Successful in 14m25s
2024-07-19 17:14:09 -07:00
Jacob Lifshay dba883e300
split <int>.cast() into cast_as_type and cast to be more useful when casting to deduced fixed types 2024-07-19 17:12:29 -07:00
8 changed files with 26 additions and 17 deletions

View file

@ -15,4 +15,5 @@ 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 test --features=unstable-doc
- run: cargo doc --features=unstable-doc - run: cargo doc --features=unstable-doc

View file

@ -1,7 +1,7 @@
//! # Module Function Bodies //! # Module Function Bodies
//! //!
//! The `#[hdl_module]` attribute lets you have statements/expressions with `#[hdl]` annotations //! The `#[hdl_module]` attribute lets you have statements/expressions with `#[hdl]` annotations
//! and `_hdl`-suffixed literals in the module function's body //! and `_hdl`-suffixed literals in the module function's body.
pub mod hdl_array_expressions; pub mod hdl_array_expressions;
pub mod hdl_if_statements; pub mod hdl_if_statements;

View file

@ -13,12 +13,12 @@
//! m.connect( //! m.connect(
//! w, //! w,
//! #[hdl] //! #[hdl]
//! [4_hdl_u8, v, 3_hdl_u8, v + 7_hdl_u8] // you can make an array like this //! [4_hdl_u8, v, 3_hdl_u8, (v + 7_hdl_u8).cast()] // you can make an array like this
//! ); //! );
//! m.connect( //! m.connect(
//! w, //! w,
//! #[hdl] //! #[hdl]
//! [v + 1_hdl_u8; 4] // or you can make an array repeat like this //! [(v + 1_hdl_u8).cast(); 4] // or you can make an array repeat like this
//! ); //! );
//! # } //! # }
//! ``` //! ```

View file

@ -4,11 +4,12 @@
//! so you should read it. //! so you should read it.
//! //!
//! ``` //! ```
//! # use fayalite::{hdl_module, int::UInt, array::Array}; //! # use fayalite::{hdl_module, int::UInt, expr::Expr, array::Array};
//! # #[hdl_module] //! # #[hdl_module]
//! # fn module() { //! # fn module() {
//! #[hdl] //! #[hdl]
//! let my_input: UInt<10> = m.input(); //! let my_input: UInt<10> = m.input();
//! let _: Expr<UInt<10>> = my_input; // my_input has type Expr<UInt<10>>
//! #[hdl] //! #[hdl]
//! let my_output: Array<[UInt<10>; 3]> = m.output(); //! let my_output: Array<[UInt<10>; 3]> = m.output();
//! # } //! # }

View file

@ -11,6 +11,7 @@
//! ``` //! ```
//! # use fayalite::{hdl_module, int::UInt, array::Array, ty::Value}; //! # use fayalite::{hdl_module, int::UInt, array::Array, ty::Value};
//! #[derive(Value, Clone, PartialEq, Eq, Hash, Debug)] //! #[derive(Value, Clone, PartialEq, Eq, Hash, Debug)]
//! #[hdl(fixed_type)]
//! pub struct MyStruct { //! pub struct MyStruct {
//! pub a: UInt<8>, //! pub a: UInt<8>,
//! pub b: UInt<16>, //! pub b: UInt<16>,

View file

@ -20,8 +20,8 @@
//! Connection Semantics Example: //! Connection Semantics Example:
//! //!
//! ``` //! ```
//! # use fayalite::module_hdl; //! # use fayalite::{hdl_module, int::UInt};
//! # #[module_hdl] //! # #[hdl_module]
//! # fn module() { //! # fn module() {
//! #[hdl] //! #[hdl]
//! let a: UInt<8> = m.wire(); //! let a: UInt<8> = m.wire();
@ -43,8 +43,8 @@
//! # Conditional Connection Semantics //! # Conditional Connection Semantics
//! //!
//! ``` //! ```
//! # use fayalite::module_hdl; //! # use fayalite::{hdl_module, int::UInt};
//! # #[module_hdl] //! # #[hdl_module]
//! # fn module() { //! # fn module() {
//! #[hdl] //! #[hdl]
//! let cond: UInt<1> = m.input(); //! let cond: UInt<1> = m.input();

View file

@ -11,7 +11,7 @@ use crate::{
}, },
int::{ int::{
DynInt, DynIntType, DynSInt, DynSIntType, DynUInt, DynUIntType, FixedOrDynIntType, Int, DynInt, DynIntType, DynSInt, DynSIntType, DynUInt, DynUIntType, FixedOrDynIntType, Int,
IntCmp, IntTypeTrait, IntValue, UInt, UIntType, IntCmp, IntType, IntTypeTrait, IntValue, UInt, UIntType,
}, },
intern::{Intern, Interned}, intern::{Intern, Interned},
reset::{ reset::{
@ -888,7 +888,7 @@ fixed_ary_op! {
}, },
fn simulate(&self, sim_state: &mut SimState) -> _ { fn simulate(&self, sim_state: &mut SimState) -> _ {
self.value.simulate(sim_state).cast(self.ty.canonical()) self.value.simulate(sim_state).cast_as_type(self.ty.canonical())
} }
fn expr_enum(&self) -> _ { fn expr_enum(&self) -> _ {
@ -935,7 +935,7 @@ impl<
>, >,
> Expr<IntValue<FromType>> > Expr<IntValue<FromType>>
{ {
pub fn cast< pub fn cast_as_type<
ToType: IntTypeTrait< ToType: IntTypeTrait<
CanonicalType = DynIntType<<ToType as IntTypeTrait>::Signed>, CanonicalType = DynIntType<<ToType as IntTypeTrait>::Signed>,
CanonicalValue = DynInt<<ToType as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<ToType as IntTypeTrait>::Signed>,
@ -946,17 +946,20 @@ impl<
) -> Expr<ToType::Value> { ) -> Expr<ToType::Value> {
CastInt::<FromType, ToType>::new_unchecked(self.canonical(), ty).to_expr() CastInt::<FromType, ToType>::new_unchecked(self.canonical(), ty).to_expr()
} }
pub fn cast<Signed: GenericConstBool, const WIDTH: usize>(self) -> Expr<Int<Signed, WIDTH>> {
self.cast_as_type(IntType::new())
}
pub fn as_same_width_uint(self) -> Expr<IntValue<FromType::SameWidthUInt>> { pub fn as_same_width_uint(self) -> Expr<IntValue<FromType::SameWidthUInt>> {
self.cast(self.ty().as_same_width_uint()) self.cast_as_type(self.ty().as_same_width_uint())
} }
pub fn as_same_width_sint(self) -> Expr<IntValue<FromType::SameWidthSInt>> { pub fn as_same_width_sint(self) -> Expr<IntValue<FromType::SameWidthSInt>> {
self.cast(self.ty().as_same_width_sint()) self.cast_as_type(self.ty().as_same_width_sint())
} }
pub fn as_same_value_uint(self) -> Expr<DynUInt> { pub fn as_same_value_uint(self) -> Expr<DynUInt> {
self.cast(self.ty().as_same_value_uint()) self.cast_as_type(self.ty().as_same_value_uint())
} }
pub fn as_same_value_sint(self) -> Expr<DynSInt> { pub fn as_same_value_sint(self) -> Expr<DynSInt> {
self.cast(self.ty().as_same_value_sint()) self.cast_as_type(self.ty().as_same_value_sint())
} }
} }
@ -1020,7 +1023,7 @@ impl<
return false.to_expr(); return false.to_expr();
} }
let index = index.min(width - 1); let index = index.min(width - 1);
self.slice(index..=index).cast(UIntType::new()) self.slice(index..=index).cast()
} }
pub fn is_negative(self) -> Expr<UInt<1>> { pub fn is_negative(self) -> Expr<UInt<1>> {
if T::Signed::VALUE { if T::Signed::VALUE {

View file

@ -211,7 +211,7 @@ impl<
IntValue::with_type(new_type, self.into_uint_value()) IntValue::with_type(new_type, self.into_uint_value())
} }
} }
pub fn cast< pub fn cast_as_type<
NewType: IntTypeTrait< NewType: IntTypeTrait<
CanonicalType = DynIntType<<NewType as IntTypeTrait>::Signed>, CanonicalType = DynIntType<<NewType as IntTypeTrait>::Signed>,
CanonicalValue = DynInt<<NewType as IntTypeTrait>::Signed>, CanonicalValue = DynInt<<NewType as IntTypeTrait>::Signed>,
@ -226,6 +226,9 @@ impl<
IntValue::with_type(new_type, self.uint_value()) IntValue::with_type(new_type, self.uint_value())
} }
} }
pub fn cast<Signed: GenericConstBool, const WIDTH: usize>(self) -> Int<Signed, WIDTH> {
self.cast_as_type(IntType::new())
}
pub fn as_same_width_uint(self) -> IntValue<T::SameWidthUInt> { pub fn as_same_width_uint(self) -> IntValue<T::SameWidthUInt> {
IntValue { IntValue {
ty: self.ty.as_same_width_uint(), ty: self.ty.as_same_width_uint(),