fhdl/structure: improved bits_for function

This commit is contained in:
Sebastien Bourdeauducq 2012-11-28 18:39:44 +01:00
parent 11b1e53224
commit 59831e0485
1 changed files with 11 additions and 12 deletions

View File

@ -1,31 +1,30 @@
import math
import inspect import inspect
import re import re
from collections import defaultdict from collections import defaultdict
from migen.fhdl import tracer from migen.fhdl import tracer
def log2_int(n): def log2_int(n, need_pow2=True):
l = 1 l = 1
r = 0 r = 0
while l < n: while l < n:
l *= 2 l *= 2
r += 1 r += 1
if l == n: if need_pow2 and l != n:
return r
else:
raise ValueError("Not a power of 2") raise ValueError("Not a power of 2")
return r
def bits_for(n): def bits_for(n, require_sign_bit=False):
if isinstance(n, Constant): if isinstance(n, Constant):
return len(n) return len(n)
if n > 0:
r = log2_int(n + 1, False)
else: else:
if n < 0: require_sign_bit = True
return bits_for(-n) + 1 r = log2_int(-n, False)
elif n == 0: if require_sign_bit:
return 1 r += 1
else: return r
return int(math.ceil(math.log(n+1, 2)))
class BV: class BV:
def __init__(self, width=1, signed=False): def __init__(self, width=1, signed=False):