diff options
| -rw-r--r-- | chiselFrontend/src/main/scala/chisel3/core/Bits.scala | 8 | ||||
| -rw-r--r-- | src/test/scala/chiselTests/FixedPointSpec.scala | 5 |
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() } |
