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,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:])
|