From b7f1ba34289c92275e229c1298c771615f8a54e9 Mon Sep 17 00:00:00 2001 From: "Wesley W. Terpstra" Date: Wed, 12 Jul 2017 22:20:31 -0700 Subject: [PATCH] tilelink: FIFOFixer must support null cases (#860) In particular, it is ok if no slaves actually need FIFO fixing. It is also ok if none of those fixed are FIFO. --- src/main/scala/tilelink/FIFOFixer.scala | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/main/scala/tilelink/FIFOFixer.scala b/src/main/scala/tilelink/FIFOFixer.scala index 40f91e6d..90b42b3d 100644 --- a/src/main/scala/tilelink/FIFOFixer.scala +++ b/src/main/scala/tilelink/FIFOFixer.scala @@ -50,23 +50,28 @@ class TLFIFOFixer(policy: TLFIFOFixer.Policy = TLFIFOFixer.all)(implicit p: Para val (fixMap, splatMap) = fifoMap(edgeOut.manager.managers) // Do we need to serialize the request to this manager? - // println(s"make FIFO: ${edgeIn.manager.managers.filter(_.fifoId==Some(0)).map(_.name).mkString(", ")}") - // println(s"not FIFO: ${edgeIn.manager.managers.filter(_.fifoId!=Some(0)).map(_.name).mkString(", ")}") val a_notFIFO = edgeIn.manager.fastProperty(in.a.bits.address, _.fifoId != Some(0), (b:Boolean) => Bool(b)) // Does this manager have an existing FIFO domain? (don't care about unserialized cases) val hackExist = ((fixMap zip splatMap) zip edgeOut.manager.managers) flatMap { case ((f, s), m) => if (f == Some(0)) Some(m.copy(fifoId = s)) else None } - // println(s"has domain: ${hackExist.filter( _.fifoId.isDefined).map(_.name).mkString(", ")}") - // println(s"no domain: ${hackExist.filter(!_.fifoId.isDefined).map(_.name).mkString(", ")}") - val a_noDomain = edgeOut.manager.copy(managers = hackExist).fastProperty(in.a.bits.address, !_.fifoId.isDefined, (b:Boolean) => Bool(b)) + val a_noDomain = if (hackExist.isEmpty) Bool(true) else + edgeOut.manager.copy(managers = hackExist).fastProperty(in.a.bits.address, !_.fifoId.isDefined, (b:Boolean) => Bool(b)) // What is that domain? (don't care about noDomain cases) val hackDomain = hackExist.filter(_.fifoId.isDefined) - // println(s"domains: ${hackDomain.groupBy(_.name).mapValues(_.map(_.fifoId))}") - // println("") - val a_id = edgeOut.manager.copy(managers = hackDomain).fastProperty(in.a.bits.address, _.fifoId.get, (id:Int) => UInt(id)) + val a_id = if (hackDomain.isEmpty) UInt(0) else + edgeOut.manager.copy(managers = hackDomain).fastProperty(in.a.bits.address, _.fifoId.get, (id:Int) => UInt(id)) val maxId = hackDomain.flatMap(_.fifoId).foldLeft(0)(max) + if (false) { + println(s"make FIFO: ${edgeIn.manager.managers.filter(_.fifoId==Some(0)).map(_.name).mkString(", ")}") + println(s"not FIFO: ${edgeIn.manager.managers.filter(_.fifoId!=Some(0)).map(_.name).mkString(", ")}") + println(s"has domain: ${hackExist.filter( _.fifoId.isDefined).map(_.name).mkString(", ")}") + println(s"no domain: ${hackExist.filter(!_.fifoId.isDefined).map(_.name).mkString(", ")}") + println(s"domains: ${hackDomain.groupBy(_.name).mapValues(_.map(_.fifoId))}") + println("") + } + // Count beats val a_first = edgeIn.first(in.a) val d_first = edgeOut.first(out.d) && out.d.bits.opcode =/= TLMessages.ReleaseAck