fhdl/structure: improved bits_for function
This commit is contained in:
parent
11b1e53224
commit
59831e0485
|
@ -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):
|
||||||
|
|
Loading…
Reference in New Issue