summaryrefslogtreecommitdiff
path: root/src/test/scala/chiselTests/util/experimental/TruthTableSpec.scala
blob: fa2c6f08f9c82cc21e65c93c8c9f7ea306d820b1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
// SPDX-License-Identifier: Apache-2.0

package chiselTests.util.experimental

import chisel3._
import chisel3.util.BitPat
import chisel3.util.experimental.decode.{decoder, 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.fromString(str) == table)
  }
  "TruthTable" should "merge same key" in {
    assert(
      TruthTable.fromString(
        """001100->??1
          |001100->1??
          |???
          |""".stripMargin
      ) == TruthTable.fromString(
        """001100->1?1
          |???
          |""".stripMargin
      )
    )
  }
  "TruthTable" should "crash when merging 0 and 1" in {
    intercept[IllegalArgumentException] {
      TruthTable.fromString(
        """0->0
          |0->1
          |???
          |""".stripMargin
      )
    }
  }
  "TruthTable" should "be reproducible" in {
    class Foo extends Module {

      val io = IO(new Bundle {
        val in = Input(UInt(4.W))
        val out = Output(UInt(16.W))
      })

      val table = TruthTable(
        (0 until 16).map { i =>
          BitPat(i.U(4.W)) -> BitPat((1 << i).U(16.W))
        },
        BitPat.dontCare(16)
      )

      io.out := decoder.qmc(io.in, table)
    }
    assert(chisel3.stage.ChiselStage.emitChirrtl(new Foo) == chisel3.stage.ChiselStage.emitChirrtl(new Foo))
  }
  "TruthTable" should "accept unknown input width" in {
    val t = TruthTable(
      Seq(
        BitPat(0.U) -> BitPat.dontCare(1),
        BitPat(1.U) -> BitPat.dontCare(1),
        BitPat(2.U) -> BitPat.dontCare(1),
        BitPat(3.U) -> BitPat.dontCare(1),
        BitPat(4.U) -> BitPat.dontCare(1),
        BitPat(5.U) -> BitPat.dontCare(1),
        BitPat(6.U) -> BitPat.dontCare(1),
        BitPat(7.U) -> BitPat.dontCare(1)
      ),
      BitPat.N(1)
    )
    assert(t.toString contains "000->?")
    assert(t.toString contains "001->?")
    assert(t.toString contains "010->?")
    assert(t.toString contains "011->?")
    assert(t.toString contains "100->?")
    assert(t.toString contains "101->?")
    assert(t.toString contains "110->?")
    assert(t.toString contains "111->?")
    assert(t.toString contains "     0")
  }
}