summaryrefslogtreecommitdiff
path: root/chiselFrontend/src/main
diff options
context:
space:
mode:
authorJim Lawson2016-07-19 16:51:21 -0700
committerJim Lawson2016-07-19 16:51:21 -0700
commit01e14c8c885527861152443f1233fa77b03cb8b5 (patch)
tree01b042a6b013b6a7ab96d9a538c82763d25902e2 /chiselFrontend/src/main
parent21a3c12b309df88cdb8114c01ef35b044282d647 (diff)
Merge in "complete" versions of Mem, Reg.
Diffstat (limited to 'chiselFrontend/src/main')
-rw-r--r--chiselFrontend/src/main/scala/chisel3/core/Mem.scala31
-rw-r--r--chiselFrontend/src/main/scala/chisel3/core/Reg.scala22
-rw-r--r--chiselFrontend/src/main/scala/chisel3/internal/Builder.scala6
3 files changed, 41 insertions, 18 deletions
diff --git a/chiselFrontend/src/main/scala/chisel3/core/Mem.scala b/chiselFrontend/src/main/scala/chisel3/core/Mem.scala
index 38f5ef14..5c1b5976 100644
--- a/chiselFrontend/src/main/scala/chisel3/core/Mem.scala
+++ b/chiselFrontend/src/main/scala/chisel3/core/Mem.scala
@@ -19,9 +19,11 @@ object Mem {
* @param t data type of memory element
*/
def apply[T <: Data](size: Int, t: T): Mem[T] = macro MemTransform.apply[T]
-
def do_apply[T <: Data](size: Int, t: T)(implicit sourceInfo: SourceInfo): Mem[T] = {
- val mt = t.cloneType
+ val mt = t.newType
+ Binding.bind(mt, NoDirectionBinder, "Error: fresh t")
+ // TODO(twigg): Remove need for this Binding
+
val mem = new Mem(mt, size)
pushCommand(DefMemory(sourceInfo, mem, mt, size)) // TODO multi-clock
mem
@@ -60,7 +62,7 @@ sealed abstract class MemBase[T <: Data](t: T, val length: Int) extends HasId wi
*
* @param idx memory element index to write into
* @param data new data to write
- * @param mask write mask as a Vec of Bool: a write to the Vec element in
+ * @param mask write mask as a Seq of Bool: a write to the Vec element in
* memory is only performed if the corresponding mask index is true.
*
* @note this is only allowed if the memory's element data type is a Vec
@@ -79,9 +81,17 @@ sealed abstract class MemBase[T <: Data](t: T, val length: Int) extends HasId wi
when (cond) { port := datum }
}
- private def makePort(sourceInfo: SourceInfo, idx: UInt, dir: MemPortDirection): T =
- pushCommand(DefMemPort(sourceInfo,
- t.cloneType, Node(this), dir, idx.ref, Node(idx._parent.get.clock))).id
+ private def makePort(sourceInfo: SourceInfo, idx: UInt, dir: MemPortDirection): T = {
+ Binding.checkSynthesizable(idx, s"'idx' ($idx)")
+
+ val port = pushCommand(
+ DefMemPort(sourceInfo,
+ t.newType, Node(this), dir, idx.ref, Node(idx._parent.get.clock))
+ ).id
+ // Bind each element of port to being a MemoryPort
+ Binding.bind(port, MemoryPortBinder(Builder.forcedModule), "Error: Fresh t")
+ port
+ }
}
/** A combinational-read, sequential-write memory.
@@ -93,7 +103,7 @@ sealed abstract class MemBase[T <: Data](t: T, val length: Int) extends HasId wi
* @note when multiple conflicting writes are performed on a Mem element, the
* result is undefined (unlike Vec, where the last assignment wins)
*/
-sealed class Mem[T <: Data](t: T, length: Int) extends MemBase(t, length)
+final class Mem[T <: Data] private (t: T, length: Int) extends MemBase(t, length)
object SeqMem {
@deprecated("SeqMem argument order should be size, t; this will be removed by the official release", "chisel3")
@@ -107,7 +117,10 @@ object SeqMem {
def apply[T <: Data](size: Int, t: T): SeqMem[T] = macro MemTransform.apply[T]
def do_apply[T <: Data](size: Int, t: T)(implicit sourceInfo: SourceInfo): SeqMem[T] = {
- val mt = t.cloneType
+ val mt = t.newType
+ Binding.bind(mt, NoDirectionBinder, "Error: fresh t")
+ // TODO(twigg): Remove need for this Binding
+
val mem = new SeqMem(mt, size)
pushCommand(DefSeqMemory(sourceInfo, mem, mt, size)) // TODO multi-clock
mem
@@ -124,7 +137,7 @@ object SeqMem {
* @note when multiple conflicting writes are performed on a Mem element, the
* result is undefined (unlike Vec, where the last assignment wins)
*/
-sealed class SeqMem[T <: Data](t: T, n: Int) extends MemBase[T](t, n) {
+final class SeqMem[T <: Data] private (t: T, n: Int) extends MemBase[T](t, n) {
def read(addr: UInt, enable: Bool): T = {
implicit val sourceInfo = UnlocatableSourceInfo
val a = Wire(UInt())
diff --git a/chiselFrontend/src/main/scala/chisel3/core/Reg.scala b/chiselFrontend/src/main/scala/chisel3/core/Reg.scala
index 14ae9650..df760b5c 100644
--- a/chiselFrontend/src/main/scala/chisel3/core/Reg.scala
+++ b/chiselFrontend/src/main/scala/chisel3/core/Reg.scala
@@ -11,18 +11,17 @@ object Reg {
private[core] def makeType[T <: Data](t: T = null, next: T = null,
init: T = null): T = {
if (t ne null) {
- t.cloneType
- } else if (next ne null) {
- next.cloneTypeWidth(Width())
- } else if (init ne null) {
+ Binding.checkUnbound(t, s"t ($t) must be unbound Type. Try using newType?")
+ t.newType
+ } else if (next ne null) next.cloneTypeWidth(Width())
+ else if (init ne null) {
init.litArg match {
- // For e.g. Reg(init=UInt(0, k)), fix the Reg's width to k
- case Some(lit) if lit.forcedWidth => init.cloneType
+ // For e.g. Reg(init=0.asUInt(k)), fix the Reg's width to k
+ case Some(lit) if lit.forcedWidth => init.newType
case _ => init.cloneTypeWidth(Width())
}
- } else {
- throwException("cannot infer type")
}
+ else throw new Exception("cannot infer type")
}
/** Creates a register with optional next and initialization values.
@@ -59,14 +58,21 @@ init: T = null): T = {
// system improves, this may be changed.
val x = makeType(t, next, init)
val clock = Node(x._parent.get.clock) // TODO multi-clock
+
+ // Bind each element of x to being a Reg
+ Binding.bind(x, RegBinder(Builder.forcedModule), "Error: t")
+
if (init == null) {
pushCommand(DefReg(sourceInfo, x, clock))
} else {
+ Binding.checkSynthesizable(init, s"'init' ($init)")
pushCommand(DefRegInit(sourceInfo, x, clock, Node(x._parent.get.reset), init.ref))
}
if (next != null) {
+ Binding.checkSynthesizable(next, s"'next' ($next)")
x := next
}
+
x
}
}
diff --git a/chiselFrontend/src/main/scala/chisel3/internal/Builder.scala b/chiselFrontend/src/main/scala/chisel3/internal/Builder.scala
index e5b85736..168e19b2 100644
--- a/chiselFrontend/src/main/scala/chisel3/internal/Builder.scala
+++ b/chiselFrontend/src/main/scala/chisel3/internal/Builder.scala
@@ -124,7 +124,11 @@ private[chisel3] object Builder {
forcedModule._commands += c
c
}
- def pushOp[T <: Data](cmd: DefPrim[T]): T = pushCommand(cmd).id
+ def pushOp[T <: Data](cmd: DefPrim[T]): T = {
+ // Bind each element of the returned Data to being a Op
+ Binding.bind(cmd.id, OpBinder(forcedModule), "Error: During op creation, fresh result")
+ pushCommand(cmd).id
+ }
def errors: ErrorLog = dynamicContext.errors
def error(m: => String): Unit = errors.error(m)