summaryrefslogtreecommitdiff
path: root/chiselFrontend
diff options
context:
space:
mode:
authorJim Lawson2018-07-31 14:11:33 -0700
committerJack Koenig2018-07-31 14:11:33 -0700
commit64a8f52c48905e9bf28e709cde2de89215a35c80 (patch)
tree0ce0f63a3891fed71810f81866ca5b7ee957b3c2 /chiselFrontend
parentfea4f3a80d2ed5d4735ef33558bebbab290290fb (diff)
Ensure names work for bundles and literals. (#853)
Fixes #852
Diffstat (limited to 'chiselFrontend')
-rw-r--r--chiselFrontend/src/main/scala/chisel3/core/Bits.scala15
-rw-r--r--chiselFrontend/src/main/scala/chisel3/internal/Builder.scala6
-rw-r--r--chiselFrontend/src/main/scala/chisel3/internal/firrtl/IR.scala17
3 files changed, 27 insertions, 11 deletions
diff --git a/chiselFrontend/src/main/scala/chisel3/core/Bits.scala b/chiselFrontend/src/main/scala/chisel3/core/Bits.scala
index 35f6c978..10b6ec8e 100644
--- a/chiselFrontend/src/main/scala/chisel3/core/Bits.scala
+++ b/chiselFrontend/src/main/scala/chisel3/core/Bits.scala
@@ -604,8 +604,7 @@ trait UIntFactory {
val lit = ULit(value, width)
val result = new UInt(lit.width)
// Bind result to being an Literal
- result.bind(ElementLitBinding(lit))
- result
+ lit.bindLitArg(result)
}
/** Create a UInt with the specified range */
@@ -757,8 +756,7 @@ trait SIntFactory {
protected[chisel3] def Lit(value: BigInt, width: Width): SInt = {
val lit = SLit(value, width)
val result = new SInt(lit.width)
- result.bind(ElementLitBinding(lit))
- result
+ lit.bindLitArg(result)
}
}
@@ -828,8 +826,9 @@ trait BoolFactory {
*/
protected[chisel3] def Lit(x: Boolean): Bool = {
val result = new Bool()
- result.bind(ElementLitBinding(ULit(if (x) 1 else 0, Width(1))))
- result
+ val lit = ULit(if (x) 1 else 0, Width(1))
+ // Ensure we have something capable of generating a name.
+ lit.bindLitArg(result)
}
}
@@ -1086,8 +1085,8 @@ object FixedPoint {
def apply(value: BigInt, width: Width, binaryPoint: BinaryPoint): FixedPoint = {
val lit = FPLit(value, width, binaryPoint)
val newLiteral = new FixedPoint(lit.width, lit.binaryPoint)
- newLiteral.bind(ElementLitBinding(lit))
- newLiteral
+ // Ensure we have something capable of generating a name.
+ lit.bindLitArg(newLiteral)
}
/**
diff --git a/chiselFrontend/src/main/scala/chisel3/internal/Builder.scala b/chiselFrontend/src/main/scala/chisel3/internal/Builder.scala
index 360994b1..ce4e1e88 100644
--- a/chiselFrontend/src/main/scala/chisel3/internal/Builder.scala
+++ b/chiselFrontend/src/main/scala/chisel3/internal/Builder.scala
@@ -112,11 +112,15 @@ private[chisel3] trait HasId extends InstanceId {
private[chisel3] def setRef(parent: HasId, index: Int): Unit = setRef(Index(Node(parent), ILit(index)))
private[chisel3] def setRef(parent: HasId, index: UInt): Unit = setRef(Index(Node(parent), index.ref))
private[chisel3] def getRef: Arg = _ref.get
+ private[chisel3] def getOptionRef: Option[Arg] = _ref
// Implementation of public methods.
def instanceName: String = _parent match {
case Some(p) => p._component match {
- case Some(c) => getRef fullName c
+ case Some(c) => _ref match {
+ case Some(arg) => arg fullName c
+ case None => suggested_name.getOrElse("??")
+ }
case None => throwException("signalName/pathName should be called after circuit elaboration")
}
case None => throwException("this cannot happen")
diff --git a/chiselFrontend/src/main/scala/chisel3/internal/firrtl/IR.scala b/chiselFrontend/src/main/scala/chisel3/internal/firrtl/IR.scala
index 6b555a82..b6630f7f 100644
--- a/chiselFrontend/src/main/scala/chisel3/internal/firrtl/IR.scala
+++ b/chiselFrontend/src/main/scala/chisel3/internal/firrtl/IR.scala
@@ -53,13 +53,26 @@ abstract class Arg {
}
case class Node(id: HasId) extends Arg {
- override def fullName(ctx: Component): String = id.getRef.fullName(ctx)
- def name: String = id.getRef.name
+ override def fullName(ctx: Component): String = id.getOptionRef match {
+ case Some(arg) => arg.fullName(ctx)
+ case None => id.suggestedName.getOrElse("??")
+ }
+ def name: String = id.getOptionRef match {
+ case Some(arg) => arg.name
+ case None => id.suggestedName.getOrElse("??")
+ }
}
abstract class LitArg(val num: BigInt, widthArg: Width) extends Arg {
private[chisel3] def forcedWidth = widthArg.known
private[chisel3] def width: Width = if (forcedWidth) widthArg else Width(minWidth)
+ override def fullName(ctx: Component): String = name
+ // Ensure the node representing this LitArg has a ref to it and a literal binding.
+ def bindLitArg[T <: Bits](bits: T): T = {
+ bits.bind(ElementLitBinding(this))
+ bits.setRef(this)
+ bits
+ }
protected def minWidth: Int
if (forcedWidth) {