import struct import time import serial def ADD8(): #Performs: A8 <= A8 + B8 nv('CLEAR') #should clear A1 nv('STOREA1 B1') #should clear B1 nv('ROTRA') #rotate A8 right by 1 nv('ROTRB') #rotate B8 right by 1 for i in range(0,8): #should loop 8 times nv('ADD1') #serial add nv('ROTRA') nv('ROTRB') return def SUB8(): #perform: A8 <= A8-B8 nv('CLEAR') nv('STOREA1 B1') nv('ROTRA') nv('ROTRB') for i in range(0,8): nv('SUB1') nv('ROTRA') nv('ROTRB') return def NEGA8(): #A8 <= ~A8 nv('CLEAR') nv('ROTRA') for i in range(0,8): nv('NEGATE') nv('ROTRA') return def write_bin_byte(cmd): #print cmd #print struct.pack("B",int(cmd,2)) #print int(cmd,2) ser.write(struct.pack("B",int(cmd,2))) if cmd=='10100000' or cmd=='10101000': reply=ser.read(2) #print "Reply:" + reply #if str(ord(reply[2]))=='1': #print "Rx'd byte:" + reply[1] + " (" + str(ord(reply[1])) + ")" if len(reply) == 0: print "no reply!" elif len(reply) == 1: print "Reply:" + str(ord(reply)) elif len(reply)== 2: print "Rx'd data:" + str(ord(reply[0])) + " " + str(ord(reply[1])) #else: # print "Rx'd byte: None" #print "ack byte:" + str(ord(reply[2])) else: reply = ser.read() #halt until ack byte is received if reply=='': print "no reply!" elif reply=='A': print "ACK" ser.flushInput() #time.sleep(.05) #if cmd=='10100000': #detect "report8" # reply==ser.read(2) #print "Reported val:" + str(ord(reply[0])) + ' ' + str(ord(reply[1])) # print "Reply length:" + str(len(reply)) # print "Reply:" + reply return def writebyte(cmd): print "byte to broadcast:" + cmd #if isinstance(cmd,int)==1: #ser.write(chr(cmd) # print "num" #else: #print "char" ser.write(cmd) reply = ser.read() #print "reply: " + reply if reply=='': print "no reply!" #elif reply=='A': # print "ACK" #time.sleep(.25) return #this function will execute any command typed as "nv(command args)" on NonVon def nv(nv_cmd): bin_cmd='' nv_cmds = nv_cmd.split() #print nv_cmd if (nv_cmds[0]=='LOADA8'): bin_cmd = commands[nv_cmds[0]] + reg8[nv_cmds[1]] write_bin_byte(bin_cmd) elif (nv_cmds[0]=='LOADB8'): bin_cmd = commands[nv_cmds[0]] + reg8[nv_cmds[1]] write_bin_byte(bin_cmd) elif (nv_cmds[0]=='LOADA1'): bin_cmd = commands[nv_cmds[0]] + reg1[nv_cmds[1]] write_bin_byte(bin_cmd) elif (nv_cmds[0]=='LOADB1'): bin_cmd = commands[nv_cmds[0]] + reg1[nv_cmds[1]] write_bin_byte(bin_cmd) elif (nv_cmds[0]=='STOREA8'): bin_cmd = commands[nv_cmds[0]] + reg8[nv_cmds[1]] write_bin_byte(bin_cmd) elif (nv_cmds[0]=='STOREB8'): bin_cmd = commands[nv_cmds[0]] + reg8[nv_cmds[1]] write_bin_byte(bin_cmd) elif (nv_cmds[0]=='STOREA1'): bin_cmd = commands[nv_cmds[0]] + reg1[nv_cmds[1]] write_bin_byte(bin_cmd) elif (nv_cmds[0]=='STOREB1'): bin_cmd = commands[nv_cmds[0]] + reg1[nv_cmds[1]] write_bin_byte(bin_cmd) elif (nv_cmds[0]=='READRAM'): bin_cmd = commands[nv_cmds[0]] write_bin_byte(bin_cmd) elif (nv_cmds[0]=='WRITERAM'): bin_cmd = commands[nv_cmds[0]] write_bin_byte(bin_cmd) elif (nv_cmds[0]=='ADD1'): bin_cmd = commands[nv_cmds[0]] write_bin_byte(bin_cmd) elif (nv_cmds[0]=='SUB1'): bin_cmd = commands[nv_cmds[0]] write_bin_byte(bin_cmd) elif (nv_cmds[0]=='ROTRA'): bin_cmd = commands[nv_cmds[0]] write_bin_byte(bin_cmd) elif (nv_cmds[0]=='ROTLA'): bin_cmd = commands[nv_cmds[0]] write_bin_byte(bin_cmd) elif (nv_cmds[0]=='ROTRB'): bin_cmd = commands[nv_cmds[0]] write_bin_byte(bin_cmd) elif (nv_cmds[0]=='ROTLB'): bin_cmd = commands[nv_cmds[0]] write_bin_byte(bin_cmd) elif (nv_cmds[0]=='BROADCAST8'): bin_cmd = commands[nv_cmds[0]] write_bin_byte(bin_cmd) bin_cmd = nv_cmds[1] #convert the byte to broadcast to binary, add in a delay writebyte(bin_cmd) elif (nv_cmds[0]=='BROADCAST1'): bin_cmd = commands[nv_cmds[0]] write_bin_byte(bin_cmd) bin_cmd = nv_cmds[1] #convert the bit to broadcast to binary, add in a delay writebyte(bin_cmd) elif (nv_cmds[0]=='REPORT8'): #figure out if this needs to be a special case bin_cmd = commands[nv_cmds[0]] write_bin_byte(bin_cmd) elif (nv_cmds[0]=='REPORT1'): bin_cmd = commands[nv_cmds[0]] #figure out if this needs to be a special case write_bin_byte(bin_cmd) elif (nv_cmds[0]=='SEND8'): bin_cmd = commands[nv_cmds[0]] write_bin_byte(bin_cmd) elif (nv_cmds[0]=='SEND1'): bin_cmd = commands[nv_cmds[0]] write_bin_byte(bin_cmd) elif (nv_cmds[0]=='RECV8'): bin_cmd = commands[nv_cmds[0]] write_bin_byte(bin_cmd) elif (nv_cmds[0]=='RECV1'): bin_cmd = commands[nv_cmds[0]] write_bin_byte(bin_cmd) elif (nv_cmds[0]=='ENABLE'): bin_cmd = commands[nv_cmds[0]] write_bin_byte(bin_cmd) elif (nv_cmds[0]=='COMPARE'): bin_cmd = commands[nv_cmds[0]] write_bin_byte(bin_cmd) elif (nv_cmds[0]=='RESOLVE'): bin_cmd = commands[nv_cmds[0]] write_bin_byte(bin_cmd) bin_cmd = commands['NOP'] write_bin_byte(bin_cmd) elif (nv_cmds[0]=='CLEAR'): bin_cmd = commands[nv_cmds[0]] write_bin_byte(bin_cmd) elif (nv_cmds[0]=='SET'): bin_cmd = commands[nv_cmds[0]] write_bin_byte(bin_cmd) elif (nv_cmds[0]=='NEGATE'): bin_cmd = commands[nv_cmds[0]] write_bin_byte(bin_cmd) elif (nv_cmds[0]=='AND'): bin_cmd = commands[nv_cmds[0]] write_bin_byte(bin_cmd) elif (nv_cmds[0]=='OR'): bin_cmd = commands[nv_cmds[0]] write_bin_byte(bin_cmd) elif (nv_cmds[0]=='XOR'): bin_cmd = commands[nv_cmds[0]] write_bin_byte(bin_cmd) elif (nv_cmds[0]=='EQU'): bin_cmd = commands[nv_cmds[0]] write_bin_byte(bin_cmd) elif (nv_cmds[0]=='NAND'): bin_cmd = commands[nv_cmds[0]] write_bin_byte(bin_cmd) elif (nv_cmds[0]=='NOR'): bin_cmd = commands[nv_cmds[0]] write_bin_byte(bin_cmd) elif (nv_cmds[0]=='NOP'): bin_cmd = commands[nv_cmds[0]] write_bin_byte(bin_cmd) return ser = serial.Serial(1,9600,timeout=2) ser.flushInput() commands = {'LOADA8': '00000', 'LOADB8': '00001', 'LOADA1': '00010', 'LOADB1': '00011', 'STOREA8': '00100', 'STOREB8': '00101', 'STOREA1': '00110', 'STOREB1': '00111', 'READRAM': '01000000', 'WRITERAM': '01001000', 'ADD1': '01010000', 'SUB1':'01011000', 'ROTRA': '01100000', 'ROTLA': '01101000', 'ROTRB': '01110000', 'ROTLB':'01111000', 'BROADCAST8':'10010000', 'BROADCAST1':'10011000', 'REPORT8':'10100000', 'REPORT1':'10101000', 'SEND8':'1011000', 'SEND1':'1011100', 'RECV8':'110000', 'RECV1':'110010', 'ENABLE':'11010000', 'COMPARE':'11011000', 'RESOLVE':'11100000', 'CLEAR':'10000000', 'SET':'10000001', 'NEGATE':'10000010','AND':'10000011', 'OR':'10000100', 'XOR':'10000101', 'EQU':'10000110', 'NAND':'10000111', 'NOR':'10001000', 'NOP':'11101000'} reg8 = {'A8':'000', 'B8':'001', 'C8':'010', 'X8':'011', 'Y8':'100', 'Z8':'101', 'MAR':'110', 'IO8':'111'} reg1 = {'A1':'000', 'B1':'001', 'C1':'010', 'X1':'011', 'Y1':'100', 'Z1':'101', 'IO1':'110', 'EN1':'111'}