diff options
| author | Albert Magyar | 2020-04-07 15:04:17 -0700 |
|---|---|---|
| committer | GitHub | 2020-04-07 22:04:17 +0000 |
| commit | 1a03e6356e451136d522d5a9acba374dd8972b24 (patch) | |
| tree | 24e568872cb6db4ac9ce87080d1e06a4001a3017 /src/test/scala/firrtlTests/ZeroLengthVecsSpec.scala | |
| parent | a9034bac8df5672b04a53c0ad99d82f94465d678 (diff) | |
Fix dynamic SubAccess of zero-length vectors (#1450)
* Fix dynamic SubAccess of zero-length vectors
* Fixes #230
* Add new ZeroLengthVecs pass that occurs before RemoveAccesses
* Include this in stage.Forms.MidForm
* Add to High->Mid order in compiler test based on @seldridge feedback
* Use validif to produce out-of-bounds value in ZeroLengthVecs
* Update scaladoc
* Fix test imports
Diffstat (limited to 'src/test/scala/firrtlTests/ZeroLengthVecsSpec.scala')
| -rw-r--r-- | src/test/scala/firrtlTests/ZeroLengthVecsSpec.scala | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/src/test/scala/firrtlTests/ZeroLengthVecsSpec.scala b/src/test/scala/firrtlTests/ZeroLengthVecsSpec.scala new file mode 100644 index 00000000..715714dd --- /dev/null +++ b/src/test/scala/firrtlTests/ZeroLengthVecsSpec.scala @@ -0,0 +1,68 @@ +// See LICENSE for license details. + +package firrtlTests + +import firrtl._ +import firrtl.passes._ +import firrtl.testutils.FirrtlFlatSpec + +class ZeroLengthVecsSpec extends FirrtlFlatSpec { + val transforms = Seq( + ToWorkingIR, + ResolveKinds, + InferTypes, + ResolveFlows, + new InferWidths, + ZeroLengthVecs, + CheckTypes) + protected def exec(input: String) = { + transforms.foldLeft(CircuitState(parse(input), UnknownForm)) { + (c: CircuitState, t: Transform) => t.runTransform(c) + }.circuit.serialize + } + + "ZeroLengthVecs" should "drop subaccesses to zero-length vectors" in { + val input = + """circuit bar : + | module bar : + | input i : { a : UInt<8>, b : UInt<4> }[0] + | input sel : UInt<1> + | output foo : UInt<1>[0] + | output o : UInt<8> + | foo[UInt<1>(0)] <= UInt<1>(0) + | o <= i[sel].a + |""".stripMargin + val check = + """circuit bar : + | module bar : + | input i : { a : UInt<8>, b : UInt<4> }[0] + | input sel : UInt<1> + | output foo : UInt<1>[0] + | output o : UInt<8> + | skip + | o <= validif(UInt<1>(0), UInt<8>(0)) + |""".stripMargin + (parse(exec(input))) should be (parse(check)) + } + + "ZeroLengthVecs" should "handle intervals correctly" in { + val input = + """circuit bar : + | module bar : + | input i : Interval[3,4].0[0] + | input sel : UInt<1> + | output o : Interval[3,4].0 + | o <= i[sel] + |""".stripMargin + val check = + """circuit bar : + | module bar : + | input i : Interval[3,4].0[0] + | input sel : UInt<1> + | output o : Interval[3,4].0 + | o <= validif(UInt<1>(0), clip(asInterval(SInt<1>(0), 0, 0, 0), i[sel])) + |""".stripMargin + (parse(exec(input))) should be (parse(check)) + } + +} |
