diff --git a/core/src/main/scala/chisel3/experimental/dataview/package.scala b/core/src/main/scala/chisel3/experimental/dataview/package.scala index d5a8cde4e68..c06ac52d50a 100644 --- a/core/src/main/scala/chisel3/experimental/dataview/package.scala +++ b/core/src/main/scala/chisel3/experimental/dataview/package.scala @@ -102,6 +102,9 @@ package object dataview { // that are actually members of the target or view val tex = unfoldView(te).find(x => targetContains(x) || x.isLit || x == DontCare).getOrElse(err("Target", te)) val vex = unfoldView(ve).find(viewFieldLookup.contains).getOrElse(err("View", ve)) + if (!tex.isSynthesizable) { + Builder.deprecated(s".viewAs should only be called on hardware, this will become an error in Chisel 6.0.0") + } (tex, vex) match { /* Allow views where the types are equal. */ diff --git a/core/src/main/scala/chisel3/internal/Builder.scala b/core/src/main/scala/chisel3/internal/Builder.scala index a84cbc18d18..f0cbfaa5e8d 100644 --- a/core/src/main/scala/chisel3/internal/Builder.scala +++ b/core/src/main/scala/chisel3/internal/Builder.scala @@ -815,9 +815,18 @@ private[chisel3] object Builder extends LazyLogging { val absTarget = view.toAbsoluteTarget val elts = getRecursiveFields.lazily(view, "").collect { case (elt: Element, _) => elt } for (elt <- elts) { - val targetOfView = reify(elt) - renames.record(localTarget, targetOfView.toTarget) - renames.record(absTarget, targetOfView.toAbsoluteTarget) + // This is a hack to not crash when .viewAs is called on non-hardware + // It can be removed in Chisel 6.0.0 when it becomes illegal to call .viewAs on non-hardware + val targetOfViewOpt = + try { + Some(reify(elt)) + } catch { + case _: NoSuchElementException => None + } + targetOfViewOpt.foreach { targetOfView => + renames.record(localTarget, targetOfView.toTarget) + renames.record(absTarget, targetOfView.toAbsoluteTarget) + } } } renames diff --git a/src/test/scala/chiselTests/experimental/DataView.scala b/src/test/scala/chiselTests/experimental/DataView.scala index 660521cfd82..5af477f7eed 100644 --- a/src/test/scala/chiselTests/experimental/DataView.scala +++ b/src/test/scala/chiselTests/experimental/DataView.scala @@ -737,6 +737,17 @@ class DataViewSpec extends ChiselFlatSpec { } } + // In Chisel 6.0.0 this will become an error, but for now it at least needs to not crash + it should "not crash when calling .viewAs on unbound hardware" in { + class MyBundle(val foo: UInt, val bar: UInt) extends Bundle + implicit val view = + DataView[(UInt, UInt), MyBundle](x => new MyBundle(x._1.cloneType, x._2.cloneType), _._1 -> _.foo, _._2 -> _.bar) + class MyModule extends Module { + (UInt(8.W), UInt(8.W)).viewAs[MyBundle] + } + ChiselStage.emitCHIRRTL(new MyModule) + } + it should "support literals as part of the target" in { import ValidExtensions._ class MyModule extends Module {