docs: def _resolve_access(self, addr, size):
          """
          Resolves a memory access of a certain size. Returns a sequence of the bases, offsets, and sizes of the accesses required
          to fulfil this.
          """
  
          # if we fit in one word
          first_offset = addr % self.width
          first_base = addr - first_offset
          if first_offset + size <= self.width:
              return [ (first_base, first_offset, size) ]
  
          last_size = (addr + size) % self.width
          last_base = addr + size - last_size
  
          accesses = [ ]
          accesses.append((first_base, first_offset, self.width - first_offset))
          accesses.extend((a, 0, self.width) for a in range(first_base+self.width, last_base, self.width))
          if last_size != 0:
              accesses.append((last_base, 0, last_size))
  
          return accesses