1
0

tilelink2: rename Factory=>LazyModule and TLModule=>LazyModuleImp

This commit is contained in:
Wesley W. Terpstra 2016-08-31 10:25:46 -07:00
parent 5b31fb81fe
commit f99a3dbec7
6 changed files with 23 additions and 29 deletions

View File

@ -6,7 +6,7 @@ import Chisel._
import scala.collection.mutable.ListBuffer import scala.collection.mutable.ListBuffer
import chisel3.internal.sourceinfo.SourceInfo import chisel3.internal.sourceinfo.SourceInfo
abstract class TLFactory abstract class LazyModule
{ {
private val bindings = ListBuffer[(TLBaseNode, Int, TLBaseNode, Int, SourceInfo)]() private val bindings = ListBuffer[(TLBaseNode, Int, TLBaseNode, Int, SourceInfo)]()
@ -15,17 +15,17 @@ abstract class TLFactory
bindings += ((manager, i, client, j, sourceInfo)) bindings += ((manager, i, client, j, sourceInfo))
} }
def module: TLModule def module: LazyModuleImp
protected[tilelink2] def instantiate() = { protected[tilelink2] def instantiate() = {
// Find all TLFactory members of self // Find all LazyModule members of self
for (m <- getClass.getMethods) { for (m <- getClass.getMethods) {
if (m.getParameterTypes.isEmpty && if (m.getParameterTypes.isEmpty &&
!java.lang.reflect.Modifier.isStatic(m.getModifiers) && !java.lang.reflect.Modifier.isStatic(m.getModifiers) &&
!(m.getName contains '$') && !(m.getName contains '$') &&
classOf[TLFactory].isAssignableFrom(m.getReturnType)) { classOf[LazyModule].isAssignableFrom(m.getReturnType)) {
// ... and force their lazy module members to exist // ... and force their lazy module members to exist
m.invoke(this).asInstanceOf[TLFactory].module m.invoke(this).asInstanceOf[LazyModule].module
} }
} }
bindings.foreach { case (x, i, y, j, s) => bindings.foreach { case (x, i, y, j, s) =>
@ -41,14 +41,8 @@ abstract class TLFactory
} }
} }
// Use this if you have only one node => makes factory adapters possible abstract class LazyModuleImp(outer: LazyModule) extends Module
abstract class TLSimpleFactory extends TLFactory
{ {
def node: TLBaseNode override def desiredName = outer.getClass.getName.split('.').last
} outer.instantiate()
abstract class TLModule(factory: TLFactory) extends Module
{
override def desiredName = factory.getClass.getName.split('.').last
factory.instantiate()
} }

View File

@ -5,13 +5,13 @@ package uncore.tilelink2
import Chisel._ import Chisel._
// Acks Hints for managers that don't support them or Acks all Hints if !passthrough // Acks Hints for managers that don't support them or Acks all Hints if !passthrough
class TLHintHandler(supportManagers: Boolean = true, supportClients: Boolean = false, passthrough: Boolean = true) extends TLSimpleFactory class TLHintHandler(supportManagers: Boolean = true, supportClients: Boolean = false, passthrough: Boolean = true) extends LazyModule
{ {
val node = TLAdapterNode( val node = TLAdapterNode(
clientFn = { case Seq(c) => if (supportClients) c.copy(clients = c.clients .map(_.copy(supportsHint = true))) else c }, clientFn = { case Seq(c) => if (supportClients) c.copy(clients = c.clients .map(_.copy(supportsHint = true))) else c },
managerFn = { case Seq(m) => if (supportManagers) m.copy(managers = m.managers.map(_.copy(supportsHint = true))) else m }) managerFn = { case Seq(m) => if (supportManagers) m.copy(managers = m.managers.map(_.copy(supportsHint = true))) else m })
lazy val module = Module(new TLModule(this) { lazy val module = Module(new LazyModuleImp(this) {
val io = new Bundle { val io = new Bundle {
val in = node.bundleIn val in = node.bundleIn
val out = node.bundleOut val out = node.bundleOut

View File

@ -7,14 +7,14 @@ import cde.Parameters
import uncore.tilelink._ import uncore.tilelink._
import uncore.constants._ import uncore.constants._
class TLLegacy(implicit val p: Parameters) extends TLSimpleFactory with HasTileLinkParameters class TLLegacy(implicit val p: Parameters) extends LazyModule with HasTileLinkParameters
{ {
val outer_p = p val outer_p = p
// TL legacy clients don't support anything fancy // TL legacy clients don't support anything fancy
val node = TLClientNode(TLClientParameters( val node = TLClientNode(TLClientParameters(
sourceId = IdRange(0, 1 << tlClientXactIdBits))) sourceId = IdRange(0, 1 << tlClientXactIdBits)))
lazy val module = Module(new TLModule(this) with HasTileLinkParameters { lazy val module = Module(new LazyModuleImp(this) with HasTileLinkParameters {
val p = outer_p val p = outer_p
val io = new Bundle { val io = new Bundle {
val legacy = new ClientUncachedTileLinkIO()(p).flip val legacy = new ClientUncachedTileLinkIO()(p).flip

View File

@ -59,25 +59,25 @@ object TLRegisterNode
// register mapped device from a totally abstract register mapped device. // register mapped device from a totally abstract register mapped device.
// See GPIO.scala in this directory for an example // See GPIO.scala in this directory for an example
abstract class TLRegFactory(address: AddressSet, concurrency: Option[Int], beatBytes: Int) extends TLSimpleFactory abstract class TLRegisterRouterBase(address: AddressSet, concurrency: Option[Int], beatBytes: Int) extends LazyModule
{ {
val node = TLRegisterNode(address, concurrency, beatBytes) val node = TLRegisterNode(address, concurrency, beatBytes)
} }
class TLRegBundle[P](val params: P, val in: Vec[TLBundle]) extends Bundle class TLRegBundle[P](val params: P, val in: Vec[TLBundle]) extends Bundle
class TLRegModule[P, B <: Bundle](val params: P, bundleBuilder: => B, factory: TLRegFactory) class TLRegModule[P, B <: Bundle](val params: P, bundleBuilder: => B, router: TLRegisterRouterBase)
extends TLModule(factory) with HasRegMap extends LazyModuleImp(router) with HasRegMap
{ {
val io = bundleBuilder val io = bundleBuilder
def regmap(mapping: RegField.Map*) = factory.node.regmap(mapping:_*) def regmap(mapping: RegField.Map*) = router.node.regmap(mapping:_*)
} }
class TLRegisterRouter[B <: Bundle, M <: TLModule] class TLRegisterRouter[B <: Bundle, M <: LazyModuleImp]
(address: Option[BigInt] = None, size: BigInt = 4096, concurrency: Option[Int] = None, beatBytes: Int = 4) (address: Option[BigInt] = None, size: BigInt = 4096, concurrency: Option[Int] = None, beatBytes: Int = 4)
(bundleBuilder: Vec[TLBundle] => B) (bundleBuilder: Vec[TLBundle] => B)
(moduleBuilder: (=> B, TLRegFactory) => M) (moduleBuilder: (=> B, TLRegisterRouterBase) => M)
extends TLRegFactory(AddressSet(size-1, address), concurrency, beatBytes) extends TLRegisterRouterBase(AddressSet(size-1, address), concurrency, beatBytes)
{ {
require (size % 4096 == 0) // devices should be 4K aligned require (size % 4096 == 0) // devices should be 4K aligned
require (isPow2(size)) require (isPow2(size))

View File

@ -4,7 +4,7 @@ package uncore.tilelink2
import Chisel._ import Chisel._
class TLRAM(address: AddressSet, beatBytes: Int = 4) extends TLSimpleFactory class TLRAM(address: AddressSet, beatBytes: Int = 4) extends LazyModule
{ {
val node = TLManagerNode(beatBytes, TLManagerParameters( val node = TLManagerNode(beatBytes, TLManagerParameters(
address = List(address), address = List(address),
@ -17,7 +17,7 @@ class TLRAM(address: AddressSet, beatBytes: Int = 4) extends TLSimpleFactory
// We require the address range to include an entire beat (for the write mask) // We require the address range to include an entire beat (for the write mask)
require ((address.mask & (beatBytes-1)) == beatBytes-1) require ((address.mask & (beatBytes-1)) == beatBytes-1)
lazy val module = Module(new TLModule(this) { lazy val module = Module(new LazyModuleImp(this) {
val io = new Bundle { val io = new Bundle {
val in = node.bundleIn val in = node.bundleIn
} }

View File

@ -13,7 +13,7 @@ object TLXbar
} }
} }
class TLXbar(policy: (Vec[Bool], Bool) => Seq[Bool] = TLXbar.lowestIndex) extends TLSimpleFactory class TLXbar(policy: (Vec[Bool], Bool) => Seq[Bool] = TLXbar.lowestIndex) extends LazyModule
{ {
def mapInputIds (ports: Seq[TLClientPortParameters ]) = assignRanges(ports.map(_.endSourceId)) def mapInputIds (ports: Seq[TLClientPortParameters ]) = assignRanges(ports.map(_.endSourceId))
def mapOutputIds(ports: Seq[TLManagerPortParameters]) = assignRanges(ports.map(_.endSinkId)) def mapOutputIds(ports: Seq[TLManagerPortParameters]) = assignRanges(ports.map(_.endSinkId))
@ -65,7 +65,7 @@ class TLXbar(policy: (Vec[Bool], Bool) => Seq[Bool] = TLXbar.lowestIndex) extend
TLManagerPortParameters(managers, seq(0).beatBytes) TLManagerPortParameters(managers, seq(0).beatBytes)
}) })
lazy val module = Module(new TLModule(this) { lazy val module = Module(new LazyModuleImp(this) {
val io = new Bundle { val io = new Bundle {
val in = node.bundleIn val in = node.bundleIn
val out = node.bundleOut val out = node.bundleOut