diff options
| author | Chick Markley | 2016-12-06 15:43:45 -0800 |
|---|---|---|
| committer | Jack Koenig | 2016-12-06 15:43:45 -0800 |
| commit | 65b61b4a614748c699982de5ab8072b21d7f9160 (patch) | |
| tree | b93fa5f8c74c562ee43e626e1296f80f7e7e4d69 /src/main/scala/firrtl/annotations/AnnotationYamlProtocol.scala | |
| parent | ef4b9e59be86bd83c6c815441cb9c8621d49c89f (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.scala | 48 |
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))) } } } |
