summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJim Lawson2020-01-07 14:31:42 -0800
committerGitHub2020-01-07 14:31:42 -0800
commitce82ffaaeb2301af756b032c01e879e700299ea1 (patch)
tree4e10201d02d43c560a8f22aae3263e6edfd63d0e
parentc720c99a75f565c8b4fbc7147d7b9daee9123d10 (diff)
parentd4300b9deae6dde7ce0f314ea73a9ca4a1c3868c (diff)
Merge branch 'master' into fix-bitpat-whitespace
-rw-r--r--chiselFrontend/src/main/scala/chisel3/Aggregate.scala2
-rw-r--r--chiselFrontend/src/main/scala/chisel3/Bits.scala10
-rw-r--r--chiselFrontend/src/main/scala/chisel3/internal/Builder.scala2
-rw-r--r--src/main/scala/chisel3/stage/package.scala1
-rw-r--r--src/test/scala/chiselTests/IntervalSpec.scala44
5 files changed, 50 insertions, 9 deletions
diff --git a/chiselFrontend/src/main/scala/chisel3/Aggregate.scala b/chiselFrontend/src/main/scala/chisel3/Aggregate.scala
index 42b40ed9..8141fdba 100644
--- a/chiselFrontend/src/main/scala/chisel3/Aggregate.scala
+++ b/chiselFrontend/src/main/scala/chisel3/Aggregate.scala
@@ -43,7 +43,7 @@ sealed abstract class Aggregate extends Data {
}
}
- override def litOption: Option[BigInt] = ??? // TODO implement me
+ override def litOption: Option[BigInt] = None // TODO implement me
/** Returns a Seq of the immediate contents of this Aggregate, in order.
*/
diff --git a/chiselFrontend/src/main/scala/chisel3/Bits.scala b/chiselFrontend/src/main/scala/chisel3/Bits.scala
index 28d1690d..af13ee44 100644
--- a/chiselFrontend/src/main/scala/chisel3/Bits.scala
+++ b/chiselFrontend/src/main/scala/chisel3/Bits.scala
@@ -2162,16 +2162,16 @@ package experimental {
protected[chisel3] def Lit(value: BigInt, range: IntervalRange): Interval = {
val lit = IntervalLit(value, range.getWidth, range.binaryPoint)
- val bigDecimal = BigDecimal(value)
+ val bigDecimal = BigDecimal(value) / (1 << lit.binaryPoint.get)
val inRange = (range.lowerBound, range.upperBound) match {
case (firrtlir.Closed(l), firrtlir.Closed(u)) => l <= bigDecimal && bigDecimal <= u
- case (firrtlir.Closed(l), firrtlir.Open(u)) => l <= bigDecimal && bigDecimal <= u
- case (firrtlir.Open(l), firrtlir.Closed(u)) => l <= bigDecimal && bigDecimal <= u
- case (firrtlir.Open(l), firrtlir.Open(u)) => l <= bigDecimal && bigDecimal <= u
+ case (firrtlir.Closed(l), firrtlir.Open(u)) => l <= bigDecimal && bigDecimal < u
+ case (firrtlir.Open(l), firrtlir.Closed(u)) => l < bigDecimal && bigDecimal <= u
+ case (firrtlir.Open(l), firrtlir.Open(u)) => l < bigDecimal && bigDecimal < u
}
if(! inRange) {
throw new ChiselException(
- s"Error literal interval value $value is not contained in specified range $range"
+ s"Error literal interval value $bigDecimal is not contained in specified range $range"
)
}
val result = Interval(range)
diff --git a/chiselFrontend/src/main/scala/chisel3/internal/Builder.scala b/chiselFrontend/src/main/scala/chisel3/internal/Builder.scala
index b5f617f0..c119315d 100644
--- a/chiselFrontend/src/main/scala/chisel3/internal/Builder.scala
+++ b/chiselFrontend/src/main/scala/chisel3/internal/Builder.scala
@@ -18,7 +18,7 @@ private[chisel3] class Namespace(keywords: Set[String]) {
names(keyword) = 1
private def rename(n: String): String = {
- val index = names.getOrElse(n, 1L)
+ val index = names(n)
val tryName = s"${n}_${index}"
names(n) = index + 1
if (this contains tryName) rename(n) else tryName
diff --git a/src/main/scala/chisel3/stage/package.scala b/src/main/scala/chisel3/stage/package.scala
index 67d38ae7..57766be6 100644
--- a/src/main/scala/chisel3/stage/package.scala
+++ b/src/main/scala/chisel3/stage/package.scala
@@ -28,7 +28,6 @@ package object stage {
private[chisel3] implicit object ChiselExecutionResultView extends OptionsView[ChiselExecutionResult] {
- lazy val dummyWriteEmitted = new firrtl.stage.phases.WriteEmitted
lazy val dummyConvert = new Convert
lazy val dummyEmitter = new Emitter
diff --git a/src/test/scala/chiselTests/IntervalSpec.scala b/src/test/scala/chiselTests/IntervalSpec.scala
index 863771a3..1e56d8a3 100644
--- a/src/test/scala/chiselTests/IntervalSpec.scala
+++ b/src/test/scala/chiselTests/IntervalSpec.scala
@@ -456,12 +456,54 @@ class IntervalSpec extends FreeSpec with Matchers with ChiselRunners {
() =>
new BasicTester {
val x = 5.I(range"[0,4]")
- }
+ }
).elaborate
}
}
}
+ "Interval literals creation handles edge cases" - {
+ "value at closed boundaries works" in {
+ val inputRange = range"[-6, 6].2"
+ val in1 = (-6.0).I(inputRange)
+ val in2 = 6.0.I(inputRange)
+ BigDecimal(in1.litValue()) / (1 << inputRange.binaryPoint.get) should be (-6)
+ BigDecimal(in2.litValue()) / (1 << inputRange.binaryPoint.get) should be (6)
+ intercept[ChiselException] {
+ (-6.25).I(inputRange)
+ }
+ intercept[ChiselException] {
+ (6.25).I(inputRange)
+ }
+ }
+ "value at open boundaries works" in {
+ val inputRange = range"(-6, 6).2"
+ val in1 = (-5.75).I(inputRange)
+ val in2 = 5.75.I(inputRange)
+ BigDecimal(in1.litValue()) / (1 << inputRange.binaryPoint.get) should be (-5.75)
+ BigDecimal(in2.litValue()) / (1 << inputRange.binaryPoint.get) should be (5.75)
+ intercept[ChiselException] {
+ (-6.0).I(inputRange)
+ }
+ intercept[ChiselException] {
+ (6.0).I(inputRange)
+ }
+ }
+ "values not precisely at open boundaries works but are converted to nearest match" in {
+ val inputRange = range"(-6, 6).2"
+ val in1 = (-5.95).I(inputRange)
+ val in2 = 5.95.I(inputRange)
+ BigDecimal(in1.litValue()) / (1 << inputRange.binaryPoint.get) should be (-5.75)
+ BigDecimal(in2.litValue()) / (1 << inputRange.binaryPoint.get) should be (5.75)
+ intercept[ChiselException] {
+ (-6.1).I(inputRange)
+ }
+ intercept[ChiselException] {
+ (6.1).I(inputRange)
+ }
+ }
+ }
+
"Let's take a look at the results of squeeze over small range" in {
assertTesterPasses {
new ClipSqueezeWrapDemo(