From 47fe781c4ace38dff7f31da7e78f772e131d689e Mon Sep 17 00:00:00 2001 From: Schuyler Eldridge Date: Sat, 2 Feb 2019 20:54:06 -0500 Subject: OptionsView/Viewer typeclass canonicalizations This switches the OptionsView/Viewer typeclass to use more canonical approaches and helper methods. This uses a context bound instead of an explicitly specified implicit argument. Additionally, this adds an apply method to OptionsView to enable more canonical use of the OptionsView typeclass. With this, you can now do things like `Viewer[FirrtlOptions].view` in addition to the old (and still available) `Viewer.view[FirrtlOptions]`. Uses of the latter are updated to use the former. Signed-off-by: Schuyler Eldridge --- src/main/scala/firrtl/Driver.scala | 4 ++-- src/main/scala/firrtl/options/OptionsView.scala | 9 +++++++-- .../scala/firrtl/options/phases/WriteOutputAnnotations.scala | 2 +- src/main/scala/firrtl/stage/package.scala | 2 +- src/main/scala/firrtl/stage/phases/AddImplicitOutputFile.scala | 3 +-- src/main/scala/firrtl/stage/phases/DriverCompatibility.scala | 6 +++--- src/main/scala/firrtl/stage/phases/WriteEmitted.scala | 4 ++-- 7 files changed, 17 insertions(+), 13 deletions(-) (limited to 'src') diff --git a/src/main/scala/firrtl/Driver.scala b/src/main/scala/firrtl/Driver.scala index f23be6f5..c8713e09 100644 --- a/src/main/scala/firrtl/Driver.scala +++ b/src/main/scala/firrtl/Driver.scala @@ -19,7 +19,7 @@ import firrtl.Utils.throwInternalError import firrtl.stage.{FirrtlExecutionResultView, FirrtlStage} import firrtl.stage.phases.DriverCompatibility import firrtl.options.{StageUtils, Phase} -import firrtl.options.Viewer.view +import firrtl.options.Viewer /** @@ -229,7 +229,7 @@ object Driver { case e: firrtl.options.OptionsException => return FirrtlExecutionFailure(e.message) } - view[FirrtlExecutionResult](annosx) + Viewer[FirrtlExecutionResult].view(annosx) } /** diff --git a/src/main/scala/firrtl/options/OptionsView.scala b/src/main/scala/firrtl/options/OptionsView.scala index 49417ded..4235b660 100644 --- a/src/main/scala/firrtl/options/OptionsView.scala +++ b/src/main/scala/firrtl/options/OptionsView.scala @@ -19,11 +19,16 @@ trait OptionsView[T] { /** A shim to manage multiple "views" of an [[firrtl.AnnotationSeq AnnotationSeq]] */ object Viewer { + /** Helper method to get at a given [[OptionsView]]. This enables access to [[OptionsView]] methods in a more canonical + * format, e.g., you can then do `Viewer[T].view`. + * @param a an implicit [[OptionsView]] + */ + def apply[T](implicit a: OptionsView[T]): OptionsView[T] = a + /** Convert annotations to options using an implicitly provided [[OptionsView]] * @param options some annotations - * @param optionsView a converter of options to the requested type * @tparam T the type to which the input [[firrtl.AnnotationSeq AnnotationSeq]] should be viewed as */ - def view[T](options: AnnotationSeq)(implicit optionsView: OptionsView[T]): T = optionsView.view(options) + def view[T: OptionsView](options: AnnotationSeq): T = Viewer[T].view(options) } diff --git a/src/main/scala/firrtl/options/phases/WriteOutputAnnotations.scala b/src/main/scala/firrtl/options/phases/WriteOutputAnnotations.scala index 66f40d3c..bb2a8cd6 100644 --- a/src/main/scala/firrtl/options/phases/WriteOutputAnnotations.scala +++ b/src/main/scala/firrtl/options/phases/WriteOutputAnnotations.scala @@ -15,7 +15,7 @@ class WriteOutputAnnotations extends Phase { /** Write the input [[AnnotationSeq]] to a fie. */ def transform(annotations: AnnotationSeq): AnnotationSeq = { - val sopts = Viewer.view[StageOptions](annotations) + val sopts = Viewer[StageOptions].view(annotations) val serializable = annotations.filter{ case _: Unserializable => false case _: DeletedAnnotation => sopts.writeDeleted diff --git a/src/main/scala/firrtl/stage/package.scala b/src/main/scala/firrtl/stage/package.scala index b8d49208..b4dc0b54 100644 --- a/src/main/scala/firrtl/stage/package.scala +++ b/src/main/scala/firrtl/stage/package.scala @@ -41,7 +41,7 @@ package object stage { private lazy val dummyWriteEmitted = new WriteEmitted def view(options: AnnotationSeq): FirrtlExecutionResult = { - val fopts = Viewer.view[FirrtlOptions](options) + val fopts = Viewer[FirrtlOptions].view(options) val emittedRes = options .collect{ case DeletedAnnotation(dummyWriteEmitted.name, a: EmittedAnnotation[_]) => a.value.value } .mkString("\n") diff --git a/src/main/scala/firrtl/stage/phases/AddImplicitOutputFile.scala b/src/main/scala/firrtl/stage/phases/AddImplicitOutputFile.scala index a328f2da..4b4308b6 100644 --- a/src/main/scala/firrtl/stage/phases/AddImplicitOutputFile.scala +++ b/src/main/scala/firrtl/stage/phases/AddImplicitOutputFile.scala @@ -25,8 +25,7 @@ class AddImplicitOutputFile extends Phase { annotations .collectFirst { case _: OutputFileAnnotation | _: EmitAllModulesAnnotation => annotations } .getOrElse { - val topName = Viewer - .view[FirrtlOptions](annotations) + val topName = Viewer[FirrtlOptions].view(annotations) .firrtlCircuit .map(_.main) .getOrElse("a") diff --git a/src/main/scala/firrtl/stage/phases/DriverCompatibility.scala b/src/main/scala/firrtl/stage/phases/DriverCompatibility.scala index e116dac3..310e0bd4 100644 --- a/src/main/scala/firrtl/stage/phases/DriverCompatibility.scala +++ b/src/main/scala/firrtl/stage/phases/DriverCompatibility.scala @@ -41,7 +41,7 @@ object DriverCompatibility { */ @deprecated("FirrtlExecutionResult is deprecated as part of the Stage/Phase refactor. Migrate to FirrtlStage.", "1.2") def firrtlResultView(annotations: AnnotationSeq): FirrtlExecutionResult = - Viewer.view[FirrtlExecutionResult](annotations) + Viewer[FirrtlExecutionResult].view(annotations) /** Holds the name of the top (main) module in an input circuit * @param value top module name @@ -97,7 +97,7 @@ object DriverCompatibility { * @param annotations input annotations to extract targetDir from * @return the target directory */ - private def targetDir(annotations: AnnotationSeq): String = Viewer.view[StageOptions](annotations).targetDir + private def targetDir(annotations: AnnotationSeq): String = Viewer[StageOptions].view(annotations).targetDir /** Add an implicit annotation file derived from the determined top name of the circuit if no * [[firrtl.options.InputAnnotationFileAnnotation InputAnnotationFileAnnotation]] is present. @@ -165,7 +165,7 @@ object DriverCompatibility { } else if (main.nonEmpty) { StageUtils.dramaticWarning( s"Implicit reading of the input file is deprecated! Use an explict --input-file argument.") - FirrtlFileAnnotation(Viewer.view[StageOptions](annotations).getBuildFileName(s"${main.get}.fir")) +: annotations + FirrtlFileAnnotation(Viewer[StageOptions].view(annotations).getBuildFileName(s"${main.get}.fir")) +: annotations } else { annotations } diff --git a/src/main/scala/firrtl/stage/phases/WriteEmitted.scala b/src/main/scala/firrtl/stage/phases/WriteEmitted.scala index b6d95d68..7c38ebbf 100644 --- a/src/main/scala/firrtl/stage/phases/WriteEmitted.scala +++ b/src/main/scala/firrtl/stage/phases/WriteEmitted.scala @@ -28,8 +28,8 @@ class WriteEmitted extends Phase { /** Write any [[EmittedAnnotation]]s in an [[AnnotationSeq]] to files. Written [[EmittedAnnotation]]s are deleted. */ def transform(annotations: AnnotationSeq): AnnotationSeq = { - val fopts = Viewer.view[FirrtlOptions](annotations) - val sopts = Viewer.view[StageOptions](annotations) + val fopts = Viewer[FirrtlOptions].view(annotations) + val sopts = Viewer[StageOptions].view(annotations) annotations.flatMap { case a: EmittedModuleAnnotation[_] => -- cgit v1.2.3