From dba883e300ebb7c01b5c645921e78c3409b8c665 Mon Sep 17 00:00:00 2001 From: Jacob Lifshay Date: Fri, 19 Jul 2024 17:12:29 -0700 Subject: [PATCH 1/2] split .cast() into cast_as_type and cast to be more useful when casting to deduced fixed types --- crates/fayalite/src/expr/ops.rs | 19 +++++++++++-------- crates/fayalite/src/int.rs | 5 ++++- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/crates/fayalite/src/expr/ops.rs b/crates/fayalite/src/expr/ops.rs index 9c20385..5900e30 100644 --- a/crates/fayalite/src/expr/ops.rs +++ b/crates/fayalite/src/expr/ops.rs @@ -11,7 +11,7 @@ use crate::{ }, int::{ DynInt, DynIntType, DynSInt, DynSIntType, DynUInt, DynUIntType, FixedOrDynIntType, Int, - IntCmp, IntTypeTrait, IntValue, UInt, UIntType, + IntCmp, IntType, IntTypeTrait, IntValue, UInt, UIntType, }, intern::{Intern, Interned}, reset::{ @@ -888,7 +888,7 @@ fixed_ary_op! { }, 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) -> _ { @@ -935,7 +935,7 @@ impl< >, > Expr> { - pub fn cast< + pub fn cast_as_type< ToType: IntTypeTrait< CanonicalType = DynIntType<::Signed>, CanonicalValue = DynInt<::Signed>, @@ -946,17 +946,20 @@ impl< ) -> Expr { CastInt::::new_unchecked(self.canonical(), ty).to_expr() } + pub fn cast(self) -> Expr> { + self.cast_as_type(IntType::new()) + } pub fn as_same_width_uint(self) -> Expr> { - 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> { - 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 { - 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 { - 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(); } let index = index.min(width - 1); - self.slice(index..=index).cast(UIntType::new()) + self.slice(index..=index).cast() } pub fn is_negative(self) -> Expr> { if T::Signed::VALUE { diff --git a/crates/fayalite/src/int.rs b/crates/fayalite/src/int.rs index adfa0df..4f31480 100644 --- a/crates/fayalite/src/int.rs +++ b/crates/fayalite/src/int.rs @@ -211,7 +211,7 @@ impl< IntValue::with_type(new_type, self.into_uint_value()) } } - pub fn cast< + pub fn cast_as_type< NewType: IntTypeTrait< CanonicalType = DynIntType<::Signed>, CanonicalValue = DynInt<::Signed>, @@ -226,6 +226,9 @@ impl< IntValue::with_type(new_type, self.uint_value()) } } + pub fn cast(self) -> Int { + self.cast_as_type(IntType::new()) + } pub fn as_same_width_uint(self) -> IntValue { IntValue { ty: self.ty.as_same_width_uint(), From 5cf638c74a11099ba60f71867bafdd5c503cf46a Mon Sep 17 00:00:00 2001 From: Jacob Lifshay Date: Fri, 19 Jul 2024 17:14:09 -0700 Subject: [PATCH 2/2] fix broken doc tests --- .forgejo/workflows/test.yml | 1 + crates/fayalite/src/_docs/modules/module_bodies.rs | 2 +- .../_docs/modules/module_bodies/hdl_array_expressions.rs | 4 ++-- .../module_bodies/hdl_let_statements/inputs_outputs.rs | 3 ++- .../module_bodies/hdl_struct_variant_expressions.rs | 1 + .../fayalite/src/_docs/semantics/connection_semantics.rs | 8 ++++---- 6 files changed, 11 insertions(+), 8 deletions(-) diff --git a/.forgejo/workflows/test.yml b/.forgejo/workflows/test.yml index 6cc3727..71f4a3b 100644 --- a/.forgejo/workflows/test.yml +++ b/.forgejo/workflows/test.yml @@ -15,4 +15,5 @@ jobs: with: save-if: ${{ github.ref == 'refs/heads/master' }} - run: cargo test + - run: cargo test --features=unstable-doc - run: cargo doc --features=unstable-doc diff --git a/crates/fayalite/src/_docs/modules/module_bodies.rs b/crates/fayalite/src/_docs/modules/module_bodies.rs index 63fe671..bd85c61 100644 --- a/crates/fayalite/src/_docs/modules/module_bodies.rs +++ b/crates/fayalite/src/_docs/modules/module_bodies.rs @@ -1,7 +1,7 @@ //! # Module Function Bodies //! //! 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_if_statements; diff --git a/crates/fayalite/src/_docs/modules/module_bodies/hdl_array_expressions.rs b/crates/fayalite/src/_docs/modules/module_bodies/hdl_array_expressions.rs index 516b35c..ae510b2 100644 --- a/crates/fayalite/src/_docs/modules/module_bodies/hdl_array_expressions.rs +++ b/crates/fayalite/src/_docs/modules/module_bodies/hdl_array_expressions.rs @@ -13,12 +13,12 @@ //! m.connect( //! w, //! #[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( //! w, //! #[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 //! ); //! # } //! ``` diff --git a/crates/fayalite/src/_docs/modules/module_bodies/hdl_let_statements/inputs_outputs.rs b/crates/fayalite/src/_docs/modules/module_bodies/hdl_let_statements/inputs_outputs.rs index b070e71..23d7c8a 100644 --- a/crates/fayalite/src/_docs/modules/module_bodies/hdl_let_statements/inputs_outputs.rs +++ b/crates/fayalite/src/_docs/modules/module_bodies/hdl_let_statements/inputs_outputs.rs @@ -4,11 +4,12 @@ //! 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] //! # fn module() { //! #[hdl] //! let my_input: UInt<10> = m.input(); +//! let _: Expr> = my_input; // my_input has type Expr> //! #[hdl] //! let my_output: Array<[UInt<10>; 3]> = m.output(); //! # } diff --git a/crates/fayalite/src/_docs/modules/module_bodies/hdl_struct_variant_expressions.rs b/crates/fayalite/src/_docs/modules/module_bodies/hdl_struct_variant_expressions.rs index 15cbca9..1013447 100644 --- a/crates/fayalite/src/_docs/modules/module_bodies/hdl_struct_variant_expressions.rs +++ b/crates/fayalite/src/_docs/modules/module_bodies/hdl_struct_variant_expressions.rs @@ -11,6 +11,7 @@ //! ``` //! # use fayalite::{hdl_module, int::UInt, array::Array, ty::Value}; //! #[derive(Value, Clone, PartialEq, Eq, Hash, Debug)] +//! #[hdl(fixed_type)] //! pub struct MyStruct { //! pub a: UInt<8>, //! pub b: UInt<16>, diff --git a/crates/fayalite/src/_docs/semantics/connection_semantics.rs b/crates/fayalite/src/_docs/semantics/connection_semantics.rs index ef30329..7c77ff3 100644 --- a/crates/fayalite/src/_docs/semantics/connection_semantics.rs +++ b/crates/fayalite/src/_docs/semantics/connection_semantics.rs @@ -20,8 +20,8 @@ //! Connection Semantics Example: //! //! ``` -//! # use fayalite::module_hdl; -//! # #[module_hdl] +//! # use fayalite::{hdl_module, int::UInt}; +//! # #[hdl_module] //! # fn module() { //! #[hdl] //! let a: UInt<8> = m.wire(); @@ -43,8 +43,8 @@ //! # Conditional Connection Semantics //! //! ``` -//! # use fayalite::module_hdl; -//! # #[module_hdl] +//! # use fayalite::{hdl_module, int::UInt}; +//! # #[hdl_module] //! # fn module() { //! #[hdl] //! let cond: UInt<1> = m.input();