summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSchuyler Eldridge2018-10-25 16:27:49 -0400
committerSchuyler Eldridge2018-10-25 16:27:49 -0400
commitf64388e7cfe71004df93ddeef88447978f37ecb1 (patch)
tree3af980704f34346d4e983348a269885ffe6a8910
parent2416d1d44a2bd73bd0556437ece7a7a24d649a7a (diff)
Check BaseModule.name for NullPointerException
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 <schuyler.eldridge@ibm.com>
-rw-r--r--chiselFrontend/src/main/scala/chisel3/core/Module.scala8
-rw-r--r--src/test/scala/chiselTests/Module.scala11
2 files changed, 18 insertions, 1 deletions
diff --git a/chiselFrontend/src/main/scala/chisel3/core/Module.scala b/chiselFrontend/src/main/scala/chisel3/core/Module.scala
index 89dd2dee..3bdc86d6 100644
--- a/chiselFrontend/src/main/scala/chisel3/core/Module.scala
+++ b/chiselFrontend/src/main/scala/chisel3/core/Module.scala
@@ -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
diff --git a/src/test/scala/chiselTests/Module.scala b/src/test/scala/chiselTests/Module.scala
index dc44838a..b3d1899c 100644
--- a/src/test/scala/chiselTests/Module.scala
+++ b/src/test/scala/chiselTests/Module.scala
@@ -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 {
@@ -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")
+ }
}