From 1b8bd0a8d3a0706c3f4d77aef16817163c1e8bfd Mon Sep 17 00:00:00 2001 From: Albert Magyar Date: Sat, 30 Sep 2017 17:08:38 -0700 Subject: Make ReplaceAccesses optimize multi-dimensional accesses (#665) --- src/main/scala/firrtl/passes/ReplaceAccesses.scala | 2 +- .../scala/firrtlTests/ReplaceAccessesSpec.scala | 47 ++++++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 src/test/scala/firrtlTests/ReplaceAccessesSpec.scala (limited to 'src') 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)) + } +} -- cgit v1.2.3