summaryrefslogtreecommitdiff
path: root/src/test/scala/chiselTests/Util.scala
diff options
context:
space:
mode:
authorChick Markley2019-10-18 19:44:08 -0700
committerAdam Izraelevitz2019-10-18 19:44:08 -0700
commit7b93b0f8c48e39cc9730cf9f91340cf733dadafe (patch)
tree3e9666c29d6c9901f221fed4728d05b9fd75067e /src/test/scala/chiselTests/Util.scala
parentfafd984a923591841917cd4c3a1f4c823dc485b4 (diff)
Interval Data Type Support for Chisel (#1210)
Plan to be released with 3.3. Breaks experimental Range API. Adds new Interval type and associated support. This commit adds the following: - Renamed Range to IntervalRange to avoid name collision with scala Range - Changed RangeTransform macro to Return an IntervalRange - Improved error messages on missing comma or decimal - Added notational support for binary point - Some formatting cleanup also - SIntFactory - Change to use IntervalRange API - UIntFactory - UInt from range has custom width computation - It does not need to deal with lowerbound extending bit requirements - Code to handle special case of range"[0,0]" to have a width of 1 - IR.scala - Removed Bound and other constraint code that was duplicating firrtl stuff - Added new RangeType - Added IntervalRange class and object - RangeSpec - modified just a bit to handle notational differences - previous range interpolator returned tuple now returns IntervalRange - Add IntervalType to emitter - Added IntervalSpec with many tests - Added ScalaIntervalSimulatorSpec which tests golden model for Interval - Added ScalaIntervalSimulator which is a golden model for Interval - This gold may not have been polished to a high sheen - Add IntervalLit cases to Converter - Add Interval PrimOps to IR - asInterval, wrap, squz, clip, setp, decp, incp - Add IntervalLit class to IR - Add Interval to MonoConnect - Add Interval Type to Bits (in experimental package) - add conversions to Interval from other types - Add Interval clone stuff to Data - Add Literal creation helpers to chisel3 package - these may move to experimental if I can figure that out
Diffstat (limited to 'src/test/scala/chiselTests/Util.scala')
-rw-r--r--src/test/scala/chiselTests/Util.scala52
1 files changed, 52 insertions, 0 deletions
diff --git a/src/test/scala/chiselTests/Util.scala b/src/test/scala/chiselTests/Util.scala
index f71cd7f3..8c9bc4ea 100644
--- a/src/test/scala/chiselTests/Util.scala
+++ b/src/test/scala/chiselTests/Util.scala
@@ -5,6 +5,9 @@
package chiselTests
import chisel3._
+import chisel3.experimental.Interval
+import chisel3.internal.firrtl.{IntervalRange, KnownBinaryPoint, Width}
+import _root_.firrtl.{ir => firrtlir}
class PassthroughModuleIO extends Bundle {
val in = Input(UInt(32.W))
@@ -20,4 +23,53 @@ class PassthroughModule extends Module with AbstractPassthroughModule
class PassthroughMultiIOModule extends MultiIOModule with AbstractPassthroughModule
class PassthroughRawModule extends RawModule with AbstractPassthroughModule
+case class ScalaIntervalSimulator(intervalRange: IntervalRange) {
+ val binaryPoint: Int = intervalRange.binaryPoint.asInstanceOf[KnownBinaryPoint].value
+ val epsilon: Double = 1.0 / math.pow(2.0, binaryPoint.toDouble)
+
+ val (lower, upper) = (intervalRange.lowerBound, intervalRange.upperBound) match {
+
+ case (firrtlir.Closed(lower1), firrtlir.Closed(upper1)) => (lower1, upper1)
+ case (firrtlir.Closed(lower1), firrtlir.Open(upper1)) => (lower1, upper1 - epsilon)
+ case (firrtlir.Open(lower1), firrtlir.Closed(upper1)) => (lower1 + epsilon, upper1)
+ case (firrtlir.Open(lower1), firrtlir.Open(upper1)) => (lower1 + epsilon, upper1 - epsilon)
+ case _ =>
+ throw new Exception(s"lower and upper bounds must be defined, range here is $intervalRange")
+ }
+
+ def clip(value: BigDecimal): BigDecimal = {
+
+ if (value < lower) {
+ lower
+ }
+ else if (value > upper) {
+ upper
+ }
+ else {
+ value
+ }
+ }
+
+ def wrap(value: BigDecimal): BigDecimal = {
+
+ if (value < lower) {
+ upper + (value - lower) + epsilon
+ }
+ else if (value > upper) {
+ ((value - upper) - epsilon) + lower
+ }
+ else {
+ value
+ }
+ }
+
+ def allValues: Iterator[BigDecimal] = {
+ (lower to upper by epsilon).toIterator
+ }
+
+ def makeLit(value: BigDecimal): Interval = {
+ Interval.fromDouble(value.toDouble, width = Width(), binaryPoint = binaryPoint.BP)
+ }
+}
+