aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/firrtl/passes/wiring/Wiring.scala
diff options
context:
space:
mode:
authorKevin Laeufer2020-08-05 13:35:41 -0700
committerGitHub2020-08-05 20:35:41 +0000
commitb1ec7cd70ab267cd30d8421651625ba1d9a623ff (patch)
tree237c666247aa285719d38bb46ea3445f0d880703 /src/main/scala/firrtl/passes/wiring/Wiring.scala
parent687f3ddbbcd9217542a4bc0e2c256559d2c67a5b (diff)
Deprecate InstanceGraph (#1800)
* InstanceKeyGraph: add staticInstanceCount, getGraph and getChildrenInstanceMap * InstanceKeyGraph: reachableModules, unreachableModules, lowestCommonAncestor and fullHierarchy * Replace usage of InstanceGraph with InstanceKeyGraph Also deprecates all unused methods. * WiringUtils: make new version of sinksToSources package private This will make our live easier next time we need to change it. * CircuitGraph: use InstanceKeyGraph * InstanceKeyGraphSpec: respect maximum line width * InstanceKeyGraph: make constructor private * InstanceKeyGraph: move lowestCommonAncestor function to Wiring * WiringUtils: update deprecation message
Diffstat (limited to 'src/main/scala/firrtl/passes/wiring/Wiring.scala')
-rw-r--r--src/main/scala/firrtl/passes/wiring/Wiring.scala32
1 files changed, 20 insertions, 12 deletions
diff --git a/src/main/scala/firrtl/passes/wiring/Wiring.scala b/src/main/scala/firrtl/passes/wiring/Wiring.scala
index c62a565e..3f74e5d2 100644
--- a/src/main/scala/firrtl/passes/wiring/Wiring.scala
+++ b/src/main/scala/firrtl/passes/wiring/Wiring.scala
@@ -5,11 +5,14 @@ package wiring
import firrtl._
import firrtl.ir._
+
import scala.collection.mutable
import firrtl.annotations._
import firrtl.annotations.AnnotationUtils._
-import firrtl.analyses.InstanceGraph
+import firrtl.analyses.InstanceKeyGraph
import WiringUtils._
+import firrtl.analyses.InstanceKeyGraph.InstanceKey
+import firrtl.graph.EulerTour
/** A data store of one sink--source wiring relationship */
case class WiringInfo(source: ComponentName, sinks: Seq[Named], pin: String)
@@ -47,7 +50,7 @@ class Wiring(wiSeq: Seq[WiringInfo]) extends Pass {
else ns.newName(tokenize(c) filterNot ("[]." contains _) mkString "_")
})}}
- val iGraph = new InstanceGraph(c)
+ val iGraph = InstanceKeyGraph(c)
names.zip(portNames).map{ case(WiringNames(comp, so, si, _), pn) =>
computeModifications(c, iGraph, comp, so, si, pn) }
}
@@ -67,7 +70,7 @@ class Wiring(wiSeq: Seq[WiringInfo]) extends Pass {
* to pending modifications
*/
private def computeModifications(c: Circuit,
- iGraph: InstanceGraph,
+ iGraph: InstanceKeyGraph,
compName: String,
source: String,
sinks: Seq[Named],
@@ -94,12 +97,17 @@ class Wiring(wiSeq: Seq[WiringInfo]) extends Pass {
def makeWireC(m: Modifications, portName: String, c: (String, String)): Modifications =
m.copy(addPortOrWire = Some(m.addPortOrWire.getOrElse((portName, DecWire))), cons = (m.cons :+ c).distinct )
+ val tour = EulerTour(iGraph.graph, iGraph.top)
+ // Finds the lowest common ancestor instances for two module names in a design
+ def lowestCommonAncestor(moduleA: Seq[InstanceKey], moduleB: Seq[InstanceKey]): Seq[InstanceKey] =
+ tour.rmq(moduleA, moduleB)
+
owners.foreach { case (sink, source) =>
- val lca = iGraph.lowestCommonAncestor(sink, source)
+ val lca = lowestCommonAncestor(sink, source)
// Compute metadata along Sink to LCA paths.
sink.drop(lca.size - 1).sliding(2).toList.reverse.foreach {
- case Seq(WDefInstance(_,_,pm,_), WDefInstance(_,ci,cm,_)) =>
+ case Seq(InstanceKey(_,pm), InstanceKey(ci,cm)) =>
val to = s"$ci.${portNames(cm)}"
val from = s"${portNames(pm)}"
meta(pm) = makeWireC(meta(pm), portNames(pm), (to, from))
@@ -107,12 +115,12 @@ class Wiring(wiSeq: Seq[WiringInfo]) extends Pass {
addPortOrWire = Some((portNames(cm), DecInput))
)
// Case where the sink is the LCA
- case Seq(WDefInstance(_,_,pm,_)) =>
+ case Seq(InstanceKey(_,pm)) =>
// Case where the source is also the LCA
if (source.drop(lca.size).isEmpty) {
meta(pm) = makeWire(meta(pm), portNames(pm))
} else {
- val WDefInstance(_,ci,cm,_) = source.drop(lca.size).head
+ val InstanceKey(ci,cm) = source.drop(lca.size).head
val to = s"${portNames(pm)}"
val from = s"$ci.${portNames(cm)}"
meta(pm) = makeWireC(meta(pm), portNames(pm), (to, from))
@@ -120,7 +128,7 @@ class Wiring(wiSeq: Seq[WiringInfo]) extends Pass {
}
// Compute metadata for the Sink
- sink.last match { case WDefInstance(_, _, m, _) =>
+ sink.last match { case InstanceKey( _, m) =>
if (sinkComponents.contains(m)) {
val from = s"${portNames(m)}"
sinkComponents(m).foreach( to =>
@@ -132,7 +140,7 @@ class Wiring(wiSeq: Seq[WiringInfo]) extends Pass {
}
// Compute metadata for the Source
- source.last match { case WDefInstance(_, _, m, _) =>
+ source.last match { case InstanceKey( _, m) =>
val to = s"${portNames(m)}"
val from = compName
meta(m) = meta(m).copy(
@@ -142,7 +150,7 @@ class Wiring(wiSeq: Seq[WiringInfo]) extends Pass {
// Compute metadata along Source to LCA path
source.drop(lca.size - 1).sliding(2).toList.reverse.map {
- case Seq(WDefInstance(_,_,pm,_), WDefInstance(_,ci,cm,_)) => {
+ case Seq(InstanceKey(_,pm), InstanceKey(ci,cm)) => {
val to = s"${portNames(pm)}"
val from = s"$ci.${portNames(cm)}"
meta(pm) = meta(pm).copy(
@@ -153,12 +161,12 @@ class Wiring(wiSeq: Seq[WiringInfo]) extends Pass {
)
}
// Case where the source is the LCA
- case Seq(WDefInstance(_,_,pm,_)) => {
+ case Seq(InstanceKey(_,pm)) => {
// Case where the sink is also the LCA. We do nothing here,
// as we've created the connecting wire above
if (sink.drop(lca.size).isEmpty) {
} else {
- val WDefInstance(_,ci,cm,_) = sink.drop(lca.size).head
+ val InstanceKey(ci,cm) = sink.drop(lca.size).head
val to = s"$ci.${portNames(cm)}"
val from = s"${portNames(pm)}"
meta(pm) = meta(pm).copy(