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")
}
}
|