integration/soc/SoCRegion: add size_pow2 and use this internally for checks since decoder is using rounded size to next power or 2.

This commit is contained in:
Florent Kermarrec 2020-03-08 19:17:31 +01:00
parent e801dc0261
commit b02c23391a
1 changed files with 11 additions and 6 deletions

View File

@ -58,14 +58,19 @@ class SoCRegion:
self.logger = logging.getLogger("SoCRegion") self.logger = logging.getLogger("SoCRegion")
self.origin = origin self.origin = origin
self.size = size self.size = size
if size != 2**log2_int(size, False):
self.logger.info("Region size {} internally from {} to {}.".format(
colorer("rounded", color="cyan"),
colorer("0x{:08x}".format(size)),
colorer("0x{:08x}".format(2**log2_int(size, False)))))
self.size_pow2 = 2**log2_int(size, False)
self.mode = mode self.mode = mode
self.cached = cached self.cached = cached
self.linker = linker self.linker = linker
def decoder(self, bus): def decoder(self, bus):
origin = self.origin origin = self.origin
size = self.size size = self.size_pow2
size = 2**log2_int(size, False)
if (origin & (size - 1)) != 0: if (origin & (size - 1)) != 0:
self.logger.error("Origin needs to be aligned on size:") self.logger.error("Origin needs to be aligned on size:")
self.logger.error(self) self.logger.error(self)
@ -224,14 +229,14 @@ class SoCBusHandler(Module):
# Iterate on Search_Regions to find a Candidate # Iterate on Search_Regions to find a Candidate
for _, search_region in search_regions.items(): for _, search_region in search_regions.items():
origin = search_region.origin origin = search_region.origin
while (origin + size) < (search_region.origin + search_region.size): while (origin + size) < (search_region.origin + search_region.size_pow2):
# Create a Candicate. # Create a Candicate.
candidate = SoCRegion(origin=origin, size=size, cached=cached) candidate = SoCRegion(origin=origin, size=size, cached=cached)
overlap = False overlap = False
# Check Candidate does not overlap with allocated existing regions # Check Candidate does not overlap with allocated existing regions
for _, allocated in self.regions.items(): for _, allocated in self.regions.items():
if self.check_regions_overlap({"0": allocated, "1": candidate}) is not None: if self.check_regions_overlap({"0": allocated, "1": candidate}) is not None:
origin = allocated.origin + allocated.size origin = allocated.origin + allocated.size_pow2
overlap = True overlap = True
break break
if not overlap: if not overlap:
@ -251,9 +256,9 @@ class SoCBusHandler(Module):
if r0.linker or r1.linker: if r0.linker or r1.linker:
if not check_linker: if not check_linker:
continue continue
if r0.origin >= (r1.origin + r1.size): if r0.origin >= (r1.origin + r1.size_pow2):
continue continue
if r1.origin >= (r0.origin + r0.size): if r1.origin >= (r0.origin + r0.size_pow2):
continue continue
return (n0, n1) return (n0, n1)
i += 1 i += 1