aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/firrtl/annotations/AnnotationYamlProtocol.scala
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/scala/firrtl/annotations/AnnotationYamlProtocol.scala')
-rw-r--r--src/main/scala/firrtl/annotations/AnnotationYamlProtocol.scala37
1 files changed, 37 insertions, 0 deletions
diff --git a/src/main/scala/firrtl/annotations/AnnotationYamlProtocol.scala b/src/main/scala/firrtl/annotations/AnnotationYamlProtocol.scala
new file mode 100644
index 00000000..5da00282
--- /dev/null
+++ b/src/main/scala/firrtl/annotations/AnnotationYamlProtocol.scala
@@ -0,0 +1,37 @@
+// See LICENSE for license details.
+
+package firrtl
+package annotations
+
+import net.jcazevedo.moultingyaml._
+
+object AnnotationYamlProtocol extends DefaultYamlProtocol {
+ // bottom depends on top
+ implicit object AnnotationYamlFormat extends YamlFormat[Annotation] {
+ def write(a: Annotation) =
+ YamlArray(
+ YamlString(a.targetString),
+ YamlString(a.transformClass),
+ YamlString(a.value))
+
+ def read(value: YamlValue) = {
+ value.asYamlObject.getFields(
+ YamlString("targetString"),
+ YamlString("transformClass"),
+ YamlString("value")) match {
+ case Seq(
+ YamlString(targetString),
+ YamlString(transformClass),
+ YamlString(value)) =>
+ new Annotation(toTarget(targetString), Class.forName(transformClass).asInstanceOf[Class[_ <: Transform]], value)
+ case _ => deserializationError("Color expected")
+ }
+ }
+ def toTarget(string: String) = string.split('.').toSeq match {
+ case Seq(c) => CircuitName(c)
+ case Seq(c, m) => ModuleName(m, CircuitName(c))
+ case Nil => error("BAD")
+ case s => ComponentName(s.drop(2).mkString("."), ModuleName(s(1), CircuitName(s(0))))
+ }
+ }
+}