2016-08-19 20:08:35 +02:00
|
|
|
// See LICENSE for license details.
|
|
|
|
|
|
|
|
package uncore.tilelink2
|
|
|
|
|
|
|
|
import Chisel._
|
|
|
|
import scala.collection.mutable.ListBuffer
|
|
|
|
import chisel3.internal.sourceinfo.SourceInfo
|
|
|
|
|
2016-08-31 19:25:46 +02:00
|
|
|
abstract class LazyModule
|
2016-08-19 20:08:35 +02:00
|
|
|
{
|
|
|
|
private val bindings = ListBuffer[(TLBaseNode, Int, TLBaseNode, Int, SourceInfo)]()
|
|
|
|
|
|
|
|
def tl(manager: TLBaseNode, client: TLBaseNode)(implicit sourceInfo: SourceInfo) = {
|
|
|
|
val (i, j) = manager.edge(client)
|
|
|
|
bindings += ((manager, i, client, j, sourceInfo))
|
|
|
|
}
|
|
|
|
|
2016-08-31 19:25:46 +02:00
|
|
|
def module: LazyModuleImp
|
2016-08-19 20:08:35 +02:00
|
|
|
|
|
|
|
protected[tilelink2] def instantiate() = {
|
2016-08-31 19:25:46 +02:00
|
|
|
// Find all LazyModule members of self
|
2016-08-19 20:08:35 +02:00
|
|
|
for (m <- getClass.getMethods) {
|
|
|
|
if (m.getParameterTypes.isEmpty &&
|
|
|
|
!java.lang.reflect.Modifier.isStatic(m.getModifiers) &&
|
|
|
|
!(m.getName contains '$') &&
|
2016-08-31 19:25:46 +02:00
|
|
|
classOf[LazyModule].isAssignableFrom(m.getReturnType)) {
|
2016-08-19 20:08:35 +02:00
|
|
|
// ... and force their lazy module members to exist
|
2016-08-31 19:25:46 +02:00
|
|
|
m.invoke(this).asInstanceOf[LazyModule].module
|
2016-08-19 20:08:35 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
bindings.foreach { case (x, i, y, j, s) =>
|
2016-08-31 04:26:01 +02:00
|
|
|
val in = x.connectIn(i)
|
|
|
|
val out = y.connectOut(j)
|
|
|
|
TLMonitor.legalize(out, y.edgesOut(j), in, x.edgesIn(i), s)
|
|
|
|
in.<>(out)(s)
|
2016-08-26 23:13:09 +02:00
|
|
|
val mask = ~UInt(x.edgesIn(i).manager.beatBytes - 1)
|
2016-08-31 04:26:01 +02:00
|
|
|
in .a.bits.address.:=(mask & out.a.bits.address)(s)
|
|
|
|
out.b.bits.address.:=(mask & in .b.bits.address)(s)
|
|
|
|
in .c.bits.address.:=(mask & out.c.bits.address)(s)
|
2016-08-19 20:08:35 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-08-31 19:25:46 +02:00
|
|
|
abstract class LazyModuleImp(outer: LazyModule) extends Module
|
2016-08-30 02:53:31 +02:00
|
|
|
{
|
2016-08-31 19:25:46 +02:00
|
|
|
override def desiredName = outer.getClass.getName.split('.').last
|
|
|
|
outer.instantiate()
|
2016-08-19 20:08:35 +02:00
|
|
|
}
|