aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlbert Magyar2017-09-30 17:08:38 -0700
committerJack Koenig2017-09-30 17:08:38 -0700
commit1b8bd0a8d3a0706c3f4d77aef16817163c1e8bfd (patch)
treec63b57853d9ea4ed8a2b5e64d2db610d345597f3 /src
parent64e2b93ad6e8c8ecb7d0502f77ae7fc31ad7d79b (diff)
Make ReplaceAccesses optimize multi-dimensional accesses (#665)
Diffstat (limited to 'src')
-rw-r--r--src/main/scala/firrtl/passes/ReplaceAccesses.scala2
-rw-r--r--src/test/scala/firrtlTests/ReplaceAccessesSpec.scala47
2 files changed, 48 insertions, 1 deletions
diff --git a/src/main/scala/firrtl/passes/ReplaceAccesses.scala b/src/main/scala/firrtl/passes/ReplaceAccesses.scala
index c3a5bd4c..a63d731e 100644
--- a/src/main/scala/firrtl/passes/ReplaceAccesses.scala
+++ b/src/main/scala/firrtl/passes/ReplaceAccesses.scala
@@ -18,7 +18,7 @@ object ReplaceAccesses extends Pass {
def run(c: Circuit): Circuit = {
def onStmt(s: Statement): Statement = s map onStmt map onExp
def onExp(e: Expression): Expression = e match {
- case WSubAccess(ex, UIntLiteral(value, width), t, g) => WSubIndex(ex, value.toInt, t, g)
+ case WSubAccess(ex, UIntLiteral(value, width), t, g) => WSubIndex(onExp(ex), value.toInt, t, g)
case _ => e map onExp
}
diff --git a/src/test/scala/firrtlTests/ReplaceAccessesSpec.scala b/src/test/scala/firrtlTests/ReplaceAccessesSpec.scala
new file mode 100644
index 00000000..e507e947
--- /dev/null
+++ b/src/test/scala/firrtlTests/ReplaceAccessesSpec.scala
@@ -0,0 +1,47 @@
+// See LICENSE for license details.
+
+package firrtlTests
+
+import firrtl._
+import firrtl.ir.Circuit
+import firrtl.Parser.IgnoreInfo
+import firrtl.passes._
+import firrtl.transforms._
+
+class ReplaceAccessesSpec extends FirrtlFlatSpec {
+ val transforms = Seq(
+ ToWorkingIR,
+ ResolveKinds,
+ InferTypes,
+ ResolveGenders,
+ InferWidths,
+ ReplaceAccesses)
+ protected def exec(input: String) = {
+ transforms.foldLeft(CircuitState(parse(input), UnknownForm)) {
+ (c: CircuitState, t: Transform) => t.runTransform(c)
+ }.circuit.serialize
+ }
+}
+
+class ReplaceAccessesMultiDim extends ReplaceAccessesSpec {
+ "ReplacesAccesses" should "replace constant accesses with fixed indices" in {
+ val input =
+ """circuit Top :
+ module Top :
+ input clock : Clock
+ output out : UInt<1>
+ reg r_vec : UInt<1>[4][2], clock
+ out <= r_vec[UInt<2>(2)][UInt<1>(1)]
+"""
+ val check =
+ """circuit Top :
+ module Top :
+ input clock : Clock
+ output out : UInt<1>
+ reg r_vec : UInt<1>[4][2], clock with :
+ reset => (UInt<1>(0), r_vec)
+ out <= r_vec[2][1]
+"""
+ (parse(exec(input))) should be (parse(check))
+ }
+}