Created
June 1, 2016 02:38
-
-
Save phase/d94b0da24fca9b7b458804f105a3d71b to your computer and use it in GitHub Desktop.
The worst Python code I've ever seen.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import time | |
def ALU(A,B,IA,IB,Cin,OR,FC): | |
preC,Carry,C=[0 for i in range(len(A)+1)],[0 for i in range(len(A)+2)],[0 for i in range(len(A)+1)] | |
for i in range(len(A)): | |
if IA: | |
if A[i] == 1: | |
A[i] = 0 | |
else: | |
A[i] = 1 | |
if IB: | |
if B[i] == 1: | |
B[i] = 0 | |
else: | |
B[i] = 1 | |
A=[0]+A | |
B=[0]+B | |
if Cin or FC: | |
Carry[len(A)]=1 | |
else: | |
Carry[len(A)]=0 | |
i=len(A)-1 | |
while i != 0: | |
if (A[i]&B[i])==1: | |
if not OR: | |
Carry[i]=1 | |
else: | |
preC[i]=1 | |
elif (A[i]|B[i])==1: | |
preC[i]=1 | |
if FC: | |
Carry[i]=1 | |
if (preC[i]&Carry[i+1])==1: | |
Carry[i]=1 | |
elif (preC[i]|Carry[i+1])==1: | |
C[i]=1 | |
i-=1 | |
i=0 | |
out=[] | |
while i != len(A): | |
if i != 0: | |
out.append(bool(C[i])) | |
i+=1 | |
return out,Carry[1] | |
def convertTo(Value,MaxValue): | |
j=0 | |
i=1 | |
while j!=MaxValue-1: | |
i*=2 | |
j+=1 | |
output=[] | |
while i!=1: | |
if Value>=i: | |
Value-=i | |
output.append(True) | |
else: | |
output.append(False) | |
i=int(i/2) | |
if Value>=i: | |
Value-=i | |
output.append(True) | |
else: | |
output.append(False) | |
return output | |
'''ROM = ["LOAD 0 255", | |
"LOAD 1 0", | |
"ADD 0 1", | |
"PRNT 0 ", | |
"HALT ", | |
]''' | |
#FIBONACCI | |
ROM = ["LOAD 0 1", | |
"LOAD 2 10", | |
"ADD 0 1", | |
"JMPIF 2 1", | |
"PRNT 0 ", | |
"ADD 1 0", | |
"JMPIF 2 1", | |
"PRNT 1 ", | |
"LOAD 2 1", | |
"JMP 2 ", | |
"HALT ", | |
] | |
INFO =["LOAD ID VALUE ",#LOAD Number_ID_of_the_REGS[SLOT] Value_Goes_into_that_SLOT/ | |
"ADD ID ID ",#ADD Number_ID_of_the_REGS[SLOT]_as_A Number_ID_of_the_REGS[SLOT]_as_B Then_Is_Added_A_and_B_and_oututs_to_A's_ID | |
"SUB ID ID ",#ADD Number_ID_of_the_REGS[SLOT]_as_A Number_ID_of_the_REGS[SLOT]_as_B Then_Is_Subtracted_A_and_B_and_oututs_to_A's_ID | |
"PRNT ID ",#PRINT Number_ID_of_the_REGS[SLOT]_to_Debug_Print | |
"DETC ID ID ",#DETECT Number_ID_of_the_REGS[SLOT]_as_A Number_ID_of_the_REGS[SLOT]_as_B Then_Is_Subtracted_A_and_B_and_outputs_to_REGS[5](FLAG) | |
"JMPIF ID FGVALUE",#JUMPIF Number_ID_of_the_REGS[SLOT]_to_JUMP_To Number_ID_of_the_REGS[SLOT]_compared_to_REGS[5](FLAGS) | |
"JMP ID ",#JUMP Number_ID_of_the_REGS[SLOT]_to_JUMP_To | |
"HALT ",#HALT STOPS_THE_PROGRAM | |
"WRAM ID ID ",#WRITE_RAM Number_ID_of_the_REGS[SLOT]_for_RAMPOS Number_ID_of_the_REGS[SLOT]_for_RAMPOS_to_write | |
"RRAM ID ID ",#READ_RAM Number_ID_of_the_REGS[SLOT]_for_RAMPOS Number_ID_of_the_REGS[SLOT]_for_RAMPOS_to_read | |
] | |
RAM=[[False,False,False,False,False,False,False,False] for x in range(65536*64+65536)] | |
REGS=[[False,False,False,False,False,False,False,False] for x in range(8)] | |
#print(RAM) | |
print((len(RAM)*8)/1024/1024,"MB of RAM") | |
PC=0x00 | |
running=1 | |
delay=0 | |
while running: | |
Line=ROM[PC].split() | |
#print(PC,Line) | |
#for i in range(8): | |
# print(REGS[i]) | |
if Line[0] == "LOAD": | |
REGS[int(Line[1])]=convertTo(int(Line[2]),8) | |
PC+=1 | |
elif Line[0] == "ADD": | |
REGS[int(Line[1])],o=ALU(REGS[int(Line[1])],REGS[int(Line[2])],0,0,0,0,0) | |
REGS[5]=convertTo(o,8) | |
PC+=1 | |
elif Line[0] == "SUB": | |
REGS[int(Line[1])],none=ALU(REGS[int(Line[1])],REGS[int(Line[2])],0,1,1,0,0) | |
PC+=1 | |
elif Line[0] == "OR": | |
REGS[int(Line[1])],none=ALU(REGS[int(Line[1])],REGS[int(Line[2])],0,0,0,1,0) | |
PC+=1 | |
elif Line[0] == "NOR": | |
REGS[int(Line[1])],none=ALU(REGS[int(Line[1])],REGS[int(Line[2])],0,1,0,1,0) | |
PC+=1 | |
elif Line[0] == "XOR": | |
REGS[int(Line[1])],none=ALU(REGS[int(Line[1])],REGS[int(Line[2])],1,1,0,0,1) | |
PC+=1 | |
elif Line[0] == "XNOR": | |
REGS[int(Line[1])],none=ALU(REGS[int(Line[1])],REGS[int(Line[2])],0,1,0,0,1) | |
PC+=1 | |
elif Line[0] == "AND": | |
REGS[int(Line[1])],none=ALU(REGS[int(Line[1])],REGS[int(Line[2])],1,1,1,1,1) | |
PC+=1 | |
elif Line[0] == "NAND": | |
REGS[int(Line[1])],none=ALU(REGS[int(Line[1])],REGS[int(Line[2])],0,1,1,1,1) | |
PC+=1 | |
elif Line[0] == "INV": | |
REGS[int(Line[1])],none=ALU(REGS[int(Line[1])],[0,0,0,0,0,0,0,0],1,0,0,0,0) | |
PC+=1 | |
elif Line[0] == "PRNT": | |
temp=[] | |
for i in range(8): | |
temp.append(int(REGS[int(Line[1])][i])) | |
print(temp) | |
PC+=1 | |
elif Line[0] == "DETC": | |
l,o=ALU(REGS[int(Line[1])],REGS[int(Line[2])],0,1,1,0,0) | |
#print(l,o) | |
REGS[5]=convertTo(o,8) | |
if l == convertTo(0,8): | |
REGS[5]=convertTo(2,8) | |
PC+=1 | |
elif Line[0] == "JMP": | |
PC=0 | |
k=128 | |
for i in range(8): | |
PC=int(PC)+int(int(REGS[int(Line[1])][i])*k) | |
k/=2 | |
elif Line[0] == "JMPIF": | |
j=0 | |
k=128 | |
for i in range(8): | |
j=int(j)+int(int(REGS[int(Line[1])][i])*k) | |
k/=2 | |
d=Line[2] | |
o=0 | |
k=128 | |
for i in range(8): | |
o=int(o)+int(int(REGS[5][i])*k) | |
k/=2 | |
#print(j,d,o) | |
if int(d)==int(o): | |
PC=j | |
else: | |
PC+=1 | |
elif Line[0] == "HALT": | |
running=0 | |
time.sleep(delay) | |
print("CPU HALTED!!") |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment