summaryrefslogtreecommitdiff
path: root/core/src/main/scala/chisel3/CompileOptions.scala
diff options
context:
space:
mode:
Diffstat (limited to 'core/src/main/scala/chisel3/CompileOptions.scala')
-rw-r--r--core/src/main/scala/chisel3/CompileOptions.scala86
1 files changed, 75 insertions, 11 deletions
diff --git a/core/src/main/scala/chisel3/CompileOptions.scala b/core/src/main/scala/chisel3/CompileOptions.scala
index db773d6e..aca00d1f 100644
--- a/core/src/main/scala/chisel3/CompileOptions.scala
+++ b/core/src/main/scala/chisel3/CompileOptions.scala
@@ -6,22 +6,37 @@ import scala.language.experimental.macros
import scala.reflect.macros.blackbox.Context
trait CompileOptions {
- // Should Record connections require a strict match of fields.
- // If true and the same fields aren't present in both source and sink, a MissingFieldException,
- // MissingLeftFieldException, or MissingRightFieldException will be thrown.
+
+ /** Should Record connections require a strict match of fields.
+ *
+ * If true and the same fields aren't present in both source and sink, a MissingFieldException,
+ * MissingLeftFieldException, or MissingRightFieldException will be thrown.
+ */
val connectFieldsMustMatch: Boolean
- // When creating an object that takes a type argument, the argument must be unbound (a pure type).
+
+ /** When creating an object that takes a type argument, the argument must be unbound (a pure type). */
val declaredTypeMustBeUnbound: Boolean
- // If a connection operator fails, don't try the connection with the operands (source and sink) reversed.
+
+ /** If a connection operator fails, don't try the connection with the operands (source and sink) reversed. */
val dontTryConnectionsSwapped: Boolean
- // If connection directionality is not explicit, do not use heuristics to attempt to determine it.
+
+ /** If connection directionality is not explicit, do not use heuristics to attempt to determine it. */
val dontAssumeDirectionality: Boolean
- // Check that referenced Data have actually been declared.
+
+ /** Check that referenced Data have actually been declared. */
val checkSynthesizable: Boolean
- // Require explicit assignment of DontCare to generate "x is invalid"
+
+ /** Require explicit assignment of DontCare to generate "x is invalid" */
val explicitInvalidate: Boolean
- // Should the reset type of Module be a Bool or a Reset
+
+ /** Should the reset type of Module be a Bool or a Reset */
val inferModuleReset: Boolean
+
+ /** If marked true, then any Module which consumes `inferModuleReset=false` must also mix in [[RequireSyncReset]] */
+ def migrateInferModuleReset: Boolean = false
+
+ /** Should connects emit as firrtl <= instead of <- */
+ def emitStrictConnects: Boolean = true
}
object CompileOptions {
@@ -36,6 +51,7 @@ object CompileOptions {
}
object ExplicitCompileOptions {
+
case class CompileOptionsClass(
// Should Record connections require a strict match of fields.
// If true and the same fields aren't present in both source and sink, a MissingFieldException,
@@ -65,7 +81,30 @@ object ExplicitCompileOptions {
checkSynthesizable = false,
explicitInvalidate = false,
inferModuleReset = false
- )
+ ) {
+ override def migrateInferModuleReset = false
+ override def emitStrictConnects = false
+ override def copy(
+ connectFieldsMustMatch: Boolean = false,
+ declaredTypeMustBeUnbound: Boolean = false,
+ dontTryConnectionsSwapped: Boolean = false,
+ dontAssumeDirectionality: Boolean = false,
+ checkSynthesizable: Boolean = false,
+ explicitInvalidate: Boolean = false,
+ inferModuleReset: Boolean = false
+ ) = new CompileOptionsClass(
+ connectFieldsMustMatch,
+ declaredTypeMustBeUnbound,
+ dontTryConnectionsSwapped,
+ dontAssumeDirectionality,
+ checkSynthesizable,
+ explicitInvalidate,
+ inferModuleReset
+ ) {
+ override def migrateInferModuleReset = false
+ override def emitStrictConnects = false
+ }
+ }
// Collection of "strict" connection compile options, preferred for new code.
implicit val Strict = new CompileOptionsClass(
@@ -76,5 +115,30 @@ object ExplicitCompileOptions {
checkSynthesizable = true,
explicitInvalidate = true,
inferModuleReset = true
- )
+ ) {
+
+ override def migrateInferModuleReset = false
+ override def emitStrictConnects = true
+
+ override def copy(
+ connectFieldsMustMatch: Boolean = true,
+ declaredTypeMustBeUnbound: Boolean = true,
+ dontTryConnectionsSwapped: Boolean = true,
+ dontAssumeDirectionality: Boolean = true,
+ checkSynthesizable: Boolean = true,
+ explicitInvalidate: Boolean = true,
+ inferModuleReset: Boolean = true
+ ) = new CompileOptionsClass(
+ connectFieldsMustMatch,
+ declaredTypeMustBeUnbound,
+ dontTryConnectionsSwapped,
+ dontAssumeDirectionality,
+ checkSynthesizable,
+ explicitInvalidate,
+ inferModuleReset
+ ) {
+ override def migrateInferModuleReset = false
+ override def emitStrictConnects = true
+ }
+ }
}