diplomacy: print out bus widths on edges in agent graph
This commit is contained in:
		| @@ -62,7 +62,7 @@ abstract class LazyModule | ||||
|  | ||||
|   private def nodesGraphML(buf: StringBuilder, pad: String) { | ||||
|     buf ++= s"""${pad}<node id=\"${index}\">\n""" | ||||
|     buf ++= s"""${pad}  <data key=\"n\"><y:ShapeNode><y:NodeLabel modelName=\"sides\" modelPosition=\"w\" fontSize=\"10\" borderDistance=\"1.0\" rotationAngle=\"270.0\">${module.name}</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""" | ||||
|     nodes.filter(!_.omitGraphML).foreach { n => | ||||
|       buf ++= s"""${pad}    <node id=\"${index}::${n.index}\"/>\n""" | ||||
| @@ -72,11 +72,15 @@ abstract class LazyModule | ||||
|     buf ++= s"""${pad}</node>\n""" | ||||
|   } | ||||
|   private def edgesGraphML(buf: StringBuilder, pad: String) { | ||||
|     nodes.filter(!_.omitGraphML) foreach { n => n.outputs.filter(!_.omitGraphML).foreach { o => | ||||
|     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><y:Arrows source=\"none\" target=\"standard\"/><y:LineStyle color=\"${o.colour}\" type=\"line\" width=\"1.0\"/></y:PolyLineEdge></data></edge>\n""" | ||||
|       buf ++= s""" target=\"${o.lazyModule.index}::${o.index}\"><data key=\"e\"><y:PolyLineEdge>""" | ||||
|       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) } | ||||
|   } | ||||
|   | ||||
| @@ -20,6 +20,7 @@ trait InwardNodeImp[DI, UI, EI, BI <: Data] | ||||
|   // optional methods to track node graph | ||||
|   def mixI(pu: UI, node: InwardNode[DI, UI, BI]): UI = pu // insert node into parameters | ||||
|   def getO(pu: UI): Option[BaseNode] = None // most-outward common node | ||||
|   def labelI(ei: EI) = "" | ||||
| } | ||||
|  | ||||
| // DO = Downwards flowing Parameters generated by the outer side of the node | ||||
| @@ -34,6 +35,7 @@ trait OutwardNodeImp[DO, UO, EO, BO <: Data] | ||||
|   // optional methods to track node graph | ||||
|   def mixO(pd: DO, node: OutwardNode[DO, UO, BO]): DO = pd // insert node into parameters | ||||
|   def getI(pd: DO): Option[BaseNode] = None // most-inward common node | ||||
|   def labelO(eo: EO) = "" | ||||
| } | ||||
|  | ||||
| abstract class NodeImp[D, U, EO, EI, B <: Data] | ||||
| @@ -54,8 +56,8 @@ abstract class BaseNode | ||||
|  | ||||
|   protected[diplomacy] def gci: Option[BaseNode] // greatest common inner | ||||
|   protected[diplomacy] def gco: Option[BaseNode] // greatest common outer | ||||
|   protected[diplomacy] def outputs: Seq[BaseNode] | ||||
|   protected[diplomacy] def inputs:  Seq[BaseNode] | ||||
|   protected[diplomacy] def outputs: Seq[(BaseNode, String)] | ||||
|   protected[diplomacy] def inputs:  Seq[(BaseNode, String)] | ||||
|   protected[diplomacy] def colour:  String | ||||
| } | ||||
|  | ||||
| @@ -140,8 +142,8 @@ 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 outputs = oPorts.map(_._2) | ||||
|   protected[diplomacy] def inputs  = iPorts.map(_._2) | ||||
|   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)) | ||||
|  | ||||
|   private def reqE(o: Int, i: Int) = require(i == o, s"${name} has ${i} inputs and ${o} outputs; they must match${lazyModule.line}") | ||||
|   protected[diplomacy] lazy val oParams: Seq[DO] = { | ||||
|   | ||||
| @@ -5,6 +5,7 @@ package groundtest | ||||
| object Generator extends util.GeneratorApp { | ||||
|   val longName = names.topModuleProject + "." + names.configs | ||||
|   generateFirrtl | ||||
|   generateGraphML | ||||
|   generateTestSuiteMakefrags // TODO: Needed only for legacy make targets | ||||
|   generateParameterDump // TODO: Needed only for legacy make targets | ||||
| } | ||||
|   | ||||
| @@ -20,6 +20,9 @@ object AXI4Imp extends NodeImp[AXI4MasterPortParameters, AXI4SlavePortParameters | ||||
|   } | ||||
|  | ||||
|   def colour = "#00ccff" // bluish | ||||
|   override def labelI(ei: AXI4EdgeParameters) = (ei.slave.beatBytes * 8).toString | ||||
|   override def labelO(eo: AXI4EdgeParameters) = (eo.slave.beatBytes * 8).toString | ||||
|  | ||||
|   def connect(bo: => AXI4Bundle, bi: => AXI4Bundle, ei: => AXI4EdgeParameters)(implicit sourceInfo: SourceInfo): (Option[LazyModule], () => Unit) = { | ||||
|     (None, () => { bi <> bo }) | ||||
|   } | ||||
|   | ||||
| @@ -62,6 +62,9 @@ object IntImp extends NodeImp[IntSourcePortParameters, IntSinkPortParameters, In | ||||
|   } | ||||
|  | ||||
|   def colour = "#0000ff" // blue | ||||
|   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 | ||||
|  | ||||
|   def connect(bo: => Vec[Bool], bi: => Vec[Bool], ei: => IntEdge)(implicit sourceInfo: SourceInfo): (Option[LazyModule], () => Unit) = { | ||||
|     (None, () => { | ||||
|       // Cannot use bulk connect, because the widths could differ | ||||
|   | ||||
| @@ -25,6 +25,9 @@ object TLImp extends NodeImp[TLClientPortParameters, TLManagerPortParameters, TL | ||||
|   var combinationalCheck = false | ||||
|  | ||||
|   def colour = "#000000" // black | ||||
|   override def labelI(ei: TLEdgeIn)  = (ei.manager.beatBytes * 8).toString | ||||
|   override def labelO(eo: TLEdgeOut) = (eo.manager.beatBytes * 8).toString | ||||
|  | ||||
|   def connect(bo: => TLBundle, bi: => TLBundle, ei: => TLEdgeIn)(implicit sourceInfo: SourceInfo): (Option[LazyModule], () => Unit) = { | ||||
|     val monitor = if (emitMonitors) { | ||||
|       Some(LazyModule(new TLMonitor(() => new TLBundleSnoop(bo.params), () => ei, sourceInfo))) | ||||
| @@ -159,6 +162,9 @@ object TLAsyncImp extends NodeImp[TLAsyncClientPortParameters, TLAsyncManagerPor | ||||
|   } | ||||
|  | ||||
|   def colour = "#ff0000" // red | ||||
|   override def labelI(ei: TLAsyncEdgeParameters) = ei.manager.depth.toString | ||||
|   override def labelO(eo: TLAsyncEdgeParameters) = eo.manager.depth.toString | ||||
|  | ||||
|   def connect(bo: => TLAsyncBundle, bi: => TLAsyncBundle, ei: => TLAsyncEdgeParameters)(implicit sourceInfo: SourceInfo): (Option[LazyModule], () => Unit) = { | ||||
|     (None, () => { bi <> bo }) | ||||
|   } | ||||
|   | ||||
| @@ -5,6 +5,7 @@ package unittest | ||||
| object Generator extends util.GeneratorApp { | ||||
|   val longName = names.topModuleProject + "." + names.configs | ||||
|   generateFirrtl | ||||
|   generateGraphML | ||||
|   generateTestSuiteMakefrags // TODO: Needed only for legacy make targets | ||||
|   generateParameterDump // TODO: Needed only for legacy make targets | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user