diff --git a/.forgejo/workflows/test.yml b/.forgejo/workflows/test.yml index 610f22b..b2d03ba 100644 --- a/.forgejo/workflows/test.yml +++ b/.forgejo/workflows/test.yml @@ -4,7 +4,6 @@ on: [push, pull_request] jobs: deps: - runs-on: debian-12 uses: ./.forgejo/workflows/deps.yml test: runs-on: debian-12 @@ -39,7 +38,7 @@ jobs: z3 \ zlib1g-dev - run: | - curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain 1.89.0 + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain 1.82.0 source "$HOME/.cargo/env" echo "$PATH" >> "$GITHUB_PATH" - uses: https://git.libre-chip.org/mirrors/cache/restore@v3 diff --git a/Cargo.toml b/Cargo.toml index 5a792c6..d681425 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,11 +7,11 @@ members = ["crates/*"] [workspace.package] version = "0.3.0" license = "LGPL-3.0-or-later" -edition = "2024" +edition = "2021" repository = "https://git.libre-chip.org/libre-chip/fayalite" keywords = ["hdl", "hardware", "semiconductors", "firrtl", "fpga"] categories = ["simulation", "development-tools", "compilers"] -rust-version = "1.89.0" +rust-version = "1.82.0" [workspace.dependencies] fayalite-proc-macros = { version = "=0.3.0", path = "crates/fayalite-proc-macros" } diff --git a/crates/fayalite-proc-macros-impl/src/hdl_bundle.rs b/crates/fayalite-proc-macros-impl/src/hdl_bundle.rs index d881ecd..7441cb3 100644 --- a/crates/fayalite-proc-macros-impl/src/hdl_bundle.rs +++ b/crates/fayalite-proc-macros-impl/src/hdl_bundle.rs @@ -1,22 +1,21 @@ // SPDX-License-Identifier: LGPL-3.0-or-later // See Notices.txt for copyright information use crate::{ - Errors, HdlAttr, PairsIterExt, hdl_type_common::{ - ItemOptions, MakeHdlTypeExpr, MaybeParsed, ParsedField, ParsedFieldsNamed, ParsedGenerics, - SplitForImpl, TypesParser, WrappedInConst, common_derives, get_target, + common_derives, get_target, ItemOptions, MakeHdlTypeExpr, MaybeParsed, ParsedField, + ParsedFieldsNamed, ParsedGenerics, SplitForImpl, TypesParser, WrappedInConst, }, - kw, + kw, Errors, HdlAttr, PairsIterExt, }; use proc_macro2::TokenStream; -use quote::{ToTokens, format_ident, quote_spanned}; +use quote::{format_ident, quote_spanned, ToTokens}; use syn::{ - AngleBracketedGenericArguments, Attribute, Field, FieldMutability, Fields, FieldsNamed, - GenericParam, Generics, Ident, ItemStruct, Path, Token, Type, Visibility, parse_quote, - parse_quote_spanned, + parse_quote, parse_quote_spanned, punctuated::{Pair, Punctuated}, spanned::Spanned, token::Brace, + AngleBracketedGenericArguments, Attribute, Field, FieldMutability, Fields, FieldsNamed, + GenericParam, Generics, Ident, ItemStruct, Path, Token, Type, Visibility, }; #[derive(Clone, Debug)] diff --git a/crates/fayalite-proc-macros-impl/src/hdl_enum.rs b/crates/fayalite-proc-macros-impl/src/hdl_enum.rs index a891f5c..e072135 100644 --- a/crates/fayalite-proc-macros-impl/src/hdl_enum.rs +++ b/crates/fayalite-proc-macros-impl/src/hdl_enum.rs @@ -1,20 +1,20 @@ // SPDX-License-Identifier: LGPL-3.0-or-later // See Notices.txt for copyright information use crate::{ - Errors, HdlAttr, PairsIterExt, hdl_type_common::{ - ItemOptions, MakeHdlTypeExpr, MaybeParsed, ParsedGenerics, ParsedType, SplitForImpl, - TypesParser, WrappedInConst, common_derives, get_target, + common_derives, get_target, ItemOptions, MakeHdlTypeExpr, MaybeParsed, ParsedGenerics, + ParsedType, SplitForImpl, TypesParser, WrappedInConst, }, - kw, + kw, Errors, HdlAttr, PairsIterExt, }; use proc_macro2::TokenStream; -use quote::{ToTokens, format_ident, quote_spanned}; +use quote::{format_ident, quote_spanned, ToTokens}; use syn::{ - Attribute, Field, FieldMutability, Fields, FieldsNamed, FieldsUnnamed, Generics, Ident, - ItemEnum, ItemStruct, Token, Type, Variant, Visibility, parse_quote_spanned, + parse_quote_spanned, punctuated::{Pair, Punctuated}, token::{Brace, Paren}, + Attribute, Field, FieldMutability, Fields, FieldsNamed, FieldsUnnamed, Generics, Ident, + ItemEnum, ItemStruct, Token, Type, Variant, Visibility, }; crate::options! { diff --git a/crates/fayalite-proc-macros-impl/src/hdl_type_alias.rs b/crates/fayalite-proc-macros-impl/src/hdl_type_alias.rs index d4a035b..97501e7 100644 --- a/crates/fayalite-proc-macros-impl/src/hdl_type_alias.rs +++ b/crates/fayalite-proc-macros-impl/src/hdl_type_alias.rs @@ -1,16 +1,15 @@ // SPDX-License-Identifier: LGPL-3.0-or-later // See Notices.txt for copyright information use crate::{ - Errors, HdlAttr, hdl_type_common::{ - ItemOptions, MakeHdlTypeExpr, MaybeParsed, ParsedGenerics, ParsedType, TypesParser, - get_target, + get_target, ItemOptions, MakeHdlTypeExpr, MaybeParsed, ParsedGenerics, ParsedType, + TypesParser, }, - kw, + kw, Errors, HdlAttr, }; use proc_macro2::TokenStream; use quote::ToTokens; -use syn::{Attribute, Generics, Ident, ItemType, Token, Type, Visibility, parse_quote_spanned}; +use syn::{parse_quote_spanned, Attribute, Generics, Ident, ItemType, Token, Type, Visibility}; #[derive(Clone, Debug)] pub(crate) struct ParsedTypeAlias { diff --git a/crates/fayalite-proc-macros-impl/src/hdl_type_common.rs b/crates/fayalite-proc-macros-impl/src/hdl_type_common.rs index 1206f11..2da0915 100644 --- a/crates/fayalite-proc-macros-impl/src/hdl_type_common.rs +++ b/crates/fayalite-proc-macros-impl/src/hdl_type_common.rs @@ -1,21 +1,21 @@ // SPDX-License-Identifier: LGPL-3.0-or-later // See Notices.txt for copyright information -use crate::{Errors, HdlAttr, PairsIterExt, fold::impl_fold, kw}; +use crate::{fold::impl_fold, kw, Errors, HdlAttr, PairsIterExt}; use proc_macro2::{Span, TokenStream}; -use quote::{ToTokens, format_ident, quote_spanned}; +use quote::{format_ident, quote_spanned, ToTokens}; use std::{collections::HashMap, fmt, mem}; use syn::{ + parse::{Parse, ParseStream}, + parse_quote, parse_quote_spanned, + punctuated::{Pair, Punctuated}, + spanned::Spanned, + token::{Brace, Bracket, Paren}, AngleBracketedGenericArguments, Attribute, Block, ConstParam, Expr, ExprBlock, ExprGroup, ExprIndex, ExprParen, ExprPath, ExprTuple, Field, FieldMutability, Fields, FieldsNamed, FieldsUnnamed, GenericArgument, GenericParam, Generics, Ident, ImplGenerics, Index, ItemStruct, Path, PathArguments, PathSegment, PredicateType, QSelf, Stmt, Token, Turbofish, Type, TypeGenerics, TypeGroup, TypeParam, TypeParen, TypePath, TypeTuple, Visibility, WhereClause, WherePredicate, - parse::{Parse, ParseStream}, - parse_quote, parse_quote_spanned, - punctuated::{Pair, Punctuated}, - spanned::Spanned, - token::{Brace, Bracket, Paren}, }; crate::options! { @@ -299,7 +299,7 @@ impl ParseTypes for ParsedExpr { return Ok(ParsedExpr::Delimited(ParsedExprDelimited { delim: ExprDelimiter::Group(*group_token), expr: parser.parse(expr)?, - })); + })) } Expr::Paren(ExprParen { attrs, @@ -309,7 +309,7 @@ impl ParseTypes for ParsedExpr { return Ok(ParsedExpr::Delimited(ParsedExprDelimited { delim: ExprDelimiter::Paren(*paren_token), expr: parser.parse(expr)?, - })); + })) } Expr::Path(ExprPath { attrs, @@ -1902,8 +1902,8 @@ pub(crate) mod known_items { use proc_macro2::{Ident, Span, TokenStream}; use quote::ToTokens; use syn::{ - Path, PathArguments, PathSegment, Token, parse::{Parse, ParseStream}, + Path, PathArguments, PathSegment, Token, }; macro_rules! impl_known_item_body { @@ -3761,10 +3761,7 @@ pub(crate) trait AsTurbofish { } impl AsTurbofish for TypeGenerics<'_> { - type Turbofish<'a> - = Turbofish<'a> - where - Self: 'a; + type Turbofish<'a> = Turbofish<'a> where Self: 'a; fn as_turbofish(&self) -> Self::Turbofish<'_> { TypeGenerics::as_turbofish(self) @@ -3772,8 +3769,7 @@ impl AsTurbofish for TypeGenerics<'_> { } impl AsTurbofish for ParsedGenericsTypeGenerics<'_> { - type Turbofish<'a> - = ParsedGenericsTurbofish<'a> + type Turbofish<'a> = ParsedGenericsTurbofish<'a> where Self: 'a; @@ -3824,18 +3820,15 @@ impl SplitForImpl for Generics { } impl SplitForImpl for ParsedGenerics { - type ImplGenerics<'a> - = ParsedGenericsImplGenerics<'a> + type ImplGenerics<'a> = ParsedGenericsImplGenerics<'a> where Self: 'a; - type TypeGenerics<'a> - = ParsedGenericsTypeGenerics<'a> + type TypeGenerics<'a> = ParsedGenericsTypeGenerics<'a> where Self: 'a; - type WhereClause<'a> - = ParsedGenericsWhereClause<'a> + type WhereClause<'a> = ParsedGenericsWhereClause<'a> where Self: 'a; @@ -4052,8 +4045,7 @@ impl ToTokens for MaybeParsed { } impl AsTurbofish for MaybeParsed { - type Turbofish<'a> - = MaybeParsed, U::Turbofish<'a>> + type Turbofish<'a> = MaybeParsed, U::Turbofish<'a>> where Self: 'a; @@ -4066,16 +4058,13 @@ impl AsTurbofish for MaybeParsed { } impl SplitForImpl for MaybeParsed { - type ImplGenerics<'a> - = MaybeParsed, U::ImplGenerics<'a>> + type ImplGenerics<'a> = MaybeParsed, U::ImplGenerics<'a>> where Self: 'a; - type TypeGenerics<'a> - = MaybeParsed, U::TypeGenerics<'a>> + type TypeGenerics<'a> = MaybeParsed, U::TypeGenerics<'a>> where Self: 'a; - type WhereClause<'a> - = MaybeParsed, U::WhereClause<'a>> + type WhereClause<'a> = MaybeParsed, U::WhereClause<'a>> where Self: 'a; diff --git a/crates/fayalite-proc-macros-impl/src/lib.rs b/crates/fayalite-proc-macros-impl/src/lib.rs index def91eb..4f7c4f0 100644 --- a/crates/fayalite-proc-macros-impl/src/lib.rs +++ b/crates/fayalite-proc-macros-impl/src/lib.rs @@ -2,13 +2,13 @@ // See Notices.txt for copyright information #![cfg_attr(test, recursion_limit = "512")] use proc_macro2::{Span, TokenStream}; -use quote::{ToTokens, quote}; +use quote::{quote, ToTokens}; use std::{ - collections::{HashMap, hash_map::Entry}, + collections::{hash_map::Entry, HashMap}, io::{ErrorKind, Write}, }; use syn::{ - AttrStyle, Attribute, Error, Ident, Item, ItemFn, LitBool, LitStr, Meta, Token, bracketed, + bracketed, ext::IdentExt, parenthesized, parse::{Parse, ParseStream, Parser}, @@ -16,6 +16,7 @@ use syn::{ punctuated::{Pair, Punctuated}, spanned::Spanned, token::{Bracket, Paren}, + AttrStyle, Attribute, Error, Ident, Item, ItemFn, LitBool, LitStr, Meta, Token, }; mod fold; diff --git a/crates/fayalite-proc-macros-impl/src/module.rs b/crates/fayalite-proc-macros-impl/src/module.rs index c7caa16..62b7837 100644 --- a/crates/fayalite-proc-macros-impl/src/module.rs +++ b/crates/fayalite-proc-macros-impl/src/module.rs @@ -1,20 +1,19 @@ // SPDX-License-Identifier: LGPL-3.0-or-later // See Notices.txt for copyright information use crate::{ - Errors, HdlAttr, PairsIterExt, hdl_type_common::{ParsedGenerics, SplitForImpl}, kw, module::transform_body::{HdlLet, HdlLetKindIO}, - options, + options, Errors, HdlAttr, PairsIterExt, }; use proc_macro2::TokenStream; -use quote::{ToTokens, format_ident, quote, quote_spanned}; +use quote::{format_ident, quote, quote_spanned, ToTokens}; use std::collections::HashSet; use syn::{ + parse_quote, + visit::{visit_pat, Visit}, Attribute, Block, ConstParam, Error, FnArg, GenericParam, Generics, Ident, ItemFn, ItemStruct, LifetimeParam, ReturnType, Signature, TypeParam, Visibility, WhereClause, WherePredicate, - parse_quote, - visit::{Visit, visit_pat}, }; mod transform_body; diff --git a/crates/fayalite-proc-macros-impl/src/module/transform_body.rs b/crates/fayalite-proc-macros-impl/src/module/transform_body.rs index 6859f69..a0f8eb0 100644 --- a/crates/fayalite-proc-macros-impl/src/module/transform_body.rs +++ b/crates/fayalite-proc-macros-impl/src/module/transform_body.rs @@ -1,28 +1,27 @@ // SPDX-License-Identifier: LGPL-3.0-or-later // See Notices.txt for copyright information use crate::{ - Errors, HdlAttr, - fold::{DoFold, impl_fold}, + fold::{impl_fold, DoFold}, hdl_type_common::{ - ParseFailed, ParseTypes, ParsedGenerics, ParsedType, TypesParser, known_items, + known_items, ParseFailed, ParseTypes, ParsedGenerics, ParsedType, TypesParser, }, is_hdl_attr, kw, - module::{ModuleIO, ModuleIOKind, ModuleKind, check_name_conflicts_with_module_builder}, - options, + module::{check_name_conflicts_with_module_builder, ModuleIO, ModuleIOKind, ModuleKind}, + options, Errors, HdlAttr, }; use num_bigint::BigInt; use proc_macro2::{Span, TokenStream}; -use quote::{ToTokens, quote, quote_spanned}; +use quote::{quote, quote_spanned, ToTokens}; use std::{borrow::Borrow, convert::Infallible}; use syn::{ - Attribute, Block, Error, Expr, ExprIf, ExprLet, ExprLit, ExprRepeat, ExprUnary, - GenericArgument, Ident, Item, Lit, LitStr, Local, LocalInit, Pat, Token, Type, UnOp, - fold::{Fold, fold_expr, fold_expr_lit, fold_expr_unary, fold_local, fold_stmt}, + fold::{fold_expr, fold_expr_lit, fold_expr_unary, fold_local, fold_stmt, Fold}, parenthesized, parse::{Parse, ParseStream}, parse_quote, parse_quote_spanned, spanned::Spanned, token::Paren, + Attribute, Block, Error, Expr, ExprIf, ExprLet, ExprLit, ExprRepeat, ExprUnary, + GenericArgument, Ident, Item, Lit, LitStr, Local, LocalInit, Pat, Token, Type, UnOp, }; mod expand_aggregate_literals; diff --git a/crates/fayalite-proc-macros-impl/src/module/transform_body/expand_aggregate_literals.rs b/crates/fayalite-proc-macros-impl/src/module/transform_body/expand_aggregate_literals.rs index 1aabb19..61f6c75 100644 --- a/crates/fayalite-proc-macros-impl/src/module/transform_body/expand_aggregate_literals.rs +++ b/crates/fayalite-proc-macros-impl/src/module/transform_body/expand_aggregate_literals.rs @@ -2,18 +2,19 @@ // See Notices.txt for copyright information use crate::{ - HdlAttr, kw, + kw, module::transform_body::{ + expand_match::{parse_enum_path, EnumPath}, ExprOptions, Visitor, - expand_match::{EnumPath, parse_enum_path}, }, + HdlAttr, }; use quote::{format_ident, quote_spanned}; use std::mem; use syn::{ - Expr, ExprArray, ExprCall, ExprGroup, ExprMethodCall, ExprParen, ExprPath, ExprRepeat, - ExprStruct, ExprTuple, FieldValue, Token, TypePath, parse_quote_spanned, - punctuated::Punctuated, spanned::Spanned, token::Paren, + parse_quote_spanned, punctuated::Punctuated, spanned::Spanned, token::Paren, Expr, ExprArray, + ExprCall, ExprGroup, ExprMethodCall, ExprParen, ExprPath, ExprRepeat, ExprStruct, ExprTuple, + FieldValue, Token, TypePath, }; impl Visitor<'_> { diff --git a/crates/fayalite-proc-macros-impl/src/module/transform_body/expand_match.rs b/crates/fayalite-proc-macros-impl/src/module/transform_body/expand_match.rs index 069f00d..68218c1 100644 --- a/crates/fayalite-proc-macros-impl/src/module/transform_body/expand_match.rs +++ b/crates/fayalite-proc-macros-impl/src/module/transform_body/expand_match.rs @@ -1,25 +1,25 @@ // SPDX-License-Identifier: LGPL-3.0-or-later // See Notices.txt for copyright information use crate::{ - Errors, HdlAttr, PairsIterExt, - fold::{DoFold, impl_fold}, + fold::{impl_fold, DoFold}, kw, module::transform_body::{ - ExprOptions, Visitor, empty_let, with_debug_clone_and_fold, wrap_ty_with_expr, + empty_let, with_debug_clone_and_fold, wrap_ty_with_expr, ExprOptions, Visitor, }, + Errors, HdlAttr, PairsIterExt, }; use proc_macro2::{Span, TokenStream}; -use quote::{ToTokens, TokenStreamExt, format_ident, quote_spanned}; +use quote::{format_ident, quote_spanned, ToTokens, TokenStreamExt}; use std::collections::BTreeSet; use syn::{ - Arm, Attribute, Expr, ExprMatch, FieldPat, Ident, Local, Member, Pat, PatIdent, PatOr, - PatParen, PatPath, PatRest, PatStruct, PatTuple, PatTupleStruct, PatWild, Path, PathSegment, - Token, TypePath, - fold::{Fold, fold_arm, fold_expr_match, fold_local, fold_pat}, + fold::{fold_arm, fold_expr_match, fold_local, fold_pat, Fold}, parse_quote_spanned, punctuated::Punctuated, spanned::Spanned, token::{Brace, Paren}, + Arm, Attribute, Expr, ExprMatch, FieldPat, Ident, Local, Member, Pat, PatIdent, PatOr, + PatParen, PatPath, PatRest, PatStruct, PatTuple, PatTupleStruct, PatWild, Path, PathSegment, + Token, TypePath, }; macro_rules! visit_trait { @@ -444,7 +444,7 @@ trait ParseMatchPat: Sized { fn struct_(state: &mut HdlMatchParseState<'_>, v: MatchPatStruct) -> Result; fn tuple(state: &mut HdlMatchParseState<'_>, v: MatchPatTuple) -> Result; fn enum_variant(state: &mut HdlMatchParseState<'_>, v: MatchPatEnumVariant) - -> Result; + -> Result; fn parse(state: &mut HdlMatchParseState<'_>, pat: Pat) -> Result { match pat { Pat::Ident(PatIdent { diff --git a/crates/fayalite-proc-macros-impl/src/process_cfg.rs b/crates/fayalite-proc-macros-impl/src/process_cfg.rs index bcf2fa1..5cff08f 100644 --- a/crates/fayalite-proc-macros-impl/src/process_cfg.rs +++ b/crates/fayalite-proc-macros-impl/src/process_cfg.rs @@ -5,8 +5,8 @@ use crate::{Cfg, CfgAttr, Cfgs, Errors}; use proc_macro2::Ident; use std::{collections::VecDeque, marker::PhantomData}; use syn::{ - Token, punctuated::{Pair, Punctuated}, + Token, }; struct State { @@ -131,9 +131,9 @@ trait PhaseDispatch { type Args; type Output; fn dispatch_collect(self, args: Self::Args) - -> Self::Output; + -> Self::Output; fn dispatch_process(self, args: Self::Args) - -> Self::Output; + -> Self::Output; } trait Phase: Sized + 'static { @@ -2510,7 +2510,7 @@ pub(crate) fn process_cfgs(item: syn::Item, cfgs: Cfgs) -> syn::Result> Iterator for IterIntoAnnotations { } impl< - T: FusedIterator>>, -> FusedIterator for IterIntoAnnotations + T: FusedIterator< + Item: IntoAnnotations>, + >, + > FusedIterator for IterIntoAnnotations { } diff --git a/crates/fayalite/src/array.rs b/crates/fayalite/src/array.rs index c953aea..6d9b043 100644 --- a/crates/fayalite/src/array.rs +++ b/crates/fayalite/src/array.rs @@ -3,22 +3,22 @@ use crate::{ expr::{ - CastToBits, Expr, HdlPartialEq, ReduceBits, ToExpr, ops::{ArrayLiteral, ExprFromIterator, ExprIntoIterator, ExprPartialEq}, + CastToBits, Expr, HdlPartialEq, ReduceBits, ToExpr, }, - int::{Bool, DYN_SIZE, DynSize, KnownSize, Size, SizeType}, + int::{Bool, DynSize, KnownSize, Size, SizeType, DYN_SIZE}, intern::{Intern, Interned, LazyInterned}, module::transform::visit::{Fold, Folder, Visit, Visitor}, sim::value::{SimValue, SimValuePartialEq}, source_location::SourceLocation, ty::{ - CanonicalType, MatchVariantWithoutScope, StaticType, Type, TypeProperties, TypeWithDeref, - serde_impls::SerdeCanonicalType, + serde_impls::SerdeCanonicalType, CanonicalType, MatchVariantWithoutScope, StaticType, Type, + TypeProperties, TypeWithDeref, }, util::ConstUsize, }; use bitvec::slice::BitSlice; -use serde::{Deserialize, Deserializer, Serialize, Serializer, de::Error}; +use serde::{de::Error, Deserialize, Deserializer, Serialize, Serializer}; use std::{iter::FusedIterator, ops::Index}; #[derive(Copy, Clone, PartialEq, Eq, Hash)] diff --git a/crates/fayalite/src/bundle.rs b/crates/fayalite/src/bundle.rs index 30a70d5..240c0c6 100644 --- a/crates/fayalite/src/bundle.rs +++ b/crates/fayalite/src/bundle.rs @@ -3,16 +3,16 @@ use crate::{ expr::{ - CastToBits, Expr, ReduceBits, ToExpr, ops::{ArrayLiteral, BundleLiteral, ExprPartialEq}, + CastToBits, Expr, ReduceBits, ToExpr, }, int::{Bool, DynSize}, intern::{Intern, Interned}, sim::value::{SimValue, SimValuePartialEq, ToSimValue, ToSimValueWithType}, source_location::SourceLocation, ty::{ - CanonicalType, MatchVariantWithoutScope, OpaqueSimValue, StaticType, Type, TypeProperties, - TypeWithDeref, impl_match_variant_as_self, + impl_match_variant_as_self, CanonicalType, MatchVariantWithoutScope, OpaqueSimValue, + StaticType, Type, TypeProperties, TypeWithDeref, }, util::HashMap, }; diff --git a/crates/fayalite/src/cli.rs b/crates/fayalite/src/cli.rs index 6fb4b5e..1f208a8 100644 --- a/crates/fayalite/src/cli.rs +++ b/crates/fayalite/src/cli.rs @@ -8,10 +8,10 @@ use crate::{ util::{job_server::AcquiredJob, streaming_read_utf8::streaming_read_utf8}, }; use clap::{ - Parser, Subcommand, ValueEnum, ValueHint, builder::{OsStringValueParser, TypedValueParser}, + Parser, Subcommand, ValueEnum, ValueHint, }; -use eyre::{Report, eyre}; +use eyre::{eyre, Report}; use serde::{Deserialize, Serialize}; use std::{ error, @@ -301,9 +301,7 @@ impl VerilogArgs { input.split_once(file_separator_prefix) { let Some((next_file_name, rest)) = rest.split_once(file_separator_suffix) else { - return Err(CliError(eyre!( - "parsing firtool's output failed: found {file_separator_prefix:?} but no {file_separator_suffix:?}" - ))); + return Err(CliError(eyre!("parsing firtool's output failed: found {file_separator_prefix:?} but no {file_separator_suffix:?}"))); }; input = rest; (chunk, Some(next_file_name.as_ref())) diff --git a/crates/fayalite/src/clock.rs b/crates/fayalite/src/clock.rs index 66b0e20..f0623d4 100644 --- a/crates/fayalite/src/clock.rs +++ b/crates/fayalite/src/clock.rs @@ -6,7 +6,7 @@ use crate::{ int::Bool, reset::{Reset, ResetType}, source_location::SourceLocation, - ty::{CanonicalType, StaticType, Type, TypeProperties, impl_match_variant_as_self}, + ty::{impl_match_variant_as_self, CanonicalType, StaticType, Type, TypeProperties}, }; use bitvec::slice::BitSlice; diff --git a/crates/fayalite/src/enum_.rs b/crates/fayalite/src/enum_.rs index 283e4ff..36b5aa7 100644 --- a/crates/fayalite/src/enum_.rs +++ b/crates/fayalite/src/enum_.rs @@ -3,15 +3,15 @@ use crate::{ expr::{ - Expr, ToExpr, ops::{ExprPartialEq, VariantAccess}, + Expr, ToExpr, }, hdl, int::{Bool, UIntValue}, intern::{Intern, Interned}, module::{ - EnumMatchVariantAndInactiveScopeImpl, EnumMatchVariantsIterImpl, Scope, connect, - enum_match_variants_helper, incomplete_wire, wire, + connect, enum_match_variants_helper, incomplete_wire, wire, + EnumMatchVariantAndInactiveScopeImpl, EnumMatchVariantsIterImpl, Scope, }, sim::value::{SimValue, SimValuePartialEq}, source_location::SourceLocation, @@ -254,12 +254,12 @@ impl Enum { pub trait EnumType: Type< - BaseType = Enum, - MaskType = Bool, - MatchActiveScope = Scope, - MatchVariantAndInactiveScope = EnumMatchVariantAndInactiveScope, - MatchVariantsIter = EnumMatchVariantsIter, - > + BaseType = Enum, + MaskType = Bool, + MatchActiveScope = Scope, + MatchVariantAndInactiveScope = EnumMatchVariantAndInactiveScope, + MatchVariantsIter = EnumMatchVariantsIter, +> { type SimBuilder: From; fn variants(&self) -> Interned<[EnumVariant]>; diff --git a/crates/fayalite/src/expr.rs b/crates/fayalite/src/expr.rs index 89e60cd..e070674 100644 --- a/crates/fayalite/src/expr.rs +++ b/crates/fayalite/src/expr.rs @@ -13,8 +13,8 @@ use crate::{ intern::{Intern, Interned}, memory::{DynPortType, MemPort, PortType}, module::{ - Instance, ModuleIO, transform::visit::{Fold, Folder, Visit, Visitor}, + Instance, ModuleIO, }, phantom_const::PhantomConst, reg::Reg, @@ -283,10 +283,7 @@ impl fmt::Debug for Expr { } = self; let expr_ty = __ty.canonical(); let enum_ty = __enum.to_expr().__ty; - assert_eq!( - expr_ty, enum_ty, - "expr ty mismatch:\nExpr {{\n__enum: {__enum:?},\n__ty: {__ty:?},\n__flow: {__flow:?}\n}}" - ); + assert_eq!(expr_ty, enum_ty, "expr ty mismatch:\nExpr {{\n__enum: {__enum:?},\n__ty: {__ty:?},\n__flow: {__flow:?}\n}}"); } self.__enum.fmt(f) } @@ -532,7 +529,11 @@ impl Flow { } } pub const fn flip_if(self, flipped: bool) -> Flow { - if flipped { self.flip() } else { self } + if flipped { + self.flip() + } else { + self + } } } diff --git a/crates/fayalite/src/expr/ops.rs b/crates/fayalite/src/expr/ops.rs index 4f482ab..e794a68 100644 --- a/crates/fayalite/src/expr/ops.rs +++ b/crates/fayalite/src/expr/ops.rs @@ -7,12 +7,12 @@ use crate::{ clock::{Clock, ToClock}, enum_::{Enum, EnumType, EnumVariant}, expr::{ - CastBitsTo as _, CastTo, CastToBits as _, Expr, ExprEnum, Flow, HdlPartialEq, - HdlPartialOrd, NotALiteralExpr, ReduceBits, ToExpr, ToLiteralBits, target::{ GetTarget, Target, TargetPathArrayElement, TargetPathBundleField, TargetPathDynArrayElement, TargetPathElement, }, + CastBitsTo as _, CastTo, CastToBits as _, Expr, ExprEnum, Flow, HdlPartialEq, + HdlPartialOrd, NotALiteralExpr, ReduceBits, ToExpr, ToLiteralBits, }, int::{ Bool, BoolOrIntType, DynSize, IntType, KnownSize, SInt, SIntType, SIntValue, Size, UInt, diff --git a/crates/fayalite/src/firrtl.rs b/crates/fayalite/src/firrtl.rs index b766cf6..d33c7a9 100644 --- a/crates/fayalite/src/firrtl.rs +++ b/crates/fayalite/src/firrtl.rs @@ -11,32 +11,32 @@ use crate::{ clock::Clock, enum_::{Enum, EnumType, EnumVariant}, expr::{ - CastBitsTo, Expr, ExprEnum, ops::{self, VariantAccess}, target::{ Target, TargetBase, TargetPathArrayElement, TargetPathBundleField, TargetPathElement, }, + CastBitsTo, Expr, ExprEnum, }, formal::FormalKind, int::{Bool, DynSize, IntType, SIntValue, UInt, UIntValue}, intern::{Intern, Interned}, memory::{Mem, PortKind, PortName, ReadUnderWrite}, module::{ + transform::{ + simplify_enums::{simplify_enums, SimplifyEnumsError, SimplifyEnumsKind}, + simplify_memories::simplify_memories, + }, AnnotatedModuleIO, Block, ExternModuleBody, ExternModuleParameter, ExternModuleParameterValue, Module, ModuleBody, NameOptId, NormalModuleBody, Stmt, StmtConnect, StmtDeclaration, StmtFormal, StmtIf, StmtInstance, StmtMatch, StmtReg, StmtWire, - transform::{ - simplify_enums::{SimplifyEnumsError, SimplifyEnumsKind, simplify_enums}, - simplify_memories::simplify_memories, - }, }, reset::{AsyncReset, Reset, ResetType, SyncReset}, source_location::SourceLocation, ty::{CanonicalType, Type}, util::{ - BitSliceWriteWithBase, DebugAsRawString, GenericConstBool, HashMap, HashSet, - const_str_array_is_strictly_ascending, + const_str_array_is_strictly_ascending, BitSliceWriteWithBase, DebugAsRawString, + GenericConstBool, HashMap, HashSet, }, }; use bitvec::slice::BitSlice; @@ -925,10 +925,7 @@ impl<'a> Exporter<'a> { }, ) in expr.field_values().into_iter().zip(ty.fields()) { - debug_assert!( - !flipped, - "can't have bundle literal with flipped field -- this should have been caught in BundleLiteral::new_unchecked" - ); + debug_assert!(!flipped, "can't have bundle literal with flipped field -- this should have been caught in BundleLiteral::new_unchecked"); let name = bundle_ns.borrow_mut().get(name); let field_value = self.expr(Expr::canonical(field_value), definitions, const_ty); definitions.add_definition_line(format_args!("connect {ident}.{name}, {field_value}")); @@ -1264,9 +1261,7 @@ impl<'a> Exporter<'a> { "UInt<0>(0)".into() }; for (variant_index, variant) in ty.variants().into_iter().enumerate() { - let when_cond = format!( - "eq(UInt<{discriminant_bit_width}>({variant_index}), tail({value_str}, {body_bit_width}))" - ); + let when_cond = format!("eq(UInt<{discriminant_bit_width}>({variant_index}), tail({value_str}, {body_bit_width}))"); if variant_index == ty.variants().len() - 1 { definitions.add_definition_line(format_args!("{extra_indent}else:")); } else if variant_index == 0 { diff --git a/crates/fayalite/src/int.rs b/crates/fayalite/src/int.rs index c491cdc..d8364b1 100644 --- a/crates/fayalite/src/int.rs +++ b/crates/fayalite/src/int.rs @@ -4,22 +4,22 @@ use crate::{ array::ArrayType, expr::{ - Expr, NotALiteralExpr, ToExpr, ToLiteralBits, target::{GetTarget, Target}, + Expr, NotALiteralExpr, ToExpr, ToLiteralBits, }, hdl, intern::{Intern, Interned, Memoize}, sim::value::{SimValue, ToSimValueWithType}, source_location::SourceLocation, - ty::{CanonicalType, StaticType, Type, TypeProperties, impl_match_variant_as_self}, - util::{ConstBool, ConstUsize, GenericConstBool, GenericConstUsize, interned_bit}, + ty::{impl_match_variant_as_self, CanonicalType, StaticType, Type, TypeProperties}, + util::{interned_bit, ConstBool, ConstUsize, GenericConstBool, GenericConstUsize}, }; use bitvec::{order::Lsb0, slice::BitSlice, vec::BitVec, view::BitView}; use num_bigint::{BigInt, BigUint, Sign}; use num_traits::{One, Signed, Zero}; use serde::{ - Deserialize, Deserializer, Serialize, Serializer, de::{DeserializeOwned, Error, Visitor}, + Deserialize, Deserializer, Serialize, Serializer, }; use std::{ borrow::{BorrowMut, Cow}, @@ -224,7 +224,11 @@ impl Size for T { } fn try_from_usize(v: usize) -> Option { - if v == T::VALUE { Some(T::SIZE) } else { None } + if v == T::VALUE { + Some(T::SIZE) + } else { + None + } } } diff --git a/crates/fayalite/src/int/uint_in_range.rs b/crates/fayalite/src/int/uint_in_range.rs index ae80a93..0e2d07e 100644 --- a/crates/fayalite/src/int/uint_in_range.rs +++ b/crates/fayalite/src/int/uint_in_range.rs @@ -4,20 +4,20 @@ use crate::{ bundle::{Bundle, BundleField, BundleType, BundleTypePropertiesBuilder, NoBuilder}, expr::{ - CastBitsTo, CastTo, CastToBits, Expr, HdlPartialEq, HdlPartialOrd, ops::{ExprCastTo, ExprPartialEq, ExprPartialOrd}, + CastBitsTo, CastTo, CastToBits, Expr, HdlPartialEq, HdlPartialOrd, }, int::{Bool, DynSize, KnownSize, Size, SizeType, UInt, UIntType}, intern::{Intern, Interned}, phantom_const::PhantomConst, sim::value::{SimValue, SimValuePartialEq, ToSimValueWithType}, source_location::SourceLocation, - ty::{CanonicalType, StaticType, Type, TypeProperties, impl_match_variant_as_self}, + ty::{impl_match_variant_as_self, CanonicalType, StaticType, Type, TypeProperties}, }; use bitvec::{order::Lsb0, slice::BitSlice, view::BitView}; use serde::{ + de::{value::UsizeDeserializer, Error, Visitor}, Deserialize, Deserializer, Serialize, Serializer, - de::{Error, Visitor, value::UsizeDeserializer}, }; use std::{fmt, marker::PhantomData, ops::Index}; @@ -45,18 +45,15 @@ impl Type for UIntInRangeMaskType { fn from_canonical(canonical_type: CanonicalType) -> Self { let fields = Bundle::from_canonical(canonical_type).fields(); - let [ - BundleField { - name: value_name, - flipped: false, - ty: value, - }, - BundleField { - name: range_name, - flipped: false, - ty: range, - }, - ] = *fields + let [BundleField { + name: value_name, + flipped: false, + ty: value, + }, BundleField { + name: range_name, + flipped: false, + ty: range, + }] = *fields else { panic!("expected UIntInRangeMaskType"); }; @@ -326,18 +323,15 @@ macro_rules! define_uint_in_range_type { fn from_canonical(canonical_type: CanonicalType) -> Self { let fields = Bundle::from_canonical(canonical_type).fields(); - let [ - BundleField { - name: value_name, - flipped: false, - ty: value, - }, - BundleField { - name: range_name, - flipped: false, - ty: range, - }, - ] = *fields + let [BundleField { + name: value_name, + flipped: false, + ty: value, + }, BundleField { + name: range_name, + flipped: false, + ty: range, + }] = *fields else { panic!("expected {}", stringify!($UIntInRange)); }; diff --git a/crates/fayalite/src/memory.rs b/crates/fayalite/src/memory.rs index a146ac6..622ffc6 100644 --- a/crates/fayalite/src/memory.rs +++ b/crates/fayalite/src/memory.rs @@ -7,7 +7,7 @@ use crate::{ array::{Array, ArrayType}, bundle::{Bundle, BundleType}, clock::Clock, - expr::{Expr, Flow, ToExpr, ToLiteralBits, ops::BundleLiteral, repeat}, + expr::{ops::BundleLiteral, repeat, Expr, Flow, ToExpr, ToLiteralBits}, hdl, int::{Bool, DynSize, Size, UInt, UIntType}, intern::{Intern, Interned}, diff --git a/crates/fayalite/src/module.rs b/crates/fayalite/src/module.rs index aaa9340..920b0af 100644 --- a/crates/fayalite/src/module.rs +++ b/crates/fayalite/src/module.rs @@ -8,12 +8,12 @@ use crate::{ clock::{Clock, ClockDomain}, enum_::{Enum, EnumMatchVariantsIter, EnumType}, expr::{ - Expr, Flow, ToExpr, ops::VariantAccess, target::{ GetTarget, Target, TargetBase, TargetPathArrayElement, TargetPathBundleField, TargetPathElement, }, + Expr, Flow, ToExpr, }, formal::FormalKind, int::{Bool, DynSize, Size}, @@ -1459,9 +1459,7 @@ impl TargetState { }) .reduce(TargetWritten::conditional_merge_written) else { - unreachable!( - "merge_conditional_sub_blocks_into_block must be called with at least one sub-block" - ); + unreachable!("merge_conditional_sub_blocks_into_block must be called with at least one sub-block"); }; let mut written_in_blocks = written_in_blocks.borrow_mut(); if target_block >= written_in_blocks.len() { @@ -2292,12 +2290,14 @@ pub fn annotate(target: Expr, annotations: impl IntoAnnotations) { } TargetBase::MemPort(v) => { ModuleBuilder::with(|m| { - RefCell::borrow_mut(unwrap!( - unwrap!(m.impl_.borrow_mut().body.builder_normal_body_opt()) - .body - .memory_map - .get_mut(&v.mem_name()) - )) + RefCell::borrow_mut(unwrap!(unwrap!(m + .impl_ + .borrow_mut() + .body + .builder_normal_body_opt()) + .body + .memory_map + .get_mut(&v.mem_name()))) .port_annotations .extend(annotations) }); diff --git a/crates/fayalite/src/module/transform/deduce_resets.rs b/crates/fayalite/src/module/transform/deduce_resets.rs index a708986..5fb829e 100644 --- a/crates/fayalite/src/module/transform/deduce_resets.rs +++ b/crates/fayalite/src/module/transform/deduce_resets.rs @@ -6,12 +6,12 @@ use crate::{ bundle::{BundleField, BundleType}, enum_::{EnumType, EnumVariant}, expr::{ - ExprEnum, ops::{self, ArrayLiteral}, target::{ Target, TargetBase, TargetChild, TargetPathArrayElement, TargetPathBundleField, TargetPathDynArrayElement, TargetPathElement, }, + ExprEnum, }, formal::FormalKind, int::{SIntValue, UIntValue}, @@ -41,16 +41,10 @@ impl fmt::Display for DeduceResetsError { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { DeduceResetsError::ResetIsNotDrivenByAsyncOrSync { source_location } => { - write!( - f, - "deduce_reset failed: Reset signal is not driven by any AsyncReset or SyncReset signals: {source_location}" - ) + write!(f, "deduce_reset failed: Reset signal is not driven by any AsyncReset or SyncReset signals: {source_location}") } DeduceResetsError::ResetIsDrivenByBothAsyncAndSync { source_location } => { - write!( - f, - "deduce_reset failed: Reset signal is driven by both AsyncReset and SyncReset signals: {source_location}" - ) + write!(f, "deduce_reset failed: Reset signal is driven by both AsyncReset and SyncReset signals: {source_location}") } } } @@ -2105,7 +2099,7 @@ impl RunPass

for StmtDeclaration { ) -> Result, DeduceResetsError> { let (annotations, reg) = match self { StmtDeclaration::Wire(v) => { - return Ok(v.run_pass(pass_args)?.map(StmtDeclaration::Wire)); + return Ok(v.run_pass(pass_args)?.map(StmtDeclaration::Wire)) } &StmtDeclaration::Reg(StmtReg { annotations, reg }) => (annotations, AnyReg::from(reg)), &StmtDeclaration::RegSync(StmtReg { annotations, reg }) => { @@ -2115,7 +2109,7 @@ impl RunPass

for StmtDeclaration { (annotations, AnyReg::from(reg)) } StmtDeclaration::Instance(v) => { - return Ok(v.run_pass(pass_args)?.map(StmtDeclaration::Instance)); + return Ok(v.run_pass(pass_args)?.map(StmtDeclaration::Instance)) } }; let annotations = annotations.run_pass(pass_args.as_mut())?; diff --git a/crates/fayalite/src/module/transform/simplify_enums.rs b/crates/fayalite/src/module/transform/simplify_enums.rs index 3a6ffde..333451d 100644 --- a/crates/fayalite/src/module/transform/simplify_enums.rs +++ b/crates/fayalite/src/module/transform/simplify_enums.rs @@ -5,16 +5,16 @@ use crate::{ bundle::{Bundle, BundleField, BundleType}, enum_::{Enum, EnumType, EnumVariant}, expr::{ - CastBitsTo, CastTo, CastToBits, Expr, ExprEnum, HdlPartialEq, ToExpr, ops::{self, EnumLiteral}, + CastBitsTo, CastTo, CastToBits, Expr, ExprEnum, HdlPartialEq, ToExpr, }, hdl, int::UInt, intern::{Intern, Interned, Memoize}, memory::{DynPortType, Mem, MemPort}, module::{ - Block, Id, Module, NameId, ScopedNameId, Stmt, StmtConnect, StmtIf, StmtMatch, StmtWire, transform::visit::{Fold, Folder}, + Block, Id, Module, NameId, ScopedNameId, Stmt, StmtConnect, StmtIf, StmtMatch, StmtWire, }, source_location::SourceLocation, ty::{CanonicalType, Type}, @@ -810,7 +810,7 @@ impl Folder for State { .unwrap() .gen_name(&format!( "{}_{}", - memory.scoped_name().1.0, + memory.scoped_name().1 .0, port.port_name() )), port.source_location(), diff --git a/crates/fayalite/src/module/transform/simplify_memories.rs b/crates/fayalite/src/module/transform/simplify_memories.rs index 1b0ad30..6357843 100644 --- a/crates/fayalite/src/module/transform/simplify_memories.rs +++ b/crates/fayalite/src/module/transform/simplify_memories.rs @@ -9,8 +9,8 @@ use crate::{ intern::{Intern, Interned}, memory::{Mem, MemPort, PortType}, module::{ - Block, Id, Module, NameId, ScopedNameId, Stmt, StmtConnect, StmtWire, transform::visit::{Fold, Folder}, + Block, Id, Module, NameId, ScopedNameId, Stmt, StmtConnect, StmtWire, }, source_location::SourceLocation, ty::{CanonicalType, Type}, @@ -634,7 +634,7 @@ impl ModuleState { split_state: &SplitState<'_>, ) -> Mem { let mem_name = NameId( - Intern::intern_owned(format!("{}{mem_name_path}", input_mem.scoped_name().1.0)), + Intern::intern_owned(format!("{}{mem_name_path}", input_mem.scoped_name().1 .0)), Id::new(), ); let mem_name = ScopedNameId(input_mem.scoped_name().0, mem_name); diff --git a/crates/fayalite/src/module/transform/visit.rs b/crates/fayalite/src/module/transform/visit.rs index c0bfa9d..526a62c 100644 --- a/crates/fayalite/src/module/transform/visit.rs +++ b/crates/fayalite/src/module/transform/visit.rs @@ -11,11 +11,12 @@ use crate::{ clock::Clock, enum_::{Enum, EnumType, EnumVariant}, expr::{ - Expr, ExprEnum, ops, + ops, target::{ Target, TargetBase, TargetChild, TargetPathArrayElement, TargetPathBundleField, TargetPathDynArrayElement, TargetPathElement, }, + Expr, ExprEnum, }, formal::FormalKind, int::{Bool, SIntType, SIntValue, Size, UIntType, UIntValue}, diff --git a/crates/fayalite/src/phantom_const.rs b/crates/fayalite/src/phantom_const.rs index 44b36ca..c481692 100644 --- a/crates/fayalite/src/phantom_const.rs +++ b/crates/fayalite/src/phantom_const.rs @@ -3,22 +3,23 @@ use crate::{ expr::{ - Expr, ToExpr, ops::{ExprPartialEq, ExprPartialOrd}, + Expr, ToExpr, }, int::Bool, intern::{Intern, Interned, InternedCompare, LazyInterned, LazyInternedTrait, Memoize}, sim::value::{SimValue, SimValuePartialEq, ToSimValue, ToSimValueWithType}, source_location::SourceLocation, ty::{ - CanonicalType, StaticType, Type, TypeProperties, impl_match_variant_as_self, + impl_match_variant_as_self, serde_impls::{SerdeCanonicalType, SerdePhantomConst}, + CanonicalType, StaticType, Type, TypeProperties, }, }; use bitvec::slice::BitSlice; use serde::{ - Deserialize, Deserializer, Serialize, Serializer, de::{DeserializeOwned, Error}, + Deserialize, Deserializer, Serialize, Serializer, }; use std::{ any::Any, diff --git a/crates/fayalite/src/prelude.rs b/crates/fayalite/src/prelude.rs index d3b6c71..519210f 100644 --- a/crates/fayalite/src/prelude.rs +++ b/crates/fayalite/src/prelude.rs @@ -1,7 +1,6 @@ // SPDX-License-Identifier: LGPL-3.0-or-later // See Notices.txt for copyright information pub use crate::{ - __, annotations::{ BlackBoxInlineAnnotation, BlackBoxPathAnnotation, CustomFirrtlAnnotation, DocStringAnnotation, DontTouchAnnotation, SVAttributeAnnotation, @@ -12,32 +11,33 @@ pub use crate::{ clock::{Clock, ClockDomain, ToClock}, enum_::{Enum, HdlNone, HdlOption, HdlSome}, expr::{ - CastBitsTo, CastTo, CastToBits, Expr, HdlPartialEq, HdlPartialOrd, MakeUninitExpr, - ReduceBits, ToExpr, repeat, + repeat, CastBitsTo, CastTo, CastToBits, Expr, HdlPartialEq, HdlPartialOrd, MakeUninitExpr, + ReduceBits, ToExpr, }, formal::{ - MakeFormalExpr, all_const, all_seq, any_const, any_seq, formal_global_clock, formal_reset, - hdl_assert, hdl_assert_with_enable, hdl_assume, hdl_assume_with_enable, hdl_cover, - hdl_cover_with_enable, + all_const, all_seq, any_const, any_seq, formal_global_clock, formal_reset, hdl_assert, + hdl_assert_with_enable, hdl_assume, hdl_assume_with_enable, hdl_cover, + hdl_cover_with_enable, MakeFormalExpr, }, hdl, hdl_module, int::{Bool, DynSize, KnownSize, SInt, SIntType, SIntValue, Size, UInt, UIntType, UIntValue}, memory::{Mem, MemBuilder, ReadUnderWrite}, module::{ - Instance, Module, ModuleBuilder, annotate, connect, connect_any, incomplete_wire, instance, - memory, memory_array, memory_with_init, reg_builder, wire, + annotate, connect, connect_any, incomplete_wire, instance, memory, memory_array, + memory_with_init, reg_builder, wire, Instance, Module, ModuleBuilder, }, phantom_const::PhantomConst, reg::Reg, reset::{AsyncReset, Reset, SyncReset, ToAsyncReset, ToReset, ToSyncReset}, sim::{ - ExternModuleSimulationState, Simulation, time::{SimDuration, SimInstant}, value::{SimValue, ToSimValue, ToSimValueWithType}, + ExternModuleSimulationState, Simulation, }, source_location::SourceLocation, ty::{AsMask, CanonicalType, Type}, util::{ConstUsize, GenericConstUsize}, wire::Wire, + __, }; pub use bitvec::{slice::BitSlice, vec::BitVec}; diff --git a/crates/fayalite/src/reset.rs b/crates/fayalite/src/reset.rs index f3392a2..312a8ea 100644 --- a/crates/fayalite/src/reset.rs +++ b/crates/fayalite/src/reset.rs @@ -2,10 +2,10 @@ // See Notices.txt for copyright information use crate::{ clock::Clock, - expr::{Expr, ToExpr, ops}, + expr::{ops, Expr, ToExpr}, int::{Bool, SInt, UInt}, source_location::SourceLocation, - ty::{CanonicalType, StaticType, Type, TypeProperties, impl_match_variant_as_self}, + ty::{impl_match_variant_as_self, CanonicalType, StaticType, Type, TypeProperties}, }; use bitvec::slice::BitSlice; diff --git a/crates/fayalite/src/sim.rs b/crates/fayalite/src/sim.rs index d0daf34..6659391 100644 --- a/crates/fayalite/src/sim.rs +++ b/crates/fayalite/src/sim.rs @@ -7,11 +7,12 @@ use crate::{ bundle::{BundleField, BundleType}, enum_::{EnumType, EnumVariant}, expr::{ - ExprEnum, Flow, ToLiteralBits, ops, + ops, target::{ GetTarget, Target, TargetBase, TargetPathArrayElement, TargetPathBundleField, TargetPathElement, }, + ExprEnum, Flow, ToLiteralBits, }, int::{BoolOrIntType, UIntValue}, intern::{ @@ -19,10 +20,10 @@ use crate::{ }, memory::PortKind, module::{ - AnnotatedModuleIO, Block, ExternModuleBody, Id, InstantiatedModule, ModuleBody, NameId, - NormalModuleBody, ScopedNameId, Stmt, StmtConnect, StmtDeclaration, StmtFormal, StmtIf, - StmtInstance, StmtMatch, StmtReg, StmtWire, TargetInInstantiatedModule, - transform::deduce_resets::deduce_resets, + transform::deduce_resets::deduce_resets, AnnotatedModuleIO, Block, ExternModuleBody, Id, + InstantiatedModule, ModuleBody, NameId, NormalModuleBody, ScopedNameId, Stmt, StmtConnect, + StmtDeclaration, StmtFormal, StmtIf, StmtInstance, StmtMatch, StmtReg, StmtWire, + TargetInInstantiatedModule, }, prelude::*, reset::{ResetType, ResetTypeDispatch}, @@ -64,7 +65,6 @@ use std::{ mem, ops::IndexMut, pin::Pin, - ptr, rc::Rc, sync::Arc, task::Poll, @@ -4568,7 +4568,7 @@ impl Compiler { ) }) .unzip(); - let name = mem.scoped_name().1.0; + let name = mem.scoped_name().1 .0; let id = TraceMemoryId(self.memories.len()); let stride = mem.array_type().element().bit_width(); let trace = TraceMem { @@ -5596,7 +5596,7 @@ trait TraceWriterDynTrait: fmt::Debug + 'static { fn set_signal_clock_dyn(&mut self, id: TraceScalarId, value: bool) -> std::io::Result<()>; fn set_signal_sync_reset_dyn(&mut self, id: TraceScalarId, value: bool) -> std::io::Result<()>; fn set_signal_async_reset_dyn(&mut self, id: TraceScalarId, value: bool) - -> std::io::Result<()>; + -> std::io::Result<()>; fn set_signal_enum_discriminant_dyn( &mut self, id: TraceScalarId, @@ -6283,8 +6283,8 @@ impl EarliestWaitTargets { fn iter<'a>( &'a self, ) -> impl Clone - + Iterator, &'a SimValue>> - + 'a { + + Iterator, &'a SimValue>> + + 'a { self.settle .then_some(WaitTarget::Settle) .into_iter() @@ -6727,10 +6727,7 @@ impl SimulationImpl { let this = &mut *self; let mut sim = this.sim.borrow_mut(); let sim = &mut *sim; - assert!( - cx.waker().will_wake(&sim.generator_waker), - "can't use ExternModuleSimulationState's methods outside of ExternModuleSimulation" - ); + assert!(cx.waker().will_wake(&sim.generator_waker), "can't use ExternModuleSimulationState's methods outside of ExternModuleSimulation"); this.targets.convert_earlier_instants_to_settle(sim.instant); if this.targets.is_empty() { this.targets.settle = true; @@ -7739,7 +7736,7 @@ impl Eq for SimGeneratorFn {} impl PartialEq for SimGeneratorFn { fn eq(&self, other: &Self) -> bool { let Self { args, f } = self; - *args == other.args && ptr::fn_addr_eq(*f, other.f) + *args == other.args && *f == other.f } } @@ -7755,9 +7752,9 @@ impl Clone for SimGeneratorFn { impl Copy for SimGeneratorFn {} impl< - T: fmt::Debug + Clone + Eq + Hash + Send + Sync + 'static, - Fut: IntoFuture + 'static, -> ExternModuleSimGenerator for SimGeneratorFn + T: fmt::Debug + Clone + Eq + Hash + Send + Sync + 'static, + Fut: IntoFuture + 'static, + > ExternModuleSimGenerator for SimGeneratorFn { fn run<'a>(&'a self, sim: ExternModuleSimulationState) -> impl IntoFuture + 'a { (self.f)(self.args.clone(), sim) @@ -7766,7 +7763,7 @@ impl< trait DynExternModuleSimGenerator: Any + Send + Sync + SupportsPtrEqWithTypeId + fmt::Debug { fn dyn_run<'a>(&'a self, sim: ExternModuleSimulationState) - -> Box + 'a>; + -> Box + 'a>; } impl DynExternModuleSimGenerator for T { diff --git a/crates/fayalite/src/sim/interpreter.rs b/crates/fayalite/src/sim/interpreter.rs index 35a25d0..de582f0 100644 --- a/crates/fayalite/src/sim/interpreter.rs +++ b/crates/fayalite/src/sim/interpreter.rs @@ -7,7 +7,7 @@ use crate::{ intern::{Intern, Interned, Memoize}, source_location::SourceLocation, ty::CanonicalType, - util::{HashMap, HashSet}, + util::{get_many_mut, HashMap, HashSet}, }; use bitvec::{boxed::BitBox, slice::BitSlice}; use num_bigint::BigInt; @@ -2073,21 +2073,21 @@ pub(crate) struct BorrowedStatePart<'a, K: StatePartKind> { } impl< - 'a, - K: StatePartKind< - BorrowedState<'a>: DerefMut + BorrowMut<[T]>>, - >, - T, -> BorrowedStatePart<'a, K> + 'a, + K: StatePartKind< + BorrowedState<'a>: DerefMut + BorrowMut<[T]>>, + >, + T, + > BorrowedStatePart<'a, K> { - pub(crate) fn get_disjoint_mut( + pub(crate) fn get_many_mut( &mut self, indexes: [StatePartIndex; N], ) -> [&mut T; N] { - (*self.value) - .borrow_mut() - .get_disjoint_mut(indexes.map(|v| v.value as usize)) - .expect("indexes are disjoint") + get_many_mut( + (*self.value).borrow_mut(), + indexes.map(|v| v.value as usize), + ) } } @@ -2568,7 +2568,7 @@ impl_insns! { src: StatePartIndex, } => { if dest != src { - let [dest, src] = state.big_slots.get_disjoint_mut([dest, src]); + let [dest, src] = state.big_slots.get_many_mut([dest, src]); dest.clone_from(src); } next!(); @@ -2590,7 +2590,7 @@ impl_insns! { } => { if let Some(src) = state.eval_array_indexed(src) { if dest != src { - let [dest, src] = state.big_slots.get_disjoint_mut([dest, src]); + let [dest, src] = state.big_slots.get_many_mut([dest, src]); dest.clone_from(src); } } else { @@ -2619,7 +2619,7 @@ impl_insns! { } => { if let Some(dest) = state.eval_array_indexed(dest) { if dest != src { - let [dest, src] = state.big_slots.get_disjoint_mut([dest, src]); + let [dest, src] = state.big_slots.get_many_mut([dest, src]); dest.clone_from(src); } } diff --git a/crates/fayalite/src/sim/value.rs b/crates/fayalite/src/sim/value.rs index 70cb943..8dace78 100644 --- a/crates/fayalite/src/sim/value.rs +++ b/crates/fayalite/src/sim/value.rs @@ -11,8 +11,8 @@ use crate::{ reset::{AsyncReset, Reset, SyncReset}, ty::{CanonicalType, StaticType, Type}, util::{ - ConstUsize, alternating_cell::{AlternatingCell, AlternatingCellMethods}, + ConstUsize, }, }; use bitvec::{slice::BitSlice, vec::BitVec}; diff --git a/crates/fayalite/src/sim/vcd.rs b/crates/fayalite/src/sim/vcd.rs index 4a2b564..fcf6743 100644 --- a/crates/fayalite/src/sim/vcd.rs +++ b/crates/fayalite/src/sim/vcd.rs @@ -7,12 +7,12 @@ use crate::{ int::UInt, intern::{Intern, Interned}, sim::{ + time::{SimDuration, SimInstant}, TraceArray, TraceAsyncReset, TraceBool, TraceBundle, TraceClock, TraceDecl, TraceEnumDiscriminant, TraceEnumWithFields, TraceFieldlessEnum, TraceInstance, TraceLocation, TraceMem, TraceMemPort, TraceMemoryId, TraceMemoryLocation, TraceModule, TraceModuleIO, TraceReg, TraceSInt, TraceScalar, TraceScalarId, TraceScope, TraceSyncReset, TraceUInt, TraceWire, TraceWriter, TraceWriterDecls, - time::{SimDuration, SimInstant}, }, util::HashMap, }; diff --git a/crates/fayalite/src/ty.rs b/crates/fayalite/src/ty.rs index 787869d..8f41c5c 100644 --- a/crates/fayalite/src/ty.rs +++ b/crates/fayalite/src/ty.rs @@ -16,7 +16,7 @@ use crate::{ util::ConstUsize, }; use bitvec::slice::BitSlice; -use serde::{Deserialize, Deserializer, Serialize, Serializer, de::DeserializeOwned}; +use serde::{de::DeserializeOwned, Deserialize, Deserializer, Serialize, Serializer}; use std::{fmt, hash::Hash, iter::FusedIterator, ops::Index, sync::Arc}; pub(crate) mod serde_impls; @@ -334,16 +334,16 @@ pub trait Type: type MatchVariant: 'static + Send + Sync; type MatchActiveScope; type MatchVariantAndInactiveScope: MatchVariantAndInactiveScope< - MatchVariant = Self::MatchVariant, - MatchActiveScope = Self::MatchActiveScope, - >; + MatchVariant = Self::MatchVariant, + MatchActiveScope = Self::MatchActiveScope, + >; type MatchVariantsIter: Iterator + ExactSizeIterator + FusedIterator + DoubleEndedIterator; #[track_caller] fn match_variants(this: Expr, source_location: SourceLocation) - -> Self::MatchVariantsIter; + -> Self::MatchVariantsIter; fn mask_type(&self) -> Self::MaskType; fn canonical(&self) -> CanonicalType; fn from_canonical(canonical_type: CanonicalType) -> Self; diff --git a/crates/fayalite/src/util.rs b/crates/fayalite/src/util.rs index 4670a1f..233867e 100644 --- a/crates/fayalite/src/util.rs +++ b/crates/fayalite/src/util.rs @@ -35,8 +35,8 @@ pub use scoped_ref::ScopedRef; #[doc(inline)] pub use misc::{ - BitSliceWriteWithBase, DebugAsDisplay, DebugAsRawString, MakeMutSlice, RcWriter, interned_bit, - iter_eq_by, + get_many_mut, interned_bit, iter_eq_by, BitSliceWriteWithBase, DebugAsDisplay, + DebugAsRawString, MakeMutSlice, RcWriter, }; pub mod job_server; diff --git a/crates/fayalite/src/util/const_bool.rs b/crates/fayalite/src/util/const_bool.rs index 050f6a7..7def3b5 100644 --- a/crates/fayalite/src/util/const_bool.rs +++ b/crates/fayalite/src/util/const_bool.rs @@ -1,8 +1,8 @@ // SPDX-License-Identifier: LGPL-3.0-or-later // See Notices.txt for copyright information use serde::{ - Deserialize, Deserializer, Serialize, Serializer, de::{DeserializeOwned, Error, Unexpected}, + Deserialize, Deserializer, Serialize, Serializer, }; use std::{fmt::Debug, hash::Hash, mem::ManuallyDrop, ptr}; diff --git a/crates/fayalite/src/util/const_usize.rs b/crates/fayalite/src/util/const_usize.rs index d76f7a7..e098a12 100644 --- a/crates/fayalite/src/util/const_usize.rs +++ b/crates/fayalite/src/util/const_usize.rs @@ -1,8 +1,8 @@ // SPDX-License-Identifier: LGPL-3.0-or-later // See Notices.txt for copyright information use serde::{ - Deserialize, Deserializer, Serialize, Serializer, de::{DeserializeOwned, Error, Unexpected}, + Deserialize, Deserializer, Serialize, Serializer, }; use std::{fmt::Debug, hash::Hash}; diff --git a/crates/fayalite/src/util/misc.rs b/crates/fayalite/src/util/misc.rs index 99b7343..f482eaa 100644 --- a/crates/fayalite/src/util/misc.rs +++ b/crates/fayalite/src/util/misc.rs @@ -163,6 +163,22 @@ impl fmt::UpperHex for BitSliceWriteWithBase<'_> { } } +#[inline] +#[track_caller] +pub fn get_many_mut(slice: &mut [T], indexes: [usize; N]) -> [&mut T; N] { + for i in 0..N { + for j in 0..i { + assert!(indexes[i] != indexes[j], "duplicate index"); + } + assert!(indexes[i] < slice.len(), "index out of bounds"); + } + // Safety: checked that no indexes are duplicates and no indexes are out of bounds + unsafe { + let base = slice.as_mut_ptr(); // convert to a raw pointer before loop to avoid aliasing with &mut [T] + std::array::from_fn(|i| &mut *base.add(indexes[i])) + } +} + #[derive(Clone, Default)] pub struct RcWriter(Rc>>); diff --git a/crates/fayalite/tests/ui/simvalue_is_not_internable.stderr b/crates/fayalite/tests/ui/simvalue_is_not_internable.stderr index 6550b5f..eb8877b 100644 --- a/crates/fayalite/tests/ui/simvalue_is_not_internable.stderr +++ b/crates/fayalite/tests/ui/simvalue_is_not_internable.stderr @@ -4,7 +4,7 @@ error[E0277]: `Cell` cannot be shared between thr 11 | fn f(v: SimValue<()>) -> Interned> { | ^^^^^^^^^^^^^^^^^^^^^^ `Cell` cannot be shared between threads safely | - = help: within `SimValue<()>`, the trait `Sync` is not implemented for `Cell` + = help: within `SimValue<()>`, the trait `Sync` is not implemented for `Cell`, which is required by `SimValue<()>: Sync` = note: if you want to do aliasing and mutation between multiple threads, use `std::sync::RwLock` note: required because it appears within the type `util::alternating_cell::AlternatingCell>` --> src/util/alternating_cell.rs @@ -28,7 +28,7 @@ error[E0277]: `UnsafeCell>` cannot be shared between th 11 | fn f(v: SimValue<()>) -> Interned> { | ^^^^^^^^^^^^^^^^^^^^^^ `UnsafeCell>` cannot be shared between threads safely | - = help: within `SimValue<()>`, the trait `Sync` is not implemented for `UnsafeCell>` + = help: within `SimValue<()>`, the trait `Sync` is not implemented for `UnsafeCell>`, which is required by `SimValue<()>: Sync` note: required because it appears within the type `util::alternating_cell::AlternatingCell>` --> src/util/alternating_cell.rs | @@ -49,29 +49,29 @@ error[E0277]: the trait bound `SimValue<()>: Intern` is not satisfied --> tests/ui/simvalue_is_not_internable.rs:12:26 | 12 | Intern::intern_sized(v) - | -------------------- ^ the trait `Hash` is not implemented for `SimValue<()>` + | -------------------- ^ the trait `Hash` is not implemented for `SimValue<()>`, which is required by `SimValue<()>: Intern` | | | required by a bound introduced by this call | + = help: the following other types implement trait `Intern`: + BitSlice + [T] + str = note: required for `SimValue<()>` to implement `Intern` -help: consider dereferencing here - | -12 | Intern::intern_sized(*v) - | + error[E0277]: the trait bound `SimValue<()>: Intern` is not satisfied --> tests/ui/simvalue_is_not_internable.rs:12:26 | 12 | Intern::intern_sized(v) - | -------------------- ^ the trait `std::cmp::Eq` is not implemented for `SimValue<()>` + | -------------------- ^ the trait `std::cmp::Eq` is not implemented for `SimValue<()>`, which is required by `SimValue<()>: Intern` | | | required by a bound introduced by this call | + = help: the following other types implement trait `Intern`: + BitSlice + [T] + str = note: required for `SimValue<()>` to implement `Intern` -help: consider dereferencing here - | -12 | Intern::intern_sized(*v) - | + error[E0277]: `Cell` cannot be shared between threads safely --> tests/ui/simvalue_is_not_internable.rs:12:26 @@ -81,7 +81,7 @@ error[E0277]: `Cell` cannot be shared between thr | | | required by a bound introduced by this call | - = help: within `SimValue<()>`, the trait `Sync` is not implemented for `Cell` + = help: within `SimValue<()>`, the trait `Sync` is not implemented for `Cell`, which is required by `SimValue<()>: Sync` = note: if you want to do aliasing and mutation between multiple threads, use `std::sync::RwLock` note: required because it appears within the type `util::alternating_cell::AlternatingCell>` --> src/util/alternating_cell.rs @@ -101,10 +101,6 @@ note: required by a bound in `intern_sized` | fn intern(&self) -> Interned; | fn intern_sized(self) -> Interned | ------------ required by a bound in this associated function -help: consider dereferencing here - | -12 | Intern::intern_sized(*v) - | + error[E0277]: `UnsafeCell>` cannot be shared between threads safely --> tests/ui/simvalue_is_not_internable.rs:12:26 @@ -114,7 +110,7 @@ error[E0277]: `UnsafeCell>` cannot be shared between th | | | required by a bound introduced by this call | - = help: within `SimValue<()>`, the trait `Sync` is not implemented for `UnsafeCell>` + = help: within `SimValue<()>`, the trait `Sync` is not implemented for `UnsafeCell>`, which is required by `SimValue<()>: Sync` note: required because it appears within the type `util::alternating_cell::AlternatingCell>` --> src/util/alternating_cell.rs | @@ -133,10 +129,6 @@ note: required by a bound in `intern_sized` | fn intern(&self) -> Interned; | fn intern_sized(self) -> Interned | ------------ required by a bound in this associated function -help: consider dereferencing here - | -12 | Intern::intern_sized(*v) - | + error[E0277]: `Cell` cannot be shared between threads safely --> tests/ui/simvalue_is_not_internable.rs:12:5 @@ -144,7 +136,7 @@ error[E0277]: `Cell` cannot be shared between thr 12 | Intern::intern_sized(v) | ^^^^^^^^^^^^^^^^^^^^^^^ `Cell` cannot be shared between threads safely | - = help: within `SimValue<()>`, the trait `Sync` is not implemented for `Cell` + = help: within `SimValue<()>`, the trait `Sync` is not implemented for `Cell`, which is required by `SimValue<()>: Sync` = note: if you want to do aliasing and mutation between multiple threads, use `std::sync::RwLock` note: required because it appears within the type `util::alternating_cell::AlternatingCell>` --> src/util/alternating_cell.rs @@ -168,7 +160,7 @@ error[E0277]: `UnsafeCell>` cannot be shared between th 12 | Intern::intern_sized(v) | ^^^^^^^^^^^^^^^^^^^^^^^ `UnsafeCell>` cannot be shared between threads safely | - = help: within `SimValue<()>`, the trait `Sync` is not implemented for `UnsafeCell>` + = help: within `SimValue<()>`, the trait `Sync` is not implemented for `UnsafeCell>`, which is required by `SimValue<()>: Sync` note: required because it appears within the type `util::alternating_cell::AlternatingCell>` --> src/util/alternating_cell.rs |