aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJack Koenig2020-09-05 20:00:35 -0700
committerGitHub2020-09-06 03:00:35 +0000
commitb6de1491af7ba88bb778aaeeba369b6b87151f9e (patch)
treef99e6408ff24995e10273537f7db9048bb2ff8e9 /src
parent47c81ee3e68c96e94dafa389cb53b162e996a4df (diff)
Support binary files in CustomFileEmission (#1887)
Diffstat (limited to 'src')
-rw-r--r--src/main/scala/firrtl/options/phases/WriteOutputAnnotations.scala4
-rw-r--r--src/test/scala/firrtlTests/options/phases/WriteOutputAnnotationsSpec.scala31
2 files changed, 33 insertions, 2 deletions
diff --git a/src/main/scala/firrtl/options/phases/WriteOutputAnnotations.scala b/src/main/scala/firrtl/options/phases/WriteOutputAnnotations.scala
index 53306c8a..e9a39c67 100644
--- a/src/main/scala/firrtl/options/phases/WriteOutputAnnotations.scala
+++ b/src/main/scala/firrtl/options/phases/WriteOutputAnnotations.scala
@@ -6,7 +6,7 @@ import firrtl.AnnotationSeq
import firrtl.annotations.{Annotation, DeletedAnnotation, JsonProtocol}
import firrtl.options.{CustomFileEmission, Dependency, Phase, PhaseException, StageOptions, Unserializable, Viewer}
-import java.io.{BufferedWriter, File, FileWriter, PrintWriter}
+import java.io.{File, FileOutputStream, PrintWriter}
import scala.collection.mutable
@@ -37,7 +37,7 @@ class WriteOutputAnnotations extends Phase {
filesWritten.get(canonical) match {
case None =>
- val w = new BufferedWriter(new FileWriter(filename))
+ val w = new FileOutputStream(filename)
a.getBytes.foreach(w.write(_))
w.close()
filesWritten(canonical) = a
diff --git a/src/test/scala/firrtlTests/options/phases/WriteOutputAnnotationsSpec.scala b/src/test/scala/firrtlTests/options/phases/WriteOutputAnnotationsSpec.scala
index 4fe16041..9e58585c 100644
--- a/src/test/scala/firrtlTests/options/phases/WriteOutputAnnotationsSpec.scala
+++ b/src/test/scala/firrtlTests/options/phases/WriteOutputAnnotationsSpec.scala
@@ -142,6 +142,28 @@ class WriteOutputAnnotationsSpec extends AnyFlatSpec with Matchers with firrtl.t
new File(serializedFileName) should (exist)
}
+ it should "support CustomFileEmission to binary files" in new Fixture {
+ val file = new File("write-CustomFileEmission-binary-files.anno.json")
+ val data = Array[Byte](0x0a, 0xa0.toByte)
+ val annotations = Seq(
+ TargetDirAnnotation(dir),
+ OutputAnnotationFileAnnotation(file.toString),
+ WriteOutputAnnotationsSpec.Binary(data)
+ )
+
+ val serializedFileName = view[StageOptions](annotations).getBuildFileName("Binary", Some(".Emission"))
+ val out = phase.transform(annotations)
+
+ info(s"file '$serializedFileName' exists")
+ new File(serializedFileName) should (exist)
+
+ info(s"file '$serializedFileName' is correct")
+ val inputStream = new java.io.FileInputStream(serializedFileName)
+ val result = new Array[Byte](2)
+ inputStream.read(result)
+ result should equal(data)
+ }
+
it should "error if multiple annotations try to write to the same file" in new Fixture {
val file = new File("write-CustomFileEmission-annotations-error.anno.json")
val annotations = Seq(
@@ -175,6 +197,15 @@ private object WriteOutputAnnotationsSpec {
}
+ case class Binary(value: Array[Byte]) extends NoTargetAnnotation with CustomFileEmission {
+
+ override protected def baseFileName(a: AnnotationSeq): String = "Binary"
+
+ override protected def suffix: Option[String] = Some(".Emission")
+
+ override def getBytes: Iterable[Byte] = value
+ }
+
case class Replacement(file: String) extends NoTargetAnnotation
}