95 lines
1.5 KiB
Python
95 lines
1.5 KiB
Python
__all__ = [
|
|
'sign_extend64',
|
|
'sign_extend32',
|
|
'sign_extend16',
|
|
'sign_extend12',
|
|
'sign_extend8',
|
|
'zero_extend32',
|
|
'zero_extend16',
|
|
'zero_extend8',
|
|
'zero_extend4',
|
|
'zero_extend1',
|
|
'signed_saturate48',
|
|
'signed_saturate32',
|
|
'register',
|
|
'bit',
|
|
]
|
|
|
|
#
|
|
# sign_extend
|
|
#
|
|
|
|
def sign_extend(x, b):
|
|
m = 1 << (b - 1)
|
|
x = x & ((1 << b) - 1)
|
|
r = (x ^ m) - m;
|
|
return r
|
|
|
|
def sign_extend64(x):
|
|
return sign_extend(x, 64)
|
|
|
|
def sign_extend32(x):
|
|
return sign_extend(x, 32)
|
|
|
|
def sign_extend16(x):
|
|
return sign_extend(x, 16)
|
|
|
|
def sign_extend12(x):
|
|
return sign_extend(x, 12)
|
|
|
|
def sign_extend8(x):
|
|
return sign_extend(x, 8)
|
|
|
|
#
|
|
# zero_extend
|
|
#
|
|
|
|
def zero_extend(x, b):
|
|
x = x & ((1 << b) - 1)
|
|
return x
|
|
|
|
def zero_extend32(x):
|
|
return zero_extend(x, 32)
|
|
|
|
def zero_extend16(x):
|
|
return zero_extend(x, 16)
|
|
|
|
def zero_extend8(x):
|
|
return zero_extend(x, 8)
|
|
|
|
def zero_extend4(x):
|
|
return zero_extend(x, 4)
|
|
|
|
def zero_extend1(x):
|
|
return zero_extend(x, 1)
|
|
|
|
#
|
|
# signed_saturate
|
|
#
|
|
|
|
def signed_saturate(x, b):
|
|
upper = (2 ** (b - 1)) - 1
|
|
lower = -(2 ** (b - 1))
|
|
if x > upper:
|
|
return upper
|
|
elif x < lower:
|
|
return lower
|
|
else:
|
|
return x
|
|
|
|
def signed_saturate48(x):
|
|
return signed_saturate(x, 48)
|
|
|
|
def signed_saturate32(x):
|
|
return signed_saturate(x, 32)
|
|
|
|
#
|
|
# "convenience" functions
|
|
#
|
|
|
|
def register(x):
|
|
return zero_extend(x, 32)
|
|
|
|
def bit(x):
|
|
return zero_extend(x, 1)
|