1
0

diplomacy: auto connect bundles in a stable order (#1045)

This commit is contained in:
Wesley W. Terpstra 2017-10-10 19:41:46 -07:00 committed by GitHub
parent b2bc46471b
commit 10472b4296

View File

@ -6,7 +6,7 @@ import Chisel._
import chisel3.experimental.{BaseModule, RawModule, MultiIOModule, withClockAndReset} import chisel3.experimental.{BaseModule, RawModule, MultiIOModule, withClockAndReset}
import chisel3.internal.sourceinfo.{SourceInfo, SourceLine, UnlocatableSourceInfo} import chisel3.internal.sourceinfo.{SourceInfo, SourceLine, UnlocatableSourceInfo}
import freechips.rocketchip.config.Parameters import freechips.rocketchip.config.Parameters
import scala.collection.immutable.ListMap import scala.collection.immutable.{SortedMap,ListMap}
import scala.util.matching._ import scala.util.matching._
abstract class LazyModule()(implicit val p: Parameters) abstract class LazyModule()(implicit val p: Parameters)
@ -156,7 +156,8 @@ sealed trait LazyModuleImpLike extends BaseModule
} }
val nodeDangles = wrapper.nodes.reverse.flatMap(_.instantiate()) val nodeDangles = wrapper.nodes.reverse.flatMap(_.instantiate())
val allDangles = nodeDangles ++ childDangles val allDangles = nodeDangles ++ childDangles
val done = Set() ++ allDangles.groupBy(_.source).values.filter(_.size == 2).map { case Seq(a, b) => val pairing = SortedMap(allDangles.groupBy(_.source).toSeq:_*)
val done = Set() ++ pairing.values.filter(_.size == 2).map { case Seq(a, b) =>
require (a.flipped != b.flipped) require (a.flipped != b.flipped)
if (a.flipped) { a.data <> b.data } else { b.data <> a.data } if (a.flipped) { a.data <> b.data } else { b.data <> a.data }
a.source a.source
@ -210,7 +211,10 @@ object LazyScope
} }
} }
case class HalfEdge(serial: Int, index: Int) case class HalfEdge(serial: Int, index: Int) extends Ordered[HalfEdge] {
import scala.math.Ordered.orderingToOrdered
def compare(that: HalfEdge) = HalfEdge.unapply(this) compare HalfEdge.unapply(that)
}
case class Dangle(source: HalfEdge, sink: HalfEdge, flipped: Boolean, name: String, data: Data) case class Dangle(source: HalfEdge, sink: HalfEdge, flipped: Boolean, name: String, data: Data)
final class AutoBundle(elts: (String, Data, Boolean)*) extends Record { final class AutoBundle(elts: (String, Data, Boolean)*) extends Record {