class NextPCLogic: def __init__(self): self.adder = ALU() self.nextPC = None def performOp(self, uncondbranch, branch, aluZero, imm, currPC): if(uncondbranch or (branch and aluZero)): shiftedImm = self.shiftImm(imm) self.nextPC = self.adder.add(currPC, shiftedImm)[0] else: self.nextPC = self.adder.add(currPC, self.generateFour())[0] return self.nextPC def generateFour(self): return Bus(0, [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0 ]) def shiftImm(self, imm): newImm = Bus(64) newImm.set(0, 0) newImm.set(1, 0) i = 2 while(i < 64): newImm.set(i, imm.at(i-2)) i += 1 return newImm
def execute(self): fileS = FileStream("test.txt", "", "", "", "") fileOpcode = FileStream("ins.txt", "", "", "", "") opcodesArray = [] fileS.processFile() opcodesArray = fileOpcode.readOpcodes() i = 0 result = 0 quot = 0 timearray = [] acc = 0 binStng = "" operationName = [] #for opcode in fileS.opcodes: while i < len(fileS.opcodes): currentOpcode = fileS.opcodes[i] if currentOpcode == opcodesArray[0]: operationName.append(opcodesArray[0]) if fileS.aarr[i] == "acc": self.printRegs(bin(acc)[2:].zfill(8), fileS.barr[i]) aluCtrl = ALU(acc, int(fileS.barr[i], 2), 0) elif fileS.barr[i] == "acc": self.printRegs(fileS.aarr[i], bin(acc)[2:].zfill(8)) aluCtrl = ALU(int(fileS.aarr[i], 2), acc, 0) else: self.printRegs(fileS.aarr[i], fileS.barr[i]) aluCtrl = ALU(int(fileS.aarr[i], 2), int(fileS.barr[i], 2), 0) start = timeit.default_timer() result = aluCtrl.add() binStng = bin(result)[2:].zfill(8) stop = timeit.default_timer() timearray.append(stop - start) print "The operation is ADD " print "The final result in binary is ", binStng print "The final result in decimal is ", result acc = result print "Accumulator value is ", acc print "Elapsed time is ", (stop - start) elif currentOpcode == opcodesArray[1]: operationName.append(opcodesArray[1]) if fileS.aarr[i] == "acc": self.printRegs(bin(acc)[2:].zfill(8), fileS.barr[i]) aluCtrl = ALU(acc, int(fileS.barr[i], 2), 0) elif fileS.barr[i] == "acc": self.printRegs(fileS.aarr[i], bin(acc)[2:].zfill(8)) aluCtrl = ALU(int(fileS.aarr[i], 2), acc, 0) else: self.printRegs(fileS.aarr[i], fileS.barr[i]) aluCtrl = ALU(int(fileS.aarr[i], 2), int(fileS.barr[i], 2), 0) start = timeit.default_timer() result = aluCtrl.subtract() binStng = bin(result)[2:].zfill(8) print "The operation is SUB " print "The final result in binary is ", binStng print "The final result in decimal is ", result acc = result print "Accumulator value is ", acc stop = timeit.default_timer() timearray.append(stop - start) print "Elapsed time is ", (stop - start) elif currentOpcode == opcodesArray[2]: operationName.append(opcodesArray[2]) if fileS.aarr[i] == "acc": self.printRegs(bin(acc)[2:].zfill(8), fileS.barr[i]) aluCtrl = ALU(acc, int(fileS.barr[i], 2), 0) elif fileS.barr[i] == "acc": self.printRegs(fileS.aarr[i], bin(acc)[2:].zfill(8)) aluCtrl = ALU(int(fileS.aarr[i], 2), acc, 0) else: self.printRegs(fileS.aarr[i], fileS.barr[i]) aluCtrl = ALU(int(fileS.aarr[i], 2), int(fileS.barr[i], 2), 0) start = timeit.default_timer() result = aluCtrl.multiply() binStng = bin(result)[2:].zfill(8) print "The operation is MUL " print "The final result in binary is ", binStng print "The final result in decimal is ", result acc = result print "Accumulator value is ", acc stop = timeit.default_timer() timearray.append(stop - start) print "Elapsed time is ", (stop - start) elif currentOpcode == opcodesArray[3]: operationName.append(opcodesArray[3]) if fileS.aarr[i] == "acc": self.printRegs(bin(acc)[2:].zfill(8), fileS.barr[i]) aluCtrl = ALU(acc, int(fileS.barr[i], 2), 0) elif fileS.barr[i] == "acc": self.printRegs(fileS.aarr[i], bin(acc)[2:].zfill(8)) aluCtrl = ALU(int(fileS.aarr[i], 2), acc, 0) else: self.printRegs(fileS.aarr[i], fileS.barr[i]) aluCtrl = ALU(int(fileS.aarr[i], 2), int(fileS.barr[i], 2), 0) start = timeit.default_timer() (result, quot) = aluCtrl.div() binStng = bin(result)[2:].zfill(8) print "The operation is DIV " print "The final Quotient in binary is ", binStng print "The final Quotient in decimal is ", result print "The final Remainder in binary is ", bin(quot)[2:].zfill( 8) print "The final Remainder in decimal is ", quot acc = result print "Accumulator value is ", acc stop = timeit.default_timer() timearray.append(stop - start) print "Elapsed time is ", (stop - start) elif currentOpcode == opcodesArray[4]: operationName.append(opcodesArray[4]) if fileS.aarr[i] == "acc": self.printRegs(bin(acc)[2:].zfill(8), fileS.barr[i]) aluCtrl = ALU(acc, int(fileS.barr[i], 2), 0) elif fileS.barr[i] == "acc": self.printRegs(fileS.aarr[i], bin(acc)[2:].zfill(8)) aluCtrl = ALU(int(fileS.aarr[i], 2), acc, 0) else: self.printRegs(fileS.aarr[i], fileS.barr[i]) aluCtrl = ALU(int(fileS.aarr[i], 2), int(fileS.barr[i], 2), 0) start = timeit.default_timer() result = aluCtrl.andop() binStng = bin(result)[2:].zfill(8) print "The operation is AND " print "The final result in binary is ", binStng print "The final result in decimal is ", result acc = result print "Accumulator value is ", acc stop = timeit.default_timer() timearray.append(stop - start) print "Elapsed time is ", (stop - start) elif currentOpcode == opcodesArray[5]: operationName.append(opcodesArray[5]) if fileS.aarr[i] == "acc": self.printRegs(bin(acc)[2:].zfill(8), fileS.barr[i]) aluCtrl = ALU(acc, int(fileS.barr[i], 2), 0) elif fileS.barr[i] == "acc": self.printRegs(fileS.aarr[i], bin(acc)[2:].zfill(8)) aluCtrl = ALU(int(fileS.aarr[i], 2), acc, 0) else: self.printRegs(fileS.aarr[i], fileS.barr[i]) aluCtrl = ALU(int(fileS.aarr[i], 2), int(fileS.barr[i], 2), 0) start = timeit.default_timer() result = aluCtrl.orop() binStng = bin(result)[2:].zfill(8) print "The operation is OR " print "The final result in binary is ", binStng print "The final result in decimal is ", result acc = result print "Accumulator value is ", acc stop = timeit.default_timer() timearray.append(stop - start) print "Elapsed time is ", (stop - start) elif currentOpcode == opcodesArray[6]: operationName.append(opcodesArray[6]) if fileS.aarr[i] == "acc": self.printRegs(bin(acc)[2:].zfill(8), fileS.barr[i]) aluCtrl = ALU(acc, int(fileS.barr[i], 2), 0) elif fileS.barr[i] == "acc": self.printRegs(fileS.aarr[i], bin(acc)[2:].zfill(8)) aluCtrl = ALU(int(fileS.aarr[i], 2), acc, 0) else: self.printRegs(fileS.aarr[i], fileS.barr[i]) aluCtrl = ALU(int(fileS.aarr[i], 2), int(fileS.barr[i], 2), 0) start = timeit.default_timer() result = aluCtrl.xorop() binStng = bin(result)[2:].zfill(8) print "The operation is XOR " print "The final result in binary is ", binStng print "The final result in decimal is ", result acc = result print "Accumulator value is ", acc stop = timeit.default_timer() timearray.append(stop - start) print "Elapsed time is ", (stop - start) elif currentOpcode == opcodesArray[9]: port = '/dev/ttyACM0' ard = serial.Serial(port, 9600, timeout=6) readvalue = [] readvalue.append(ard.read()) readvalue.append(ard.read()) readvalue.append(ard.read()) readval = ''.join(readvalue) acc = int(readval) time.sleep(3) #elif currentOpcode==opcodesArray[8]: elif currentOpcode == opcodesArray[10]: addrin = fileS.aarr[i] datain = acc port = '/dev/ttyACM0' ard = serial.Serial(port, 9600, timeout=6) iter = 0 while (iter < 1): # Serial write section setTempCar1 = addrin setTempCar2 = acc ard.flush() setTemp1 = str(setTempCar1) setTemp2 = str(setTempCar2) print("Python value sent: ") print(setTemp2) ard.write(setTemp2) time.sleep(4) # Serial read section iter = iter + 1 else: print "Exiting" exit() elif currentOpcode == opcodesArray[7]: operationName.append(opcodesArray[7]) print "Jumping" start = timeit.default_timer() jmpIndex = fileS.aarr.index(fileS.barr[i]) i = jmpIndex stop = timeit.default_timer() timearray.append(stop - start) print "Elapsed time is ", (stop - start) elif currentOpcode == opcodesArray[8]: continue i = i + 1 print "\n" return timearray