aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
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
}