summaryrefslogtreecommitdiff
path: root/src/test/scala/chiselTests/util
diff options
context:
space:
mode:
authorJack Koenig2021-09-17 21:01:26 -0700
committerJack Koenig2021-09-17 21:01:26 -0700
commit5c8c19345e6711279594cf1f9ddab33623c8eba7 (patch)
treed9d6ced3934aa4a8be3dec19ddcefe50a7a93d5a /src/test/scala/chiselTests/util
parente63b9667d89768e0ec6dc8a9153335cb48a213a7 (diff)
parent958904cb2f2f65d02b2ab3ec6d9ec2e06d04e482 (diff)
Merge branch 'master' into 3.5-release
Diffstat (limited to 'src/test/scala/chiselTests/util')
-rw-r--r--src/test/scala/chiselTests/util/BitPatSpec.scala44
-rw-r--r--src/test/scala/chiselTests/util/CatSpec.scala30
-rw-r--r--src/test/scala/chiselTests/util/experimental/PlaSpec.scala95
-rw-r--r--src/test/scala/chiselTests/util/experimental/TruthTableSpec.scala63
4 files changed, 232 insertions, 0 deletions
diff --git a/src/test/scala/chiselTests/util/BitPatSpec.scala b/src/test/scala/chiselTests/util/BitPatSpec.scala
new file mode 100644
index 00000000..0c83493f
--- /dev/null
+++ b/src/test/scala/chiselTests/util/BitPatSpec.scala
@@ -0,0 +1,44 @@
+// SPDX-License-Identifier: Apache-2.0
+
+package chiselTests.util
+
+import chisel3.util.BitPat
+import org.scalatest.flatspec.AnyFlatSpec
+import org.scalatest.matchers.should.Matchers
+
+
+class BitPatSpec extends AnyFlatSpec with Matchers {
+ behavior of classOf[BitPat].toString
+
+ it should "convert a BitPat to readable form" in {
+ val testPattern = "0" * 32 + "1" * 32 + "?" * 32 + "?01" * 32
+ BitPat("b" + testPattern).toString should be (s"BitPat($testPattern)")
+ }
+
+ it should "convert a BitPat to raw form" in {
+ val testPattern = "0" * 32 + "1" * 32 + "?" * 32 + "?01" * 32
+ BitPat("b" + testPattern).rawString should be(testPattern)
+ }
+
+ it should "not fail if BitPat width is 0" in {
+ intercept[IllegalArgumentException]{BitPat("b")}
+ }
+
+ it should "contact BitPat via ##" in {
+ (BitPat.Y(4) ## BitPat.dontCare(3) ## BitPat.N(2)).toString should be (s"BitPat(1111???00)")
+ }
+
+ it should "index and return new BitPat" in {
+ val b = BitPat("b1001???")
+ b(0) should be(BitPat.dontCare(1))
+ b(6) should be(BitPat.Y())
+ b(5) should be(BitPat.N())
+ }
+
+ it should "slice and return new BitPat" in {
+ val b = BitPat("b1001???")
+ b(2, 0) should be(BitPat("b???"))
+ b(4, 3) should be(BitPat("b01"))
+ b(6, 6) should be(BitPat("b1"))
+ }
+}
diff --git a/src/test/scala/chiselTests/util/CatSpec.scala b/src/test/scala/chiselTests/util/CatSpec.scala
index 5565ca51..79d2c027 100644
--- a/src/test/scala/chiselTests/util/CatSpec.scala
+++ b/src/test/scala/chiselTests/util/CatSpec.scala
@@ -5,6 +5,7 @@ package chiselTests.util
import chisel3._
import chisel3.stage.ChiselStage
import chisel3.util.Cat
+import chisel3.experimental.noPrefix
import chiselTests.ChiselFlatSpec
@@ -31,4 +32,33 @@ class CatSpec extends ChiselFlatSpec {
}
+ it should "not override the names of its arguments" in {
+ class MyModule extends RawModule {
+ val a, b, c, d = IO(Input(UInt(8.W)))
+ val out = IO(Output(UInt()))
+
+ out := Cat(a, b, c, d)
+ }
+ val chirrtl = ChiselStage.emitChirrtl(new MyModule)
+ for (name <- Seq("a", "b", "c", "d")) {
+ chirrtl should include (s"input $name : UInt<8>")
+ }
+ }
+
+ it should "have prefixed naming" in {
+ class MyModule extends RawModule {
+ val in = IO(Input(Vec(8, UInt(8.W))))
+ val out = IO(Output(UInt()))
+
+ // noPrefix to avoid `out` as prefix
+ out := noPrefix(Cat(in))
+ }
+ val chirrtl = ChiselStage.emitChirrtl(new MyModule)
+ chirrtl should include ("node lo_lo = cat(in[6], in[7])")
+ chirrtl should include ("node lo_hi = cat(in[4], in[5])")
+ chirrtl should include ("node hi_lo = cat(in[2], in[3])")
+ chirrtl should include ("node hi_hi = cat(in[0], in[1])")
+ }
+
+
}
diff --git a/src/test/scala/chiselTests/util/experimental/PlaSpec.scala b/src/test/scala/chiselTests/util/experimental/PlaSpec.scala
new file mode 100644
index 00000000..8af5c936
--- /dev/null
+++ b/src/test/scala/chiselTests/util/experimental/PlaSpec.scala
@@ -0,0 +1,95 @@
+package chiselTests.util.experimental
+
+import chisel3._
+import chisel3.stage.PrintFullStackTraceAnnotation
+import chisel3.testers.BasicTester
+import chisel3.util.{BitPat, pla}
+import chiselTests.ChiselFlatSpec
+
+class PlaSpec extends ChiselFlatSpec {
+ "A 1-of-8 decoder (eg. 74xx138 without enables)" should "be generated correctly" in {
+ assertTesterPasses(new BasicTester {
+ val table = Seq(
+ (BitPat("b000"), BitPat("b00000001")),
+ (BitPat("b001"), BitPat("b00000010")),
+ (BitPat("b010"), BitPat("b00000100")),
+ (BitPat("b011"), BitPat("b00001000")),
+ (BitPat("b100"), BitPat("b00010000")),
+ (BitPat("b101"), BitPat("b00100000")),
+ (BitPat("b110"), BitPat("b01000000")),
+ (BitPat("b111"), BitPat("b10000000")),
+ )
+ table.foreach { case (i, o) =>
+ val (plaIn, plaOut) = pla(table)
+ plaIn := WireDefault(i.value.U(3.W))
+ chisel3.assert(plaOut === o.value.U(8.W), "Input " + i.toString + " produced incorrect output BitPat(%b)", plaOut)
+ }
+ stop()
+ })
+ }
+
+ "An active-low 1-of-8 decoder (eg. inverted 74xx138 without enables)" should "be generated correctly" in {
+ assertTesterPasses(new BasicTester {
+ val table = Seq(
+ (BitPat("b000"), BitPat("b00000001")),
+ (BitPat("b001"), BitPat("b00000010")),
+ (BitPat("b010"), BitPat("b00000100")),
+ (BitPat("b011"), BitPat("b00001000")),
+ (BitPat("b100"), BitPat("b00010000")),
+ (BitPat("b101"), BitPat("b00100000")),
+ (BitPat("b110"), BitPat("b01000000")),
+ (BitPat("b111"), BitPat("b10000000")),
+ )
+ table.foreach { case (i, o) =>
+ val (plaIn, plaOut) = pla(table, BitPat("b11111111"))
+ plaIn := WireDefault(i.value.U(3.W))
+ chisel3.assert(plaOut === ~o.value.U(8.W), "Input " + i.toString + " produced incorrect output BitPat(%b)", plaOut)
+ }
+ stop()
+ })
+ }
+
+ "#2112" should "be generated correctly" in {
+ assertTesterPasses(new BasicTester {
+ val table = Seq(
+ (BitPat("b000"), BitPat("b?01")),
+ (BitPat("b111"), BitPat("b?01")),
+ )
+ table.foreach { case (i, o) =>
+ val (plaIn, plaOut) = pla(table)
+ plaIn := WireDefault(i.value.U(3.W))
+ chisel3.assert(o === plaOut, "Input " + i.toString + " produced incorrect output BitPat(%b)", plaOut)
+ }
+ stop()
+ })
+ }
+
+ "A simple PLA" should "be generated correctly" in {
+ assertTesterPasses(new BasicTester {
+ val table = Seq(
+ (BitPat("b0000"), BitPat("b1")),
+ (BitPat("b0001"), BitPat("b1")),
+ (BitPat("b0010"), BitPat("b0")),
+ (BitPat("b0011"), BitPat("b1")),
+ (BitPat("b0100"), BitPat("b1")),
+ (BitPat("b0101"), BitPat("b0")),
+ (BitPat("b0110"), BitPat("b0")),
+ (BitPat("b0111"), BitPat("b0")),
+ (BitPat("b1000"), BitPat("b0")),
+ (BitPat("b1001"), BitPat("b0")),
+ (BitPat("b1010"), BitPat("b1")),
+ (BitPat("b1011"), BitPat("b0")),
+ (BitPat("b1100"), BitPat("b0")),
+ (BitPat("b1101"), BitPat("b1")),
+ (BitPat("b1110"), BitPat("b1")),
+ (BitPat("b1111"), BitPat("b1")),
+ )
+ table.foreach { case (i, o) =>
+ val (plaIn, plaOut) = pla(table)
+ plaIn := WireDefault(i.value.U(4.W))
+ chisel3.assert(plaOut === o.value.U(1.W), "Input " + i.toString + " produced incorrect output BitPat(%b)", plaOut)
+ }
+ stop()
+ })
+ }
+}
diff --git a/src/test/scala/chiselTests/util/experimental/TruthTableSpec.scala b/src/test/scala/chiselTests/util/experimental/TruthTableSpec.scala
new file mode 100644
index 00000000..743a3cd8
--- /dev/null
+++ b/src/test/scala/chiselTests/util/experimental/TruthTableSpec.scala
@@ -0,0 +1,63 @@
+// SPDX-License-Identifier: Apache-2.0
+
+package chiselTests.util.experimental
+
+import chisel3.util.BitPat
+import chisel3.util.experimental.decode.TruthTable
+import org.scalatest.flatspec.AnyFlatSpec
+
+class TruthTableSpec extends AnyFlatSpec {
+ val table = TruthTable(
+ Map(
+ // BitPat("b000") -> BitPat("b0"),
+ BitPat("b001") -> BitPat("b?"),
+ BitPat("b010") -> BitPat("b?"),
+ // BitPat("b011") -> BitPat("b0"),
+ BitPat("b100") -> BitPat("b1"),
+ BitPat("b101") -> BitPat("b1"),
+ // BitPat("b110") -> BitPat("b0"),
+ BitPat("b111") -> BitPat("b1")
+ ),
+ BitPat("b0")
+ )
+ val str = """001->?
+ |010->?
+ |100->1
+ |101->1
+ |111->1
+ |0""".stripMargin
+ "TruthTable" should "serialize" in {
+ assert(table.toString contains "001->?")
+ assert(table.toString contains "010->?")
+ assert(table.toString contains "100->1")
+ assert(table.toString contains "111->1")
+ assert(table.toString contains " 0")
+ }
+ "TruthTable" should "deserialize" in {
+ assert(TruthTable(str) == table)
+ }
+ "TruthTable" should "merge same key" in {
+ assert(
+ TruthTable(
+ """001100->??1
+ |001100->1??
+ |???
+ |""".stripMargin
+ ) == TruthTable(
+ """001100->1?1
+ |???
+ |""".stripMargin
+ )
+ )
+ }
+ "TruthTable" should "crash when merging 0 and 1" in {
+ intercept[IllegalArgumentException] {
+ TruthTable(
+ """0->0
+ |0->1
+ |???
+ |""".stripMargin
+ )
+ }
+ }
+}