diff options
Diffstat (limited to 'src/main/scala/chisel3/compatibility.scala')
| -rw-r--r-- | src/main/scala/chisel3/compatibility.scala | 71 |
1 files changed, 52 insertions, 19 deletions
diff --git a/src/main/scala/chisel3/compatibility.scala b/src/main/scala/chisel3/compatibility.scala index d64b3bb5..b9357bbd 100644 --- a/src/main/scala/chisel3/compatibility.scala +++ b/src/main/scala/chisel3/compatibility.scala @@ -12,21 +12,43 @@ package object Chisel { // scalastyle:ignore package.object.name import scala.annotation.compileTimeOnly implicit val defaultCompileOptions = chisel3.core.ExplicitCompileOptions.NotStrict - type Direction = chisel3.core.Direction - val INPUT = chisel3.core.Direction.Input - val OUTPUT = chisel3.core.Direction.Output - val NODIR = chisel3.core.Direction.Unspecified + abstract class Direction + case object INPUT extends Direction + case object OUTPUT extends Direction + case object NODIR extends Direction + object Flipped { def apply[T<:Data](target: T): T = chisel3.core.Flipped[T](target) } - // TODO: Possibly move the AddDirectionToData class here? + + implicit class AddDirectionToData[T<:Data](val target: T) extends AnyVal { + def asInput: T = chisel3.core.Input(target) + def asOutput: T = chisel3.core.Output(target) + def flip(): T = chisel3.core.Flipped(target) + } + implicit class AddDirMethodToData[T<:Data](val target: T) extends AnyVal { + import chisel3.core.{DataMirror, ActualDirection, UserDirection} def dir: Direction = { - target match { - case e: Element => e.dir - case _ => chisel3.core.Direction.Unspecified + DataMirror.isSynthesizable(target) match { + case true => target match { + case e: Element => DataMirror.directionOf(e) match { + case ActualDirection.Unspecified => NODIR + case ActualDirection.Output => OUTPUT + case ActualDirection.Input => INPUT + case dir => throw new RuntimeException(s"Unexpected element direction '$dir'") + } + case _ => NODIR + } + case false => DataMirror.userDirectionOf(target) match { // returns local direction only + case UserDirection.Unspecified => NODIR + case UserDirection.Input => INPUT + case UserDirection.Output => OUTPUT + case dir => throw new RuntimeException(s"Unexpected element direction '$dir'") + } } + } } @@ -34,7 +56,18 @@ package object Chisel { // scalastyle:ignore package.object.name type Data = chisel3.core.Data val Wire = chisel3.core.Wire - val Clock = chisel3.core.Clock + object Clock { + def apply(): Clock = new Clock + + def apply(dir: Direction): Clock = { + val result = apply() + dir match { + case INPUT => chisel3.core.Input(result) + case OUTPUT => chisel3.core.Output(result) + case _ => result + } + } + } type Clock = chisel3.core.Clock // Implicit conversion to allow fromBits because it's being deprecated in chisel3 @@ -94,9 +127,9 @@ package object Chisel { // scalastyle:ignore package.object.name def apply(dir: Direction, width: Width): UInt = { val result = apply(width) dir match { - case chisel3.core.Direction.Input => chisel3.core.Input(result) - case chisel3.core.Direction.Output => chisel3.core.Output(result) - case chisel3.core.Direction.Unspecified => result + case INPUT => chisel3.core.Input(result) + case OUTPUT => chisel3.core.Output(result) + case NODIR => result } } @@ -135,9 +168,9 @@ package object Chisel { // scalastyle:ignore package.object.name def apply(dir: Direction, width: Width): SInt = { val result = apply(width) dir match { - case chisel3.core.Direction.Input => chisel3.core.Input(result) - case chisel3.core.Direction.Output => chisel3.core.Output(result) - case chisel3.core.Direction.Unspecified => result + case INPUT => chisel3.core.Input(result) + case OUTPUT => chisel3.core.Output(result) + case NODIR => result } } } @@ -153,9 +186,9 @@ package object Chisel { // scalastyle:ignore package.object.name def apply(dir: Direction): Bool = { val result = apply() dir match { - case chisel3.core.Direction.Input => chisel3.core.Input(result) - case chisel3.core.Direction.Output => chisel3.core.Output(result) - case chisel3.core.Direction.Unspecified => result + case INPUT => chisel3.core.Input(result) + case OUTPUT => chisel3.core.Output(result) + case NODIR => result } } } @@ -210,6 +243,7 @@ package object Chisel { // scalastyle:ignore package.object.name } } } + val Module = chisel3.core.Module type Module = CompatibilityModule @@ -249,7 +283,6 @@ package object Chisel { // scalastyle:ignore package.object.name chisel3.core.Reg(t) } if (next ne null) { - Binding.checkSynthesizable(next, s"'next' ($next)") // TODO: move into connect? reg := next } reg |
