mem: Add interleaving bits to the address ranges
This patch adds support for interleaving bits for the address ranges. What was previously just a start and end address, now has an additional three fields, for the high bit, and number of bits to use for interleaving, and a match value to compare against. If the number of interleaving bits is set to zero it is effectively disabled. A number of convenience functions are added to the range to enquire about the interleaving, its granularity and the number of stripes it is part of.
This commit is contained in:
@@ -553,7 +553,15 @@ class AddrRange(ParamValue):
|
||||
cxx_type = 'AddrRange'
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
# Disable interleaving by default
|
||||
self.intlvHighBit = 0
|
||||
self.intlvBits = 0
|
||||
self.intlvMatch = 0
|
||||
|
||||
def handle_kwargs(self, kwargs):
|
||||
# An address range needs to have an upper limit, specified
|
||||
# either explicitly with an end, or as an offset using the
|
||||
# size keyword.
|
||||
if 'end' in kwargs:
|
||||
self.end = Addr(kwargs.pop('end'))
|
||||
elif 'size' in kwargs:
|
||||
@@ -561,6 +569,14 @@ class AddrRange(ParamValue):
|
||||
else:
|
||||
raise TypeError, "Either end or size must be specified"
|
||||
|
||||
# Now on to the optional bit
|
||||
if 'intlvHighBit' in kwargs:
|
||||
self.intlvHighBit = int(kwargs.pop('intlvHighBit'))
|
||||
if 'intlvBits' in kwargs:
|
||||
self.intlvBits = int(kwargs.pop('intlvBits'))
|
||||
if 'intlvMatch' in kwargs:
|
||||
self.intlvMatch = int(kwargs.pop('intlvMatch'))
|
||||
|
||||
if len(args) == 0:
|
||||
self.start = Addr(kwargs.pop('start'))
|
||||
handle_kwargs(self, kwargs)
|
||||
@@ -589,7 +605,8 @@ class AddrRange(ParamValue):
|
||||
return '%s:%s' % (self.start, self.end)
|
||||
|
||||
def size(self):
|
||||
return long(self.end) - long(self.start) + 1
|
||||
# Divide the size by the size of the interleaving slice
|
||||
return (long(self.end) - long(self.start) + 1) >> self.intlvBits
|
||||
|
||||
@classmethod
|
||||
def cxx_predecls(cls, code):
|
||||
@@ -605,7 +622,9 @@ class AddrRange(ParamValue):
|
||||
# by swig
|
||||
from m5.internal.range import AddrRange
|
||||
|
||||
return AddrRange(long(self.start), long(self.end))
|
||||
return AddrRange(long(self.start), long(self.end),
|
||||
int(self.intlvHighBit), int(self.intlvBits),
|
||||
int(self.intlvMatch))
|
||||
|
||||
# Boolean parameter type. Python doesn't let you subclass bool, since
|
||||
# it doesn't want to let you create multiple instances of True and
|
||||
|
||||
Reference in New Issue
Block a user