summaryrefslogtreecommitdiff
path: root/chiselFrontend/src
diff options
context:
space:
mode:
Diffstat (limited to 'chiselFrontend/src')
-rw-r--r--chiselFrontend/src/main/scala/chisel3/core/Aggregate.scala16
-rw-r--r--chiselFrontend/src/main/scala/chisel3/core/Bits.scala33
-rw-r--r--chiselFrontend/src/main/scala/chisel3/core/Data.scala4
-rw-r--r--chiselFrontend/src/main/scala/chisel3/core/Mem.scala2
-rw-r--r--chiselFrontend/src/main/scala/chisel3/core/UserModule.scala6
-rw-r--r--chiselFrontend/src/main/scala/chisel3/internal/Error.scala95
6 files changed, 101 insertions, 55 deletions
diff --git a/chiselFrontend/src/main/scala/chisel3/core/Aggregate.scala b/chiselFrontend/src/main/scala/chisel3/core/Aggregate.scala
index 14011cd9..e45f6d72 100644
--- a/chiselFrontend/src/main/scala/chisel3/core/Aggregate.scala
+++ b/chiselFrontend/src/main/scala/chisel3/core/Aggregate.scala
@@ -231,14 +231,6 @@ sealed class Vec[T <: Data] private[core] (gen: => T, val length: Int)
*/
def apply(idx: Int): T = self(idx)
- @deprecated("Use Vec.apply instead", "chisel3")
- def read(idx: UInt)(implicit compileOptions: CompileOptions): T = do_apply(idx)(compileOptions)
-
- @deprecated("Use Vec.apply instead", "chisel3")
- def write(idx: UInt, data: T)(implicit compileOptions: CompileOptions): Unit = {
- do_apply(idx)(compileOptions).:=(data)(DeprecatedSourceInfo, compileOptions)
- }
-
override def cloneType: this.type = {
new Vec(gen.cloneType, length).asInstanceOf[this.type]
}
@@ -341,11 +333,15 @@ trait VecLike[T <: Data] extends collection.IndexedSeq[T] with HasId {
override def hashCode: Int = super[HasId].hashCode
override def equals(that: Any): Boolean = super[HasId].equals(that)
+ @chiselRuntimeDeprecated
@deprecated("Use Vec.apply instead", "chisel3")
- def read(idx: UInt)(implicit compileOptions: CompileOptions): T
+ def read(idx: UInt)(implicit compileOptions: CompileOptions): T = do_apply(idx)(compileOptions)
+ @chiselRuntimeDeprecated
@deprecated("Use Vec.apply instead", "chisel3")
- def write(idx: UInt, data: T)(implicit compileOptions: CompileOptions): Unit
+ def write(idx: UInt, data: T)(implicit compileOptions: CompileOptions): Unit = {
+ do_apply(idx)(compileOptions).:=(data)(DeprecatedSourceInfo, compileOptions)
+ }
/** Outputs true if p outputs true for every element.
*/
diff --git a/chiselFrontend/src/main/scala/chisel3/core/Bits.scala b/chiselFrontend/src/main/scala/chisel3/core/Bits.scala
index 61617775..51f5f5ec 100644
--- a/chiselFrontend/src/main/scala/chisel3/core/Bits.scala
+++ b/chiselFrontend/src/main/scala/chisel3/core/Bits.scala
@@ -277,15 +277,26 @@ sealed abstract class Bits(width: Width, override val litArg: Option[LitArg])
}
/** Reinterpret cast to Bits. */
+ @chiselRuntimeDeprecated
@deprecated("Use asUInt, which does the same thing but returns a more concrete type", "chisel3")
- final def asBits(): Bits = macro SourceInfoTransform.noArg
-
- def do_asBits(implicit sourceInfo: SourceInfo, compileOptions: CompileOptions): Bits = asUInt()
+ final def asBits(implicit compileOptions: CompileOptions): Bits = {
+ implicit val sourceInfo = DeprecatedSourceInfo
+ do_asUInt
+ }
+ @chiselRuntimeDeprecated
@deprecated("Use asSInt, which makes the reinterpret cast more explicit", "chisel3")
- final def toSInt(implicit compileOptions: CompileOptions): SInt = do_asSInt(DeprecatedSourceInfo, compileOptions)
+ final def toSInt(implicit compileOptions: CompileOptions): SInt = {
+ implicit val sourceInfo = DeprecatedSourceInfo
+ do_asSInt
+ }
+
+ @chiselRuntimeDeprecated
@deprecated("Use asUInt, which makes the reinterpret cast more explicit", "chisel3")
- final def toUInt(implicit compileOptions: CompileOptions): UInt = do_asUInt(DeprecatedSourceInfo, compileOptions)
+ final def toUInt(implicit compileOptions: CompileOptions): UInt = {
+ implicit val sourceInfo = DeprecatedSourceInfo
+ do_asUInt
+ }
final def do_toBool(implicit sourceInfo: SourceInfo, compileOptions: CompileOptions): Bool = {
width match {
@@ -477,7 +488,7 @@ sealed class UInt private[core] (width: Width, lit: Option[ULit] = None)
final def andR(): Bool = macro SourceInfoTransform.noArg
final def xorR(): Bool = macro SourceInfoTransform.noArg
- def do_orR(implicit sourceInfo: SourceInfo, compileOptions: CompileOptions): Bool = this != 0.U
+ def do_orR(implicit sourceInfo: SourceInfo, compileOptions: CompileOptions): Bool = this =/= 0.U
def do_andR(implicit sourceInfo: SourceInfo, compileOptions: CompileOptions): Bool = ~this === 0.U
def do_xorR(implicit sourceInfo: SourceInfo, compileOptions: CompileOptions): Bool = redop(sourceInfo, XorReduceOp)
@@ -486,12 +497,12 @@ sealed class UInt private[core] (width: Width, lit: Option[ULit] = None)
override def do_<= (that: UInt)(implicit sourceInfo: SourceInfo, compileOptions: CompileOptions): Bool = compop(sourceInfo, LessEqOp, that)
override def do_>= (that: UInt)(implicit sourceInfo: SourceInfo, compileOptions: CompileOptions): Bool = compop(sourceInfo, GreaterEqOp, that)
+ @chiselRuntimeDeprecated
@deprecated("Use '=/=', which avoids potential precedence problems", "chisel3")
- final def != (that: UInt): Bool = macro SourceInfoTransform.thatArg
+ final def != (that: UInt)(implicit sourceInfo: SourceInfo, compileOptions: CompileOptions): Bool = this =/= that
final def =/= (that: UInt): Bool = macro SourceInfoTransform.thatArg
final def === (that: UInt): Bool = macro SourceInfoTransform.thatArg
- def do_!= (that: UInt)(implicit sourceInfo: SourceInfo, compileOptions: CompileOptions): Bool = compop(sourceInfo, NotEqualOp, that)
def do_=/= (that: UInt)(implicit sourceInfo: SourceInfo, compileOptions: CompileOptions): Bool = compop(sourceInfo, NotEqualOp, that)
def do_=== (that: UInt)(implicit sourceInfo: SourceInfo, compileOptions: CompileOptions): Bool = compop(sourceInfo, EqualOp, that)
@@ -652,12 +663,12 @@ sealed class SInt private[core] (width: Width, lit: Option[SLit] = None)
override def do_<= (that: SInt)(implicit sourceInfo: SourceInfo, compileOptions: CompileOptions): Bool = compop(sourceInfo, LessEqOp, that)
override def do_>= (that: SInt)(implicit sourceInfo: SourceInfo, compileOptions: CompileOptions): Bool = compop(sourceInfo, GreaterEqOp, that)
+ @chiselRuntimeDeprecated
@deprecated("Use '=/=', which avoids potential precedence problems", "chisel3")
- final def != (that: SInt): Bool = macro SourceInfoTransform.thatArg
+ final def != (that: SInt)(implicit sourceInfo: SourceInfo, compileOptions: CompileOptions): Bool = this =/= that
final def =/= (that: SInt): Bool = macro SourceInfoTransform.thatArg
final def === (that: SInt): Bool = macro SourceInfoTransform.thatArg
- def do_!= (that: SInt)(implicit sourceInfo: SourceInfo, compileOptions: CompileOptions): Bool = compop(sourceInfo, NotEqualOp, that)
def do_=/= (that: SInt)(implicit sourceInfo: SourceInfo, compileOptions: CompileOptions): Bool = compop(sourceInfo, NotEqualOp, that)
def do_=== (that: SInt)(implicit sourceInfo: SourceInfo, compileOptions: CompileOptions): Bool = compop(sourceInfo, EqualOp, that)
@@ -979,6 +990,7 @@ object FixedPoint {
def apply(): FixedPoint = apply(Width(), BinaryPoint())
/** Create an FixedPoint type or port with fixed width. */
+ @chiselRuntimeDeprecated
@deprecated("Use FixedPoint(width: Width, binaryPoint: BinaryPoint) example FixedPoint(16.W, 8.BP)", "chisel3")
def apply(width: Int, binaryPoint: Int): FixedPoint = apply(Width(width), BinaryPoint(binaryPoint))
@@ -1010,6 +1022,7 @@ object FixedPoint {
/** Create an FixedPoint literal with inferred width from Double.
* Use PrivateObject to force users to specify width and binaryPoint by name
*/
+ @chiselRuntimeDeprecated
@deprecated("use fromDouble(value: Double, width: Width, binaryPoint: BinaryPoint)", "chisel3")
def fromDouble(value: Double, dummy: PrivateType = PrivateObject,
width: Int = -1, binaryPoint: Int = 0): FixedPoint = {
diff --git a/chiselFrontend/src/main/scala/chisel3/core/Data.scala b/chiselFrontend/src/main/scala/chisel3/core/Data.scala
index 1cf50e9f..40781490 100644
--- a/chiselFrontend/src/main/scala/chisel3/core/Data.scala
+++ b/chiselFrontend/src/main/scala/chisel3/core/Data.scala
@@ -70,8 +70,9 @@ object ActualDirection {
case class Bidirectional(dir: BidirectionalDirection) extends ActualDirection
}
-@deprecated("debug doesn't do anything in Chisel3 as no pruning happens in the frontend", "chisel3")
object debug { // scalastyle:ignore object.name
+ @chiselRuntimeDeprecated
+ @deprecated("debug doesn't do anything in Chisel3 as no pruning happens in the frontend", "chisel3")
def apply (arg: Data): Data = arg
}
@@ -379,6 +380,7 @@ abstract class Data extends HasId {
*
* This performs the inverse operation of fromBits(Bits).
*/
+ @chiselRuntimeDeprecated
@deprecated("Best alternative, .asUInt()", "chisel3")
def toBits(implicit compileOptions: CompileOptions): UInt = do_asUInt(DeprecatedSourceInfo, compileOptions)
diff --git a/chiselFrontend/src/main/scala/chisel3/core/Mem.scala b/chiselFrontend/src/main/scala/chisel3/core/Mem.scala
index 2c8e1a1e..c9208030 100644
--- a/chiselFrontend/src/main/scala/chisel3/core/Mem.scala
+++ b/chiselFrontend/src/main/scala/chisel3/core/Mem.scala
@@ -10,6 +10,7 @@ import chisel3.internal.firrtl._
import chisel3.internal.sourceinfo.{SourceInfo, SourceInfoTransform, UnlocatableSourceInfo, MemTransform}
object Mem {
+ @chiselRuntimeDeprecated
@deprecated("Mem argument order should be size, t; this will be removed by the official release", "chisel3")
def apply[T <: Data](t: T, size: Int)(implicit compileOptions: CompileOptions): Mem[T] = do_apply(size, t)(UnlocatableSourceInfo, compileOptions)
@@ -118,6 +119,7 @@ sealed abstract class MemBase[T <: Data](t: T, val length: Int) extends HasId {
sealed class Mem[T <: Data](t: T, length: Int) extends MemBase(t, length)
object SyncReadMem {
+ @chiselRuntimeDeprecated
@deprecated("SeqMem/SyncReadMem argument order should be size, t; this will be removed by the official release", "chisel3")
def apply[T <: Data](t: T, size: Int)(implicit sourceInfo: SourceInfo, compileOptions: CompileOptions): SyncReadMem[T] = do_apply(size, t)
diff --git a/chiselFrontend/src/main/scala/chisel3/core/UserModule.scala b/chiselFrontend/src/main/scala/chisel3/core/UserModule.scala
index 9c923037..1411fa80 100644
--- a/chiselFrontend/src/main/scala/chisel3/core/UserModule.scala
+++ b/chiselFrontend/src/main/scala/chisel3/core/UserModule.scala
@@ -131,6 +131,7 @@ abstract class LegacyModule(implicit moduleCompileOptions: CompileOptions)
// _clock and _reset can be clock and reset in these 2ary constructors
// once chisel2 compatibility issues are resolved
+ @chiselRuntimeDeprecated
@deprecated("Module constructor with override_clock and override_reset deprecated, use withClockAndReset", "chisel3")
def this(override_clock: Option[Clock]=None, override_reset: Option[Bool]=None)
(implicit moduleCompileOptions: CompileOptions) = {
@@ -139,10 +140,15 @@ abstract class LegacyModule(implicit moduleCompileOptions: CompileOptions)
this.override_reset = override_reset
}
+ @chiselRuntimeDeprecated
@deprecated("Module constructor with override _clock deprecated, use withClock", "chisel3")
def this(_clock: Clock)(implicit moduleCompileOptions: CompileOptions) = this(Option(_clock), None)(moduleCompileOptions)
+
+ @chiselRuntimeDeprecated
@deprecated("Module constructor with override _reset deprecated, use withReset", "chisel3")
def this(_reset: Bool)(implicit moduleCompileOptions: CompileOptions) = this(None, Option(_reset))(moduleCompileOptions)
+
+ @chiselRuntimeDeprecated
@deprecated("Module constructor with override _clock, _reset deprecated, use withClockAndReset", "chisel3")
def this(_clock: Clock, _reset: Bool)(implicit moduleCompileOptions: CompileOptions) = this(Option(_clock), Option(_reset))(moduleCompileOptions)
diff --git a/chiselFrontend/src/main/scala/chisel3/internal/Error.scala b/chiselFrontend/src/main/scala/chisel3/internal/Error.scala
index 25a3ec2a..6e7e4002 100644
--- a/chiselFrontend/src/main/scala/chisel3/internal/Error.scala
+++ b/chiselFrontend/src/main/scala/chisel3/internal/Error.scala
@@ -2,7 +2,7 @@
package chisel3.internal
-import scala.collection.mutable.ArrayBuffer
+import scala.collection.mutable.{ArrayBuffer, LinkedHashMap}
import chisel3.core._
@@ -15,8 +15,6 @@ private[chisel3] object throwException {
/** Records and reports runtime errors and warnings. */
private[chisel3] class ErrorLog {
- def hasErrors: Boolean = errors.exists(_.isFatal)
-
/** Log an error message */
def error(m: => String): Unit =
errors += new Error(m, getUserLineNumber)
@@ -25,50 +23,83 @@ private[chisel3] class ErrorLog {
def warning(m: => String): Unit =
errors += new Warning(m, getUserLineNumber)
- /** Log a deprecation warning message */
- def deprecated(m: => String): Unit =
- errors += new DeprecationWarning(m, getUserLineNumber)
-
/** Emit an informational message */
def info(m: String): Unit =
println(new Info("[%2.3f] %s".format(elapsedTime/1e3, m), None)) // scalastyle:ignore regex
- /** Prints error messages generated by Chisel at runtime. */
- def report(): Unit = errors foreach println // scalastyle:ignore regex
+ /** Log a deprecation warning message */
+ def deprecated(m: => String): Unit = {
+ val thisEntry = (m, getUserLineNumber)
+ deprecations += ((thisEntry, deprecations.getOrElse(thisEntry, 0) + 1))
+ }
/** Throw an exception if any errors have yet occurred. */
def checkpoint(): Unit = {
- if(hasErrors) {
- import Console._
- throwException(errors.map(_ + "\n").reduce(_ + _) +
- UNDERLINED + "CODE HAS " + errors.filter(_.isFatal).length + RESET +
- UNDERLINED + " " + RED + "ERRORS" + RESET +
- UNDERLINED + " and " + errors.filterNot(_.isFatal).length + RESET +
- UNDERLINED + " " + YELLOW + "WARNINGS" + RESET)
+ val depTag = s"[${Console.BLUE}deprecated${Console.RESET}]"
+ val warnTag = s"[${Console.YELLOW}warn${Console.RESET}]"
+ val errTag = s"[${Console.RED}error${Console.RESET}]"
+ deprecations foreach { case ((message, stackElement), count) =>
+ val line = stackElement match {
+ case Some(stackElement) => s"$depTag ${stackElement.getFileName}:${stackElement.getLineNumber} ($count calls): $message"
+ case None => s"$depTag (unknown location) ($count calls): $message"
+ }
+ println(line)
+ }
+ errors foreach println
+
+ if (!deprecations.isEmpty) {
+ println(s"$warnTag ${Console.YELLOW}There were ${deprecations.size} deprecated function(s) used." +
+ s" These may stop compiling in a future release, you are encouraged to fix these issues.${Console.RESET}")
+ println(s"$warnTag Line numbers for deprecations reported by Chisel may be inaccurate, enable scalac compiler deprecation warnings by either:")
+ println(s"$warnTag In the sbt interactive console, enter:")
+ println(s"""$warnTag set scalacOptions in ThisBuild ++= Seq("-unchecked", "-deprecation")""")
+ println(s"$warnTag or, in your build.sbt, add the line:")
+ println(s"""$warnTag scalacOptions := Seq("-unchecked", "-deprecation")""")
+ }
+
+ val allErrors = errors.filter(_.isFatal)
+ val allWarnings = errors.filter(!_.isFatal)
+
+ if (!allWarnings.isEmpty && !allErrors.isEmpty) {
+ println(s"$errTag There were ${Console.RED}${allErrors.size} error(s)${Console.RESET} and ${Console.YELLOW}${allWarnings.size} warning(s)${Console.RESET} during hardware elaboration.")
+ } else if (!allWarnings.isEmpty) {
+ println(s"$warnTag There were ${Console.YELLOW}${allWarnings.size} warning(s)${Console.RESET} during hardware elaboration.")
+ } else if (!allErrors.isEmpty) {
+ println(s"$errTag There were ${Console.RED}${allErrors.size} error(s)${Console.RESET} during hardware elaboration.")
+ }
+
+ if (!allErrors.isEmpty) {
+ throwException("Fatal errors during hardware elaboration")
} else {
- // No fatal errors. Report accumulated warnings and clear them.
- report()
+ // No fatal errors, clear accumulated warnings since they've been reported
errors.clear()
}
}
- private def findFirstUserFrame(stack: Array[StackTraceElement]): Option[StackTraceElement] = {
- def isUserCode(ste: StackTraceElement): Boolean = {
- def isUserModule(c: Class[_]): Boolean =
- c != null && (c == classOf[UserModule] || isUserModule(c.getSuperclass))
- isUserModule(Class.forName(ste.getClassName))
+ /** Returns the best guess at the first stack frame that belongs to user code.
+ */
+ private def getUserLineNumber = {
+ def isChiselClassname(className: String): Boolean = {
+ // List of classpath prefixes that are Chisel internals and should be ignored when looking for user code
+ // utils are not part of internals and errors there can be reported
+ val chiselPrefixes = Set(
+ "java.",
+ "scala.",
+ "chisel3.internal.",
+ "chisel3.core.",
+ "chisel3.package$" // for some compatibility / deprecated types
+ )
+ !chiselPrefixes.filter(className.startsWith(_)).isEmpty
}
- stack.indexWhere(isUserCode) match {
- case x if x < 0 => None
- case x => Some(stack(x))
- }
+ Thread.currentThread().getStackTrace.toList.dropWhile(
+ // Get rid of everything in Chisel core
+ ste => isChiselClassname(ste.getClassName)
+ ).headOption
}
- private def getUserLineNumber =
- findFirstUserFrame(Thread.currentThread().getStackTrace)
-
private val errors = ArrayBuffer[LogEntry]()
+ private val deprecations = LinkedHashMap[(String, Option[StackTraceElement]), Int]()
private val startTime = System.currentTimeMillis
private def elapsedTime: Long = System.currentTimeMillis - startTime
@@ -96,10 +127,6 @@ private class Warning(msg: => String, line: Option[StackTraceElement]) extends L
def format: String = tag("warn", Console.YELLOW)
}
-private class DeprecationWarning(msg: => String, line: Option[StackTraceElement]) extends LogEntry(msg, line) {
- def format: String = tag("warn", Console.CYAN)
-}
-
private class Info(msg: => String, line: Option[StackTraceElement]) extends LogEntry(msg, line) {
def format: String = tag("info", Console.MAGENTA)
}