Skip to content

Commit

Permalink
Check BaseModule.name for NullPointerException
Browse files Browse the repository at this point in the history
This wraps the evaluation of BaseModule.name in try/catch to look for a
NullPointerException that may result from trying to evaluate desiredName
before it's ready. This catches a test case of using a desiredName that
depends on a later defined eager subinstance.

h/t @jackkoenig

Signed-off-by: Schuyler Eldridge <[email protected]>
  • Loading branch information
seldridge committed Oct 25, 2018
1 parent 2416d1d commit f64388e
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 1 deletion.
8 changes: 7 additions & 1 deletion chiselFrontend/src/main/scala/chisel3/core/Module.scala
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,13 @@ abstract class BaseModule extends HasId {
def desiredName = this.getClass.getName.split('.').last

/** Legalized name of this module. */
final lazy val name = Builder.globalNamespace.name(desiredName)
final lazy val name = try {
Builder.globalNamespace.name(desiredName)
} catch {
case e: NullPointerException => throwException(
s"Error: desiredName of ${this.getClass.getName} is null. Did you evaluate 'name' before all values needed by desiredName were available?", e)
case t: Throwable => throw t
}

/** Returns a FIRRTL ModuleName that references this object
* @note Should not be called until circuit elaboration is complete
Expand Down
11 changes: 11 additions & 0 deletions src/test/scala/chiselTests/Module.scala
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,14 @@ class ModuleRewrap extends Module {
class ModuleWrapper(gen: => Module) extends Module {
val io = IO(new Bundle{})
val child = Module(gen)
override val desiredName = s"${child.desiredName}Wrapper"
}

class NullModuleWrapper extends Module {
val io = IO(new Bundle{})
override lazy val desiredName = s"${child.desiredName}Wrapper"
println(s"My name is ${name}")
val child = Module(new ModuleWire)
}

class ModuleSpec extends ChiselPropSpec {
Expand Down Expand Up @@ -147,4 +154,8 @@ class ModuleSpec extends ChiselPropSpec {
property("A desiredName parameterized by a submodule should work") {
Driver.elaborate(() => new ModuleWrapper(new ModuleWire)).name should be ("ModuleWireWrapper")
}
property("A name generating a null pointer exception should provide a good error message") {
(the [Exception] thrownBy (Driver.elaborate(() => new NullModuleWrapper)))
.getMessage should include ("desiredName of chiselTests.NullModuleWrapper is null")
}
}

0 comments on commit f64388e

Please sign in to comment.