summaryrefslogtreecommitdiff
path: root/plugin
diff options
context:
space:
mode:
Diffstat (limited to 'plugin')
-rw-r--r--plugin/src/main/scala-2.12/chisel3/internal/plugin/BundleComponent.scala15
-rw-r--r--plugin/src/main/scala-2.12/chisel3/internal/plugin/ChiselPlugin.scala21
2 files changed, 33 insertions, 3 deletions
diff --git a/plugin/src/main/scala-2.12/chisel3/internal/plugin/BundleComponent.scala b/plugin/src/main/scala-2.12/chisel3/internal/plugin/BundleComponent.scala
index 0711e08c..96851e95 100644
--- a/plugin/src/main/scala-2.12/chisel3/internal/plugin/BundleComponent.scala
+++ b/plugin/src/main/scala-2.12/chisel3/internal/plugin/BundleComponent.scala
@@ -10,7 +10,9 @@ import scala.tools.nsc.symtab.Flags
import scala.tools.nsc.transform.TypingTransformers
// TODO This component could also implement val elements in Bundles
-private[plugin] class BundleComponent(val global: Global) extends PluginComponent with TypingTransformers {
+private[plugin] class BundleComponent(val global: Global, arguments: ChiselPluginArguments)
+ extends PluginComponent
+ with TypingTransformers {
import global._
val phaseName: String = "chiselbundlephase"
@@ -23,8 +25,17 @@ private[plugin] class BundleComponent(val global: Global) extends PluginComponen
// This plugin doesn't work on Scala 2.11 nor Scala 3. Rather than complicate the sbt build flow,
// instead we just check the version and if its an early Scala version, the plugin does nothing
val scalaVersion = scala.util.Properties.versionNumberString.split('.')
- if (scalaVersion(0).toInt == 2 && scalaVersion(1).toInt >= 12) {
+ val scalaVersionOk = scalaVersion(0).toInt == 2 && scalaVersion(1).toInt >= 12
+ if (scalaVersionOk && arguments.useBundlePlugin) {
unit.body = new MyTypingTransformer(unit).transform(unit.body)
+ } else {
+ val reason = if (!scalaVersionOk) {
+ s"invalid Scala version '${scala.util.Properties.versionNumberString}'"
+ } else {
+ s"not enabled via '${arguments.useBundlePluginFullOpt}'"
+ }
+ // Enable this with scalacOption '-Ylog:chiselbundlephase'
+ global.log(s"Skipping BundleComponent on account of $reason.")
}
}
}
diff --git a/plugin/src/main/scala-2.12/chisel3/internal/plugin/ChiselPlugin.scala b/plugin/src/main/scala-2.12/chisel3/internal/plugin/ChiselPlugin.scala
index d5eb21cc..a0651e1d 100644
--- a/plugin/src/main/scala-2.12/chisel3/internal/plugin/ChiselPlugin.scala
+++ b/plugin/src/main/scala-2.12/chisel3/internal/plugin/ChiselPlugin.scala
@@ -6,13 +6,32 @@ import scala.tools.nsc
import nsc.Global
import nsc.plugins.{Plugin, PluginComponent}
+private[plugin] case class ChiselPluginArguments(var useBundlePlugin: Boolean = false) {
+ def useBundlePluginOpt = "useBundlePlugin"
+ def useBundlePluginFullOpt = s"-P:chiselplugin:$useBundlePluginOpt"
+}
+
// The plugin to be run by the Scala compiler during compilation of Chisel code
class ChiselPlugin(val global: Global) extends Plugin {
val name = "chiselplugin"
val description = "Plugin for Chisel 3 Hardware Description Language"
+ private val arguments = ChiselPluginArguments()
val components: List[PluginComponent] = List[PluginComponent](
new ChiselComponent(global),
- new BundleComponent(global)
+ new BundleComponent(global, arguments)
)
+
+ override def init(options: List[String], error: String => Unit): Boolean = {
+ for (option <- options) {
+ if (option == arguments.useBundlePluginOpt) {
+ arguments.useBundlePlugin = true
+ } else {
+ error(s"Option not understood: '$option'")
+ }
+ }
+ true
+ }
+
+
}