summaryrefslogtreecommitdiff
path: root/lib/codegen.py
diff options
context:
space:
mode:
authorDaniel Friesel <derf@finalrewind.org>2019-09-12 14:16:50 +0200
committerDaniel Friesel <derf@finalrewind.org>2019-09-12 14:16:50 +0200
commit2fcf0bb98675e1b0a2efa9b9f04de1393005b289 (patch)
treec25042ea8b6605929e5f249fc3f4e96c65b836a4 /lib/codegen.py
parente8a2892b83a920f6e82be94ab2a0e3edc52f3412 (diff)
evaluate online accounting accuracy for verying variable size
Diffstat (limited to 'lib/codegen.py')
-rw-r--r--lib/codegen.py33
1 files changed, 20 insertions, 13 deletions
diff --git a/lib/codegen.py b/lib/codegen.py
index 1f4bd6f..98eeafe 100644
--- a/lib/codegen.py
+++ b/lib/codegen.py
@@ -98,7 +98,7 @@ class SimulatedAccountingMethod:
* timer counter size (e.g. a 16-bit timer at 1MHz will overflow after 65us)
* variable size for accounting of durations, power and energy values
"""
- def __init__(self, pta: PTA, timer_freq_hz, timer_type, ts_type, power_type, energy_type):
+ def __init__(self, pta: PTA, timer_freq_hz, timer_type, ts_type, power_type, energy_type, ts_granularity = 1e-6, power_granularity = 1e-6, energy_granularity = 1e-12):
"""
Simulate Online Accounting for a given PTA.
@@ -117,14 +117,18 @@ class SimulatedAccountingMethod:
self.energy_class = simulate_int_type(energy_type)
self.current_state = pta.state['UNINITIALIZED']
+ self.ts_granularity = ts_granularity
+ self.power_granularity = power_granularity
+ self.energy_granularity = energy_granularity
+
self.energy = self.energy_class(0)
def _sleep_duration(self, duration_us):
- """
- Return the sleep duration a timer with the classes timer frequency would measure.
+ u"""
+ Return the sleep duration a timer with the configured timer frequency would measure, in µs
I.e., for a 35us sleep with a 50kHz timer (-> one tick per 20us), the OS would likely measure one tick == 20us.
- This is based on the assumption that the timer is reset at each transition.
+ This is based on the assumption that the timer is reset at each transition, so the duration of states may be under-, but not over-estimated
"""
us_per_tick = 1000000 / self.timer_freq_hz
ticks = self.timer_class(int(duration_us // us_per_tick))
@@ -137,18 +141,21 @@ class SimulatedAccountingMethod:
self.current_state = transition.destination
def get_energy(self):
- return self.energy.val
+ """
+ Return total energy in pJ
+ """
+ return self.energy.val * self.energy_granularity * 1e12
class SimulatedStaticStateOnlyAccountingImmediateCalculation(SimulatedAccountingMethod):
- def __init__(self, pta: PTA, timer_freq_hz, timer_type, ts_type, power_type, energy_type):
- super().__init__(pta, timer_freq_hz, timer_type, ts_type, power_type, energy_type)
+ def __init__(self, pta: PTA, *args, **kwargs):
+ super().__init__(pta, *args, **kwargs)
def sleep(self, duration_us):
self.energy += self.ts_class(self._sleep_duration(duration_us)) * self.power_class(int(self.current_state.power))
class SimulatedStaticAccountingImmediateCalculation(SimulatedAccountingMethod):
- def __init__(self, pta: PTA, timer_freq_hz, timer_type, ts_type, power_type, energy_type):
- super().__init__(pta, timer_freq_hz, timer_type, ts_type, power_type, energy_type)
+ def __init__(self, pta: PTA, *args, **kwargs):
+ super().__init__(pta, *args, **kwargs)
def sleep(self, duration_us):
self.energy += self.ts_class(self._sleep_duration(duration_us)) * self.power_class(int(self.current_state.power))
@@ -158,8 +165,8 @@ class SimulatedStaticAccountingImmediateCalculation(SimulatedAccountingMethod):
super().pass_transition(transition)
class SimulatedStaticAccounting(SimulatedAccountingMethod):
- def __init__(self, pta: PTA, timer_freq_hz, timer_type, ts_type, power_type, energy_type):
- super().__init__(pta, timer_freq_hz, timer_type, ts_type, power_type, energy_type)
+ def __init__(self, pta: PTA, *args, **kwargs):
+ super().__init__(pta, *args, **kwargs)
self.time_in_state = dict()
for state_name in pta.state.keys():
self.time_in_state[state_name] = self.ts_class(0)
@@ -185,8 +192,8 @@ class SimulatedStaticAccounting(SimulatedAccountingMethod):
class SimulatedStaticStateOnlyAccounting(SimulatedAccountingMethod):
- def __init__(self, pta: PTA, timer_freq_hz, timer_type, ts_type, power_type, energy_type):
- super().__init__(pta, timer_freq_hz, timer_type, ts_type, power_type, energy_type)
+ def __init__(self, pta: PTA, *args, **kwargs):
+ super().__init__(pta, *args, **kwargs)
self.time_in_state = dict()
for state_name in pta.state.keys():
self.time_in_state[state_name] = self.ts_class(0)