diff options
| author | jackkoenig | 2016-04-13 17:36:40 -0700 |
|---|---|---|
| committer | jackkoenig | 2016-04-22 13:46:15 -0700 |
| commit | 6ddd8303725d8897f69d8fb971f1df6c585d3656 (patch) | |
| tree | 2bd0ddbd39f674760fc5d385e9c588bb7da5cf6b /src | |
| parent | 976810c78f43f8e9087f53463d32ce321f1184d1 (diff) | |
Add Lower Types tests
Diffstat (limited to 'src')
| -rw-r--r-- | src/test/scala/firrtlTests/LowerTypesSpec.scala | 188 |
1 files changed, 188 insertions, 0 deletions
diff --git a/src/test/scala/firrtlTests/LowerTypesSpec.scala b/src/test/scala/firrtlTests/LowerTypesSpec.scala new file mode 100644 index 00000000..8da10b3a --- /dev/null +++ b/src/test/scala/firrtlTests/LowerTypesSpec.scala @@ -0,0 +1,188 @@ + +package firrtlTests + +import java.io._ +import org.scalatest._ +import org.scalatest.prop._ +import firrtl.{Parser,Circuit} +import firrtl.passes._ + +class LowerTypesSpec extends FirrtlFlatSpec { + private val passes = Seq( + ToWorkingIR, + CheckHighForm, + ResolveKinds, + InferTypes, + CheckTypes, + ResolveGenders, + CheckGenders, + InferWidths, + CheckWidths, + PullMuxes, + ExpandConnects, + RemoveAccesses, + ExpandWhens, + CheckInitialization, + Legalize, + ConstProp, + ResolveKinds, + InferTypes, + ResolveGenders, + InferWidths, + LowerTypes) + + private def executeTest(input: String, expected: Seq[String]) = { + val c = passes.foldLeft(Parser.parse("", input.split("\n").toIterator)) { + (c: Circuit, p: Pass) => p.run(c) + } + val lines = c.serialize.split("\n") map normalized + + expected foreach { e => + lines should contain(e) + } + } + + behavior of "Lower Types" + + it should "lower ports" in { + val input = + """circuit Test : + | module Test : + | input w : UInt<1> + | input x : {a : UInt<1>, b : UInt<1>} + | input y : UInt<1>[4] + | input z : { c : { d : UInt<1>, e : UInt<1>}, f : UInt<1>[2] }[2] + """.stripMargin + val expected = Seq("w", "x_a", "x_b", "y_0", "y_1", "y_2", "y_3", "z_0_c_d", + "z_0_c_e", "z_0_f_0", "z_0_f_1", "z_1_c_d", "z_1_c_e", "z_1_f_0", + "z_1_f_1") map (x => s"input $x : UInt<1>") map normalized + + executeTest(input, expected) + } + + it should "lower registers" in { + val input = + """circuit Test : + | module Test : + | input clk : Clock + | input reset : UInt<1> + | reg w : UInt<1>, clk + | reg x : {a : UInt<1>, b : UInt<1>}, clk + | reg y : UInt<1>[4], clk + | reg z : { c : { d : UInt<1>, e : UInt<1>}, f : UInt<1>[2] }[2], clk + """.stripMargin + val expected = Seq("w", "x_a", "x_b", "y_0", "y_1", "y_2", "y_3", "z_0_c_d", + "z_0_c_e", "z_0_f_0", "z_0_f_1", "z_1_c_d", "z_1_c_e", "z_1_f_0", + "z_1_f_1") map (x => s"reg $x : UInt<1>, clk with :") map normalized + + executeTest(input, expected) + } + + it should "lower registers with aggregate initialization" in { + val input = + """circuit Test : + | module Test : + | input clk : Clock + | input reset : UInt<1> + | input init : { a : UInt<1>, b : UInt<1>}[2] + | reg x : { a : UInt<1>, b : UInt<1>}[2], clk with : + | reset => (reset, init) + """.stripMargin + val expected = Seq( + "reg x_0_a : UInt<1>, clk with :", "reset => (reset, init_0_a)", + "reg x_0_b : UInt<1>, clk with :", "reset => (reset, init_0_b)", + "reg x_1_a : UInt<1>, clk with :", "reset => (reset, init_1_a)", + "reg x_1_b : UInt<1>, clk with :", "reset => (reset, init_1_b)" + ) map normalized + + executeTest(input, expected) + } + + it should "lower DefRegister expressions: clk, reset, and init" in { + val input = + """circuit Test : + | module Test : + | input clk : Clock[2] + | input reset : { a : UInt<1>, b : UInt<1>} + | input init : { a : UInt<4>, b : { c : UInt<4>, d : UInt<4>}[2]}[4] + | reg foo : UInt<4>, clk[1], with : + | reset => (reset.a, init[3].b[1].d) + """.stripMargin + val expected = Seq( + "reg foo : UInt<4>, clk_1 with :", + "reset => (reset_a, init_3_b_1_d)" + ) map normalized + + executeTest(input, expected) + } + + it should "lower DefInstances (but not too far!)" in { + val input = + """circuit Test : + | module Other : + | input a : { b : UInt<1>, c : UInt<1>} + | output d : UInt<1>[2] + | d[0] <= a.b + | d[1] <= a.c + | module Test : + | input x : UInt<1> + | inst mod of Other + | mod.a.b <= x + | mod.a.c <= x + | node y = mod.d[0] + """.stripMargin + val expected = Seq( + "mod.a_b <= x", + "mod.a_c <= x", + "node y = mod.d_0") map normalized + + executeTest(input, expected) + } + + it should "lower aggregate memories" in { + val input = + """circuit Test : + | module Test : + | input clk : Clock + | mem m : + | data-type => { a : UInt<8>, b : UInt<8>}[2] + | depth => 32 + | read-latency => 0 + | write-latency => 1 + | reader => read + | writer => write + | m.read.clk <= clk + | m.read.en <= UInt<1>(1) + | m.read.addr is invalid + | node x = m.read.data + | node y = m.read.data[0].b + | + | m.write.clk <= clk + | m.write.en <= UInt<1>(0) + | m.write.mask is invalid + | m.write.addr is invalid + | wire w : { a : UInt<8>, b : UInt<8>}[2] + | w[0].a <= UInt<4>(2) + | w[0].b <= UInt<4>(3) + | w[1].a <= UInt<4>(4) + | w[1].b <= UInt<4>(5) + | m.write.data <= w + + """.stripMargin + val expected = Seq( + "mem m_0_a :", "mem m_0_b :", "mem m_1_a :", "mem m_1_b :", + "m_0_a.read.clk <= clk", "m_0_b.read.clk <= clk", + "m_1_a.read.clk <= clk", "m_1_b.read.clk <= clk", + "m_0_a.read.addr is invalid", "m_0_b.read.addr is invalid", + "m_1_a.read.addr is invalid", "m_1_b.read.addr is invalid", + "node x_0_a = m_0_a.read.data", "node x_0_b = m_0_b.read.data", + "node x_1_a = m_1_a.read.data", "node x_1_b = m_1_b.read.data", + "m_0_a.write.mask is invalid", "m_0_b.write.mask is invalid", + "m_1_a.write.mask is invalid", "m_1_b.write.mask is invalid", + "m_0_a.write.data <= w_0_a", "m_0_b.write.data <= w_0_b", + "m_1_a.write.data <= w_1_a", "m_1_b.write.data <= w_1_b" + ) map normalized + + executeTest(input, expected) + } +} |
