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
@ -62,13 +62,14 @@ abstract class LazyModule()(implicit val p: Parameters)
|
|||||||
bindings.reverse.foreach { f => f () }
|
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 {
|
lazy val graphML: String = parent.map(_.graphML).getOrElse {
|
||||||
val buf = new StringBuilder
|
val buf = new StringBuilder
|
||||||
buf ++= "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
|
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 ++= "<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=\"node\" id=\"n\" yfiles.type=\"nodegraphics\"/>\n"
|
||||||
buf ++= " <key for=\"edge\" id=\"e\" yfiles.type=\"edgegraphics\"/>\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"
|
buf ++= " <graph id=\"G\" edgedefault=\"directed\">\n"
|
||||||
nodesGraphML(buf, " ")
|
nodesGraphML(buf, " ")
|
||||||
edgesGraphML(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} <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"""
|
buf ++= s"""${pad} <graph id=\"${index}::\" edgedefault=\"directed\">\n"""
|
||||||
nodes.filter(!_.omitGraphML).foreach { 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 + " ") }
|
children.filter(!_.omitGraphML).foreach { _.nodesGraphML(buf, pad + " ") }
|
||||||
buf ++= s"""${pad} </graph>\n"""
|
buf ++= s"""${pad} </graph>\n"""
|
||||||
@ -94,9 +97,19 @@ abstract class LazyModule()(implicit val p: Parameters)
|
|||||||
nodes.filter(!_.omitGraphML) foreach { n => n.outputs.filter(!_._1.omitGraphML).foreach { case (o, l) =>
|
nodes.filter(!_.omitGraphML) foreach { n => n.outputs.filter(!_._1.omitGraphML).foreach { case (o, l) =>
|
||||||
buf ++= pad
|
buf ++= pad
|
||||||
buf ++= "<edge"
|
buf ++= "<edge"
|
||||||
|
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""" source=\"${index}::${n.index}\""""
|
||||||
buf ++= s""" target=\"${o.lazyModule.index}::${o.index}\"><data key=\"e\"><y:PolyLineEdge>"""
|
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:Arrows source=\"none\" target=\"standard\"/>"""
|
||||||
|
}
|
||||||
buf ++= s"""<y:LineStyle color=\"${o.colour}\" type=\"line\" width=\"1.0\"/>"""
|
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:EdgeLabel modelName=\"centered\" rotationAngle=\"270.0\">${l}</y:EdgeLabel>"""
|
||||||
buf ++= s"""</y:PolyLineEdge></data></edge>\n"""
|
buf ++= s"""</y:PolyLineEdge></data></edge>\n"""
|
||||||
|
@ -17,6 +17,7 @@ trait InwardNodeImp[DI, UI, EI, BI <: Data]
|
|||||||
def edgeI(pd: DI, pu: UI): EI
|
def edgeI(pd: DI, pu: UI): EI
|
||||||
def bundleI(ei: EI): BI
|
def bundleI(ei: EI): BI
|
||||||
def colour: String
|
def colour: String
|
||||||
|
def reverse: Boolean = false
|
||||||
def connect(bindings: () => Seq[(EI, BI, BI)])(implicit p: Parameters, sourceInfo: SourceInfo): (Option[LazyModule], () => Unit) = {
|
def connect(bindings: () => Seq[(EI, BI, BI)])(implicit p: Parameters, sourceInfo: SourceInfo): (Option[LazyModule], () => Unit) = {
|
||||||
(None, () => bindings().foreach { case (_, i, o) => i <> o })
|
(None, () => bindings().foreach { case (_, i, o) => i <> o })
|
||||||
}
|
}
|
||||||
@ -60,12 +61,14 @@ abstract class BaseNode
|
|||||||
def nodename = getClass.getName.split('.').last
|
def nodename = getClass.getName.split('.').last
|
||||||
def name = lazyModule.name + "." + nodename
|
def name = lazyModule.name + "." + nodename
|
||||||
def omitGraphML = outputs.isEmpty && inputs.isEmpty
|
def omitGraphML = outputs.isEmpty && inputs.isEmpty
|
||||||
|
lazy val nodedebugstring: String = ""
|
||||||
|
|
||||||
protected[diplomacy] def gci: Option[BaseNode] // greatest common inner
|
protected[diplomacy] def gci: Option[BaseNode] // greatest common inner
|
||||||
protected[diplomacy] def gco: Option[BaseNode] // greatest common outer
|
protected[diplomacy] def gco: Option[BaseNode] // greatest common outer
|
||||||
protected[diplomacy] def outputs: Seq[(BaseNode, String)]
|
protected[diplomacy] def outputs: Seq[(BaseNode, String)]
|
||||||
protected[diplomacy] def inputs: Seq[(BaseNode, String)]
|
protected[diplomacy] def inputs: Seq[(BaseNode, String)]
|
||||||
protected[diplomacy] def colour: String
|
protected[diplomacy] def colour: String
|
||||||
|
protected[diplomacy] def reverse: Boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
case class NodeHandle[DI, UI, BI <: Data, DO, UO, BO <: Data]
|
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
|
// meta-data for printing the node graph
|
||||||
protected[diplomacy] def colour = inner.colour
|
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 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))
|
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()
|
val masterNode = TLOutputNode()
|
||||||
masterNode :=* rocket.masterNode
|
masterNode :=* rocket.masterNode
|
||||||
|
|
||||||
val slaveNode = TLInputNode()
|
val slaveNode = new TLInputNode() { override def reverse = true }
|
||||||
rocket.slaveNode :*= slaveNode
|
rocket.slaveNode :*= slaveNode
|
||||||
|
|
||||||
val intNode = IntInputNode()
|
val intNode = IntInputNode()
|
||||||
@ -194,7 +194,7 @@ class AsyncRocketTile(rtp: RocketTileParams, hartid: Int)(implicit p: Parameters
|
|||||||
source.node :=* rocket.masterNode
|
source.node :=* rocket.masterNode
|
||||||
masterNode :=* source.node
|
masterNode :=* source.node
|
||||||
|
|
||||||
val slaveNode = TLAsyncInputNode()
|
val slaveNode = new TLAsyncInputNode() { override def reverse = true }
|
||||||
val sink = LazyModule(new TLAsyncCrossingSink)
|
val sink = LazyModule(new TLAsyncCrossingSink)
|
||||||
rocket.slaveNode :*= sink.node
|
rocket.slaveNode :*= sink.node
|
||||||
sink.node :*= slaveNode
|
sink.node :*= slaveNode
|
||||||
@ -226,7 +226,7 @@ class RationalRocketTile(rtp: RocketTileParams, hartid: Int)(implicit p: Paramet
|
|||||||
source.node :=* rocket.masterNode
|
source.node :=* rocket.masterNode
|
||||||
masterNode :=* source.node
|
masterNode :=* source.node
|
||||||
|
|
||||||
val slaveNode = TLRationalInputNode()
|
val slaveNode = new TLRationalInputNode() { override def reverse = true }
|
||||||
val sink = LazyModule(new TLRationalCrossingSink(util.SlowToFast))
|
val sink = LazyModule(new TLRationalCrossingSink(util.SlowToFast))
|
||||||
rocket.slaveNode :*= sink.node
|
rocket.slaveNode :*= sink.node
|
||||||
sink.node :*= slaveNode
|
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 bundleI(ei: IntEdge): Vec[Bool] = Vec(ei.source.num, Bool())
|
||||||
|
|
||||||
def colour = "#0000ff" // blue
|
def colour = "#0000ff" // blue
|
||||||
|
override def reverse = true
|
||||||
override def labelI(ei: IntEdge) = ei.source.sources.map(_.range.size).sum.toString
|
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
|
override def labelO(eo: IntEdge) = eo.source.sources.map(_.range.size).sum.toString
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user