102 lines
4.6 KiB
Python
102 lines
4.6 KiB
Python
from ScEpTIC.config.base_config import ScEpTICBaseConfig
|
|
|
|
from ScEpTIC.emulator.memory.physical.physical_state_retention import PhysicalStateRetention
|
|
|
|
class StateRetentionConfig(ScEpTICBaseConfig):
|
|
"""
|
|
State retention mechanism configuration
|
|
"""
|
|
|
|
_config_domain = {
|
|
'type': {'class': 'specific', 'values': ['checkpoint', 'task'], 'mode': 'set'},
|
|
'state_save_function_name': {'class': str, 'mode': 'set'},
|
|
'state_restore_function_name': {'class': str, 'mode': 'set'},
|
|
'state_save_strategy': {'class': 'specific', 'values': ['static_placement', 'interrupt'], 'mode': 'set'},
|
|
'state_save_behaviour': {'class': 'specific', 'values': ['probe', 'execute'], 'mode': 'set'},
|
|
'probe_with_adc': {'class': bool, 'mode': 'set'},
|
|
'calculate_v_save_state': {'class': bool, 'mode': 'set'},
|
|
'calculate_v_save_state_additional_cc': {'class': int, 'mode': 'set'},
|
|
'calculate_v_resume_additional_cc': {'class': int, 'mode': 'set'},
|
|
'calculate_v_restore_min_cc': {'class': int, 'mode': 'set'},
|
|
'v_save_state': {'class': float, 'value_check_function': lambda x: x > 0, 'mode': 'set'},
|
|
'v_resume': {'class': float, 'value_check_function': lambda x: x > 0, 'mode': 'set'},
|
|
'hibernate_after_save': {'class': bool, 'mode': 'set'},
|
|
'restore_register_file': {'class': bool, 'mode': 'set'},
|
|
'restore_stack': {'class': bool, 'mode': 'set'},
|
|
'restore_heap': {'class': bool, 'mode': 'set'},
|
|
'restore_volatile_gst': {'class': bool, 'mode': 'set'},
|
|
'restore_non_volatile_gst': {'class': bool, 'mode': 'set'},
|
|
'restore_environment': {'class': bool, 'mode': 'set'},
|
|
'before_restore_function_name': {'class': str, 'mode': 'set'},
|
|
'after_restore_function_name': {'class': str, 'mode': 'set'},
|
|
'before_save_function_name': {'class': str, 'mode': 'set'},
|
|
'after_save_function_name': {'class': str, 'mode': 'set'},
|
|
'physical_state_retention': {'class': PhysicalStateRetention, 'mode': 'set'},
|
|
}
|
|
|
|
_function_names = [
|
|
'state_save_function_name',
|
|
'state_restore_function_name',
|
|
'before_restore_function_name',
|
|
'after_restore_function_name',
|
|
'before_save_function_name',
|
|
'after_save_function_name',
|
|
]
|
|
|
|
def __init__(self, main_config):
|
|
super().__init__(main_config)
|
|
|
|
self.type = 'checkpoint'
|
|
|
|
# Routines
|
|
self.state_save_function_name = f"{self._main_config.program.ir_function_prefix}checkpoint"
|
|
self.state_restore_function_name = f"{self._main_config.program.ir_function_prefix}restore"
|
|
|
|
# Custom routines executed before/after state-saving/stare-restoring operations
|
|
self.before_save_function_name = f"{self._main_config.program.ir_function_prefix}sceptic_before_save"
|
|
self.after_save_function_name = f"{self._main_config.program.ir_function_prefix}sceptic_after_save"
|
|
self.before_restore_function_name = f"{self._main_config.program.ir_function_prefix}sceptic_before_restore"
|
|
self.after_restore_function_name = f"{self._main_config.program.ir_function_prefix}sceptic_after_restore"
|
|
|
|
# Placement
|
|
self.state_save_strategy = 'static'
|
|
self.state_save_behaviour = 'execute'
|
|
|
|
# Restore config
|
|
self.restore_register_file = True
|
|
self.restore_stack = True
|
|
self.restore_heap = True
|
|
self.restore_volatile_gst = True
|
|
self.restore_non_volatile_gst = False
|
|
self.restore_environment = False
|
|
self.hibernate_after_save = False
|
|
|
|
# Voltage threshold for probe / interrupts
|
|
self.calculate_v_save_state = False
|
|
self.calculate_v_save_state_additional_cc = 0
|
|
self.calculate_v_resume_additional_cc = 0
|
|
self.calculate_v_restore_min_cc = 0
|
|
self.probe_with_adc = False
|
|
self.v_save_state = 0.0
|
|
self.v_resume = 0.0
|
|
|
|
# Physical state retention
|
|
self.physical_state_retention = None
|
|
|
|
for name in self._function_names:
|
|
self._register_config_callback(name, self._append_prefix_callback)
|
|
|
|
|
|
def _append_prefix_callback(self, config_name, config_value):
|
|
"""
|
|
Callback to append prefix to state save/restore functions
|
|
:param config_name: the configuration name
|
|
:param config_value: the configuration value
|
|
"""
|
|
prefix = self._main_config.program.ir_function_prefix
|
|
|
|
for attribute in self._function_names:
|
|
attribute_val = getattr(self, attribute)
|
|
if attribute_val[0] != prefix:
|
|
setattr(self, attribute, f"{prefix}{attribute_val}")
|