aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSchuyler Eldridge2019-02-02 20:54:06 -0500
committerSchuyler Eldridge2019-04-25 16:24:15 -0400
commit47fe781c4ace38dff7f31da7e78f772e131d689e (patch)
treeec4b11c4a556d7a354efbe6dcc7be51fba44e2f9 /src
parent254e7909f6c9d155f514664584f142566f0a6799 (diff)
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 <schuyler.eldridge@ibm.com>
Diffstat (limited to 'src')
-rw-r--r--src/main/scala/firrtl/Driver.scala4
-rw-r--r--src/main/scala/firrtl/options/OptionsView.scala9
-rw-r--r--src/main/scala/firrtl/options/phases/WriteOutputAnnotations.scala2
-rw-r--r--src/main/scala/firrtl/stage/package.scala2
-rw-r--r--src/main/scala/firrtl/stage/phases/AddImplicitOutputFile.scala3
-rw-r--r--src/main/scala/firrtl/stage/phases/DriverCompatibility.scala6
-rw-r--r--src/main/scala/firrtl/stage/phases/WriteEmitted.scala4
7 files changed, 17 insertions, 13 deletions
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[_] =>