Files
PokemonMini_MiSTer/scripts/test_add_sub.py
2022-09-04 13:41:33 +02:00

92 lines
2.1 KiB
Python

def bits(x):
return [int(u) for u in bin(x)[2:].zfill(8)]
def unsigned_int(x):
return int(''.join([str(u) for u in x]), base=2)
def signed_int(x):
s = x[0]
if s == 0:
x_temp = x
else:
x_temp, _, _ = add([1-u for u in x], [0]*7 + [1])
return (1-2*s) * int(''.join([str(u) for u in x_temp]), base=2)
def add(a, b, cin = 0):
r = [0] * 8
c = cin
v = 0
for i in range(1,9):
temp = a[-i] + b[-i] + c
c = 0
if temp > 1:
c = 1
r[-i] = temp - 2
else:
r[-i] = temp
v = (a[0] & b[0] & (1-r[0])) | ((1-a[0]) & (1-b[0]) & r[0])
return r, c, v
def sub(a, b, cin = 0):
r = [0] * 8
c = cin
v = 0
for i in range(1,9):
temp = a[-i] - b[-i] - c
c = 0
if temp < 0:
c = 1
r[-i] = temp + 2
else:
r[-i] = temp
v = (a[0] & (1-b[0]) & (1-r[0])) | ((1-a[0]) & b[0] & r[0])
return r, c, v
if __name__ == '__main__':
print('Testing alu add output...')
for cin in range(2):
for xa in range(-128, 128):
for xb in range(-128, 128):
v_true = int((xa + xb + cin > 127) or (xa + xb + cin < -128))
r_true = (xa + xb + cin) & 0xFF
a = xa & 0xFF
b = xb & 0xFF
c_true = int(a + b + cin > 255)
r, c, v = add(bits(a), bits(b), cin)
r = unsigned_int(r)
assert(r_true == r)
assert(c_true == c)
assert(v_true == v)
print('Testing alu sub output...')
for cin in range(2):
for xa in range(-128, 128):
for xb in range(-128, 128):
v_true = int((xa - xb - cin > 127) or (xa - xb - cin < -128))
r_true = (xa - xb - cin) & 0xFF
a = xa & 0xFF
b = xb & 0xFF
c_true = int(a - b - cin < 0)
r, c, v = sub(bits(a), bits(b), cin)
assert(r_true == unsigned_int(r))
assert(c_true == c)
assert(v_true == v)
print('Success!')