summaryrefslogtreecommitdiff
path: root/chiselFrontend/src/main/scala/chisel3/UIntFactory.scala
diff options
context:
space:
mode:
Diffstat (limited to 'chiselFrontend/src/main/scala/chisel3/UIntFactory.scala')
-rw-r--r--chiselFrontend/src/main/scala/chisel3/UIntFactory.scala37
1 files changed, 26 insertions, 11 deletions
diff --git a/chiselFrontend/src/main/scala/chisel3/UIntFactory.scala b/chiselFrontend/src/main/scala/chisel3/UIntFactory.scala
index a62aa493..3868962b 100644
--- a/chiselFrontend/src/main/scala/chisel3/UIntFactory.scala
+++ b/chiselFrontend/src/main/scala/chisel3/UIntFactory.scala
@@ -2,9 +2,10 @@
package chisel3
-import chisel3.internal.firrtl.{KnownUIntRange, NumericBound, Range, ULit, Width}
-
-// scalastyle:off method.name
+import chisel3.internal.firrtl.{IntervalRange, KnownWidth, ULit, UnknownWidth, Width}
+import firrtl.Utils
+import firrtl.constraint.IsKnown
+import firrtl.ir.{Closed, IntWidth, Open}
// This is currently a factory because both Bits and UInt inherit it.
trait UIntFactory {
@@ -13,20 +14,34 @@ trait UIntFactory {
/** Create a UInt port with specified width. */
def apply(width: Width): UInt = new UInt(width)
- /** Create a UInt literal with specified width. */
+ /** Create a UInt literal with specified width. */
+ // scalastyle:off method.name
protected[chisel3] def Lit(value: BigInt, width: Width): UInt = {
val lit = ULit(value, width)
val result = new UInt(lit.width)
// Bind result to being an Literal
lit.bindLitArg(result)
}
+ /** Create a UInt with the specified range, validate that range is effectively > 0
+ */
+ //scalastyle:off cyclomatic.complexity
+ def apply(range: IntervalRange): UInt = {
+ // Check is only done against lower bound because range will already insist that range high >= low
+ range.lowerBound match {
+ case Closed(bound) if bound < 0 =>
+ throw new ChiselException(s"Attempt to create UInt with closed lower bound of $bound, must be > 0")
+ case Open(bound) if bound < -1 =>
+ throw new ChiselException(s"Attempt to create UInt with open lower bound of $bound, must be > -1")
+ case _ =>
+ }
- /** Create a UInt with the specified range */
- def apply(range: Range): UInt = {
- apply(range.getWidth)
- }
- /** Create a UInt with the specified range */
- def apply(range: (NumericBound[Int], NumericBound[Int])): UInt = {
- apply(KnownUIntRange(range._1, range._2))
+ // because this is a UInt we don't have to take into account the lower bound
+ val newWidth = if(range.upperBound.isInstanceOf[IsKnown]) {
+ KnownWidth(Utils.getUIntWidth(range.maxAdjusted.get).max(1)) // max(1) handles range"[0,0]"
+ } else {
+ UnknownWidth()
+ }
+
+ apply(newWidth)
}
}