summaryrefslogtreecommitdiff
path: root/src/main/scala/chisel3/util
diff options
context:
space:
mode:
authorRichard Lin2016-11-23 16:01:50 -0800
committerGitHub2016-11-23 16:01:50 -0800
commitedb19a0559686a471141c74438f677c1e217a298 (patch)
tree8745e2a31ab2e91f42c00999a68057916721bcdc /src/main/scala/chisel3/util
parent08b4f68db403d6925fba8c9e943216ef8f38d69e (diff)
Simplify Enum API (#385)
Get rid of some cruft exposed in #373 This also allows Bits.fromtInt(...) to be removed. Yay! All old APIs (with some new restrictions, rocket still works fine) are preserved without deprecation in Chisel._, aside from the non-compile-time-checkable Map[] enum constructor which probably should have been deprecated during chisel2. The Map[] enums have been removed from chisel3._ without deprecation. The new restriction is that nodeType (legacy API) may only be of UInt type with unspecified width. Note that Bits() creates a UInt, and if you can't control the enum values, it makes little sense to specify a bitwidth.
Diffstat (limited to 'src/main/scala/chisel3/util')
-rw-r--r--src/main/scala/chisel3/util/Enum.scala41
1 files changed, 14 insertions, 27 deletions
diff --git a/src/main/scala/chisel3/util/Enum.scala b/src/main/scala/chisel3/util/Enum.scala
index 55b595ee..45aee62a 100644
--- a/src/main/scala/chisel3/util/Enum.scala
+++ b/src/main/scala/chisel3/util/Enum.scala
@@ -7,15 +7,15 @@ package chisel3.util
import chisel3._
-object Enum {
+trait Enum {
/** Returns a sequence of Bits subtypes with values from 0 until n. Helper method. */
- private def createValues[T <: Bits](nodeType: T, n: Int): Seq[T] =
- (0 until n).map(x => nodeType.fromInt(x, log2Up(n)))
+ protected def createValues(n: Int): Seq[UInt] =
+ (0 until n).map(_.U(log2Up(n).W))
- /** Returns n unique values of the specified type. Can be used with unpacking to define enums.
+ /** Returns n unique UInt values, use with unpacking to specify an enumeration.
*
* @example {{{
- * val state_on :: state_off :: Nil = Enum(UInt(), 2)
+ * val state_on :: state_off :: Nil = Enum(2)
* val current_state = UInt()
* switch (current_state) {
* is (state_on) {
@@ -26,28 +26,15 @@ object Enum {
* }
* }
* }}}
- *
*/
- def apply[T <: Bits](nodeType: T, n: Int): List[T] = createValues(nodeType, n).toList
-
- /** Returns a map of the input symbols to unique values of the specified type.
- *
- * @example {{{
- * val states = Enum(UInt(), 'on, 'off)
- * val current_state = UInt()
- * switch (current_state) {
- * is (states('on)) {
- * ...
- * }
- * if (states('off)) {
- * ..
- * }
- * }
- * }}}
- */
- def apply[T <: Bits](nodeType: T, l: Symbol *): Map[Symbol, T] = (l zip createValues(nodeType, l.length)).toMap
+ def apply(n: Int): List[UInt] = createValues(n).toList
+}
- /** Returns a map of the input symbols to unique values of the specified type.
- */
- def apply[T <: Bits](nodeType: T, l: List[Symbol]): Map[Symbol, T] = (l zip createValues(nodeType, l.length)).toMap
+object Enum extends Enum {
+ @deprecated("use Enum(n)", "chisel3, will be removed soon")
+ def apply[T <: Bits](nodeType: T, n: Int): List[T] = {
+ require(nodeType.isInstanceOf[UInt], "Only UInt supported for enums")
+ require(!nodeType.widthKnown, "Bit width may no longer be specified for enums")
+ apply(n).asInstanceOf[List[T]]
+ }
}