diff options
| author | Schuyler Eldridge | 2019-07-17 12:31:14 -0400 |
|---|---|---|
| committer | Schuyler Eldridge | 2019-09-16 17:48:09 -0400 |
| commit | 0ecf2931329177249ab4b3ef88e28436d06a1c19 (patch) | |
| tree | 4c14ea8ed4ef2682c4f880a32631cf2e4f520ae1 | |
| parent | a594ccef986c4567730fee729bdea9ed9aefed38 (diff) | |
Deprecate Gender and add implicit Flow conversion
Signed-off-by: Schuyler Eldridge <schuyler.eldridge@ibm.com>
| -rw-r--r-- | src/main/scala/firrtl/Utils.scala | 37 | ||||
| -rw-r--r-- | src/main/scala/firrtl/WIR.scala | 19 | ||||
| -rw-r--r-- | src/main/scala/firrtl/package.scala | 23 | ||||
| -rw-r--r-- | src/main/scala/firrtl/passes/Checks.scala | 19 | ||||
| -rw-r--r-- | src/main/scala/firrtl/passes/Resolves.scala | 11 |
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] |
