diff options
Diffstat (limited to 'src/main/scala/firrtl/passes/memlib/ResolveMemoryReference.scala')
| -rw-r--r-- | src/main/scala/firrtl/passes/memlib/ResolveMemoryReference.scala | 38 |
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) +} |
