aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/firrtl/annotations/AnnotationYamlProtocol.scala
diff options
context:
space:
mode:
authorChick Markley2016-12-06 15:43:45 -0800
committerJack Koenig2016-12-06 15:43:45 -0800
commit65b61b4a614748c699982de5ab8072b21d7f9160 (patch)
treeb93fa5f8c74c562ee43e626e1296f80f7e7e4d69 /src/main/scala/firrtl/annotations/AnnotationYamlProtocol.scala
parentef4b9e59be86bd83c6c815441cb9c8621d49c89f (diff)
Fixes for Annotation serialized/deserialize (#390)
* Fixes for Annotation serialized/deserialize Made serializer agree with deserializer on text representation Re-ordered serializations of Named subclasses to be C or C.m or C.m.c where C=circuit, m=module, c=component Note: component may contain dots Added serialize deserialize tests to AnnotationSpec Did some style cleanup on AnnotationSpec Added explicit return tupe on SimpleTransformSpec#execute * Make explicit Util.error remove commented code * Make Annotation#serialize a nicer format fix import there and remove new on case class * In firrtl Driver.execute use annotations passed in through optionsManager#firrtlOptions if nonEmpty otherwise read the annotations in from an annotations file Add new option to override this behavior, --force-append-anno-file will append annotations in file to any that are passed in A few other style fixes to Driver: remove new with case classes. don't use match when if(boolean) will do * Added tests of malformed component and circuit names
Diffstat (limited to 'src/main/scala/firrtl/annotations/AnnotationYamlProtocol.scala')
-rw-r--r--src/main/scala/firrtl/annotations/AnnotationYamlProtocol.scala48
1 files changed, 29 insertions, 19 deletions
diff --git a/src/main/scala/firrtl/annotations/AnnotationYamlProtocol.scala b/src/main/scala/firrtl/annotations/AnnotationYamlProtocol.scala
index 5da00282..9018d494 100644
--- a/src/main/scala/firrtl/annotations/AnnotationYamlProtocol.scala
+++ b/src/main/scala/firrtl/annotations/AnnotationYamlProtocol.scala
@@ -8,30 +8,40 @@ 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 write(a: Annotation) = YamlObject(
+ YamlString("targetString") -> YamlString(a.targetString),
+ YamlString("transformClass") -> YamlString(a.transformClass),
+ YamlString("value") -> 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 read(yamlValue: YamlValue): Annotation = {
+ try {
+ yamlValue.asYamlObject.getFields(
+ YamlString("targetString"),
+ YamlString("transformClass"),
+ YamlString("value")) match {
+ case Seq(YamlString(targetString), YamlString(transformClass), YamlString(value)) =>
+ Annotation(
+ toTarget(targetString), Class.forName(transformClass).asInstanceOf[Class[_ <: Transform]], value)
+ case _ => deserializationError("Annotation expected")
+ }
+ }
+ catch {
+ case annotationException: AnnotationException =>
+ Utils.error(
+ s"Error: ${annotationException.getMessage} while parsing annotation from yaml\n${yamlValue.prettyPrint}")
+ case annotationException: FIRRTLException =>
+ Utils.error(
+ s"Error: ${annotationException.getMessage} while parsing annotation from yaml\n${yamlValue.prettyPrint}")
}
}
- def toTarget(string: String) = string.split('.').toSeq match {
+ def toTarget(string: String): Named = string.split("""\.""", -1).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))))
+ case Nil => Utils.error("BAD")
+ case s =>
+ val componentString = s.drop(2).mkString(".")
+ ComponentName(componentString, ModuleName(s.tail.head, CircuitName(s.head)))
}
}
}