aboutsummaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
authorAdam Izraelevitz2017-12-22 19:34:39 -0500
committerJack Koenig2017-12-22 16:34:39 -0800
commit69cf8f1a084e477284d8ae48a4a7abc499e92991 (patch)
tree6480ac7420dfc1019cafe154ac397466dda3c4db /src/main
parent19abcb04ad005a21319354550e87bfd428ec5597 (diff)
API change: out-of-bounds vec accesses now invalid, not first element (#685)
[skip formal checks] Generate nicer name for remove accesses
Diffstat (limited to 'src/main')
-rw-r--r--src/main/scala/firrtl/LoweringCompilers.scala1
-rw-r--r--src/main/scala/firrtl/Namespace.scala3
-rw-r--r--src/main/scala/firrtl/Utils.scala28
-rw-r--r--src/main/scala/firrtl/passes/RemoveAccesses.scala11
4 files changed, 38 insertions, 5 deletions
diff --git a/src/main/scala/firrtl/LoweringCompilers.scala b/src/main/scala/firrtl/LoweringCompilers.scala
index f032868a..57aa1533 100644
--- a/src/main/scala/firrtl/LoweringCompilers.scala
+++ b/src/main/scala/firrtl/LoweringCompilers.scala
@@ -59,6 +59,7 @@ class HighFirrtlToMiddleFirrtl extends CoreTransform {
passes.ReplaceAccesses,
passes.ExpandConnects,
passes.RemoveAccesses,
+ passes.Uniquify,
passes.ExpandWhens,
passes.CheckInitialization,
passes.ResolveKinds,
diff --git a/src/main/scala/firrtl/Namespace.scala b/src/main/scala/firrtl/Namespace.scala
index cf8472a6..9e1cae67 100644
--- a/src/main/scala/firrtl/Namespace.scala
+++ b/src/main/scala/firrtl/Namespace.scala
@@ -40,6 +40,9 @@ class Namespace private {
}
}
+/* TODO(azidar): Make Namespace return unique names that will not conflict with expanded
+ * names after LowerTypes expands names (like the Uniquify pass).
+ */
object Namespace {
// Initializes a namespace from a Module
def apply(m: DefModule): Namespace = {
diff --git a/src/main/scala/firrtl/Utils.scala b/src/main/scala/firrtl/Utils.scala
index c9659644..76f58f30 100644
--- a/src/main/scala/firrtl/Utils.scala
+++ b/src/main/scala/firrtl/Utils.scala
@@ -130,6 +130,7 @@ class FIRRTLException(val str: String) extends Exception(str)
object Utils extends LazyLogging {
def throwInternalError =
error("Internal Error! Please file an issue at https://github.com/ucb-bar/firrtl/issues")
+
private[firrtl] def time[R](block: => R): (Double, R) = {
val t0 = System.nanoTime()
val result = block
@@ -139,7 +140,7 @@ object Utils extends LazyLogging {
}
/** Removes all [[firrtl.ir.EmptyStmt]] statements and condenses
- * [[firrtl.ir.Block]] statements.
+ * [[firrtl.ir.Block]] statements.
*/
def squashEmpty(s: Statement): Statement = s map squashEmpty match {
case Block(stmts) =>
@@ -152,6 +153,31 @@ object Utils extends LazyLogging {
case sx => sx
}
+ /** Provide a nice name to create a temporary **/
+ def niceName(e: Expression): String = niceName(1)(e)
+ def niceName(depth: Int)(e: Expression): String = {
+ e match {
+ case WRef(name, _, _, _) if name(0) == '_' => name
+ case WRef(name, _, _, _) => "_" + name
+ case WSubAccess(expr, index, _, _) if depth <= 0 => niceName(depth)(expr)
+ case WSubAccess(expr, index, _, _) => niceName(depth)(expr) + niceName(depth - 1)(index)
+ case WSubField(expr, field, _, _) => niceName(depth)(expr) + "_" + field
+ case WSubIndex(expr, index, _, _) => niceName(depth)(expr) + "_" + index
+ case Reference(name, _) if name(0) == '_' => name
+ case Reference(name, _) => "_" + name
+ case SubAccess(expr, index, _) if depth <= 0 => niceName(depth)(expr)
+ case SubAccess(expr, index, _) => niceName(depth)(expr) + niceName(depth - 1)(index)
+ case SubField(expr, field, _) => niceName(depth)(expr) + "_" + field
+ case SubIndex(expr, index, _) => niceName(depth)(expr) + "_" + index
+ case DoPrim(op, args, consts, _) if depth <= 0 => "_" + op
+ case DoPrim(op, args, consts, _) => "_" + op + (args.map(niceName(depth - 1)) ++ consts.map("_" + _)).mkString("")
+ case Mux(cond, tval, fval, _) if depth <= 0 => "_mux"
+ case Mux(cond, tval, fval, _) => "_mux" + Seq(cond, tval, fval).map(niceName(depth - 1)).mkString("")
+ case UIntLiteral(value, _) => "_" + value
+ case SIntLiteral(value, _) => "_" + value
+ }
+ }
+
/** Indent the results of [[ir.FirrtlNode.serialize]] */
def indent(str: String) = str replaceAllLiterally ("\n", "\n ")
diff --git a/src/main/scala/firrtl/passes/RemoveAccesses.scala b/src/main/scala/firrtl/passes/RemoveAccesses.scala
index 253e6a15..37b92a9e 100644
--- a/src/main/scala/firrtl/passes/RemoveAccesses.scala
+++ b/src/main/scala/firrtl/passes/RemoveAccesses.scala
@@ -15,10 +15,12 @@ import scala.collection.mutable
*/
object RemoveAccesses extends Pass {
private def AND(e1: Expression, e2: Expression) =
- DoPrim(And, Seq(e1, e2), Nil, BoolType)
+ if(e1 == one) e2
+ else if(e2 == one) e1
+ else DoPrim(And, Seq(e1, e2), Nil, BoolType)
private def EQV(e1: Expression, e2: Expression): Expression =
- DoPrim(Eq, Seq(e1, e2), Nil, e1.tpe)
+ DoPrim(Eq, Seq(e1, e2), Nil, BoolType)
/** Container for a base expression and its corresponding guard
*/
@@ -82,7 +84,7 @@ object RemoveAccesses extends Pass {
val namespace = Namespace(m)
def onStmt(s: Statement): Statement = {
def create_temp(e: Expression): (Statement, Expression) = {
- val n = namespace.newTemp
+ val n = namespace.newName(niceName(e))
(DefWire(get_info(s), n, e.tpe), WRef(n, e.tpe, kind(e), gender(e)))
}
@@ -101,7 +103,8 @@ object RemoveAccesses extends Pass {
stmts += wire
rs.zipWithIndex foreach {
case (x, i) if i < temps.size =>
- stmts += Connect(get_info(s),getTemp(i),x.base)
+ stmts += IsInvalid(get_info(s),getTemp(i))
+ stmts += Conditionally(get_info(s),x.guard,Connect(get_info(s),getTemp(i),x.base),EmptyStmt)
case (x, i) =>
stmts += Conditionally(get_info(s),x.guard,Connect(get_info(s),getTemp(i),x.base),EmptyStmt)
}