class MyClientGroup(implicit p: Parameters) extends LazyModule {
val client1 = LazyModule(new MyClient1)
val client2 = LazyModule(new MyClient2)
val node = TLIdentityNode()
node := client1.node
node := client2.node
lazy val module = new LazyModuleImp(this) {
// Nothing to do here
}
}
マネージャに対しても同様の処理が可能である。
class MyManager1(beatBytes: Int)(implicit p: Parameters) extends LazyModule {
val node = TLHelper.makeManagerNode(beatBytes, TLManagerParameters(
address = Seq(AddressSet(0x0, 0xfff))))
lazy val module = new LazyModuleImp(this) {
// ...
}
}
class MyManager2(beatBytes: Int)(implicit p: Parameters) extends LazyModule {
val node = TLHelper.makeManagerNode(beatBytes, TLManagerParameters(
address = Seq(AddressSet(0x1000, 0xfff))))
lazy val module = new LazyModuleImp(this) {
// ...
}
}
class MyManagerGroup(beatBytes: Int)(implicit p: Parameters) extends LazyModule {
val man1 = LazyModule(new MyManager1(beatBytes))
val man2 = LazyModule(new MyManager2(beatBytes))
val node = TLIdentityNode()
man1.node := node
man2.node := node
lazy val module = new LazyModuleImp(this) {
// Nothing to do here
}
}
クライアントとマネージャのグループを接続したい場合、以下のように接続できる。
class MyClientManagerComplex(implicit p: Parameters) extends LazyModule {
val client = LazyModule(new MyClientGroup)
val manager = LazyModule(new MyManagerGroup(8))
manager.node :=* client.node
lazy val module = new LazyModuleImp(this) {
// Nothing to do here
}
}
The makeManagerNode method takes two arguments. The first is beatBytes, which is the physical width of the TileLink interface in bytes. The second is a TLManagerParameters object.
def lowerTypesExp(memDataTypeMap: MemDataTypeMap,
info: Info, mname: String, subfield_name: String = "")(e: Expression): Expression = {
e match {
case e: WRef => {
val new_subfield_name = subfield_name match {
case"" => e.name
case x => e.name + "_" + x
}
e.copy(name = new_subfield_name)
}
case e: WSubAccess => {
val exps = lowerTypesExp(memDataTypeMap, info, mname, subfield_name)(e.expr)
WSubAccess(exps, e.index, e.tpe, flow(e))
}
case e: WSubField => {
...
case _ => {
val new_subfield_name = subfield_name match {
case"" => e.name
case x => e.name + "_" + x
}
lowerTypesExp(memDataTypeMap, info, mname, new_subfield_name)(e.expr)
}
case e: WSubIndex => {
...
case _ => {
val exps = lowerTypesExp(memDataTypeMap, info, mname, subfield_name)(e.expr)
WSubIndex(exps, e.value, e.tpe, flow(e))
}