-
Notifications
You must be signed in to change notification settings - Fork 0
/
gates.py
160 lines (153 loc) · 4.45 KB
/
gates.py
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
152
153
154
155
156
157
158
159
160
#Gates#
class NAND:
def __init__(self,inlc1,inlc2):
self.in1=inlc1.ot
self.in2=inlc2.ot
self.ot=not self.in1 and self.in2
self.t=0
def tick(self, inlc1, inlc2):
if self.t == 0:
self.t = 1
self.in1 = inlc1.ot
self.in2 = inlc2.ot
self.ot = not self.in1 and self.in2
inlc1.tick()
inlc2.tick()
self.t = 0
class NOR:
def __init__(self, inlc1, inlc2):
self.in1 = inlc1.ot
self.in2 = inlc2.ot
self.ot = not self.in1 or self.in2
self.t = 0
def tick(self, inlc1, inlc2):
if self.t == 0:
self.t = 1
self.in1 = inlc1.ot
self.in2 = inlc2.ot
self.ot = not self.in1 or self.in2
inlc1.tick()
inlc2.tick()
self.t = 0
class XOR:
def __init__(self, inlc1, inlc2):
self.in1 = inlc1.ot
self.in2 = inlc2.ot
self.ot = (self.in1 or self.in2)and not(self.in1 and self.in2)
self.t = 0
def tick(self, inlc1, inlc2):
if self.t == 0:
self.t = 1
self.in1 = inlc1.ot
self.in2 = inlc2.ot
self.ot = (self.in1 or self.in2)and not(self.in1 and self.in2)
inlc1.tick()
inlc2.tick()
self.t = 0
class OR:
def __init__(self, inlc1, inlc2):
self.in1 = inlc1.ot
self.in2 = inlc2.ot
self.ot = self.in1 or self.in2
self.t = 0
def tick(self, inlc1, inlc2):
if self.t == 0:
self.t = 1
self.in1 = inlc1.ot
self.in2 = inlc2.ot
self.ot = self.in1 or self.in2
inlc1.tick()
inlc2.tick()
self.t = 0
class AND:
def __init__(self, inlc1, inlc2):
self.in1 = inlc1.ot
self.in2 = inlc2.ot
self.ot = self.in1 and self.in2
self.t = 0
def tick(self, inlc1, inlc2):
if self.t == 0:
self.t = 1
self.in1 = inlc1.ot
self.in2 = inlc2.ot
self.ot = self.in1 and self.in2
inlc1.tick()
inlc2.tick()
self.t = 0
class XNOR:
def __init__(self, inlc1, inlc2):
self.in1 = inlc1.ot
self.in2 = inlc2.ot
self.ot = not((self.in1 or self.in2)and not(self.in1 and self.in2))
self.t = 0
def tick(self, inlc1, inlc2):
if self.t == 0:
self.t = 1
self.in1 = inlc1.ot
self.in2 = inlc2.ot
self.ot = not((self.in1 or self.in2)and not(self.in1 and self.in2))
inlc1.tick()
inlc2.tick()
self.t = 0
class NOT:
def __init__(self, inlc1):
self.in1 = inlc1.ot
self.ot = not self.in1
self.t = 0
def tick(self,inlc1):
if self.t == 0:
self.t = 1
self.in1 = inlc1.ot
self.ot = not self.in1
inlc1.tick()
self.t = 0
#In/Out puts#
class ipt:
def __init__(self,val):
self.ot = val
def stvl(self,val):
self.ot = val
class opt:
def __init__(self,inlc):
self.val=inlc.ot
def tick(self, inlc):
self.val = inlc.ot
inlc.tick()
#Components#
def comp_half_adder(in1,in2):
ti1 = ipt(in1)
ti2 = ipt(in2)
tg1 = XOR(ti1,ti2)
tg2 = AND(ti1,ti2)
to1 = opt(tg1)
to2 = opt(tg2)
return [to2.val,to1.val]
def comp_half_suber(in1,in2):
ti1 = ipt(in1)
ti2 = ipt(in2)
tg1 = XOR(ti1, ti2)
tg2 = AND(ti1, NOT(ti2))
to1 = opt(tg1)
to2 = opt(tg2)
return [to2.val, to1.val]
#Sets#
def compset_full_adder(in1,in2,carry):
tti1 = ipt(in1)
tti2 = ipt(in2)
ttc = ipt(carry)
tti1plustti2 = ipt(comp_half_adder(tti1,tti2)[1])
tttempc = ipt(comp_half_adder(tti1,tti2)[0])
tto1 = opt(comp_half_adder(tti1plustti2,ttc)[1])
tto2 = opt(OR(tempc, comp_half_adder(tti1plustti2, ttc)[0]))
return [tto1.val, tto2.val]
def compset_full_suber(in1,in2,carry):
tti1 = ipt(in1)
tti2 = ipt(in2)
ttc = ipt(carry)
tti1plustti2 = ipt(comp_half_suber(tti1, tti2)[1])
tttempc = ipt(comp_half_suber(tti1, tti2)[0])
tto1 = opt(comp_half_suber(tti1plustti2, ttc)[1])
tto2 = opt(OR(tempc, comp_half_suber(tti1plustti2, ttc)[0]))
return [tto1.val, tto2.val]
#Sets of sets#
#IC#