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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
|
package chiselTests.util
import chisel3.util.experimental.BitSet
import chisel3.util.BitPat
import org.scalatest.flatspec.AnyFlatSpec
import org.scalatest.matchers.should.Matchers
class BitSetSpec extends AnyFlatSpec with Matchers {
behavior.of(classOf[BitSet].toString)
it should "reject unequal width when constructing a BitSet" in {
intercept[IllegalArgumentException] {
BitSet.fromString("""b0010
|b00010
|""".stripMargin)
}
}
it should "return empty subtraction result correctly" in {
val aBitPat = BitPat("b10?")
val bBitPat = BitPat("b1??")
aBitPat.subtract(bBitPat).isEmpty should be(true)
}
it should "return nonempty subtraction result correctly" in {
val aBitPat = BitPat("b10?")
val bBitPat = BitPat("b1??")
val cBitPat = BitPat("b11?")
val dBitPat = BitPat("b100")
val diffBitPat = bBitPat.subtract(aBitPat)
bBitPat.cover(diffBitPat) should be(true)
diffBitPat.equals(cBitPat) should be(true)
val largerdiffBitPat = bBitPat.subtract(dBitPat)
aBitPat.cover(dBitPat) should be(true)
largerdiffBitPat.cover(diffBitPat) should be(true)
}
it should "be able to handle complex subtract between BitSet" in {
val aBitSet = BitSet.fromString("""b?01?0
|b11111
|b00000
|""".stripMargin)
val bBitSet = BitSet.fromString(
"""b?1111
|b?0000
|""".stripMargin
)
val expected = BitPat("b?01?0")
expected.equals(aBitSet.subtract(bBitSet)) should be(true)
}
it should "be generated from BitPat union" in {
val aBitSet = BitSet.fromString("""b001?0
|b000??""".stripMargin)
val aBitPat = BitPat("b000??")
val bBitPat = BitPat("b001?0")
val cBitPat = BitPat("b00000")
aBitPat.cover(cBitPat) should be(true)
aBitSet.cover(bBitPat) should be(true)
aBitSet.equals(aBitPat.union(bBitPat)) should be(true)
}
it should "be generated from BitPat subtraction" in {
val aBitSet = BitSet.fromString("""b001?0
|b000??""".stripMargin)
val aBitPat = BitPat("b00???")
val bBitPat = BitPat("b001?1")
aBitSet.equals(aBitPat.subtract(bBitPat)) should be(true)
}
it should "union two BitSet together" in {
val aBitSet = BitSet.fromString("""b001?0
|b001?1
|""".stripMargin)
val bBitSet = BitSet.fromString(
"""b000??
|b01???
|""".stripMargin
)
val cBitPat = BitPat("b0????")
cBitPat.equals(aBitSet.union(bBitSet)) should be(true)
}
it should "be decoded" in {
import chisel3._
import chisel3.util.experimental.decode.decoder
// [0 - 256] part into: [0 - 31], [32 - 47, 64 - 127], [192 - 255]
// "0011????" "10??????" is empty to error
chisel3.stage.ChiselStage.emitSystemVerilog(new Module {
val in = IO(Input(UInt(8.W)))
val out = IO(Output(UInt(4.W)))
out := decoder.bitset(
in,
Seq(
BitSet.fromString(
"b000?????"
),
BitSet.fromString(
"""b0010????
|b01??????
|""".stripMargin
),
BitSet.fromString(
"b11??????"
)
),
errorBit = true
)
})
}
it should "be decoded with DontCare error" in {
import chisel3._
import chisel3.util.experimental.decode.decoder
// [0 - 256] part into: [0 - 31], [32 - 47, 64 - 127], [192 - 255]
// "0011????" "10??????" is empty to error
chisel3.stage.ChiselStage.emitSystemVerilog(new Module {
val in = IO(Input(UInt(8.W)))
val out = IO(Output(UInt(4.W)))
out := decoder.bitset(
in,
Seq(
BitSet.fromString(
"b000?????"
),
BitSet.fromString(
"""b0010????
|b01??????
|""".stripMargin
),
BitSet.fromString(
"b11??????"
)
),
errorBit = false
)
})
}
}
|