diff options
| author | Jack Koenig | 2020-03-25 19:51:46 -0700 |
|---|---|---|
| committer | GitHub | 2020-03-25 19:51:46 -0700 |
| commit | dbb024a9adee6d82f37e357cf8b55456674ff65c (patch) | |
| tree | 578858ab6d219ca6daf44cf87b73f75054989097 /core/src/main/scala/chisel3/UIntFactory.scala | |
| parent | 6263fcc56b630b7181eb30680cadcdbb2bdf91dc (diff) | |
| parent | fbf5e6f1a0e8bf535d465b748ad554575fe62156 (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.scala | 47 |
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) + } +} |
