summaryrefslogtreecommitdiff
path: root/src/test/scala/chiselTests/util/BitSetSpec.scala
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
      )
    })
  }

}