summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--chiselFrontend/src/main/scala/chisel3/core/Bits.scala14
-rw-r--r--chiselFrontend/src/main/scala/chisel3/core/package.scala6
-rw-r--r--src/main/scala/chisel3/package.scala1
-rw-r--r--src/test/scala/chiselTests/FixedPointSpec.scala24
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 }
+ }
}