aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/firrtl/options/phases/WriteOutputAnnotations.scala
diff options
context:
space:
mode:
authorJack Koenig2021-08-20 17:08:40 -0700
committerGitHub2021-08-21 00:08:40 +0000
commitdc2fbad9d6431cb52a7ad26937a100b288b86206 (patch)
tree8ee1dd0e731629e42ce395a8484f3041d2178811 /src/main/scala/firrtl/options/phases/WriteOutputAnnotations.scala
parent762f7747bd2082c27af9cb46f5e2333df0329a56 (diff)
Add BufferedCustomFileEmission (#2334)
Uses virtual method .getBytesBuffered: Iterable[Array[Byte]] to optimize file emission.
Diffstat (limited to 'src/main/scala/firrtl/options/phases/WriteOutputAnnotations.scala')
-rw-r--r--src/main/scala/firrtl/options/phases/WriteOutputAnnotations.scala25
1 files changed, 21 insertions, 4 deletions
diff --git a/src/main/scala/firrtl/options/phases/WriteOutputAnnotations.scala b/src/main/scala/firrtl/options/phases/WriteOutputAnnotations.scala
index 0e26a5f7..2cf4c92f 100644
--- a/src/main/scala/firrtl/options/phases/WriteOutputAnnotations.scala
+++ b/src/main/scala/firrtl/options/phases/WriteOutputAnnotations.scala
@@ -4,7 +4,16 @@ package firrtl.options.phases
import firrtl.AnnotationSeq
import firrtl.annotations.{Annotation, DeletedAnnotation, JsonProtocol}
-import firrtl.options.{CustomFileEmission, Dependency, Phase, PhaseException, StageOptions, Unserializable, Viewer}
+import firrtl.options.{
+ BufferedCustomFileEmission,
+ CustomFileEmission,
+ Dependency,
+ Phase,
+ PhaseException,
+ StageOptions,
+ Unserializable,
+ Viewer
+}
import java.io.{BufferedOutputStream, File, FileOutputStream, PrintWriter}
@@ -38,9 +47,17 @@ class WriteOutputAnnotations extends Phase {
filesWritten.get(canonical) match {
case None =>
val w = new BufferedOutputStream(new FileOutputStream(filename))
- a.getBytes match {
- case arr: mutable.WrappedArray[Byte] => w.write(arr.array.asInstanceOf[Array[Byte]])
- case other => other.foreach(w.write(_))
+ a match {
+ // Further optimized emission
+ case buf: BufferedCustomFileEmission =>
+ val it = buf.getBytesBuffered
+ it.foreach(bytearr => w.write(bytearr))
+ // Regular emission
+ case _ =>
+ a.getBytes match {
+ case arr: mutable.WrappedArray[Byte] => w.write(arr.array.asInstanceOf[Array[Byte]])
+ case other => other.foreach(w.write(_))
+ }
}
w.close()
filesWritten(canonical) = a