diff options
| author | chick | 2019-12-12 12:06:15 -0800 |
|---|---|---|
| committer | chick | 2019-12-18 13:57:50 -0800 |
| commit | 0bcce65d5e3001b1b7098aa2c1ccd60fcc2a6628 (patch) | |
| tree | ba737c4c886005552b0e95fb48f5ff5cbdc31ea9 /src/test/scala/chiselTests/LiteralExtractorSpec.scala | |
| parent | 954cc41e1349d0df6d2250d6270590340cd36e82 (diff) | |
- New trait HasBinaryPoint which provides literal values as double and big decimal
- made .F and .I work for creating fixed point and interval lits from big decimal
- Added NumObject trait which provides new math conversions
- Made a Num object that extends NumObject
- Add this trait to FixedPoint and Interval for backward compatibility
- Removed code that is now in NumObject, keeping things DRY
- Add tests to FixedPointSpec to show lit conversion to double and big decimal
- Add tests to IntervalSpec to show lit conversion to double and big decimal
- Add tests to LiteralExtractorSpec to show general math conversions between BigInts with binary points and double and big decimal
Diffstat (limited to 'src/test/scala/chiselTests/LiteralExtractorSpec.scala')
| -rw-r--r-- | src/test/scala/chiselTests/LiteralExtractorSpec.scala | 43 |
1 files changed, 42 insertions, 1 deletions
diff --git a/src/test/scala/chiselTests/LiteralExtractorSpec.scala b/src/test/scala/chiselTests/LiteralExtractorSpec.scala index b56672af..145c1ef2 100644 --- a/src/test/scala/chiselTests/LiteralExtractorSpec.scala +++ b/src/test/scala/chiselTests/LiteralExtractorSpec.scala @@ -3,7 +3,7 @@ package chiselTests import chisel3._ -import chisel3.experimental.FixedPoint +import chisel3.experimental._ import chisel3.experimental.BundleLiterals._ import chisel3.testers.BasicTester @@ -55,6 +55,47 @@ class LiteralExtractorSpec extends ChiselFlatSpec { }} } + "doubles and big decimals" should "round trip properly" in { + intercept[ChiselException] { + Num.toBigDecimal(BigInt("1" * 109, 2), 0.BP) // this only works if number takes less than 109 bits + } + + intercept[ChiselException] { + Num.toDouble(BigInt("1" * 54, 2), 0.BP) // this only works if number takes less than 54 bits + } + + val bigInt108 = BigInt("1" * 108, 2) + val bigDecimal = Num.toBigDecimal(bigInt108, 2) + + val bigIntFromBigDecimal = Num.toBigInt(bigDecimal, 2) + + bigIntFromBigDecimal should be (bigInt108) + + val bigInt53 = BigInt("1" * 53, 2) + + val double = Num.toDouble(bigInt53, 2) + + val bigIntFromDouble = Num.toBigInt(double, 2) + + bigIntFromDouble should be (bigInt53) + } + + "encoding and decoding of Intervals" should "round trip" in { + val rangeMin = BigDecimal(-31.5) + val rangeMax = BigDecimal(32.5) + val range = range"($rangeMin, $rangeMax).2" + for(value <- (rangeMin - 4) to (rangeMax + 4) by 2.25) { + if (value < rangeMin || value > rangeMax) { + intercept[ChiselException] { + val literal = value.I(range) + } + } else { + val literal = value.I(range) + literal.isLit() should be(true) + literal.litValue().toDouble / 4.0 should be(value) + } + } + } "literals declared outside a builder context" should "compare with those inside builder context" in { class InsideBundle extends Bundle { |
