clean up addrmap flatten function
This commit is contained in:
@ -75,13 +75,13 @@ object AddrMap {
|
||||
}
|
||||
|
||||
class AddrMap(entriesIn: Seq[AddrMapEntry], val start: BigInt = BigInt(0)) extends MemRegion {
|
||||
def isEmpty = entries.isEmpty
|
||||
def length = entries.size
|
||||
def numSlaves = entries.map(_.region.numSlaves).foldLeft(0)(_ + _)
|
||||
|
||||
private val slavePorts = HashMap[String, Int]()
|
||||
private val mapping = HashMap[String, MemRegion]()
|
||||
|
||||
def isEmpty = entries.isEmpty
|
||||
def length = entries.size
|
||||
def numSlaves = slavePorts.size
|
||||
|
||||
val (size: BigInt, entries: Seq[AddrMapEntry], attr: MemAttr) = {
|
||||
var ind = 0
|
||||
var base = start
|
||||
@ -119,11 +119,11 @@ class AddrMap(entriesIn: Seq[AddrMapEntry], val start: BigInt = BigInt(0)) exten
|
||||
(base - start, rebasedEntries, MemAttr(prot, cacheable))
|
||||
}
|
||||
|
||||
val flatten: Seq[(String, MemRange)] = {
|
||||
val arr = new Array[(String, MemRange)](slavePorts.size)
|
||||
for ((name, port) <- slavePorts)
|
||||
arr(port) = (name, mapping(name).asInstanceOf[MemRange])
|
||||
arr
|
||||
val flatten: Seq[AddrMapEntry] = {
|
||||
mapping.toSeq.map {
|
||||
case (name, range: MemRange) => Some(AddrMapEntry(name, range))
|
||||
case _ => None
|
||||
}.flatten.sortBy(_.region.start)
|
||||
}
|
||||
|
||||
def toRange: MemRange = MemRange(start, size, attr)
|
||||
@ -134,20 +134,19 @@ class AddrMap(entriesIn: Seq[AddrMapEntry], val start: BigInt = BigInt(0)) exten
|
||||
def isInRegion(name: String, addr: UInt): Bool = mapping(name).containsAddress(addr)
|
||||
|
||||
def isCacheable(addr: UInt): Bool = {
|
||||
flatten.filter(_._2.attr.cacheable).map { case (_, region) =>
|
||||
region.containsAddress(addr)
|
||||
}.foldLeft(Bool(false))(_ || _)
|
||||
flatten.filter(_.region.attr.cacheable).map(
|
||||
_.region.containsAddress(addr)
|
||||
).foldLeft(Bool(false))(_ || _)
|
||||
}
|
||||
|
||||
def isValid(addr: UInt): Bool = {
|
||||
flatten.map { case (_, region) =>
|
||||
region.containsAddress(addr)
|
||||
}.foldLeft(Bool(false))(_ || _)
|
||||
flatten.map(_.region.containsAddress(addr)).foldLeft(Bool(false))(_ || _)
|
||||
}
|
||||
|
||||
def getProt(addr: UInt): AddrMapProt = {
|
||||
val protForRegion = flatten.map { case (_, region) =>
|
||||
Mux(region.containsAddress(addr), UInt(region.attr.prot, AddrMapProt.SZ), UInt(0))
|
||||
val protForRegion = flatten.map { entry =>
|
||||
Mux(entry.region.containsAddress(addr),
|
||||
UInt(entry.region.attr.prot, AddrMapProt.SZ), UInt(0))
|
||||
}
|
||||
new AddrMapProt().fromBits(protForRegion.reduce(_|_))
|
||||
}
|
||||
|
Reference in New Issue
Block a user