Make powertrain-build not overlap with pybuild in site-packages

Change-Id: I7b59f3f04f0f787d35db0b9389f295bf1ad24f56
This commit is contained in:
olindgre 2024-08-20 09:17:41 +02:00
parent 8a3ed73e20
commit 2ece01e1d7
342 changed files with 587 additions and 590 deletions
MANIFEST.inNOTICEREADME.md
docs
powertrain_build

@ -1,6 +1,6 @@
include pybuild/templates/*.html include powertrain_build/templates/*.html
include test-requirements.txt include test-requirements.txt
include pybuild/matlab_scripts/CodeGen/* include powertrain_build/matlab_scripts/CodeGen/*
include pybuild/matlab_scripts/helperFunctions/* include powertrain_build/matlab_scripts/helperFunctions/*
include pybuild/matlab_scripts/* include powertrain_build/matlab_scripts/*
include requirements.txt include requirements.txt

6
NOTICE

@ -11,7 +11,7 @@ exceptiongroup 1.2.2 : MIT License
flake8 7.1.1 : MIT License flake8 7.1.1 : MIT License
gitdb 4.0.11 : BSD 3-clause "New" or "Revised" License gitdb 4.0.11 : BSD 3-clause "New" or "Revised" License
GitPython 3.1.43 : BSD 3-clause "New" or "Revised" License GitPython 3.1.43 : BSD 3-clause "New" or "Revised" License
idna 3.8 : BSD 3-clause "New" or "Revised" License idna 3.10 : BSD 3-clause "New" or "Revised" License
mccabe 0.7.0 : Expat License mccabe 0.7.0 : Expat License
NumPy 1.24.4 : BSD 3-clause "New" or "Revised" License NumPy 1.24.4 : BSD 3-clause "New" or "Revised" License
Packaging 24.1 : (Apache License 2.0 AND BSD 3-clause "New" or "Revised" License) Packaging 24.1 : (Apache License 2.0 AND BSD 3-clause "New" or "Revised" License)
@ -49,8 +49,6 @@ GitPython 3.1.43 pypi:GitPython/3.1.43
Copyright (C) 2008, 2009 Michael Trier and contributors, 2010-2015 Sebastian Thiel" Copyright (C) 2008, 2009 Michael Trier and contributors, 2010-2015 Sebastian Thiel"
Copyright (C) 2008, 2009 Michael Trier and contributorsAll rights reserved Copyright (C) 2008, 2009 Michael Trier and contributorsAll rights reserved
Copyright (C) 2008, 2009 Michael Trier (mtrier@gmail.com) and contributors Copyright (C) 2008, 2009 Michael Trier (mtrier@gmail.com) and contributors
idna 3.8 pypi:idna/3.8
Copyright (c) 2013-2024, Kim Davies and contributors.All rights reserved
mccabe 0.7.0 pypi:mccabe/0.7.0 mccabe 0.7.0 pypi:mccabe/0.7.0
Copyright © 2011-2013 Tarek Ziade <tarek@ziade.org> Copyright © 2011-2013 Tarek Ziade <tarek@ziade.org>
Copyright © 2013 Florent Xicluna <florent.xicluna@gmail.com> Copyright © 2013 Florent Xicluna <florent.xicluna@gmail.com>
@ -5573,7 +5571,7 @@ third-party archives.
--- ---
BSD 3-clause "New" or "Revised" License BSD 3-clause "New" or "Revised" License
(gitdb 4.0.11, GitPython 3.1.43, idna 3.8, NumPy 1.24.4, Packaging 24.1, SciPy 1.9.1, smmap 5.0.1, voluptuous 0.15.2) (gitdb 4.0.11, GitPython 3.1.43, idna 3.10, NumPy 1.24.4, Packaging 24.1, SciPy 1.9.1, smmap 5.0.1, voluptuous 0.15.2)
Copyright (c) <YEAR>, <OWNER> Copyright (c) <YEAR>, <OWNER>
All rights reserved. All rights reserved.

@ -1,23 +1,23 @@
# PyBuild # Powertrain-build
A Continuous Integration (CI) build system, testing all configurations where a TargetLink model is used. A Continuous Integration (CI) build system, testing all configurations where a TargetLink model is used.
## General Information about Pybuild ## General Information about powertrain-build
- PyBuild is fast. - Powertrain-build is fast.
- More parallelization of jobs in the CI system makes it faster. - More parallelization of jobs in the CI system makes it faster.
- Code generation is moved to the developer's PC. - Code generation is moved to the developer's PC.
- Code generation is done once for all projects using pre-processor directives. - Code generation is done once for all projects using pre-processor directives.
- C code reviews are now possible in Gerrit. - C code reviews are now possible in Gerrit.
- PyBuild adds signal consistency checks. - Powertrain-build adds signal consistency checks.
- Unit tests of the build system are introduced. - Unit tests of the build system are introduced.
- Its quality is assured. - Its quality is assured.
- PyBuild creates new variable classes with unique code decorations. - Powertrain-build creates new variable classes with unique code decorations.
- Post-processing C code is not necessary. - Post-processing C code is not necessary.
- ASIL-classed variables get declared at the source. - ASIL-classed variables get declared at the source.
- Memory can be optimized at compilation through short addressing different variable classes. - Memory can be optimized at compilation through short addressing different variable classes.
- The same models can be used in more than two different suppliers, for instance, SPA2's Core System Platform (CSP). - The same models can be used in more than two different suppliers, for instance, SPA2's Core System Platform (CSP).
- PyBuild fixes incorrect handling of NVM variables. - Powertrain-build fixes incorrect handling of NVM variables.
## Project Structure ## Project Structure
@ -25,18 +25,20 @@ A Continuous Integration (CI) build system, testing all configurations where a T
- `playbooks/`: Directory where we keep Ansible playbooks that are executed in the jobs we use in this project. - `playbooks/`: Directory where we keep Ansible playbooks that are executed in the jobs we use in this project.
- `pybuild/`: Main directory of the project. All the application source code is kept here. It is divided into different Python modules: - `powertrain_build/`: Main directory of the project. All the application source code is kept here. It is divided into different Python modules:
- `interface/` - `interface/`
- `lib/` - `lib/`
- `zone_controller/` - `zone_controller/`
Also, we keep `static_code/` and `templates/` directories with useful `.c`, `.h`, and `.html` files. Also, we keep `static_code/` and `templates/` directories with useful `.c`, `.h`, and `.html` files.
- `tests/`: Directory where we keep the unit tests for our application source code. The tests are structured in a similar way to what we have inside the `pybuild/` directory. Tests for the `interface`, `lib`, and `zone_controller` modules are split into `tests/interface/`, `tests/lib/`, and `tests/zone_controller/`, respectively. Other tests are kept inside the `tests/pybuild/` directory. - `tests/`: Directory where we keep the unit tests for our application source code. The tests are structured in a similar way to what we have inside the `powertrain_build/` directory. Tests for the `interface`, `lib`, and `zone_controller` modules are split into `tests/interface/`, `tests/lib/`, and `tests/zone_controller/`, respectively. Other tests are kept inside the `tests/powertrain_build/` directory.
- `zuul.d/`: Directory where we keep our Zuul jobs. - `zuul.d/`: Directory where we keep our Zuul jobs.
## How to use Pybuild ## How to use powertrain-build
See [powertrain-build introduction](./docs/powertrain_build_introduction.md)
## Contributing ## Contributing

@ -1,8 +1,8 @@
# Run the build command # Run the build command
`pybuild/build.py` is the starting point for generating all the files needed for building a complete SW using the supplier make environment. The script takes one positional argument, and that is a [project_config](project_config.md). `powertrain_build/build.py` is the starting point for generating all the files needed for building a complete SW using the supplier make environment. The script takes one positional argument, and that is a [project_config](project_config.md).
This script acts as a command line wrapper for [build](../../pybuild/build.py). This script acts as a command line wrapper for [build](../../powertrain_build/build.py).
```none ```none
usage: build.py [-h] [-cd] [-d] [-na] [-if] [-V] proj_config usage: build.py [-h] [-cd] [-d] [-na] [-if] [-V] proj_config

@ -31,7 +31,7 @@ actuation-arbitration-manager-simulink-logic/Projects/Init_PyBuild.m
In git bash: In git bash:
```bash ```bash
py -3.6 -m pytools.pybuild_wrapper --codegen --models Models/ICEAES/VcAesTx/VcAesTx.mdl py -3.6 -m powertrain_build.wrapper --codegen --models Models/ICEAES/VcAesTx/VcAesTx.mdl
``` ```
#### Set Matlab 2017 as Environmental Variable #### Set Matlab 2017 as Environmental Variable
@ -61,15 +61,15 @@ See picture below for details.
#### Code generate with Embedded Coder with Matlab2019b #### Code generate with Embedded Coder with Matlab2019b
```python ```python
py -3.6 -m pytools.pybuild_wrapper --codegen --matlab-bin "C:\MATLAB_2019_b\bin\matlab.exe" --models Models/STEER/VcSteer/VcSteer.mdl py -3.6 -m powertrain_build.wrapper --codegen --matlab-bin "C:\MATLAB_2019_b\bin\matlab.exe" --models Models/STEER/VcSteer/VcSteer.mdl
``` ```
### Update a TargeLink model to pybuild ### Update a TargeLink model to powertrain_build
In git bash: In git bash:
```python ```python
py -3.6 -m pytools.pybuild_wrapper --update --models Models/ICEAES/VcAesTx/VcAesTx.mdl py -3.6 -m powertrain_build.wrapper --update --models Models/ICEAES/VcAesTx/VcAesTx.mdl
``` ```
### Update and Code generate a model ### Update and Code generate a model
@ -77,7 +77,7 @@ py -3.6 -m pytools.pybuild_wrapper --update --models Models/ICEAES/VcAesTx/VcAes
In git bash: In git bash:
```bash ```bash
py -3.6 -m pytools.pybuild_wrapper --update --codegen --models Models/ICEAES/VcAesTx/VcAesTx.mdl py -3.6 -m powertrain_build.wrapper --update --codegen --models Models/ICEAES/VcAesTx/VcAesTx.mdl
``` ```
### Code generation and build ### Code generation and build
@ -85,7 +85,7 @@ py -3.6 -m pytools.pybuild_wrapper --update --codegen --models Models/ICEAES/VcA
To code generate and build a complete project *ABC_123*: To code generate and build a complete project *ABC_123*:
```bash ```bash
py -3.6 -m pytools.pybuild_wrapper --codegen --build ABC_123 py -3.6 -m powertrain_build.wrapper --codegen --build ABC_123
``` ```
### Build a project ### Build a project
@ -93,13 +93,13 @@ py -3.6 -m pytools.pybuild_wrapper --codegen --build ABC_123
You can either use the wrapper: You can either use the wrapper:
```bash ```bash
py -3.6 -m pytools.pybuild_wrapper --build ABC_123 py -3.6 -m powertrain_build.wrapper --build ABC_123
``` ```
### Detailed build options ### Detailed build options
```bash ```bash
py -3.6 -m pytools.pybuild_wrapper --help py -3.6 -m powertrain_build.wrapper --help
``` ```
The powertrain_build wrapper has many options, we'll explain them in detail here: The powertrain_build wrapper has many options, we'll explain them in detail here:
@ -126,7 +126,7 @@ binary to use. Defaults to C:\MATLABR2017b_x64\bin\matlab.exe. If you have
Matlab installed in the wrong place you can use: Matlab installed in the wrong place you can use:
```bash ```bash
py -3.6 -m pytools.pybuild_wrapper --codegen --models Models/ICEAES/VcAesTx/VcAesTx.mdl --matlab-bin="C:\Program Files\MATLAB\R2017b\bin\matlab.exe" py -3.6 -m powertrain_build.wrapper --codegen --models Models/ICEAES/VcAesTx/VcAesTx.mdl --matlab-bin="C:\Program Files\MATLAB\R2017b\bin\matlab.exe"
``` ```
NOTE: Building a project (--build) does not work if a model requires a NOTE: Building a project (--build) does not work if a model requires a

@ -28,5 +28,5 @@ source ./powertrain_build_venv/bin/activate
Once activated, you can execute it: Once activated, you can execute it:
```shell ```shell
PYTHONPATH=<path_to>/pt/pytools:<path_to>//pt/pybuild python -m pytools.pybuild_wrapper build-specific --project-config Projects/CSP/PvcDepDemo/ProjectCfg.json --core-dummy PYTHONPATH=<path_to>//powertrain-build python -m powertrain_build.wrapper build-specific --project-config Projects/CSP/PvcDepDemo/ProjectCfg.json --core-dummy
``` ```

@ -10,7 +10,7 @@ Powertrain Build contains scripts for both signal consistency checks and signal
If you type the following in git bash: If you type the following in git bash:
```bash ```bash
py -3.6 -m pytools.pybuild_wrapper --help py -3.6 -m powertrain_build.wrapper --help
``` ```
## Signal Interface report ## Signal Interface report
@ -18,7 +18,7 @@ py -3.6 -m pytools.pybuild_wrapper --help
The signal Interface tool generates html reports. The following example shows how to generate the report: The signal Interface tool generates html reports. The following example shows how to generate the report:
```bash ```bash
py -3.6 -m pytools.pybuild_wrapper --build ABC_123 --interface py -3.6 -m powertrain_build.wrapper --build ABC_123 --interface
``` ```
A project specific report will be available here: `Projects\ABC_123\output\Reports\SigIf.html`. A project specific report will be available here: `Projects\ABC_123\output\Reports\SigIf.html`.

@ -1,15 +1,15 @@
# Copyright 2024 Volvo Car Corporation # Copyright 2024 Volvo Car Corporation
# Licensed under Apache 2.0. # Licensed under Apache 2.0.
"""Main package of the pybuild application.""" """Main package of the powertrain-build application."""
from pbr.version import VersionInfo from pbr.version import VersionInfo
from pathlib import Path from pathlib import Path
from pybuild.lib import logger, helper_functions from powertrain_build.lib import logger, helper_functions
from pybuild.environmentcheck import check_python_string from powertrain_build.environmentcheck import check_python_string
LOGGER = logger.create_logger(__file__) LOGGER = logger.create_logger(__file__)
__version__ = VersionInfo('pt-pybuild').release_string() __version__ = VersionInfo('powertrain-build').release_string()
LOGGER.info('Current pybuild version is %s', __version__) LOGGER.info('Current powertrain-build version is %s', __version__)
__config_version__ = '0.2.1' __config_version__ = '0.2.1'
__required_python_lower__ = '3.6' __required_python_lower__ = '3.6'
__required_python_upper__ = '3.10' __required_python_upper__ = '3.10'
@ -21,13 +21,13 @@ requirement_path = Path(
) )
if requirement_path.exists(): if requirement_path.exists():
with requirement_path.open("r") as requirement_file: with requirement_path.open("r") as requirement_file:
expected_package = "pt-pybuild==" + __version__ expected_package = "powertrain-build==" + __version__
for line in requirement_file: for line in requirement_file:
if expected_package in line: if expected_package in line:
LOGGER.info('PyBuild version matched requirements!') LOGGER.info('Powertrain-build version matched requirements!')
break break
elif "pt-pybuild==" in line and expected_package not in line: elif "powertrain-build==" in line and expected_package not in line:
LOGGER.warning('PyBuild version does not match requirements!') LOGGER.warning('Powertrain-build version does not match requirements!')
break break
else: else:

@ -9,8 +9,8 @@ import re
import logging import logging
from string import Template from string import Template
from pprint import pformat from pprint import pformat
from pybuild.problem_logger import ProblemLogger from powertrain_build.problem_logger import ProblemLogger
from pybuild.types import a2l_type, a2l_range from powertrain_build.types import a2l_type, a2l_range
LOG = logging.getLogger() LOG = logging.getLogger()

@ -9,9 +9,9 @@ import os
import re import re
from string import Template from string import Template
from pybuild.lib.helper_functions import deep_dict_update from powertrain_build.lib.helper_functions import deep_dict_update
from pybuild.problem_logger import ProblemLogger from powertrain_build.problem_logger import ProblemLogger
from pybuild.a2l_templates import A2lProjectTemplate, A2lSilverTemplate from powertrain_build.a2l_templates import A2lProjectTemplate, A2lSilverTemplate
class A2lMerge(ProblemLogger): class A2lMerge(ProblemLogger):

@ -4,7 +4,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
"""Python module used for building a Vcc SPM SW release. """Python module used for building a Vcc SPM SW release.
This is the entry point to pybuild which includes all other needed modules. This is the entry point to powertrain-build which includes all other needed modules.
Loads configuration files and sequences the code generation steps. Loads configuration files and sequences the code generation steps.
""" """
@ -17,31 +17,31 @@ import time
from os.path import join as pjoin from os.path import join as pjoin
from pathlib import Path from pathlib import Path
from pybuild import __config_version__, __version__, build_defs from powertrain_build import __config_version__, __version__, build_defs
from pybuild.a2l_merge import A2lMerge from powertrain_build.a2l_merge import A2lMerge
from pybuild.build_proj_config import BuildProjConfig from powertrain_build.build_proj_config import BuildProjConfig
from pybuild.core import Core, HICore, ZCCore from powertrain_build.core import Core, HICore, ZCCore
from pybuild.core_dummy import CoreDummy from powertrain_build.core_dummy import CoreDummy
from pybuild.create_conversion_table import create_conversion_table from powertrain_build.create_conversion_table import create_conversion_table
from pybuild.dids import DIDs, HIDIDs, ZCDIDs from powertrain_build.dids import DIDs, HIDIDs, ZCDIDs
from pybuild.dummy import DummyVar from powertrain_build.dummy import DummyVar
from pybuild.dummy_spm import DummySpm from powertrain_build.dummy_spm import DummySpm
from pybuild.ext_dbg import ExtDbg from powertrain_build.ext_dbg import ExtDbg
from pybuild.ext_var import ExtVarCsv, ExtVarYaml from powertrain_build.ext_var import ExtVarCsv, ExtVarYaml
from pybuild.feature_configs import FeatureConfigs from powertrain_build.feature_configs import FeatureConfigs
from pybuild.lib.helper_functions import get_repo_root, merge_dicts from powertrain_build.lib.helper_functions import get_repo_root, merge_dicts
from pybuild.memory_section import MemorySection from powertrain_build.memory_section import MemorySection
from pybuild.nvm_def import NVMDef from powertrain_build.nvm_def import NVMDef
from pybuild.problem_logger import ProblemLogger from powertrain_build.problem_logger import ProblemLogger
from pybuild.replace_compu_tab_ref import replace_tab_verb from powertrain_build.replace_compu_tab_ref import replace_tab_verb
from pybuild.sched_funcs import SchedFuncs from powertrain_build.sched_funcs import SchedFuncs
from pybuild.signal_if_html_rep import SigIfHtmlReport from powertrain_build.signal_if_html_rep import SigIfHtmlReport
from pybuild.signal_incons_html_rep import SigConsHtmlReport from powertrain_build.signal_incons_html_rep import SigConsHtmlReport
from pybuild.signal_interfaces import CsvSignalInterfaces, YamlSignalInterfaces from powertrain_build.signal_interfaces import CsvSignalInterfaces, YamlSignalInterfaces
from pybuild.unit_configs import CodeGenerators, UnitConfigs from powertrain_build.unit_configs import CodeGenerators, UnitConfigs
from pybuild.user_defined_types import UserDefinedTypes from powertrain_build.user_defined_types import UserDefinedTypes
from pybuild.zone_controller.calibration import ZoneControllerCalibration from powertrain_build.zone_controller.calibration import ZoneControllerCalibration
from pybuild.zone_controller.composition_yaml import CompositionYaml from powertrain_build.zone_controller.composition_yaml import CompositionYaml
LOG = logging.getLogger() LOG = logging.getLogger()
REPO_ROOT = get_repo_root() REPO_ROOT = get_repo_root()
@ -631,7 +631,7 @@ def propagate_tag_name(build_cfg, tag_name, problem_logger):
Args: Args:
build_cfg (BuildProjConfig): Build project class holding where files should be stored. build_cfg (BuildProjConfig): Build project class holding where files should be stored.
tag_name (str): git tag name. tag_name (str): git tag name.
problem_logger (object): logger for pybuild. problem_logger (object): logger for powertrain_build.
""" """
LOG.info("******************************************************") LOG.info("******************************************************")
LOG.info("Propagating tag name: %s", tag_name) LOG.info("Propagating tag name: %s", tag_name)
@ -657,58 +657,58 @@ def propagate_tag_name(build_cfg, tag_name, problem_logger):
def add_args(parser): def add_args(parser):
"""Add command line arguments for pybuild. """Add command line arguments for powertrain_build.
This is useful when pybuild should be run through a command line wrapper function. This is useful when powertrain-build should be run through a command line wrapper function.
Args: Args:
parser (argparse.ArgumentParser): Parser instance to add arguments to. parser (argparse.ArgumentParser): Parser instance to add arguments to.
""" """
pybuild_parser = parser.add_argument_group("pybuild arguments") powertrain_build_parser = parser.add_argument_group("powertrain-build arguments")
pybuild_parser.add_argument( powertrain_build_parser.add_argument(
"--project-config", required=True, help="Project root configuration file" "--project-config", required=True, help="Project root configuration file"
) )
pybuild_parser.add_argument( powertrain_build_parser.add_argument(
"--generate-system-info", action="store_true", help="Generate AllSystemInfo.mat" "--generate-system-info", action="store_true", help="Generate AllSystemInfo.mat"
) )
pybuild_parser.add_argument( powertrain_build_parser.add_argument(
"--generate-custom-conv-tab", "--generate-custom-conv-tab",
default=None, default=None,
help="Path to conversion table file. Useful for TargetLink enums in A2L file.", help="Path to conversion table file. Useful for TargetLink enums in A2L file.",
) )
pybuild_parser.add_argument( powertrain_build_parser.add_argument(
"--core-dummy", "--core-dummy",
action="store_true", action="store_true",
help="Generate core dummy code to enable integration with old supplier code", help="Generate core dummy code to enable integration with old supplier code",
) )
pybuild_parser.add_argument( powertrain_build_parser.add_argument(
"--debug", action="store_true", help="Activate the debug log" "--debug", action="store_true", help="Activate the debug log"
) )
pybuild_parser.add_argument( powertrain_build_parser.add_argument(
"--no-abort", action="store_true", help="Do not abort due to errors" "--no-abort", action="store_true", help="Do not abort due to errors"
) )
pybuild_parser.add_argument( powertrain_build_parser.add_argument(
"--no-nvm-a2l", "--no-nvm-a2l",
action="store_true", action="store_true",
help="Do not generate a2l file for NVM structs", help="Do not generate a2l file for NVM structs",
) )
pybuild_parser.add_argument( powertrain_build_parser.add_argument(
"--complete-a2l", action="store_true", help="Generate A2L with project info" "--complete-a2l", action="store_true", help="Generate A2L with project info"
) )
pybuild_parser.add_argument( powertrain_build_parser.add_argument(
"--silver-a2l", "--silver-a2l",
action="store_true", action="store_true",
help="Generate A2L file with Silver patching. Complete A2L argument takes precedence.", help="Generate A2L file with Silver patching. Complete A2L argument takes precedence.",
) )
pybuild_parser.add_argument( powertrain_build_parser.add_argument(
"--interface", action="store_true", help="Generate interface report" "--interface", action="store_true", help="Generate interface report"
) )
pybuild_parser.add_argument( powertrain_build_parser.add_argument(
"--generate-rte-checkpoint-calls", "--generate-rte-checkpoint-calls",
action="store_true", action="store_true",
help="Generate RTE function checkpoint calls", help="Generate RTE function checkpoint calls",
) )
pybuild_parser.add_argument( powertrain_build_parser.add_argument(
"--version", "--version",
action="version", action="version",
version=f"%(prog)s {__version__}", version=f"%(prog)s {__version__}",
@ -767,7 +767,7 @@ def build(
setup_logging(build_cfg.get_log_dst_dir(), problem_logger, debug, quiet) setup_logging(build_cfg.get_log_dst_dir(), problem_logger, debug, quiet)
LOG.info("Starting build") LOG.info("Starting build")
LOG.info("pybuild version is: %s", __version__) LOG.info("powertrain_build version is: %s", __version__)
LOG.info("Project/Model config file version is: %s", __config_version__) LOG.info("Project/Model config file version is: %s", __config_version__)
LOG.info("Read SPM code switches") LOG.info("Read SPM code switches")
start_time = time.time() start_time = time.time()
@ -891,7 +891,7 @@ def build(
# Generate AllSystemInfo.mat for DocGen compatibility # Generate AllSystemInfo.mat for DocGen compatibility
if generate_system_info: if generate_system_info:
from pybuild.gen_allsysteminfo import GenAllSystemInfo from powertrain_build.gen_allsysteminfo import GenAllSystemInfo
gen_all_system_info = GenAllSystemInfo(signal_if, unit_cfg) gen_all_system_info = GenAllSystemInfo(signal_if, unit_cfg)
gen_all_system_info.build() gen_all_system_info.build()
@ -922,7 +922,7 @@ def build(
memory_section.generate_required_header_files() memory_section.generate_required_header_files()
# Propagate tag name for release builds # Propagate tag name for release builds
# TAG_NAME is set in release -> release-compile-denso/release-ecmsildll -> pybuild.build # TAG_NAME is set in release -> release-compile-denso/release-ecmsildll -> powertrain_build.build
tag_name = os.environ.get("TAG_NAME", "") tag_name = os.environ.get("TAG_NAME", "")
if tag_name and ecu_supplier == "Denso": if tag_name and ecu_supplier == "Denso":
propagate_tag_name(build_cfg, tag_name, problem_logger) propagate_tag_name(build_cfg, tag_name, problem_logger)

@ -11,8 +11,8 @@ import shutil
import pathlib import pathlib
from pprint import pformat from pprint import pformat
from pybuild.lib.helper_functions import deep_dict_update from powertrain_build.lib.helper_functions import deep_dict_update
from pybuild.versioncheck import Version from powertrain_build.versioncheck import Version
class BuildProjConfig: class BuildProjConfig:

@ -15,9 +15,9 @@ from pathlib import Path
import git import git
from pybuild.interface.application import Application, Model, get_active_signals from powertrain_build.interface.application import Application, Model, get_active_signals
from pybuild.interface.ems import CsvEMS from powertrain_build.interface.ems import CsvEMS
from pybuild.lib import logger from powertrain_build.lib import logger
LOGGER = logger.create_logger("Check interface") LOGGER = logger.create_logger("Check interface")
@ -358,14 +358,14 @@ def parse_args():
Mismatches in min, max or unit gives warnings Mismatches in min, max or unit gives warnings
Examples: Examples:
py -3.6 -m pybuild.check_interface models_in_projects <Projects> <Models/ModelGroup>\ py -3.6 -m powertrain_build.check_interface models_in_projects <Projects> <Models/ModelGroup>\
--projects <ProjectOne> <ProjectTwo> --projects <ProjectOne> <ProjectTwo>
Checks models in Models/ModelGroup against ProjectOne and ProjectTwo in the folder Projects Checks models in Models/ModelGroup against ProjectOne and ProjectTwo in the folder Projects
py -3.6 -m pybuild.check_interface models <Models> --models <ModelOne> <ModelTwo> py -3.6 -m powertrain_build.check_interface models <Models> --models <ModelOne> <ModelTwo>
Checks models ModelOne and ModelTwo against all other models in the folder Models Checks models ModelOne and ModelTwo against all other models in the folder Models
py -3.6 -m pybuild.check_interface projects <Projects> \ py -3.6 -m powertrain_build.check_interface projects <Projects> \
--projects ProjectOne ProjectTwo ProjectThree --projects ProjectOne ProjectTwo ProjectThree
Checks the interfaces of ProjectOne, ProjectTwo and ProjectThree in the folder Projects Checks the interfaces of ProjectOne, ProjectTwo and ProjectThree in the folder Projects
""", """,

@ -12,7 +12,7 @@ import os
import re import re
from pprint import pformat from pprint import pformat
from pybuild.lib import logger from powertrain_build.lib import logger
LOGGER = logger.create_logger('config') LOGGER = logger.create_logger('config')

@ -12,9 +12,9 @@ import time
from collections import defaultdict from collections import defaultdict
from pathlib import Path from pathlib import Path
from ruamel.yaml import YAML from ruamel.yaml import YAML
from pybuild import build_defs from powertrain_build import build_defs
from pybuild.xlrd_csv import WorkBook from powertrain_build.xlrd_csv import WorkBook
from pybuild.problem_logger import ProblemLogger from powertrain_build.problem_logger import ProblemLogger
class Core(ProblemLogger): class Core(ProblemLogger):

@ -10,10 +10,10 @@ updated the core with all the needed core id definitions.
import os import os
from pybuild import build_defs from powertrain_build import build_defs
from pybuild.problem_logger import ProblemLogger from powertrain_build.problem_logger import ProblemLogger
from pybuild.types import get_ec_type from powertrain_build.types import get_ec_type
from pybuild.unit_configs import CodeGenerators from powertrain_build.unit_configs import CodeGenerators
class CoreDummy(ProblemLogger): class CoreDummy(ProblemLogger):

@ -12,11 +12,11 @@ import csv
import os import os
from pathlib import Path from pathlib import Path
from ruamel.yaml import YAML from ruamel.yaml import YAML
from pybuild import build_defs from powertrain_build import build_defs
from pybuild.lib.helper_functions import deep_dict_update from powertrain_build.lib.helper_functions import deep_dict_update
from pybuild.problem_logger import ProblemLogger from powertrain_build.problem_logger import ProblemLogger
from pybuild.types import byte_size, get_ec_type, get_float32_types from powertrain_build.types import byte_size, get_ec_type, get_float32_types
from pybuild.unit_configs import CodeGenerators from powertrain_build.unit_configs import CodeGenerators
def get_dids_in_prj(unit_cfgs): def get_dids_in_prj(unit_cfgs):

@ -3,11 +3,11 @@
"""Module for generation of c- and a2l-file with dummy signal declarations.""" """Module for generation of c- and a2l-file with dummy signal declarations."""
import pybuild.build_defs as bd import powertrain_build.build_defs as bd
from pybuild.types import byte_size_string, get_bitmask from powertrain_build.types import byte_size_string, get_bitmask
from pybuild.a2l import A2l from powertrain_build.a2l import A2l
from pybuild.problem_logger import ProblemLogger from powertrain_build.problem_logger import ProblemLogger
class DummyVar(ProblemLogger): class DummyVar(ProblemLogger):
@ -36,10 +36,11 @@ class DummyVar(ProblemLogger):
Args: Args:
data_type (str): Data type. data_type (str): Data type.
Returns: Returns:
byte_size_string(pybuild.types.byte_size_string): Return result of pybuild.types.byte_size_string. byte_size_string(powertrain_build.types.byte_size_string): Return result of
powertrain_build.types.byte_size_string.
""" """
if data_type in self._enumerations: if data_type in self._enumerations:
return byte_size_string(self._enumerations[data_type]['underlying_data_type']) return byte_size_string(self._enumerations[data_type]["underlying_data_type"])
return byte_size_string(data_type) return byte_size_string(data_type)
def _restruct_input_data(self): def _restruct_input_data(self):
@ -48,112 +49,109 @@ class DummyVar(ProblemLogger):
This will be used for declaring the variables and generating the This will be used for declaring the variables and generating the
A2L-file A2L-file
""" """
ext_out = {var: data for ioclass, vardict in self._ext_dict.items() ext_out = {
if ioclass.endswith('-Output') for var, data in vardict.items()} var: data
for ioclass, vardict in self._ext_dict.items()
if ioclass.endswith("-Output")
for var, data in vardict.items()
}
ext_ = {} ext_ = {}
for var in self._res_dict['sigs']['ext']['missing']: for var in self._res_dict["sigs"]["ext"]["missing"]:
self.debug('ext: %s', var) self.debug("ext: %s", var)
if var in ext_out: if var in ext_out:
data = ext_out[var] data = ext_out[var]
self.debug('ext_data: %s', data) self.debug("ext_data: %s", data)
ext_[var] = data ext_[var] = data
int_ = {} int_ = {}
for unit in self._res_dict['sigs']['int']: for unit in self._res_dict["sigs"]["int"]:
for var in self._res_dict['sigs']['int'][unit]['missing']: for var in self._res_dict["sigs"]["int"][unit]["missing"]:
if var not in ext_ and var in self._unit_vars['inports']: if var not in ext_ and var in self._unit_vars["inports"]:
data = self._unit_vars['inports'][var][unit] data = self._unit_vars["inports"][var][unit]
int_[var] = data int_[var] = data
for var, data in int_.items(): for var, data in int_.items():
data_type_size = self._get_byte_size_string(data['type']) data_type_size = self._get_byte_size_string(data["type"])
self._int_vars.setdefault(data_type_size, {})[var] = data self._int_vars.setdefault(data_type_size, {})[var] = data
for var, data in ext_.items(): for var, data in ext_.items():
data_type_size = self._get_byte_size_string(data['type']) data_type_size = self._get_byte_size_string(data["type"])
self._ext_vars.setdefault(data_type_size, {})[var] = data self._ext_vars.setdefault(data_type_size, {})[var] = data
def _a2l_dict(self): def _a2l_dict(self):
"""Return a dict defining all parameters for a2l-generation.""" """Return a dict defining all parameters for a2l-generation."""
res = { res = {"vars": {}, "function": "VcDummy"}
'vars': {},
'function': 'VcDummy'
}
for inp in [self._ext_vars]: for inp in [self._ext_vars]:
for sizes in inp.values(): for sizes in inp.values():
for var, data in sizes.items(): for var, data in sizes.items():
if data['type'] in self._enumerations: if data["type"] in self._enumerations:
data_type = self._enumerations[data['type']]['underlying_data_type'] data_type = self._enumerations[data["type"]]["underlying_data_type"]
else: else:
data_type = data['type'] data_type = data["type"]
resv = res['vars'] resv = res["vars"]
resv.setdefault(var, {})['a2l_data'] = { resv.setdefault(var, {})["a2l_data"] = {
'bitmask': get_bitmask(data_type), "bitmask": get_bitmask(data_type),
'description': data.get('description', ''), "description": data.get("description", ""),
'lsb': '2^0', "lsb": "2^0",
'max': data.get('max'), "max": data.get("max"),
'min': data.get('min'), "min": data.get("min"),
'offset': '0', "offset": "0",
'unit': data['unit'], "unit": data["unit"],
'x_axis': None, "x_axis": None,
'y_axis': None "y_axis": None,
}
resv[var]['array'] = []
resv[var]['function'] = ['VcEc']
resv[var]['var'] = {
'cvc_type': 'CVC_DISP',
'type': data_type,
'var': var
} }
resv[var]["array"] = []
resv[var]["function"] = ["VcEc"]
resv[var]["var"] = {"cvc_type": "CVC_DISP", "type": data_type, "var": var}
return res return res
@classmethod @classmethod
def _generate_var_defs(cls, fh_c, vars, enums, comment): def _generate_var_defs(cls, fh_c, vars, enums, comment):
"""Generate the variable definitions.""" """Generate the variable definitions."""
fh_c.write(f'\n{comment}\n\n') fh_c.write(f"\n{comment}\n\n")
for varsize in sorted(vars.keys(), reverse=True): for varsize in sorted(vars.keys(), reverse=True):
fh_c.write(f'/* Variables of size {varsize} bytes */\n\n') fh_c.write(f"/* Variables of size {varsize} bytes */\n\n")
var_defs = vars[varsize] var_defs = vars[varsize]
for var in sorted(var_defs.keys()): for var in sorted(var_defs.keys()):
data = var_defs[var] data = var_defs[var]
if data['type'] in enums: if data["type"] in enums:
if enums[data['type']]['default_value'] is not None: if enums[data["type"]]["default_value"] is not None:
init_value = enums[data['type']]['default_value'] init_value = enums[data["type"]]["default_value"]
else: else:
cls.warning('Initializing enumeration %s to "zero".', data['type']) cls.warning('Initializing enumeration %s to "zero".', data["type"])
init_value = [k for k, v in enums[data['type']]['members'].items() if v == 0][0] init_value = [k for k, v in enums[data["type"]]["members"].items() if v == 0][0]
fh_c.write(f"{data['type']} {var} = {init_value};\n") fh_c.write(f"{data['type']} {var} = {init_value};\n")
else: else:
fh_c.write(f"{data['type']} {var} = {0};\n") fh_c.write(f"{data['type']} {var} = {0};\n")
fh_c.write('\n') fh_c.write("\n")
@classmethod @classmethod
def _generate_var_initialization(cls, fh_c, vars, comment): def _generate_var_initialization(cls, fh_c, vars, comment):
"""Generate the variable initializations.""" """Generate the variable initializations."""
fh_c.write(f'\n{comment}\n\n') fh_c.write(f"\n{comment}\n\n")
fh_c.write('\nvoid RESTART_VcDummy(void)\n{\n') fh_c.write("\nvoid RESTART_VcDummy(void)\n{\n")
for varsize in sorted(vars.keys(), reverse=True): for varsize in sorted(vars.keys(), reverse=True):
var_defs = vars[varsize] var_defs = vars[varsize]
for var in sorted(var_defs.keys()): for var in sorted(var_defs.keys()):
fh_c.write(f" {var} = {0};\n") fh_c.write(f" {var} = {0};\n")
fh_c.write('}\n') fh_c.write("}\n")
def _generate_c_file(self, filename): def _generate_c_file(self, filename):
"""Generate the c-file defining all missing input variables.""" """Generate the c-file defining all missing input variables."""
general_includes = '' general_includes = ""
general_includes += self._unit_cfg.base_types_headers general_includes += self._unit_cfg.base_types_headers
for common_header_file in self._common_header_files: for common_header_file in self._common_header_files:
general_includes += f'#include "{common_header_file}"\n' general_includes += f'#include "{common_header_file}"\n'
general_includes += '\n' general_includes += "\n"
with open(filename, 'w', encoding="utf-8") as fh_c: with open(filename, "w", encoding="utf-8") as fh_c:
fh_c.write(general_includes) fh_c.write(general_includes)
fh_c.write(f'#include "{bd.CVC_DISP_START}"\n\n') fh_c.write(f'#include "{bd.CVC_DISP_START}"\n\n')
self._generate_var_defs(fh_c, self._ext_vars, self._enumerations, '/** Missing external signals **/') self._generate_var_defs(fh_c, self._ext_vars, self._enumerations, "/** Missing external signals **/")
fh_c.write(f'\n#include "{bd.CVC_DISP_END}"\n') fh_c.write(f'\n#include "{bd.CVC_DISP_END}"\n')
self.info('Generated %s', filename) self.info("Generated %s", filename)
def generate_file(self, filename): def generate_file(self, filename):
"""Generate the files for defining all missing input variables.""" """Generate the files for defining all missing input variables."""
self._restruct_input_data() self._restruct_input_data()
self._generate_c_file(filename + '.c') self._generate_c_file(filename + ".c")
a2l_dict = self._a2l_dict() a2l_dict = self._a2l_dict()
A2l(a2l_dict, self._prj_cfg).gen_a2l(filename + '.a2l') A2l(a2l_dict, self._prj_cfg).gen_a2l(filename + ".a2l")

@ -7,17 +7,17 @@ import os
from operator import itemgetter from operator import itemgetter
import math import math
import pybuild.build_defs as bd import powertrain_build.build_defs as bd
from pybuild import signal from powertrain_build import signal
from pybuild.a2l import A2l from powertrain_build.a2l import A2l
from pybuild.problem_logger import ProblemLogger from powertrain_build.problem_logger import ProblemLogger
from pybuild.types import byte_size, get_bitmask from powertrain_build.types import byte_size, get_bitmask
class DummySpm(ProblemLogger): class DummySpm(ProblemLogger):
"""Generate c-files which defines missing outport variables in the model out-port interface. """Generate c-files which defines missing outport variables in the model out-port interface.
The models declare all in-ports as 'external' and pybuild will then The models declare all in-ports as 'external' and powertrain-build will then
generate any missing outports in the correct #if/#endif guards here. generate any missing outports in the correct #if/#endif guards here.
One c-file per outport origin model should be generated. One c-file per outport origin model should be generated.
@ -69,7 +69,7 @@ class DummySpm(ProblemLogger):
Args: Args:
data_type (str): Data type. data_type (str): Data type.
Returns: Returns:
byte_size(pybuild.types.byte_size): Return result of pybuild.types.byte_size. byte_size(powertrain_build.types.byte_size): Return result of powertrain_build.types.byte_size.
""" """
if data_type in self._enumerations: if data_type in self._enumerations:
return byte_size(self._enumerations[data_type]['underlying_data_type']) return byte_size(self._enumerations[data_type]['underlying_data_type'])

@ -13,7 +13,7 @@ def check_python_string(python_lower, python_upper=None):
python_lower (str): Required lower bound for Python version. python_lower (str): Required lower bound for Python version.
python_upper (str): Optional upper bound for Python version. python_upper (str): Optional upper bound for Python version.
Raises: Raises:
RuntimeError: If current Python executable is not compatible with pybuild. RuntimeError: If current Python executable is not compatible with powertrain_build.
""" """
versions = [_split_version(python_lower)] versions = [_split_version(python_lower)]
@ -29,7 +29,7 @@ def check_python_tuple(python_lower, python_upper=None):
python_lower (2-tuple): Required lower bound for Python version. python_lower (2-tuple): Required lower bound for Python version.
python_upper (2-tuple): Optional upper bound for Python version. python_upper (2-tuple): Optional upper bound for Python version.
Raises: Raises:
RuntimeError: If current Python executable is not compatible with pybuild. RuntimeError: If current Python executable is not compatible with powertrain_build.
""" """
cur_version = sys.version_info[:2] cur_version = sys.version_info[:2]

@ -11,10 +11,10 @@ TODO: Check if all IO parameters in SPMEMSInterfaceRequirements.xlsx defined as
import os import os
import re import re
from pybuild import build_defs from powertrain_build import build_defs
from pybuild.types import byte_size_string, get_bitmask, a2l_range from powertrain_build.types import byte_size_string, get_bitmask, a2l_range
from pybuild.a2l import A2l from powertrain_build.a2l import A2l
from pybuild.problem_logger import ProblemLogger from powertrain_build.problem_logger import ProblemLogger
class ExtDbg(ProblemLogger): class ExtDbg(ProblemLogger):

@ -4,10 +4,10 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
"""Module containing classes for VCC - Supplier signal interface.""" """Module containing classes for VCC - Supplier signal interface."""
from pybuild import build_defs from powertrain_build import build_defs
from pybuild.types import byte_size_string, get_bitmask from powertrain_build.types import byte_size_string, get_bitmask
from pybuild.a2l import A2l from powertrain_build.a2l import A2l
from pybuild.problem_logger import ProblemLogger from powertrain_build.problem_logger import ProblemLogger
class ExtVarBase(ProblemLogger): class ExtVarBase(ProblemLogger):
@ -24,9 +24,16 @@ class ExtVarBase(ProblemLogger):
INPORT_INDEX = 0 INPORT_INDEX = 0
OUTPORT_INDEX = 1 OUTPORT_INDEX = 1
__data_type_size = {'Float32': '4', 'UInt32': '4', 'Int32': '4', __data_type_size = {
'UInt16': '2', 'Int16': '2', "Float32": "4",
'UInt8': '1', 'Int8': '1', 'Bool': '1'} "UInt32": "4",
"Int32": "4",
"UInt16": "2",
"Int16": "2",
"UInt8": "1",
"Int8": "1",
"Bool": "1",
}
def __init__(self, variable_dict, prj_cfg, unit_cfg, user_defined_types, integrity_level=build_defs.ASIL_QM): def __init__(self, variable_dict, prj_cfg, unit_cfg, user_defined_types, integrity_level=build_defs.ASIL_QM):
"""Constructor. """Constructor.
@ -52,10 +59,10 @@ class ExtVarBase(ProblemLogger):
Args: Args:
integrity_level (str): integrity level of the unit from 'A' to 'D' or 'QM' integrity_level (str): integrity level of the unit from 'A' to 'D' or 'QM'
""" """
self._disp_start = integrity_level['CVC']['DISP']['START'] self._disp_start = integrity_level["CVC"]["DISP"]["START"]
self._disp_end = integrity_level['CVC']['DISP']['END'] self._disp_end = integrity_level["CVC"]["DISP"]["END"]
self._decl_start = integrity_level['PREDECL']['DISP']['START'] self._decl_start = integrity_level["PREDECL"]["DISP"]["START"]
self._decl_end = integrity_level['PREDECL']['DISP']['END'] self._decl_end = integrity_level["PREDECL"]["DISP"]["END"]
def _get_byte_size_string(self, data_type): def _get_byte_size_string(self, data_type):
"""Get byte size of a data type as string. """Get byte size of a data type as string.
@ -64,10 +71,11 @@ class ExtVarBase(ProblemLogger):
Args: Args:
data_type (str): Data type. data_type (str): Data type.
Returns: Returns:
byte_size_string(pybuild.types.byte_size_string): Return result of pybuild.types.byte_size_string. byte_size_string(powertrain_build.types.byte_size_string): Return result of
powertrain_build.types.byte_size_string.
""" """
if data_type in self._enumerations: if data_type in self._enumerations:
return byte_size_string(self._enumerations[data_type]['underlying_data_type']) return byte_size_string(self._enumerations[data_type]["underlying_data_type"])
return byte_size_string(data_type) return byte_size_string(data_type)
def _get_bitmask(self, data_type): def _get_bitmask(self, data_type):
@ -77,10 +85,10 @@ class ExtVarBase(ProblemLogger):
Args: Args:
data_type (str): Data type. data_type (str): Data type.
Returns: Returns:
get_bitmask(pybuild.types.get_bitmask): Return result of pybuild.types.get_bitmask. get_bitmask(powertrain_build.types.get_bitmask): Return result of powertrain_build.types.get_bitmask.
""" """
if data_type in self._enumerations: if data_type in self._enumerations:
return get_bitmask(self._enumerations[data_type]['underlying_data_type']) return get_bitmask(self._enumerations[data_type]["underlying_data_type"])
return get_bitmask(data_type) return get_bitmask(data_type)
def _restruct_input_data(self): def _restruct_input_data(self):
@ -105,34 +113,27 @@ class ExtVarBase(ProblemLogger):
def _a2l_dict(self): def _a2l_dict(self):
"""Return a dict defining all parameters for a2l-generation.""" """Return a dict defining all parameters for a2l-generation."""
res = { res = {"vars": {}, "function": "VcExtVar"}
'vars': {},
'function': 'VcExtVar'
}
for inp in self.EXTERNAL_INPORT_TYPES: for inp in self.EXTERNAL_INPORT_TYPES:
if inp in self._var_dict: if inp in self._var_dict:
for var, data in self._var_dict[inp].items(): for var, data in self._var_dict[inp].items():
if data[self.TYPE_NAME] in self._enumerations: if data[self.TYPE_NAME] in self._enumerations:
data_type = self._enumerations[data[self.TYPE_NAME]]['underlying_data_type'] data_type = self._enumerations[data[self.TYPE_NAME]]["underlying_data_type"]
else: else:
data_type = data[self.TYPE_NAME] data_type = data[self.TYPE_NAME]
resv = res['vars'] resv = res["vars"]
resv.setdefault(var, {})['a2l_data'] = self.get_a2l_format(data) resv.setdefault(var, {})["a2l_data"] = self.get_a2l_format(data)
resv[var]['array'] = [] resv[var]["array"] = []
resv[var]['function'] = ['VcEc'] resv[var]["function"] = ["VcEc"]
resv[var]['var'] = { resv[var]["var"] = {"cvc_type": "CVC_DISP", "type": data_type, "var": var}
'cvc_type': 'CVC_DISP',
'type': data_type,
'var': var
}
return res return res
def _generate_c_file(self, path): def _generate_c_file(self, path):
"""Generate the c-file defining all the supplier input signals.""" """Generate the c-file defining all the supplier input signals."""
header = path.with_suffix('.h').name header = path.with_suffix(".h").name
var_set = set() var_set = set()
with path.open('w') as fh_c: with path.open("w") as fh_c:
fh_c.write(f'#include "{header}"\n') fh_c.write(f'#include "{header}"\n')
fh_c.write(f'#include "{self._disp_start}"\n\n') fh_c.write(f'#include "{self._disp_start}"\n\n')
for data_type_s, ext_vars in self._ext_vars[self.INPORT_INDEX].items(): for data_type_s, ext_vars in self._ext_vars[self.INPORT_INDEX].items():
@ -142,27 +143,27 @@ class ExtVarBase(ProblemLogger):
if var not in var_set: if var not in var_set:
fh_c.write(f"CVC_DISP {data[self.TYPE_NAME]} {var} = {data['init']};\n") fh_c.write(f"CVC_DISP {data[self.TYPE_NAME]} {var} = {data['init']};\n")
var_set.add(var) var_set.add(var)
fh_c.write('\n') fh_c.write("\n")
fh_c.write(f'\n#include "{self._disp_end}"\n') fh_c.write(f'\n#include "{self._disp_end}"\n')
self.info('Generated %s', path.name) self.info("Generated %s", path.name)
def _generate_h_file(self, path): def _generate_h_file(self, path):
"""Generate header file externally declaring interface signals.""" """Generate header file externally declaring interface signals."""
filename = path.stem filename = path.stem
guard = f"{filename.upper()}_H" guard = f"{filename.upper()}_H"
var_set = set() var_set = set()
with path.open('w') as fh_c: with path.open("w") as fh_c:
fh_c.write(f'#ifndef {guard}\n') fh_c.write(f"#ifndef {guard}\n")
fh_c.write(f'#define {guard}\n') fh_c.write(f"#define {guard}\n")
fh_c.write('#define CVC_DISP\n') fh_c.write("#define CVC_DISP\n")
fh_c.write(self._unit_cfg.base_types_headers) fh_c.write(self._unit_cfg.base_types_headers)
for common_header_file in self._common_header_files: for common_header_file in self._common_header_files:
fh_c.write(f'#include "{common_header_file}"\n') fh_c.write(f'#include "{common_header_file}"\n')
fh_c.write('\n') fh_c.write("\n")
fh_c.write(f'#include "{self._decl_start}"\n') fh_c.write(f'#include "{self._decl_start}"\n')
fh_c.write('/* VCC Inports */\n') fh_c.write("/* VCC Inports */\n")
for data_type_s, ext_vars in self._ext_vars[self.INPORT_INDEX].items(): for data_type_s, ext_vars in self._ext_vars[self.INPORT_INDEX].items():
fh_c.write(f"/* Variables of size {data_type_s} bytes */\n\n") fh_c.write(f"/* Variables of size {data_type_s} bytes */\n\n")
for var in sorted(ext_vars.keys()): for var in sorted(ext_vars.keys()):
@ -170,9 +171,9 @@ class ExtVarBase(ProblemLogger):
data = ext_vars[var] data = ext_vars[var]
fh_c.write(f"extern CVC_DISP {data[self.TYPE_NAME]} {var};\n") fh_c.write(f"extern CVC_DISP {data[self.TYPE_NAME]} {var};\n")
var_set.add(var) var_set.add(var)
fh_c.write('\n') fh_c.write("\n")
fh_c.write('/* VCC Outports */\n') fh_c.write("/* VCC Outports */\n")
for data_type_s, ext_vars in self._ext_vars[self.OUTPORT_INDEX].items(): for data_type_s, ext_vars in self._ext_vars[self.OUTPORT_INDEX].items():
fh_c.write(f"/* Variables of size {data_type_s} bytes */\n\n") fh_c.write(f"/* Variables of size {data_type_s} bytes */\n\n")
for var in sorted(ext_vars.keys()): for var in sorted(ext_vars.keys()):
@ -180,22 +181,22 @@ class ExtVarBase(ProblemLogger):
data = ext_vars[var] data = ext_vars[var]
fh_c.write(f"extern CVC_DISP {data[self.TYPE_NAME]} {var};\n") fh_c.write(f"extern CVC_DISP {data[self.TYPE_NAME]} {var};\n")
var_set.add(var) var_set.add(var)
fh_c.write('\n') fh_c.write("\n")
fh_c.write(f'#include "{self._decl_end}"\n') fh_c.write(f'#include "{self._decl_end}"\n')
fh_c.write('#endif\n') fh_c.write("#endif\n")
self.info('Generated %s', path.name) self.info("Generated %s", path.name)
def generate_files(self, path): def generate_files(self, path):
"""Generate the c- and a2l-file for defining all the supplier input variables.""" """Generate the c- and a2l-file for defining all the supplier input variables."""
self._restruct_input_data() self._restruct_input_data()
if not self._ext_vars[0] and not self._ext_vars[1]: if not self._ext_vars[0] and not self._ext_vars[1]:
self.info(f'Skipping {path.name} as there were no corresponding vars.') self.info(f"Skipping {path.name} as there were no corresponding vars.")
return return
self._generate_c_file(path.with_suffix('.c')) self._generate_c_file(path.with_suffix(".c"))
self._generate_h_file(path.with_suffix('.h')) self._generate_h_file(path.with_suffix(".h"))
a2l_dict = self._a2l_dict() a2l_dict = self._a2l_dict()
a2l = A2l(a2l_dict, self._prj_cfg) a2l = A2l(a2l_dict, self._prj_cfg)
a2l.gen_a2l(path.with_suffix('.a2l')) a2l.gen_a2l(path.with_suffix(".a2l"))
class ExtVarCsv(ExtVarBase): class ExtVarCsv(ExtVarBase):
@ -228,9 +229,10 @@ class ExtVarCsv(ExtVarBase):
'xxx-Output': ... 'xxx-Output': ...
} }
""" """
EXTERNAL_INPORT_TYPES = ['EMS-Input', 'CAN-Input', 'Private CAN-Input', 'LIN-Input']
EXTERNAL_OUTPORT_TYPES = ['EMS-Output', 'CAN-Output', 'Private CAN-Output', 'LIN-Output'] EXTERNAL_INPORT_TYPES = ["EMS-Input", "CAN-Input", "Private CAN-Input", "LIN-Input"]
TYPE_NAME = 'type' EXTERNAL_OUTPORT_TYPES = ["EMS-Output", "CAN-Output", "Private CAN-Output", "LIN-Output"]
TYPE_NAME = "type"
def get_a2l_format(self, data): def get_a2l_format(self, data):
"""Get a2l format. """Get a2l format.
@ -241,15 +243,15 @@ class ExtVarCsv(ExtVarBase):
dict: A2l format dictionary. dict: A2l format dictionary.
""" """
return { return {
'bitmask': self._get_bitmask(data[self.TYPE_NAME]), "bitmask": self._get_bitmask(data[self.TYPE_NAME]),
'description': data['description'], "description": data["description"],
'lsb': '2^0', "lsb": "2^0",
'max': data['max'], "max": data["max"],
'min': data['min'], "min": data["min"],
'offset': '0', "offset": "0",
'unit': data['unit'], "unit": data["unit"],
'x_axis': None, "x_axis": None,
'y_axis': None "y_axis": None,
} }
@ -271,9 +273,10 @@ class ExtVarYaml(ExtVarBase):
'status': {}, 'status': {},
} }
""" """
EXTERNAL_INPORT_TYPES = ['input', 'status']
EXTERNAL_OUTPORT_TYPES = ['output'] EXTERNAL_INPORT_TYPES = ["input", "status"]
TYPE_NAME = 'variable_type' EXTERNAL_OUTPORT_TYPES = ["output"]
TYPE_NAME = "variable_type"
def get_a2l_format(self, data): def get_a2l_format(self, data):
"""Get a2l format. """Get a2l format.
@ -284,13 +287,13 @@ class ExtVarYaml(ExtVarBase):
dict: A2l format dictionary. dict: A2l format dictionary.
""" """
return { return {
'bitmask': self._get_bitmask(data[self.TYPE_NAME]), "bitmask": self._get_bitmask(data[self.TYPE_NAME]),
'description': data['description'], "description": data["description"],
'lsb': '2^0', "lsb": "2^0",
'max': data['range']['max'], "max": data["range"]["max"],
'min': data['range']['min'], "min": data["range"]["min"],
'offset': '0', "offset": "0",
'unit': data['unit'], "unit": data["unit"],
'x_axis': None, "x_axis": None,
'y_axis': None "y_axis": None,
} }

@ -10,9 +10,9 @@ import os
import re import re
from pprint import pformat from pprint import pformat
from pybuild.lib.helper_functions import deep_dict_update from powertrain_build.lib.helper_functions import deep_dict_update
from pybuild.problem_logger import ProblemLogger from powertrain_build.problem_logger import ProblemLogger
from pybuild.xlrd_csv import WorkBook from powertrain_build.xlrd_csv import WorkBook
class FeatureConfigs(ProblemLogger): class FeatureConfigs(ProblemLogger):

@ -7,10 +7,10 @@ import os
from copy import deepcopy from copy import deepcopy
from numpy import array from numpy import array
from scipy.io import savemat from scipy.io import savemat
from pybuild.signal_interfaces import SignalInterfaces from powertrain_build.signal_interfaces import SignalInterfaces
from pybuild.unit_configs import UnitConfigs from powertrain_build.unit_configs import UnitConfigs
from pybuild.lib.helper_functions import merge_dicts from powertrain_build.lib.helper_functions import merge_dicts
from pybuild.problem_logger import ProblemLogger from powertrain_build.problem_logger import ProblemLogger
def _get_signals_by_type(signal_conf, signal_type): def _get_signals_by_type(signal_conf, signal_type):

@ -8,10 +8,10 @@ import json
import sys import sys
from xml.etree import ElementTree from xml.etree import ElementTree
from pathlib import Path from pathlib import Path
from pybuild.feature_configs import FeatureConfigs from powertrain_build.feature_configs import FeatureConfigs
from pybuild.unit_configs import UnitConfigs from powertrain_build.unit_configs import UnitConfigs
from pybuild.signal_interfaces import CsvSignalInterfaces from powertrain_build.signal_interfaces import CsvSignalInterfaces
from pybuild.lib import helper_functions, logger from powertrain_build.lib import helper_functions, logger
LOGGER = logger.create_logger(__file__) LOGGER = logger.create_logger(__file__)

@ -1,4 +1,4 @@
# Copyright 2024 Volvo Car Corporation # Copyright 2024 Volvo Car Corporation
# Licensed under Apache 2.0. # Licensed under Apache 2.0.
"""pybuild.zone_controller.""" """powertrain_build.interface."""

@ -7,12 +7,12 @@
from pathlib import Path from pathlib import Path
import json import json
from pybuild.interface.base import BaseApplication, Signal, MultipleProducersError, Domain, Interface from powertrain_build.interface.base import BaseApplication, Signal, MultipleProducersError, Domain, Interface
from pybuild.lib import logger from powertrain_build.lib import logger
from pybuild.build_proj_config import BuildProjConfig from powertrain_build.build_proj_config import BuildProjConfig
from pybuild.feature_configs import FeatureConfigs from powertrain_build.feature_configs import FeatureConfigs
from pybuild.unit_configs import UnitConfigs from powertrain_build.unit_configs import UnitConfigs
from pybuild.user_defined_types import UserDefinedTypes from powertrain_build.user_defined_types import UserDefinedTypes
LOGGER = logger.create_logger("application") LOGGER = logger.create_logger("application")
@ -202,7 +202,7 @@ class Application(BaseApplication):
self._methods.append(method) self._methods.append(method)
def get_signal_properties(self, signal): def get_signal_properties(self, signal):
""" Get properties for the signal from pybuild definition. """ Get properties for the signal from powertrain_build definition.
Args: Args:
signal (Signal): Signal object signal (Signal): Signal object
@ -217,10 +217,10 @@ class Application(BaseApplication):
return {} return {}
def get_rasters(self): def get_rasters(self):
""" Get rasters parsed from pybuild. """ Get rasters parsed from powertrain_build.
Returns: Returns:
rasters (list): rasters parsed from pybuild rasters (list): rasters parsed from powertrain_build
""" """
if self._signals is None: if self._signals is None:
self._get_signals() self._get_signals()
@ -282,7 +282,7 @@ class Raster(BaseApplication):
"""Construct a new Raster object. """Construct a new Raster object.
Args: Args:
app (pybuild.interface.application.Application): Pybuild project raster is part of app (powertrain_build.interface.application.Application): Pybuild project raster is part of
""" """
self.app = app self.app = app
self.name = str() self.name = str()
@ -292,7 +292,7 @@ class Raster(BaseApplication):
self.models = set() self.models = set()
def parse_definition(self, definition): def parse_definition(self, definition):
""" Parse the definition from pybuild. """ Parse the definition from powertrain_build.
Args: Args:
definition (tuple): definition (tuple):
@ -330,7 +330,7 @@ class Raster(BaseApplication):
self._outsignals.add(signal.name) self._outsignals.add(signal.name)
def get_signal_properties(self, signal): def get_signal_properties(self, signal):
""" Get properties for the signal from pybuild definition. """ Get properties for the signal from powertrain_build definition.
Args: Args:
signal (Signal): Signal object signal (Signal): Signal object
@ -354,7 +354,7 @@ class Model(BaseApplication):
self._signal_specs = None self._signal_specs = None
def get_signal_properties(self, signal): def get_signal_properties(self, signal):
""" Get properties for the signal from pybuild definition. """ Get properties for the signal from powertrain_build definition.
Args: Args:
signal (Signal): Signal object signal (Signal): Signal object
@ -410,7 +410,7 @@ class Model(BaseApplication):
return json.load(fhndl) return json.load(fhndl)
def parse_definition(self, definition): def parse_definition(self, definition):
""" Parse the definition from pybuild. """ Parse the definition from powertrain_build.
Args: Args:
definition (tuple): definition (tuple):
@ -428,7 +428,7 @@ class Method(BaseApplication):
"""Construct a new Method object. """Construct a new Method object.
Args: Args:
app (pybuild.interface.application.Application): Pybuild project raster is part of. app (powertrain_build.interface.application.Application): Pybuild project raster is part of.
unit (str): Model that the method is defined in. unit (str): Model that the method is defined in.
""" """
self.app = app self.app = app
@ -444,7 +444,7 @@ class Method(BaseApplication):
self._properties = {} self._properties = {}
def parse_definition(self, definition): def parse_definition(self, definition):
""" Parse the definition from pybuild. """ Parse the definition from powertrain_build.
Args: Args:
definition (tuple): definition (tuple):

@ -5,7 +5,7 @@
"""Python module used for abstracting an application that should be interfacing others.""" """Python module used for abstracting an application that should be interfacing others."""
from abc import abstractmethod from abc import abstractmethod
from ruamel.yaml import YAML from ruamel.yaml import YAML
from pybuild.lib import logger from powertrain_build.lib import logger
LOGGER = logger.create_logger('base') LOGGER = logger.create_logger('base')

@ -6,8 +6,8 @@
import enum import enum
from ruamel.yaml import YAML from ruamel.yaml import YAML
from abc import abstractmethod from abc import abstractmethod
from pybuild.interface.base import BaseApplication, Signal from powertrain_build.interface.base import BaseApplication, Signal
from pybuild.lib import logger from powertrain_build.lib import logger
LOGGER = logger.create_logger("service") LOGGER = logger.create_logger("service")

@ -4,8 +4,8 @@
"""Python module used for reading device proxy arxml:s""" """Python module used for reading device proxy arxml:s"""
from ruamel.yaml import YAML from ruamel.yaml import YAML
import enum import enum
from pybuild.interface.base import BaseApplication, Signal from powertrain_build.interface.base import BaseApplication, Signal
from pybuild.lib import logger from powertrain_build.lib import logger
LOGGER = logger.create_logger("device_proxy") LOGGER = logger.create_logger("device_proxy")

@ -4,10 +4,10 @@
"""Module for extraction Energy Management System""" """Module for extraction Energy Management System"""
import os import os
from pybuild.interface.base import BaseApplication, Signal from powertrain_build.interface.base import BaseApplication, Signal
from pybuild.lib import logger from powertrain_build.lib import logger
from pybuild.signal_interfaces import CsvSignalInterfaces from powertrain_build.signal_interfaces import CsvSignalInterfaces
from pybuild.build_proj_config import BuildProjConfig from powertrain_build.build_proj_config import BuildProjConfig
LOGGER = logger.create_logger(__file__) LOGGER = logger.create_logger(__file__)

@ -1,7 +1,7 @@
# Copyright 2024 Volvo Car Corporation # Copyright 2024 Volvo Car Corporation
# Licensed under Apache 2.0. # Licensed under Apache 2.0.
"""Module to export information of global variables from pybuild projects.""" """Module to export information of global variables from powertrain_build projects."""
import argparse import argparse
import os import os
@ -10,9 +10,9 @@ from typing import Dict, Tuple
from ruamel.yaml import YAML from ruamel.yaml import YAML
from pybuild.build_proj_config import BuildProjConfig from powertrain_build.build_proj_config import BuildProjConfig
from pybuild.feature_configs import FeatureConfigs from powertrain_build.feature_configs import FeatureConfigs
from pybuild.unit_configs import UnitConfigs from powertrain_build.unit_configs import UnitConfigs
def get_global_variables(project_config_path: str) -> Dict: def get_global_variables(project_config_path: str) -> Dict:
@ -53,7 +53,7 @@ def _get_variable_type(variable_info: Dict) -> str:
def _get_project_data(project_config_path: str) -> Tuple[str, Dict]: def _get_project_data(project_config_path: str) -> Tuple[str, Dict]:
"""Gets data for a pybuild project. """Gets data for a powertrain-build project.
Args: Args:
project_config_path (str): Path to ProjectCfg.json file. project_config_path (str): Path to ProjectCfg.json file.

@ -5,13 +5,13 @@
"""Python module used for calculating interfaces for CSP""" """Python module used for calculating interfaces for CSP"""
from pathlib import Path from pathlib import Path
from os import path from os import path
from pybuild.interface.hal import HALA from powertrain_build.interface.hal import HALA
from pybuild.interface.device_proxy import DPAL from powertrain_build.interface.device_proxy import DPAL
from pybuild.interface.service import ServiceFramework from powertrain_build.interface.service import ServiceFramework
from pybuild.interface import simulink from powertrain_build.interface import simulink
from pybuild.lib import logger from powertrain_build.lib import logger
from pybuild.interface import generation_utils from powertrain_build.interface import generation_utils
from pybuild.lib.helper_functions import deep_json_update from powertrain_build.lib.helper_functions import deep_json_update
LOGGER = logger.create_logger("CSP adapters") LOGGER = logger.create_logger("CSP adapters")

@ -4,9 +4,9 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
"""Python module used for calculating interfaces for CSP HI""" """Python module used for calculating interfaces for CSP HI"""
from pathlib import Path from pathlib import Path
from pybuild.interface import generation_utils from powertrain_build.interface import generation_utils
from pybuild.interface.device_proxy import DPAL from powertrain_build.interface.device_proxy import DPAL
from pybuild.lib.helper_functions import recursive_default_dict, to_normal_dict from powertrain_build.lib.helper_functions import recursive_default_dict, to_normal_dict
OP_READ = 'read' OP_READ = 'read'
OP_WRITE = 'write' OP_WRITE = 'write'

@ -4,9 +4,9 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
"""Python module used for calculating interfaces for CSP""" """Python module used for calculating interfaces for CSP"""
from pathlib import Path from pathlib import Path
from pybuild.interface.service import get_service from powertrain_build.interface.service import get_service
from pybuild.lib import logger from powertrain_build.lib import logger
from pybuild.interface import generation_utils from powertrain_build.interface import generation_utils
LOGGER = logger.create_logger("CSP service") LOGGER = logger.create_logger("CSP service")

@ -4,11 +4,11 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
"""Python module used for calculating interfaces for CSP""" """Python module used for calculating interfaces for CSP"""
from pathlib import Path from pathlib import Path
from pybuild.interface.hal import HALA, get_hal_list from powertrain_build.interface.hal import HALA, get_hal_list
from pybuild.interface.device_proxy import DPAL from powertrain_build.interface.device_proxy import DPAL
from pybuild.interface.service import ServiceFramework, get_service_list from powertrain_build.interface.service import ServiceFramework, get_service_list
from pybuild.lib import logger from powertrain_build.lib import logger
from pybuild.interface import generation_utils from powertrain_build.interface import generation_utils
LOGGER = logger.create_logger("CSP wrappers") LOGGER = logger.create_logger("CSP wrappers")

@ -6,9 +6,9 @@
import argparse import argparse
from ruamel.yaml import YAML from ruamel.yaml import YAML
from pathlib import Path from pathlib import Path
from pybuild.interface.application import Application, get_internal_domain from powertrain_build.interface.application import Application, get_internal_domain
from pybuild.interface.base import filter_signals from powertrain_build.interface.base import filter_signals
from pybuild.lib import logger from powertrain_build.lib import logger
LOGGER = logger.create_logger("CSP interface generation utils") LOGGER = logger.create_logger("CSP interface generation utils")
@ -43,7 +43,7 @@ def process_app(config):
Args: Args:
config (pathlib.Path): Path to the ProjectCfg.json config (pathlib.Path): Path to the ProjectCfg.json
Returns: Returns:
app (Application): pybuild project app (Application): powertrain-build project
""" """
app = Application() app = Application()
app.parse_definition(config) app.parse_definition(config)

@ -5,8 +5,8 @@
import re import re
from pathlib import Path from pathlib import Path
from ruamel.yaml import YAML from ruamel.yaml import YAML
from pybuild.interface.csp_api import CspApi from powertrain_build.interface.csp_api import CspApi
from pybuild.lib import logger from powertrain_build.lib import logger
LOGGER = logger.create_logger('base') LOGGER = logger.create_logger('base')

@ -8,8 +8,8 @@ import logging
from pathlib import Path from pathlib import Path
from voluptuous import All, MultipleInvalid, Optional, Required, Schema from voluptuous import All, MultipleInvalid, Optional, Required, Schema
from ruamel.yaml import YAML from ruamel.yaml import YAML
from pybuild.interface.application import Application from powertrain_build.interface.application import Application
from pybuild.interface.base import BaseApplication from powertrain_build.interface.base import BaseApplication
class ModelYmlVerification(BaseApplication): class ModelYmlVerification(BaseApplication):
@ -310,7 +310,7 @@ def get_app(project_config):
Args: Args:
config (pathlib.Path): Path to the ProjectCfg.json. config (pathlib.Path): Path to the ProjectCfg.json.
Returns: Returns:
app (Application): pybuild project. app (Application): powertrain-build project.
""" """
app = Application() app = Application()
app.parse_definition(project_config) app.parse_definition(project_config)

@ -6,10 +6,10 @@
import re import re
from pybuild.interface.base import filter_signals from powertrain_build.interface.base import filter_signals
from pybuild.interface.csp_api import CspApi from powertrain_build.interface.csp_api import CspApi
from pybuild.interface.application import get_internal_domain from powertrain_build.interface.application import get_internal_domain
from pybuild.lib import logger from powertrain_build.lib import logger
LOGGER = logger.create_logger("service") LOGGER = logger.create_logger("service")

@ -4,7 +4,7 @@
"""Module to handle the Simulink interface.""" """Module to handle the Simulink interface."""
from pybuild.lib import logger from powertrain_build.lib import logger
LOGGER = logger.create_logger("simulink") LOGGER = logger.create_logger("simulink")

@ -7,8 +7,8 @@
import argparse import argparse
from pathlib import Path from pathlib import Path
from ruamel.yaml import YAML from ruamel.yaml import YAML
from pybuild.interface.application import Application from powertrain_build.interface.application import Application
from pybuild.interface.base import BaseApplication from powertrain_build.interface.base import BaseApplication
class BadYamlFormat(Exception): class BadYamlFormat(Exception):
@ -148,7 +148,7 @@ def get_app(config):
Args: Args:
config (pathlib.Path): Path to the ProjectCfg.json. config (pathlib.Path): Path to the ProjectCfg.json.
Returns: Returns:
app (Application): pybuild project. app (Application): powertrain_build project.
""" """
app = Application() app = Application()
app.parse_definition(config) app.parse_definition(config)

@ -3,8 +3,8 @@
"""Python module used for handling zone controller specifications""" """Python module used for handling zone controller specifications"""
from ruamel.yaml import YAML from ruamel.yaml import YAML
from pybuild.lib import logger from powertrain_build.lib import logger
from pybuild.interface.base import BaseApplication from powertrain_build.interface.base import BaseApplication
LOGGER = logger.create_logger("base") LOGGER = logger.create_logger("base")

@ -1,4 +1,4 @@
# Copyright 2024 Volvo Car Corporation # Copyright 2024 Volvo Car Corporation
# Licensed under Apache 2.0. # Licensed under Apache 2.0.
"""pybuild.lib.""" """powertrain_build.lib."""

@ -4,7 +4,7 @@
function updateCodeSwConfig(RootFolder, model_path) function updateCodeSwConfig(RootFolder, model_path)
% updateCodeSwConfig(RootFolder, model_path) % updateCodeSwConfig(RootFolder, model_path)
% %
% Executes 'py -3.6 -m pybuild.config models' for the model. % Executes 'py -3.6 -m powertrain_build.config models' for the model.
% This script reads the .json, .c and .h-files and looks for configs for % This script reads the .json, .c and .h-files and looks for configs for
% the variables that already have a config in the json. % the variables that already have a config in the json.
% %
@ -13,26 +13,19 @@ function updateCodeSwConfig(RootFolder, model_path)
% model_path: Path to the model to regenerate config for. % model_path: Path to the model to regenerate config for.
old_pythonpath = getenv('PYTHONPATH'); old_pythonpath = getenv('PYTHONPATH');
if ~isempty(getenv('PYBUILD_ACTIVATE')) if ~isempty(getenv('PYTOOLS_ACTIVATE'))
% Repo using venv in Zuul/Jenkins. [~, out]=system(['CALL %PYTOOLS_ACTIVATE% & python -m powertrain_build.config models "' model_path '"']);
% Installs pytools python package and dependencies, see Script/PyTools/setup_pytools.*.
[~, out]=system(['CALL %PYBUILD_ACTIVATE% & python -m pybuild.config models "' model_path '"']);
elseif ~isempty(getenv('VENV_FOLDER'))
% Legacy, repo using venv in Zuul/Jenkins.
% Repo using pytools folder but it's dependencies in a venv.
[~, out]=system(['CALL %VENV_FOLDER%\Scripts\activate.bat & python -m pybuild.config models "' model_path '"']);
elseif ~isempty(getenv('CALLING_PYTHON')) elseif ~isempty(getenv('CALLING_PYTHON'))
% Local run using calling python version % Local run using calling python version
fprintf('\nUsing calling python: %s\n', getenv('CALLING_PYTHON')); fprintf('\nUsing calling python: %s\n', getenv('CALLING_PYTHON'));
setenv('PYTHONPATH', RootFolder) setenv('PYTHONPATH', RootFolder)
[~, out]=system(['%CALLING_PYTHON% -m pybuild.config models "' model_path '"']); [~, out]=system(['%CALLING_PYTHON% -m powertrain_build.config models "' model_path '"']);
else else
% Local run % Local run
fprintf('\nUsing python version 3.6\n'); fprintf('\nUsing python version 3.6\n');
setenv('PYTHONPATH', RootFolder) setenv('PYTHONPATH', RootFolder)
[~, out]=system(['py -3.6 -m pybuild.config models "' model_path '"']); [~, out]=system(['py -3.6 -m powertrain_build.config models "' model_path '"']);
end end
disp(out) disp(out)
setenv('PYTHONPATH', old_pythonpath) setenv('PYTHONPATH', old_pythonpath)
end end

@ -23,7 +23,7 @@ dsdd_manage_project('SetProjectFile', dd_file(1).name);
tl_pref('set', 'projectfileautosave', 'off'); tl_pref('set', 'projectfileautosave', 'off');
% Init Pybuild % Init Pybuild
disp('Initializing pybuild') disp('Initializing powertrain-build')
Models = Init_Models('Models'); Models = Init_Models('Models');
Projects = Init_Projects('Projects', Models); Projects = Init_Projects('Projects', Models);
QuantityUnitList = Read_Units(); QuantityUnitList = Read_Units();

Some files were not shown because too many files have changed in this diff Show More