├── README.md ├── Multiply ├── signedmag.py └── booths.py └── Divide └── divide.py /README.md: -------------------------------------------------------------------------------- 1 | # Computer Arithmetic 2 | 3 | 4 | 5 | -Multiplication 6 | - 7 | 8 | - Signed magnitude 9 | 10 | 11 | 12 | - Signed 2's complement (Booth's Algorithm) 13 | 14 | 15 | 16 | -Division 17 | - 18 | 19 | - Signed magnitude 20 | -------------------------------------------------------------------------------- /Multiply/signedmag.py: -------------------------------------------------------------------------------- 1 | from prettytable import PrettyTable 2 | 3 | if __name__ == '__main__': 4 | 5 | def shrEAQ(E,A,Q): 6 | EAQ = E + A + Q 7 | EAQ = '0'+ EAQ[:(len(EAQ)-1)] 8 | E = EAQ[0] 9 | A = EAQ[1:(len(A)+1)] 10 | Q = EAQ[len(A)+1:] 11 | return E,A,Q 12 | def decToBin(n): 13 | if(n == 0): 14 | return "0" 15 | 16 | bin = "" 17 | 18 | while (n > 0): 19 | if (n & 1 == 0): 20 | bin = '0' + bin 21 | else: 22 | bin = '1' + bin 23 | 24 | n = n >> 1 25 | 26 | return bin 27 | 28 | def remove_sign_and_convert_binary(x): 29 | if x<0: 30 | return 1, decToBin(abs(x)) 31 | else: 32 | return 0, decToBin(x) 33 | 34 | T = PrettyTable() 35 | B = int(input("Enter the value of B: ")) 36 | Q = int(input("Enter the value of Q: ")) 37 | Bs, B = remove_sign_and_convert_binary(B) 38 | Qs, Q = remove_sign_and_convert_binary(Q) 39 | As = Qs ^ Bs 40 | E = '0' 41 | A = '0'*len(B) 42 | 43 | SC = len(Q) 44 | print("Bs = {}".format(Bs)) 45 | print("B = {}".format(B)) 46 | print("Qs = {}".format(Qs)) 47 | print("Q = {}".format(Q)) 48 | print("Sign of product (As) = Qs ⊕ Bs = {}".format(As)) 49 | print("Qs = Qs ⊕ Bs = {}".format(As)) 50 | print("A = {} [length equal to B]".format(A)) 51 | print("SC = {}[length of Q]".format(SC)) 52 | 53 | 54 | T.field_names = ['Multiplicant B = {}'.format(B), 'E', 'A', 'Q', 'SC'] 55 | 56 | T.add_row( ['Initial condition', E, A, Q,SC]) 57 | while (SC !=0): 58 | if (Q[len(Q)-1] == '1'): 59 | sum = bin(int(A,2) + int(B,2)) 60 | EA = sum[2:] 61 | if len(EA) == len(A): 62 | E = '0' 63 | A = EA 64 | else: 65 | E ='1' 66 | A = EA[-len(A):] 67 | 68 | A = EA[-len(A):] 69 | T.add_row( ['Qn =1 add B', '', B, '','']) 70 | T.add_row(['','',len(A)*'-','',''] ) 71 | 72 | T.add_row( ['', E, A, '','']) 73 | E,A,Q = shrEAQ(E,A,Q) 74 | SC -= 1 75 | T.add_row( ['SHR EAQ', E, A, Q,SC]) 76 | else: 77 | E,A,Q = shrEAQ(E,A,Q) 78 | SC -= 1 79 | T.add_row( ['Qn = 0,SHR EAQ', E, A, Q,SC]) 80 | 81 | print(T) 82 | # if (Bs^Qs == 1): 83 | # print("The sign is negative") 84 | # else: 85 | # print("The sign is positive") -------------------------------------------------------------------------------- /Multiply/booths.py: -------------------------------------------------------------------------------- 1 | from prettytable import PrettyTable 2 | 3 | if __name__ == '__main__': 4 | def decToBin(n): 5 | if(n == 0): 6 | return "0" 7 | 8 | bin = "" 9 | 10 | while (n > 0): 11 | if (n & 1 == 0): 12 | bin = '0' + bin 13 | else: 14 | bin = '1' + bin 15 | 16 | n = n >> 1 17 | 18 | return bin 19 | 20 | def compPlusOne(x): 21 | y =x 22 | lst = list(x) 23 | for i in range(len(x)): 24 | 25 | if x[i] == '0': 26 | lst[i] = '1' 27 | else: 28 | lst[i] = '0' 29 | x = ''.join(lst) 30 | x = int('0b'+ x, 2) 31 | x += 1 32 | x = bin(x) 33 | x = x[2:] 34 | while len(x) len(y): 76 | AC = AC[1:] 77 | T.add_row( ['01','Add BR', BR, '', '', '']) 78 | T.add_row(['','',len(BR)*'-', '', '','' ]) 79 | T.add_row( ['','', AC, '', '', '']) 80 | AC, QR, Qn1 = ashrACQR(AC,QR,Qn1) 81 | SC -= 1 82 | T.add_row( ['','ashr AC & QR', AC, QR, Qn1, SC]) 83 | elif ((QR[len(QR)-1] == '1') and Qn1 == '0'): 84 | sum = bin(int(AC,2) + int(compPlusOne(BR),2)) 85 | y = AC 86 | AC = sum[2:] 87 | if len(AC) > len(y): 88 | AC = AC[1:] 89 | while len(AC) < len(y): 90 | AC = '0'+AC 91 | T.add_row( ['10','Subtract BR', compPlusOne(BR), '', '', '']) 92 | T.add_row(['','',len(BR)*'-', '', '','' ]) 93 | T.add_row([ '','', AC, '', '', '']) 94 | AC, QR, Qn1 = ashrACQR(AC,QR,Qn1) 95 | SC -= 1 96 | T.add_row( ['','ashr AC & QR', AC, QR, Qn1, SC]) 97 | else: 98 | AC, QR, Qn1 = ashrACQR(AC,QR,Qn1) 99 | SC -= 1 100 | T.add_row( ['11/00','ashr AC & QR', AC, QR, Qn1, SC]) 101 | 102 | print(T) 103 | # print(compPlusOne('1011')) -------------------------------------------------------------------------------- /Divide/divide.py: -------------------------------------------------------------------------------- 1 | from prettytable import PrettyTable 2 | 3 | if __name__ == '__main__': 4 | 5 | def restore(A, B): 6 | sum = bin(int(A, 2) + int(B, 2)) 7 | EA = sum[2:] 8 | if len(EA) == len(A): 9 | E = '0' 10 | A = EA 11 | else: 12 | E = '1' 13 | A = EA[-len(A):] 14 | return E, A 15 | 16 | def compPlusOne(x): 17 | y = x 18 | lst = list(x) 19 | for i in range(len(x)): 20 | 21 | if x[i] == '0': 22 | lst[i] = '1' 23 | else: 24 | lst[i] = '0' 25 | x = ''.join(lst) 26 | x = int('0b' + x, 2) 27 | x += 1 28 | x = bin(x) 29 | x = x[2:] 30 | while len(x) < len(y): 31 | x = '0' + x 32 | return str(x) 33 | 34 | def decToBin(n): 35 | if(n == 0): 36 | return "0" 37 | 38 | bin = "" 39 | 40 | while (n > 0): 41 | if (n & 1 == 0): 42 | bin = '0' + bin 43 | else: 44 | bin = '1' + bin 45 | 46 | n = n >> 1 47 | 48 | return bin 49 | 50 | def remove_sign_and_convert_binary(x): 51 | if x < 0: 52 | return 1, decToBin(abs(x)) 53 | else: 54 | return 0, decToBin(x) 55 | 56 | def validate(AQ, B): 57 | while len(AQ) < 2*len(B): 58 | AQ = '0'+AQ 59 | while len(AQ) > 2*len(B): 60 | B = '0' + B 61 | while len(AQ) < 2*len(B): 62 | AQ = '0'+AQ 63 | return AQ, B 64 | 65 | def shlEAQ(E, A, Q): 66 | EAQ = E+A+Q 67 | if E == '': 68 | EAQ = EAQ + '0' 69 | else: 70 | EAQ = EAQ[1:] + '0' 71 | # print(EAQ) 72 | 73 | E = EAQ[0] 74 | A = EAQ[1:len(A)+1] 75 | Q = EAQ[len(A)+1:len(A)+len(Q)+1] 76 | 77 | # print('E is {}'.format(E)) 78 | # print('A is {}'.format(A)) 79 | # print('Q is {}'.format(Q)) 80 | return E, A, Q 81 | 82 | T = PrettyTable() 83 | AQ = int(input("Enter the value of AQ: ")) 84 | B = int(input("Enter the value of B: ")) 85 | 86 | As, AQ = remove_sign_and_convert_binary(AQ) 87 | Bs, B = remove_sign_and_convert_binary(B) 88 | AQ, B = validate(AQ, B) 89 | # print('this is AQ{}'.format(AQ)) 90 | Qs = As ^ Bs 91 | 92 | SC = len(B) 93 | Bcomp = compPlusOne(B) 94 | print("As = {}".format(As)) 95 | print("AQ = {} [double the length of B]".format(AQ)) 96 | print("Bs = {}".format(Bs)) 97 | print("B = {}".format(B)) 98 | print("B'+1 = {}".format(Bcomp)) 99 | print("Sign of Quotient = As ⊕ Bs = {} ⊕ {} = {}".format(As, Bs, Qs)) 100 | print("Sign of Remainder = As = {} ".format(As)) 101 | print("SC = {} [length of Q]".format(SC)) 102 | A = AQ[:len(B)] 103 | Q = AQ[-len(B):] 104 | print("Checking for overflow,") 105 | print("EA <- A + B'+1 ") 106 | print(A) 107 | print(Bcomp) 108 | print(len(A)*'-') 109 | sum = bin(int(A, 2) + int(Bcomp, 2)) 110 | tempEA = sum[2:] 111 | print(tempEA) 112 | while len(tempEA) < len(A): 113 | tempEA = '0'+tempEA 114 | if len(tempEA) == len(A): 115 | print("E = 0. So, No overflow") 116 | E = '' 117 | T.field_names = [" B = {}, B'+1 = {}".format(B, compPlusOne(B)), 'E', 'A', 'Q', 'SC'] 118 | T.add_row(['Initial condition', E, A, Q, SC]) 119 | while(SC != 0): 120 | E, A, Q = shlEAQ(E, A, Q) 121 | T.add_row(['shl EAQ', E, A, Q, '']) 122 | if E == '0': 123 | sum = bin(int(A, 2) + int(Bcomp, 2)) 124 | EA = sum[2:] 125 | # print("This is EA {}".format(EA)) 126 | while len(EA) < len(A): 127 | EA = '0'+EA 128 | if len(EA) == len(A): 129 | E = '0' 130 | A = EA 131 | else: 132 | E = '1' 133 | A = EA[1:] 134 | T.add_row(['E = 0, Sub B', '', Bcomp, '', '']) 135 | T.add_row(['', '', len(B)*'-', '', '']) 136 | T.add_row(['', E, A, '', '']) 137 | if E == '0': 138 | sum = bin(int(A, 2) + int(B, 2)) 139 | EA = sum[2:] 140 | if len(EA) == len(A): 141 | E = '0' 142 | A = EA 143 | else: 144 | E = '1' 145 | A = EA[1:] 146 | SC -= 1 147 | T.add_row(['E = 0, Restore A', '', B, '', SC]) 148 | T.add_row(['', '', len(B)*'-', '', '']) 149 | T.add_row(['', E, A, '', '']) 150 | else: 151 | lst = list(Q) 152 | lst[len(Q)-1] = '1' 153 | Q = ''.join(lst) 154 | SC -= 1 155 | T.add_row(['E = 1 ,SetQn', '', A, Q, SC]) 156 | else: 157 | sum = bin(int(A, 2) + int(Bcomp, 2)) 158 | EA = sum[2:] 159 | while len(EA) < len(A): 160 | EA = '0'+EA 161 | if len(EA) == len(A): 162 | E = '0' 163 | A = EA 164 | else: 165 | E = '1' 166 | A = EA[1:] 167 | # print(len(Q)) 168 | 169 | lst = list(Q) 170 | # print(len(Q)) 171 | # print(Q) 172 | lst[len(Q)-1] = '1' 173 | Q = ''.join(lst) 174 | SC -= 1 175 | T.add_row(['E = 1, Sub B and set Qn', '', Bcomp, '', '']) 176 | T.add_row(['', '', len(B)*'-', '', '']) 177 | T.add_row(['', E, A, Q, SC]) 178 | 179 | print(T) 180 | else: 181 | print("E = 1 So, overflow occurs") 182 | 183 | # print('AQ is {}'.format(AQ)) 184 | # print('B is {}'.format(B)) 185 | 186 | # print('this is A{}'.format(A)) 187 | # print('this is Q{}'.format(Q)) 188 | # print('Q is {}'.format(Q)) 189 | 190 | 191 | # print("The sign of Quotient is {} and that of remainder is {}".format(Qs, As)) 192 | --------------------------------------------------------------------------------