sceptic-biomem/ScEpTIC/config/state_retention_config.py
2026-07-10 10:38:57 +02:00

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}")