summaryrefslogtreecommitdiff
path: root/src/test/scala/chiselTests/experimental/hierarchy/Examples.scala
diff options
context:
space:
mode:
authorJack2022-11-11 06:53:04 +0000
committerJack2022-11-11 06:53:04 +0000
commit3ce953c81f06519351c48277e3474b5720ec07ff (patch)
treeac79dcb80d0528c2ae86ca21da4cf424715ab645 /src/test/scala/chiselTests/experimental/hierarchy/Examples.scala
parentadccde9998c91875e5490cff6d5822ffacc593ed (diff)
parentc8046636a25474be4c547c6fe9c6d742ea7b1d13 (diff)
Merge branch '3.5.x' into 3.5-release
Diffstat (limited to 'src/test/scala/chiselTests/experimental/hierarchy/Examples.scala')
-rw-r--r--src/test/scala/chiselTests/experimental/hierarchy/Examples.scala66
1 files changed, 66 insertions, 0 deletions
diff --git a/src/test/scala/chiselTests/experimental/hierarchy/Examples.scala b/src/test/scala/chiselTests/experimental/hierarchy/Examples.scala
index fa26cbde..27725c49 100644
--- a/src/test/scala/chiselTests/experimental/hierarchy/Examples.scala
+++ b/src/test/scala/chiselTests/experimental/hierarchy/Examples.scala
@@ -271,4 +271,70 @@ object Examples {
@public val mem = Mem(8, UInt(32.W))
@public val syncReadMem = SyncReadMem(8, UInt(32.W))
}
+
+ @instantiable
+ class LeafInstantiable(val bundle: Data) {
+ @public val bundle = bundle
+ }
+
+ @instantiable
+ class NestedInstantiable(val in: LeafInstantiable, val out: LeafInstantiable) {
+ @public val in = in
+ @public val out = out
+ }
+
+ @instantiable
+ class AddOneNestedInstantiableData(width: Int) extends Module {
+ @public val in = IO(Input(UInt(width.W)))
+ @public val out = IO(Output(UInt(width.W)))
+ out := in + 1.U
+
+ @public val leafOut = new LeafInstantiable(out)
+ @public val leafIn = new LeafInstantiable(in)
+ @public val nested = new NestedInstantiable(in = leafIn, out = leafOut)
+
+ }
+
+ class AddTwoNestedInstantiableData(width: Int) extends Module {
+ val in = IO(Input(UInt(width.W)))
+ val out = IO(Output(UInt(width.W)))
+ val addOneDef = Definition(new AddOneNestedInstantiableData(width))
+ val i0 = Instance(addOneDef)
+ val i1 = Instance(addOneDef)
+ i0.in := in
+ i1.in := i0.out
+ out := i1.out
+
+ // both are equivalent to the above
+ i1.leafIn.bundle := i0.leafOut.bundle
+ i1.nested.in.bundle := i0.nested.out.bundle
+ }
+
+ class AddTwoNestedInstantiableDataSubmodule(addOneDef: Definition[AddOneNestedInstantiableData]) extends Module {
+ val in = IO(Input(UInt(addOneDef.in.getWidth.W)))
+ val out = IO(Output(UInt(addOneDef.out.getWidth.W)))
+ val i0 = Instance(addOneDef)
+ val i1 = Instance(addOneDef)
+ i0.in := in
+ i1.in := i0.out
+ out := i1.out
+
+ // both are equivalent to the above
+ i1.leafIn.bundle := i0.leafOut.bundle
+ i1.nested.in.bundle := i0.nested.out.bundle
+ }
+
+ class AddTwoNestedInstantiableDataWrapper(width: Int) extends Module {
+ val in = IO(Input(UInt(width.W)))
+ val out = IO(Output(UInt(width.W)))
+
+ val original = Module(new AddOneNestedInstantiableData(width))
+ val copy = Module(new AddTwoNestedInstantiableDataSubmodule(original.toDefinition))
+
+ original.in := in
+ copy.in := original.out
+ out := copy.out
+
+ }
+
}