diff options
| -rw-r--r-- | chiselFrontend/src/main/scala/chisel3/core/Bits.scala | 14 | ||||
| -rw-r--r-- | chiselFrontend/src/main/scala/chisel3/core/package.scala | 6 | ||||
| -rw-r--r-- | src/main/scala/chisel3/package.scala | 1 | ||||
| -rw-r--r-- | src/test/scala/chiselTests/FixedPointSpec.scala | 24 |
4 files changed, 41 insertions, 4 deletions
diff --git a/chiselFrontend/src/main/scala/chisel3/core/Bits.scala b/chiselFrontend/src/main/scala/chisel3/core/Bits.scala index 035ac213..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") + } } } @@ -911,6 +917,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 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 69015e42..a08de073 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 { @@ -19,6 +19,22 @@ class FixedPointSpec extends FlatSpec with Matchers { } } +class FixedPointFromBitsTester extends BasicTester { + 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) + val sint_result = FixedPoint.fromDouble(-1.5, width = 4, binaryPoint = 1) + + val uint2fp = fp_tpe.fromBits(uint) + val sint2fp = fp_tpe.fromBits(sint) + + assert(uint2fp === uint_result) + assert(sint2fp === sint_result) + + stop() +} + class SBP extends Module { val io = IO(new Bundle { val in = Input(FixedPoint(6, 2)) @@ -34,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 } + } } |
