diff options
| author | Schuyler Eldridge | 2020-02-06 10:35:36 -0500 |
|---|---|---|
| committer | GitHub | 2020-02-06 10:35:36 -0500 |
| commit | 39f8563c5e3e737610f46a82f6ceaa52120ef654 (patch) | |
| tree | 8112fc8fe606962ebe55d2f0d4a3bbcf0fd81ecc | |
| parent | bf0ea92752cfb3db1797b8ffc8ff0c776552b1cf (diff) | |
| parent | 7e3a4240f0ddc24d8effac515b7449df588277da (diff) | |
Merge pull request #1362 from freechipsproject/andr-reduction-base-case
Change zero-width base case for Andr
| -rw-r--r-- | spec/spec.pdf | bin | 274485 -> 275421 bytes | |||
| -rw-r--r-- | spec/spec.tex | 2 | ||||
| -rw-r--r-- | src/main/scala/firrtl/passes/ZeroWidth.scala | 1 | ||||
| -rw-r--r-- | src/test/scala/firrtlTests/ZeroWidthTests.scala | 15 |
4 files changed, 18 insertions, 0 deletions
diff --git a/spec/spec.pdf b/spec/spec.pdf Binary files differindex 8b7fd125..e49441ad 100644 --- a/spec/spec.pdf +++ b/spec/spec.pdf diff --git a/spec/spec.tex b/spec/spec.tex index 68a404a8..a8a40da4 100644 --- a/spec/spec.tex +++ b/spec/spec.tex @@ -1533,6 +1533,8 @@ andr,orr,xorr & (e) & () & (UInt) & UInt & 1\\ The bitwise reduction operations correspond to a bitwise and, or, and exclusive or operation, reduced over every bit in \vv{e}. +In all cases, the reduction incorporates as an inductive base case the ``identity value'' associated with each operator. This is defined as the value that preserves the value of the other argument: one for \vv{and} (as $x \wedge 1 = x$), zero for \vv{or} (as $x \vee 0 = x$), and zero for \vv{xor} (as $x \oplus 0 = x$). Note that the logical consequence is that the and-reduction of a zero-width expression returns a one, while the or- and xor-reductions of a zero-width expression both return zero. + \subsection{Concatenate Operation} \begin{figure}[H] diff --git a/src/main/scala/firrtl/passes/ZeroWidth.scala b/src/main/scala/firrtl/passes/ZeroWidth.scala index 83fc1b6b..e01cfffc 100644 --- a/src/main/scala/firrtl/passes/ZeroWidth.scala +++ b/src/main/scala/firrtl/passes/ZeroWidth.scala @@ -114,6 +114,7 @@ object ZeroWidth extends Transform { case Seq(x) => x case seq => DoPrim(Cat, seq, consts, tpe) map onExp } + case DoPrim(Andr, Seq(x), _, _) if (bitWidth(x.tpe) == 0) => UIntLiteral(1) // nothing false case other => other.tpe match { case UIntType(IntWidth(ZERO)) => UIntLiteral(ZERO, IntWidth(BigInt(1))) case SIntType(IntWidth(ZERO)) => SIntLiteral(ZERO, IntWidth(BigInt(1))) diff --git a/src/test/scala/firrtlTests/ZeroWidthTests.scala b/src/test/scala/firrtlTests/ZeroWidthTests.scala index f1dadcee..96d03d08 100644 --- a/src/test/scala/firrtlTests/ZeroWidthTests.scala +++ b/src/test/scala/firrtlTests/ZeroWidthTests.scala @@ -212,6 +212,21 @@ class ZeroWidthTests extends FirrtlFlatSpec { | printf(clk, UInt(1), "%d %d %d\n", x, UInt(0), z)""".stripMargin (parse(exec(input)).serialize) should be (parse(check).serialize) } + + "Andr of zero-width expression" should "return true" in { + val input = + """circuit Top : + | module Top : + | input y : UInt<0> + | output x : UInt<1> + | x <= andr(y)""".stripMargin + val check = + """circuit Top : + | module Top : + | output x : UInt<1> + | x <= UInt<1>(1)""".stripMargin + (parse(exec(input))) should be (parse(check)) + } } class ZeroWidthVerilog extends FirrtlFlatSpec { |
