-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathStateMachine.py
More file actions
145 lines (123 loc) · 3.84 KB
/
Copy pathStateMachine.py
File metadata and controls
145 lines (123 loc) · 3.84 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
class State:
def run(self, input):
assert 0, "run not implemented"
def next(self, input):
assert 0, "next not implemented"
class StateMachine:
def __init__(self, initialState):
self.currentState = initialState
def runAll(self, inputVector):
for i in inputVector:
self.currentState = self.currentState.next(i)
self.currentState.run(i)
class TrellisDiagram(StateMachine):
def __init__(self):
StateMachine.__init__(self,TrellisDiagram.state0)
self.possibleStates = [0,1,2,3]
self.possibleInputs = [0,1]
self.Tlookup= []
self.states = []
self.output = []
self.populateTlookup()
def populateTlookup(self):
"""[PreviousState,CurrentState,Input,Output]"""
for state in self.possibleStates:
self.setState(state)
for input in self.possibleInputs:
next = self.currentState.next(input)
out = self.currentState.run(input)
row = [state,next.getState(),input,out]
self.Tlookup.append(row)
self.setState(state)
self.setState(0)
def runAll(self, inputVector):
self.states = []
self.output = []
for i in inputVector:
self.output.append(self.currentState.run(i))
self.currentState = self.currentState.next(i)
self.states.append(self.currentState.getState())
def setState(self,state):
if state == 0:
self.currentState = TrellisDiagram.state0
if state == 1:
self.currentState = TrellisDiagram.state1
if state == 2:
self.currentState = TrellisDiagram.state2
if state == 3:
self.currentState = TrellisDiagram.state3
def checkTlookup(self,previousState,currentState,input,output):
check = [previousState,currentState,input,output]
if check in self.Tlookup:
return 1
else:
return 0
def getStates(self):
return self.states
def getOutput(self):
return self.output
def getPossibleOutputs(self):
possOut = []
for row in self.Tlookup:
possOut.append(row[3])
return possOut
def getPossibleStates(self):
return self.possibleStates
def getPossibleInputs(self):
return self.possibleInputs
class State0(State):
def run(self, input):
if input == 1:
return [1,1,1]
if input == 0:
return [0,0,0]
def next(self, input):
if input == 1:
return TrellisDiagram.state1
if input == 0:
return TrellisDiagram.state0
def getState(self):
return 0
class State1(State):
def run(self, input):
if input == 1:
return [0,1,0]
if input == 0:
return [1,0,1]
def next(self, input):
if input == 1:
return TrellisDiagram.state3
if input == 0:
return TrellisDiagram.state2
def getState(self):
return 1
class State2(State):
def run(self,input):
if input == 1:
return [1,0,0]
if input == 0:
return [0,1,1]
def next(self, input):
if input == 1:
return TrellisDiagram.state1
if input == 0:
return TrellisDiagram.state0
def getState(self):
return 2
class State3(State):
def run(self,input):
if input == 1:
return [0,0,1]
if input == 0:
return [1,1,0]
def next(self, input):
if input == 1:
return TrellisDiagram.state3
if input == 0:
return TrellisDiagram.state2
def getState(self):
return 3
TrellisDiagram.state0 = State0()
TrellisDiagram.state1 = State1()
TrellisDiagram.state2 = State2()
TrellisDiagram.state3 = State3()