From c2e5ea8e8974d4fd5a9a7d63d9060104249235de Mon Sep 17 00:00:00 2001 From: Jacob Lifshay Date: Tue, 16 Jul 2024 17:19:17 -0700 Subject: [PATCH] implement #[hdl] [a; N] -- an array repeat expression --- crates/fayalite-proc-macros-impl/src/fold.rs | 1 + .../src/module/transform_body.rs | 1 + .../expand_aggregate_literals.rs | 16 +++++++-- crates/fayalite/tests/module.rs | 35 +++++++++++++++++++ 4 files changed, 51 insertions(+), 2 deletions(-) diff --git a/crates/fayalite-proc-macros-impl/src/fold.rs b/crates/fayalite-proc-macros-impl/src/fold.rs index 0ef9490..6175914 100644 --- a/crates/fayalite-proc-macros-impl/src/fold.rs +++ b/crates/fayalite-proc-macros-impl/src/fold.rs @@ -221,6 +221,7 @@ forward_fold!(syn::ExprCall => fold_expr_call); forward_fold!(syn::ExprIf => fold_expr_if); forward_fold!(syn::ExprMatch => fold_expr_match); forward_fold!(syn::ExprPath => fold_expr_path); +forward_fold!(syn::ExprRepeat => fold_expr_repeat); forward_fold!(syn::ExprStruct => fold_expr_struct); forward_fold!(syn::ExprTuple => fold_expr_tuple); forward_fold!(syn::Ident => fold_ident); 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 6d098d6..4dc18d9 100644 --- a/crates/fayalite-proc-macros-impl/src/module/transform_body.rs +++ b/crates/fayalite-proc-macros-impl/src/module/transform_body.rs @@ -1515,6 +1515,7 @@ impl Fold for Visitor { If => process_hdl_if, Match => process_hdl_match, Array => process_hdl_array, + Repeat => process_hdl_repeat, Struct => process_hdl_struct, Tuple => process_hdl_tuple, Call => process_hdl_call, 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 9deb07b..f6ae7cd 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 @@ -9,8 +9,8 @@ use syn::{ punctuated::{Pair, Punctuated}, spanned::Spanned, token::{Brace, Paren}, - Attribute, Expr, ExprArray, ExprCall, ExprGroup, ExprPath, ExprStruct, ExprTuple, FieldValue, - Ident, Index, Member, Path, PathArguments, PathSegment, Token, TypePath, + Attribute, Expr, ExprArray, ExprCall, ExprGroup, ExprPath, ExprRepeat, ExprStruct, ExprTuple, + FieldValue, Ident, Index, Member, Path, PathArguments, PathSegment, Token, TypePath, }; options! { @@ -351,6 +351,18 @@ impl Visitor { } parse_quote! {::fayalite::expr::ToExpr::to_expr(&#expr_array)} } + pub(crate) fn process_hdl_repeat( + &mut self, + hdl_attr: HdlAttr, + mut expr_repeat: ExprRepeat, + ) -> Expr { + self.require_normal_module(hdl_attr); + let repeated_value = &expr_repeat.expr; + *expr_repeat.expr = parse_quote_spanned! {repeated_value.span()=> + ::fayalite::expr::ToExpr::to_expr(&(#repeated_value)) + }; + parse_quote! {::fayalite::expr::ToExpr::to_expr(&#expr_repeat)} + } pub(crate) fn process_struct_enum( &mut self, hdl_attr: HdlAttr, diff --git a/crates/fayalite/tests/module.rs b/crates/fayalite/tests/module.rs index 908dac3..9ee28ca 100644 --- a/crates/fayalite/tests/module.rs +++ b/crates/fayalite/tests/module.rs @@ -138,6 +138,41 @@ circuit my_module: }; } +#[hdl_module(outline_generated)] +pub fn check_array_repeat() { + #[hdl] + let i: UInt<8> = m.input(); + #[hdl] + let o: Array<[UInt<8>; 3]> = m.output(); + m.connect( + o, + #[hdl] + [i; 3], + ); +} + +#[test] +fn test_array_repeat() { + let _n = SourceLocation::normalize_files_for_tests(); + let m = check_array_repeat(); + dbg!(m); + #[rustfmt::skip] // work around https://github.com/rust-lang/rustfmt/issues/6161 + assert_export_firrtl! { + m => + "/test/check_array_repeat.fir": r"FIRRTL version 3.2.0 +circuit check_array_repeat: + module check_array_repeat: @[module-XXXXXXXXXX.rs 1:1] + input i: UInt<8> @[module-XXXXXXXXXX.rs 2:1] + output o: UInt<8>[3] @[module-XXXXXXXXXX.rs 3:1] + wire _array_literal_expr: UInt<8>[3] + connect _array_literal_expr[0], i + connect _array_literal_expr[1], i + connect _array_literal_expr[2], i + connect o, _array_literal_expr @[module-XXXXXXXXXX.rs 4:1] +", + }; +} + #[hdl_module(outline_generated)] pub fn check_partially_written() { #[hdl]