olindgre 2ece01e1d7 Make powertrain-build not overlap with pybuild in site-packages
Change-Id: I7b59f3f04f0f787d35db0b9389f295bf1ad24f56
2024-09-17 10:25:04 +02:00

125 lines
4.3 KiB
Python

# Copyright 2024 Volvo Car Corporation
# Licensed under Apache 2.0.
"""Script to replace pragmas in hand written c-code."""
import re
import os
import sys
import shutil
REPO_ROOT = os.path.join(os.path.dirname(__file__), '..', '..')
class CodeReplacer:
"""Class to replace code in hand written c-code."""
def replace_line(self, line):
"""Replace line."""
raise NotImplementedError
def replace_file(self, file_name):
"""Go through all lines in the file and replace pragmas."""
tmp_file = file_name + '.tmp'
with open(file_name, 'r', encoding='ascii', errors='ignore') as old_file:
with open(tmp_file, 'w', encoding='ascii', errors='ignore') as new_file:
for line in old_file.readlines():
line = self.replace_line(line)
new_file.write(line)
shutil.move(tmp_file, file_name)
class PragmaReplacer(CodeReplacer):
"""Class to replace pragmas in hand written c-code."""
def __init__(self):
"""Init."""
self.cvc_started = False
self.cvc = None
self.regex = re.compile(r'^\s*#pragma section\s*(CVC(?P<cvc>[a-zA-Z0-9_]*))*\s*$')
self.template = '#include "CVC_{cvc}_{start_or_end}.h"\n'
def replace_line(self, line):
"""Replace line (if it has a pragma)."""
match = self.regex.match(line)
if match:
if self.cvc_started:
line = self.template.format(cvc=self.cvc,
start_or_end='END')
self.cvc = None
else:
self.cvc = match.group('cvc') or 'CODE'
line = self.template.format(cvc=self.cvc,
start_or_end='START')
self.cvc_started = not self.cvc_started
return line
class CodeSwitchReplacer(CodeReplacer):
"""Class to replace code switch includes in hand written c-code."""
def __init__(self):
"""Init."""
self.regex = re.compile(r'(.*)SPM_Codeswitch_Setup(_PVC)?(.*)')
self.template = '{}VcCodeSwDefines{}\n'
def replace_line(self, line):
"""Replace include code switch file."""
match = self.regex.match(line)
if match:
return self.template.format(match.group(1), match.group(3))
return line
def update_files(files):
"""Replace code in handwritten file."""
for file_path in files:
PragmaReplacer().replace_file(file_path)
CodeSwitchReplacer().replace_file(file_path)
def update_test_files(files):
"""Replace code in handwritten file."""
for file_path in files:
CodeSwitchReplacer().replace_file(file_path)
def get_files_to_update(source_dir_name):
"""Get files to update."""
files = [os.path.join('./Models/SSPCECD/VcTqReq__DIESEL', source_dir_name, 'invTab2_UInt16_func.c'),
os.path.join('./Models/SSPCECD/VcCmbNOx__DIESEL', source_dir_name, 'NNEval15x8_func.c'),
os.path.join('./Models/SSPCECD/VcTqEff__DIESEL', source_dir_name, 'NNEval15x8_func.c')]
for path, _, filenames in os.walk(os.path.join(REPO_ROOT, 'Models', 'SSPDL')):
if path.endswith(os.path.join('Mdl', source_dir_name)) or\
path.endswith(os.path.join('Mdl__denso', source_dir_name)):
for filename in filenames:
if (filename.endswith('.c') and not filename.endswith('Mdl.c')) or \
(filename.endswith('.h') and not filename.endswith('Mdl.h')):
file_path = os.path.relpath(os.path.join(path, filename))
files.append(file_path)
return files
def get_test_files_to_update():
"""Get files to update."""
files = []
for path, _, filenames in os.walk(os.path.join(REPO_ROOT, 'Models')):
for filename in filenames:
if filename.endswith('.py'):
file_path = os.path.relpath(os.path.join(path, filename))
files.append(file_path)
return files
def main():
"""Replace incorrect pragmas in handwritten c-code."""
files_to_update = get_files_to_update('pybuild_src')
update_files(files_to_update)
test_files_to_update = get_test_files_to_update()
update_test_files(test_files_to_update)
return 0
if __name__ == '__main__':
sys.exit(main())