summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/scala/chisel3/util/experimental/decode/TruthTable.scala14
-rw-r--r--src/test/scala/chiselTests/AsTypeOfTester.scala2
-rw-r--r--src/test/scala/chiselTests/BundleElementsSpec.scala2
-rw-r--r--src/test/scala/chiselTests/BundleLiteralSpec.scala2
-rw-r--r--src/test/scala/chiselTests/ChiselEnum.scala (renamed from src/test/scala/chiselTests/StrongEnum.scala)34
-rw-r--r--src/test/scala/chiselTests/DataEqualitySpec.scala2
-rw-r--r--src/test/scala/chiselTests/DataPrint.scala2
-rw-r--r--src/test/scala/chiselTests/VecLiteralSpec.scala2
-rw-r--r--src/test/scala/chiselTests/VecToTargetSpec.scala86
-rw-r--r--src/test/scala/chiselTests/WarningSpec.scala2
-rw-r--r--src/test/scala/chiselTests/experimental/TraceSpec.scala1
-rw-r--r--src/test/scala/chiselTests/util/experimental/TruthTableSpec.scala4
-rw-r--r--src/test/scala/cookbook/FSM.scala3
13 files changed, 122 insertions, 34 deletions
diff --git a/src/main/scala/chisel3/util/experimental/decode/TruthTable.scala b/src/main/scala/chisel3/util/experimental/decode/TruthTable.scala
index 2720e690..8259564f 100644
--- a/src/main/scala/chisel3/util/experimental/decode/TruthTable.scala
+++ b/src/main/scala/chisel3/util/experimental/decode/TruthTable.scala
@@ -3,13 +3,17 @@
package chisel3.util.experimental.decode
import chisel3.util.BitPat
+import scala.util.hashing.MurmurHash3
import scala.collection.mutable
-sealed class TruthTable private (val table: Seq[(BitPat, BitPat)], val default: BitPat, val sort: Boolean) {
+sealed class TruthTable private (val table: Seq[(BitPat, BitPat)], val default: BitPat, _sort: Boolean) {
def inputWidth = table.head._1.getWidth
def outputWidth = table.head._2.getWidth
+ @deprecated("This field is unused and will be removed.", "Chisel 3.5")
+ def sort: Boolean = _sort
+
override def toString: String = {
def writeRow(map: (BitPat, BitPat)): String =
s"${map._1.rawString}->${map._2.rawString}"
@@ -17,15 +21,17 @@ sealed class TruthTable private (val table: Seq[(BitPat, BitPat)], val default:
(table.map(writeRow) ++ Seq(s"${" " * (inputWidth + 2)}${default.rawString}")).mkString("\n")
}
- def copy(table: Seq[(BitPat, BitPat)] = this.table, default: BitPat = this.default, sort: Boolean = this.sort) =
- TruthTable(table, default, sort)
+ def copy(table: Seq[(BitPat, BitPat)] = this.table, default: BitPat = this.default, sort: Boolean = _sort) =
+ TruthTable(table, default)
override def equals(y: Any): Boolean = {
y match {
- case y: TruthTable => toString == y.toString
+ case that: TruthTable => this.table == that.table && this.default == that.default
case _ => false
}
}
+
+ override lazy val hashCode: Int = MurmurHash3.productHash((table, default))
}
object TruthTable {
diff --git a/src/test/scala/chiselTests/AsTypeOfTester.scala b/src/test/scala/chiselTests/AsTypeOfTester.scala
index 2141cac2..a1668914 100644
--- a/src/test/scala/chiselTests/AsTypeOfTester.scala
+++ b/src/test/scala/chiselTests/AsTypeOfTester.scala
@@ -3,7 +3,7 @@
package chiselTests
import chisel3._
-import chisel3.experimental.{ChiselEnum, DataMirror, FixedPoint}
+import chisel3.experimental.{DataMirror, FixedPoint}
import chisel3.testers.BasicTester
class AsTypeOfBundleTester extends BasicTester {
diff --git a/src/test/scala/chiselTests/BundleElementsSpec.scala b/src/test/scala/chiselTests/BundleElementsSpec.scala
index fab2e733..afca3d81 100644
--- a/src/test/scala/chiselTests/BundleElementsSpec.scala
+++ b/src/test/scala/chiselTests/BundleElementsSpec.scala
@@ -3,7 +3,7 @@
package chiselTests
import chisel3._
-import chisel3.experimental.{ChiselEnum, FixedPoint}
+import chisel3.experimental.FixedPoint
import chisel3.stage.ChiselStage
import chisel3.util.Decoupled
import org.scalatest.exceptions.TestFailedException
diff --git a/src/test/scala/chiselTests/BundleLiteralSpec.scala b/src/test/scala/chiselTests/BundleLiteralSpec.scala
index bc6522bb..f90e230d 100644
--- a/src/test/scala/chiselTests/BundleLiteralSpec.scala
+++ b/src/test/scala/chiselTests/BundleLiteralSpec.scala
@@ -7,7 +7,7 @@ import chisel3.stage.ChiselStage
import chisel3.testers.BasicTester
import chisel3.experimental.BundleLiterals._
import chisel3.experimental.VecLiterals.AddVecLiteralConstructor
-import chisel3.experimental.{BundleLiteralException, ChiselEnum, ChiselRange, FixedPoint, Interval}
+import chisel3.experimental.{BundleLiteralException, ChiselRange, FixedPoint, Interval}
class BundleLiteralSpec extends ChiselFlatSpec with Utils {
object MyEnum extends ChiselEnum {
diff --git a/src/test/scala/chiselTests/StrongEnum.scala b/src/test/scala/chiselTests/ChiselEnum.scala
index e9f412fe..dbad273b 100644
--- a/src/test/scala/chiselTests/StrongEnum.scala
+++ b/src/test/scala/chiselTests/ChiselEnum.scala
@@ -3,9 +3,7 @@
package chiselTests
import chisel3._
-import chisel3.experimental.ChiselEnum
import chisel3.experimental.AffectsChiselPrefix
-import chisel3.experimental.suppressEnumCastWarning
import chisel3.internal.firrtl.UnknownWidth
import chisel3.stage.{ChiselGeneratorAnnotation, ChiselStage}
import chisel3.util._
@@ -119,7 +117,7 @@ class EnumOps(val xType: ChiselEnum, val yType: ChiselEnum) extends Module {
io.ne := io.x =/= io.y
}
-object StrongEnumFSM {
+object ChiselEnumFSM {
object State extends ChiselEnum {
val sNone, sOne1, sTwo1s = Value
@@ -127,9 +125,9 @@ object StrongEnumFSM {
}
}
-class StrongEnumFSM extends Module {
- import StrongEnumFSM.State
- import StrongEnumFSM.State._
+class ChiselEnumFSM extends Module {
+ import ChiselEnumFSM.State
+ import ChiselEnumFSM.State._
// This FSM detects two 1's one after the other
val io = IO(new Bundle {
@@ -304,10 +302,10 @@ class WidthTester extends BasicTester {
stop()
}
-class StrongEnumFSMTester extends BasicTester {
- import StrongEnumFSM.State._
+class ChiselEnumFSMTester extends BasicTester {
+ import ChiselEnumFSM.State._
- val dut = Module(new StrongEnumFSM)
+ val dut = Module(new ChiselEnumFSM)
// Inputs and expected results
val inputs: Vec[Bool] = VecInit(false.B, true.B, false.B, true.B, true.B, true.B, false.B, true.B, true.B, false.B)
@@ -362,10 +360,10 @@ class IsOneOfTester extends BasicTester {
stop()
}
-class StrongEnumSpec extends ChiselFlatSpec with Utils {
+class ChiselEnumSpec extends ChiselFlatSpec with Utils {
import chisel3.internal.ChiselException
- behavior.of("Strong enum tester")
+ behavior.of("ChiselEnum")
it should "fail to instantiate non-literal enums with the Value function" in {
an[ExceptionInInitializerError] should be thrownBy extractCause[ExceptionInInitializerError] {
@@ -470,8 +468,8 @@ class StrongEnumSpec extends ChiselFlatSpec with Utils {
"object UnnamedEnum extends ChiselEnum { Value }" shouldNot compile
}
- "StrongEnum FSM" should "work" in {
- assertTesterPasses(new StrongEnumFSMTester)
+ "ChiselEnum FSM" should "work" in {
+ assertTesterPasses(new ChiselEnumFSMTester)
}
"Casting a UInt to an Enum" should "warn if the UInt can express illegal states" in {
@@ -584,7 +582,7 @@ class StrongEnumSpec extends ChiselFlatSpec with Utils {
}
}
-class StrongEnumAnnotator extends Module {
+class ChiselEnumAnnotator extends Module {
import EnumExample._
object LocalEnum extends ChiselEnum {
@@ -643,7 +641,7 @@ class StrongEnumAnnotator extends Module {
val indexed2 = vec_of_bundles(cycle)
}
-class StrongEnumAnnotatorWithChiselName extends Module {
+class ChiselEnumAnnotatorWithChiselName extends Module {
import EnumExample._
object LocalEnum extends ChiselEnum with AffectsChiselPrefix {
@@ -702,7 +700,7 @@ class StrongEnumAnnotatorWithChiselName extends Module {
val indexed2 = vec_of_bundles(cycle)
}
-class StrongEnumAnnotationSpec extends AnyFreeSpec with Matchers {
+class ChiselEnumAnnotationSpec extends AnyFreeSpec with Matchers {
import chisel3.experimental.EnumAnnotations._
import firrtl.annotations.{Annotation, ComponentName}
@@ -820,7 +818,7 @@ class StrongEnumAnnotationSpec extends AnyFreeSpec with Matchers {
}
"Test that strong enums annotate themselves appropriately" in {
- test(() => new StrongEnumAnnotator)
- test(() => new StrongEnumAnnotatorWithChiselName)
+ test(() => new ChiselEnumAnnotator)
+ test(() => new ChiselEnumAnnotatorWithChiselName)
}
}
diff --git a/src/test/scala/chiselTests/DataEqualitySpec.scala b/src/test/scala/chiselTests/DataEqualitySpec.scala
index 4ac3292d..8fbbaf94 100644
--- a/src/test/scala/chiselTests/DataEqualitySpec.scala
+++ b/src/test/scala/chiselTests/DataEqualitySpec.scala
@@ -3,7 +3,7 @@ package chiselTests
import chisel3._
import chisel3.experimental.VecLiterals._
import chisel3.experimental.BundleLiterals._
-import chisel3.experimental.{Analog, ChiselEnum, ChiselRange, FixedPoint, Interval}
+import chisel3.experimental.{Analog, ChiselRange, FixedPoint, Interval}
import chisel3.stage.ChiselStage
import chisel3.testers.BasicTester
import chisel3.util.Valid
diff --git a/src/test/scala/chiselTests/DataPrint.scala b/src/test/scala/chiselTests/DataPrint.scala
index 091722b8..82fa1519 100644
--- a/src/test/scala/chiselTests/DataPrint.scala
+++ b/src/test/scala/chiselTests/DataPrint.scala
@@ -5,7 +5,7 @@ package chiselTests
import org.scalatest._
import chisel3._
-import chisel3.experimental.{ChiselEnum, FixedPoint}
+import chisel3.experimental.FixedPoint
import chisel3.experimental.BundleLiterals._
import chisel3.stage.ChiselStage
import org.scalatest.matchers.should.Matchers
diff --git a/src/test/scala/chiselTests/VecLiteralSpec.scala b/src/test/scala/chiselTests/VecLiteralSpec.scala
index e2eb791d..dcc96b17 100644
--- a/src/test/scala/chiselTests/VecLiteralSpec.scala
+++ b/src/test/scala/chiselTests/VecLiteralSpec.scala
@@ -5,7 +5,7 @@ package chiselTests
import chisel3._
import chisel3.experimental.BundleLiterals.AddBundleLiteralConstructor
import chisel3.experimental.VecLiterals._
-import chisel3.experimental.{ChiselEnum, FixedPoint, VecLiteralException}
+import chisel3.experimental.{FixedPoint, VecLiteralException}
import chisel3.stage.ChiselStage
import chisel3.testers.BasicTester
import chisel3.util.Counter
diff --git a/src/test/scala/chiselTests/VecToTargetSpec.scala b/src/test/scala/chiselTests/VecToTargetSpec.scala
new file mode 100644
index 00000000..20c6f306
--- /dev/null
+++ b/src/test/scala/chiselTests/VecToTargetSpec.scala
@@ -0,0 +1,86 @@
+// SPDX-License-Identifier: Apache-2.0
+
+package chiselTests
+
+import chisel3._
+import chisel3.stage.ChiselStage
+
+trait VecToTargetSpecUtils extends Utils {
+ this: ChiselFunSpec =>
+
+ class Foo extends RawModule {
+ val vec = IO(Input(Vec(4, Bool())))
+
+ // Index a Vec with a Scala literal.
+ val scalaLit = 0
+ val vecSubaccessScalaLit = vec(scalaLit)
+
+ // Index a Vec with a Chisel literal.
+ val chiselLit = 0.U
+ val vecSubaccessChiselLit = vec(chiselLit)
+
+ // Index a Vec with a node.
+ val node = IO(Input(UInt(2.W)))
+ val vecSubaccessNode = vec(node)
+
+ // Put an otherwise un-targetable Vec subaccess into a temp.
+ val vecSubaccessTmp = WireInit(vecSubaccessNode)
+ }
+
+ val expectedError = "You cannot target Vec subaccess:"
+
+ def conversionSucceeds(data: InstanceId) = {
+ describe(".toTarget") {
+ it("should convert successfully") {
+ data.toTarget
+ }
+ }
+
+ describe(".toNamed") {
+ it("should convert successfully") {
+ data.toNamed
+ }
+ }
+ }
+
+ def conversionFails(data: InstanceId) = {
+ describe(".toTarget") {
+ it("should fail to convert with a useful error message") {
+ (the[ChiselException] thrownBy extractCause[ChiselException] {
+ data.toTarget
+ }).getMessage should include(expectedError)
+ }
+ }
+
+ describe(".toNamed") {
+ it("should fail to convert with a useful error message") {
+ (the[ChiselException] thrownBy extractCause[ChiselException] {
+ data.toNamed
+ }).getMessage should include(expectedError)
+ }
+ }
+ }
+}
+
+class VecToTargetSpec extends ChiselFunSpec with VecToTargetSpecUtils {
+ describe("Vec subaccess") {
+ var foo: Foo = null
+ ChiselStage.elaborate { foo = new Foo; foo }
+
+ describe("with a Scala literal") {
+ (it should behave).like(conversionSucceeds(foo.vecSubaccessScalaLit))
+ }
+
+ describe("with a Chisel literal") {
+ (it should behave).like(conversionFails(foo.vecSubaccessChiselLit))
+ }
+
+ describe("with a Node") {
+ (it should behave).like(conversionFails(foo.vecSubaccessNode))
+ }
+
+ describe("with an un-targetable construct that is assigned to a temporary") {
+ (it should behave).like(conversionSucceeds(foo.vecSubaccessTmp))
+ }
+ }
+}
diff --git a/src/test/scala/chiselTests/WarningSpec.scala b/src/test/scala/chiselTests/WarningSpec.scala
index 1cef1ffc..1bb9e6dc 100644
--- a/src/test/scala/chiselTests/WarningSpec.scala
+++ b/src/test/scala/chiselTests/WarningSpec.scala
@@ -5,8 +5,6 @@ package chiselTests
import chisel3._
import chisel3.util._
import chisel3.stage.ChiselStage
-import chisel3.experimental.ChiselEnum
-import chisel3.experimental.EnumType
class WarningSpec extends ChiselFlatSpec with Utils {
behavior.of("Warnings")
diff --git a/src/test/scala/chiselTests/experimental/TraceSpec.scala b/src/test/scala/chiselTests/experimental/TraceSpec.scala
index 31ccdf9b..1d67ba0b 100644
--- a/src/test/scala/chiselTests/experimental/TraceSpec.scala
+++ b/src/test/scala/chiselTests/experimental/TraceSpec.scala
@@ -3,7 +3,6 @@
package chiselTests
import chisel3._
-import chisel3.experimental.ChiselEnum
import chisel3.experimental.Trace._
import chisel3.stage.{ChiselGeneratorAnnotation, ChiselStage, DesignAnnotation}
import chisel3.util.experimental.InlineInstance
diff --git a/src/test/scala/chiselTests/util/experimental/TruthTableSpec.scala b/src/test/scala/chiselTests/util/experimental/TruthTableSpec.scala
index 9b2dd600..b5dcee6b 100644
--- a/src/test/scala/chiselTests/util/experimental/TruthTableSpec.scala
+++ b/src/test/scala/chiselTests/util/experimental/TruthTableSpec.scala
@@ -35,7 +35,9 @@ class TruthTableSpec extends AnyFlatSpec {
assert(table.toString contains " 0")
}
"TruthTable" should "deserialize" in {
- assert(TruthTable.fromString(str) == table)
+ val table2 = TruthTable.fromString(str)
+ assert(table2 === table)
+ assert(table2.hashCode === table.hashCode)
}
"TruthTable" should "merge same key" in {
assert(
diff --git a/src/test/scala/cookbook/FSM.scala b/src/test/scala/cookbook/FSM.scala
index 66f3063f..40f8abc7 100644
--- a/src/test/scala/cookbook/FSM.scala
+++ b/src/test/scala/cookbook/FSM.scala
@@ -4,11 +4,10 @@ package cookbook
import chisel3._
import chisel3.util._
-import chisel3.experimental.ChiselEnum
/* ### How do I create a finite state machine?
*
- * Use Chisel StrongEnum to construct the states and switch & is to construct the FSM
+ * Use ChiselEnum to construct the states and switch & is to construct the FSM
* control logic
*/