+ @classmethod
+ def import_location(cls, state):
+ location_actions = [
+ cls.build_action(definition) for definition in state['actions']]
+ return cls(state['bitwise_operand'], location_actions)
+
+ @classmethod
+ def build_action(cls, definition):
+ action_class = getattr(actions, definition['action_class'])
+ required_bits = definition['required_bits']
+ data = definition.get('data', {})
+ return action_class(required_bits, **data)
+
+ @classmethod
+ def new_location(cls, definition):
+ return cls.import_location({
+ 'bitwise_operand': cls.generate_bitwise_operand(),
+ 'actions': definition['actions'],
+ })
+
+ def export(self):
+ return {
+ 'bitwise_operand': self.bitwise_operand,
+ 'actions': [action.export() for action in self.actions],
+ }
+
+ def check_actions(self):
+ if not self.actions:
+ print "Warning: Location has no actions."
+ self.insert_default_default_action()
+ if self.actions[0].required_bits:
+ self.insert_default_default_action()
+
+ def insert_default_default_action(self):
+ self.actions.insert(0, self.build_action({
+ 'action_class': 'DoNothing',
+ 'required_bits': [],
+ }))