summaryrefslogtreecommitdiff
path: root/chiselFrontend/src/main
diff options
context:
space:
mode:
authorRichard Lin2018-05-09 23:38:44 -0700
committerRichard Lin2018-07-04 18:39:28 -0500
commit95f1e17d8402b2fb8120b8f60d5b110f0b009a60 (patch)
treeae7bab41ab4a9ab420547addeeba8ac3f7b0366c /chiselFrontend/src/main
parent7834f0ada9f8bcfc28c1d6124f63acdcaa2d4755 (diff)
refactoring of lit and ref implementations
Diffstat (limited to 'chiselFrontend/src/main')
-rw-r--r--chiselFrontend/src/main/scala/chisel3/core/Bits.scala17
-rw-r--r--chiselFrontend/src/main/scala/chisel3/core/Data.scala45
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