add Booth's algorithm
parent
beef5891b3
commit
09497fb9cf
|
@ -0,0 +1,153 @@
|
||||||
|
# Python3 code to implement booth's algorithm
|
||||||
|
|
||||||
|
# function to perform adding in the accumulator
|
||||||
|
def add(ac, x, qrn):
|
||||||
|
c = 0
|
||||||
|
for i in range(qrn):
|
||||||
|
|
||||||
|
# updating accumulator with A = A + BR
|
||||||
|
ac[i] = ac[i] + x[i] + c;
|
||||||
|
|
||||||
|
if (ac[i] > 1):
|
||||||
|
ac[i] = ac[i] % 2
|
||||||
|
c = 1
|
||||||
|
|
||||||
|
else:
|
||||||
|
c = 0
|
||||||
|
|
||||||
|
# function to find the number's complement
|
||||||
|
def complement(a, n):
|
||||||
|
x = [0] * 8
|
||||||
|
x[0] = 1
|
||||||
|
|
||||||
|
for i in range(n):
|
||||||
|
a[i] = (a[i] + 1) % 2
|
||||||
|
add(a, x, n)
|
||||||
|
|
||||||
|
|
||||||
|
# function to perform right shift
|
||||||
|
def rightShift(ac, qr, qn, qrn):
|
||||||
|
|
||||||
|
temp = ac[0]
|
||||||
|
qn = qr[0]
|
||||||
|
|
||||||
|
print("\t\trightShift\t", end = "");
|
||||||
|
|
||||||
|
for i in range(qrn - 1):
|
||||||
|
ac[i] = ac[i + 1]
|
||||||
|
qr[i] = qr[i + 1]
|
||||||
|
|
||||||
|
|
||||||
|
qr[qrn - 1] = temp
|
||||||
|
|
||||||
|
|
||||||
|
# function to display operations
|
||||||
|
def display(ac, qr, qrn):
|
||||||
|
|
||||||
|
# accumulator content
|
||||||
|
for i in range(qrn - 1, -1, -1):
|
||||||
|
print(ac[i], end = '')
|
||||||
|
print("\t", end = '')
|
||||||
|
|
||||||
|
# multiplier content
|
||||||
|
for i in range(qrn - 1, -1, -1):
|
||||||
|
print(qr[i], end = "")
|
||||||
|
|
||||||
|
|
||||||
|
# Function to implement booth's algo
|
||||||
|
def boothAlgorithm(br, qr, mt, qrn, sc):
|
||||||
|
|
||||||
|
qn = 0
|
||||||
|
ac = [0] * 10
|
||||||
|
temp = 0
|
||||||
|
print("qn\tq[n+1]\t\tBR\t\tAC\tQR\t\tsc")
|
||||||
|
print("\t\t\tinitial\t\t", end = "")
|
||||||
|
|
||||||
|
display(ac, qr, qrn)
|
||||||
|
print("\t\t", sc, sep = "")
|
||||||
|
|
||||||
|
while (sc != 0):
|
||||||
|
print(qr[0], "\t", qn, sep = "", end = "")
|
||||||
|
|
||||||
|
# SECOND CONDITION
|
||||||
|
if ((qn + qr[0]) == 1):
|
||||||
|
|
||||||
|
if (temp == 0):
|
||||||
|
|
||||||
|
# subtract BR from accumulator
|
||||||
|
add(ac, mt, qrn)
|
||||||
|
print("\t\tA = A - BR\t", end = "")
|
||||||
|
|
||||||
|
for i in range(qrn - 1, -1, -1):
|
||||||
|
print(ac[i], end = "")
|
||||||
|
|
||||||
|
temp = 1
|
||||||
|
|
||||||
|
|
||||||
|
# THIRD CONDITION
|
||||||
|
elif (temp == 1):
|
||||||
|
|
||||||
|
# add BR to accumulator
|
||||||
|
add(ac, br, qrn)
|
||||||
|
print("\t\tA = A + BR\t", end = "")
|
||||||
|
|
||||||
|
for i in range(qrn - 1, -1, -1):
|
||||||
|
print(ac[i], end = "")
|
||||||
|
temp = 0
|
||||||
|
|
||||||
|
print("\n\t", end = "")
|
||||||
|
rightShift(ac, qr, qn, qrn)
|
||||||
|
|
||||||
|
# FIRST CONDITION
|
||||||
|
elif (qn - qr[0] == 0):
|
||||||
|
rightShift(ac, qr, qn, qrn)
|
||||||
|
|
||||||
|
display(ac, qr, qrn)
|
||||||
|
|
||||||
|
print("\t", end = "")
|
||||||
|
|
||||||
|
# decrement counter
|
||||||
|
sc -= 1
|
||||||
|
print("\t", sc, sep = "")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__=="__main__":
|
||||||
|
|
||||||
|
mt = [0] * 10
|
||||||
|
|
||||||
|
# Number of multiplicand bit
|
||||||
|
brn = 4
|
||||||
|
|
||||||
|
# multiplicand
|
||||||
|
br = [ 0, 1, 1, 0 ]
|
||||||
|
|
||||||
|
# copy multiplier to temp array mt[]
|
||||||
|
for i in range(brn - 1, -1, -1):
|
||||||
|
mt[i] = br[i]
|
||||||
|
|
||||||
|
br.reverse()
|
||||||
|
|
||||||
|
complement(mt, brn)
|
||||||
|
|
||||||
|
# No. of multiplier bit
|
||||||
|
qrn = 4
|
||||||
|
|
||||||
|
# sequence counter
|
||||||
|
sc = qrn
|
||||||
|
|
||||||
|
# multiplier
|
||||||
|
qr = [ 1, 0, 1, 0 ]
|
||||||
|
qr.reverse()
|
||||||
|
|
||||||
|
boothAlgorithm(br, qr, mt, qrn, sc)
|
||||||
|
|
||||||
|
print("\nResult = ", end = "")
|
||||||
|
|
||||||
|
for i in range(qrn - 1, -1, -1):
|
||||||
|
print(qr[i], end = "")
|
||||||
|
print()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue