diff options
| author | Albert Magyar | 2017-09-30 17:08:38 -0700 |
|---|---|---|
| committer | Jack Koenig | 2017-09-30 17:08:38 -0700 |
| commit | 1b8bd0a8d3a0706c3f4d77aef16817163c1e8bfd (patch) | |
| tree | c63b57853d9ea4ed8a2b5e64d2db610d345597f3 /src | |
| parent | 64e2b93ad6e8c8ecb7d0502f77ae7fc31ad7d79b (diff) | |
Make ReplaceAccesses optimize multi-dimensional accesses (#665)
Diffstat (limited to 'src')
| -rw-r--r-- | src/main/scala/firrtl/passes/ReplaceAccesses.scala | 2 | ||||
| -rw-r--r-- | src/test/scala/firrtlTests/ReplaceAccessesSpec.scala | 47 |
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)) + } +} |
