powertrain-build 1.13.1__py3-none-any.whl → 1.13.3.dev3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- powertrain_build/__init__.py +40 -40
- powertrain_build/__main__.py +6 -6
- powertrain_build/a2l.py +582 -582
- powertrain_build/a2l_merge.py +650 -650
- powertrain_build/a2l_templates.py +717 -717
- powertrain_build/build.py +985 -985
- powertrain_build/build_defs.py +309 -309
- powertrain_build/build_proj_config.py +690 -690
- powertrain_build/check_interface.py +575 -575
- powertrain_build/cli.py +141 -141
- powertrain_build/config.py +542 -542
- powertrain_build/core.py +395 -395
- powertrain_build/core_dummy.py +343 -343
- powertrain_build/create_conversion_table.py +73 -73
- powertrain_build/dids.py +916 -916
- powertrain_build/dummy.py +157 -157
- powertrain_build/dummy_spm.py +252 -252
- powertrain_build/environmentcheck.py +52 -52
- powertrain_build/ext_dbg.py +255 -255
- powertrain_build/ext_var.py +327 -327
- powertrain_build/feature_configs.py +301 -301
- powertrain_build/gen_allsysteminfo.py +227 -227
- powertrain_build/gen_label_split.py +449 -449
- powertrain_build/handcode_replacer.py +124 -124
- powertrain_build/html_report.py +133 -133
- powertrain_build/interface/__init__.py +4 -4
- powertrain_build/interface/application.py +511 -511
- powertrain_build/interface/base.py +500 -500
- powertrain_build/interface/csp_api.py +490 -490
- powertrain_build/interface/device_proxy.py +677 -677
- powertrain_build/interface/ems.py +67 -67
- powertrain_build/interface/export_global_vars.py +121 -121
- powertrain_build/interface/generate_adapters.py +132 -132
- powertrain_build/interface/generate_hi_interface.py +87 -87
- powertrain_build/interface/generate_service.py +69 -69
- powertrain_build/interface/generate_wrappers.py +147 -147
- powertrain_build/interface/generation_utils.py +142 -142
- powertrain_build/interface/hal.py +194 -194
- powertrain_build/interface/model_yaml_verification.py +348 -348
- powertrain_build/interface/service.py +296 -296
- powertrain_build/interface/simulink.py +249 -249
- powertrain_build/interface/update_call_sources.py +180 -180
- powertrain_build/interface/update_model_yaml.py +186 -186
- powertrain_build/interface/zone_controller.py +362 -362
- powertrain_build/lib/__init__.py +4 -4
- powertrain_build/lib/helper_functions.py +127 -127
- powertrain_build/lib/logger.py +55 -55
- powertrain_build/matlab_scripts/CodeGen/BuildAutomationPyBuild.m +78 -78
- powertrain_build/matlab_scripts/CodeGen/Generate_A2L.m +154 -154
- powertrain_build/matlab_scripts/CodeGen/generateTLUnit.m +239 -239
- powertrain_build/matlab_scripts/CodeGen/getAsilClassification.m +28 -28
- powertrain_build/matlab_scripts/CodeGen/modelConfiguredForTL.m +28 -28
- powertrain_build/matlab_scripts/CodeGen/moveDefOutports.m +88 -88
- powertrain_build/matlab_scripts/CodeGen/parseCalMeasData.m +410 -410
- powertrain_build/matlab_scripts/CodeGen/parseCoreIdentifiers.m +139 -139
- powertrain_build/matlab_scripts/CodeGen/parseDIDs.m +141 -141
- powertrain_build/matlab_scripts/CodeGen/parseInPorts.m +106 -106
- powertrain_build/matlab_scripts/CodeGen/parseIncludeConfigs.m +25 -25
- powertrain_build/matlab_scripts/CodeGen/parseModelInfo.m +38 -38
- powertrain_build/matlab_scripts/CodeGen/parseNVM.m +81 -81
- powertrain_build/matlab_scripts/CodeGen/parseOutPorts.m +120 -120
- powertrain_build/matlab_scripts/CodeGen/parsePreProcBlks.m +23 -23
- powertrain_build/matlab_scripts/CodeGen/struct2JSON.m +128 -128
- powertrain_build/matlab_scripts/CodeGen/updateCodeSwConfig.m +31 -31
- powertrain_build/matlab_scripts/Init_PyBuild.m +91 -91
- powertrain_build/matlab_scripts/__init__.py +2 -2
- powertrain_build/matlab_scripts/helperFunctions/Get_Full_Name.m +46 -46
- powertrain_build/matlab_scripts/helperFunctions/Get_SrcLines.m +12 -12
- powertrain_build/matlab_scripts/helperFunctions/Init_Models.m +78 -78
- powertrain_build/matlab_scripts/helperFunctions/Init_Projects.m +67 -67
- powertrain_build/matlab_scripts/helperFunctions/Read_Units.m +34 -34
- powertrain_build/matlab_scripts/helperFunctions/SetProjectTimeSamples.m +26 -26
- powertrain_build/matlab_scripts/helperFunctions/Strip_Suffix.m +16 -16
- powertrain_build/matlab_scripts/helperFunctions/followLink.m +118 -118
- powertrain_build/matlab_scripts/helperFunctions/getCodeSwitches.m +50 -50
- powertrain_build/matlab_scripts/helperFunctions/getConsumerBlocks.m +30 -30
- powertrain_build/matlab_scripts/helperFunctions/getDefBlock.m +39 -39
- powertrain_build/matlab_scripts/helperFunctions/getDefOutport.m +58 -58
- powertrain_build/matlab_scripts/helperFunctions/getDstBlocks.m +19 -19
- powertrain_build/matlab_scripts/helperFunctions/getDstLines.m +13 -13
- powertrain_build/matlab_scripts/helperFunctions/getInterfaceSignals.m +37 -37
- powertrain_build/matlab_scripts/helperFunctions/getName.m +37 -37
- powertrain_build/matlab_scripts/helperFunctions/getPath.m +6 -6
- powertrain_build/matlab_scripts/helperFunctions/getProperValue.m +21 -21
- powertrain_build/matlab_scripts/helperFunctions/getSrcBlocks.m +19 -19
- powertrain_build/matlab_scripts/helperFunctions/getSrcLines.m +13 -13
- powertrain_build/matlab_scripts/helperFunctions/loadLibraries.m +10 -10
- powertrain_build/matlab_scripts/helperFunctions/loadjson.m +6 -6
- powertrain_build/matlab_scripts/helperFunctions/modifyEnumStructField.m +21 -21
- powertrain_build/matlab_scripts/helperFunctions/removeConfigDuplicates.m +31 -31
- powertrain_build/matlab_scripts/helperFunctions/sortSystemByClass.m +26 -26
- powertrain_build/matlab_scripts/helperFunctions/tl_getfast.m +89 -89
- powertrain_build/matlab_scripts/helperFunctions/topLevelSystem.m +20 -20
- powertrain_build/matlab_scripts/helperFunctions/updateModels.m +131 -131
- powertrain_build/memory_section.py +224 -224
- powertrain_build/nvm_def.py +729 -729
- powertrain_build/problem_logger.py +86 -86
- powertrain_build/pt_matlab.py +430 -430
- powertrain_build/pt_win32.py +144 -144
- powertrain_build/replace_compu_tab_ref.py +105 -105
- powertrain_build/rte_dummy.py +254 -254
- powertrain_build/sched_funcs.py +209 -207
- powertrain_build/signal.py +7 -7
- powertrain_build/signal_if_html_rep.py +221 -221
- powertrain_build/signal_if_html_rep_all.py +302 -302
- powertrain_build/signal_incons_html_rep.py +180 -180
- powertrain_build/signal_incons_html_rep_all.py +366 -366
- powertrain_build/signal_incons_html_rep_base.py +168 -168
- powertrain_build/signal_inconsistency_check.py +641 -641
- powertrain_build/signal_interfaces.py +864 -864
- powertrain_build/templates/Index_SigCheck_All.html +22 -22
- powertrain_build/templates/Index_SigIf_All.html +19 -19
- powertrain_build/types.py +218 -218
- powertrain_build/unit_configs.py +419 -419
- powertrain_build/user_defined_types.py +660 -660
- powertrain_build/versioncheck.py +66 -66
- powertrain_build/wrapper.py +512 -512
- powertrain_build/xlrd_csv.py +87 -87
- powertrain_build/zone_controller/__init__.py +4 -4
- powertrain_build/zone_controller/calibration.py +176 -176
- powertrain_build/zone_controller/composition_yaml.py +880 -878
- {powertrain_build-1.13.1.dist-info → powertrain_build-1.13.3.dev3.dist-info}/METADATA +100 -100
- powertrain_build-1.13.3.dev3.dist-info/RECORD +130 -0
- {powertrain_build-1.13.1.dist-info → powertrain_build-1.13.3.dev3.dist-info}/WHEEL +1 -1
- {powertrain_build-1.13.1.dist-info → powertrain_build-1.13.3.dev3.dist-info}/licenses/LICENSE +202 -202
- powertrain_build-1.13.3.dev3.dist-info/pbr.json +1 -0
- powertrain_build-1.13.1.dist-info/RECORD +0 -130
- powertrain_build-1.13.1.dist-info/pbr.json +0 -1
- {powertrain_build-1.13.1.dist-info → powertrain_build-1.13.3.dev3.dist-info}/entry_points.txt +0 -0
- {powertrain_build-1.13.1.dist-info → powertrain_build-1.13.3.dev3.dist-info}/licenses/AUTHORS +0 -0
- {powertrain_build-1.13.1.dist-info → powertrain_build-1.13.3.dev3.dist-info}/licenses/NOTICE +0 -0
- {powertrain_build-1.13.1.dist-info → powertrain_build-1.13.3.dev3.dist-info}/top_level.txt +0 -0
|
@@ -1,227 +1,227 @@
|
|
|
1
|
-
# Copyright 2024 Volvo Car Corporation
|
|
2
|
-
# Licensed under Apache 2.0.
|
|
3
|
-
|
|
4
|
-
"""Module to generate AllSystemInfo.mat for compatibility purposes with DocGen."""
|
|
5
|
-
|
|
6
|
-
import os
|
|
7
|
-
from copy import deepcopy
|
|
8
|
-
from numpy import array
|
|
9
|
-
from scipy.io import savemat
|
|
10
|
-
from powertrain_build.signal_interfaces import SignalInterfaces
|
|
11
|
-
from powertrain_build.unit_configs import UnitConfigs
|
|
12
|
-
from powertrain_build.lib.helper_functions import merge_dicts
|
|
13
|
-
from powertrain_build.problem_logger import ProblemLogger
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
def _get_signals_by_type(signal_conf, signal_type):
|
|
17
|
-
"""Get signals by type ('missing', 'unused', 'inconsistent_defs' or 'multiple_defs').
|
|
18
|
-
|
|
19
|
-
Args:
|
|
20
|
-
signal_conf (dict): Configuration from SignalInterfaces with the following format
|
|
21
|
-
{
|
|
22
|
-
"missing": {"signal_name" : ["VED4_GENIII", "VEP4_GENIII"]}
|
|
23
|
-
"unused": {}
|
|
24
|
-
"multiple_defs": {}
|
|
25
|
-
"inconsistent_defs": {}
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
Returns:
|
|
29
|
-
dict: with the following format
|
|
30
|
-
{
|
|
31
|
-
"signal_name" : {'VarStatus' : 'Not Used', 'SignalType' : "signal_type"}
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
"""
|
|
35
|
-
result = {}
|
|
36
|
-
for signal_name in signal_conf[signal_type].keys():
|
|
37
|
-
signal = {signal_name: {'VarStatus': 'Not Used', 'SignalType': signal_type}}
|
|
38
|
-
result.update(signal)
|
|
39
|
-
return result
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
class GenAllSystemInfo(ProblemLogger):
|
|
43
|
-
"""Class to generate AllSystemInfo.mat for compatibility purposes with DocGen."""
|
|
44
|
-
|
|
45
|
-
_signal_types = ['missing', 'unused']
|
|
46
|
-
|
|
47
|
-
def __init__(self, signal_if, unit_cfg):
|
|
48
|
-
"""Class to generate a matlab struct AllSystemInfo for compatibility with the old document generation.
|
|
49
|
-
|
|
50
|
-
Args:
|
|
51
|
-
signal_if: an initialized SignalInterfaces object to access signal configurations
|
|
52
|
-
"""
|
|
53
|
-
if not isinstance(signal_if, SignalInterfaces):
|
|
54
|
-
raise TypeError
|
|
55
|
-
if not isinstance(unit_cfg, UnitConfigs):
|
|
56
|
-
raise TypeError
|
|
57
|
-
self.signal_if = signal_if
|
|
58
|
-
self.unit_cfg = unit_cfg
|
|
59
|
-
self._signals_without_source = {}
|
|
60
|
-
self._core_ids = {}
|
|
61
|
-
self._file_info = {}
|
|
62
|
-
self._dids = {}
|
|
63
|
-
|
|
64
|
-
def __repr__(self):
|
|
65
|
-
"""Get string representation of object."""
|
|
66
|
-
return f'if: {self.signal_if}\n uc: {self.unit_cfg}'
|
|
67
|
-
|
|
68
|
-
def build(self):
|
|
69
|
-
"""Build AllSystemInfo.mat for docgen compatibility."""
|
|
70
|
-
self.info('******************************************************')
|
|
71
|
-
self.info('%s - Getting signals without source', __name__)
|
|
72
|
-
signals_tmp = self.get_signals_without_source()
|
|
73
|
-
for signal_name, signal_data in signals_tmp.items():
|
|
74
|
-
if '.' in signal_name:
|
|
75
|
-
struct_name = signal_name.split('.')[0]
|
|
76
|
-
if struct_name not in self._signals_without_source:
|
|
77
|
-
self.info(
|
|
78
|
-
f'{__name__} - Found struct signal: {signal_name}, adding struct name only ({struct_name}). '
|
|
79
|
-
'Remaining members will be ignored.'
|
|
80
|
-
)
|
|
81
|
-
self._signals_without_source[struct_name] = signal_data
|
|
82
|
-
else:
|
|
83
|
-
self._signals_without_source[signal_name] = signal_data
|
|
84
|
-
|
|
85
|
-
self.info('%s - Getting CoreIDs', __name__)
|
|
86
|
-
self._core_ids = self.get_core_ids()
|
|
87
|
-
|
|
88
|
-
self.info('%s - Generating FileInfo', __name__)
|
|
89
|
-
self._file_info = self._gen_dummy_file_info()
|
|
90
|
-
|
|
91
|
-
self.info('%s - Getting DIDs', __name__)
|
|
92
|
-
self._dids = self.get_dids()
|
|
93
|
-
|
|
94
|
-
output_path = os.path.abspath(os.path.join('Models', 'CodeGenTmp'))
|
|
95
|
-
self.info('%s - Creating CodeGenTmp directory', __name__)
|
|
96
|
-
self.create_codegen_tmp_dir(output_path)
|
|
97
|
-
|
|
98
|
-
self.info('%s - Building AllSystemInfo', __name__)
|
|
99
|
-
self._build_all_system_info(output_path)
|
|
100
|
-
|
|
101
|
-
def create_codegen_tmp_dir(self, path):
|
|
102
|
-
"""Create CodeGenTmp directory if it does not exist.
|
|
103
|
-
|
|
104
|
-
Args:
|
|
105
|
-
path (str): directory to create.
|
|
106
|
-
"""
|
|
107
|
-
if not os.path.isdir(path):
|
|
108
|
-
os.mkdir(path)
|
|
109
|
-
else:
|
|
110
|
-
self.info('%s - Directory already exist at %s', __name__, path)
|
|
111
|
-
|
|
112
|
-
def _build_all_system_info(self, path):
|
|
113
|
-
"""Build AllSystemInfo.mat for DocGen compatibility.
|
|
114
|
-
|
|
115
|
-
Args:
|
|
116
|
-
path (str): directory path to place the output file.
|
|
117
|
-
"""
|
|
118
|
-
absolute_path = os.path.abspath(os.path.join(path, 'AllSystemInfo.mat'))
|
|
119
|
-
all_system_info = {
|
|
120
|
-
'SystemData': self._signals_without_source,
|
|
121
|
-
'CoreIDs': self._core_ids,
|
|
122
|
-
'FileInfo': self._file_info,
|
|
123
|
-
'DIDs': self._dids
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
all_system_info_scipy = {'AllSystemInfo': all_system_info}
|
|
127
|
-
savemat(absolute_path, all_system_info_scipy, long_field_names=True, do_compression=True)
|
|
128
|
-
self.info('%s - AllSystemInfo placed at %s', __name__, absolute_path)
|
|
129
|
-
|
|
130
|
-
def get_core_ids(self):
|
|
131
|
-
"""Get core IDs for specified project.
|
|
132
|
-
|
|
133
|
-
Returns:
|
|
134
|
-
dict: DID as a dict with the following format
|
|
135
|
-
{
|
|
136
|
-
"unit name" : {}
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
"""
|
|
140
|
-
result = {}
|
|
141
|
-
unit_configs = self.unit_cfg.get_per_unit_cfg()
|
|
142
|
-
for unit, configs in unit_configs.items():
|
|
143
|
-
result[unit] = deepcopy(configs['core'])
|
|
144
|
-
for unit, configs in result.items():
|
|
145
|
-
for core_id, core_id_dict in configs.items():
|
|
146
|
-
for identifier, data_dict in core_id_dict.items():
|
|
147
|
-
for tl_field, tl_data in data_dict.items():
|
|
148
|
-
# Turn lists into numpy.array, required to get matlab cell arrays instead of char arrays.
|
|
149
|
-
# char arrays make DocGen crash.
|
|
150
|
-
if isinstance(tl_data, list):
|
|
151
|
-
configs[core_id][identifier][tl_field] = array(tl_data, dtype=object)
|
|
152
|
-
else:
|
|
153
|
-
configs[core_id][identifier][tl_field] = tl_data
|
|
154
|
-
return result
|
|
155
|
-
|
|
156
|
-
def get_dids(self):
|
|
157
|
-
"""Get DIDs for specified project.
|
|
158
|
-
|
|
159
|
-
Returns:
|
|
160
|
-
dict: DID as a dict with the following format
|
|
161
|
-
{
|
|
162
|
-
"unit name" : {}
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
"""
|
|
166
|
-
result = {}
|
|
167
|
-
unit_configs = self.unit_cfg.get_per_unit_cfg()
|
|
168
|
-
for unit, configs in unit_configs.items():
|
|
169
|
-
dids_list = []
|
|
170
|
-
for signal_values in configs['dids'].values():
|
|
171
|
-
signal_values_allsysteminfo_keys = {
|
|
172
|
-
'sig_name': signal_values['name'],
|
|
173
|
-
'sig_desc': signal_values['description'],
|
|
174
|
-
'blk_name': signal_values['handle'],
|
|
175
|
-
'data_type': signal_values['type'],
|
|
176
|
-
'unit': signal_values['unit'],
|
|
177
|
-
'lsb': signal_values['lsb'],
|
|
178
|
-
'offset': signal_values['offset']
|
|
179
|
-
}
|
|
180
|
-
dids_list.append(signal_values_allsysteminfo_keys)
|
|
181
|
-
result.update({unit: dids_list})
|
|
182
|
-
|
|
183
|
-
return result
|
|
184
|
-
|
|
185
|
-
def _gen_dummy_file_info(self):
|
|
186
|
-
"""Generate dummy FileInfo struct for compatibility purposes."""
|
|
187
|
-
result = {}
|
|
188
|
-
for key in self._core_ids:
|
|
189
|
-
result.update({key: ''})
|
|
190
|
-
return result
|
|
191
|
-
|
|
192
|
-
def get_signals_without_source(self):
|
|
193
|
-
"""Get missing and unused signals from project configuration.
|
|
194
|
-
|
|
195
|
-
Returns:
|
|
196
|
-
dict: result with the following format
|
|
197
|
-
{
|
|
198
|
-
"signal_name" : "signal_type"
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
"""
|
|
202
|
-
prj_conf = self.signal_if.check_config()
|
|
203
|
-
result = self._get_external_signals(prj_conf)
|
|
204
|
-
temp_signals = self._get_internal_signals(prj_conf)
|
|
205
|
-
result = merge_dicts(result, temp_signals, merge_recursively=True)
|
|
206
|
-
return result
|
|
207
|
-
|
|
208
|
-
def _get_external_signals(self, prj_conf):
|
|
209
|
-
signals_conf = prj_conf['sigs']['ext']
|
|
210
|
-
return self._get_signals_by_types(signals_conf)
|
|
211
|
-
|
|
212
|
-
def _get_internal_signals(self, prj_conf):
|
|
213
|
-
result = {}
|
|
214
|
-
signals_conf = prj_conf['sigs']['int']
|
|
215
|
-
for sig_conf in signals_conf.values():
|
|
216
|
-
temp_signals = self._get_signals_by_types(sig_conf)
|
|
217
|
-
result = merge_dicts(result, temp_signals, merge_recursively=True)
|
|
218
|
-
return result
|
|
219
|
-
|
|
220
|
-
def _get_signals_by_types(self, signal_conf):
|
|
221
|
-
"""Get signals by multiple types and merge them into one dictionary, see _get_signals_by_type() for docs."""
|
|
222
|
-
result = {}
|
|
223
|
-
for signal_type in self._signal_types:
|
|
224
|
-
temp_signals = _get_signals_by_type(signal_conf, signal_type)
|
|
225
|
-
if temp_signals:
|
|
226
|
-
result = merge_dicts(result, temp_signals, merge_recursively=True)
|
|
227
|
-
return result
|
|
1
|
+
# Copyright 2024 Volvo Car Corporation
|
|
2
|
+
# Licensed under Apache 2.0.
|
|
3
|
+
|
|
4
|
+
"""Module to generate AllSystemInfo.mat for compatibility purposes with DocGen."""
|
|
5
|
+
|
|
6
|
+
import os
|
|
7
|
+
from copy import deepcopy
|
|
8
|
+
from numpy import array
|
|
9
|
+
from scipy.io import savemat
|
|
10
|
+
from powertrain_build.signal_interfaces import SignalInterfaces
|
|
11
|
+
from powertrain_build.unit_configs import UnitConfigs
|
|
12
|
+
from powertrain_build.lib.helper_functions import merge_dicts
|
|
13
|
+
from powertrain_build.problem_logger import ProblemLogger
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def _get_signals_by_type(signal_conf, signal_type):
|
|
17
|
+
"""Get signals by type ('missing', 'unused', 'inconsistent_defs' or 'multiple_defs').
|
|
18
|
+
|
|
19
|
+
Args:
|
|
20
|
+
signal_conf (dict): Configuration from SignalInterfaces with the following format
|
|
21
|
+
{
|
|
22
|
+
"missing": {"signal_name" : ["VED4_GENIII", "VEP4_GENIII"]}
|
|
23
|
+
"unused": {}
|
|
24
|
+
"multiple_defs": {}
|
|
25
|
+
"inconsistent_defs": {}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
Returns:
|
|
29
|
+
dict: with the following format
|
|
30
|
+
{
|
|
31
|
+
"signal_name" : {'VarStatus' : 'Not Used', 'SignalType' : "signal_type"}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
"""
|
|
35
|
+
result = {}
|
|
36
|
+
for signal_name in signal_conf[signal_type].keys():
|
|
37
|
+
signal = {signal_name: {'VarStatus': 'Not Used', 'SignalType': signal_type}}
|
|
38
|
+
result.update(signal)
|
|
39
|
+
return result
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
class GenAllSystemInfo(ProblemLogger):
|
|
43
|
+
"""Class to generate AllSystemInfo.mat for compatibility purposes with DocGen."""
|
|
44
|
+
|
|
45
|
+
_signal_types = ['missing', 'unused']
|
|
46
|
+
|
|
47
|
+
def __init__(self, signal_if, unit_cfg):
|
|
48
|
+
"""Class to generate a matlab struct AllSystemInfo for compatibility with the old document generation.
|
|
49
|
+
|
|
50
|
+
Args:
|
|
51
|
+
signal_if: an initialized SignalInterfaces object to access signal configurations
|
|
52
|
+
"""
|
|
53
|
+
if not isinstance(signal_if, SignalInterfaces):
|
|
54
|
+
raise TypeError
|
|
55
|
+
if not isinstance(unit_cfg, UnitConfigs):
|
|
56
|
+
raise TypeError
|
|
57
|
+
self.signal_if = signal_if
|
|
58
|
+
self.unit_cfg = unit_cfg
|
|
59
|
+
self._signals_without_source = {}
|
|
60
|
+
self._core_ids = {}
|
|
61
|
+
self._file_info = {}
|
|
62
|
+
self._dids = {}
|
|
63
|
+
|
|
64
|
+
def __repr__(self):
|
|
65
|
+
"""Get string representation of object."""
|
|
66
|
+
return f'if: {self.signal_if}\n uc: {self.unit_cfg}'
|
|
67
|
+
|
|
68
|
+
def build(self):
|
|
69
|
+
"""Build AllSystemInfo.mat for docgen compatibility."""
|
|
70
|
+
self.info('******************************************************')
|
|
71
|
+
self.info('%s - Getting signals without source', __name__)
|
|
72
|
+
signals_tmp = self.get_signals_without_source()
|
|
73
|
+
for signal_name, signal_data in signals_tmp.items():
|
|
74
|
+
if '.' in signal_name:
|
|
75
|
+
struct_name = signal_name.split('.')[0]
|
|
76
|
+
if struct_name not in self._signals_without_source:
|
|
77
|
+
self.info(
|
|
78
|
+
f'{__name__} - Found struct signal: {signal_name}, adding struct name only ({struct_name}). '
|
|
79
|
+
'Remaining members will be ignored.'
|
|
80
|
+
)
|
|
81
|
+
self._signals_without_source[struct_name] = signal_data
|
|
82
|
+
else:
|
|
83
|
+
self._signals_without_source[signal_name] = signal_data
|
|
84
|
+
|
|
85
|
+
self.info('%s - Getting CoreIDs', __name__)
|
|
86
|
+
self._core_ids = self.get_core_ids()
|
|
87
|
+
|
|
88
|
+
self.info('%s - Generating FileInfo', __name__)
|
|
89
|
+
self._file_info = self._gen_dummy_file_info()
|
|
90
|
+
|
|
91
|
+
self.info('%s - Getting DIDs', __name__)
|
|
92
|
+
self._dids = self.get_dids()
|
|
93
|
+
|
|
94
|
+
output_path = os.path.abspath(os.path.join('Models', 'CodeGenTmp'))
|
|
95
|
+
self.info('%s - Creating CodeGenTmp directory', __name__)
|
|
96
|
+
self.create_codegen_tmp_dir(output_path)
|
|
97
|
+
|
|
98
|
+
self.info('%s - Building AllSystemInfo', __name__)
|
|
99
|
+
self._build_all_system_info(output_path)
|
|
100
|
+
|
|
101
|
+
def create_codegen_tmp_dir(self, path):
|
|
102
|
+
"""Create CodeGenTmp directory if it does not exist.
|
|
103
|
+
|
|
104
|
+
Args:
|
|
105
|
+
path (str): directory to create.
|
|
106
|
+
"""
|
|
107
|
+
if not os.path.isdir(path):
|
|
108
|
+
os.mkdir(path)
|
|
109
|
+
else:
|
|
110
|
+
self.info('%s - Directory already exist at %s', __name__, path)
|
|
111
|
+
|
|
112
|
+
def _build_all_system_info(self, path):
|
|
113
|
+
"""Build AllSystemInfo.mat for DocGen compatibility.
|
|
114
|
+
|
|
115
|
+
Args:
|
|
116
|
+
path (str): directory path to place the output file.
|
|
117
|
+
"""
|
|
118
|
+
absolute_path = os.path.abspath(os.path.join(path, 'AllSystemInfo.mat'))
|
|
119
|
+
all_system_info = {
|
|
120
|
+
'SystemData': self._signals_without_source,
|
|
121
|
+
'CoreIDs': self._core_ids,
|
|
122
|
+
'FileInfo': self._file_info,
|
|
123
|
+
'DIDs': self._dids
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
all_system_info_scipy = {'AllSystemInfo': all_system_info}
|
|
127
|
+
savemat(absolute_path, all_system_info_scipy, long_field_names=True, do_compression=True)
|
|
128
|
+
self.info('%s - AllSystemInfo placed at %s', __name__, absolute_path)
|
|
129
|
+
|
|
130
|
+
def get_core_ids(self):
|
|
131
|
+
"""Get core IDs for specified project.
|
|
132
|
+
|
|
133
|
+
Returns:
|
|
134
|
+
dict: DID as a dict with the following format
|
|
135
|
+
{
|
|
136
|
+
"unit name" : {}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
"""
|
|
140
|
+
result = {}
|
|
141
|
+
unit_configs = self.unit_cfg.get_per_unit_cfg()
|
|
142
|
+
for unit, configs in unit_configs.items():
|
|
143
|
+
result[unit] = deepcopy(configs['core'])
|
|
144
|
+
for unit, configs in result.items():
|
|
145
|
+
for core_id, core_id_dict in configs.items():
|
|
146
|
+
for identifier, data_dict in core_id_dict.items():
|
|
147
|
+
for tl_field, tl_data in data_dict.items():
|
|
148
|
+
# Turn lists into numpy.array, required to get matlab cell arrays instead of char arrays.
|
|
149
|
+
# char arrays make DocGen crash.
|
|
150
|
+
if isinstance(tl_data, list):
|
|
151
|
+
configs[core_id][identifier][tl_field] = array(tl_data, dtype=object)
|
|
152
|
+
else:
|
|
153
|
+
configs[core_id][identifier][tl_field] = tl_data
|
|
154
|
+
return result
|
|
155
|
+
|
|
156
|
+
def get_dids(self):
|
|
157
|
+
"""Get DIDs for specified project.
|
|
158
|
+
|
|
159
|
+
Returns:
|
|
160
|
+
dict: DID as a dict with the following format
|
|
161
|
+
{
|
|
162
|
+
"unit name" : {}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
"""
|
|
166
|
+
result = {}
|
|
167
|
+
unit_configs = self.unit_cfg.get_per_unit_cfg()
|
|
168
|
+
for unit, configs in unit_configs.items():
|
|
169
|
+
dids_list = []
|
|
170
|
+
for signal_values in configs['dids'].values():
|
|
171
|
+
signal_values_allsysteminfo_keys = {
|
|
172
|
+
'sig_name': signal_values['name'],
|
|
173
|
+
'sig_desc': signal_values['description'],
|
|
174
|
+
'blk_name': signal_values['handle'],
|
|
175
|
+
'data_type': signal_values['type'],
|
|
176
|
+
'unit': signal_values['unit'],
|
|
177
|
+
'lsb': signal_values['lsb'],
|
|
178
|
+
'offset': signal_values['offset']
|
|
179
|
+
}
|
|
180
|
+
dids_list.append(signal_values_allsysteminfo_keys)
|
|
181
|
+
result.update({unit: dids_list})
|
|
182
|
+
|
|
183
|
+
return result
|
|
184
|
+
|
|
185
|
+
def _gen_dummy_file_info(self):
|
|
186
|
+
"""Generate dummy FileInfo struct for compatibility purposes."""
|
|
187
|
+
result = {}
|
|
188
|
+
for key in self._core_ids:
|
|
189
|
+
result.update({key: ''})
|
|
190
|
+
return result
|
|
191
|
+
|
|
192
|
+
def get_signals_without_source(self):
|
|
193
|
+
"""Get missing and unused signals from project configuration.
|
|
194
|
+
|
|
195
|
+
Returns:
|
|
196
|
+
dict: result with the following format
|
|
197
|
+
{
|
|
198
|
+
"signal_name" : "signal_type"
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
"""
|
|
202
|
+
prj_conf = self.signal_if.check_config()
|
|
203
|
+
result = self._get_external_signals(prj_conf)
|
|
204
|
+
temp_signals = self._get_internal_signals(prj_conf)
|
|
205
|
+
result = merge_dicts(result, temp_signals, merge_recursively=True)
|
|
206
|
+
return result
|
|
207
|
+
|
|
208
|
+
def _get_external_signals(self, prj_conf):
|
|
209
|
+
signals_conf = prj_conf['sigs']['ext']
|
|
210
|
+
return self._get_signals_by_types(signals_conf)
|
|
211
|
+
|
|
212
|
+
def _get_internal_signals(self, prj_conf):
|
|
213
|
+
result = {}
|
|
214
|
+
signals_conf = prj_conf['sigs']['int']
|
|
215
|
+
for sig_conf in signals_conf.values():
|
|
216
|
+
temp_signals = self._get_signals_by_types(sig_conf)
|
|
217
|
+
result = merge_dicts(result, temp_signals, merge_recursively=True)
|
|
218
|
+
return result
|
|
219
|
+
|
|
220
|
+
def _get_signals_by_types(self, signal_conf):
|
|
221
|
+
"""Get signals by multiple types and merge them into one dictionary, see _get_signals_by_type() for docs."""
|
|
222
|
+
result = {}
|
|
223
|
+
for signal_type in self._signal_types:
|
|
224
|
+
temp_signals = _get_signals_by_type(signal_conf, signal_type)
|
|
225
|
+
if temp_signals:
|
|
226
|
+
result = merge_dicts(result, temp_signals, merge_recursively=True)
|
|
227
|
+
return result
|