__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)