From dc2fbad9d6431cb52a7ad26937a100b288b86206 Mon Sep 17 00:00:00 2001 From: Jack Koenig Date: Fri, 20 Aug 2021 17:08:40 -0700 Subject: Add BufferedCustomFileEmission (#2334) Uses virtual method .getBytesBuffered: Iterable[Array[Byte]] to optimize file emission.--- .../options/phases/WriteOutputAnnotations.scala | 25 ++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) (limited to 'src/main/scala/firrtl/options/phases/WriteOutputAnnotations.scala') 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 -- cgit v1.2.3