aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main/scala/firrtl/Utils.scala37
-rw-r--r--src/main/scala/firrtl/WIR.scala19
-rw-r--r--src/main/scala/firrtl/package.scala23
-rw-r--r--src/main/scala/firrtl/passes/Checks.scala19
-rw-r--r--src/main/scala/firrtl/passes/Resolves.scala11
5 files changed, 104 insertions, 5 deletions
diff --git a/src/main/scala/firrtl/Utils.scala b/src/main/scala/firrtl/Utils.scala
index 45e611b2..4bf2d14d 100644
--- a/src/main/scala/firrtl/Utils.scala
+++ b/src/main/scala/firrtl/Utils.scala
@@ -492,6 +492,11 @@ object Utils extends LazyLogging {
case SourceFlow => Input
case SinkFlow => Output
}
+ @deprecated("Migrate from 'Gender' to 'Flow. This method will be removed in 1.3", "1.2")
+ def to_gender(d: Direction): Gender = d match {
+ case Input => MALE
+ case Output => FEMALE
+ }
def to_flow(d: Direction): Flow = d match {
case Input => SourceFlow
case Output => SinkFlow
@@ -548,6 +553,38 @@ object Utils extends LazyLogging {
case ex: WSubAccess => kind(ex.expr)
case ex => ExpKind
}
+ @deprecated("Migrate from 'Gender' to 'Flow'. This method will be removed in 1.3", "1.2")
+ def gender(e: Expression): Gender = e match {
+ case ex: WRef => ex.gender
+ case ex: WSubField => ex.gender
+ case ex: WSubIndex => ex.gender
+ case ex: WSubAccess => ex.gender
+ case ex: DoPrim => MALE
+ case ex: UIntLiteral => MALE
+ case ex: SIntLiteral => MALE
+ case ex: Mux => MALE
+ case ex: ValidIf => MALE
+ case WInvalid => MALE
+ case ex => throwInternalError(s"gender: shouldn't be here - $e")
+ }
+ @deprecated("Migrate from 'Gender' to 'Flow'. This method will be removed in 1.3", "1.2")
+ def get_gender(s: Statement): Gender = s match {
+ case sx: DefWire => BIGENDER
+ case sx: DefRegister => BIGENDER
+ case sx: WDefInstance => MALE
+ case sx: DefNode => MALE
+ case sx: DefInstance => MALE
+ case sx: DefMemory => MALE
+ case sx: Block => UNKNOWNGENDER
+ case sx: Connect => UNKNOWNGENDER
+ case sx: PartialConnect => UNKNOWNGENDER
+ case sx: Stop => UNKNOWNGENDER
+ case sx: Print => UNKNOWNGENDER
+ case sx: IsInvalid => UNKNOWNGENDER
+ case EmptyStmt => UNKNOWNGENDER
+ }
+ @deprecated("Migrate from 'Gender' to 'Flow'. This method will be removed in 1.3", "1.2")
+ def get_gender(p: Port): Gender = if (p.direction == Input) MALE else FEMALE
def flow(e: Expression): Flow = e match {
case ex: WRef => ex.flow
case ex: WSubField => ex.flow
diff --git a/src/main/scala/firrtl/WIR.scala b/src/main/scala/firrtl/WIR.scala
index 4d89c358..73a20d18 100644
--- a/src/main/scala/firrtl/WIR.scala
+++ b/src/main/scala/firrtl/WIR.scala
@@ -26,7 +26,18 @@ case object SinkFlow extends Flow
case object DuplexFlow extends Flow
case object UnknownFlow extends Flow
-case class WRef(name: String, tpe: Type, kind: Kind, flow: Flow) extends Expression {
+private[firrtl] trait GenderFromFlow { this: Expression =>
+ val flow: Flow
+ @deprecated("Migrate from 'Gender' to 'Flow'. This method will be removed in 1.3.", "1.2")
+ def gender: Gender = flow match {
+ case SourceFlow => MALE
+ case SinkFlow => FEMALE
+ case DuplexFlow => BIGENDER
+ case UnknownFlow => UNKNOWNGENDER
+ }
+}
+
+case class WRef(name: String, tpe: Type, kind: Kind, flow: Flow) extends Expression with GenderFromFlow {
def serialize: String = name
def mapExpr(f: Expression => Expression): Expression = this
def mapType(f: Type => Type): Expression = this.copy(tpe = f(tpe))
@@ -51,7 +62,7 @@ object WRef {
/** Creates a WRef from an arbitrary string name */
def apply(n: String, t: Type = UnknownType, k: Kind = ExpKind): WRef = new WRef(n, t, k, UnknownFlow)
}
-case class WSubField(expr: Expression, name: String, tpe: Type, flow: Flow) extends Expression {
+case class WSubField(expr: Expression, name: String, tpe: Type, flow: Flow) extends Expression with GenderFromFlow {
def serialize: String = s"${expr.serialize}.$name"
def mapExpr(f: Expression => Expression): Expression = this.copy(expr = f(expr))
def mapType(f: Type => Type): Expression = this.copy(tpe = f(tpe))
@@ -64,7 +75,7 @@ object WSubField {
def apply(expr: Expression, n: String): WSubField = new WSubField(expr, n, field_type(expr.tpe, n), UnknownFlow)
def apply(expr: Expression, name: String, tpe: Type): WSubField = new WSubField(expr, name, tpe, UnknownFlow)
}
-case class WSubIndex(expr: Expression, value: Int, tpe: Type, flow: Flow) extends Expression {
+case class WSubIndex(expr: Expression, value: Int, tpe: Type, flow: Flow) extends Expression with GenderFromFlow {
def serialize: String = s"${expr.serialize}[$value]"
def mapExpr(f: Expression => Expression): Expression = this.copy(expr = f(expr))
def mapType(f: Type => Type): Expression = this.copy(tpe = f(tpe))
@@ -73,7 +84,7 @@ case class WSubIndex(expr: Expression, value: Int, tpe: Type, flow: Flow) extend
def foreachType(f: Type => Unit): Unit = f(tpe)
def foreachWidth(f: Width => Unit): Unit = Unit
}
-case class WSubAccess(expr: Expression, index: Expression, tpe: Type, flow: Flow) extends Expression {
+case class WSubAccess(expr: Expression, index: Expression, tpe: Type, flow: Flow) extends Expression with GenderFromFlow {
def serialize: String = s"${expr.serialize}[${index.serialize}]"
def mapExpr(f: Expression => Expression): Expression = this.copy(expr = f(expr), index = f(index))
def mapType(f: Type => Type): Expression = this.copy(tpe = f(tpe))
diff --git a/src/main/scala/firrtl/package.scala b/src/main/scala/firrtl/package.scala
index eb68aef4..1e871c46 100644
--- a/src/main/scala/firrtl/package.scala
+++ b/src/main/scala/firrtl/package.scala
@@ -12,4 +12,27 @@ package object firrtl {
@deprecated("Use firrtl.stage.TargetDirAnnotation", "1.2")
val TargetDirAnnotation = firrtl.options.TargetDirAnnotation
+
+ @deprecated("Use Flow instead of Gender. This trait will be removed in 1.3", "1.2")
+ trait Gender
+
+ @deprecated("Use SourceFlow instead of MALE. This case object will be removed in 1.3", "1.2")
+ case object MALE extends Gender
+
+ @deprecated("Use SinkFlow instead of FEMALE. This case object will be removed in 1.3", "1.2")
+ case object FEMALE extends Gender
+
+ @deprecated("Use DuplexFlow instead of BIGENDER. This case object will be removed in 1.3", "1.2")
+ case object BIGENDER extends Gender
+
+ @deprecated("Use UnknownFlow instead of UNKNOWNGENDER. This case object will be removed in 1.3", "1.2")
+ case object UNKNOWNGENDER extends Gender
+
+ @deprecated("Please migrate from 'Gender' to 'Flow'. This implicit conversion will be removed in 1.3", "1.2")
+ implicit def genderToFlow(gender: Gender): Flow = gender match {
+ case MALE => SourceFlow
+ case FEMALE => SinkFlow
+ case BIGENDER => DuplexFlow
+ case UNKNOWNGENDER => UnknownFlow
+ }
}
diff --git a/src/main/scala/firrtl/passes/Checks.scala b/src/main/scala/firrtl/passes/Checks.scala
index 5f58b7f1..85ed7de0 100644
--- a/src/main/scala/firrtl/passes/Checks.scala
+++ b/src/main/scala/firrtl/passes/Checks.scala
@@ -551,7 +551,7 @@ object CheckFlows extends Pass {
case SourceFlow => "source"
case SinkFlow => "sink"
case UnknownFlow => "unknown"
- case DuplexFlow => "sourceOrSink"
+ case DuplexFlow => "duplex"
}
class WrongFlow(info:Info, mname: String, expr: String, wrong: Flow, right: Flow) extends PassException(
@@ -645,3 +645,20 @@ object CheckFlows extends Pass {
c
}
}
+
+@deprecated("Use 'CheckFlows'. This object will be removed in 1.3", "1.2")
+object CheckGenders {
+
+ implicit def toStr(g: Gender): String = g match {
+ case MALE => "source"
+ case FEMALE => "sink"
+ case UNKNOWNGENDER => "unknown"
+ case BIGENDER => "sourceOrSink"
+ }
+
+ def run(c: Circuit): Circuit = CheckFlows.run(c)
+
+ @deprecated("Use 'CheckFlows.WrongFlow'. This class will be removed in 1.3", "1.2")
+ class WrongGender(info:Info, mname: String, expr: String, wrong: Flow, right: Flow) extends PassException(
+ s"$info: [module $mname] Expression $expr is used as a $wrong but can only be used as a $right.")
+}
diff --git a/src/main/scala/firrtl/passes/Resolves.scala b/src/main/scala/firrtl/passes/Resolves.scala
index 53aac229..24dcda4a 100644
--- a/src/main/scala/firrtl/passes/Resolves.scala
+++ b/src/main/scala/firrtl/passes/Resolves.scala
@@ -77,6 +77,17 @@ object ResolveFlows extends Pass {
c copy (modules = c.modules map resolve_flow)
}
+@deprecated("Use 'ResolveFlows'. This will be removed in 1.3", "1.2")
+object ResolveGenders {
+
+ def run(c: Circuit): Circuit = ResolveFlows.run(c)
+
+ def resolve_e(g: Gender)(e: Expression): Expression = ResolveFlows.resolve_e(g)(e)
+
+ def resolve_s(s: Statement): Statement = ResolveFlows.resolve_s(s)
+
+}
+
object CInferMDir extends Pass {
type MPortDirMap = collection.mutable.LinkedHashMap[String, MPortDir]