Initial Commit

This commit is contained in:
2022-03-26 11:21:46 +02:00
commit da7b8cb1ed
124 changed files with 66228 additions and 0 deletions
@@ -0,0 +1,42 @@
from Source.Pre_Built_Gates.Power import Power
from Source.Logic_Gates.Mux16 import Mux16
from Source.Logic_Gates.Not16 import Not16
from Source.Logic_Gates.And16 import And16
from Source.Components.Boolean_Arithmetic.Add16 import Add16
from Source.Logic_Gates.Or8Way import Or8Way
from Source.Pre_Built_Gates.Or import Or
from Source.Pre_Built_Gates.And import And
from Source.Pre_Built_Gates.Not import Not
class ALU:
def __init__(self,x,y,zx,nx,zy,ny,f,no) -> None:
self.x=x
self.y=y
self.zx=zx
self.nx=nx
self.zy=zy
self.ny=ny
self.f=f
self.no=no
self.out=[Power([Power(False) for _ in range(16)]),Power(False),Power(False)]
self()
def __call__(self) -> None:
x1=Mux16(self.x,Power([Power(False) for _ in range(16)]),self.zx)
y1=Mux16(self.y,Power([Power(False) for _ in range(16)]),self.zy)
notx1=Not16(x1)
noty1=Not16(y1)
x2=Mux16(x1,notx1,self.nx)
y2=Mux16(y1,noty1,self.ny)
addout=Add16(x2,y2)
andout=And16(x2,y2)
fout=Mux16(andout,addout,self.f)
notfout=Not16(fout)
out1=Mux16(fout,notfout,self.no)
zr1=Or8Way(Power(out1.out[0:8]))
zr2=Or8Way(Power(out1.out[8:16]))
zr3=Or(zr1,zr2)
zr=Not(zr3)
for i in range(16):
self.out[0].out[i].out=out1.out[i].out
self.out[1].out=zr.out
self.out[2].out=out1.out[0].out
@@ -0,0 +1,44 @@
from Source.Components.Boolean_Arithmetic.FullAdder import FullAdder
from Source.Components.Boolean_Arithmetic.HalfAdder import HalfAdder
from Source.Pre_Built_Gates.Power import Power
class Add16:
def __init__(self,a,b) -> None:
self.a=a
self.b=b
self.out=[Power(False) for _ in range(16)]
self()
def __call__(self) -> None:
add1=HalfAdder(self.a.out[15],self.b.out[15])
add2=FullAdder(self.a.out[14],self.b.out[14],add1.out[1])
add3=FullAdder(self.a.out[13],self.b.out[13],add2.out[1])
add4=FullAdder(self.a.out[12],self.b.out[12],add3.out[1])
add5=FullAdder(self.a.out[11],self.b.out[11],add4.out[1])
add6=FullAdder(self.a.out[10],self.b.out[10],add5.out[1])
add7=FullAdder(self.a.out[9],self.b.out[9],add6.out[1])
add8=FullAdder(self.a.out[8],self.b.out[8],add7.out[1])
add9=FullAdder(self.a.out[7],self.b.out[7],add8.out[1])
add10=FullAdder(self.a.out[6],self.b.out[6],add9.out[1])
add11=FullAdder(self.a.out[5],self.b.out[5],add10.out[1])
add12=FullAdder(self.a.out[4],self.b.out[4],add11.out[1])
add13=FullAdder(self.a.out[3],self.b.out[3],add12.out[1])
add14=FullAdder(self.a.out[2],self.b.out[2],add13.out[1])
add15=FullAdder(self.a.out[1],self.b.out[1],add14.out[1])
add16=FullAdder(self.a.out[0],self.b.out[0],add15.out[1])
self.out[0].out=add16.out[0].out
self.out[1].out=add15.out[0].out
self.out[2].out=add14.out[0].out
self.out[3].out=add13.out[0].out
self.out[4].out=add12.out[0].out
self.out[5].out=add11.out[0].out
self.out[6].out=add10.out[0].out
self.out[7].out=add9.out[0].out
self.out[8].out=add8.out[0].out
self.out[9].out=add7.out[0].out
self.out[10].out=add6.out[0].out
self.out[11].out=add5.out[0].out
self.out[12].out=add4.out[0].out
self.out[13].out=add3.out[0].out
self.out[14].out=add2.out[0].out
self.out[15].out=add1.out[0].out
@@ -0,0 +1,17 @@
from Source.Components.Boolean_Arithmetic.HalfAdder import HalfAdder
from Source.Logic_Gates.Xor import Xor
from Source.Pre_Built_Gates.Power import Power
class FullAdder:
def __init__(self,a,b,c) -> None:
self.a=a
self.b=b
self.c=c
self.out=[Power(False),Power(False)]
self()
def __call__(self) -> None:
ha1=HalfAdder(self.a,self.b)
ha2=HalfAdder(ha1.out[0],self.c)
xor=Xor(ha1.out[1],ha2.out[1])
self.out[0].out=ha2.out[0].out
self.out[1].out=xor.out
@@ -0,0 +1,15 @@
from Source.Pre_Built_Gates.And import And
from Source.Logic_Gates.Xor import Xor
from Source.Pre_Built_Gates.Power import Power
class HalfAdder:
def __init__(self,a,b) -> None:
self.a=a
self.b=b
self.out=[Power(False),Power(False)]
self()
def __call__(self) -> None:
bit_sum=Xor(self.a,self.b)
carry=And(self.a,self.b)
self.out[0].out=bit_sum.out
self.out[1].out=carry.out
@@ -0,0 +1,42 @@
from Source.Pre_Built_Gates.Power import Power
from Source.Components.Boolean_Arithmetic.HalfAdder import HalfAdder
class Inc16:
def __init__(self,a) -> None:
self.a=a
self.out=[Power(False) for _ in range(16)]
self()
def __call__(self) -> None:
add1=HalfAdder(self.a.out[15],Power(True))
add2=HalfAdder(self.a.out[14],add1.out[1])
add3=HalfAdder(self.a.out[13],add2.out[1])
add4=HalfAdder(self.a.out[12],add3.out[1])
add5=HalfAdder(self.a.out[11],add4.out[1])
add6=HalfAdder(self.a.out[10],add5.out[1])
add7=HalfAdder(self.a.out[9],add6.out[1])
add8=HalfAdder(self.a.out[8],add7.out[1])
add9=HalfAdder(self.a.out[7],add8.out[1])
add10=HalfAdder(self.a.out[6],add9.out[1])
add11=HalfAdder(self.a.out[5],add10.out[1])
add12=HalfAdder(self.a.out[4],add11.out[1])
add13=HalfAdder(self.a.out[3],add12.out[1])
add14=HalfAdder(self.a.out[2],add13.out[1])
add15=HalfAdder(self.a.out[1],add14.out[1])
add16=HalfAdder(self.a.out[0],add15.out[1])
self.out[0].out=add16.out[0].out
self.out[1].out=add15.out[0].out
self.out[2].out=add14.out[0].out
self.out[3].out=add13.out[0].out
self.out[4].out=add12.out[0].out
self.out[5].out=add11.out[0].out
self.out[6].out=add10.out[0].out
self.out[7].out=add9.out[0].out
self.out[8].out=add8.out[0].out
self.out[9].out=add7.out[0].out
self.out[10].out=add6.out[0].out
self.out[11].out=add5.out[0].out
self.out[12].out=add4.out[0].out
self.out[13].out=add3.out[0].out
self.out[14].out=add2.out[0].out
self.out[15].out=add1.out[0].out
+60
View File
@@ -0,0 +1,60 @@
from Source.Pre_Built_Gates.Not import Not
from Source.Pre_Built_Gates.And import And
from Source.Pre_Built_Gates.Or import Or
from Source.Pre_Built_Gates.Power import Power
from Source.Logic_Gates.Mux16 import Mux16
from Source.Components.Boolean_Arithmetic.ALU import ALU
from Source.Components.Sequential_Logic.Register import Register
from Source.Components.Sequential_Logic.PC import PC
class CPU:
def __init__(self,inM,instruction,reset) -> None:
self.inM=inM
self.instruction=instruction
self.reset=reset
self.out=[Power([Power(False) for _ in range(16)]),Power(False),Power([Power(False) for _ in range(15)]),Power([Power(False) for _ in range(15)])]
self.mux=Power([Power(False) for _ in range(16)])
self.ALUout=Power([Power(False) for _ in range(16)])
self.a_load=Power(False)
self.d_load=Power(False)
self.PC_load=Power(False)
self.A_register=Register(self.mux,self.a_load)
self.D_register=Register(self.ALUout,self.d_load)
self.PC=PC(self.A_register,self.PC_load,Power(True),self.reset)
self()
def __call__(self) -> None:
not1=Not(self.instruction.out[0])
mux1=Mux16(self.ALUout,self.instruction,not1)
for i in range(16):
self.mux.out[i].out=mux1.out[i].out
a_load=Or(not1,self.instruction.out[10])
self.a_load.out=a_load.out
self.A_register()
and1=And(self.instruction.out[0],self.instruction.out[3])
mux2=Mux16(self.A_register,self.inM,and1)
d_load=And(self.instruction.out[0],self.instruction.out[11])
self.d_load.out=d_load.out
alu=ALU(self.D_register,mux2,self.instruction.out[4],self.instruction.out[5],self.instruction.out[6],self.instruction.out[7],self.instruction.out[8],self.instruction.out[9])
for i in range(16):
self.ALUout.out[i].out=alu.out[0].out[i].out
self.D_register()
and3=And(self.instruction.out[0],self.instruction.out[12])
poz=Not(alu.out[2])
non_zero=Not(alu.out[1])
jgt=And(self.instruction.out[0],self.instruction.out[15])
poz_non_zero=And(poz,non_zero)
jmp1=And(jgt,poz_non_zero)
jeq=And(self.instruction.out[0],self.instruction.out[14])
jmp2=And(jeq,alu.out[1])
jlt=And(self.instruction.out[0],self.instruction.out[13])
jmp3=And(jlt,alu.out[2])
jmp4=Or(jmp1,jmp2)
jmp5=Or(jmp4,jmp3)
self.PC_load.out=jmp5.out
self.PC()
for i in range(16):
self.out[0].out[i].out=alu.out[0].out[i].out
self.out[1].out=and3.out
for i in range(15):
self.out[2].out[i].out=self.A_register.out[i+1].out
self.out[3].out[i].out=self.PC.out[i+1].out
+14
View File
@@ -0,0 +1,14 @@
from Source.Components.Sequential_Logic.RAM32K import RAM32K
class Memory(RAM32K):
def log_memory(self):
f=open("Source/RAM_Log.txt","w")
for a in range(8):
for b in range(8):
for c in range(8):
for d in range(8):
for e in range(8):
string="".join([str((int(self.ram.out[a].ram.out[b].ram.out[c].ram.out[d].registers.out[e].out[i].out))) for i in range(16)])
string=string+" "+str(int(string[1:16],2) if string[0]=="0" else int(string[1:16],2)-32768)+"\n"
f.write(string)
f.close()
+25
View File
@@ -0,0 +1,25 @@
from Source.Pre_Built_Gates.Power import Power
class ROM32K:
def __init__(self,a,file_path) -> None:
self.a=a
self.file_path=file_path
self.out=[Power(False) for _ in range(16)]
self.memory=[]
self.loadROM(self.file_path)
self()
def __call__(self) -> None:
instuction=self.memory[self.bool_to_int(self.a)]
for i in range(16):
self.out[i].out=instuction[i]
def loadROM(self,file_path):
f=open(file_path,"r")
for _ in range(32768):
line=f.readline()
self.memory.append([line[j]=="1" for j in range(16)])
f.close()
def bool_to_int(self,a):
x=0
for i in range(14,-1,-1):
x+=a.out[i].out*(2**(14-i))
return x
+16
View File
@@ -0,0 +1,16 @@
from Source.Pre_Built_Gates.FlipFlop import FlipFlop
from Source.Logic_Gates.Mux import Mux
class Bit:
def __init__(self,a,load) -> None:
self.a=a
self.load=load
self.out=None
self.mux=Mux(self,self.a,self.load)
self.flipflop=FlipFlop(self.mux)
self()
def __call__(self) -> None:
self.mux()
self.flipflop()
self.out=self.mux.out
+25
View File
@@ -0,0 +1,25 @@
from Source.Logic_Gates.Mux16 import Mux16
from Source.Components.Boolean_Arithmetic.Inc16 import Inc16
from Source.Components.Sequential_Logic.Register import Register
from Source.Pre_Built_Gates.Power import Power
class PC:
def __init__(self,a,load,inc,reset) -> None:
self.a=a
self.load=load
self.inc=inc
self.reset=reset
self.out=[Power(False) for _ in range(16)]
self.mux3=Power([Power(False) for _ in range(16)])
self.register=Register(self.mux3,Power(True))
self()
def __call__(self) -> None:
inc1=Inc16(self)
mux1=Mux16(self,inc1,self.inc)
mux2=Mux16(mux1,self.a,self.load)
mux3=Mux16(mux2,Power([Power(False) for _ in range(16)]),self.reset)
for i in range(16):
self.mux3.out[i].out=mux3.out[i].out
self.register()
for i in range(16):
self.out[i].out=self.register.out[i].out
@@ -0,0 +1,23 @@
from Source.Logic_Gates.DMux8Way import DMux8Way
from Source.Logic_Gates.Mux8Way16 import Mux8Way16
from Source.Components.Sequential_Logic.RAM4K import RAM4K
from Source.Pre_Built_Gates.Power import Power
class RAM32K:
def __init__(self,a,load,address) -> None:
self.a=a
self.load=load
self.address=address
self.dmux=Power([Power(False) for _ in range(16)])
self.ram=Power([RAM4K(self.a,self.dmux.out[i],Power(self.address.out[3:15])) for i in range(8)])
self.out=[Power(False) for _ in range(16)]
self()
def __call__(self) -> None:
dmux=DMux8Way(self.load,Power(self.address.out[0:3]))
for i in range(8):
self.dmux.out[i].out=dmux.out[i].out
for i in range(8):
self.ram.out[i]()
mux=Mux8Way16(self.ram.out[0],self.ram.out[1],self.ram.out[2],self.ram.out[3],self.ram.out[4],self.ram.out[5],self.ram.out[6],self.ram.out[7],Power(self.address.out[0:3]))
for i in range(16):
self.out[i].out=mux.out[i].out
@@ -0,0 +1,23 @@
from Source.Logic_Gates.DMux8Way import DMux8Way
from Source.Logic_Gates.Mux8Way16 import Mux8Way16
from Source.Components.Sequential_Logic.RAM512 import RAM512
from Source.Pre_Built_Gates.Power import Power
class RAM4K:
def __init__(self,a,load,address):
self.a=a
self.load=load
self.address=address
self.dmux=Power([Power(False) for _ in range(16)])
self.ram=Power([RAM512(self.a,self.dmux.out[i],Power(self.address.out[3:12])) for i in range(8)])
self.out=[Power(False) for _ in range(16)]
self()
def __call__(self) -> None:
dmux=DMux8Way(self.load,Power(self.address.out[0:3]))
for i in range(8):
self.dmux.out[i].out=dmux.out[i].out
for i in range(8):
self.ram.out[i]()
mux=Mux8Way16(self.ram.out[0],self.ram.out[1],self.ram.out[2],self.ram.out[3],self.ram.out[4],self.ram.out[5],self.ram.out[6],self.ram.out[7],Power(self.address.out[0:3]))
for i in range(16):
self.out[i].out=mux.out[i].out
@@ -0,0 +1,23 @@
from Source.Logic_Gates.DMux8Way import DMux8Way
from Source.Logic_Gates.Mux8Way16 import Mux8Way16
from Source.Components.Sequential_Logic.RAM64 import RAM64
from Source.Pre_Built_Gates.Power import Power
class RAM512:
def __init__(self,a,load,address):
self.a=a
self.load=load
self.address=address
self.dmux=Power([Power(False) for _ in range(16)])
self.ram=Power([RAM64(self.a,self.dmux.out[i],Power(self.address.out[3:9])) for i in range(8)])
self.out=[Power(False) for _ in range(16)]
self()
def __call__(self) -> None:
dmux=DMux8Way(self.load,Power(self.address.out[0:3]))
for i in range(8):
self.dmux.out[i].out=dmux.out[i].out
for i in range(8):
self.ram.out[i]()
mux=Mux8Way16(self.ram.out[0],self.ram.out[1],self.ram.out[2],self.ram.out[3],self.ram.out[4],self.ram.out[5],self.ram.out[6],self.ram.out[7],Power(self.address.out[0:3]))
for i in range(16):
self.out[i].out=mux.out[i].out
@@ -0,0 +1,23 @@
from Source.Logic_Gates.DMux8Way import DMux8Way
from Source.Logic_Gates.Mux8Way16 import Mux8Way16
from Source.Components.Sequential_Logic.RAM8 import RAM8
from Source.Pre_Built_Gates.Power import Power
class RAM64:
def __init__(self,a,load,address):
self.a=a
self.load=load
self.address=address
self.dmux=Power([Power(False) for _ in range(16)])
self.ram=Power([RAM8(self.a,self.dmux.out[i],Power(self.address.out[3:6])) for i in range(8)])
self.out=[Power(False) for _ in range(16)]
self()
def __call__(self) -> None:
dmux=DMux8Way(self.load,Power(self.address.out[0:3]))
for i in range(8):
self.dmux.out[i].out=dmux.out[i].out
for i in range(8):
self.ram.out[i]()
mux=Mux8Way16(self.ram.out[0],self.ram.out[1],self.ram.out[2],self.ram.out[3],self.ram.out[4],self.ram.out[5],self.ram.out[6],self.ram.out[7],Power(self.address.out[0:3]))
for i in range(16):
self.out[i].out=mux.out[i].out
@@ -0,0 +1,23 @@
from Source.Logic_Gates.DMux8Way import DMux8Way
from Source.Logic_Gates.Mux8Way16 import Mux8Way16
from Source.Components.Sequential_Logic.Register import Register
from Source.Pre_Built_Gates.Power import Power
class RAM8:
def __init__(self,a,load,address) -> None:
self.a=a
self.load=load
self.address=address
self.dmux=Power([Power(False) for _ in range(16)])
self.registers=Power([Register(self.a,self.dmux.out[i]) for i in range(8)])
self.out=[Power(False) for _ in range(16)]
self()
def __call__(self) -> None:
dmux=DMux8Way(self.load,self.address)
for i in range(8):
self.dmux.out[i].out=dmux.out[i].out
for i in range(8):
self.registers.out[i]()
mux=Mux8Way16(self.registers.out[0],self.registers.out[1],self.registers.out[2],self.registers.out[3],self.registers.out[4],self.registers.out[5],self.registers.out[6],self.registers.out[7],self.address)
for i in range(16):
self.out[i].out=mux.out[i].out
@@ -0,0 +1,14 @@
from Source.Components.Sequential_Logic.Bit import Bit
from Source.Pre_Built_Gates.Power import Power
class Register:
def __init__(self,a,load) -> None:
self.a=a
self.load=load
self.bits=[Bit(self.a.out[i],self.load) for i in range(16)]
self.out=[Power(False) for _ in range(16)]
self()
def __call__(self) -> None:
for i in range(16):
self.bits[i]()
self.out[i].out=self.bits[i].out
View File
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.