From f932cde9f20024eb2baff5b0ea532a6bfc2f4a33 Mon Sep 17 00:00:00 2001 From: Anirudh Rengarajan <44007330+arengarajan99@users.noreply.github.com> Date: Wed, 22 Feb 2023 11:57:54 -0800 Subject: [PATCH 01/15] Add CMake control of building fed preamble --- org.lflang/src/lib/c/reactor-c | 2 +- .../src/org/lflang/federated/extensions/CExtensionUtils.java | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/org.lflang/src/lib/c/reactor-c b/org.lflang/src/lib/c/reactor-c index 2ec5deff12..133354ac49 160000 --- a/org.lflang/src/lib/c/reactor-c +++ b/org.lflang/src/lib/c/reactor-c @@ -1 +1 @@ -Subproject commit 2ec5deff12daf66ce106892083443fc85385d035 +Subproject commit 133354ac495189d6c7dbdd26430b52771f551fc6 diff --git a/org.lflang/src/org/lflang/federated/extensions/CExtensionUtils.java b/org.lflang/src/org/lflang/federated/extensions/CExtensionUtils.java index a24bcbae58..2f5ef587ba 100644 --- a/org.lflang/src/org/lflang/federated/extensions/CExtensionUtils.java +++ b/org.lflang/src/org/lflang/federated/extensions/CExtensionUtils.java @@ -577,6 +577,8 @@ public static String generateSerializationCMakeExtension( } } } + String relPath = "include" + File.separator + "_" + federate.name + "_preamble.c"; + code.pr("target_sources(${LF_MAIN_TARGET} PRIVATE " + relPath + ")"); return code.getCode(); } } From 8e2c4c6e27b465d81b70179e4094dc5a478bbb43 Mon Sep 17 00:00:00 2001 From: Anirudh Rengarajan <44007330+arengarajan99@users.noreply.github.com> Date: Wed, 22 Feb 2023 11:58:15 -0800 Subject: [PATCH 02/15] Add federate.h include into preamble --- org.lflang/src/org/lflang/generator/c/CPreambleGenerator.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/org.lflang/src/org/lflang/generator/c/CPreambleGenerator.java b/org.lflang/src/org/lflang/generator/c/CPreambleGenerator.java index 45e48f7d9c..6eb0606fd7 100644 --- a/org.lflang/src/org/lflang/generator/c/CPreambleGenerator.java +++ b/org.lflang/src/org/lflang/generator/c/CPreambleGenerator.java @@ -61,6 +61,9 @@ public static String generateIncludeStatements( code.pr("#include \"" + relPathHeader + "core/mixed_radix.h\""); code.pr("#include \"" + relPathHeader + "core/port.h\""); code.pr("int lf_reactor_c_main(int argc, const char* argv[]);"); + if(targetConfig.fedSetupPreamble != null) { + code.pr("#include \"" + relPathHeader + "core/federated/federate.h\""); + } if (cppMode || targetConfig.platformOptions.platform == Platform.ARDUINO) { code.pr("}"); } From 3724a4ba959861bb1bc43376dd581af08e7f677e Mon Sep 17 00:00:00 2001 From: Anirudh Rengarajan <44007330+arengarajan99@users.noreply.github.com> Date: Wed, 22 Feb 2023 11:58:55 -0800 Subject: [PATCH 03/15] Remove fedSetupPreamble --- org.lflang/src/org/lflang/generator/c/CGenerator.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/org.lflang/src/org/lflang/generator/c/CGenerator.java b/org.lflang/src/org/lflang/generator/c/CGenerator.java index a344a8c5a4..650169f759 100644 --- a/org.lflang/src/org/lflang/generator/c/CGenerator.java +++ b/org.lflang/src/org/lflang/generator/c/CGenerator.java @@ -2023,11 +2023,11 @@ protected String generateTopLevelPreambles() { CodeBuilder code = new CodeBuilder(); // preamble for federated execution setup - if (targetConfig.fedSetupPreamble != null) { - if (targetLanguageIsCpp()) code.pr("extern \"C\" {"); - code.pr("#include \"" + targetConfig.fedSetupPreamble + "\""); - if (targetLanguageIsCpp()) code.pr("}"); - } + // if (targetConfig.fedSetupPreamble != null) { + // if (targetLanguageIsCpp()) code.pr("extern \"C\" {"); + // code.pr("#include \"" + targetConfig.fedSetupPreamble + "\""); + // if (targetLanguageIsCpp()) code.pr("}"); + // } // user preambles if (this.mainDef != null) { From 0c57a49861403ee8d798b08e04b1ef99a541a405 Mon Sep 17 00:00:00 2001 From: Anirudh Rengarajan <44007330+arengarajan99@users.noreply.github.com> Date: Wed, 22 Feb 2023 11:59:43 -0800 Subject: [PATCH 04/15] Additional includes and tweaks to api calls --- .../federated/extensions/CExtension.java | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/org.lflang/src/org/lflang/federated/extensions/CExtension.java b/org.lflang/src/org/lflang/federated/extensions/CExtension.java index 1d6d2dea0e..fc0bde880c 100644 --- a/org.lflang/src/org/lflang/federated/extensions/CExtension.java +++ b/org.lflang/src/org/lflang/federated/extensions/CExtension.java @@ -522,7 +522,12 @@ protected String makePreamble( var code = new CodeBuilder(); - code.pr("#include \"../federated/federate.c\""); + code.pr("#include \"core/federated/federate.h\""); + code.pr("#include \"core/federated/net_common.h\""); + code.pr("#include \"core/federated/net_util.h\""); + code.pr("#include \"core/threaded/reactor_threaded.h\""); + code.pr("#include \"core/utils/util.h\""); + code.pr("extern federate_instance_t _fed;"); // Generate function to return a pointer to the action trigger_t // that handles incoming network messages destined to the specified @@ -552,7 +557,7 @@ protected String generateSerializationPreamble(FederateInstance federate, FedFil } /** - * Create a macro that initializes necessary triggers for federated execution, + * Create a function that initializes necessary triggers for federated execution, * which are the triggers for control reactions and references to all network * actions (which are triggered upon receiving network messages). * @@ -572,12 +577,10 @@ private String generateInitializeTriggers(FederateInstance federate, ErrorReport code.pr(CExtensionUtils.initializeTriggerForControlReactions(main, main, federate)); federatedReactor.setName(oldFederatedReactorName); return """ - #define initialize_triggers_for_federate() \\ - do { \\ + void initialize_triggers_for_federate() { %s - } \\ - while (0) - """.formatted((code.getCode().isBlank() ? "\\" : code.getCode()).indent(4).stripTrailing()); + } + """.formatted(code.getCode().indent(4).stripTrailing()); } /** @@ -611,7 +614,7 @@ private String generateCodeToInitializeFederate(FederateInstance federate, Linke code.pr(String.join("\n", "// Initialize the socket mutex", "lf_mutex_init(&outbound_socket_mutex);", - "lf_cond_init(&port_status_changed);" + "lf_cond_init(&port_status_changed, &mutex);" )); // Find the STA (A.K.A. the global STP offset) for this federate. From c021b388200f1afd0198db2228a1a9462635f89f Mon Sep 17 00:00:00 2001 From: Anirudh Rengarajan <44007330+arengarajan99@users.noreply.github.com> Date: Wed, 22 Feb 2023 14:00:39 -0800 Subject: [PATCH 05/15] Add additional header file to include. --- org.lflang/src/lib/c/reactor-c | 2 +- org.lflang/src/org/lflang/generator/c/CPreambleGenerator.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/org.lflang/src/lib/c/reactor-c b/org.lflang/src/lib/c/reactor-c index 133354ac49..90ba811f20 160000 --- a/org.lflang/src/lib/c/reactor-c +++ b/org.lflang/src/lib/c/reactor-c @@ -1 +1 @@ -Subproject commit 133354ac495189d6c7dbdd26430b52771f551fc6 +Subproject commit 90ba811f204e7c2b91dbdcd81ff7e569259c25a9 diff --git a/org.lflang/src/org/lflang/generator/c/CPreambleGenerator.java b/org.lflang/src/org/lflang/generator/c/CPreambleGenerator.java index 6eb0606fd7..da8c92519e 100644 --- a/org.lflang/src/org/lflang/generator/c/CPreambleGenerator.java +++ b/org.lflang/src/org/lflang/generator/c/CPreambleGenerator.java @@ -63,6 +63,7 @@ public static String generateIncludeStatements( code.pr("int lf_reactor_c_main(int argc, const char* argv[]);"); if(targetConfig.fedSetupPreamble != null) { code.pr("#include \"" + relPathHeader + "core/federated/federate.h\""); + code.pr("#include \"" + relPathHeader + "core/federated/net_common.h\""); } if (cppMode || targetConfig.platformOptions.platform == Platform.ARDUINO) { code.pr("}"); From 098276b92f10a001584b27f7bf9d1e7d0dd50a07 Mon Sep 17 00:00:00 2001 From: Anirudh Rengarajan <44007330+arengarajan99@users.noreply.github.com> Date: Wed, 22 Feb 2023 14:04:31 -0800 Subject: [PATCH 06/15] Return back to macro preprocessing --- .../org/lflang/federated/extensions/CExtension.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/org.lflang/src/org/lflang/federated/extensions/CExtension.java b/org.lflang/src/org/lflang/federated/extensions/CExtension.java index fc0bde880c..82fac26bc3 100644 --- a/org.lflang/src/org/lflang/federated/extensions/CExtension.java +++ b/org.lflang/src/org/lflang/federated/extensions/CExtension.java @@ -538,6 +538,7 @@ protected String makePreamble( size_t _lf_action_table_size = %1$s; """.formatted(numOfNetworkActions)); + //code.pr("#include \"" + federate.name + "_structs.h\""); code.pr(generateSerializationPreamble(federate, fileConfig)); code.pr(generateExecutablePreamble(federate, federationRTIProperties, errorReporter)); @@ -576,11 +577,14 @@ private String generateInitializeTriggers(FederateInstance federate, ErrorReport code.pr(CExtensionUtils.initializeTriggersForNetworkActions(federate, main)); code.pr(CExtensionUtils.initializeTriggerForControlReactions(main, main, federate)); federatedReactor.setName(oldFederatedReactorName); + return """ - void initialize_triggers_for_federate() { - %s - } - """.formatted(code.getCode().indent(4).stripTrailing()); + #define initialize_triggers_for_federate() \\ + do { \\ + %s + } \\ + while (0) + """.formatted((code.getCode().isBlank() ? "\\" : code.getCode()).indent(4).stripTrailing()); } /** From bd1843b849fc071eced34a01ad12b826dd525e51 Mon Sep 17 00:00:00 2001 From: Anirudh Rengarajan <44007330+arengarajan99@users.noreply.github.com> Date: Wed, 22 Feb 2023 14:04:47 -0800 Subject: [PATCH 07/15] Create auxillary struct header files --- .../org/lflang/generator/c/CGenerator.java | 44 +++++++++++++------ .../generator/python/PythonGenerator.java | 18 ++++---- 2 files changed, 41 insertions(+), 21 deletions(-) diff --git a/org.lflang/src/org/lflang/generator/c/CGenerator.java b/org.lflang/src/org/lflang/generator/c/CGenerator.java index 650169f759..45863a11ea 100644 --- a/org.lflang/src/org/lflang/generator/c/CGenerator.java +++ b/org.lflang/src/org/lflang/generator/c/CGenerator.java @@ -1038,8 +1038,26 @@ private void generateReactorClass(ReactorDecl reactor) { // Some of the following methods create lines of code that need to // go into the constructor. Collect those lines of code here: var constructorCode = new CodeBuilder(); - generateAuxiliaryStructs(reactor); - generateSelfStruct(reactor, constructorCode); + + var structCode = new CodeBuilder(); + String relPathStr = "include" + File.separator + reactor.getName() + "_structs.h"; + structCode.pr("#ifndef " + reactor.getName().toUpperCase() + "_STRUCTS_H"); + structCode.pr("#define " + reactor.getName().toUpperCase() + "_STRUCTS_H"); + Path relPath = fileConfig.getSrcGenPath().resolve(relPathStr); + try { + Files.createDirectories(relPath.getParent()); + }catch(Exception e){ + e.printStackTrace(); + } + generateAuxiliaryStructs(reactor, structCode); + generateSelfStruct(reactor, constructorCode, structCode); + structCode.pr("#endif"); + try { + structCode.writeToFile(relPath.toString()); + }catch(Exception e){ + e.printStackTrace(); + } + code.pr("#include \"" + relPathStr + "\""); generateMethods(reactor); generateReactions(reactor); generateConstructor(reactor, constructorCode); @@ -1088,7 +1106,7 @@ protected void generateConstructor( * actions of the specified reactor. * @param decl The parsed reactor data structure. */ - protected void generateAuxiliaryStructs(ReactorDecl decl) { + protected void generateAuxiliaryStructs(ReactorDecl decl, CodeBuilder structCode) { var reactor = ASTUtils.toDefinition(decl); // In the case where there are incoming // p2p logical connections in decentralized @@ -1109,7 +1127,7 @@ protected void generateAuxiliaryStructs(ReactorDecl decl) { ); // First, handle inputs. for (Input input : allInputs(reactor)) { - code.pr(CPortGenerator.generateAuxiliaryStruct( + structCode.pr(CPortGenerator.generateAuxiliaryStruct( decl, input, getTarget(), @@ -1120,7 +1138,7 @@ protected void generateAuxiliaryStructs(ReactorDecl decl) { } // Next, handle outputs. for (Output output : allOutputs(reactor)) { - code.pr(CPortGenerator.generateAuxiliaryStruct( + structCode.pr(CPortGenerator.generateAuxiliaryStruct( decl, output, getTarget(), @@ -1134,7 +1152,7 @@ protected void generateAuxiliaryStructs(ReactorDecl decl) { // a trigger_t* because the struct will be cast to (trigger_t*) // by the lf_schedule() functions to get to the trigger. for (Action action : allActions(reactor)) { - code.pr(CActionGenerator.generateAuxiliaryStruct( + structCode.pr(CActionGenerator.generateAuxiliaryStruct( decl, action, getTarget(), @@ -1151,7 +1169,7 @@ protected void generateAuxiliaryStructs(ReactorDecl decl) { * @param constructorCode Place to put lines of code that need to * go into the constructor. */ - private void generateSelfStruct(ReactorDecl decl, CodeBuilder constructorCode) { + private void generateSelfStruct(ReactorDecl decl, CodeBuilder constructorCode, CodeBuilder structCode) { var reactor = toDefinition(decl); var selfType = CUtil.selfType(decl); @@ -1197,12 +1215,12 @@ private void generateSelfStruct(ReactorDecl decl, CodeBuilder constructorCode) { // The first field has to always be a pointer to the list of // of allocated memory that must be freed when the reactor is freed. // This means that the struct can be safely cast to self_base_t. - code.pr("typedef struct {"); - code.indent(); - code.pr("struct self_base_t base;"); - code.pr(body.toString()); - code.unindent(); - code.pr("} " + selfType + ";"); + structCode.pr("typedef struct {"); + structCode.indent(); + structCode.pr("struct self_base_t base;"); + structCode.pr(body.toString()); + structCode.unindent(); + structCode.pr("} " + selfType + ";"); } /** diff --git a/org.lflang/src/org/lflang/generator/python/PythonGenerator.java b/org.lflang/src/org/lflang/generator/python/PythonGenerator.java index 46bcc4f811..2668f23a77 100644 --- a/org.lflang/src/org/lflang/generator/python/PythonGenerator.java +++ b/org.lflang/src/org/lflang/generator/python/PythonGenerator.java @@ -358,34 +358,36 @@ public void processProtoFile(String filename) { */ @Override public void generateAuxiliaryStructs( - ReactorDecl decl + ReactorDecl decl, CodeBuilder structCode ) { Reactor reactor = ASTUtils.toDefinition(decl); // First, handle inputs. for (Input input : ASTUtils.allInputs(reactor)) { - generateAuxiliaryStructsForPort(decl, input); + generateAuxiliaryStructsForPort(decl, input, structCode); } // Next, handle outputs. for (Output output : ASTUtils.allOutputs(reactor)) { - generateAuxiliaryStructsForPort(decl, output); + generateAuxiliaryStructsForPort(decl, output, structCode); } // Finally, handle actions. for (Action action : ASTUtils.allActions(reactor)) { - generateAuxiliaryStructsForAction(decl, action); + generateAuxiliaryStructsForAction(decl, action, structCode); } } private void generateAuxiliaryStructsForPort(ReactorDecl decl, - Port port) { + Port port, + CodeBuilder structCode) { boolean isTokenType = CUtil.isTokenType(ASTUtils.getInferredType(port), types); - code.pr(port, + structCode.pr(port, PythonPortGenerator.generateAliasTypeDef(decl, port, isTokenType, genericPortType)); } private void generateAuxiliaryStructsForAction(ReactorDecl decl, - Action action) { - code.pr(action, PythonActionGenerator.generateAliasTypeDef(decl, action, genericActionType)); + Action action, + CodeBuilder structCode) { + structCode.pr(action, PythonActionGenerator.generateAliasTypeDef(decl, action, genericActionType)); } /** From d5eae0e2ffd6b7d4929017d6ba5958ce2a3be74c Mon Sep 17 00:00:00 2001 From: Anirudh Rengarajan <44007330+arengarajan99@users.noreply.github.com> Date: Wed, 22 Feb 2023 14:36:20 -0800 Subject: [PATCH 08/15] Return to include for fed setup --- org.lflang/src/org/lflang/generator/c/CGenerator.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/org.lflang/src/org/lflang/generator/c/CGenerator.java b/org.lflang/src/org/lflang/generator/c/CGenerator.java index 45863a11ea..d947fc0928 100644 --- a/org.lflang/src/org/lflang/generator/c/CGenerator.java +++ b/org.lflang/src/org/lflang/generator/c/CGenerator.java @@ -2041,11 +2041,11 @@ protected String generateTopLevelPreambles() { CodeBuilder code = new CodeBuilder(); // preamble for federated execution setup - // if (targetConfig.fedSetupPreamble != null) { - // if (targetLanguageIsCpp()) code.pr("extern \"C\" {"); - // code.pr("#include \"" + targetConfig.fedSetupPreamble + "\""); - // if (targetLanguageIsCpp()) code.pr("}"); - // } + if (targetConfig.fedSetupPreamble != null) { + if (targetLanguageIsCpp()) code.pr("extern \"C\" {"); + code.pr("#include \"" + targetConfig.fedSetupPreamble + "\""); + if (targetLanguageIsCpp()) code.pr("}"); + } // user preambles if (this.mainDef != null) { From 8ebda975ad91a4736c3ced1769263a3037718ac0 Mon Sep 17 00:00:00 2001 From: Anirudh Rengarajan <44007330+arengarajan99@users.noreply.github.com> Date: Wed, 22 Feb 2023 14:36:31 -0800 Subject: [PATCH 09/15] Conversion of .c to .h for federated preamble --- .../src/org/lflang/federated/extensions/CExtension.java | 9 ++++----- .../org/lflang/federated/extensions/CExtensionUtils.java | 2 -- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/org.lflang/src/org/lflang/federated/extensions/CExtension.java b/org.lflang/src/org/lflang/federated/extensions/CExtension.java index 82fac26bc3..4755f93835 100644 --- a/org.lflang/src/org/lflang/federated/extensions/CExtension.java +++ b/org.lflang/src/org/lflang/federated/extensions/CExtension.java @@ -117,7 +117,7 @@ public void initializeTargetConfig( federate.targetConfig.setByUser.add(TargetProperty.THREADING); // Include the fed setup file for this federate in the target property - String relPath = "include" + File.separator + "_" + federate.name + "_preamble.c"; + String relPath = "include" + File.separator + "_" + federate.name + "_preamble.h"; federate.targetConfig.fedSetupPreamble = relPath; federate.targetConfig.setByUser.add(TargetProperty.FED_SETUP); } @@ -489,7 +489,7 @@ public String getNetworkBufferType() { } /** - * Add preamble to a separate file `include/_federateName_preamble.c` to set up federated execution. + * Add preamble to a separate file `include/_federateName_preamble.h` to set up federated execution. * Return an empty string since no code generated needs to go in the source. */ @Override @@ -499,9 +499,9 @@ public String generatePreamble( LinkedHashMap federationRTIProperties, ErrorReporter errorReporter ) throws IOException { - // Put the C preamble in a `include/_federate.name + _preamble.c` file + // Put the C preamble in a `include/_federate.name + _preamble.h` file String cPreamble = makePreamble(federate, fileConfig, federationRTIProperties, errorReporter); - String relPath = "include" + File.separator + "_" + federate.name + "_preamble.c"; + String relPath = "include" + File.separator + "_" + federate.name + "_preamble.h"; Path fedPreamblePath = fileConfig.getSrcPath().resolve(relPath); Files.createDirectories(fedPreamblePath.getParent()); try (var writer = Files.newBufferedWriter(fedPreamblePath)) { @@ -538,7 +538,6 @@ protected String makePreamble( size_t _lf_action_table_size = %1$s; """.formatted(numOfNetworkActions)); - //code.pr("#include \"" + federate.name + "_structs.h\""); code.pr(generateSerializationPreamble(federate, fileConfig)); code.pr(generateExecutablePreamble(federate, federationRTIProperties, errorReporter)); diff --git a/org.lflang/src/org/lflang/federated/extensions/CExtensionUtils.java b/org.lflang/src/org/lflang/federated/extensions/CExtensionUtils.java index 2f5ef587ba..a24bcbae58 100644 --- a/org.lflang/src/org/lflang/federated/extensions/CExtensionUtils.java +++ b/org.lflang/src/org/lflang/federated/extensions/CExtensionUtils.java @@ -577,8 +577,6 @@ public static String generateSerializationCMakeExtension( } } } - String relPath = "include" + File.separator + "_" + federate.name + "_preamble.c"; - code.pr("target_sources(${LF_MAIN_TARGET} PRIVATE " + relPath + ")"); return code.getCode(); } } From 26519495dda306fd53b8f83fbbd0e5426e5f6343 Mon Sep 17 00:00:00 2001 From: Anirudh Rengarajan <44007330+arengarajan99@users.noreply.github.com> Date: Wed, 22 Feb 2023 14:37:53 -0800 Subject: [PATCH 10/15] Update submodule dependency --- org.lflang/src/lib/c/reactor-c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/org.lflang/src/lib/c/reactor-c b/org.lflang/src/lib/c/reactor-c index 90ba811f20..4adf95ab59 160000 --- a/org.lflang/src/lib/c/reactor-c +++ b/org.lflang/src/lib/c/reactor-c @@ -1 +1 @@ -Subproject commit 90ba811f204e7c2b91dbdcd81ff7e569259c25a9 +Subproject commit 4adf95ab59984b2b68e6170289a97a218288a86d From 0c0a42973448eddfc6591d184eccd7960ab5622c Mon Sep 17 00:00:00 2001 From: Anirudh Rengarajan <44007330+arengarajan99@users.noreply.github.com> Date: Wed, 22 Feb 2023 15:12:22 -0800 Subject: [PATCH 11/15] Revert "Create auxillary struct header files" This reverts commit bd1843b849fc071eced34a01ad12b826dd525e51. --- .../org/lflang/generator/c/CGenerator.java | 44 ++++++------------- .../generator/python/PythonGenerator.java | 18 ++++---- 2 files changed, 21 insertions(+), 41 deletions(-) diff --git a/org.lflang/src/org/lflang/generator/c/CGenerator.java b/org.lflang/src/org/lflang/generator/c/CGenerator.java index d947fc0928..a344a8c5a4 100644 --- a/org.lflang/src/org/lflang/generator/c/CGenerator.java +++ b/org.lflang/src/org/lflang/generator/c/CGenerator.java @@ -1038,26 +1038,8 @@ private void generateReactorClass(ReactorDecl reactor) { // Some of the following methods create lines of code that need to // go into the constructor. Collect those lines of code here: var constructorCode = new CodeBuilder(); - - var structCode = new CodeBuilder(); - String relPathStr = "include" + File.separator + reactor.getName() + "_structs.h"; - structCode.pr("#ifndef " + reactor.getName().toUpperCase() + "_STRUCTS_H"); - structCode.pr("#define " + reactor.getName().toUpperCase() + "_STRUCTS_H"); - Path relPath = fileConfig.getSrcGenPath().resolve(relPathStr); - try { - Files.createDirectories(relPath.getParent()); - }catch(Exception e){ - e.printStackTrace(); - } - generateAuxiliaryStructs(reactor, structCode); - generateSelfStruct(reactor, constructorCode, structCode); - structCode.pr("#endif"); - try { - structCode.writeToFile(relPath.toString()); - }catch(Exception e){ - e.printStackTrace(); - } - code.pr("#include \"" + relPathStr + "\""); + generateAuxiliaryStructs(reactor); + generateSelfStruct(reactor, constructorCode); generateMethods(reactor); generateReactions(reactor); generateConstructor(reactor, constructorCode); @@ -1106,7 +1088,7 @@ protected void generateConstructor( * actions of the specified reactor. * @param decl The parsed reactor data structure. */ - protected void generateAuxiliaryStructs(ReactorDecl decl, CodeBuilder structCode) { + protected void generateAuxiliaryStructs(ReactorDecl decl) { var reactor = ASTUtils.toDefinition(decl); // In the case where there are incoming // p2p logical connections in decentralized @@ -1127,7 +1109,7 @@ protected void generateAuxiliaryStructs(ReactorDecl decl, CodeBuilder structCode ); // First, handle inputs. for (Input input : allInputs(reactor)) { - structCode.pr(CPortGenerator.generateAuxiliaryStruct( + code.pr(CPortGenerator.generateAuxiliaryStruct( decl, input, getTarget(), @@ -1138,7 +1120,7 @@ protected void generateAuxiliaryStructs(ReactorDecl decl, CodeBuilder structCode } // Next, handle outputs. for (Output output : allOutputs(reactor)) { - structCode.pr(CPortGenerator.generateAuxiliaryStruct( + code.pr(CPortGenerator.generateAuxiliaryStruct( decl, output, getTarget(), @@ -1152,7 +1134,7 @@ protected void generateAuxiliaryStructs(ReactorDecl decl, CodeBuilder structCode // a trigger_t* because the struct will be cast to (trigger_t*) // by the lf_schedule() functions to get to the trigger. for (Action action : allActions(reactor)) { - structCode.pr(CActionGenerator.generateAuxiliaryStruct( + code.pr(CActionGenerator.generateAuxiliaryStruct( decl, action, getTarget(), @@ -1169,7 +1151,7 @@ protected void generateAuxiliaryStructs(ReactorDecl decl, CodeBuilder structCode * @param constructorCode Place to put lines of code that need to * go into the constructor. */ - private void generateSelfStruct(ReactorDecl decl, CodeBuilder constructorCode, CodeBuilder structCode) { + private void generateSelfStruct(ReactorDecl decl, CodeBuilder constructorCode) { var reactor = toDefinition(decl); var selfType = CUtil.selfType(decl); @@ -1215,12 +1197,12 @@ private void generateSelfStruct(ReactorDecl decl, CodeBuilder constructorCode, C // The first field has to always be a pointer to the list of // of allocated memory that must be freed when the reactor is freed. // This means that the struct can be safely cast to self_base_t. - structCode.pr("typedef struct {"); - structCode.indent(); - structCode.pr("struct self_base_t base;"); - structCode.pr(body.toString()); - structCode.unindent(); - structCode.pr("} " + selfType + ";"); + code.pr("typedef struct {"); + code.indent(); + code.pr("struct self_base_t base;"); + code.pr(body.toString()); + code.unindent(); + code.pr("} " + selfType + ";"); } /** diff --git a/org.lflang/src/org/lflang/generator/python/PythonGenerator.java b/org.lflang/src/org/lflang/generator/python/PythonGenerator.java index 2668f23a77..46bcc4f811 100644 --- a/org.lflang/src/org/lflang/generator/python/PythonGenerator.java +++ b/org.lflang/src/org/lflang/generator/python/PythonGenerator.java @@ -358,36 +358,34 @@ public void processProtoFile(String filename) { */ @Override public void generateAuxiliaryStructs( - ReactorDecl decl, CodeBuilder structCode + ReactorDecl decl ) { Reactor reactor = ASTUtils.toDefinition(decl); // First, handle inputs. for (Input input : ASTUtils.allInputs(reactor)) { - generateAuxiliaryStructsForPort(decl, input, structCode); + generateAuxiliaryStructsForPort(decl, input); } // Next, handle outputs. for (Output output : ASTUtils.allOutputs(reactor)) { - generateAuxiliaryStructsForPort(decl, output, structCode); + generateAuxiliaryStructsForPort(decl, output); } // Finally, handle actions. for (Action action : ASTUtils.allActions(reactor)) { - generateAuxiliaryStructsForAction(decl, action, structCode); + generateAuxiliaryStructsForAction(decl, action); } } private void generateAuxiliaryStructsForPort(ReactorDecl decl, - Port port, - CodeBuilder structCode) { + Port port) { boolean isTokenType = CUtil.isTokenType(ASTUtils.getInferredType(port), types); - structCode.pr(port, + code.pr(port, PythonPortGenerator.generateAliasTypeDef(decl, port, isTokenType, genericPortType)); } private void generateAuxiliaryStructsForAction(ReactorDecl decl, - Action action, - CodeBuilder structCode) { - structCode.pr(action, PythonActionGenerator.generateAliasTypeDef(decl, action, genericActionType)); + Action action) { + code.pr(action, PythonActionGenerator.generateAliasTypeDef(decl, action, genericActionType)); } /** From 3707ea63dd6f8ff0696ca09a13492e9f42920c7b Mon Sep 17 00:00:00 2001 From: Anirudh Rengarajan <44007330+arengarajan99@users.noreply.github.com> Date: Wed, 22 Feb 2023 15:40:57 -0800 Subject: [PATCH 12/15] Remove unnecessary copy over of federated files --- .../src/org/lflang/federated/extensions/CExtension.java | 8 -------- 1 file changed, 8 deletions(-) diff --git a/org.lflang/src/org/lflang/federated/extensions/CExtension.java b/org.lflang/src/org/lflang/federated/extensions/CExtension.java index 4755f93835..d9ed222920 100644 --- a/org.lflang/src/org/lflang/federated/extensions/CExtension.java +++ b/org.lflang/src/org/lflang/federated/extensions/CExtension.java @@ -98,14 +98,6 @@ public void initializeTargetConfig( generateCMakeInclude(federate, fileConfig); - federate.targetConfig.fileNames.add("include/federated"); - federate.targetConfig.setByUser.add(TargetProperty.FILES); - FileUtil.copyDirectoryFromClassPath( - "/lib/c/reactor-c/core/federated", - fileConfig.getSrcPath().resolve("include" + File.separator + "federated"), - true - ); - federate.targetConfig.keepalive = true; federate.targetConfig.setByUser.add(TargetProperty.KEEPALIVE); From 87ef0c4a73bd6cf32b3289aeaa6d08c461616d13 Mon Sep 17 00:00:00 2001 From: Anirudh Rengarajan <44007330+arengarajan99@users.noreply.github.com> Date: Thu, 23 Feb 2023 17:05:22 -0800 Subject: [PATCH 13/15] Update submodule dependency --- org.lflang/src/lib/c/reactor-c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/org.lflang/src/lib/c/reactor-c b/org.lflang/src/lib/c/reactor-c index 4adf95ab59..7b8b74a515 160000 --- a/org.lflang/src/lib/c/reactor-c +++ b/org.lflang/src/lib/c/reactor-c @@ -1 +1 @@ -Subproject commit 4adf95ab59984b2b68e6170289a97a218288a86d +Subproject commit 7b8b74a5151984dd2d11610c081a1cbf5e7d1536 From 2ae3a3e88c338e17aa556e9f3dbbe5d0649a338d Mon Sep 17 00:00:00 2001 From: Anirudh Rengarajan <44007330+arengarajan99@users.noreply.github.com> Date: Thu, 23 Feb 2023 22:38:57 -0800 Subject: [PATCH 14/15] Update submodule dependency --- org.lflang/src/lib/c/reactor-c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/org.lflang/src/lib/c/reactor-c b/org.lflang/src/lib/c/reactor-c index 7b8b74a515..34c0b60bc5 160000 --- a/org.lflang/src/lib/c/reactor-c +++ b/org.lflang/src/lib/c/reactor-c @@ -1 +1 @@ -Subproject commit 7b8b74a5151984dd2d11610c081a1cbf5e7d1536 +Subproject commit 34c0b60bc538651199ef995794cacf4a43472aa1 From 0144b269118c7f36911e55d981a828b2ddfb78b1 Mon Sep 17 00:00:00 2001 From: Anirudh Rengarajan <44007330+arengarajan99@users.noreply.github.com> Date: Fri, 24 Feb 2023 11:55:04 -0800 Subject: [PATCH 15/15] Update submodule dependency --- org.lflang/src/lib/c/reactor-c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/org.lflang/src/lib/c/reactor-c b/org.lflang/src/lib/c/reactor-c index 34c0b60bc5..9b6d606976 160000 --- a/org.lflang/src/lib/c/reactor-c +++ b/org.lflang/src/lib/c/reactor-c @@ -1 +1 @@ -Subproject commit 34c0b60bc538651199ef995794cacf4a43472aa1 +Subproject commit 9b6d606976f9e5bdc4545345c0ebbd7e5e3e95b4