From 8d75c10b552abef309e84ac7709257c03c19e34e Mon Sep 17 00:00:00 2001 From: Ayssar_Juelich Date: Wed, 14 Jun 2023 16:30:40 +0200 Subject: [PATCH 1/5] Split process into sub-routine --- pynestml/frontend/pynestml_frontend.py | 76 ++++++++++++++++++-------- 1 file changed, 52 insertions(+), 24 deletions(-) diff --git a/pynestml/frontend/pynestml_frontend.py b/pynestml/frontend/pynestml_frontend.py index 4f896fa1b..2131e3ed4 100644 --- a/pynestml/frontend/pynestml_frontend.py +++ b/pynestml/frontend/pynestml_frontend.py @@ -278,16 +278,17 @@ def main() -> int: return int(process()) -def process(): +def get_parsed_models(): r""" - The main toolchain workflow entry point. For all models: parse, validate, transform, generate code and build. + Handle the parsing, validation and transformation of the NESTML files Returns ------- + models: Sequence[Union[ASTNeuron, ASTSynapse]] + List of correctly parsed models errors_occurred : bool Flag indicating whether errors occurred during processing """ - # init log dir create_report_dir() @@ -305,21 +306,10 @@ def process(): parsed_unit = ModelParser.parse_model(nestml_file) if parsed_unit is None: # Parsing error in the NESTML model, return True - return True + return [], True compilation_units.append(parsed_unit) - # initialize and set options for transformers, code generator and builder - codegen_and_builder_opts = FrontendConfiguration.get_codegen_opts() - transformers, codegen_and_builder_opts = transformers_from_target_name(FrontendConfiguration.get_target_platform(), - options=codegen_and_builder_opts) - _codeGenerator = code_generator_from_target_name(FrontendConfiguration.get_target_platform()) - codegen_and_builder_opts = _codeGenerator.set_options(codegen_and_builder_opts) - _builder, codegen_and_builder_opts = builder_from_target_name(FrontendConfiguration.get_target_platform(), options=codegen_and_builder_opts) - - if len(codegen_and_builder_opts) > 0: - raise CodeGeneratorOptionsException("The code generator option(s) \"" + ", ".join(codegen_and_builder_opts.keys()) + "\" do not exist.") - if len(compilation_units) > 0: # generate a list of all neurons + synapses models: Sequence[Union[ASTNeuron, ASTSynapse]] = [] @@ -337,24 +327,62 @@ def process(): Logger.log_message(node=model, code=code, message=message, error_position=model.get_source_position(), log_level=LoggingLevel.WARNING) - return True + return [model], True - # run transformers - for transformer in transformers: + + return models, False + +def transform_models(transformers): + for transformer in transformers: models = transformer.transform(models) + return models + +def generate_code(code_generators, models): + code_generators.generate_code(models) + + + +def process(): + r""" + The main toolchain workflow entry point. For all models: parse, validate, transform, generate code and build. + + Returns + ------- + errors_occurred : bool + Flag indicating whether errors occurred during processing + """ + + # initialize and set options for transformers, code generator and builder + codegen_and_builder_opts = FrontendConfiguration.get_codegen_opts() + + transformers, codegen_and_builder_opts = transformers_from_target_name(FrontendConfiguration.get_target_platform(), + options=codegen_and_builder_opts) + + code_generator = code_generator_from_target_name(FrontendConfiguration.get_target_platform()) + codegen_and_builder_opts = code_generator.set_options(codegen_and_builder_opts) + + _builder, codegen_and_builder_opts = builder_from_target_name(FrontendConfiguration.get_target_platform(), options=codegen_and_builder_opts) + + if len(codegen_and_builder_opts) > 0: + raise CodeGeneratorOptionsException("The code generator option(s) \"" + ", ".join(codegen_and_builder_opts.keys()) + "\" do not exist.") + + + models, errors_occurred = get_parsed_models() - # perform code generation - _codeGenerator.generate_code(models) + if not errors_occurred: + models = transform_models(transformers, models) + generate_code(code_generator, models) + - # perform build - if _builder is not None: - _builder.build() + # perform build + if _builder is not None: + _builder.build() if FrontendConfiguration.store_log: store_log_to_file() # Everything is fine, return false, i.e., no errors have occurred. - return False + return errors_occurred def init_predefined(): From bd8b8d8ca29564ab723c8bfe97221907710441eb Mon Sep 17 00:00:00 2001 From: Ayssar_Juelich Date: Wed, 14 Jun 2023 16:36:28 +0200 Subject: [PATCH 2/5] Fix static check --- pynestml/frontend/pynestml_frontend.py | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/pynestml/frontend/pynestml_frontend.py b/pynestml/frontend/pynestml_frontend.py index 2131e3ed4..cff0ab5a4 100644 --- a/pynestml/frontend/pynestml_frontend.py +++ b/pynestml/frontend/pynestml_frontend.py @@ -329,19 +329,19 @@ def get_parsed_models(): log_level=LoggingLevel.WARNING) return [model], True - return models, False - + + def transform_models(transformers): for transformer in transformers: - models = transformer.transform(models) + models = transformer.transform(models) return models + def generate_code(code_generators, models): code_generators.generate_code(models) - - + def process(): r""" The main toolchain workflow entry point. For all models: parse, validate, transform, generate code and build. @@ -354,25 +354,23 @@ def process(): # initialize and set options for transformers, code generator and builder codegen_and_builder_opts = FrontendConfiguration.get_codegen_opts() - + transformers, codegen_and_builder_opts = transformers_from_target_name(FrontendConfiguration.get_target_platform(), options=codegen_and_builder_opts) - + code_generator = code_generator_from_target_name(FrontendConfiguration.get_target_platform()) codegen_and_builder_opts = code_generator.set_options(codegen_and_builder_opts) - + _builder, codegen_and_builder_opts = builder_from_target_name(FrontendConfiguration.get_target_platform(), options=codegen_and_builder_opts) if len(codegen_and_builder_opts) > 0: raise CodeGeneratorOptionsException("The code generator option(s) \"" + ", ".join(codegen_and_builder_opts.keys()) + "\" do not exist.") - models, errors_occurred = get_parsed_models() if not errors_occurred: models = transform_models(transformers, models) generate_code(code_generator, models) - # perform build if _builder is not None: @@ -381,7 +379,6 @@ def process(): if FrontendConfiguration.store_log: store_log_to_file() - # Everything is fine, return false, i.e., no errors have occurred. return errors_occurred From bc2b67e83ab7f81d295232b9fecb13cba2e02e8d Mon Sep 17 00:00:00 2001 From: Ayssar_Juelich Date: Wed, 14 Jun 2023 16:55:28 +0200 Subject: [PATCH 3/5] Fix test error --- pynestml/frontend/pynestml_frontend.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pynestml/frontend/pynestml_frontend.py b/pynestml/frontend/pynestml_frontend.py index cff0ab5a4..7cb15c66d 100644 --- a/pynestml/frontend/pynestml_frontend.py +++ b/pynestml/frontend/pynestml_frontend.py @@ -332,7 +332,7 @@ def get_parsed_models(): return models, False -def transform_models(transformers): +def transform_models(transformers, models): for transformer in transformers: models = transformer.transform(models) return models From 5b6d901f94b928db3da7be352b8196b3528bfa77 Mon Sep 17 00:00:00 2001 From: Ayssar_Juelich Date: Thu, 15 Jun 2023 10:28:31 +0200 Subject: [PATCH 4/5] Implement JIT required funcs --- pynestml/frontend/pynestml_frontend.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/pynestml/frontend/pynestml_frontend.py b/pynestml/frontend/pynestml_frontend.py index 7cb15c66d..c8c6628d5 100644 --- a/pynestml/frontend/pynestml_frontend.py +++ b/pynestml/frontend/pynestml_frontend.py @@ -154,6 +154,17 @@ def generate_target(input_path: Union[str, Sequence[str]], target_platform: str, codegen_opts : Optional[Mapping[str, Any]] A dictionary containing additional options for the target code generator. """ + + configure_front_end(input_path, target_platform, target_path, install_path, logging_level, + module_name, store_log, suffix, dev, codegen_opts) + if not process() == 0: + raise Exception("Error(s) occurred while processing the model") + + +def configure_front_end(input_path: Union[str, Sequence[str]], target_platform: str, target_path=None, + install_path: str = None, logging_level="ERROR", module_name=None, store_log=False, suffix="", + dev=False, codegen_opts: Optional[Mapping[str, Any]] = None): + args = list() args.append(qualifier_input_path_arg) if type(input_path) is str: @@ -195,9 +206,6 @@ def generate_target(input_path: Union[str, Sequence[str]], target_platform: str, if codegen_opts: FrontendConfiguration.set_codegen_opts(codegen_opts) - if not process() == 0: - raise Exception("Error(s) occurred while processing the model") - def generate_nest_target(input_path: Union[str, Sequence[str]], target_path: Optional[str] = None, install_path: Optional[str] = None, logging_level="ERROR", From 976908b17ed6e16b1b58e9b7391b4931bdf06662 Mon Sep 17 00:00:00 2001 From: clinssen Date: Thu, 17 Aug 2023 12:06:31 +0200 Subject: [PATCH 5/5] Update pynestml/frontend/pynestml_frontend.py Co-authored-by: Pooja Babu <75320801+pnbabu@users.noreply.github.com> --- pynestml/frontend/pynestml_frontend.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pynestml/frontend/pynestml_frontend.py b/pynestml/frontend/pynestml_frontend.py index c8c6628d5..3372028ea 100644 --- a/pynestml/frontend/pynestml_frontend.py +++ b/pynestml/frontend/pynestml_frontend.py @@ -288,7 +288,7 @@ def main() -> int: def get_parsed_models(): r""" - Handle the parsing, validation and transformation of the NESTML files + Handle the parsing and validation of the NESTML files Returns -------