-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathflipflops.py
More file actions
129 lines (110 loc) · 3.8 KB
/
flipflops.py
File metadata and controls
129 lines (110 loc) · 3.8 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
'''
flipflops\n
type:function\n
name-format: flip_flop_[name] | latch_[name]\n
NOR Latch\n
NAND latch\n
SR flip flop\n
D flip flop\n
JK flip flop\n
Master slave JK flip flop\n
T flip flop
'''
from LogicPy.main_functions import *
from LogicPy.gates import *
'''Nor latch'''
def latch_nor(s , r , q , clock):
# to check input is int or float only!
if (valid_value(s , r , q , clock)):
# normalizing values
s , r ,clock = normalize_logic_values(s, r, clock)
# checking clock pulse
if clock == 0:
return q
else:
'''NOR Latch main logic : -1 means last stage and None for race around condition'''
if s == 0 :
if r == 0:
return q # last state
else:
return 0 # 0
else:
if r == 0:
return 1 # 1
else:
return -1 # race around
# raising ValueError
else:
raise ValueError("Invalid Values!")
'''Nand latch'''
def latch_nand(s , r , q , clock):
# to check input is int or float only!
if (valid_value(s , r , q , clock)):
# normalizing values
s , r ,clock = normalize_logic_values(s, r, clock)
# checking clock pulse
if clock == 0:
return q
else:
'''NAND Latch main logic : -1 means last stage and None for race around condition'''
if s == 0 :
if r == 0:
return -1 # race around
else:
return 1 # 0
else:
if r == 0:
return 0 # 1
else:
return q # last state
# raising ValueError
else:
raise ValueError("Invalid Values!")
'''SR flip flop'''
def flip_flop_sr(s , r , q , clock , active = "high"):
if (valid_value(s , r , q , clock)):
'''Since Active High SR latch is same as nor latch'''
if active.lower() == "high":
return latch_nor(s , r , q , clock) # SR latch logic
'''Since Active Low SR latch is same as nand latch'''
elif active.lower() == "low":
return latch_nand( s , r , q , clock) #S'R' logic
else:
raise SyntaxError("Unknown Mode")
else:
ValueError("Invalid Values!")
'''D flip flop'''
def flip_flop_d(d , q , clock):
if (valid_value(d , clock)):
'''D flip flop implementation using sr flip flop'''
d , q , clock = normalize_logic_values(d , q , clock) # normalizing values
return flip_flop_sr(d , not(d) , q , clock , active="high") # D flip-flop from SR flip flop
# raising ValueError
else:
raise ValueError("Invalid Values!")
'''T flip flop'''
def flip_flop_t(t , q , clock):
if (valid_value(t , q , clock)):
'''T flip flop implementation using D flip flop'''
t , q ,clock = normalize_logic_values(t , q ,clock) # normalizing values
t = logic_xor(t , q)
return flip_flop_d(t , q , clock) # t flip-flop from d flip flop
# raising ValueError
else:
raise ValueError("Invalid Values!")
'''JK Normal and master slave flip flop'''
def flip_flop_jk(j , k , q , clock , master_slave = False):
if (valid_value(j , k , q , clock)):
'''Same logic as SR flip flop'''
# master slave configuration
if master_slave :
output = flip_flop_jk(j , k , q , clock) # calling self without master slave config
if output == -1:
return int(not(q))
else:
return output
# normal JK flip flop
else:
return flip_flop_sr(j , k , q , clock , active="high")
else:
raise ValueError("Invalid Values!")