From ed69bdea87f7f60cc6b3bac7b6cdd7b6bc787f1d Mon Sep 17 00:00:00 2001 From: Henry Cook Date: Thu, 13 Aug 2015 15:46:14 -0700 Subject: fun with ## --- src/main/scala/Chisel/Core.scala | 8 +--- src/test/scala/chiselTests/BitsOps.scala | 72 ----------------------------- src/test/scala/chiselTests/BitwiseOps.scala | 72 +++++++++++++++++++++++++++++ 3 files changed, 74 insertions(+), 78 deletions(-) delete mode 100644 src/test/scala/chiselTests/BitsOps.scala create mode 100644 src/test/scala/chiselTests/BitwiseOps.scala (limited to 'src') diff --git a/src/main/scala/Chisel/Core.scala b/src/main/scala/Chisel/Core.scala index 34bb41ee..178eed0f 100644 --- a/src/main/scala/Chisel/Core.scala +++ b/src/main/scala/Chisel/Core.scala @@ -90,11 +90,7 @@ abstract class Data(dirArg: Direction) extends HasId { } wire.asInstanceOf[this.type] } - def toBits(): UInt = { - val elts = this.flatten.reverse - Cat(elts.head, elts.tail:_*) - } - + def toBits: UInt = this.flatten.reverse.reduce(_##_) def toPort: Port = Port(this, toType) } @@ -393,6 +389,7 @@ sealed abstract class Bits(dirArg: Direction, width: Width, override val litArg: case _ => throwException(s"can't covert UInt<$width> to Bool") } + def ## (other: Bits): UInt = Cat(this, other) override def toBits = asUInt override def fromBits(n: Bits): this.type = { val res = Wire(this).asInstanceOf[this.type] @@ -449,7 +446,6 @@ sealed class UInt(dir: Direction, width: Width, lit: Option[ULit] = None) extend def & (other: UInt): UInt = binop(UInt(this.width max other.width), BitAndOp, other) def | (other: UInt): UInt = binop(UInt(this.width max other.width), BitOrOp, other) def ^ (other: UInt): UInt = binop(UInt(this.width max other.width), BitXorOp, other) - def ## (other: UInt): UInt = Cat(this, other) def orR = this != UInt(0) def andR = ~this === UInt(0) diff --git a/src/test/scala/chiselTests/BitsOps.scala b/src/test/scala/chiselTests/BitsOps.scala deleted file mode 100644 index 7cd695e6..00000000 --- a/src/test/scala/chiselTests/BitsOps.scala +++ /dev/null @@ -1,72 +0,0 @@ -/* - Copyright (c) 2011-2015 The Regents of the University of - California (Regents). All Rights Reserved. Redistribution and use in - source and binary forms, with or without modification, are permitted - provided that the following conditions are met: - - * Redistributions of source code must retain the above - copyright notice, this list of conditions and the following - two paragraphs of disclaimer. - * Redistributions in binary form must reproduce the above - copyright notice, this list of conditions and the following - two paragraphs of disclaimer in the documentation and/or other materials - provided with the distribution. - * Neither the name of the Regents nor the names of its contributors - may be used to endorse or promote products derived from this - software without specific prior written permission. - - IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, - SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, - ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF - REGENTS HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT - LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - A PARTICULAR PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF - ANY, PROVIDED HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION - TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR - MODIFICATIONS. -*/ - -package chiselTests - -import Chisel._ -import org.scalatest._ -import org.scalatest.prop._ -import Chisel.testers.BasicTester - -class BitwiseOps(w: Int) extends Module { - val io = new Bundle { - val a = Bits(INPUT, w) - val b = Bits(INPUT, w) - val not = Bits(OUTPUT, w) - val and = Bits(OUTPUT, w) - val or = Bits(OUTPUT, w) - val xor = Bits(OUTPUT, w) - } - io.not := ~io.a - io.and := io.a & io.b - io.or := io.a | io.b - io.xor := io.a ^ io.b -} - -class BitwiseOpsSpec extends ChiselSpec { - - class BitwiseOpsTester(w: Int, a: Int, b: Int) extends BasicTester { - val mask = (1 << w)-1; - val dut = Module(new BitwiseOps(w)) - io.done := Bool(true) - dut.io.a := UInt(a) - dut.io.b := UInt(b) - when(dut.io.not != UInt(mask & ~a)) { io.error := UInt(1) } - when(dut.io.and != UInt(mask & (a & b))) { io.error := UInt(2) } - when(dut.io.or != UInt(mask & (a | b))) { io.error := UInt(3) } - when(dut.io.xor != UInt(mask & (a ^ b))) { io.error := UInt(4) } - } - - "BitwiseOps" should "return the correct result" in { - forAll(safeUInts, safeUInts) { (a: Int, b: Int) => - assert(execute{ new BitwiseOpsTester(32, a, b) }) - } - } -} diff --git a/src/test/scala/chiselTests/BitwiseOps.scala b/src/test/scala/chiselTests/BitwiseOps.scala new file mode 100644 index 00000000..7cd695e6 --- /dev/null +++ b/src/test/scala/chiselTests/BitwiseOps.scala @@ -0,0 +1,72 @@ +/* + Copyright (c) 2011-2015 The Regents of the University of + California (Regents). All Rights Reserved. Redistribution and use in + source and binary forms, with or without modification, are permitted + provided that the following conditions are met: + + * Redistributions of source code must retain the above + copyright notice, this list of conditions and the following + two paragraphs of disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + two paragraphs of disclaimer in the documentation and/or other materials + provided with the distribution. + * Neither the name of the Regents nor the names of its contributors + may be used to endorse or promote products derived from this + software without specific prior written permission. + + IN NO EVENT SHALL REGENTS BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, + SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, + ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF + REGENTS HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + REGENTS SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE. THE SOFTWARE AND ACCOMPANYING DOCUMENTATION, IF + ANY, PROVIDED HEREUNDER IS PROVIDED "AS IS". REGENTS HAS NO OBLIGATION + TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR + MODIFICATIONS. +*/ + +package chiselTests + +import Chisel._ +import org.scalatest._ +import org.scalatest.prop._ +import Chisel.testers.BasicTester + +class BitwiseOps(w: Int) extends Module { + val io = new Bundle { + val a = Bits(INPUT, w) + val b = Bits(INPUT, w) + val not = Bits(OUTPUT, w) + val and = Bits(OUTPUT, w) + val or = Bits(OUTPUT, w) + val xor = Bits(OUTPUT, w) + } + io.not := ~io.a + io.and := io.a & io.b + io.or := io.a | io.b + io.xor := io.a ^ io.b +} + +class BitwiseOpsSpec extends ChiselSpec { + + class BitwiseOpsTester(w: Int, a: Int, b: Int) extends BasicTester { + val mask = (1 << w)-1; + val dut = Module(new BitwiseOps(w)) + io.done := Bool(true) + dut.io.a := UInt(a) + dut.io.b := UInt(b) + when(dut.io.not != UInt(mask & ~a)) { io.error := UInt(1) } + when(dut.io.and != UInt(mask & (a & b))) { io.error := UInt(2) } + when(dut.io.or != UInt(mask & (a | b))) { io.error := UInt(3) } + when(dut.io.xor != UInt(mask & (a ^ b))) { io.error := UInt(4) } + } + + "BitwiseOps" should "return the correct result" in { + forAll(safeUInts, safeUInts) { (a: Int, b: Int) => + assert(execute{ new BitwiseOpsTester(32, a, b) }) + } + } +} -- cgit v1.2.3