summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/src/main/scala/chisel3/Aggregate.scala2
-rw-r--r--core/src/main/scala/chisel3/Data.scala2
-rw-r--r--core/src/main/scala/chisel3/experimental/ChiselEnum.scala (renamed from core/src/main/scala/chisel3/StrongEnum.scala)16
-rw-r--r--core/src/main/scala/chisel3/experimental/package.scala1
-rw-r--r--core/src/main/scala/chisel3/internal/Builder.scala52
-rw-r--r--core/src/main/scala/chisel3/internal/MonoConnect.scala2
-rw-r--r--core/src/main/scala/chisel3/package.scala4
-rw-r--r--docs/src/cookbooks/cookbook.md5
-rw-r--r--docs/src/cookbooks/verilog-vs-chisel.md1
-rw-r--r--docs/src/explanations/chisel-enum.md2
-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
23 files changed, 184 insertions, 59 deletions
diff --git a/core/src/main/scala/chisel3/Aggregate.scala b/core/src/main/scala/chisel3/Aggregate.scala
index b6836ea7..dbf6969f 100644
--- a/core/src/main/scala/chisel3/Aggregate.scala
+++ b/core/src/main/scala/chisel3/Aggregate.scala
@@ -8,7 +8,7 @@ import chisel3.experimental.dataview.{isView, reifySingleData, InvalidViewExcept
import scala.collection.immutable.{SeqMap, VectorMap}
import scala.collection.mutable.{HashSet, LinkedHashMap}
import scala.language.experimental.macros
-import chisel3.experimental.{BaseModule, BundleLiteralException, ChiselEnum, EnumType, OpaqueType, VecLiteralException}
+import chisel3.experimental.{BaseModule, BundleLiteralException, OpaqueType, VecLiteralException}
import chisel3.internal._
import chisel3.internal.Builder.pushCommand
import chisel3.internal.firrtl._
diff --git a/core/src/main/scala/chisel3/Data.scala b/core/src/main/scala/chisel3/Data.scala
index dddc0d5d..259e6545 100644
--- a/core/src/main/scala/chisel3/Data.scala
+++ b/core/src/main/scala/chisel3/Data.scala
@@ -5,7 +5,7 @@ package chisel3
import chisel3.experimental.dataview.reify
import scala.language.experimental.macros
-import chisel3.experimental.{Analog, BaseModule, DataMirror, EnumType, FixedPoint, Interval}
+import chisel3.experimental.{Analog, BaseModule, DataMirror, FixedPoint, Interval}
import chisel3.internal.Builder.pushCommand
import chisel3.internal._
import chisel3.internal.firrtl._
diff --git a/core/src/main/scala/chisel3/StrongEnum.scala b/core/src/main/scala/chisel3/experimental/ChiselEnum.scala
index 3c9f4105..37c6fb58 100644
--- a/core/src/main/scala/chisel3/StrongEnum.scala
+++ b/core/src/main/scala/chisel3/experimental/ChiselEnum.scala
@@ -69,9 +69,11 @@ object EnumAnnotations {
override def toFirrtl: Annotation = EnumDefAnnotation(typeName, definition)
}
}
+
import EnumAnnotations._
-abstract class EnumType(private[chisel3] val factory: EnumFactory, selfAnnotating: Boolean = true) extends Element {
+@deprecated("This type has moved to chisel3", "Chisel 3.5")
+abstract class EnumType(private[chisel3] val factory: ChiselEnum, selfAnnotating: Boolean = true) extends Element {
// Use getSimpleName instead of enumTypeName because for debugging purposes
// the fully qualified name isn't necessary (compared to for the
@@ -240,11 +242,13 @@ abstract class EnumType(private[chisel3] val factory: EnumFactory, selfAnnotatin
case None => EnumComponentChiselAnnotation(this, enumTypeName)
}
- if (!Builder.annotations.contains(anno)) {
+ if (!Builder.enumAnnos.contains(anno)) {
+ Builder.enumAnnos += anno
annotate(anno)
}
- if (!Builder.annotations.contains(factory.globalAnnotation)) {
+ if (!Builder.enumAnnos.contains(factory.globalAnnotation)) {
+ Builder.enumAnnos += factory.globalAnnotation
annotate(factory.globalAnnotation)
}
}
@@ -275,6 +279,7 @@ abstract class EnumType(private[chisel3] val factory: EnumFactory, selfAnnotatin
}
}
+@deprecated("This type has been moved and renamed to chisel3.ChiselEnum", "Chisel 3.5")
abstract class EnumFactory {
class Type extends EnumType(this)
object Type {
@@ -431,11 +436,11 @@ private[chisel3] object EnumMacros {
private[chisel3] class UnsafeEnum(override val width: Width) extends EnumType(UnsafeEnum, selfAnnotating = false) {
override def cloneType: this.type = new UnsafeEnum(width).asInstanceOf[this.type]
}
-private object UnsafeEnum extends EnumFactory
+private object UnsafeEnum extends ChiselEnum
/** Suppress enum cast warnings
*
- * Users should use [[EnumFactory.safe <EnumType>.safe]] when possible.
+ * Users should use [[ChiselEnum.safe <EnumType>.safe]] when possible.
*
* This is primarily used for casting from [[UInt]] to a Bundle type that contains an Enum.
* {{{
@@ -450,6 +455,7 @@ private object UnsafeEnum extends EnumFactory
* }
* }}}
*/
+@deprecated("This type has moved to chisel3", "Chisel 3.5")
object suppressEnumCastWarning {
def apply[T](block: => T): T = {
val parentWarn = Builder.suppressEnumCastWarning
diff --git a/core/src/main/scala/chisel3/experimental/package.scala b/core/src/main/scala/chisel3/experimental/package.scala
index 42ec9666..2b493aab 100644
--- a/core/src/main/scala/chisel3/experimental/package.scala
+++ b/core/src/main/scala/chisel3/experimental/package.scala
@@ -22,6 +22,7 @@ package object experimental {
implicit def fromDoubleToDoubleParam(x: Double): DoubleParam = DoubleParam(x)
implicit def fromStringToStringParam(x: String): StringParam = StringParam(x)
+ @deprecated("This type has moved to chisel3", "Chisel 3.5")
type ChiselEnum = EnumFactory
// Rocket Chip-style clonemodule
diff --git a/core/src/main/scala/chisel3/internal/Builder.scala b/core/src/main/scala/chisel3/internal/Builder.scala
index d06b7992..ab1435c5 100644
--- a/core/src/main/scala/chisel3/internal/Builder.scala
+++ b/core/src/main/scala/chisel3/internal/Builder.scala
@@ -299,25 +299,31 @@ private[chisel3] trait HasId extends InstanceId {
// Builder.deprecated mechanism, we have to create our own one off ErrorLog and print the
// warning right away.
// It's especially bad because --warnings-as-errors does not work with these warnings
- val nameGuess = _computeName(None) match {
- case Some(name) => s": '$name'"
- case None => ""
- }
- val parentGuess = _parent match {
- case Some(ViewParent) => s", in module '${reifyParent.pathName}'"
- case Some(p) => s", in module '${p.pathName}'"
- case None => ""
- }
val errors = new ErrorLog(false)
val logger = new _root_.logger.Logger(this.getClass.getName)
val msg =
- "Accessing the .instanceName or .toTarget of non-hardware Data is deprecated" + nameGuess + parentGuess + ". " +
+ "Accessing the .instanceName or .toTarget of non-hardware Data is deprecated" + _errorContext + ". " +
"This will become an error in Chisel 3.6."
errors.deprecated(msg, None)
errors.checkpoint(logger)
_computeName(None).get
}
+ private[chisel3] def _errorContext: String = {
+ val nameGuess: String = _computeName(None) match {
+ case Some(name) => s": '$name'"
+ case None => ""
+ }
+
+ val parentGuess: String = _parent match {
+ case Some(ViewParent) => s", in module '${reifyParent.pathName}'"
+ case Some(p) => s", in module '${p.pathName}'"
+ case None => ""
+ }
+
+ nameGuess + parentGuess
+ }
+
// Helper for reifying views if they map to a single Target
private[chisel3] def reifyTarget: Option[Data] = this match {
case d: Data => reifySingleData(d) // Only Data can be views
@@ -393,13 +399,16 @@ private[chisel3] trait NamedComponent extends HasId {
/** Returns a FIRRTL ComponentName that references this object
* @note Should not be called until circuit elaboration is complete
*/
- final def toNamed: ComponentName =
+ final def toNamed: ComponentName = {
+ assertValidTarget()
ComponentName(this.instanceName, ModuleName(this.parentModName, CircuitName(this.circuitName)))
+ }
/** Returns a FIRRTL ReferenceTarget that references this object
* @note Should not be called until circuit elaboration is complete
*/
final def toTarget: ReferenceTarget = {
+ assertValidTarget()
val name = this.instanceName
if (!validComponentName(name)) throwException(s"Illegal component name: $name (note: literals are illegal)")
import _root_.firrtl.annotations.{Target, TargetToken}
@@ -423,6 +432,21 @@ private[chisel3] trait NamedComponent extends HasId {
case None => localTarget
}
}
+
+ private def assertValidTarget(): Unit = {
+ val isVecSubaccess = getOptionRef.map {
+ case Index(_, _: ULit) => true // Vec literal indexing
+ case Index(_, _: Node) => true // Vec dynamic indexing
+ case _ => false
+ }.getOrElse(false)
+
+ if (isVecSubaccess) {
+ throwException(
+ s"You cannot target Vec subaccess" + _errorContext +
+ ". Instead, assign it to a temporary (for example, with WireInit) and target the temporary."
+ )
+ }
+ }
}
// Mutable global state for chisel that can appear outside a Builder context
@@ -485,6 +509,10 @@ private[chisel3] class DynamicContext(
val newAnnotations = ArrayBuffer[ChiselMultiAnnotation]()
var currentModule: Option[BaseModule] = None
+ // Enum annotations are added every time a ChiselEnum is bound
+ // To keep the number down, we keep them unique in the annotations
+ val enumAnnos = mutable.HashSet[ChiselAnnotation]()
+
/** Contains a mapping from a elaborated module to their aspect
* Set by [[ModuleAspect]]
*/
@@ -553,6 +581,8 @@ private[chisel3] object Builder extends LazyLogging {
def components: ArrayBuffer[Component] = dynamicContext.components
def annotations: ArrayBuffer[ChiselAnnotation] = dynamicContext.annotations
+ def enumAnnos: mutable.HashSet[ChiselAnnotation] = dynamicContext.enumAnnos
+
// TODO : Unify this with annotations in the future - done this way for backward compatability
def newAnnotations: ArrayBuffer[ChiselMultiAnnotation] = dynamicContext.newAnnotations
diff --git a/core/src/main/scala/chisel3/internal/MonoConnect.scala b/core/src/main/scala/chisel3/internal/MonoConnect.scala
index 4e762a7c..a0cca4a6 100644
--- a/core/src/main/scala/chisel3/internal/MonoConnect.scala
+++ b/core/src/main/scala/chisel3/internal/MonoConnect.scala
@@ -3,7 +3,7 @@
package chisel3.internal
import chisel3._
-import chisel3.experimental.{Analog, BaseModule, EnumType, FixedPoint, Interval, UnsafeEnum}
+import chisel3.experimental.{Analog, BaseModule, FixedPoint, Interval, UnsafeEnum}
import chisel3.internal.Builder.pushCommand
import chisel3.internal.firrtl.{Connect, Converter, DefInvalid}
import chisel3.experimental.dataview.{isView, reify, reifyToAggregate}
diff --git a/core/src/main/scala/chisel3/package.scala b/core/src/main/scala/chisel3/package.scala
index 87024683..afffad1c 100644
--- a/core/src/main/scala/chisel3/package.scala
+++ b/core/src/main/scala/chisel3/package.scala
@@ -14,6 +14,10 @@ package object chisel3 {
import scala.language.implicitConversions
+ type ChiselEnum = experimental.ChiselEnum
+ type EnumType = experimental.EnumType
+ val suppressEnumCastWarning = experimental.suppressEnumCastWarning
+
/**
* These implicit classes allow one to convert [[scala.Int]] or [[scala.BigInt]] to
* Chisel.UInt|Chisel.SInt by calling .asUInt|.asSInt on them, respectively.
diff --git a/docs/src/cookbooks/cookbook.md b/docs/src/cookbooks/cookbook.md
index e7485e66..5b8239a7 100644
--- a/docs/src/cookbooks/cookbook.md
+++ b/docs/src/cookbooks/cookbook.md
@@ -445,13 +445,12 @@ getVerilogString(new Top(new UsingCloneTypeBundle(UInt(8.W))))
### How do I create a finite state machine (FSM)?
-The advised way is to use [`ChiselEnum`](https://www.chisel-lang.org/api/latest/chisel3/experimental/index.html#ChiselEnum=chisel3.experimental.EnumFactory) to construct enumerated types representing the state of the FSM.
-State transitions are then handled with [`switch`](https://www.chisel-lang.org/api/latest/chisel3/util/switch$.html)/[`is`](https://www.chisel-lang.org/api/latest/chisel3/util/is$.html) and [`when`](https://www.chisel-lang.org/api/latest/chisel3/when$.html)/[`.elsewhen`](https://www.chisel-lang.org/api/latest/chisel3/WhenContext.html#elsewhen(elseCond:=%3Echisel3.Bool)(block:=%3EUnit)(implicitsourceInfo:chisel3.internal.sourceinfo.SourceInfo,implicitcompileOptions:chisel3.CompileOptions):chisel3.WhenContext)/[`.otherwise`](https://www.chisel-lang.org/api/latest/chisel3/WhenContext.html#otherwise(block:=%3EUnit)(implicitsourceInfo:chisel3.internal.sourceinfo.SourceInfo,implicitcompileOptions:chisel3.CompileOptions):Unit).
+The advised way is to use `ChiselEnum` to construct enumerated types representing the state of the FSM.
+State transitions are then handled with `switch`/`is` and `when`/`.elsewhen`/`.otherwise`.
```scala mdoc:silent:reset
import chisel3._
import chisel3.util.{switch, is}
-import chisel3.experimental.ChiselEnum
object DetectTwoOnes {
object State extends ChiselEnum {
diff --git a/docs/src/cookbooks/verilog-vs-chisel.md b/docs/src/cookbooks/verilog-vs-chisel.md
index 1adf609e..75cc0ec8 100644
--- a/docs/src/cookbooks/verilog-vs-chisel.md
+++ b/docs/src/cookbooks/verilog-vs-chisel.md
@@ -15,7 +15,6 @@ This page serves as a quick introduction to Chisel for those familiar with Veril
import chisel3._
import chisel3.util.{switch, is}
import chisel3.stage.ChiselStage
-import chisel3.experimental.ChiselEnum
import chisel3.util.{Cat, Fill, DecoupledIO}
```
diff --git a/docs/src/explanations/chisel-enum.md b/docs/src/explanations/chisel-enum.md
index 16b5570d..b76fd746 100644
--- a/docs/src/explanations/chisel-enum.md
+++ b/docs/src/explanations/chisel-enum.md
@@ -16,8 +16,6 @@ In contrast with `Chisel.util.Enum`, `ChiselEnum` are subclasses of `Data`, whic
import chisel3._
import chisel3.util._
import chisel3.stage.ChiselStage
-import chisel3.experimental.ChiselEnum
-import chisel3.experimental.suppressEnumCastWarning
```
```scala mdoc:invisible
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
*/