-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSequentialCircuit.py
More file actions
151 lines (122 loc) · 4.4 KB
/
SequentialCircuit.py
File metadata and controls
151 lines (122 loc) · 4.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
import LogicGate as lg
import ArithmeticLogicUnit as alu
import numpy as np
def SRLatch(s,r,q):
return lg.nor(lg.nor(s,q),r)
def DLatch(data,we,qi):
s = int(data and we)
r = int(not data and we)
q = SRLatch(s,r,qi)
return q
def DFF(data,qi,clock=1):
we = clock # in the real world, this should be "we = (not clock) and clock"
return DLatch(data,we,qi)
class Bit:
def __init__(self,q=0):
self.out = q
def next(self,inputs,load,clock=1):
data = lg.mux(self.out,inputs,load)
self.out = DFF(data,self.out,clock)
return self.out
class Register_:
def __init__(self):
self.register = [""]*16
for i in range(16):
self.register[i] = Bit()
def next(self, inputs, load, clock=1):
data = lg.mux16bit([b.out for b in self.register],inputs,load)
for i,d in enumerate(data):
self.register[i].next(d,load)
return [b.out for b in self.register]
def __str__(self):
return str([b.out for b in self.register])
class RAM8:
def __init__(self,n=8):
self.memory = [""]*n
for i in range(n):
self.memory[i] = Register_()
self.out = [0]*16
def next(self, inputs, address, load, clock=1):
loads = lg.dmux8way(load,address)
for l,reg in zip(loads,self.memory):
reg.next(inputs,l,clock)
self.out = lg.mux8way16bit(self.memory[0],self.memory[1],self.memory[2],self.memory[3],
self.memory[4],self.memory[5],self.memory[6],self.memory[7],address)
self.out = [b.out for b in self.out.register]
return self.out
def __str__(self):
s = ""
for reg in self.memory:
s += str(reg)+"\n"
return s
class RAM64:
def __init__(self,n=8):
self.memory = [""]*n
for i in range(n):
self.memory[i] = RAM8()
self.out = [0]*16
def next(self, inputs, address, load, clock=1):
# len(address) = 6
loads = lg.dmux8way(load,address[:3])
for l,ram8 in zip(loads,self.memory):
ram8.next(inputs,address[3:],l,clock)
self.out = lg.mux8way16bit(self.memory[0],self.memory[1],self.memory[2],self.memory[3],
self.memory[4],self.memory[5],self.memory[6],self.memory[7],address[:3]).memory
self.out = lg.mux8way16bit(self.out[0],self.out[1],self.out[2],self.out[3],
self.out[4],self.out[5],self.out[6],self.out[7],address[3:])
self.out = [b.out for b in self.out.register]
return self.out
def __str__(self):
s = ""
for ram in self.memory:
s += str(ram)
return s
# simplified implementation Version
class Register:
def __init__(self):
self.register = np.zeros([16])
self.out = list(self.register.astype(int))
def next(self, inputs, load, clock=1):
data = lg.mux16bit(self.register,inputs,load)
for i,d in enumerate(data):
self.register[i] = d
self.out = list(self.register.astype(int))
return self.out
def __str__(self):
return str(self.register)
def num(self):
return int("".join(map(str, self.register.astype(int))),base=2)
class RAM:
def __init__(self,n):
self.memory = np.zeros([n,16])
self.out = [0]*16
def next(self,inputs,address,load,clock=1):
reg = self.memory[int("".join(map(str,address)), base=2)]
data = lg.mux16bit(reg,inputs,load)
if clock:
self.memory[int("".join(map(str,address)), base=2)] = data
self.out = list(reg.astype(int))
return self.out
def load(self,address):
return self.next([0]*16,address,load=0)
def write(self,inputs,address):
return self.next(inputs,address,load=1)
def __str__(self):
return str(self.memory)
class PC:
def __init__(self):
self.reg = [0]*16
def next(self,inputs,inc,res,load,clock=1):
if res and clock:
self.reg = [0]*16
elif load and clock:
self.reg = inputs
elif inc and clock:
self.reg = alu.inc16bit(self.reg)
else:
self.reg = self.reg
return self.reg
def __str__(self):
return str(self.reg)
def num(self):
return int("".join(list(map(str, self.reg))),base=2)