Skip to content

Commit f90d9a4

Browse files
committed
csr.bus: replace ceil(log2(n)) with log2_int(n, need_pow2=False).
The former does int->float->int conversions, which gives incorrect results because Python uses 64-bit values to represent floats (e.g. `ceil(log2((1 << 64) + 1))` would return 64).
1 parent 59223a8 commit f90d9a4

File tree

1 file changed

+4
-5
lines changed

1 file changed

+4
-5
lines changed

amaranth_soc/csr/bus.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from collections import defaultdict
2-
from math import ceil, log2
32
import enum
43
from amaranth import *
4+
from amaranth.utils import log2_int
55

66
from ..memory import MemoryMap
77

@@ -233,7 +233,7 @@ def add(self, elem_range):
233233
"""
234234
assert isinstance(elem_range, range)
235235
self._ranges.add(elem_range)
236-
elem_size = 2 ** ceil(log2(elem_range.stop - elem_range.start))
236+
elem_size = 2 ** log2_int(elem_range.stop - elem_range.start, need_pow2=False)
237237
self._size = max(self._size, elem_size)
238238

239239
def decode_address(self, addr, elem_range):
@@ -271,11 +271,10 @@ def decode_address(self, addr, elem_range):
271271
│ └──── ceil(log2(elem_range.stop - elem_range.start))
272272
└─────── log2(self.size)
273273
274-
275274
The decoded offset would therefore be ``8`` (i.e. ``0b1000``).
276275
"""
277276
assert elem_range in self._ranges and addr in elem_range
278-
elem_size = 2 ** ceil(log2(elem_range.stop - elem_range.start))
277+
elem_size = 2 ** log2_int(elem_range.stop - elem_range.start, need_pow2=False)
279278
self_mask = self.size - 1
280279
elem_mask = elem_size - 1
281280
return elem_range.start & self_mask & ~elem_mask | addr & elem_mask
@@ -290,7 +289,7 @@ def encode_offset(self, offset, elem_range):
290289
located at ``offset``. See :meth:`~Multiplexer._Shadow.decode_address` for details.
291290
"""
292291
assert elem_range in self._ranges and isinstance(offset, int)
293-
elem_size = 2 ** ceil(log2(elem_range.stop - elem_range.start))
292+
elem_size = 2 ** log2_int(elem_range.stop - elem_range.start, need_pow2=False)
294293
return elem_range.start + ((offset - elem_range.start) % elem_size)
295294

296295
def prepare(self):

0 commit comments

Comments
 (0)