just need to add table
This commit is contained in:
parent
3d66690b70
commit
cd17799a11
@ -1,5 +1,6 @@
|
|||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
from tabulate import tabulate
|
from tabulate import tabulate
|
||||||
|
import matplotlib.pyplot as plt
|
||||||
|
|
||||||
with open('input.txt') as f:
|
with open('input.txt') as f:
|
||||||
input_string = f.read().split('\n')
|
input_string = f.read().split('\n')
|
||||||
@ -21,7 +22,7 @@ def arithmatic_shiftl(num, length):
|
|||||||
return (num << 1) & ~(1 << length - 1)
|
return (num << 1) & ~(1 << length - 1)
|
||||||
|
|
||||||
|
|
||||||
def convert_if_twoscomp(num, length):
|
def twoscomp_to_int(num, length):
|
||||||
if num & (1 << length - 1):
|
if num & (1 << length - 1):
|
||||||
return (-1 * twos_comp(num, length))
|
return (-1 * twos_comp(num, length))
|
||||||
return num & (1 << length) - 1
|
return num & (1 << length) - 1
|
||||||
@ -30,8 +31,8 @@ def debug(results):
|
|||||||
headers = ['multiplicand bin', 'multiplier bin', 'multiplicand dec', 'multiplier dec', 'expected bin', 'expected dec', 'booth if correct', 'booth mod if correct']
|
headers = ['multiplicand bin', 'multiplier bin', 'multiplicand dec', 'multiplier dec', 'expected bin', 'expected dec', 'booth if correct', 'booth mod if correct']
|
||||||
table = []
|
table = []
|
||||||
for [multiplicand_bin, multiplier_bin, result_booth, result_booth_mod, length] in results:
|
for [multiplicand_bin, multiplier_bin, result_booth, result_booth_mod, length] in results:
|
||||||
multiplicand = convert_if_twoscomp(multiplicand_bin, length)
|
multiplicand = twoscomp_to_int(multiplicand_bin, length)
|
||||||
multiplier = convert_if_twoscomp(multiplier_bin, length)
|
multiplier = twoscomp_to_int(multiplier_bin, length)
|
||||||
expected = multiplicand * multiplier
|
expected = multiplicand * multiplier
|
||||||
expected_bin = (twos_comp(expected, length * 2), expected) [expected > 0]
|
expected_bin = (twos_comp(expected, length * 2), expected) [expected > 0]
|
||||||
success_b = [bin(result_booth), "PASS"] [result_booth == expected_bin]
|
success_b = [bin(result_booth), "PASS"] [result_booth == expected_bin]
|
||||||
@ -43,45 +44,58 @@ def debug(results):
|
|||||||
|
|
||||||
|
|
||||||
def booth(multiplier, multiplicand, length):
|
def booth(multiplier, multiplicand, length):
|
||||||
|
operations = 0
|
||||||
multiplicand_twos_comp = twos_comp(multiplicand, length)
|
multiplicand_twos_comp = twos_comp(multiplicand, length)
|
||||||
result = multiplier << 1 # extended bit
|
result = multiplier << 1 # extended bit
|
||||||
for i in range(length):
|
for i in range(length):
|
||||||
op = result & 0b11
|
op = result & 0b11
|
||||||
if op == 0b01:
|
if op == 0b01:
|
||||||
|
operations += 1
|
||||||
result += multiplicand << (length + 1)
|
result += multiplicand << (length + 1)
|
||||||
if op == 0b10:
|
if op == 0b10:
|
||||||
|
operations += 1
|
||||||
result += multiplicand_twos_comp << (length + 1)
|
result += multiplicand_twos_comp << (length + 1)
|
||||||
result &= (1 << (length * 2) + 1) - 1 # get rid of any overflows
|
result &= (1 << (length * 2) + 1) - 1 # get rid of any overflows
|
||||||
result = arithmatic_shiftr(result, (length * 2) + 1, 1)
|
result = arithmatic_shiftr(result, (length * 2) + 1, 1)
|
||||||
result = result >> 1
|
result = result >> 1
|
||||||
return result
|
return (result, operations)
|
||||||
|
|
||||||
def booth_mod(multiplier, multiplicand, length):
|
def booth_mod(multiplier, multiplicand, length):
|
||||||
|
operations = 0
|
||||||
multiplicand |= ((1 << length - 1) & multiplicand) << 1 # extend multiplicand sign to prevent overflow when mult/sub by 2
|
multiplicand |= ((1 << length - 1) & multiplicand) << 1 # extend multiplicand sign to prevent overflow when mult/sub by 2
|
||||||
multiplicand_twos_comp = twos_comp(multiplicand, length + 1)
|
multiplicand_twos_comp = twos_comp(multiplicand, length + 1)
|
||||||
result = multiplier << 1 # extended bit
|
result = multiplier << 1 # extended bit
|
||||||
operations = 0
|
|
||||||
for i in range(int((length) / 2)):
|
for i in range(int((length) / 2)):
|
||||||
match result & 0b111:
|
op = result & 0b111
|
||||||
|
match op:
|
||||||
case 0b010 | 0b001: # add
|
case 0b010 | 0b001: # add
|
||||||
|
print("add")
|
||||||
result += multiplicand << (length + 1)
|
result += multiplicand << (length + 1)
|
||||||
|
operations += 1
|
||||||
case 0b011: # add * 2
|
case 0b011: # add * 2
|
||||||
result += arithmatic_shiftl(multiplicand, length + 1) << (length + 1) # extra shift is multiplying multiplicand by 2
|
print("add * 2")
|
||||||
|
result += arithmatic_shiftl(multiplicand, length + 1) << (length + 1)
|
||||||
|
operations += 1
|
||||||
case 0b100: # sub * 2
|
case 0b100: # sub * 2
|
||||||
result += arithmatic_shiftl(multiplicand_twos_comp, length + 1) << (length + 1) # extra shift is multiplying multiplicand by 2
|
print("sub * 2")
|
||||||
|
result += arithmatic_shiftl(multiplicand_twos_comp, length + 1) << (length + 1)
|
||||||
|
operations += 1
|
||||||
case 0b101 | 0b110: # sub
|
case 0b101 | 0b110: # sub
|
||||||
|
print("sub ")
|
||||||
result += multiplicand_twos_comp << (length + 1)
|
result += multiplicand_twos_comp << (length + 1)
|
||||||
|
operations += 1
|
||||||
result &= (1 << ((length * 2) + 2)) - 1 # get rid of any overflows
|
result &= (1 << ((length * 2) + 2)) - 1 # get rid of any overflows
|
||||||
result = arithmatic_shiftr(result, (length * 2) + 2, 2)
|
result = arithmatic_shiftr(result, (length * 2) + 2, 2)
|
||||||
|
# *barfs on your dog*
|
||||||
result = ((result | ((1 << ((length * 2) + 2)) >> 1)) & ((1 << ((length * 2) + 1)) - 1)) >> 1
|
result = ((result | ((1 << ((length * 2) + 2)) >> 1)) & ((1 << ((length * 2) + 1)) - 1)) >> 1
|
||||||
return result
|
return (result, operations)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
headers = ['multiplicand', 'multiplier', 'result (bin)', 'result (hex)']
|
headers = ['multiplicand', 'multiplier', 'result (bin)', 'result (hex)']
|
||||||
table = []
|
table = []
|
||||||
|
lengths = [] # for matplotlib plot
|
||||||
|
ops_booth = []
|
||||||
|
ops_mod_booth = []
|
||||||
|
|
||||||
debug_results = []
|
debug_results = []
|
||||||
|
|
||||||
@ -95,11 +109,24 @@ if __name__ == "__main__":
|
|||||||
|
|
||||||
result_booth = booth(multiplier, multiplicand, length)
|
result_booth = booth(multiplier, multiplicand, length)
|
||||||
result_mod_booth = booth_mod(multiplier, multiplicand, length)
|
result_mod_booth = booth_mod(multiplier, multiplicand, length)
|
||||||
table.append([bin(multiplicand), bin(multiplier), bin(result_booth), hex(result_booth)])
|
|
||||||
debug_results.append([multiplicand, multiplier, result_booth, result_mod_booth, length])
|
# gather data for matplotlib
|
||||||
|
ops_booth.append(result_booth[1])
|
||||||
|
ops_mod_booth.append(result_mod_booth[1])
|
||||||
|
lengths.append(length)
|
||||||
|
|
||||||
|
table.append([bin(multiplicand), bin(multiplier), bin(result_booth[0]), hex(result_booth[0])])
|
||||||
|
debug_results.append([multiplicand, multiplier, result_booth[0], result_mod_booth[0], length])
|
||||||
|
|
||||||
debug(debug_results)
|
debug(debug_results)
|
||||||
print(tabulate(table, headers))
|
print(tabulate(table, headers))
|
||||||
|
|
||||||
#generate table
|
# generate graph
|
||||||
|
plt.plot(lengths, ops_booth, '^--m', label='booths algorithim')
|
||||||
|
plt.plot(lengths, ops_mod_booth, 'v--c', label='modified booths algorithim')
|
||||||
|
plt.gca().set_xlabel("Length of Operands")
|
||||||
|
plt.gca().set_ylabel("Number of Additions and Subtractions")
|
||||||
|
plt.legend(loc='upper left')
|
||||||
|
plt.show()
|
||||||
|
|
||||||
|
|
||||||
|
0
pheudo_code
Normal file
0
pheudo_code
Normal file
Loading…
x
Reference in New Issue
Block a user