aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/firrtl/passes/memlib/ToMemIR.scala
diff options
context:
space:
mode:
authorAdam Izraelevitz2016-10-17 18:53:19 -0700
committerAngie Wang2016-10-17 18:53:19 -0700
commit85baeda249e59c7d9d9f159aaf29ff46d685cf02 (patch)
treecfb5f4a6a0a80f9033275de6e5e36b9d5b96faad /src/main/scala/firrtl/passes/memlib/ToMemIR.scala
parent7d08b9a1486fef0459481f6e542464a29fbe1db5 (diff)
Reorganized memory blackboxing (#336)
* Reorganized memory blackboxing Moved to new package memlib Added comments Moved utility functions around Removed unused AnnotateValidMemConfigs.scala * Fixed tests to pass * Use DefAnnotatedMemory instead of AppendableInfo * Broke passes up into simpler passes AnnotateMemMacros -> (ToMemIR, ResolveMaskGranularity) UpdateDuplicateMemMacros -> (RenameAnnotatedMemoryPorts, ResolveMemoryReference) * Fixed to make tests run * Minor changes from code review * Removed vim comments and renamed ReplSeqMem
Diffstat (limited to 'src/main/scala/firrtl/passes/memlib/ToMemIR.scala')
-rw-r--r--src/main/scala/firrtl/passes/memlib/ToMemIR.scala41
1 files changed, 41 insertions, 0 deletions
diff --git a/src/main/scala/firrtl/passes/memlib/ToMemIR.scala b/src/main/scala/firrtl/passes/memlib/ToMemIR.scala
new file mode 100644
index 00000000..741ea5ef
--- /dev/null
+++ b/src/main/scala/firrtl/passes/memlib/ToMemIR.scala
@@ -0,0 +1,41 @@
+package firrtl.passes
+package memlib
+
+import firrtl.Mappers._
+import firrtl.ir._
+
+/** Annotates sequential memories that are candidates for macro replacement.
+ * Requirements for macro replacement:
+ * - read latency and write latency of one
+ * - only one readwrite port or write port
+ * - zero or one read port
+ */
+object ToMemIR extends Pass {
+ def name = "To Memory IR"
+
+ /** Only annotate memories that are candidates for memory macro replacements
+ * i.e. rw, w + r (read, write 1 cycle delay)
+ */
+ def updateStmts(s: Statement): Statement = s match {
+ case m: DefMemory if m.readLatency == 1 && m.writeLatency == 1 &&
+ (m.writers.length + m.readwriters.length) == 1 && m.readers.length <= 1 =>
+ DefAnnotatedMemory(
+ m.info,
+ m.name,
+ m.dataType,
+ m.depth,
+ m.writeLatency,
+ m.readLatency,
+ m.readers,
+ m.writers,
+ m.readwriters,
+ m.readUnderWrite,
+ None, // mask granularity annotation
+ None // No reference yet to another memory
+ )
+ case sx => sx map updateStmts
+ }
+
+ def annotateModMems(m: DefModule) = m map updateStmts
+ def run(c: Circuit) = c copy (modules = c.modules map annotateModMems)
+}