summaryrefslogtreecommitdiff
path: root/core/src/main/scala/chisel3/UIntFactory.scala
diff options
context:
space:
mode:
authorJack Koenig2020-03-25 19:51:46 -0700
committerGitHub2020-03-25 19:51:46 -0700
commitdbb024a9adee6d82f37e357cf8b55456674ff65c (patch)
tree578858ab6d219ca6daf44cf87b73f75054989097 /core/src/main/scala/chisel3/UIntFactory.scala
parent6263fcc56b630b7181eb30680cadcdbb2bdf91dc (diff)
parentfbf5e6f1a0e8bf535d465b748ad554575fe62156 (diff)
Merge pull request #1384 from freechipsproject/no-more-compile-internal
No more compile internal
Diffstat (limited to 'core/src/main/scala/chisel3/UIntFactory.scala')
-rw-r--r--core/src/main/scala/chisel3/UIntFactory.scala47
1 files changed, 47 insertions, 0 deletions
diff --git a/core/src/main/scala/chisel3/UIntFactory.scala b/core/src/main/scala/chisel3/UIntFactory.scala
new file mode 100644
index 00000000..3868962b
--- /dev/null
+++ b/core/src/main/scala/chisel3/UIntFactory.scala
@@ -0,0 +1,47 @@
+// See LICENSE for license details.
+
+package chisel3
+
+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 {
+ /** Create a UInt type with inferred width. */
+ def apply(): UInt = apply(Width())
+ /** Create a UInt port with specified width. */
+ def apply(width: Width): UInt = new UInt(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 _ =>
+ }
+
+ // 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)
+ }
+}