aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/firrtl/passes
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/scala/firrtl/passes')
-rw-r--r--src/main/scala/firrtl/passes/Inline.scala12
-rw-r--r--src/main/scala/firrtl/passes/clocklist/ClockList.scala2
-rw-r--r--src/main/scala/firrtl/passes/clocklist/ClockListTransform.scala24
-rw-r--r--src/main/scala/firrtl/passes/clocklist/ClockListUtils.scala2
-rw-r--r--src/main/scala/firrtl/passes/clocklist/RemoveAllButClocks.scala2
-rw-r--r--src/main/scala/firrtl/passes/memlib/DecorateMems.scala2
-rw-r--r--src/main/scala/firrtl/passes/memlib/InferReadWrite.scala17
-rw-r--r--src/main/scala/firrtl/passes/memlib/ReplaceMemMacros.scala20
-rw-r--r--src/main/scala/firrtl/passes/memlib/ReplaceMemTransform.scala48
-rw-r--r--src/main/scala/firrtl/passes/wiring/Wiring.scala3
-rw-r--r--src/main/scala/firrtl/passes/wiring/WiringTransform.scala56
-rw-r--r--src/main/scala/firrtl/passes/wiring/WiringUtils.scala2
12 files changed, 107 insertions, 83 deletions
diff --git a/src/main/scala/firrtl/passes/Inline.scala b/src/main/scala/firrtl/passes/Inline.scala
index 5c9d4367..002343ac 100644
--- a/src/main/scala/firrtl/passes/Inline.scala
+++ b/src/main/scala/firrtl/passes/Inline.scala
@@ -5,15 +5,19 @@ package passes
import firrtl.ir._
import firrtl.Mappers._
-import firrtl.Annotations._
+import firrtl.annotations._
// Datastructures
import scala.collection.mutable
// Tags an annotation to be consumed by this pass
-case class InlineAnnotation(target: Named) extends Annotation with Loose with Unstable {
- def duplicate(n: Named) = this.copy(target=n)
- def transform = classOf[InlineInstances]
+object InlineAnnotation {
+ def apply(target: Named): Annotation = Annotation(target, classOf[InlineInstances], "")
+
+ def unapply(a: Annotation): Option[Named] = a match {
+ case Annotation(named, t, _) if t == classOf[InlineInstances] => Some(named)
+ case _ => None
+ }
}
// Only use on legal Firrtl. Specifically, the restriction of
diff --git a/src/main/scala/firrtl/passes/clocklist/ClockList.scala b/src/main/scala/firrtl/passes/clocklist/ClockList.scala
index d0920406..231afbdd 100644
--- a/src/main/scala/firrtl/passes/clocklist/ClockList.scala
+++ b/src/main/scala/firrtl/passes/clocklist/ClockList.scala
@@ -5,7 +5,7 @@ package clocklist
import firrtl._
import firrtl.ir._
-import Annotations._
+import annotations._
import Utils.error
import java.io.{File, CharArrayWriter, PrintWriter, Writer}
import wiring.WiringUtils.{getChildrenMap, countInstances, ChildrenMap, getLineage}
diff --git a/src/main/scala/firrtl/passes/clocklist/ClockListTransform.scala b/src/main/scala/firrtl/passes/clocklist/ClockListTransform.scala
index b901e4e8..8b5a0627 100644
--- a/src/main/scala/firrtl/passes/clocklist/ClockListTransform.scala
+++ b/src/main/scala/firrtl/passes/clocklist/ClockListTransform.scala
@@ -5,7 +5,7 @@ package clocklist
import firrtl._
import firrtl.ir._
-import Annotations._
+import annotations._
import Utils.error
import java.io.{File, CharArrayWriter, PrintWriter, Writer}
import wiring.WiringUtils.{getChildrenMap, countInstances, ChildrenMap, getLineage}
@@ -16,17 +16,8 @@ import memlib.AnalysisUtils._
import memlib._
import Mappers._
-case class ClockListAnnotation(target: ModuleName, outputConfig: String)
- extends Annotation with Loose with Unstable {
- def transform = classOf[ClockListTransform]
- def duplicate(n: Named) = n match {
- case m: ModuleName => this.copy(target = m, outputConfig = outputConfig)
- case _ => error("Clocklist can only annotate a module.")
- }
-}
-
object ClockListAnnotation {
- def apply(t: String) = {
+ def apply(t: String): Annotation = {
val usage = """
[Optional] ClockList
List which signal drives each clock of every descendent of specified module
@@ -55,7 +46,16 @@ Usage:
case None =>
}
val target = ModuleName(passModule, CircuitName(passCircuit))
- new ClockListAnnotation(target, outputConfig)
+ Annotation(target, classOf[ClockListTransform], outputConfig)
+ }
+
+ def apply(target: ModuleName, outputConfig: String): Annotation =
+ Annotation(target, classOf[ClockListTransform], outputConfig)
+
+ def unapply(a: Annotation): Option[(ModuleName, String)] = a match {
+ case Annotation(ModuleName(m, c), t, outputConfig) if t == classOf[ClockListTransform] =>
+ Some((ModuleName(m, c), outputConfig))
+ case _ => None
}
}
diff --git a/src/main/scala/firrtl/passes/clocklist/ClockListUtils.scala b/src/main/scala/firrtl/passes/clocklist/ClockListUtils.scala
index 04e99d99..b81d0c7e 100644
--- a/src/main/scala/firrtl/passes/clocklist/ClockListUtils.scala
+++ b/src/main/scala/firrtl/passes/clocklist/ClockListUtils.scala
@@ -5,7 +5,7 @@ package clocklist
import firrtl._
import firrtl.ir._
-import Annotations._
+import annotations._
import Utils.error
import java.io.{File, CharArrayWriter, PrintWriter, Writer}
import wiring.WiringUtils.{getChildrenMap, countInstances, ChildrenMap, getLineage}
diff --git a/src/main/scala/firrtl/passes/clocklist/RemoveAllButClocks.scala b/src/main/scala/firrtl/passes/clocklist/RemoveAllButClocks.scala
index da1129bc..feb7f42e 100644
--- a/src/main/scala/firrtl/passes/clocklist/RemoveAllButClocks.scala
+++ b/src/main/scala/firrtl/passes/clocklist/RemoveAllButClocks.scala
@@ -5,7 +5,7 @@ package clocklist
import firrtl._
import firrtl.ir._
-import Annotations._
+import annotations._
import Utils.error
import java.io.{File, CharArrayWriter, PrintWriter, Writer}
import wiring.WiringUtils.{getChildrenMap, countInstances, ChildrenMap, getLineage}
diff --git a/src/main/scala/firrtl/passes/memlib/DecorateMems.scala b/src/main/scala/firrtl/passes/memlib/DecorateMems.scala
index d73fbc91..668bc2e5 100644
--- a/src/main/scala/firrtl/passes/memlib/DecorateMems.scala
+++ b/src/main/scala/firrtl/passes/memlib/DecorateMems.scala
@@ -4,7 +4,7 @@ package firrtl
package passes
package memlib
import ir._
-import Annotations._
+import annotations._
import wiring._
class CreateMemoryAnnotations(reader: Option[YamlFileReader]) extends Transform {
diff --git a/src/main/scala/firrtl/passes/memlib/InferReadWrite.scala b/src/main/scala/firrtl/passes/memlib/InferReadWrite.scala
index 6b56c5e8..2501ba04 100644
--- a/src/main/scala/firrtl/passes/memlib/InferReadWrite.scala
+++ b/src/main/scala/firrtl/passes/memlib/InferReadWrite.scala
@@ -11,12 +11,16 @@ import firrtl.Utils.{one, zero, BoolType}
import MemPortUtils.memPortField
import firrtl.passes.memlib.AnalysisUtils.{Connects, getConnects, getOrigin}
import WrappedExpression.weq
-import Annotations._
+import annotations._
-case class InferReadWriteAnnotation(t: String) extends Annotation with Loose with Unstable {
- val target = CircuitName(t)
- def duplicate(n: Named) = this.copy(t=n.name)
- def transform = classOf[InferReadWrite]
+object InferReadWriteAnnotation {
+ def apply(t: String) = Annotation(CircuitName(t), classOf[InferReadWrite], "")
+ def apply(target: CircuitName) = Annotation(target, classOf[InferReadWrite], "")
+ def unapply(a: Annotation): Option[(CircuitName)] = a match {
+ case Annotation(CircuitName(t), transform, "") if transform == classOf[InferReadWrite] =>
+ Some(CircuitName(t))
+ case _ => None
+ }
}
// This pass examine the enable signals of the read & write ports of memories
@@ -155,6 +159,7 @@ class InferReadWrite extends Transform with PassBased {
)
def execute(state: CircuitState): CircuitState = getMyAnnotations(state) match {
case Nil => CircuitState(state.circuit, state.form)
- case Seq(InferReadWriteAnnotation(_)) => CircuitState(runPasses(state.circuit), state.form)
+ case Seq(InferReadWriteAnnotation(CircuitName(state.circuit.main))) =>
+ CircuitState(runPasses(state.circuit), state.form)
}
}
diff --git a/src/main/scala/firrtl/passes/memlib/ReplaceMemMacros.scala b/src/main/scala/firrtl/passes/memlib/ReplaceMemMacros.scala
index 30196fad..44dad557 100644
--- a/src/main/scala/firrtl/passes/memlib/ReplaceMemMacros.scala
+++ b/src/main/scala/firrtl/passes/memlib/ReplaceMemMacros.scala
@@ -10,18 +10,17 @@ import firrtl.Mappers._
import MemPortUtils.{MemPortMap, Modules}
import MemTransformUtils._
import AnalysisUtils._
-import Annotations._
+import firrtl.annotations._
import wiring._
/** Annotates the name of the pin to add for WiringTransform
*/
-case class PinAnnotation(target: CircuitName, pins: Seq[String]) extends Annotation with Loose with Unstable {
- def transform = classOf[ReplaceMemMacros]
- def duplicate(n: Named) = n match {
- case n: CircuitName => this.copy(target = n)
- case _ => throwInternalError
+object PinAnnotation {
+ def apply(target: CircuitName, pins: Seq[String]): Annotation = {
+ Annotation(target, classOf[ReplaceMemMacros], pins.foldLeft("") { (str, p) => str + "pin:" + p + " " } )
}
+ val matcher = "pin:([^ ]+)".r
}
/** Replace DefAnnotatedMemory with memory blackbox + wrapper + conf file.
@@ -220,10 +219,11 @@ class ReplaceMemMacros(writer: ConfWriter) extends Transform {
writer.serialize()
val pins = getMyAnnotations(state) match {
case Nil => Nil
- case Seq(p) => p match {
- case PinAnnotation(c, pins) => pins
- case _ => error(s"Bad Annotation: ${p}")
- }
+ case Seq(Annotation(c, t, string)) =>
+ PinAnnotation.matcher.findAllIn(string).toSeq match {
+ case Nil => error(s"Bad Annotation: ${Annotation(c, t, string)}")
+ case seq => seq
+ }
case _ => throwInternalError
}
val annos = pins.foldLeft(Seq[Annotation]()) { (seq, pin) =>
diff --git a/src/main/scala/firrtl/passes/memlib/ReplaceMemTransform.scala b/src/main/scala/firrtl/passes/memlib/ReplaceMemTransform.scala
index 67b81160..f8f76a49 100644
--- a/src/main/scala/firrtl/passes/memlib/ReplaceMemTransform.scala
+++ b/src/main/scala/firrtl/passes/memlib/ReplaceMemTransform.scala
@@ -5,7 +5,7 @@ package memlib
import firrtl._
import firrtl.ir._
-import Annotations._
+import firrtl.annotations._
import AnalysisUtils._
import Utils.error
import java.io.{File, CharArrayWriter, PrintWriter}
@@ -64,9 +64,9 @@ class ConfWriter(filename: String) {
}
}
-case class ReplSeqMemAnnotation(t: String) extends Annotation with Loose with Unstable {
-
- val usage = """
+object ReplSeqMemAnnotation {
+ def apply(t: String): Annotation = {
+ val usage = """
[Optional] ReplSeqMem
Pass to replace sequential memories with blackboxes + configuration file
@@ -82,18 +82,29 @@ Optional Arguments:
-i<filename> Specify the input configuration file (for additional optimizations)
"""
- val passOptions = PassConfigUtil.getPassOptions(t, usage)
- val outputConfig = passOptions.getOrElse(
- OutputConfigFileName,
- error("No output config file provided for ReplSeqMem!" + usage)
- )
- val passCircuit = passOptions.getOrElse(
- PassCircuitName,
- error("No circuit name specified for ReplSeqMem!" + usage)
- )
- val target = CircuitName(passCircuit)
- def duplicate(n: Named) = this copy (t = t.replace(s"-c:$passCircuit", s"-c:${n.name}"))
- def transform = classOf[ReplSeqMem]
+ val passOptions = PassConfigUtil.getPassOptions(t, usage)
+ val outputConfig = passOptions.getOrElse(
+ OutputConfigFileName,
+ error("No output config file provided for ReplSeqMem!" + usage)
+ )
+ val inputFileName = PassConfigUtil.getPassOptions(t).getOrElse(InputConfigFileName, "")
+ val passCircuit = passOptions.getOrElse(
+ PassCircuitName,
+ error("No circuit name specified for ReplSeqMem!" + usage)
+ )
+ val target = CircuitName(passCircuit)
+ Annotation(target, classOf[ReplSeqMem], s"$inputFileName $outputConfig")
+ }
+
+ def apply(target: CircuitName, inputFileName: String, outputConfig: String): Annotation =
+ Annotation(target, classOf[ReplSeqMem], s"$inputFileName $outputConfig")
+
+ private val matcher = "([^ ]*) ([^ ]+)".r
+ def unapply(a: Annotation): Option[(CircuitName, String, String)] = a match {
+ case Annotation(CircuitName(c), t, matcher(inputFileName, outputConfig)) if t == classOf[ReplSeqMem] =>
+ Some((CircuitName(c), inputFileName, outputConfig))
+ case _ => None
+ }
}
class SimpleTransform(p: Pass, form: CircuitForm) extends Transform {
@@ -139,14 +150,13 @@ class ReplSeqMem extends Transform with SimpleRun {
getMyAnnotations(state) match {
case Nil => state.copy(annotations = None) // Do nothing if there are no annotations
case p => (p.collectFirst { case a if (a.target == CircuitName(state.circuit.main)) => a }) match {
- case Some(ReplSeqMemAnnotation(t)) =>
- val inputFileName = PassConfigUtil.getPassOptions(t).getOrElse(InputConfigFileName, "")
+ case Some(ReplSeqMemAnnotation(target, inputFileName, outputConfig)) =>
val inConfigFile = {
if (inputFileName.isEmpty) None
else if (new File(inputFileName).exists) Some(new YamlFileReader(inputFileName))
else error("Input configuration file does not exist!")
}
- val outConfigFile = new ConfWriter(PassConfigUtil.getPassOptions(t)(OutputConfigFileName))
+ val outConfigFile = new ConfWriter(outputConfig)
run(state, passSeq(inConfigFile, outConfigFile))
case _ => error("Unexpected transform annotation")
}
diff --git a/src/main/scala/firrtl/passes/wiring/Wiring.scala b/src/main/scala/firrtl/passes/wiring/Wiring.scala
index 1ced07eb..f5da4c06 100644
--- a/src/main/scala/firrtl/passes/wiring/Wiring.scala
+++ b/src/main/scala/firrtl/passes/wiring/Wiring.scala
@@ -8,7 +8,8 @@ import firrtl.ir._
import firrtl.Utils._
import firrtl.Mappers._
import scala.collection.mutable
-import firrtl.Annotations._
+import firrtl.annotations._
+import firrtl.annotations.AnnotationUtils._
import WiringUtils._
case class WiringException(msg: String) extends PassException(msg)
diff --git a/src/main/scala/firrtl/passes/wiring/WiringTransform.scala b/src/main/scala/firrtl/passes/wiring/WiringTransform.scala
index 5c251d6d..9528c0b7 100644
--- a/src/main/scala/firrtl/passes/wiring/WiringTransform.scala
+++ b/src/main/scala/firrtl/passes/wiring/WiringTransform.scala
@@ -8,37 +8,43 @@ import firrtl.ir._
import firrtl.Utils._
import firrtl.Mappers._
import scala.collection.mutable
-import firrtl.Annotations._
+import firrtl.annotations._
import WiringUtils._
/** A component, e.g. register etc. Must be declared only once under the TopAnnotation
*/
-case class SourceAnnotation(target: ComponentName, pin: String) extends Annotation with Loose with Unstable {
- def transform = classOf[WiringTransform]
- def duplicate(n: Named) = n match {
- case n: ComponentName => this.copy(target = n)
- case _ => throwInternalError
+object SourceAnnotation {
+ def apply(target: ComponentName, pin: String): Annotation = Annotation(target, classOf[WiringTransform], s"source $pin")
+
+ private val matcher = "source (.+)".r
+ def unapply(a: Annotation): Option[(ComponentName, String)] = a match {
+ case Annotation(ComponentName(n, m), _, matcher(pin)) => Some((ComponentName(n, m), pin))
+ case _ => None
}
}
/** A module, e.g. ExtModule etc., that should add the input pin
*/
-case class SinkAnnotation(target: ModuleName, pin: String) extends Annotation with Loose with Unstable {
- def transform = classOf[WiringTransform]
- def duplicate(n: Named) = n match {
- case n: ModuleName => this.copy(target = n)
- case _ => throwInternalError
+object SinkAnnotation {
+ def apply(target: ModuleName, pin: String): Annotation = Annotation(target, classOf[WiringTransform], s"sink $pin")
+
+ private val matcher = "sink (.+)".r
+ def unapply(a: Annotation): Option[(ModuleName, String)] = a match {
+ case Annotation(ModuleName(n, c), _, matcher(pin)) => Some((ModuleName(n, c), pin))
+ case _ => None
}
}
/** A module under which all sink module must be declared, and there is only
* one source component
*/
-case class TopAnnotation(target: ModuleName, pin: String) extends Annotation with Loose with Unstable {
- def transform = classOf[WiringTransform]
- def duplicate(n: Named) = n match {
- case n: ModuleName => this.copy(target = n)
- case _ => throwInternalError
+object TopAnnotation {
+ def apply(target: ModuleName, pin: String): Annotation = Annotation(target, classOf[WiringTransform], s"top $pin")
+
+ private val matcher = "top (.+)".r
+ def unapply(a: Annotation): Option[(ModuleName, String)] = a match {
+ case Annotation(ModuleName(n, c), _, matcher(pin)) => Some((ModuleName(n, c), pin))
+ case _ => None
}
}
@@ -64,20 +70,18 @@ class WiringTransform extends Transform with SimpleRun {
ResolveGenders)
def execute(state: CircuitState): CircuitState = getMyAnnotations(state) match {
case Nil => CircuitState(state.circuit, state.form)
- case p =>
- // Pin to value
+ case p =>
val sinks = mutable.HashMap[String, Set[String]]()
val sources = mutable.HashMap[String, String]()
val tops = mutable.HashMap[String, String]()
val comp = mutable.HashMap[String, String]()
- p.foreach { a =>
- a match {
- case SinkAnnotation(m, pin) => sinks(pin) = sinks.getOrElse(pin, Set.empty) + m.name
- case SourceAnnotation(c, pin) =>
- sources(pin) = c.module.name
- comp(pin) = c.name
- case TopAnnotation(m, pin) => tops(pin) = m.name
- }
+ p.foreach {
+ case SinkAnnotation(m, pin) =>
+ sinks(pin) = sinks.getOrElse(pin, Set.empty) + m.name
+ case SourceAnnotation(c, pin) =>
+ sources(pin) = c.module.name
+ comp(pin) = c.name
+ case TopAnnotation(m, pin) => tops(pin) = m.name
}
(sources.size, tops.size, sinks.size, comp.size) match {
case (0, 0, p, 0) => state.copy(annotations = None)
diff --git a/src/main/scala/firrtl/passes/wiring/WiringUtils.scala b/src/main/scala/firrtl/passes/wiring/WiringUtils.scala
index 2527ccbe..29c93ca7 100644
--- a/src/main/scala/firrtl/passes/wiring/WiringUtils.scala
+++ b/src/main/scala/firrtl/passes/wiring/WiringUtils.scala
@@ -8,7 +8,7 @@ import firrtl.ir._
import firrtl.Utils._
import firrtl.Mappers._
import scala.collection.mutable
-import firrtl.Annotations._
+import firrtl.annotations._
import WiringUtils._
/** Declaration kind in lineage (e.g. input port, output port, wire)