diff options
| author | Richard Lin | 2018-05-09 23:38:44 -0700 |
|---|---|---|
| committer | Richard Lin | 2018-07-04 18:39:28 -0500 |
| commit | 95f1e17d8402b2fb8120b8f60d5b110f0b009a60 (patch) | |
| tree | ae7bab41ab4a9ab420547addeeba8ac3f7b0366c /chiselFrontend/src/main/scala/chisel3 | |
| parent | 7834f0ada9f8bcfc28c1d6124f63acdcaa2d4755 (diff) | |
refactoring of lit and ref implementations
Diffstat (limited to 'chiselFrontend/src/main/scala/chisel3')
| -rw-r--r-- | chiselFrontend/src/main/scala/chisel3/core/Bits.scala | 17 | ||||
| -rw-r--r-- | chiselFrontend/src/main/scala/chisel3/core/Data.scala | 45 |
2 files changed, 43 insertions, 19 deletions
diff --git a/chiselFrontend/src/main/scala/chisel3/core/Bits.scala b/chiselFrontend/src/main/scala/chisel3/core/Bits.scala index 8368a812..b0edd687 100644 --- a/chiselFrontend/src/main/scala/chisel3/core/Bits.scala +++ b/chiselFrontend/src/main/scala/chisel3/core/Bits.scala @@ -75,13 +75,10 @@ sealed abstract class Bits(width: Width) def cloneType: this.type = cloneTypeWidth(width) - protected def litArgOption: Option[LitArg] = bindingOpt match { - case Some(_) => topBinding match { - case ElementLitBinding(litArg) => Some(litArg) - case BundleLitBinding(litMap) => litMap.get(this) match { - case Some(litArg) => Some(litArg) - case _ => None - } + protected def litArgOption: Option[LitArg] = topBindingOpt match { + case Some(ElementLitBinding(litArg)) => Some(litArg) + case Some(BundleLitBinding(litMap)) => litMap.get(this) match { + case Some(litArg) => Some(litArg) case _ => None } case _ => None @@ -97,6 +94,12 @@ sealed abstract class Bits(width: Width) case _ => None } + // provide bits-specific literal handling functionality here + override private[chisel3] def ref: Arg = topBindingOpt match { + case Some(binding: LitBinding) => binding.asInstanceOf[ElementLitBinding].litArg + case _ => super.ref + } + final def tail(n: Int): UInt = macro SourceInfoTransform.nArg final def head(n: Int): UInt = macro SourceInfoTransform.nArg diff --git a/chiselFrontend/src/main/scala/chisel3/core/Data.scala b/chiselFrontend/src/main/scala/chisel3/core/Data.scala index 0254e14c..87a8d1a9 100644 --- a/chiselFrontend/src/main/scala/chisel3/core/Data.scala +++ b/chiselFrontend/src/main/scala/chisel3/core/Data.scala @@ -252,13 +252,18 @@ abstract class Data extends HasId with NamedComponent { _binding = Some(target) } - private[core] def topBinding: TopBinding = { - binding match { - case ChildBinding(parent) => parent.topBinding - case topBinding: TopBinding => topBinding + private[core] def topBindingOpt: Option[TopBinding] = { + bindingOpt match { + case Some(binding) => binding match { + case ChildBinding(parent) => parent.topBindingOpt + case binding: TopBinding => Some(binding) + } + case None => None } } + private[core] def topBinding: TopBinding = topBindingOpt.get + /** Binds this node to the hardware graph. * parentDirection is the direction of the parent node, or Unspecified (default) if the target * node is the top-level. @@ -336,8 +341,27 @@ abstract class Data extends HasId with NamedComponent { */ private[core] def typeEquivalent(that: Data): Boolean - private[chisel3] def lref: Node = Node(this) - private[chisel3] def ref: Arg = if (isLit) litArg.get else lref + // Internal API: returns a ref that can be assigned to, if consistent with the binding + private[chisel3] def lref: Node = { + requireIsHardware(this) + topBindingOpt match { + case Some(binding: ReadOnlyBinding) => throwException(s"internal error: attempted to generate LHS ref to ReadOnlyBinding $binding") + case Some(binding: TopBinding) => Node(this) + case opt => throwException(s"internal error: unknown binding $opt in generating LHS ref") + } + } + + + // Internal API: returns a ref, if bound. Literals should override this as needed. + private[chisel3] def ref: Arg = { + requireIsHardware(this) + topBindingOpt match { + case Some(binding: LitBinding) => throwException(s"internal error: can't handle literal binding $binding") + case Some(binding: TopBinding) => Node(this) + case opt => throwException(s"internal error: unknown binding $opt in generating LHS ref") + } + } + private[chisel3] def width: Width private[core] def legacyConnect(that: Data)(implicit sourceInfo: SourceInfo): Unit @@ -367,12 +391,9 @@ abstract class Data extends HasId with NamedComponent { @chiselRuntimeDeprecated @deprecated("litArg is deprecated, use litToBigIntOption or litTo*Option", "chisel3.2") - def litArg(): Option[LitArg] = bindingOpt match { - case Some(_) => topBinding match { - case ElementLitBinding(litArg) => Some(litArg) - case BundleLitBinding(litMap) => None // this API does not support Bundle literals - case _ => None - } + def litArg(): Option[LitArg] = topBindingOpt match { + case Some(ElementLitBinding(litArg)) => Some(litArg) + case Some(BundleLitBinding(litMap)) => None // this API does not support Bundle literals case _ => None } @chiselRuntimeDeprecated |
