Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

BoringUtils: tapAndRead of literal throws error #4663

Open
dtzSiFive opened this issue Feb 4, 2025 · 2 comments
Open

BoringUtils: tapAndRead of literal throws error #4663

dtzSiFive opened this issue Feb 4, 2025 · 2 comments

Comments

@dtzSiFive
Copy link
Member

Type of issue: Bug Report

Please provide the steps to reproduce the problem:

Use BoringUtils.tapAndRead on a literal, example:

//> using repository "sonatype-s01:snapshots"
//> using scala "2.13.14"
//> using dep "org.chipsalliance::chisel:7.0.0-M2+317-62ca9bdc-SNAPSHOT"
//> using plugin "org.chipsalliance:::chisel-plugin:7.0.0-M2+317-62ca9bdc-SNAPSHOT"
//> using options "-unchecked", "-deprecation", "-language:reflectiveCalls", "-feature", "-Xcheckinit", "-Xfatal-warnings", "-Ywarn-dead-code", "-Ywarn-unused", "-Ymacro-annotations"

import chisel3._
import circt.stage.ChiselStage
import chisel3.util.experimental.BoringUtils

class Foo extends RawModule {
  val x = 5.U
  val y = BoringUtils.tapAndRead(x)
}

object Main extends App {
  println(ChiselStage.emitCHIRRTL(new Foo, Array("--full-stacktrace")))
}

What is the current behavior?

Exception in thread "main" java.util.NoSuchElementException: None.get
	at scala.None$.get(Option.scala:627)
	at scala.None$.get(Option.scala:626)
	at chisel3.util.experimental.BoringUtils$.parent$1(BoringUtils.scala:230)
	at chisel3.util.experimental.BoringUtils$.boreOrTap(BoringUtils.scala:328)
	at chisel3.util.experimental.BoringUtils$.$anonfun$tapAndRead$3(BoringUtils.scala:423)
	at chisel3.experimental.skipPrefix$.apply(prefix.scala:102)
	at chisel3.util.experimental.BoringUtils$.$anonfun$tapAndRead$2(BoringUtils.scala:423)
	at chisel3.experimental.prefix$.apply(prefix.scala:50)
	at chisel3.util.experimental.BoringUtils$.$anonfun$tapAndRead$1(BoringUtils.scala:422)
	at chisel3.internal.plugin.package$.autoNameRecursively(package.scala:33)
	at chisel3.util.experimental.BoringUtils$.tapAndRead(BoringUtils.scala:422)
	at Foo.$anonfun$y$2(bore-literal.scala:13)
(snip)

What is the expected behavior?

Ability to use BoringUtils with literals.

Please tell us about your environment:

Other Information

What is the use case for changing the behavior?

Building library code using BoringUtils.

@dtzSiFive
Copy link
Member Author

One strategy is to spill literals to wires and then tapAndRead that.

The wire would likely be created where tapAndRead is invoked, which is probably fine if maybe unexpected?

For example, if you tapAndRead something like val foo = Module(new Foo); val x = BoringUtils.tapAndRead(foo.x), the Wire might be expected to be in Foo not at the location of tapAndRead. Maybe that's fine though, looks a bit like an optimization?

@dtzSiFive
Copy link
Member Author

dtzSiFive commented Feb 4, 2025

Alternatively: Require non-literals and add a check with an error message explaining...

Or just pass through the literal? 🤔

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant