aboutsummaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
authorJiuyang Liu2020-12-02 01:53:04 +0000
committerGitHub2020-12-02 01:53:04 +0000
commit6c5ce834e26386100b196881f6e487aed26c9c0a (patch)
treef2b9225dc42fd04ea7e7c8fb4d80bd2071b68966 /src/main
parent4e46f8c614b81143621f2b4187392f6912d882bf (diff)
Fix subaccess (#1984)
* add test for RemoveAccessesSpec. * fix nested SubAccess bug. Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Diffstat (limited to 'src/main')
-rw-r--r--src/main/scala/firrtl/passes/RemoveAccesses.scala35
1 files changed, 22 insertions, 13 deletions
diff --git a/src/main/scala/firrtl/passes/RemoveAccesses.scala b/src/main/scala/firrtl/passes/RemoveAccesses.scala
index f49af935..90437e56 100644
--- a/src/main/scala/firrtl/passes/RemoveAccesses.scala
+++ b/src/main/scala/firrtl/passes/RemoveAccesses.scala
@@ -47,8 +47,7 @@ object RemoveAccesses extends Pass {
* Seq(Location(a[0], UIntLiteral(0)), Location(a[1], UIntLiteral(1)))
*/
private def getLocations(e: Expression): Seq[Location] = e match {
- case e: WRef => create_exps(e).map(Location(_, one))
- case e: WSubIndex =>
+ case e: SubIndex =>
val ls = getLocations(e.expr)
val start = get_point(e)
val end = start + get_size(e.tpe)
@@ -57,7 +56,7 @@ object RemoveAccesses extends Pass {
(l, i) <- ls.zipWithIndex
if ((i % stride) >= start) & ((i % stride) < end)
) yield l
- case e: WSubField =>
+ case e: SubField =>
val ls = getLocations(e.expr)
val start = get_point(e)
val end = start + get_size(e.tpe)
@@ -66,17 +65,27 @@ object RemoveAccesses extends Pass {
(l, i) <- ls.zipWithIndex
if ((i % stride) >= start) & ((i % stride) < end)
) yield l
- case e: WSubAccess =>
- val ls = getLocations(e.expr)
- val stride = get_size(e.tpe)
- val wrap = e.expr.tpe.asInstanceOf[VectorType].size
- ls.zipWithIndex.map {
- case (l, i) =>
- val c = (i / stride) % wrap
- val basex = l.base
- val guardx = AND(l.guard, EQV(UIntLiteral(c), e.index))
- Location(basex, guardx)
+ case SubAccess(expr, index, tpe, _) =>
+ getLocations(expr).zipWithIndex.flatMap {
+ case (Location(exprBase, exprGuard), exprIndex) =>
+ getLocations(index).map {
+ case Location(indexBase, indexGuard) =>
+ Location(
+ exprBase,
+ AND(
+ AND(
+ indexGuard,
+ exprGuard
+ ),
+ EQV(
+ UIntLiteral((exprIndex / get_size(tpe)) % expr.tpe.asInstanceOf[VectorType].size),
+ indexBase
+ )
+ )
+ )
+ }
}
+ case e => create_exps(e).map(Location(_, one))
}
/** Returns true if e contains a [[firrtl.WSubAccess]]