aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main/scala/firrtl/passes/Passes.scala6
-rw-r--r--src/test/scala/firrtlTests/FeatureSpec.scala2
-rw-r--r--test/features/NestedSubAccessTester.fir27
3 files changed, 33 insertions, 2 deletions
diff --git a/src/main/scala/firrtl/passes/Passes.scala b/src/main/scala/firrtl/passes/Passes.scala
index ef9380d3..777498d6 100644
--- a/src/main/scala/firrtl/passes/Passes.scala
+++ b/src/main/scala/firrtl/passes/Passes.scala
@@ -870,7 +870,11 @@ object RemoveAccesses extends Pass {
case (e:ValidIf) => e map (remove_e)
case (e:SIntValue) => e
case (e:UIntValue) => e
- case e => {
+ case x => {
+ val e = x match {
+ case (w:WSubAccess) => WSubAccess(w.exp,remove_e(w.index),w.tpe,w.gender)
+ case _ => x
+ }
if (has_access(e)) {
val rs = get_locations(e)
val foo = rs.find(x => {x.guard != one})
diff --git a/src/test/scala/firrtlTests/FeatureSpec.scala b/src/test/scala/firrtlTests/FeatureSpec.scala
index 33cd473f..9545dedf 100644
--- a/src/test/scala/firrtlTests/FeatureSpec.scala
+++ b/src/test/scala/firrtlTests/FeatureSpec.scala
@@ -6,7 +6,7 @@ import org.scalatest._
// Miscellaneous Feature Checks
class FeatureSpec extends FirrtlPropSpec {
- property("Nested SubAcceses should be supported!") {
+ property("Nested SubAccesses should be supported!") {
runFirrtlTest("NestedSubAccessTester", "/features")
}
}
diff --git a/test/features/NestedSubAccessTester.fir b/test/features/NestedSubAccessTester.fir
new file mode 100644
index 00000000..36465012
--- /dev/null
+++ b/test/features/NestedSubAccessTester.fir
@@ -0,0 +1,27 @@
+circuit NestedSubAccessTester :
+ module NestedSubAccess :
+ input foo : UInt<1>[4]
+ input index : UInt<2>
+ output out : UInt<4>
+
+ wire vec : UInt<4>[2]
+ vec[0] <= UInt(3)
+ vec[1] <= UInt(4)
+
+ out <= vec[foo[index]]
+
+ module NestedSubAccessTester :
+ input clk : Clock
+ input reset : UInt<1>
+
+ inst dut of NestedSubAccess
+
+ dut.foo is invalid
+ dut.index <= UInt(2)
+ dut.foo[2] <= UInt(1)
+
+ when neq(dut.out, UInt(4)) :
+ printf(clk, not(reset), "Assertion failed\nTest Failed!\n")
+ stop(clk, not(reset), 1)
+ else :
+ stop(clk, not(reset), 0)