forked from libre-chip/fayalite
make #[hdl_module] support functions with generic parameters
This commit is contained in:
parent
ef4b3b4081
commit
b33566841d
2 changed files with 169 additions and 18 deletions
|
@ -5,6 +5,7 @@ use fayalite::{
|
|||
array::Array,
|
||||
assert_export_firrtl,
|
||||
clock::{Clock, ClockDomain},
|
||||
expr::ToExpr,
|
||||
hdl_module,
|
||||
int::{DynUInt, DynUIntType, IntCmp, SInt, UInt},
|
||||
intern::Intern,
|
||||
|
@ -12,7 +13,7 @@ use fayalite::{
|
|||
module::transform::simplify_enums::{simplify_enums, SimplifyEnumsKind},
|
||||
reset::{SyncReset, ToReset},
|
||||
source_location::SourceLocation,
|
||||
ty::Value,
|
||||
ty::{FixedType, Value},
|
||||
};
|
||||
use serde_json::json;
|
||||
|
||||
|
@ -139,22 +140,22 @@ circuit my_module:
|
|||
}
|
||||
|
||||
#[hdl_module(outline_generated)]
|
||||
pub fn check_array_repeat() {
|
||||
pub fn check_array_repeat<const N: usize>() {
|
||||
#[hdl]
|
||||
let i: UInt<8> = m.input();
|
||||
#[hdl]
|
||||
let o: Array<[UInt<8>; 3]> = m.output();
|
||||
let o: Array<[UInt<8>; N]> = m.output();
|
||||
m.connect(
|
||||
o,
|
||||
#[hdl]
|
||||
[i; 3],
|
||||
[i; N],
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_array_repeat() {
|
||||
let _n = SourceLocation::normalize_files_for_tests();
|
||||
let m = check_array_repeat();
|
||||
let m = check_array_repeat::<3>();
|
||||
dbg!(m);
|
||||
#[rustfmt::skip] // work around https://github.com/rust-lang/rustfmt/issues/6161
|
||||
assert_export_firrtl! {
|
||||
|
@ -169,6 +170,84 @@ circuit check_array_repeat:
|
|||
connect _array_literal_expr[1], i
|
||||
connect _array_literal_expr[2], i
|
||||
connect o, _array_literal_expr @[module-XXXXXXXXXX.rs 4:1]
|
||||
",
|
||||
};
|
||||
let m = check_array_repeat::<4>();
|
||||
dbg!(m);
|
||||
#[rustfmt::skip] // work around https://github.com/rust-lang/rustfmt/issues/6161
|
||||
assert_export_firrtl! {
|
||||
m =>
|
||||
"/test/check_array_repeat_1.fir": r"FIRRTL version 3.2.0
|
||||
circuit check_array_repeat_1:
|
||||
module check_array_repeat_1: @[module-XXXXXXXXXX.rs 1:1]
|
||||
input i: UInt<8> @[module-XXXXXXXXXX.rs 2:1]
|
||||
output o: UInt<8>[4] @[module-XXXXXXXXXX.rs 3:1]
|
||||
wire _array_literal_expr: UInt<8>[4]
|
||||
connect _array_literal_expr[0], i
|
||||
connect _array_literal_expr[1], i
|
||||
connect _array_literal_expr[2], i
|
||||
connect _array_literal_expr[3], i
|
||||
connect o, _array_literal_expr @[module-XXXXXXXXXX.rs 4:1]
|
||||
",
|
||||
};
|
||||
}
|
||||
|
||||
#[hdl_module(outline_generated)]
|
||||
pub fn check_skipped_generics<T, #[hdl(skip)] U, const N: usize, #[hdl(skip)] const M: usize>(v: U)
|
||||
where
|
||||
T: Value<Type: FixedType<Value = T>>,
|
||||
U: std::fmt::Display,
|
||||
{
|
||||
dbg!(M);
|
||||
#[hdl]
|
||||
let i: T = m.input();
|
||||
#[hdl]
|
||||
let o: Array<[T; N]> = m.output();
|
||||
let bytes = v.to_string().as_bytes().to_expr();
|
||||
#[hdl]
|
||||
let o2: Array<[UInt<8>]> = m.output(bytes.ty());
|
||||
m.connect(
|
||||
o,
|
||||
#[hdl]
|
||||
[i; N],
|
||||
);
|
||||
m.connect(o2, bytes);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_skipped_generics() {
|
||||
let _n = SourceLocation::normalize_files_for_tests();
|
||||
let m = check_skipped_generics::<UInt<8>, _, 3, 4>("Hello World!\n");
|
||||
dbg!(m);
|
||||
#[rustfmt::skip] // work around https://github.com/rust-lang/rustfmt/issues/6161
|
||||
assert_export_firrtl! {
|
||||
m =>
|
||||
"/test/check_skipped_generics.fir": r"FIRRTL version 3.2.0
|
||||
circuit check_skipped_generics:
|
||||
module check_skipped_generics: @[module-XXXXXXXXXX.rs 1:1]
|
||||
input i: UInt<8> @[module-XXXXXXXXXX.rs 2:1]
|
||||
output o: UInt<8>[3] @[module-XXXXXXXXXX.rs 3:1]
|
||||
output o2: UInt<8>[13] @[module-XXXXXXXXXX.rs 4: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 5:1]
|
||||
wire _array_literal_expr_1: UInt<8>[13]
|
||||
connect _array_literal_expr_1[0], UInt<8>(0h48)
|
||||
connect _array_literal_expr_1[1], UInt<8>(0h65)
|
||||
connect _array_literal_expr_1[2], UInt<8>(0h6C)
|
||||
connect _array_literal_expr_1[3], UInt<8>(0h6C)
|
||||
connect _array_literal_expr_1[4], UInt<8>(0h6F)
|
||||
connect _array_literal_expr_1[5], UInt<8>(0h20)
|
||||
connect _array_literal_expr_1[6], UInt<8>(0h57)
|
||||
connect _array_literal_expr_1[7], UInt<8>(0h6F)
|
||||
connect _array_literal_expr_1[8], UInt<8>(0h72)
|
||||
connect _array_literal_expr_1[9], UInt<8>(0h6C)
|
||||
connect _array_literal_expr_1[10], UInt<8>(0h64)
|
||||
connect _array_literal_expr_1[11], UInt<8>(0h21)
|
||||
connect _array_literal_expr_1[12], UInt<8>(0hA)
|
||||
connect o2, _array_literal_expr_1 @[module-XXXXXXXXXX.rs 6:1]
|
||||
",
|
||||
};
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue