blob: dd66ba40a3617c09997e86e147e1473ddbf7b18e (
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
108
109
110
111
112
113
114
115
116
117
118
|
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??????"
)
),
true
)
})
}
}
|