diff options
| author | Jack Koenig | 2021-08-20 17:08:40 -0700 |
|---|---|---|
| committer | GitHub | 2021-08-21 00:08:40 +0000 |
| commit | dc2fbad9d6431cb52a7ad26937a100b288b86206 (patch) | |
| tree | 8ee1dd0e731629e42ce395a8484f3041d2178811 /src/main/scala/firrtl/options/phases/WriteOutputAnnotations.scala | |
| parent | 762f7747bd2082c27af9cb46f5e2333df0329a56 (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.scala | 25 |
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 |
