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.
Files changed (132) hide show
  1. powertrain_build/__init__.py +40 -40
  2. powertrain_build/__main__.py +6 -6
  3. powertrain_build/a2l.py +582 -582
  4. powertrain_build/a2l_merge.py +650 -650
  5. powertrain_build/a2l_templates.py +717 -717
  6. powertrain_build/build.py +985 -985
  7. powertrain_build/build_defs.py +309 -309
  8. powertrain_build/build_proj_config.py +690 -690
  9. powertrain_build/check_interface.py +575 -575
  10. powertrain_build/cli.py +141 -141
  11. powertrain_build/config.py +542 -542
  12. powertrain_build/core.py +395 -395
  13. powertrain_build/core_dummy.py +343 -343
  14. powertrain_build/create_conversion_table.py +73 -73
  15. powertrain_build/dids.py +916 -916
  16. powertrain_build/dummy.py +157 -157
  17. powertrain_build/dummy_spm.py +252 -252
  18. powertrain_build/environmentcheck.py +52 -52
  19. powertrain_build/ext_dbg.py +255 -255
  20. powertrain_build/ext_var.py +327 -327
  21. powertrain_build/feature_configs.py +301 -301
  22. powertrain_build/gen_allsysteminfo.py +227 -227
  23. powertrain_build/gen_label_split.py +449 -449
  24. powertrain_build/handcode_replacer.py +124 -124
  25. powertrain_build/html_report.py +133 -133
  26. powertrain_build/interface/__init__.py +4 -4
  27. powertrain_build/interface/application.py +511 -511
  28. powertrain_build/interface/base.py +500 -500
  29. powertrain_build/interface/csp_api.py +490 -490
  30. powertrain_build/interface/device_proxy.py +677 -677
  31. powertrain_build/interface/ems.py +67 -67
  32. powertrain_build/interface/export_global_vars.py +121 -121
  33. powertrain_build/interface/generate_adapters.py +132 -132
  34. powertrain_build/interface/generate_hi_interface.py +87 -87
  35. powertrain_build/interface/generate_service.py +69 -69
  36. powertrain_build/interface/generate_wrappers.py +147 -147
  37. powertrain_build/interface/generation_utils.py +142 -142
  38. powertrain_build/interface/hal.py +194 -194
  39. powertrain_build/interface/model_yaml_verification.py +348 -348
  40. powertrain_build/interface/service.py +296 -296
  41. powertrain_build/interface/simulink.py +249 -249
  42. powertrain_build/interface/update_call_sources.py +180 -180
  43. powertrain_build/interface/update_model_yaml.py +186 -186
  44. powertrain_build/interface/zone_controller.py +362 -362
  45. powertrain_build/lib/__init__.py +4 -4
  46. powertrain_build/lib/helper_functions.py +127 -127
  47. powertrain_build/lib/logger.py +55 -55
  48. powertrain_build/matlab_scripts/CodeGen/BuildAutomationPyBuild.m +78 -78
  49. powertrain_build/matlab_scripts/CodeGen/Generate_A2L.m +154 -154
  50. powertrain_build/matlab_scripts/CodeGen/generateTLUnit.m +239 -239
  51. powertrain_build/matlab_scripts/CodeGen/getAsilClassification.m +28 -28
  52. powertrain_build/matlab_scripts/CodeGen/modelConfiguredForTL.m +28 -28
  53. powertrain_build/matlab_scripts/CodeGen/moveDefOutports.m +88 -88
  54. powertrain_build/matlab_scripts/CodeGen/parseCalMeasData.m +410 -410
  55. powertrain_build/matlab_scripts/CodeGen/parseCoreIdentifiers.m +139 -139
  56. powertrain_build/matlab_scripts/CodeGen/parseDIDs.m +141 -141
  57. powertrain_build/matlab_scripts/CodeGen/parseInPorts.m +106 -106
  58. powertrain_build/matlab_scripts/CodeGen/parseIncludeConfigs.m +25 -25
  59. powertrain_build/matlab_scripts/CodeGen/parseModelInfo.m +38 -38
  60. powertrain_build/matlab_scripts/CodeGen/parseNVM.m +81 -81
  61. powertrain_build/matlab_scripts/CodeGen/parseOutPorts.m +120 -120
  62. powertrain_build/matlab_scripts/CodeGen/parsePreProcBlks.m +23 -23
  63. powertrain_build/matlab_scripts/CodeGen/struct2JSON.m +128 -128
  64. powertrain_build/matlab_scripts/CodeGen/updateCodeSwConfig.m +31 -31
  65. powertrain_build/matlab_scripts/Init_PyBuild.m +91 -91
  66. powertrain_build/matlab_scripts/__init__.py +2 -2
  67. powertrain_build/matlab_scripts/helperFunctions/Get_Full_Name.m +46 -46
  68. powertrain_build/matlab_scripts/helperFunctions/Get_SrcLines.m +12 -12
  69. powertrain_build/matlab_scripts/helperFunctions/Init_Models.m +78 -78
  70. powertrain_build/matlab_scripts/helperFunctions/Init_Projects.m +67 -67
  71. powertrain_build/matlab_scripts/helperFunctions/Read_Units.m +34 -34
  72. powertrain_build/matlab_scripts/helperFunctions/SetProjectTimeSamples.m +26 -26
  73. powertrain_build/matlab_scripts/helperFunctions/Strip_Suffix.m +16 -16
  74. powertrain_build/matlab_scripts/helperFunctions/followLink.m +118 -118
  75. powertrain_build/matlab_scripts/helperFunctions/getCodeSwitches.m +50 -50
  76. powertrain_build/matlab_scripts/helperFunctions/getConsumerBlocks.m +30 -30
  77. powertrain_build/matlab_scripts/helperFunctions/getDefBlock.m +39 -39
  78. powertrain_build/matlab_scripts/helperFunctions/getDefOutport.m +58 -58
  79. powertrain_build/matlab_scripts/helperFunctions/getDstBlocks.m +19 -19
  80. powertrain_build/matlab_scripts/helperFunctions/getDstLines.m +13 -13
  81. powertrain_build/matlab_scripts/helperFunctions/getInterfaceSignals.m +37 -37
  82. powertrain_build/matlab_scripts/helperFunctions/getName.m +37 -37
  83. powertrain_build/matlab_scripts/helperFunctions/getPath.m +6 -6
  84. powertrain_build/matlab_scripts/helperFunctions/getProperValue.m +21 -21
  85. powertrain_build/matlab_scripts/helperFunctions/getSrcBlocks.m +19 -19
  86. powertrain_build/matlab_scripts/helperFunctions/getSrcLines.m +13 -13
  87. powertrain_build/matlab_scripts/helperFunctions/loadLibraries.m +10 -10
  88. powertrain_build/matlab_scripts/helperFunctions/loadjson.m +6 -6
  89. powertrain_build/matlab_scripts/helperFunctions/modifyEnumStructField.m +21 -21
  90. powertrain_build/matlab_scripts/helperFunctions/removeConfigDuplicates.m +31 -31
  91. powertrain_build/matlab_scripts/helperFunctions/sortSystemByClass.m +26 -26
  92. powertrain_build/matlab_scripts/helperFunctions/tl_getfast.m +89 -89
  93. powertrain_build/matlab_scripts/helperFunctions/topLevelSystem.m +20 -20
  94. powertrain_build/matlab_scripts/helperFunctions/updateModels.m +131 -131
  95. powertrain_build/memory_section.py +224 -224
  96. powertrain_build/nvm_def.py +729 -729
  97. powertrain_build/problem_logger.py +86 -86
  98. powertrain_build/pt_matlab.py +430 -430
  99. powertrain_build/pt_win32.py +144 -144
  100. powertrain_build/replace_compu_tab_ref.py +105 -105
  101. powertrain_build/rte_dummy.py +254 -254
  102. powertrain_build/sched_funcs.py +209 -207
  103. powertrain_build/signal.py +7 -7
  104. powertrain_build/signal_if_html_rep.py +221 -221
  105. powertrain_build/signal_if_html_rep_all.py +302 -302
  106. powertrain_build/signal_incons_html_rep.py +180 -180
  107. powertrain_build/signal_incons_html_rep_all.py +366 -366
  108. powertrain_build/signal_incons_html_rep_base.py +168 -168
  109. powertrain_build/signal_inconsistency_check.py +641 -641
  110. powertrain_build/signal_interfaces.py +864 -864
  111. powertrain_build/templates/Index_SigCheck_All.html +22 -22
  112. powertrain_build/templates/Index_SigIf_All.html +19 -19
  113. powertrain_build/types.py +218 -218
  114. powertrain_build/unit_configs.py +419 -419
  115. powertrain_build/user_defined_types.py +660 -660
  116. powertrain_build/versioncheck.py +66 -66
  117. powertrain_build/wrapper.py +512 -512
  118. powertrain_build/xlrd_csv.py +87 -87
  119. powertrain_build/zone_controller/__init__.py +4 -4
  120. powertrain_build/zone_controller/calibration.py +176 -176
  121. powertrain_build/zone_controller/composition_yaml.py +880 -878
  122. {powertrain_build-1.13.1.dist-info → powertrain_build-1.13.3.dev3.dist-info}/METADATA +100 -100
  123. powertrain_build-1.13.3.dev3.dist-info/RECORD +130 -0
  124. {powertrain_build-1.13.1.dist-info → powertrain_build-1.13.3.dev3.dist-info}/WHEEL +1 -1
  125. {powertrain_build-1.13.1.dist-info → powertrain_build-1.13.3.dev3.dist-info}/licenses/LICENSE +202 -202
  126. powertrain_build-1.13.3.dev3.dist-info/pbr.json +1 -0
  127. powertrain_build-1.13.1.dist-info/RECORD +0 -130
  128. powertrain_build-1.13.1.dist-info/pbr.json +0 -1
  129. {powertrain_build-1.13.1.dist-info → powertrain_build-1.13.3.dev3.dist-info}/entry_points.txt +0 -0
  130. {powertrain_build-1.13.1.dist-info → powertrain_build-1.13.3.dev3.dist-info}/licenses/AUTHORS +0 -0
  131. {powertrain_build-1.13.1.dist-info → powertrain_build-1.13.3.dev3.dist-info}/licenses/NOTICE +0 -0
  132. {powertrain_build-1.13.1.dist-info → powertrain_build-1.13.3.dev3.dist-info}/top_level.txt +0 -0
@@ -1,180 +1,180 @@
1
- # Copyright 2024 Volvo Car Corporation
2
- # Licensed under Apache 2.0.
3
-
4
- """Module that handles the update of call sources."""
5
-
6
-
7
- import argparse
8
- import re
9
- import sys
10
- from typing import List, Optional
11
- from ruamel.yaml import YAML
12
- from pathlib import Path
13
-
14
-
15
- PARSER_HELP = "Update call sources for method calls in source files."
16
-
17
-
18
- def configure_parser(parser: argparse.ArgumentParser):
19
- """Configure the parser for the update call sources command."""
20
- parser.add_argument("interface", help="Interface specification dict", type=Path)
21
- parser.add_argument("src_dir", help="Path to source file directory", type=Path)
22
- parser.add_argument(
23
- "-p",
24
- "--project-config",
25
- type=Path,
26
- default=None,
27
- help="Path to project config json file",
28
- )
29
- parser.set_defaults(func=update_call_sources_cli)
30
-
31
-
32
- def update_call_sources_cli(args: argparse.Namespace):
33
- """CLI function for updating call sources."""
34
- method_config = read_project_config(args.project_config)
35
- with open(args.interface, encoding="utf-8") as interface_file:
36
- yaml = YAML(typ='safe', pure=True)
37
- adapter_spec = yaml.load(interface_file)
38
- update_call_sources(args.src_dir, adapter_spec, method_config)
39
-
40
-
41
- def main(argv: Optional[List[str]] = None):
42
- """ Main function for stand alone execution."""
43
- parser = argparse.ArgumentParser(description=PARSER_HELP)
44
- configure_parser(parser)
45
- args = parser.parse_args(argv)
46
- args.func(args)
47
-
48
-
49
- def read_project_config(project_config_path):
50
- """ Reads project config file and extract method specific settings if they are present.
51
-
52
- Args:
53
- project_config_path (Path): path to the ProjectCfg.json file
54
- Returns:
55
- method_config (dict): dictionary of method related configs.
56
- """
57
- project_info = {}
58
- if project_config_path is not None:
59
- with project_config_path.open() as config_file:
60
- yaml = YAML(typ='safe', pure=True)
61
- config = yaml.load(config_file)
62
- project_info = config["ProjectInfo"]
63
- method_config = {
64
- "adapter_declarations_change": project_info.get("adapterDeclarations", None)
65
- }
66
- method_config["method_call_wrapper"] = {
67
- "pre": project_info.get("methodPreCallWrapper", ""),
68
- "post": project_info.get("methodPostCallWrapper", "")
69
- }
70
- for key, value in method_config["method_call_wrapper"].items():
71
- if value != "":
72
- method_config["method_call_wrapper"][key] = value + "\n"
73
-
74
- return method_config
75
-
76
-
77
- def is_method_adapter(adapter):
78
- """ Check if adapter has methods in it
79
-
80
- Args:
81
- adapter (dict): adapter specification
82
- Returns:
83
- methods_in_adapter (bool): true if adapter contains methods,
84
- false otherwise
85
- """
86
- methods_in_adapter = "methods" in adapter and len(adapter["methods"]) > 0
87
- return methods_in_adapter
88
-
89
-
90
- def update_call_sources(src_dir, adapter_spec, method_config):
91
- """ Update the source files for specified method calls with
92
- adapter function calls that trigger the methods.
93
-
94
- Args:
95
- src_dir (Path): path to folder for method call sources
96
- adapter_spec (list): adapter specifications with methods
97
- method_config (dict): project specific method configs
98
- """
99
-
100
- method_adapters = [a for a in adapter_spec if is_method_adapter(a)]
101
- for adapter in method_adapters:
102
- for method in adapter["methods"]:
103
- method_src = src_dir / (method["name"] + ".c")
104
- with method_src.open("r+") as src_file:
105
- old_src = src_file.read()
106
- new_src = generate_src_code(adapter, method, old_src, method_config)
107
- method_src.unlink()
108
- with open(method_src.with_suffix(".cpp"), "w", encoding="utf-8") as dst_file:
109
- dst_file.write(new_src)
110
- method_header = src_dir / (method["name"] + ".h")
111
- with method_header.open("r+") as header_file:
112
- old_header = header_file.read()
113
- new_header = generate_header_code(method_config, old_header)
114
- header_file.seek(0)
115
- header_file.write(new_header)
116
- header_file.truncate()
117
-
118
-
119
- def generate_header_code(method_config, old_header):
120
- """ Change header code to include project specific adapter wrapper.
121
-
122
- Args:
123
- method_config (dict): project specific method settings
124
- old_header (string): header source code
125
- Returns:
126
- new_header (string): modified header source code
127
-
128
- """
129
- adapter_pattern = r'(?<=#include ")adapter_wrapper.hh'
130
- if method_config["adapter_declarations_change"]:
131
- new_header = re.sub(
132
- adapter_pattern, method_config["adapter_declarations_change"], old_header
133
- )
134
- return new_header
135
- return old_header
136
-
137
-
138
- def generate_src_code(adapter, method, old_src, method_config):
139
- """ Generate the method call source code to trigger the method call
140
-
141
- Args:
142
- adapter (dict): adapter specification
143
- method (dict): method specification
144
- old_src (string): method call source code with mock call
145
- method_config (dict): project specific method settings
146
- Returns:
147
- new_src (string): method call source code with adapter function call
148
- that triggers method
149
-
150
- """
151
- call_pattern = (
152
- r" \/\* CSP method call\n"
153
- r"(.*)ADAPTER->METHOD(.*)"
154
- r" CSP method call end\*\/\n"
155
- )
156
- dummy_pattern = (
157
- r" \/\* C dummy call\*\/" r".*" r" \/\* C dummy call end\*\/\n"
158
- )
159
- comment = (
160
- r"\/\* Used for running spm without csp, such as silver\n"
161
- r" This code should be replaced when using csp. \*\/\n"
162
- )
163
- name = method["name"]
164
- adapter_name = [adapter["name"].title()]
165
- namespace = []
166
- if method["namespace"] != "":
167
- namespace = [method["namespace"]]
168
- adapter = "::".join(namespace + adapter_name) + "->" + name
169
- pre_call = method_config["method_call_wrapper"]["pre"]
170
- post_call = method_config["method_call_wrapper"]["post"]
171
- sans_comment = re.sub(comment, "", old_src)
172
- sans_dummy_call = re.sub(dummy_pattern, "", sans_comment, flags=re.DOTALL)
173
- new_src = re.sub(
174
- call_pattern, pre_call + r"\1" + adapter + r"\2" + post_call, sans_dummy_call, flags=re.DOTALL
175
- )
176
- return new_src
177
-
178
-
179
- if __name__ == "__main__":
180
- main(sys.argv[1:])
1
+ # Copyright 2024 Volvo Car Corporation
2
+ # Licensed under Apache 2.0.
3
+
4
+ """Module that handles the update of call sources."""
5
+
6
+
7
+ import argparse
8
+ import re
9
+ import sys
10
+ from typing import List, Optional
11
+ from ruamel.yaml import YAML
12
+ from pathlib import Path
13
+
14
+
15
+ PARSER_HELP = "Update call sources for method calls in source files."
16
+
17
+
18
+ def configure_parser(parser: argparse.ArgumentParser):
19
+ """Configure the parser for the update call sources command."""
20
+ parser.add_argument("interface", help="Interface specification dict", type=Path)
21
+ parser.add_argument("src_dir", help="Path to source file directory", type=Path)
22
+ parser.add_argument(
23
+ "-p",
24
+ "--project-config",
25
+ type=Path,
26
+ default=None,
27
+ help="Path to project config json file",
28
+ )
29
+ parser.set_defaults(func=update_call_sources_cli)
30
+
31
+
32
+ def update_call_sources_cli(args: argparse.Namespace):
33
+ """CLI function for updating call sources."""
34
+ method_config = read_project_config(args.project_config)
35
+ with open(args.interface, encoding="utf-8") as interface_file:
36
+ yaml = YAML(typ='safe', pure=True)
37
+ adapter_spec = yaml.load(interface_file)
38
+ update_call_sources(args.src_dir, adapter_spec, method_config)
39
+
40
+
41
+ def main(argv: Optional[List[str]] = None):
42
+ """ Main function for stand alone execution."""
43
+ parser = argparse.ArgumentParser(description=PARSER_HELP)
44
+ configure_parser(parser)
45
+ args = parser.parse_args(argv)
46
+ args.func(args)
47
+
48
+
49
+ def read_project_config(project_config_path):
50
+ """ Reads project config file and extract method specific settings if they are present.
51
+
52
+ Args:
53
+ project_config_path (Path): path to the ProjectCfg.json file
54
+ Returns:
55
+ method_config (dict): dictionary of method related configs.
56
+ """
57
+ project_info = {}
58
+ if project_config_path is not None:
59
+ with project_config_path.open() as config_file:
60
+ yaml = YAML(typ='safe', pure=True)
61
+ config = yaml.load(config_file)
62
+ project_info = config["ProjectInfo"]
63
+ method_config = {
64
+ "adapter_declarations_change": project_info.get("adapterDeclarations", None)
65
+ }
66
+ method_config["method_call_wrapper"] = {
67
+ "pre": project_info.get("methodPreCallWrapper", ""),
68
+ "post": project_info.get("methodPostCallWrapper", "")
69
+ }
70
+ for key, value in method_config["method_call_wrapper"].items():
71
+ if value != "":
72
+ method_config["method_call_wrapper"][key] = value + "\n"
73
+
74
+ return method_config
75
+
76
+
77
+ def is_method_adapter(adapter):
78
+ """ Check if adapter has methods in it
79
+
80
+ Args:
81
+ adapter (dict): adapter specification
82
+ Returns:
83
+ methods_in_adapter (bool): true if adapter contains methods,
84
+ false otherwise
85
+ """
86
+ methods_in_adapter = "methods" in adapter and len(adapter["methods"]) > 0
87
+ return methods_in_adapter
88
+
89
+
90
+ def update_call_sources(src_dir, adapter_spec, method_config):
91
+ """ Update the source files for specified method calls with
92
+ adapter function calls that trigger the methods.
93
+
94
+ Args:
95
+ src_dir (Path): path to folder for method call sources
96
+ adapter_spec (list): adapter specifications with methods
97
+ method_config (dict): project specific method configs
98
+ """
99
+
100
+ method_adapters = [a for a in adapter_spec if is_method_adapter(a)]
101
+ for adapter in method_adapters:
102
+ for method in adapter["methods"]:
103
+ method_src = src_dir / (method["name"] + ".c")
104
+ with method_src.open("r+") as src_file:
105
+ old_src = src_file.read()
106
+ new_src = generate_src_code(adapter, method, old_src, method_config)
107
+ method_src.unlink()
108
+ with open(method_src.with_suffix(".cpp"), "w", encoding="utf-8") as dst_file:
109
+ dst_file.write(new_src)
110
+ method_header = src_dir / (method["name"] + ".h")
111
+ with method_header.open("r+") as header_file:
112
+ old_header = header_file.read()
113
+ new_header = generate_header_code(method_config, old_header)
114
+ header_file.seek(0)
115
+ header_file.write(new_header)
116
+ header_file.truncate()
117
+
118
+
119
+ def generate_header_code(method_config, old_header):
120
+ """ Change header code to include project specific adapter wrapper.
121
+
122
+ Args:
123
+ method_config (dict): project specific method settings
124
+ old_header (string): header source code
125
+ Returns:
126
+ new_header (string): modified header source code
127
+
128
+ """
129
+ adapter_pattern = r'(?<=#include ")adapter_wrapper.hh'
130
+ if method_config["adapter_declarations_change"]:
131
+ new_header = re.sub(
132
+ adapter_pattern, method_config["adapter_declarations_change"], old_header
133
+ )
134
+ return new_header
135
+ return old_header
136
+
137
+
138
+ def generate_src_code(adapter, method, old_src, method_config):
139
+ """ Generate the method call source code to trigger the method call
140
+
141
+ Args:
142
+ adapter (dict): adapter specification
143
+ method (dict): method specification
144
+ old_src (string): method call source code with mock call
145
+ method_config (dict): project specific method settings
146
+ Returns:
147
+ new_src (string): method call source code with adapter function call
148
+ that triggers method
149
+
150
+ """
151
+ call_pattern = (
152
+ r" \/\* CSP method call\n"
153
+ r"(.*)ADAPTER->METHOD(.*)"
154
+ r" CSP method call end\*\/\n"
155
+ )
156
+ dummy_pattern = (
157
+ r" \/\* C dummy call\*\/" r".*" r" \/\* C dummy call end\*\/\n"
158
+ )
159
+ comment = (
160
+ r"\/\* Used for running spm without csp, such as silver\n"
161
+ r" This code should be replaced when using csp. \*\/\n"
162
+ )
163
+ name = method["name"]
164
+ adapter_name = [adapter["name"].title()]
165
+ namespace = []
166
+ if method["namespace"] != "":
167
+ namespace = [method["namespace"]]
168
+ adapter = "::".join(namespace + adapter_name) + "->" + name
169
+ pre_call = method_config["method_call_wrapper"]["pre"]
170
+ post_call = method_config["method_call_wrapper"]["post"]
171
+ sans_comment = re.sub(comment, "", old_src)
172
+ sans_dummy_call = re.sub(dummy_pattern, "", sans_comment, flags=re.DOTALL)
173
+ new_src = re.sub(
174
+ call_pattern, pre_call + r"\1" + adapter + r"\2" + post_call, sans_dummy_call, flags=re.DOTALL
175
+ )
176
+ return new_src
177
+
178
+
179
+ if __name__ == "__main__":
180
+ main(sys.argv[1:])