summaryrefslogtreecommitdiff
path: root/lib/cycles_to_energy.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/cycles_to_energy.py')
-rw-r--r--lib/cycles_to_energy.py139
1 files changed, 62 insertions, 77 deletions
diff --git a/lib/cycles_to_energy.py b/lib/cycles_to_energy.py
index 35f9199..a8e88b8 100644
--- a/lib/cycles_to_energy.py
+++ b/lib/cycles_to_energy.py
@@ -5,86 +5,80 @@ Contains classes for some embedded CPUs/MCUs. Given a configuration, each
class can convert a cycle count to an energy consumption.
"""
+
def get_class(cpu_name):
"""Return model class for cpu_name."""
- if cpu_name == 'MSP430':
+ if cpu_name == "MSP430":
return MSP430
- if cpu_name == 'ATMega168':
+ if cpu_name == "ATMega168":
return ATMega168
- if cpu_name == 'ATMega328':
+ if cpu_name == "ATMega328":
return ATMega328
- if cpu_name == 'ATTiny88':
+ if cpu_name == "ATTiny88":
return ATTiny88
- if cpu_name == 'esp8266':
+ if cpu_name == "esp8266":
return ESP8266
+
def _param_list_to_dict(device, param_list):
param_dict = dict()
for i, parameter in enumerate(sorted(device.parameters.keys())):
param_dict[parameter] = param_list[i]
return param_dict
+
class MSP430:
- name = 'MSP430'
+ name = "MSP430"
parameters = {
- 'cpu_freq': [1e6, 4e6, 8e6, 12e6, 16e6],
- 'memory' : ['unified', 'fram0', 'fram50', 'fram66', 'fram75', 'fram100', 'ram'],
- 'voltage': [2.2, 3.0],
- }
- default_params = {
- 'cpu_freq': 4e6,
- 'memory' : 'unified',
- 'voltage': 3
+ "cpu_freq": [1e6, 4e6, 8e6, 12e6, 16e6],
+ "memory": ["unified", "fram0", "fram50", "fram66", "fram75", "fram100", "ram"],
+ "voltage": [2.2, 3.0],
}
+ default_params = {"cpu_freq": 4e6, "memory": "unified", "voltage": 3}
current_by_mem = {
- 'unified' : [210, 640, 1220, 1475, 1845],
- 'fram0' : [370, 1280, 2510, 2080, 2650],
- 'fram50' : [240, 745, 1440, 1575, 1990],
- 'fram66' : [200, 560, 1070, 1300, 1620],
- 'fram75' : [170, 480, 890, 1155, 1420],
- 'fram100' : [110, 235, 420, 640, 730],
- 'ram' : [130, 320, 585, 890, 1070],
+ "unified": [210, 640, 1220, 1475, 1845],
+ "fram0": [370, 1280, 2510, 2080, 2650],
+ "fram50": [240, 745, 1440, 1575, 1990],
+ "fram66": [200, 560, 1070, 1300, 1620],
+ "fram75": [170, 480, 890, 1155, 1420],
+ "fram100": [110, 235, 420, 640, 730],
+ "ram": [130, 320, 585, 890, 1070],
}
def get_current(params):
if type(params) != dict:
return MSP430.get_current(_param_list_to_dict(MSP430, params))
- cpu_freq_index = MSP430.parameters['cpu_freq'].index(params['cpu_freq'])
+ cpu_freq_index = MSP430.parameters["cpu_freq"].index(params["cpu_freq"])
- return MSP430.current_by_mem[params['memory']][cpu_freq_index] * 1e-6
+ return MSP430.current_by_mem[params["memory"]][cpu_freq_index] * 1e-6
def get_power(params):
if type(params) != dict:
return MSP430.get_energy(_param_list_to_dict(MSP430, params))
- return MSP430.get_current(params) * params['voltage']
+ return MSP430.get_current(params) * params["voltage"]
def get_energy_per_cycle(params):
if type(params) != dict:
return MSP430.get_energy_per_cycle(_param_list_to_dict(MSP430, params))
- return MSP430.get_power(params) / params['cpu_freq']
+ return MSP430.get_power(params) / params["cpu_freq"]
+
class ATMega168:
- name = 'ATMega168'
- parameters = {
- 'cpu_freq': [1e6, 4e6, 8e6],
- 'voltage': [2, 3, 5]
- }
- default_params = {
- 'cpu_freq': 4e6,
- 'voltage': 3
- }
+ name = "ATMega168"
+ parameters = {"cpu_freq": [1e6, 4e6, 8e6], "voltage": [2, 3, 5]}
+ default_params = {"cpu_freq": 4e6, "voltage": 3}
def get_current(params):
if type(params) != dict:
return ATMega168.get_current(_param_list_to_dict(ATMega168, params))
- if params['cpu_freq'] == 1e6 and params['voltage'] <= 2:
+ if params["cpu_freq"] == 1e6 and params["voltage"] <= 2:
return 0.5e-3
- if params['cpu_freq'] == 4e6 and params['voltage'] <= 3:
+ if params["cpu_freq"] == 4e6 and params["voltage"] <= 3:
return 3.5e-3
- if params['cpu_freq'] == 8e6 and params['voltage'] <= 5:
+ if params["cpu_freq"] == 8e6 and params["voltage"] <= 5:
return 12e-3
return None
@@ -92,37 +86,34 @@ class ATMega168:
if type(params) != dict:
return ATMega168.get_energy(_param_list_to_dict(ATMega168, params))
- return ATMega168.get_current(params) * params['voltage']
+ return ATMega168.get_current(params) * params["voltage"]
def get_energy_per_cycle(params):
if type(params) != dict:
- return ATMega168.get_energy_per_cycle(_param_list_to_dict(ATMega168, params))
+ return ATMega168.get_energy_per_cycle(
+ _param_list_to_dict(ATMega168, params)
+ )
+
+ return ATMega168.get_power(params) / params["cpu_freq"]
- return ATMega168.get_power(params) / params['cpu_freq']
class ATMega328:
- name = 'ATMega328'
- parameters = {
- 'cpu_freq': [1e6, 4e6, 8e6],
- 'voltage': [2, 3, 5]
- }
- default_params = {
- 'cpu_freq': 4e6,
- 'voltage': 3
- }
+ name = "ATMega328"
+ parameters = {"cpu_freq": [1e6, 4e6, 8e6], "voltage": [2, 3, 5]}
+ default_params = {"cpu_freq": 4e6, "voltage": 3}
# Source: ATMega328P Datasheet p.316 / table 28.2.4
def get_current(params):
if type(params) != dict:
return ATMega328.get_current(_param_list_to_dict(ATMega328, params))
# specified for 2V
- if params['cpu_freq'] == 1e6 and params['voltage'] >= 1.8:
+ if params["cpu_freq"] == 1e6 and params["voltage"] >= 1.8:
return 0.3e-3
# specified for 3V
- if params['cpu_freq'] == 4e6 and params['voltage'] >= 1.8:
+ if params["cpu_freq"] == 4e6 and params["voltage"] >= 1.8:
return 1.7e-3
# specified for 5V
- if params['cpu_freq'] == 8e6 and params['voltage'] >= 2.5:
+ if params["cpu_freq"] == 8e6 and params["voltage"] >= 2.5:
return 5.2e-3
return None
@@ -130,26 +121,26 @@ class ATMega328:
if type(params) != dict:
return ATMega328.get_energy(_param_list_to_dict(ATMega328, params))
- return ATMega328.get_current(params) * params['voltage']
+ return ATMega328.get_current(params) * params["voltage"]
def get_energy_per_cycle(params):
if type(params) != dict:
- return ATMega328.get_energy_per_cycle(_param_list_to_dict(ATMega328, params))
+ return ATMega328.get_energy_per_cycle(
+ _param_list_to_dict(ATMega328, params)
+ )
+
+ return ATMega328.get_power(params) / params["cpu_freq"]
- return ATMega328.get_power(params) / params['cpu_freq']
class ESP8266:
# Source: ESP8266EX Datasheet, table 5-2 (v2017.11) / table 3-4 (v2018.11)
# Taken at 3.0V
- name = 'ESP8266'
+ name = "ESP8266"
parameters = {
- 'cpu_freq': [80e6],
- 'voltage': [2.5, 3.0, 3.3, 3.6] # min / ... / typ / max
- }
- default_params = {
- 'cpu_freq': 80e6,
- 'voltage': 3.0
+ "cpu_freq": [80e6],
+ "voltage": [2.5, 3.0, 3.3, 3.6], # min / ... / typ / max
}
+ default_params = {"cpu_freq": 80e6, "voltage": 3.0}
def get_current(params):
if type(params) != dict:
@@ -161,33 +152,27 @@ class ESP8266:
if type(params) != dict:
return ESP8266.get_power(_param_list_to_dict(ESP8266, params))
- return ESP8266.get_current(params) * params['voltage']
+ return ESP8266.get_current(params) * params["voltage"]
def get_energy_per_cycle(params):
if type(params) != dict:
return ESP8266.get_energy_per_cycle(_param_list_to_dict(ESP8266, params))
- return ESP8266.get_power(params) / params['cpu_freq']
+ return ESP8266.get_power(params) / params["cpu_freq"]
+
class ATTiny88:
- name = 'ATTiny88'
- parameters = {
- 'cpu_freq': [1e6, 4e6, 8e6],
- 'voltage': [2, 3, 5]
- }
- default_params = {
- 'cpu_freq' : 4e6,
- 'voltage' : 3
- }
+ name = "ATTiny88"
+ parameters = {"cpu_freq": [1e6, 4e6, 8e6], "voltage": [2, 3, 5]}
+ default_params = {"cpu_freq": 4e6, "voltage": 3}
def get_current(params):
if type(params) != dict:
return ATTiny88.get_current(_param_list_to_dict(ATTiny88, params))
- if params['cpu_freq'] == 1e6 and params['voltage'] <= 2:
+ if params["cpu_freq"] == 1e6 and params["voltage"] <= 2:
return 0.2e-3
- if params['cpu_freq'] == 4e6 and params['voltage'] <= 3:
+ if params["cpu_freq"] == 4e6 and params["voltage"] <= 3:
return 1.4e-3
- if params['cpu_freq'] == 8e6 and params['voltage'] <= 5:
+ if params["cpu_freq"] == 8e6 and params["voltage"] <= 5:
return 4.5e-3
return None
-