summaryrefslogtreecommitdiff
path: root/tools/dfagen/dfagen/automaton.py
diff options
context:
space:
mode:
Diffstat (limited to 'tools/dfagen/dfagen/automaton.py')
-rw-r--r--tools/dfagen/dfagen/automaton.py111
1 files changed, 111 insertions, 0 deletions
diff --git a/tools/dfagen/dfagen/automaton.py b/tools/dfagen/dfagen/automaton.py
new file mode 100644
index 00000000..367da582
--- /dev/null
+++ b/tools/dfagen/dfagen/automaton.py
@@ -0,0 +1,111 @@
+class Event:
+ """Event definition."""
+
+ def __init__ (self, name, comments = ''):
+ self.name = name
+ self.comments = comments
+ pass
+
+ def __str__ (self):
+ s = ' ' + self.name + '\n'
+ if self.comments:
+ s += ' ' + self.comments.replace ('\n', '\n ') + '\n'
+ return s
+
+class State:
+ """State definition."""
+
+ def __init__ (self, name, comments = ''):
+ self.name = name
+ self.comments = comments
+ self.transitions = { }
+
+ def __str__ (self):
+ s = ' ' + self.name + '\n'
+ if self.comments:
+ s += ' ' + self.comments.replace ('\n', '\n ') + '\n'
+ return s
+
+ def add_branch (self, branch):
+ if branch.event not in self.transitions:
+ self.transitions[branch.event] = Transition (branch.event)
+ self.transitions[branch.event].add_branch (branch)
+
+class Transition:
+ """Transition definition."""
+
+ def __init__ (self, event):
+ self.event = event
+ self.branches = { }
+
+ def add_branch (self, branch):
+ assert self.event is branch.event
+ if branch.name == None and self.branches:
+ raise KeyError (branch.name)
+ if branch.name != None and None in self.branches:
+ raise KeyError (branch.name)
+ if branch.name in self.branches:
+ raise KeyError (branch.name)
+ self.branches[branch.name] = branch
+
+ def __str__ (self):
+ s = ''
+ for br in self.branches.values ():
+ s += str (br);
+ return s
+
+class TransitionBranch:
+
+ def __init__ (self, event, name = None, to = None, comments = ''):
+ self.event = event
+ self.name = name
+ self.to = to
+ self.comments = comments
+
+ def __str__ (self):
+ s = ' ' + self.event.name
+ if self.name:
+ s += ': ' + self.name
+ s += ' -> ' + (self.to and self.to.name or '.') + '\n'
+ if self.comments:
+ s += ' ' + self.comments.replace ('\n', '\n ') + '\n'
+ return s
+
+class Automaton:
+
+ def __init__ (self, name):
+ self.name = name
+ self.comments = ''
+ self.initial = None
+ self.states = { }
+ self.events = { }
+
+ def add_state (self, state):
+ if state.name in self.states:
+ raise KeyError (state.name)
+ if not self.states:
+ self.initial = state
+ self.states[state.name] = state
+
+ def add_event (self, event):
+ if event.name in self.events:
+ raise KeyError (event.name)
+ self.events[event.name] = event
+
+ def __str__ (self):
+ s = self.name
+ if self.comments:
+ s += ' ' + self.comments.replace ('\n', '\n ') + '\n'
+ s += '\nStates:\n'
+ for state in self.states.values ():
+ s += str (state)
+ s += '\nEvents:\n'
+ for event in self.events.values ():
+ s += str (event)
+ s += '\n'
+ for state in self.states.values ():
+ s += state.name + ':\n'
+ for tr in state.transitions.values ():
+ s += str (tr)
+ s += '\n'
+ return s