summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorjackbackrack2015-07-23 20:03:04 -0700
committerjackbackrack2015-07-23 20:03:04 -0700
commit10bf9045159ee0cb996a39b1dc0453ab82efdfb9 (patch)
tree5a8cfe9c9f7e045490cb4c9da31e7cea2eb65782 /src
parent416ed4dcf6268eb4e5f94eabfa53b786dcd4ebe3 (diff)
init methods for deqio, call collectelts during clone, change elsewhen emission to indent correctly
Diffstat (limited to 'src')
-rw-r--r--src/main/scala/Core.scala31
-rw-r--r--src/main/scala/Driver.scala1
-rw-r--r--src/main/scala/utils.scala12
3 files changed, 33 insertions, 11 deletions
diff --git a/src/main/scala/Core.scala b/src/main/scala/Core.scala
index bcb5a280..d41f3081 100644
--- a/src/main/scala/Core.scala
+++ b/src/main/scala/Core.scala
@@ -54,7 +54,7 @@ object Builder {
else if (cmds.length == 1)
cmds(0)
else
- Begin(cmds.toArray)
+ Begin(cmds.toList)
}
def pushCommands =
commandz.push(new ArrayBuffer[Command]())
@@ -75,7 +75,8 @@ object Builder {
def legalizeName (name: String) = {
if (name == "mem" || name == "node" || name == "wire" ||
name == "reg" || name == "inst")
- genSym.next(name)
+ // genSym.next(name)
+ name + "__"
else
name
}
@@ -238,7 +239,7 @@ case class DefSeqMemory(val id: String, val kind: Kind, val size: Int) extends D
case class DefAccessor(val id: String, val source: Alias, val direction: Direction, val index: Arg) extends Definition;
case class DefInstance(val id: String, val module: String) extends Definition;
case class Conditionally(val prep: Command, val pred: Arg, val conseq: Command, var alt: Command) extends Command;
-case class Begin(val body: Array[Command]) extends Command();
+case class Begin(val body: List[Command]) extends Command();
case class Connect(val loc: Alias, val exp: Arg) extends Command;
case class BulkConnect(val loc1: Alias, val loc2: Alias) extends Command;
case class ConnectInit(val loc: Alias, val exp: Arg) extends Command;
@@ -300,6 +301,7 @@ abstract class Data(dirArg: Direction) extends Id {
def setDir(dir: Direction) {
isFlipVar = (dir == INPUT)
}
+ def init(dummy:Int = 0) = { }
def asInput: this.type = {
setDir(INPUT)
this
@@ -445,7 +447,7 @@ class SeqMem[T <: Data](val t: T, val n: Int) /* with VecLike[T] */ { // TODO:
}
object Vec {
- def apply[T <: Data](gen: T, n: Int): Vec[T] =
+ def apply[T <: Data](gen: => T, n: Int): Vec[T] =
new Vec((0 until n).map(i => gen.cloneType))
def apply[T <: Data](elts: Iterable[T]): Vec[T] = {
val vec = new Vec[T](elts.map(e => elts.head.cloneType))
@@ -472,7 +474,11 @@ object Vec {
}
abstract class Aggregate(dirArg: Direction) extends Data(dirArg) {
- def cloneTypeWidth(width: Int): this.type = cloneType
+ def cloneTypeWidth(width: Int): this.type = {
+ val res = cloneType
+ res.collectElts
+ res
+ }
}
class Vec[T <: Data](val elts: Iterable[T], dirArg: Direction = NO_DIR) extends Aggregate(dirArg) with VecLike[T] {
@@ -487,6 +493,7 @@ class Vec[T <: Data](val elts: Iterable[T], dirArg: Direction = NO_DIR) extends
def apply(idx: UInt): T = {
val x = elt0.cloneType
+ x.collectElts
pushCommand(DefAccessor(x.defd.cid, Alias(cid), NO_DIR, idx.ref))
x
}
@@ -501,6 +508,10 @@ class Vec[T <: Data](val elts: Iterable[T], dirArg: Direction = NO_DIR) extends
v.collectElts
v
}
+ override def init(dummy:Int = 0) = {
+ collectElts
+ for (e <- self) e.init()
+ }
def inits (f: (Int, T, (Int, T, T) => Unit) => Unit) = {
var i = 0
def doInit (index: Int, elt: T, init: T) =
@@ -1013,9 +1024,13 @@ class Bundle(dirArg: Direction = NO_DIR) extends Aggregate(dirArg) {
flatten.map(_.getWidth).reduce(_ + _)
val elts = ArrayBuffer[Data]()
+ override def init(dummy:Int = 0) = {
+ collectElts
+ for (e <- elts) e.init()
+ }
def collectElts: Unit = {
elts.clear()
- for (m <- getClass.getDeclaredMethods) {
+ for (m <- getClass.getMethods) {
val name = m.getName
val modifiers = m.getModifiers();
@@ -1212,6 +1227,8 @@ class Emitter {
parts.foldLeft("")((s, p) => if (s == "") p else s + sep + p)
def join0(parts: Array[String], sep: String) =
parts.foldLeft("")((s, p) => s + sep + p)
+ def join0(parts: List[String], sep: String) =
+ parts.foldLeft("")((s, p) => s + sep + p)
def newline =
"\n" + join((0 until indenting).map(x => " ").toArray, "")
def emitDir(e: Direction, isTop: Boolean): String =
@@ -1262,7 +1279,7 @@ class Emitter {
""
}
val suffix = if (!e.alt.isInstanceOf[EmptyCommand]) {
- newline + "else : " + newline + withIndent{ emit(e.alt) }
+ newline + "else : " + withIndent{ newline + emit(e.alt) }
} else {
""
}
diff --git a/src/main/scala/Driver.scala b/src/main/scala/Driver.scala
index 0b714b6f..c4a26221 100644
--- a/src/main/scala/Driver.scala
+++ b/src/main/scala/Driver.scala
@@ -148,6 +148,7 @@ object Driver extends FileSystemUtilities{
// setTopComponent(c)
if (!isTesting) {
val s = emitter.emit( c )
+ // println(c.components(0))
val filename = c.main + ".fir"
// println("FILENAME " + filename)
// println("S = " + s)
diff --git a/src/main/scala/utils.scala b/src/main/scala/utils.scala
index a86c81e8..c6f2ec01 100644
--- a/src/main/scala/utils.scala
+++ b/src/main/scala/utils.scala
@@ -310,16 +310,20 @@ object Decoupled {
class EnqIO[T <: Data](gen: T) extends DecoupledIO(gen)
{
def enq(dat: T): T = { valid := Bool(true); bits := dat; dat }
- valid := Bool(false);
- for (io <- bits.flatten)
- io := UInt(0)
+ override def init(dummy: Int = 0) = {
+ valid := Bool(false);
+ for (io <- bits.flatten)
+ io := UInt(0)
+ }
override def cloneType: this.type = { new EnqIO(gen).asInstanceOf[this.type]; }
}
class DeqIO[T <: Data](gen: T) extends DecoupledIO(gen)
{
flip()
- ready := Bool(false);
+ override def init(dummy: Int = 0) = {
+ ready := Bool(false)
+ }
def deq(b: Boolean = false): T = { ready := Bool(true); bits }
override def cloneType: this.type = { new DeqIO(gen).asInstanceOf[this.type]; }
}