From 32c3c0d46dcd24ae3430ec151eacab5049bf07a9 Mon Sep 17 00:00:00 2001 From: Paul Rigge Date: Thu, 1 Dec 2016 13:35:48 -0800 Subject: Have FixedPoint use asFixedPoint in fromBits. --- chiselFrontend/src/main/scala/chisel3/core/Bits.scala | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/chiselFrontend/src/main/scala/chisel3/core/Bits.scala b/chiselFrontend/src/main/scala/chisel3/core/Bits.scala index 035ac213..a769342d 100644 --- a/chiselFrontend/src/main/scala/chisel3/core/Bits.scala +++ b/chiselFrontend/src/main/scala/chisel3/core/Bits.scala @@ -911,6 +911,12 @@ sealed class FixedPoint private (width: Width, val binaryPoint: BinaryPoint, lit override def do_asUInt(implicit sourceInfo: SourceInfo): UInt = pushOp(DefPrim(sourceInfo, UInt(this.width), AsUIntOp, ref)) override def do_asSInt(implicit sourceInfo: SourceInfo): SInt = pushOp(DefPrim(sourceInfo, SInt(this.width), AsSIntOp, ref)) //TODO(chick): Consider "convert" as an arithmetic conversion to UInt/SInt + + override def do_fromBits(that: Bits)(implicit sourceInfo: SourceInfo, compileOptions: CompileOptions): this.type = { + val res = Wire(this, null).asInstanceOf[this.type] + res := that.asFixedPoint(this.binaryPoint) + res + } } /** Use PrivateObject to force users to specify width and binaryPoint by name -- cgit v1.2.3 From 53e9794ea4471d0da29d688cefdc462a9be98b63 Mon Sep 17 00:00:00 2001 From: Paul Rigge Date: Mon, 5 Dec 2016 16:54:37 -0800 Subject: Add a test for fromBits on fixed point numbers. --- src/test/scala/chiselTests/FixedPointSpec.scala | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/test/scala/chiselTests/FixedPointSpec.scala b/src/test/scala/chiselTests/FixedPointSpec.scala index 69015e42..b3ea30b5 100644 --- a/src/test/scala/chiselTests/FixedPointSpec.scala +++ b/src/test/scala/chiselTests/FixedPointSpec.scala @@ -17,6 +17,22 @@ class FixedPointSpec extends FlatSpec with Matchers { initialDouble should be(finalDouble) } + + behavior of "fixed point" + + they should "allow fromBits from now fixed point types" in { + val uint = 3.U + val sint = -3.S + val fp_tpe = FixedPoint(width = 4, binaryPoint = 1) + val uint_result = FixedPoint.fromDouble(1.5, width = 4, binaryPoint = 1) + val sint_result = FixedPoint.fromDouble(-1.5, width = 4, binaryPoint = 1) + + val uint2fp = fp_tpe.fromBits(uint) + val sint2fp = fp_tpe.fromBits(sint) + + uint2fp should be (uint_result) + sint2fp should be (sint_result) + } } class SBP extends Module { -- cgit v1.2.3 From 316d749df58421b52a72344c27137284d1413131 Mon Sep 17 00:00:00 2001 From: Paul Rigge Date: Tue, 13 Dec 2016 15:10:05 -0800 Subject: Checkpoint --- .../src/main/scala/chisel3/core/package.scala | 6 +++++- src/main/scala/chisel3/package.scala | 1 + src/test/scala/chiselTests/FixedPointSpec.scala | 22 +++++++++++++--------- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/chiselFrontend/src/main/scala/chisel3/core/package.scala b/chiselFrontend/src/main/scala/chisel3/core/package.scala index 87dca1f3..9fa20f49 100644 --- a/chiselFrontend/src/main/scala/chisel3/core/package.scala +++ b/chiselFrontend/src/main/scala/chisel3/core/package.scala @@ -2,7 +2,7 @@ package chisel3 { import internal.Builder package object core { - import internal.firrtl.Width + import internal.firrtl.{Width, BinaryPoint} /** * These implicit classes allow one to convert scala.Int|scala.BigInt to @@ -100,5 +100,9 @@ package chisel3 { implicit class fromIntToWidth(val int: Int) { def W: Width = Width(int) // scalastyle:ignore method.name } + + implicit class fromIntToBinaryPoint(val int: Int) { + def BP: BinaryPoint = BinaryPoint(int) // scalastyle:ignore method.name + } } } diff --git a/src/main/scala/chisel3/package.scala b/src/main/scala/chisel3/package.scala index 25d3ec3a..f20bb453 100644 --- a/src/main/scala/chisel3/package.scala +++ b/src/main/scala/chisel3/package.scala @@ -216,6 +216,7 @@ package object chisel3 { // scalastyle:ignore package.object.name implicit class fromBooleanToLiteral(val x: Boolean) extends chisel3.core.fromBooleanToLiteral(x) implicit class fromDoubleToLiteral(val x: Double) extends chisel3.core.fromDoubleToLiteral(x) implicit class fromIntToWidth(val x: Int) extends chisel3.core.fromIntToWidth(x) + implicit class fromIntToBinaryPoint(val x: Int) extends chisel3.core.fromIntToBinaryPoint(x) implicit class fromUIntToBitPatComparable(val x: UInt) { import scala.language.experimental.macros diff --git a/src/test/scala/chiselTests/FixedPointSpec.scala b/src/test/scala/chiselTests/FixedPointSpec.scala index b3ea30b5..478e1716 100644 --- a/src/test/scala/chiselTests/FixedPointSpec.scala +++ b/src/test/scala/chiselTests/FixedPointSpec.scala @@ -7,7 +7,7 @@ import chisel3.testers.BasicTester import org.scalatest._ //scalastyle:off magic.number -class FixedPointSpec extends FlatSpec with Matchers { +class FixedPointLiteralSpec extends FlatSpec with Matchers { behavior of "fixed point utilities" they should "allow conversion between doubles and the bigints needed to represent them" in { @@ -17,22 +17,22 @@ class FixedPointSpec extends FlatSpec with Matchers { initialDouble should be(finalDouble) } +} - behavior of "fixed point" - - they should "allow fromBits from now fixed point types" in { +class FixedPointFromBitsTester extends BasicTester { val uint = 3.U val sint = -3.S - val fp_tpe = FixedPoint(width = 4, binaryPoint = 1) + val fp_tpe = FixedPoint(4.W, 1.BP) val uint_result = FixedPoint.fromDouble(1.5, width = 4, binaryPoint = 1) val sint_result = FixedPoint.fromDouble(-1.5, width = 4, binaryPoint = 1) val uint2fp = fp_tpe.fromBits(uint) val sint2fp = fp_tpe.fromBits(sint) - uint2fp should be (uint_result) - sint2fp should be (sint_result) - } + assert(uint2fp === uint_result) + assert(sint2fp === sint_result) + + stop() } class SBP extends Module { @@ -50,8 +50,12 @@ class SBPTester extends BasicTester { stop() } -class SBPSpec extends ChiselPropSpec { + +class FixedPointSpec extends ChiselPropSpec { property("should allow set binary point") { assertTesterPasses { new SBPTester } } + property("should allow fromBits") { + assertTesterPasses { new FixedPointFromBitsTester } + } } -- cgit v1.2.3 From f9d528b3763429275430b84839ccf0b4570531a2 Mon Sep 17 00:00:00 2001 From: Paul Rigge Date: Tue, 13 Dec 2016 15:54:36 -0800 Subject: Fix test. --- chiselFrontend/src/main/scala/chisel3/core/Bits.scala | 8 +++++++- src/test/scala/chiselTests/FixedPointSpec.scala | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/chiselFrontend/src/main/scala/chisel3/core/Bits.scala b/chiselFrontend/src/main/scala/chisel3/core/Bits.scala index a769342d..c5fc10e7 100644 --- a/chiselFrontend/src/main/scala/chisel3/core/Bits.scala +++ b/chiselFrontend/src/main/scala/chisel3/core/Bits.scala @@ -647,7 +647,13 @@ sealed class SInt private[core] (width: Width, lit: Option[SLit] = None) override def do_asUInt(implicit sourceInfo: SourceInfo): UInt = pushOp(DefPrim(sourceInfo, UInt(this.width), AsUIntOp, ref)) override def do_asSInt(implicit sourceInfo: SourceInfo): SInt = this override def do_asFixedPoint(binaryPoint: BinaryPoint)(implicit sourceInfo: SourceInfo): FixedPoint = { - pushOp(DefPrim(sourceInfo, FixedPoint(width, binaryPoint), AsFixedPointOp, ref)) + binaryPoint match { + case KnownBinaryPoint(value) => + val iLit = ILit(value) + pushOp(DefPrim(sourceInfo, FixedPoint(width, binaryPoint), AsFixedPointOp, ref, iLit)) + case _ => + throwException(s"cannot call $this.asFixedPoint(binaryPoint=$binaryPoint), you must specify a known binaryPoint") + } } } diff --git a/src/test/scala/chiselTests/FixedPointSpec.scala b/src/test/scala/chiselTests/FixedPointSpec.scala index 478e1716..a08de073 100644 --- a/src/test/scala/chiselTests/FixedPointSpec.scala +++ b/src/test/scala/chiselTests/FixedPointSpec.scala @@ -20,7 +20,7 @@ class FixedPointLiteralSpec extends FlatSpec with Matchers { } class FixedPointFromBitsTester extends BasicTester { - val uint = 3.U + val uint = 3.U(4.W) val sint = -3.S val fp_tpe = FixedPoint(4.W, 1.BP) val uint_result = FixedPoint.fromDouble(1.5, width = 4, binaryPoint = 1) -- cgit v1.2.3