diff --git a/tools/hardware/memory.py b/tools/hardware/memory.py index c02b9881dc..b5e36e9b3b 100644 --- a/tools/hardware/memory.py +++ b/tools/hardware/memory.py @@ -84,36 +84,6 @@ def reserve(self, excluded): self.base + self.size, self.owner)) return ret - def align_base(self, align_bits): - ''' align this region up to a given number of bits ''' - new_base = hardware.utils.align_up(self.base, align_bits) - diff = new_base - self.base - if self.size < diff: - raise ValueError( - 'can''t align region base to {} bits, {} too small'.format( - align_bits, self)) - # This could become an empty region now. We don't care, the caller has - # to check if this region still fits its needs. - return Region(new_base, self.size - diff, self.owner) - - def align_size(self, align_bits): - ''' align this region's size to a given number of bits. - will move the base address down and the region's size - up ''' - new_base = hardware.utils.align_down(self.base, align_bits) - new_size = hardware.utils.align_up(self.size, align_bits) - return Region(new_base, new_size, self.owner) - - def make_chunks(self, chunksz): - base = self.base - size = self.size - ret = [] - while size > 0: - ret.append(Region(base, min(size, chunksz), self.owner)) - base += chunksz - size -= chunksz - return ret - def cut_from_start(self, size: int) -> Region: ''' Cut off a region from the start and return it, no owner is set. Adjust the original region's size.''' diff --git a/tools/hardware/utils/rule.py b/tools/hardware/utils/rule.py index 829272d54b..8131794196 100644 --- a/tools/hardware/utils/rule.py +++ b/tools/hardware/utils/rule.py @@ -46,10 +46,21 @@ def __init__(self, region: Region, kernel_name: str, page_bits: int, max_size: i self.user_ok = user_ok region.size = min(max_size, region.size) - aligned = region.align_size(page_bits) - self.size = aligned.size - self.base = aligned.base - self.regions = aligned.make_chunks(1 << page_bits) + + self.size = hardware.utils.align_down(region.base, align_bits) + self.base = hardware.utils.align_up(region.size, align_bits) + + chunks = [] + chunk_size = 1 << page_bits + base = self.base + size = self.size + while size > 0: + regions + chunks.append(Region(base, min(size, chunk_size), self.owner)) + base += chunk_size + size -= chunk_size + self.regions = chunks + self.labels[kernel_name] = region.base - aligned.base def has_macro(self):