summaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
authormergify[bot]2022-11-04 18:20:07 +0000
committerGitHub2022-11-04 18:20:07 +0000
commit4149157df6531d124483d992daf96cf4e62a0f0c (patch)
tree76b4e80517168c5d0704e24c097a3c176417a811 /core
parent0750bc2f46d49c8fdfd0c07a2ac80c74311b3f15 (diff)
Add PartialDataView.supertype (backport #2826) (#2827)
* Add PartialDataView.supertype (#2826) This factory method makes it easy to create PartialDataViews from a Bundle type to its supertype. Because of the typing relationship, there is no need to provide a mapping between fields. The only thing necessary is to provide a function for constructing an instance of the supertype from an instance of the subtype. (cherry picked from commit 251d454a224e5a961438ba0ea41134d7da7a5992) # Conflicts: # core/src/main/scala/chisel3/experimental/dataview/package.scala # src/test/scala/chiselTests/experimental/DataView.scala * Resolve backport conflicts Co-authored-by: Jack Koenig <koenig@sifive.com>
Diffstat (limited to 'core')
-rw-r--r--core/src/main/scala/chisel3/experimental/dataview/DataView.scala23
-rw-r--r--core/src/main/scala/chisel3/experimental/dataview/package.scala14
2 files changed, 25 insertions, 12 deletions
diff --git a/core/src/main/scala/chisel3/experimental/dataview/DataView.scala b/core/src/main/scala/chisel3/experimental/dataview/DataView.scala
index 7f20964d..cc555b11 100644
--- a/core/src/main/scala/chisel3/experimental/dataview/DataView.scala
+++ b/core/src/main/scala/chisel3/experimental/dataview/DataView.scala
@@ -592,4 +592,27 @@ object PartialDataView {
implicit sourceInfo: SourceInfo
): DataView[T, V] =
new DataView[T, V](mkView, mapping, _total = false)
+
+ /** Constructs a non-total [[DataView]] mapping from a [[Bundle]] type to a parent [[Bundle]] type
+ *
+ * @param mkView a function constructing an instance `V` from an instance of `T`
+ * @return the [[DataView]] that enables viewing instances of a [[Bundle]] as instances of a parent type
+ */
+ def supertype[T <: Bundle, V <: Bundle](
+ mkView: T => V
+ )(
+ implicit ev: SubTypeOf[T, V],
+ sourceInfo: SourceInfo
+ ): DataView[T, V] =
+ mapping[T, V](
+ mkView,
+ {
+ case (a, b) =>
+ val aElts = a.elements
+ val bElts = b.elements
+ val bKeys = bElts.keySet
+ val keys = aElts.keysIterator.filter(bKeys.contains)
+ keys.map(k => aElts(k) -> bElts(k)).toSeq
+ }
+ )
}
diff --git a/core/src/main/scala/chisel3/experimental/dataview/package.scala b/core/src/main/scala/chisel3/experimental/dataview/package.scala
index 71ae2d8f..a52e88cf 100644
--- a/core/src/main/scala/chisel3/experimental/dataview/package.scala
+++ b/core/src/main/scala/chisel3/experimental/dataview/package.scala
@@ -43,24 +43,14 @@ package object dataview {
"${A} is not a subtype of ${B}! Did you mean .viewAs[${B}]? " +
"Please see https://www.chisel-lang.org/chisel3/docs/cookbooks/dataview"
)
- private type SubTypeOf[A, B] = A <:< B
+ private[dataview] type SubTypeOf[A, B] = A <:< B
/** Provides `viewAsSupertype` for subclasses of [[Bundle]] */
implicit class BundleUpcastable[T <: Bundle](target: T) {
/** View a [[Bundle]] or [[Record]] as a parent type (upcast) */
def viewAsSupertype[V <: Bundle](proto: V)(implicit ev: SubTypeOf[T, V], sourceInfo: SourceInfo): V = {
- implicit val dataView = PartialDataView.mapping[T, V](
- _ => proto,
- {
- case (a, b) =>
- val aElts = a.elements
- val bElts = b.elements
- val bKeys = bElts.keySet
- val keys = aElts.keysIterator.filter(bKeys.contains)
- keys.map(k => aElts(k) -> bElts(k)).toSeq
- }
- )
+ implicit val dataView = PartialDataView.supertype[T, V](_ => proto)
target.viewAs[V]
}
}