diplomacy: add LazyScope to post-hoc add children to a LazyModule
This commit is contained in:
parent
a27e853101
commit
a2b423d647
@ -172,16 +172,43 @@ sealed trait LazyModuleImpLike extends BaseModule
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract class LazyModuleImp(val wrapper: LazyModule) extends MultiIOModule with LazyModuleImpLike {
|
class LazyModuleImp(val wrapper: LazyModule) extends MultiIOModule with LazyModuleImpLike {
|
||||||
val (auto, dangles) = instantiate()
|
val (auto, dangles) = instantiate()
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract class LazyRawModuleImp(val wrapper: LazyModule) extends RawModule with LazyModuleImpLike {
|
class LazyRawModuleImp(val wrapper: LazyModule) extends RawModule with LazyModuleImpLike {
|
||||||
val (auto, dangles) = withClockAndReset(Bool(false).asClock, Bool(true)) {
|
val (auto, dangles) = withClockAndReset(Bool(false).asClock, Bool(true)) {
|
||||||
instantiate()
|
instantiate()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class SimpleLazyModule(implicit p: Parameters) extends LazyModule
|
||||||
|
{
|
||||||
|
lazy val module = new LazyModuleImp(this)
|
||||||
|
}
|
||||||
|
|
||||||
|
trait LazyScope
|
||||||
|
{
|
||||||
|
this: LazyModule =>
|
||||||
|
def apply[T](body: => T)(implicit p: Parameters) = {
|
||||||
|
require (!LazyModule.stack.exists(x => x eq this))
|
||||||
|
LazyModule.stack = this :: LazyModule.stack
|
||||||
|
val out = body
|
||||||
|
require (LazyModule.stack.head eq this)
|
||||||
|
LazyModule.stack = LazyModule.stack.tail
|
||||||
|
out
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
object LazyScope
|
||||||
|
{
|
||||||
|
def apply[T](name: String)(body: => T)(implicit p: Parameters) = {
|
||||||
|
val scope = LazyModule(new SimpleLazyModule with LazyScope)
|
||||||
|
scope.suggestName(name)
|
||||||
|
scope { body }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
case class HalfEdge(serial: Int, index: Int)
|
case class HalfEdge(serial: Int, index: Int)
|
||||||
case class Dangle(source: HalfEdge, sink: HalfEdge, flipped: Boolean, name: String, data: Data)
|
case class Dangle(source: HalfEdge, sink: HalfEdge, flipped: Boolean, name: String, data: Data)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user