aboutsummaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
authorAlbert Magyar2020-03-09 20:02:06 -0700
committerAlbert Magyar2020-03-16 10:24:52 -0700
commite41936d5283ba8caae2a23602e8e1a2baea391cb (patch)
tree19e29be01e09822c44473d3184277ed24b3158f9 /src/main
parentb3d4654935db38990d6cc4976eed7ddc14cf60fd (diff)
Check for collision of defnames with Module names
* Fixes #1096
Diffstat (limited to 'src/main')
-rw-r--r--src/main/scala/firrtl/passes/Checks.scala9
1 files changed, 9 insertions, 0 deletions
diff --git a/src/main/scala/firrtl/passes/Checks.scala b/src/main/scala/firrtl/passes/Checks.scala
index 8717ffec..3c9a7eda 100644
--- a/src/main/scala/firrtl/passes/Checks.scala
+++ b/src/main/scala/firrtl/passes/Checks.scala
@@ -35,6 +35,8 @@ trait CheckHighFormLike { this: Pass =>
s"$info: [module $mname] Invalid access to non-reference.")
class ModuleNameNotUniqueException(info: Info, mname: String) extends PassException(
s"$info: Repeat definition of module $mname")
+ class DefnameConflictException(info: Info, mname: String, defname: String) extends PassException(
+ s"$info: defname $defname of extmodule $mname conflicts with an existing module")
class ModuleNotDefinedException(info: Info, mname: String, name: String) extends PassException(
s"$info: Module $name is not defined.")
class IncorrectNumArgsException(info: Info, mname: String, op: String, n: Int) extends PassException(
@@ -75,10 +77,17 @@ trait CheckHighFormLike { this: Pass =>
val moduleGraph = new ModuleGraph
val moduleNames = (c.modules map (_.name)).toSet
+ val intModuleNames = c.modules.view.collect({ case m: Module => m.name }).toSet
+
c.modules.view.groupBy(_.name).filter(_._2.length > 1).flatMap(_._2).foreach {
m => errors.append(new ModuleNameNotUniqueException(m.info, m.name))
}
+ c.modules.collect {
+ case ExtModule(info, name, _, defname, _) if (intModuleNames.contains(defname)) =>
+ errors.append(new DefnameConflictException(info, name, defname))
+ }
+
def checkHighFormPrimop(info: Info, mname: String, e: DoPrim): Unit = {
def correctNum(ne: Option[Int], nc: Int): Unit = {
ne match {