Unverified Commit 8bdbbac2 authored by Schuyler Eldridge's avatar Schuyler Eldridge Committed by GitHub
Browse files

File Serialization of Annotations (#1277)



* Transform, not run in LegalizeAndReduction test

Switch from using FirrtlStage.transform to FirrtlStage.run in one
test. The latter is problematic as it doesn't include wrappers or
pre/post phases which are how things will work in the future for doing
file writing (via HowToSerialize ideas).

Signed-off-by: default avatarSchuyler Eldridge <schuyler.eldridge@ibm.com>

* Use execute in FIRRTL testing infra (not run)

Changes the FirrtlStage method in FIRRTL testing infrastructure from
"run" (which does not include Stage-global Phases) to "execute" (which
does).

Signed-off-by: default avatarSchuyler Eldridge <schuyler.eldridge@ibm.com>

* Add HowToSerialize Annotation mix-in

This adds an Annotation mix-in, HowToSerialize, that allows an
annotation to declare how it should be serialized to a file. The
mix-in is abstract in a baseFileName and a suffix (used to generate a
filename), a howToSerialize method (defining the string contents of
the file), and a howToResume method (that defines a replacement for
the file-serialized annotation that allows this to be resumed) [^1].

A default implementation for generating a filename (called filename)
is defined that will put the baseFileName+suffix file in the target
directory. This can be overridden by the annotation if desired.

[^1]: When an annotation is serialized to a file, it should be removed
from the emitted JSON-serialized annotations. The howToResume method
defines a way of adding replacement annotations to the JSON-serialized
annotations that tell a downstream tool how to find the serialized
file. E.g., if a FIRRTL circuit is written to a file, this could be
used to add a FirrtlFileAnnotation defining the location of the new
file.

Signed-off-by: default avatarSchuyler Eldridge <schuyler.eldridge@ibm.com>

* Handle HowToSerialize in WriteOutputAnnotations

This extends firrtl.options.phase.WriteOutputAnnotations to serialize
HowToSerialize annotations to files.

Signed-off-by: default avatarSchuyler Eldridge <schuyler.eldridge@ibm.com>

* Test HowToSerialize in WriteOutputAnnotationsSpec

This adds tests of the HowToSerialize mix-in inside the
WriteOutputAnnotationsSpec.

Signed-off-by: default avatarSchuyler Eldridge <schuyler.eldridge@ibm.com>

* [skip chisel tests] Migrate to HowToSerialize

This migrates EmittedAnnotations (and its children) to mixin the
HowToSerialize trait. This enables this annotations to be
automatically written to files via WriteOutputAnnotations

Signed-off-by: default avatarSchuyler Eldridge <schuyler.eldridge@ibm.com>

* Deprecated firrtl.stage.phases.WriteEmitted

Signed-off-by: default avatarSchuyler Eldridge <schuyler.eldridge@ibm.com>

* Use streams in HowToSerialize

This converts the HowToSerialize trait to use a Stream[Char] when
defining how an annotation should be serialized.

Signed-off-by: default avatarSchuyler Eldridge <schuyler.eldridge@ibm.com>

* Switch from Stream[Char] to Stream[Byte]

Signed-off-by: default avatarSchuyler Eldridge <schuyler.eldridge@ibm.com>

* Change howToSerialize method to Iterable

Change the type of the HowToSerialize.howToSerialize method from a
stream to an iterable. Using the latter (the superset of both lazy
streams and non-lazy things like String) avoids problems with users
having to choose laziness when they already have an eager object.

In effect, this makes the API more general.

Signed-off-by: default avatarSchuyler Eldridge <schuyler.eldridge@ibm.com>

* Add Scaladoc to HowToSerialize trait

Signed-off-by: default avatarSchuyler Eldridge <schuyler.eldridge@ibm.com>

* Change HowToSerialize to CustomFileEmission

Signed-off-by: default avatarSchuyler Eldridge <schuyler.eldridge@ibm.com>

* Add default implementation of replacements

Add a default implementation of CustomFileEmission.replacements.

Signed-off-by: default avatarSchuyler Eldridge <schuyler.eldridge@ibm.com>

* Avoid unnecessary 2x monad in CustomFileEmission

Change the type of CustomFileEmission.replacements from
Option[AnnotationSeq] to AnnotationSeq. The latter has all the
properties of the former that I'm trying to express here: (1) can
emptiness and (2) monadicity (if the AnnotationSeq is converted to a
sequence first). The latter property is exploited in the
WriteOutputAnnotations phase to concisely flatMap over the annotations
and doing the double-monad is unnecessary.

Signed-off-by: default avatarSchuyler Eldridge <schuyler.eldridge@ibm.com>

* Restrict CustomFileEmission filename API

Change the API of CustomFileEmission to use a final def for the actual
filename. The baseFileName is then made a method with an AnnotationSeq
parameter to allow the filename to change as a function of other
annotations, e.g., by an output circuit annotation.

By restricting this API, we have more control over the default
behavior of where things are written using the fixed behavior of the
filename method---files will always be written using the behavior that
StageOptions define. Previously, if users want customized behavior,
they would need to duplicate this StageOptions functionality (and
likely subtly deviate from the standard behavior and introduce
problems with their build).

Signed-off-by: default avatarSchuyler Eldridge <schuyler.eldridge@ibm.com>

* Add file conflict behavior for CustomFileEmission

Set behavior of file conflicts in CustomFileEmission to be the
following: No two annotations in the same annotation sequence can
serialize to the same file during the WriteOutputAnnotations phase.
However, if the output annotation file already exists, it will be
overwritten.

Signed-off-by: default avatarSchuyler Eldridge <schuyler.eldridge@ibm.com>

* Return relative path from getBuildFileName

Change FirrtlOptions.getBuildFileName to simply serialize the
underlying Java File instead of converting this to its canonical path.
This should improve the relocatability of files produced by the
CustomFileEmission API.

Signed-off-by: default avatarSchuyler Eldridge <schuyler.eldridge@ibm.com>

* Normalize paths in StageOptions.getBuildFile

Normalize paths inside the getBuildFileName utility of StageOptions.
Add a check to prevent a null pointer dereference.

Co-authored-by: default avatarJack Koenig <koenig@sifive.com>
Co-authored-by: default avatarSchuyler Eldridge <schuyler.eldridge@ibm.com>
Signed-off-by: default avatarSchuyler Eldridge <schuyler.eldridge@ibm.com>

* Refer to CustomFIleEmission in deprecation message

Co-authored-by: default avatarJack Koenig <koenig@sifive.com>
Signed-off-by: default avatarSchuyler Eldridge <schuyler.eldridge@ibm.com>

* Simplify CustomFileEmission toBytes implementation

Co-authored-by: default avatarJack Koenig <koenig@sifive.com>
Co-authored-by: default avatarSchuyler Eldridge <schuyler.eldridge@ibm.com>
Signed-off-by: default avatarSchuyler Eldridge <schuyler.eldridge@ibm.com>

* Use toBytes, not getBytes, in CustomFileEmission

Signed-off-by: default avatarSchuyler Eldridge <schuyler.eldridge@ibm.com>

Co-authored-by: default avatarJack Koenig <koenig@sifive.com>
parent f7cffd23
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment