aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/scala/firrtl/passes/memlib/MemConf.scala19
-rw-r--r--src/test/scala/firrtlTests/ReplSeqMemTests.scala12
2 files changed, 29 insertions, 2 deletions
diff --git a/src/main/scala/firrtl/passes/memlib/MemConf.scala b/src/main/scala/firrtl/passes/memlib/MemConf.scala
index 637b57e0..8063c627 100644
--- a/src/main/scala/firrtl/passes/memlib/MemConf.scala
+++ b/src/main/scala/firrtl/passes/memlib/MemConf.scala
@@ -13,7 +13,21 @@ case object MaskedReadWritePort extends MemPort("mrw")
object MemPort {
- val all = Set(ReadPort, WritePort, MaskedWritePort, ReadWritePort, MaskedReadWritePort)
+ // This is the order that ports will render in MemConf.portsStr
+ val ordered: Seq[MemPort] = Seq(
+ MaskedReadWritePort,
+ MaskedWritePort,
+ ReadWritePort,
+ WritePort,
+ ReadPort
+ )
+
+ val all: Set[MemPort] = ordered.toSet
+ // uses orderedPorts when sorting MemPorts
+ implicit def ordering: Ordering[MemPort] = {
+ val orderedPorts = ordered.zipWithIndex.toMap
+ Ordering.by(e => orderedPorts(e))
+ }
def apply(s: String): Option[MemPort] = MemPort.all.find(_.name == s)
@@ -38,7 +52,8 @@ case class MemConf(
ports: Map[MemPort, Int],
maskGranularity: Option[Int]) {
- private def portsStr = ports.map { case (port, num) => Seq.fill(num)(port.name).mkString(",") }.mkString(",")
+ private def portsStr =
+ ports.toSeq.sortBy(_._1).map { case (port, num) => Seq.fill(num)(port.name).mkString(",") }.mkString(",")
private def maskGranStr = maskGranularity.map((p) => s"mask_gran $p").getOrElse("")
// Assert that all of the entries in the port map are greater than zero to make it easier to compare two of these case classes
diff --git a/src/test/scala/firrtlTests/ReplSeqMemTests.scala b/src/test/scala/firrtlTests/ReplSeqMemTests.scala
index d9dc2e57..e8d72043 100644
--- a/src/test/scala/firrtlTests/ReplSeqMemTests.scala
+++ b/src/test/scala/firrtlTests/ReplSeqMemTests.scala
@@ -693,4 +693,16 @@ circuit Top :
|""".stripMargin
compileAndEmit(CircuitState(parse(input), ChirrtlForm))
}
+
+ "MemPorts" should "serialize in a deterministic order regardless" in {
+ def compare(seq1: Seq[MemPort]) {
+ val m1 = MemConf("memconf", 8, 16, seq1.map(s => s -> 1).toMap, None)
+ val m2 = MemConf("memconf", 8, 16, seq1.reverse.map(s => s -> 1).toMap, None)
+ m1.toString should be(m2.toString)
+ }
+
+ compare(Seq(ReadPort, WritePort))
+ compare(Seq(MaskedWritePort, ReadWritePort))
+ compare(Seq(MaskedReadWritePort, WritePort, ReadWritePort))
+ }
}