summaryrefslogtreecommitdiff
path: root/src/test/scala/chiselTests/AutoNestedCloneSpec.scala
diff options
context:
space:
mode:
authorRichard Lin2018-01-02 13:51:36 -0800
committerGitHub2018-01-02 13:51:36 -0800
commit678df42aa6bf2f4715be2d051c3c29f058948d0c (patch)
tree0b3fb00565e1c442abd7885d490cd4324f02d3fe /src/test/scala/chiselTests/AutoNestedCloneSpec.scala
parentcb7fcd2b18135230dc40f3c7bb98685e7ffde9d5 (diff)
parentade792ee7c5bb718f738f5e4c3886b2e87c68756 (diff)
Merge pull request #723 from freechipsproject/autoclonetype
Auto clone type 🦆
Diffstat (limited to 'src/test/scala/chiselTests/AutoNestedCloneSpec.scala')
-rw-r--r--src/test/scala/chiselTests/AutoNestedCloneSpec.scala108
1 files changed, 108 insertions, 0 deletions
diff --git a/src/test/scala/chiselTests/AutoNestedCloneSpec.scala b/src/test/scala/chiselTests/AutoNestedCloneSpec.scala
new file mode 100644
index 00000000..746780be
--- /dev/null
+++ b/src/test/scala/chiselTests/AutoNestedCloneSpec.scala
@@ -0,0 +1,108 @@
+// See LICENSE for license details.
+
+package chiselTests
+import Chisel.ChiselException
+import org.scalatest._
+import chisel3._
+
+class BundleWithAnonymousInner(val w: Int) extends Bundle {
+ val inner = new Bundle {
+ val foo = Input(UInt(w.W))
+ }
+}
+
+class AutoNestedCloneSpec extends ChiselFlatSpec with Matchers {
+ behavior of "autoCloneType of inner Bundle in Chisel3"
+
+ it should "clone a doubly-nested inner bundle successfully" in {
+ elaborate {
+ class Outer(val w: Int) extends Module {
+ class Middle(val w: Int) {
+ class InnerIOType extends Bundle {
+ val in = Input(UInt(w.W))
+ }
+ def getIO = new InnerIOType
+ }
+ val io = IO(new Bundle {})
+ val myWire = Wire((new Middle(w)).getIO)
+ }
+ new Outer(2)
+ }
+ }
+
+ it should "clone an anonymous inner bundle successfully" in {
+ elaborate {
+ class TestTop(val w: Int) extends Module {
+ val io = IO(new Bundle {})
+ val myWire = Wire(new Bundle{ val a = UInt(w.W) })
+ }
+ new TestTop(2)
+ }
+ }
+
+ it should "pick the correct $outer instance for an anonymous inner bundle" in {
+ elaborate {
+ class Inner(val w: Int) extends Module {
+ val io = IO(new Bundle{
+ val in = Input(UInt(w.W))
+ val out = Output(UInt(w.W))
+ })
+ }
+ class Outer(val w: Int) extends Module {
+ val io = IO(new Bundle{
+ val in = Input(UInt(w.W))
+ val out = Output(UInt(w.W))
+ })
+ val i = Module(new Inner(w))
+ val iw = Wire(chiselTypeOf(i.io))
+ iw <> io
+ i.io <> iw
+ }
+ new Outer(2)
+ }
+ }
+
+ it should "clone an anonymous, bound, inner bundle of another bundle successfully" in {
+ elaborate {
+ class TestModule(w: Int) extends Module {
+ val io = IO(new BundleWithAnonymousInner(w) )
+ val w0 = WireInit(io)
+ val w1 = WireInit(io.inner)
+ }
+ new TestModule(8)
+ }
+ }
+
+ it should "clone an anonymous, inner bundle of a Module, bound to another bundle successfully" in {
+ elaborate {
+ class TestModule(w: Int) extends Module {
+ val bun = new Bundle {
+ val foo = UInt(w.W)
+ }
+ val io = IO(new Bundle {
+ val inner = Input(bun)
+ })
+ val w0 = WireInit(io)
+ val w1 = WireInit(io.inner)
+ }
+ new TestModule(8)
+ }
+ }
+
+ behavior of "anonymous doubly-nested inner bundle fails with clear error"
+ ( the[ChiselException] thrownBy {
+ elaborate {
+ class Outer(val w: Int) extends Module {
+ class Middle(val w: Int) {
+ def getIO = new Bundle {
+ val in = Input(UInt(w.W))
+ }
+ }
+ val io = IO(new Bundle {})
+ val myWire = Wire((new Middle(w)).getIO)
+ }
+ new Outer(2)
+ }
+ }).getMessage should include("Unable to determine instance")
+
+}