aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/firrtl/passes/memlib
diff options
context:
space:
mode:
authorAdam Izraelevitz2016-10-27 13:00:02 -0700
committerGitHub2016-10-27 13:00:02 -0700
commit5b35f2d2722f72c81d2d6c507cd379be2a1476d8 (patch)
tree78dc2db9e12c6db52fcbf222e339a37b6ebc0b72 /src/main/scala/firrtl/passes/memlib
parent1c61a0e7102983891d99d8e9c49e331c8a2178a6 (diff)
Wiring (#348)
Added wiring pass and simple test
Diffstat (limited to 'src/main/scala/firrtl/passes/memlib')
-rw-r--r--src/main/scala/firrtl/passes/memlib/DecorateMems.scala25
-rw-r--r--src/main/scala/firrtl/passes/memlib/ReplaceMemMacros.scala27
-rw-r--r--src/main/scala/firrtl/passes/memlib/ReplaceMemTransform.scala46
-rw-r--r--src/main/scala/firrtl/passes/memlib/YamlUtils.scala10
4 files changed, 90 insertions, 18 deletions
diff --git a/src/main/scala/firrtl/passes/memlib/DecorateMems.scala b/src/main/scala/firrtl/passes/memlib/DecorateMems.scala
new file mode 100644
index 00000000..10cc8f88
--- /dev/null
+++ b/src/main/scala/firrtl/passes/memlib/DecorateMems.scala
@@ -0,0 +1,25 @@
+package firrtl
+package passes
+package memlib
+import ir._
+import Annotations._
+import wiring._
+
+class CreateMemoryAnnotations(reader: Option[YamlFileReader], replaceID: TransID, wiringID: TransID) extends Transform {
+ def name = "Create Memory Annotations"
+ def execute(c: Circuit, map: AnnotationMap): TransformResult = reader match {
+ case None => TransformResult(c)
+ case Some(r) =>
+ import CustomYAMLProtocol._
+ r.parse[Config] match {
+ case Seq(config) =>
+ val cN = CircuitName(c.main)
+ val top = TopAnnotation(ModuleName(config.top.name, cN), wiringID)
+ val source = SourceAnnotation(ComponentName(config.source.name, ModuleName(config.source.module, cN)), wiringID)
+ val pin = PinAnnotation(cN, replaceID, config.pin.name)
+ TransformResult(c, None, Some(AnnotationMap(Seq(top, source, pin))))
+ case Nil => TransformResult(c, None, None)
+ case _ => error("Can only have one config in yaml file")
+ }
+ }
+}
diff --git a/src/main/scala/firrtl/passes/memlib/ReplaceMemMacros.scala b/src/main/scala/firrtl/passes/memlib/ReplaceMemMacros.scala
index a52f7d38..9ab496d2 100644
--- a/src/main/scala/firrtl/passes/memlib/ReplaceMemMacros.scala
+++ b/src/main/scala/firrtl/passes/memlib/ReplaceMemMacros.scala
@@ -10,12 +10,24 @@ import firrtl.Mappers._
import MemPortUtils.{MemPortMap, Modules}
import MemTransformUtils._
import AnalysisUtils._
+import Annotations._
+import wiring._
+
+
+/** Annotates the name of the pin to add for WiringTransform
+ */
+case class PinAnnotation(target: CircuitName, tID: TransID, pin: String) extends Annotation with Loose with Unstable {
+ def duplicate(n: Named) = n match {
+ case n: CircuitName => this.copy(target = n)
+ case _ => throwInternalError
+ }
+}
/** Replace DefAnnotatedMemory with memory blackbox + wrapper + conf file.
* This will not generate wmask ports if not needed.
* Creates the minimum # of black boxes needed by the design.
*/
-class ReplaceMemMacros(writer: ConfWriter) extends Pass {
+class ReplaceMemMacros(writer: ConfWriter, myID: TransID, wiringID: TransID) extends Transform {
def name = "Replace Memory Macros"
/** Return true if mask granularity is per bit, false if per byte or unspecified
@@ -194,7 +206,7 @@ class ReplaceMemMacros(writer: ConfWriter) extends Pass {
map updateStmtRefs(memPortMap))
}
- def run(c: Circuit) = {
+ def execute(c: Circuit, map: AnnotationMap): TransformResult = {
val namespace = Namespace(c)
val memMods = new Modules
val nameMap = new NameMap
@@ -202,6 +214,15 @@ class ReplaceMemMacros(writer: ConfWriter) extends Pass {
val modules = c.modules map updateMemMods(namespace, nameMap, memMods)
// print conf
writer.serialize()
- c copy (modules = modules ++ memMods)
+ val pin = map get myID match {
+ case Some(p) =>
+ p.values.head match {
+ case PinAnnotation(c, _, pin) => pin
+ case _ => error(s"Bad Annotations: ${p.values}")
+ }
+ case None => "pin"
+ }
+ val annos = memMods.collect { case m: ExtModule => SinkAnnotation(ModuleName(m.name, CircuitName(c.main)), wiringID, pin) }
+ TransformResult(c.copy(modules = modules ++ memMods), None, Some(AnnotationMap(annos)))
}
}
diff --git a/src/main/scala/firrtl/passes/memlib/ReplaceMemTransform.scala b/src/main/scala/firrtl/passes/memlib/ReplaceMemTransform.scala
index dfa828c9..01f020f5 100644
--- a/src/main/scala/firrtl/passes/memlib/ReplaceMemTransform.scala
+++ b/src/main/scala/firrtl/passes/memlib/ReplaceMemTransform.scala
@@ -9,6 +9,7 @@ import Annotations._
import AnalysisUtils._
import Utils.error
import java.io.{File, CharArrayWriter, PrintWriter}
+import wiring._
sealed trait PassOption
case object InputConfigFileName extends PassOption
@@ -92,21 +93,36 @@ Optional Arguments:
def duplicate(n: Named) = this copy (t = t.replace(s"-c:$passCircuit", s"-c:${n.name}"))
}
+case class SimpleTransform(p: Pass) extends Transform {
+ def execute(c: Circuit, map: AnnotationMap): TransformResult =
+ TransformResult(p.run(c))
+}
class ReplSeqMem(transID: TransID) extends Transform with SimpleRun {
- def passSeq(inConfigFile: Option[YamlFileReader], outConfigFile: ConfWriter) =
- Seq(Legalize,
- ToMemIR,
- ResolveMaskGranularity,
- RenameAnnotatedMemoryPorts,
- ResolveMemoryReference,
- //new AnnotateValidMemConfigs(inConfigFile),
- new ReplaceMemMacros(outConfigFile),
- RemoveEmpty,
- CheckInitialization,
- InferTypes,
- Uniquify,
- ResolveKinds, // Must be run for the transform to work!
- ResolveGenders)
+ def passSeq(inConfigFile: Option[YamlFileReader], outConfigFile: ConfWriter): Seq[Transform] =
+ Seq(SimpleTransform(Legalize),
+ SimpleTransform(ToMemIR),
+ SimpleTransform(ResolveMaskGranularity),
+ SimpleTransform(RenameAnnotatedMemoryPorts),
+ SimpleTransform(ResolveMemoryReference),
+ new CreateMemoryAnnotations(inConfigFile, TransID(-7), TransID(-8)),
+ new ReplaceMemMacros(outConfigFile, TransID(-7), TransID(-8)),
+ new WiringTransform(TransID(-8)),
+ SimpleTransform(RemoveEmpty),
+ SimpleTransform(CheckInitialization),
+ SimpleTransform(InferTypes),
+ SimpleTransform(Uniquify),
+ SimpleTransform(ResolveKinds),
+ SimpleTransform(ResolveGenders))
+ def run(circuit: Circuit, map: AnnotationMap, xForms: Seq[Transform]): TransformResult = {
+ (xForms.foldLeft(TransformResult(circuit, None, Some(map)))) { case (tr: TransformResult, xForm: Transform) =>
+ val x = xForm.execute(tr.circuit, tr.annotation.get)
+ x.annotation match {
+ case None => TransformResult(x.circuit, None, Some(map))
+ case Some(ann) => TransformResult(x.circuit, None, Some(
+ AnnotationMap(ann.annotations ++ tr.annotation.get.annotations)))
+ }
+ }
+ }
def execute(c: Circuit, map: AnnotationMap) = map get transID match {
case Some(p) => p get CircuitName(c.main) match {
@@ -118,7 +134,7 @@ class ReplSeqMem(transID: TransID) extends Transform with SimpleRun {
else error("Input configuration file does not exist!")
}
val outConfigFile = new ConfWriter(PassConfigUtil.getPassOptions(t)(OutputConfigFileName))
- run(c, passSeq(inConfigFile, outConfigFile))
+ run(c, map, passSeq(inConfigFile, outConfigFile))
case _ => error("Unexpected transform annotation")
}
case _ => TransformResult(c)
diff --git a/src/main/scala/firrtl/passes/memlib/YamlUtils.scala b/src/main/scala/firrtl/passes/memlib/YamlUtils.scala
index a1088300..fcef4229 100644
--- a/src/main/scala/firrtl/passes/memlib/YamlUtils.scala
+++ b/src/main/scala/firrtl/passes/memlib/YamlUtils.scala
@@ -5,8 +5,18 @@ import java.io.{File, CharArrayWriter, PrintWriter}
object CustomYAMLProtocol extends DefaultYamlProtocol {
// bottom depends on top
+ implicit val _pin = yamlFormat1(Pin)
+ implicit val _source = yamlFormat2(Source)
+ implicit val _top = yamlFormat1(Top)
+ implicit val _configs = yamlFormat3(Config)
}
+case class Pin(name: String)
+case class Source(name: String, module: String)
+case class Top(name: String)
+case class Config(pin: Pin, source: Source, top: Top)
+
+
class YamlFileReader(file: String) {
import CustomYAMLProtocol._
def parse[A](implicit reader: YamlReader[A]) : Seq[A] = {