aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/firrtl/annotations/TargetToken.scala
diff options
context:
space:
mode:
authorAdam Izraelevitz2018-10-24 20:40:27 -0700
committerGitHub2018-10-24 20:40:27 -0700
commit7e2f787e125227dc389d5cf1d09717748ecfed2e (patch)
tree2c654726a5c9850440792cf673e91ed01e0bdfe4 /src/main/scala/firrtl/annotations/TargetToken.scala
parentf2c50e11c0e1ff3ed7b8ca3ae3d2d3b16f157453 (diff)
Instance Annotations (#865)
Added Target, which now supports Instance Annotations. See #865 for details.
Diffstat (limited to 'src/main/scala/firrtl/annotations/TargetToken.scala')
-rw-r--r--src/main/scala/firrtl/annotations/TargetToken.scala46
1 files changed, 46 insertions, 0 deletions
diff --git a/src/main/scala/firrtl/annotations/TargetToken.scala b/src/main/scala/firrtl/annotations/TargetToken.scala
new file mode 100644
index 00000000..587f30eb
--- /dev/null
+++ b/src/main/scala/firrtl/annotations/TargetToken.scala
@@ -0,0 +1,46 @@
+// See LICENSE for license details.
+
+package firrtl.annotations
+
+/** Building block to represent a [[Target]] of a FIRRTL component */
+sealed trait TargetToken {
+ def keyword: String
+ def value: Any
+
+ /** Returns whether this token is one of the type of tokens whose keyword is passed as an argument
+ * @param keywords
+ * @return
+ */
+ def is(keywords: String*): Boolean = {
+ keywords.map { kw =>
+ require(TargetToken.keyword2targettoken.keySet.contains(kw),
+ s"Keyword $kw must be in set ${TargetToken.keyword2targettoken.keys}")
+ val lastClass = this.getClass
+ lastClass == TargetToken.keyword2targettoken(kw)("0").getClass
+ }.reduce(_ || _)
+ }
+}
+
+/** Object containing all [[TargetToken]] subclasses */
+case object TargetToken {
+ case class Instance(value: String) extends TargetToken { override def keyword: String = "inst" }
+ case class OfModule(value: String) extends TargetToken { override def keyword: String = "of" }
+ case class Ref(value: String) extends TargetToken { override def keyword: String = "ref" }
+ case class Index(value: Int) extends TargetToken { override def keyword: String = "[]" }
+ case class Field(value: String) extends TargetToken { override def keyword: String = "." }
+ case object Clock extends TargetToken { override def keyword: String = "clock"; val value = "" }
+ case object Init extends TargetToken { override def keyword: String = "init"; val value = "" }
+ case object Reset extends TargetToken { override def keyword: String = "reset"; val value = "" }
+
+ val keyword2targettoken = Map(
+ "inst" -> ((value: String) => Instance(value)),
+ "of" -> ((value: String) => OfModule(value)),
+ "ref" -> ((value: String) => Ref(value)),
+ "[]" -> ((value: String) => Index(value.toInt)),
+ "." -> ((value: String) => Field(value)),
+ "clock" -> ((value: String) => Clock),
+ "init" -> ((value: String) => Init),
+ "reset" -> ((value: String) => Reset)
+ )
+}
+