summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--chiselFrontend/src/main/scala/chisel3/core/Bits.scala8
-rw-r--r--src/test/scala/chiselTests/FixedPointSpec.scala5
2 files changed, 11 insertions, 2 deletions
diff --git a/chiselFrontend/src/main/scala/chisel3/core/Bits.scala b/chiselFrontend/src/main/scala/chisel3/core/Bits.scala
index a5aca9f3..cea2a679 100644
--- a/chiselFrontend/src/main/scala/chisel3/core/Bits.scala
+++ b/chiselFrontend/src/main/scala/chisel3/core/Bits.scala
@@ -853,8 +853,12 @@ sealed class FixedPoint private (width: Width, val binaryPoint: BinaryPoint, lit
final def setBinaryPoint(that: Int): FixedPoint = macro SourceInfoTransform.thatArg
- def do_setBinaryPoint(that: Int)(implicit sourceInfo: SourceInfo): FixedPoint =
- binop(sourceInfo, FixedPoint(this.width, KnownBinaryPoint(that)), SetBinaryPoint, that)
+ def do_setBinaryPoint(that: Int)(implicit sourceInfo: SourceInfo): FixedPoint = this.binaryPoint match {
+ case KnownBinaryPoint(value) =>
+ binop(sourceInfo, FixedPoint(this.width + (that - value), KnownBinaryPoint(that)), SetBinaryPoint, that)
+ case _ =>
+ binop(sourceInfo, FixedPoint(UnknownWidth(), KnownBinaryPoint(that)), SetBinaryPoint, that)
+ }
/** Returns this wire bitwise-inverted. */
def do_unary_~ (implicit sourceInfo: SourceInfo): FixedPoint =
diff --git a/src/test/scala/chiselTests/FixedPointSpec.scala b/src/test/scala/chiselTests/FixedPointSpec.scala
index 0f5b3e9e..85f20d97 100644
--- a/src/test/scala/chiselTests/FixedPointSpec.scala
+++ b/src/test/scala/chiselTests/FixedPointSpec.scala
@@ -85,12 +85,17 @@ class SBP extends Module {
})
io.out := io.in.setBinaryPoint(0)
}
+
class SBPTester extends BasicTester {
val dut = Module(new SBP)
dut.io.in := 3.75.F(2.BP)
assert(dut.io.out === 3.0.F(0.BP))
+ val test = Wire(FixedPoint(10.W, 5.BP))
+ val q = test.setBinaryPoint(18)
+ assert(q.getWidth.U === 23.U)
+
stop()
}