tilelink2: IDNode needs to be specialized for output vs. input passthrough
This commit is contained in:
		| @@ -29,12 +29,14 @@ abstract class TLFactory | ||||
|       } | ||||
|     } | ||||
|     bindings.foreach { case (x, i, y, j, s) => | ||||
|       TLMonitor.legalize(y.bundleOut(j), y.edgesOut(j), x.bundleIn(i), x.edgesIn(i), s) | ||||
|       x.bundleIn(i).<>(y.bundleOut(j))(s) | ||||
|       val in  = x.connectIn(i) | ||||
|       val out = y.connectOut(j) | ||||
|       TLMonitor.legalize(out, y.edgesOut(j), in, x.edgesIn(i), s) | ||||
|       in.<>(out)(s) | ||||
|       val mask = ~UInt(x.edgesIn(i).manager.beatBytes - 1) | ||||
|       x.bundleIn (i).a.bits.address.:=(mask & y.bundleOut(j).a.bits.address)(s) | ||||
|       y.bundleOut(j).b.bits.address.:=(mask & x.bundleIn (i).b.bits.address)(s) | ||||
|       x.bundleIn (i).c.bits.address.:=(mask & y.bundleOut(j).c.bits.address)(s) | ||||
|       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) | ||||
|     } | ||||
|   } | ||||
| } | ||||
|   | ||||
| @@ -50,6 +50,9 @@ class TLBaseNode( | ||||
|    | ||||
|   lazy val bundleOut = { require (!edgesOut.isEmpty); Vec(edgesOut.size, TLBundle(edgesOut.map(_.bundle).reduce(_.union(_)))) } | ||||
|   lazy val bundleIn  = { require (!edgesIn .isEmpty); Vec(edgesIn .size, TLBundle(edgesIn .map(_.bundle).reduce(_.union(_)))).flip } | ||||
|  | ||||
|   def connectOut = bundleOut | ||||
|   def connectIn = bundleIn | ||||
| } | ||||
|  | ||||
| class TLClientNode( | ||||
| @@ -109,13 +112,32 @@ object TLAdapterNode | ||||
|     numManagerPorts: Range.Inclusive = 1 to 1) = new TLAdapterNode(clientFn, managerFn, numClientPorts, numManagerPorts) | ||||
| } | ||||
|  | ||||
| class TLIDNode extends TLBaseNode( | ||||
| class TLOutputNode extends TLBaseNode( | ||||
|     clientFn  = Some({case Seq(x) => x}), | ||||
|     managerFn = Some({case Seq(x) => x}), | ||||
|     numClientPorts  = 1 to 1, | ||||
|     numManagerPorts = 1 to 1) | ||||
|  | ||||
| object TLIDNode | ||||
| { | ||||
|   def apply() = new TLIDNode() | ||||
|   override def connectOut = bundleOut | ||||
|   override def connectIn  = bundleOut | ||||
| } | ||||
|  | ||||
| object TLOutputNode | ||||
| { | ||||
|   def apply() = new TLOutputNode() | ||||
| } | ||||
|  | ||||
| class TLInputNode extends TLBaseNode( | ||||
|     clientFn  = Some({case Seq(x) => x}), | ||||
|     managerFn = Some({case Seq(x) => x}), | ||||
|     numClientPorts  = 1 to 1, | ||||
|     numManagerPorts = 1 to 1) | ||||
| { | ||||
|   override def connectOut = bundleIn | ||||
|   override def connectIn  = bundleIn | ||||
| } | ||||
|  | ||||
| object TLInputNode | ||||
| { | ||||
|   def apply() = new TLInputNode() | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user