Merge pull request #682 from ucb-bar/jchang
Add hooks to print debug information into the graphml file
This commit is contained in:
commit
db5d0737f0
@ -54,7 +54,7 @@ abstract class LazyModule()(implicit val p: Parameters)
|
||||
def module: LazyModuleImp
|
||||
|
||||
protected[diplomacy] def instantiate() = {
|
||||
children.reverse.foreach { c =>
|
||||
children.reverse.foreach { c =>
|
||||
// !!! fix chisel3 so we can pass the desired sourceInfo
|
||||
// implicit val sourceInfo = c.module.outer.info
|
||||
Module(c.module)
|
||||
@ -62,13 +62,14 @@ abstract class LazyModule()(implicit val p: Parameters)
|
||||
bindings.reverse.foreach { f => f () }
|
||||
}
|
||||
|
||||
def omitGraphML = nodes.isEmpty && children.isEmpty
|
||||
def omitGraphML: Boolean = !nodes.exists(!_.omitGraphML) && !children.exists(!_.omitGraphML)
|
||||
lazy val graphML: String = parent.map(_.graphML).getOrElse {
|
||||
val buf = new StringBuilder
|
||||
buf ++= "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
|
||||
buf ++= "<graphml xmlns=\"http://graphml.graphdrawing.org/xmlns\" xmlns:y=\"http://www.yworks.com/xml/graphml\">\n"
|
||||
buf ++= " <key for=\"node\" id=\"n\" yfiles.type=\"nodegraphics\"/>\n"
|
||||
buf ++= " <key for=\"edge\" id=\"e\" yfiles.type=\"edgegraphics\"/>\n"
|
||||
buf ++= " <key for=\"node\" id=\"d\" attr.name=\"NodeDebugString\" attr.type=\"string\"/>\n"
|
||||
buf ++= " <graph id=\"G\" edgedefault=\"directed\">\n"
|
||||
nodesGraphML(buf, " ")
|
||||
edgesGraphML(buf, " ")
|
||||
@ -84,7 +85,9 @@ abstract class LazyModule()(implicit val p: Parameters)
|
||||
buf ++= s"""${pad} <data key=\"n\"><y:ShapeNode><y:NodeLabel modelName=\"sides\" modelPosition=\"w\" rotationAngle=\"270.0\">${module.instanceName}</y:NodeLabel></y:ShapeNode></data>\n"""
|
||||
buf ++= s"""${pad} <graph id=\"${index}::\" edgedefault=\"directed\">\n"""
|
||||
nodes.filter(!_.omitGraphML).foreach { n =>
|
||||
buf ++= s"""${pad} <node id=\"${index}::${n.index}\"/>\n"""
|
||||
buf ++= s"""${pad} <node id=\"${index}::${n.index}\">\n"""
|
||||
buf ++= s"""${pad} <data key=\"d\"><y:ShapeNode><y:Shape type="ellipse"/></y:ShapeNode>${n.nodedebugstring}</data>\n"""
|
||||
buf ++= s"""${pad} </node>\n"""
|
||||
}
|
||||
children.filter(!_.omitGraphML).foreach { _.nodesGraphML(buf, pad + " ") }
|
||||
buf ++= s"""${pad} </graph>\n"""
|
||||
@ -94,16 +97,26 @@ abstract class LazyModule()(implicit val p: Parameters)
|
||||
nodes.filter(!_.omitGraphML) foreach { n => n.outputs.filter(!_._1.omitGraphML).foreach { case (o, l) =>
|
||||
buf ++= pad
|
||||
buf ++= "<edge"
|
||||
buf ++= s""" source=\"${index}::${n.index}\""""
|
||||
buf ++= s""" target=\"${o.lazyModule.index}::${o.index}\"><data key=\"e\"><y:PolyLineEdge>"""
|
||||
buf ++= s"""<y:Arrows source=\"none\" target=\"standard\"/>"""
|
||||
if (o.reverse) {
|
||||
buf ++= s""" target=\"${index}::${n.index}\""""
|
||||
buf ++= s""" source=\"${o.lazyModule.index}::${o.index}\">"""
|
||||
} else {
|
||||
buf ++= s""" source=\"${index}::${n.index}\""""
|
||||
buf ++= s""" target=\"${o.lazyModule.index}::${o.index}\">"""
|
||||
}
|
||||
buf ++= s"""<data key=\"e\"><y:PolyLineEdge>"""
|
||||
if (o.reverse) {
|
||||
buf ++= s"""<y:Arrows source=\"standard\" target=\"none\"/>"""
|
||||
} else {
|
||||
buf ++= s"""<y:Arrows source=\"none\" target=\"standard\"/>"""
|
||||
}
|
||||
buf ++= s"""<y:LineStyle color=\"${o.colour}\" type=\"line\" width=\"1.0\"/>"""
|
||||
buf ++= s"""<y:EdgeLabel modelName=\"centered\" rotationAngle=\"270.0\">${l}</y:EdgeLabel>"""
|
||||
buf ++= s"""</y:PolyLineEdge></data></edge>\n"""
|
||||
} }
|
||||
children.filter(!_.omitGraphML).foreach { c => c.edgesGraphML(buf, pad) }
|
||||
}
|
||||
|
||||
|
||||
def nodeIterator(iterfunc: (LazyModule) => Unit): Unit = {
|
||||
iterfunc(this)
|
||||
children.foreach( _.nodeIterator(iterfunc) )
|
||||
|
@ -17,6 +17,7 @@ trait InwardNodeImp[DI, UI, EI, BI <: Data]
|
||||
def edgeI(pd: DI, pu: UI): EI
|
||||
def bundleI(ei: EI): BI
|
||||
def colour: String
|
||||
def reverse: Boolean = false
|
||||
def connect(bindings: () => Seq[(EI, BI, BI)])(implicit p: Parameters, sourceInfo: SourceInfo): (Option[LazyModule], () => Unit) = {
|
||||
(None, () => bindings().foreach { case (_, i, o) => i <> o })
|
||||
}
|
||||
@ -60,12 +61,14 @@ abstract class BaseNode
|
||||
def nodename = getClass.getName.split('.').last
|
||||
def name = lazyModule.name + "." + nodename
|
||||
def omitGraphML = outputs.isEmpty && inputs.isEmpty
|
||||
lazy val nodedebugstring: String = ""
|
||||
|
||||
protected[diplomacy] def gci: Option[BaseNode] // greatest common inner
|
||||
protected[diplomacy] def gco: Option[BaseNode] // greatest common outer
|
||||
protected[diplomacy] def outputs: Seq[(BaseNode, String)]
|
||||
protected[diplomacy] def inputs: Seq[(BaseNode, String)]
|
||||
protected[diplomacy] def colour: String
|
||||
protected[diplomacy] def reverse: Boolean
|
||||
}
|
||||
|
||||
case class NodeHandle[DI, UI, BI <: Data, DO, UO, BO <: Data]
|
||||
@ -260,6 +263,7 @@ abstract class MixedNode[DI, UI, EI, BI <: Data, DO, UO, EO, BO <: Data](
|
||||
|
||||
// meta-data for printing the node graph
|
||||
protected[diplomacy] def colour = inner.colour
|
||||
protected[diplomacy] def reverse = inner.reverse
|
||||
protected[diplomacy] def outputs = oPorts.map(_._2) zip edgesOut.map(e => outer.labelO(e))
|
||||
protected[diplomacy] def inputs = iPorts.map(_._2) zip edgesIn .map(e => inner.labelI(e))
|
||||
}
|
||||
|
@ -160,7 +160,7 @@ class SyncRocketTile(rtp: RocketTileParams, hartid: Int)(implicit p: Parameters)
|
||||
val masterNode = TLOutputNode()
|
||||
masterNode :=* rocket.masterNode
|
||||
|
||||
val slaveNode = TLInputNode()
|
||||
val slaveNode = new TLInputNode() { override def reverse = true }
|
||||
rocket.slaveNode :*= slaveNode
|
||||
|
||||
val intNode = IntInputNode()
|
||||
@ -194,7 +194,7 @@ class AsyncRocketTile(rtp: RocketTileParams, hartid: Int)(implicit p: Parameters
|
||||
source.node :=* rocket.masterNode
|
||||
masterNode :=* source.node
|
||||
|
||||
val slaveNode = TLAsyncInputNode()
|
||||
val slaveNode = new TLAsyncInputNode() { override def reverse = true }
|
||||
val sink = LazyModule(new TLAsyncCrossingSink)
|
||||
rocket.slaveNode :*= sink.node
|
||||
sink.node :*= slaveNode
|
||||
@ -226,7 +226,7 @@ class RationalRocketTile(rtp: RocketTileParams, hartid: Int)(implicit p: Paramet
|
||||
source.node :=* rocket.masterNode
|
||||
masterNode :=* source.node
|
||||
|
||||
val slaveNode = TLRationalInputNode()
|
||||
val slaveNode = new TLRationalInputNode() { override def reverse = true }
|
||||
val sink = LazyModule(new TLRationalCrossingSink(util.SlowToFast))
|
||||
rocket.slaveNode :*= sink.node
|
||||
sink.node :*= slaveNode
|
||||
|
@ -70,6 +70,7 @@ object IntImp extends NodeImp[IntSourcePortParameters, IntSinkPortParameters, In
|
||||
def bundleI(ei: IntEdge): Vec[Bool] = Vec(ei.source.num, Bool())
|
||||
|
||||
def colour = "#0000ff" // blue
|
||||
override def reverse = true
|
||||
override def labelI(ei: IntEdge) = ei.source.sources.map(_.range.size).sum.toString
|
||||
override def labelO(eo: IntEdge) = eo.source.sources.map(_.range.size).sum.toString
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user