summaryrefslogtreecommitdiff
path: root/chiselFrontend/src/main/scala
diff options
context:
space:
mode:
Diffstat (limited to 'chiselFrontend/src/main/scala')
-rw-r--r--chiselFrontend/src/main/scala/chisel3/core/Aggregate.scala2
-rw-r--r--chiselFrontend/src/main/scala/chisel3/core/Data.scala45
-rw-r--r--chiselFrontend/src/main/scala/chisel3/core/MonoConnect.scala1
-rw-r--r--chiselFrontend/src/main/scala/chisel3/internal/CompileOptions.scala1
4 files changed, 42 insertions, 7 deletions
diff --git a/chiselFrontend/src/main/scala/chisel3/core/Aggregate.scala b/chiselFrontend/src/main/scala/chisel3/core/Aggregate.scala
index 12ae7e6b..03c84827 100644
--- a/chiselFrontend/src/main/scala/chisel3/core/Aggregate.scala
+++ b/chiselFrontend/src/main/scala/chisel3/core/Aggregate.scala
@@ -346,7 +346,7 @@ class Bundle extends Aggregate {
}
private[chisel3] def toType = {
def eltPort(elt: Data): String = {
- val flipStr: String = if(Data.isFlipped(elt)) "flip " else ""
+ val flipStr: String = if(Data.isFirrtlFlipped(elt)) "flip " else ""
s"${flipStr}${elt.getRef.name} : ${elt.toType}"
}
s"{${namedElts.reverse.map(e => eltPort(e._2)).mkString(", ")}}"
diff --git a/chiselFrontend/src/main/scala/chisel3/core/Data.scala b/chiselFrontend/src/main/scala/chisel3/core/Data.scala
index bf68773f..cb6d427d 100644
--- a/chiselFrontend/src/main/scala/chisel3/core/Data.scala
+++ b/chiselFrontend/src/main/scala/chisel3/core/Data.scala
@@ -16,7 +16,7 @@ sealed abstract class Direction(name: String) {
object Direction {
object Input extends Direction("input") { override def flip: Direction = Output }
object Output extends Direction("output") { override def flip: Direction = Input }
- object Unspecified extends Direction("unspecified") { override def flip: Direction = Unspecified }
+ object Unspecified extends Direction("unspecified") { override def flip: Direction = Input }
}
@deprecated("debug doesn't do anything in Chisel3 as no pruning happens in the frontend", "chisel3")
@@ -38,16 +38,22 @@ object DataMirror {
* Thus, an error will be thrown if these are used on bound Data
*/
object Input {
- def apply[T<:Data](target: T): T =
+ def apply[T<:Data](target: T): T = {
+ Data.setFirrtlDirection(target, Direction.Input)
Binding.bind(target, InputBinder, "Error: Cannot set as input ")
+ }
}
object Output {
- def apply[T<:Data](target: T): T =
+ def apply[T<:Data](target: T): T = {
+ Data.setFirrtlDirection(target, Direction.Output)
Binding.bind(target, OutputBinder, "Error: Cannot set as output ")
+ }
}
object Flipped {
- def apply[T<:Data](target: T): T =
+ def apply[T<:Data](target: T): T = {
+ Data.setFirrtlDirection(target, Data.getFirrtlDirection(target).flip)
Binding.bind(target, FlippedBinder, "Error: Cannot flip ")
+ }
}
object Data {
@@ -69,6 +75,32 @@ object Data {
case (bundle: Bundle) => false
}
+ /** This function returns the "firrtl" flipped-ness for the specified object.
+ *
+ * @param target the object for which we want the "firrtl" flipped-ness.
+ */
+ private[chisel3] def isFirrtlFlipped(target: Data): Boolean = {
+ Data.getFirrtlDirection(target) == Direction.Input
+ }
+
+ /** This function gets the "firrtl" direction for the specified object.
+ *
+ * @param target the object for which we want to get the "firrtl" direction.
+ */
+ private[chisel3] def getFirrtlDirection(target: Data): Direction = target match {
+ case (vec: Vec[Data @unchecked]) => vec.sample_element.firrtlDirection
+ case _ => target.firrtlDirection
+ }
+
+ /** This function sets the "firrtl" direction for the specified object.
+ *
+ * @param target the object for which we want to set the "firrtl" direction.
+ */
+ private[chisel3] def setFirrtlDirection(target: Data, direction: Direction): Unit = target match {
+ case (vec: Vec[Data @unchecked]) => vec.sample_element.firrtlDirection = direction
+ case _ => target.firrtlDirection = direction
+ }
+
implicit class AddDirectionToData[T<:Data](val target: T) extends AnyVal {
@deprecated("Input(Data) should be used over Data.asInput", "gchisel")
def asInput: T = Input(target)
@@ -125,6 +157,7 @@ abstract class Data extends HasId {
def chiselCloneType: this.type = {
// Call the user-supplied cloneType method
val clone = this.cloneType
+ Data.setFirrtlDirection(clone, Data.getFirrtlDirection(this))
//TODO(twigg): Do recursively for better error messages
for((clone_elem, source_elem) <- clone.allElements zip this.allElements) {
clone_elem.binding = UnboundBinding(source_elem.binding.direction)
@@ -202,6 +235,10 @@ abstract class Data extends HasId {
def do_asUInt(implicit sourceInfo: SourceInfo): UInt =
SeqUtils.do_asUInt(this.flatten)(sourceInfo)
+
+ // firrtlDirection is the direction we report to firrtl.
+ // It maintains the user-specified value (as opposed to the "actual" or applied/propagated value).
+ var firrtlDirection: Direction = Direction.Unspecified
}
object Wire {
diff --git a/chiselFrontend/src/main/scala/chisel3/core/MonoConnect.scala b/chiselFrontend/src/main/scala/chisel3/core/MonoConnect.scala
index e0c95e80..4ba921fa 100644
--- a/chiselFrontend/src/main/scala/chisel3/core/MonoConnect.scala
+++ b/chiselFrontend/src/main/scala/chisel3/core/MonoConnect.scala
@@ -118,7 +118,6 @@ object MonoConnect {
// CURRENT MOD CURRENT MOD
case (Some(Output), _) => issueConnect(sink, source)
case (None, _) => issueConnect(sink, source)
- case (_, None) if (compileOptions.internalConnectionToInputOk) => issueConnect(sink, source)
case (Some(Input), _) => throw UnwritableSinkException
}
}
diff --git a/chiselFrontend/src/main/scala/chisel3/internal/CompileOptions.scala b/chiselFrontend/src/main/scala/chisel3/internal/CompileOptions.scala
index 93879950..e040201b 100644
--- a/chiselFrontend/src/main/scala/chisel3/internal/CompileOptions.scala
+++ b/chiselFrontend/src/main/scala/chisel3/internal/CompileOptions.scala
@@ -17,7 +17,6 @@ class CompileOptions(optionsMap: Map[String, String]) {
val regTypeMustBeUnbound: Boolean = optionsMap.getOrElse("regTypeMustBeUnbound", strictDefault).toBoolean
val autoIOWrap: Boolean = optionsMap.getOrElse("autoIOWrap", looseDefault).toBoolean
val portDeterminesDirection: Boolean = optionsMap.getOrElse("portDeterminesDirection", looseDefault).toBoolean
- val internalConnectionToInputOk: Boolean = optionsMap.getOrElse("internalConnectionToInputOk", looseDefault).toBoolean
val tryConnectionsSwapped: Boolean = optionsMap.getOrElse("tryConnectionsSwapped", looseDefault).toBoolean
val assumeLHSIsOutput: Boolean = optionsMap.getOrElse("assumeLHSIsOutput", looseDefault).toBoolean
}