aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorazidar2016-08-19 16:58:34 -0700
committerDonggyu Kim2016-09-07 10:58:08 -0700
commit6255d5e398ae21dbc75db907bb9a9b24bc09d2b3 (patch)
treecfff6e46fad44cc0c20eb079863b2a0d6d4aa993 /src
parent25b4a97b5fcc2b043f2c611f63c2497b8584cf55 (diff)
Added ReplaceSubAccesses before RemoveSubAccesses
Diffstat (limited to 'src')
-rw-r--r--src/main/scala/firrtl/LoweringCompilers.scala1
-rw-r--r--src/main/scala/firrtl/passes/ReplaceSubAccess.scala32
2 files changed, 33 insertions, 0 deletions
diff --git a/src/main/scala/firrtl/LoweringCompilers.scala b/src/main/scala/firrtl/LoweringCompilers.scala
index f9a5864c..c8430d2b 100644
--- a/src/main/scala/firrtl/LoweringCompilers.scala
+++ b/src/main/scala/firrtl/LoweringCompilers.scala
@@ -104,6 +104,7 @@ class ResolveAndCheck () extends Transform with SimpleRun {
class HighFirrtlToMiddleFirrtl () extends Transform with SimpleRun {
val passSeq = Seq(
passes.PullMuxes,
+ passes.ReplaceAccesses,
passes.ExpandConnects,
passes.RemoveAccesses,
passes.ExpandWhens,
diff --git a/src/main/scala/firrtl/passes/ReplaceSubAccess.scala b/src/main/scala/firrtl/passes/ReplaceSubAccess.scala
new file mode 100644
index 00000000..8e911a96
--- /dev/null
+++ b/src/main/scala/firrtl/passes/ReplaceSubAccess.scala
@@ -0,0 +1,32 @@
+package firrtl.passes
+
+import firrtl.ir._
+import firrtl.{WRef, WSubAccess, WSubIndex, WSubField}
+import firrtl.Mappers._
+import firrtl.Utils._
+import firrtl.WrappedExpression._
+import firrtl.Namespace
+import scala.collection.mutable
+
+
+/** Replaces constant [[firrtl.WSubAccess]] with [[firrtl.WSubIndex]]
+ * TODO Fold in to High Firrtl Const Prop
+ */
+object ReplaceAccesses extends Pass {
+ def name = "Replace Accesses"
+
+ def run(c: Circuit): Circuit = {
+ def onStmt(s: Statement): Statement = s map onStmt map onExp
+ def onExp(e: Expression): Expression = e match {
+ case WSubAccess(e, UIntLiteral(value, width), t, g) => WSubIndex(e, value.toInt, t, g)
+ case e => e map onExp
+ }
+
+ val newModules = c.modules map {
+ case m: ExtModule => m
+ case Module(i, n, ps, b) => Module(i, n, ps, onStmt(b))
+ }
+
+ Circuit(c.info, newModules, c.main)
+ }
+}