diff options
Diffstat (limited to 'src/main/scala/firrtl/annotations/AnnotationYamlProtocol.scala')
| -rw-r--r-- | src/main/scala/firrtl/annotations/AnnotationYamlProtocol.scala | 37 |
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)))) + } + } +} |
