summaryrefslogtreecommitdiff
path: root/src/main/scala/Chisel/Core.scala
diff options
context:
space:
mode:
authorHenry Cook2015-08-05 00:54:32 -0700
committerAndrew Waterman2015-08-05 16:36:08 -0700
commitf98e9e4143a113ac1020ed20c5e01b41aa29efe5 (patch)
tree89fa57975e1f137ee184aafdc7a0a81ec09aa994 /src/main/scala/Chisel/Core.scala
parenta02d788d9e9c4b42fd866e5c34e42aa771aab68c (diff)
Massive Driver simplification, some tweaks to Parameter api
Diffstat (limited to 'src/main/scala/Chisel/Core.scala')
-rw-r--r--src/main/scala/Chisel/Core.scala40
1 files changed, 24 insertions, 16 deletions
diff --git a/src/main/scala/Chisel/Core.scala b/src/main/scala/Chisel/Core.scala
index 52b7ea48..b5bebe33 100644
--- a/src/main/scala/Chisel/Core.scala
+++ b/src/main/scala/Chisel/Core.scala
@@ -16,14 +16,13 @@ class IdGen {
object Builder {
val components = new ArrayBuffer[Component]()
val idGen = new IdGen
+ val paramz = new Stack[Parameters]
+ def pushParameters(p: Parameters) { paramz.push(p) }
+ def popParameters { paramz.pop }
val modulez = new Stack[Module]()
- def pushModule(mod: Module) {
- modulez.push(mod)
- }
+ def pushModule(mod: Module) { modulez.push(mod) }
+ def popModule { modulez.pop }
def getComponent(): Module = if (modulez.length > 0) modulez.head else null
- def popModule() {
- modulez.pop
- }
val globalNamespace = new FIRRTLNamespace
def namespace = if (modulez.isEmpty) globalNamespace else modulez.head._namespace
val commandz = new Stack[ArrayBuffer[Command]]()
@@ -71,14 +70,20 @@ object Builder {
refmap(id._id)
}
- def build[T <: Module](f: => T): (Circuit, T) = {
+ def build[T <: Module](f: => T): Circuit = {
val (cmd, mod) = collectCommands(f)
setRefForId(mod, mod.name)
- (Circuit(components, components.last.name), mod)
+ Circuit(components, components.last.name)
}
}
+object build {
+ def apply[T <: Module](f: => T): Circuit = {
+ Builder.build(f)
+ }
+}
+
import Builder._
/// CHISEL IR
@@ -350,7 +355,7 @@ abstract class Data(dirArg: Direction) extends Id {
}
def toPort: Port = Port(this, toType)
- def params = if(Driver.parStack.isEmpty) Parameters.empty else Driver.parStack.top
+ def params = if(paramz.isEmpty) Parameters.empty else paramz.top
}
object Wire {
@@ -932,16 +937,16 @@ object Bundle {
val keywords = HashSet[String]("flip", "asInput", "asOutput",
"cloneType", "clone", "toBits")
def apply[T <: Bundle](b: => T)(implicit p: Parameters): T = {
- Driver.parStack.push(p.push)
+ pushParameters(p.push)
val res = b
- Driver.parStack.pop
+ popParameters
res
}
def apply[T <: Bundle](b: => T, f: PartialFunction[Any,Any]): T = {
val q = params.alterPartial(f)
apply(b)(q)
}
- private def params = if(Driver.parStack.isEmpty) Parameters.empty else Driver.parStack.top
+ private def params = if(paramz.isEmpty) Parameters.empty else paramz.top
}
class Bundle extends Aggregate(NO_DIR) {
@@ -1004,8 +1009,7 @@ class Bundle extends Aggregate(NO_DIR) {
object Module {
def apply[T <: Module](bc: => T)(implicit p: Parameters = params): T = {
- Driver.modStackPushed = true
- Driver.parStack.push(p.push)
+ pushParameters(p.push)
val m = bc
m.setRefs
val cmd = popCommands
@@ -1014,7 +1018,7 @@ object Module {
val component = Component(m.name, ports, cmd)
components += component
pushCommand(DefInstance(m, m.name, ports))
- Driver.parStack.pop
+ popParameters
m.connectImplicitIOs
m
}
@@ -1022,7 +1026,7 @@ object Module {
val q = params.alterPartial(f)
apply(m)(q)
}
- private def params = if(Driver.parStack.isEmpty) Parameters.empty else Driver.parStack.top
+ private def params = if(paramz.isEmpty) Parameters.empty else paramz.top
}
abstract class Module(_clock: Clock = null, _reset: Bool = null) extends Id {
@@ -1222,3 +1226,7 @@ class Emitter {
def emit(e: Circuit): String =
withIndent{ "circuit " + e.main + " : " + join0(e.components.map(x => emit(x)), newline) } + newline
}
+
+object emit {
+ def apply(e: Circuit) = new Emitter().emit(e)
+}