From 915a929af1a1db77bcafe393cd60476aa2c1abab Mon Sep 17 00:00:00 2001 From: "Wesley W. Terpstra" Date: Fri, 16 Sep 2016 17:25:00 -0700 Subject: [PATCH] tilelink2: Nodes can now mix context into parameters --- src/main/scala/uncore/tilelink2/Nodes.scala | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/scala/uncore/tilelink2/Nodes.scala b/src/main/scala/uncore/tilelink2/Nodes.scala index a0de1a84..c9482e69 100644 --- a/src/main/scala/uncore/tilelink2/Nodes.scala +++ b/src/main/scala/uncore/tilelink2/Nodes.scala @@ -17,6 +17,9 @@ abstract class NodeImp[PO, PI, EO, EI, B <: Data] def bundleO(eo: Seq[EO]): Vec[B] def bundleI(ei: Seq[EI]): Vec[B] def connect(bo: B, eo: EO, bi: B, ei: EI)(implicit sourceInfo: SourceInfo): Unit + // If you want to track parameters as they flow through nodes, overload these: + def mixO(po: PO, node: BaseNode[PO, PI, EO, EI, B]): PO = po + def mixI(pi: PI, node: BaseNode[PO, PI, EO, EI, B]): PI = pi } class RootNode @@ -59,12 +62,12 @@ class BaseNode[PO, PI, EO, EI, B <: Data](imp: NodeImp[PO, PI, EO, EI, B])( private lazy val oParams : Seq[PO] = { val o = oFn(oPorts.size, iPorts.map{ case (i, n) => n.oParams(i) }) reqE(oPorts.size, o.size) - o + o.map(imp.mixO(_, this)) } private lazy val iParams : Seq[PI] = { val i = iFn(iPorts.size, oPorts.map{ case (o, n) => n.iParams(o) }) reqE(i.size, iPorts.size) - i + i.map(imp.mixI(_, this)) } lazy val edgesOut = (oPorts zip oParams).map { case ((i, n), o) => imp.edgeO(o, n.iParams(i)) }