aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/firrtl/passes/memlib/ResolveMemoryReference.scala
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/scala/firrtl/passes/memlib/ResolveMemoryReference.scala')
-rw-r--r--src/main/scala/firrtl/passes/memlib/ResolveMemoryReference.scala38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/main/scala/firrtl/passes/memlib/ResolveMemoryReference.scala b/src/main/scala/firrtl/passes/memlib/ResolveMemoryReference.scala
new file mode 100644
index 00000000..783c179f
--- /dev/null
+++ b/src/main/scala/firrtl/passes/memlib/ResolveMemoryReference.scala
@@ -0,0 +1,38 @@
+// See LICENSE for license details.
+
+package firrtl.passes
+package memlib
+import firrtl.ir._
+import AnalysisUtils.eqMems
+import firrtl.Mappers._
+
+
+/** Resolves annotation ref to memories that exactly match (except name) another memory
+ */
+object ResolveMemoryReference extends Pass {
+
+ def name = "Resolve Memory Reference"
+
+ type AnnotatedMemories = collection.mutable.ArrayBuffer[DefAnnotatedMemory]
+
+ /** If a candidate memory is identical except for name to another, add an
+ * annotation that references the name of the other memory.
+ */
+ def updateMemStmts(uniqueMems: AnnotatedMemories)(s: Statement): Statement = s match {
+ case m: DefAnnotatedMemory =>
+ uniqueMems find (x => eqMems(x, m)) match {
+ case None =>
+ uniqueMems += m
+ m
+ case Some(proto) => m copy (memRef = Some(proto.name))
+ }
+ case s => s map updateMemStmts(uniqueMems)
+ }
+
+ def updateMemMods(m: DefModule) = {
+ val uniqueMems = new AnnotatedMemories
+ (m map updateMemStmts(uniqueMems))
+ }
+
+ def run(c: Circuit) = c copy (modules = c.modules map updateMemMods)
+}