From 38db9a9edf761ecef229acbbde2d6594028c789f Mon Sep 17 00:00:00 2001 From: Andrew Waterman Date: Mon, 8 Feb 2016 13:39:53 -0800 Subject: Add Flipped trait that flips an Aggregate --- src/main/scala/Chisel/Data.scala | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) (limited to 'src/main') diff --git a/src/main/scala/Chisel/Data.scala b/src/main/scala/Chisel/Data.scala index 0ac3ee32..2ae9ec63 100644 --- a/src/main/scala/Chisel/Data.scala +++ b/src/main/scala/Chisel/Data.scala @@ -19,6 +19,11 @@ object debug { // scalastyle:ignore object.name def apply (arg: Data): Data = arg } +/** Mixing in this trait flips the direction of an Aggregate. */ +trait Flipped extends Data { + this.overrideDirection(_.flip, !_) +} + /** This forms the root of the type system for wire data types. The data value * must be representable as some number (need not be known at Chisel compile * time) of bits, and must have methods to pack / unpack structured data to / @@ -32,17 +37,16 @@ abstract class Data(dirArg: Direction) extends HasId { private var dirVar = dirArg private[Chisel] def isFlip = isFlipVar - private def cloneWithDirection(newDir: Direction => Direction, - newFlip: Boolean => Boolean): this.type = { - val res = this.cloneType - res.isFlipVar = newFlip(res.isFlipVar) - for ((me, it) <- this.flatten zip res.flatten) - (it: Data).dirVar = newDir((me: Data).dirVar) - res + private[Chisel] def overrideDirection(newDir: Direction => Direction, + newFlip: Boolean => Boolean): this.type = { + this.isFlipVar = newFlip(this.isFlipVar) + for (field <- this.flatten) + (field: Data).dirVar = newDir((field: Data).dirVar) + this } - def asInput: this.type = cloneWithDirection(_ => INPUT, _ => true) - def asOutput: this.type = cloneWithDirection(_ => OUTPUT, _ => false) - def flip(): this.type = cloneWithDirection(_.flip, !_) + def asInput: this.type = cloneType.overrideDirection(_ => INPUT, _ => true) + def asOutput: this.type = cloneType.overrideDirection(_ => OUTPUT, _ => false) + def flip(): this.type = cloneType.overrideDirection(_.flip, !_) private[Chisel] def badConnect(that: Data): Unit = throwException(s"cannot connect ${this} and ${that}") -- cgit v1.2.3 From 4d25a10da60cc4e4a9c12fb67ffcd34d3390b225 Mon Sep 17 00:00:00 2001 From: Andrew Waterman Date: Mon, 8 Feb 2016 13:40:33 -0800 Subject: Use Flipped trait to implement DeqIO --- src/main/scala/Chisel/util/Decoupled.scala | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'src/main') diff --git a/src/main/scala/Chisel/util/Decoupled.scala b/src/main/scala/Chisel/util/Decoupled.scala index ca000af9..23a08d52 100644 --- a/src/main/scala/Chisel/util/Decoupled.scala +++ b/src/main/scala/Chisel/util/Decoupled.scala @@ -33,9 +33,8 @@ class EnqIO[T <: Data](gen: T) extends DecoupledIO(gen) } /** An I/O bundle for dequeuing data with valid/ready handshaking */ -class DeqIO[T <: Data](gen: T) extends DecoupledIO(gen) +class DeqIO[T <: Data](gen: T) extends DecoupledIO(gen) with Flipped { - flip() ready := Bool(false) def deq(b: Boolean = false): T = { ready := Bool(true); bits } override def cloneType: this.type = { new DeqIO(gen).asInstanceOf[this.type]; } -- cgit v1.2.3