diff --git a/org.lflang/src/lib/c/reactor-c b/org.lflang/src/lib/c/reactor-c index d85e9210d7..9e17f8a620 160000 --- a/org.lflang/src/lib/c/reactor-c +++ b/org.lflang/src/lib/c/reactor-c @@ -1 +1 @@ -Subproject commit d85e9210d7e3e2213b2b17a9b1debe6ff43ae284 +Subproject commit 9e17f8a6209200e9aef8dcaf16a3a19ae2f0824c diff --git a/org.lflang/src/lib/py/reactor-c-py b/org.lflang/src/lib/py/reactor-c-py index 05271f2614..3147a38b74 160000 --- a/org.lflang/src/lib/py/reactor-c-py +++ b/org.lflang/src/lib/py/reactor-c-py @@ -1 +1 @@ -Subproject commit 05271f2614cd245bdf0421aaf5876aa8aa85b7f4 +Subproject commit 3147a38b74f1352484e7a08994e3672d9b2b17f5 diff --git a/org.lflang/src/org/lflang/generator/c/CCoreFilesUtils.java b/org.lflang/src/org/lflang/generator/c/CCoreFilesUtils.java index e502b689e9..9467ab6f2b 100644 --- a/org.lflang/src/org/lflang/generator/c/CCoreFilesUtils.java +++ b/org.lflang/src/org/lflang/generator/c/CCoreFilesUtils.java @@ -26,6 +26,20 @@ public static List getCoreFiles( return coreFiles; } + public static List getCTargetHeaders() { + return List.of( + "ctarget_schedule.h", + "ctarget_set.h", + "ctarget_set_undef.h" + ); + } + + public static List getCTargetSrc() { + return List.of( + "ctarget_schedule.c" + ); + } + private static List getBaseCoreFiles() { return List.of( "reactor_common.c", diff --git a/org.lflang/src/org/lflang/generator/c/CGenerator.java b/org.lflang/src/org/lflang/generator/c/CGenerator.java index 8d537798a0..02b4e35947 100644 --- a/org.lflang/src/org/lflang/generator/c/CGenerator.java +++ b/org.lflang/src/org/lflang/generator/c/CGenerator.java @@ -1274,8 +1274,16 @@ protected void initializeClockSynchronization() { * Copy target-specific header file to the src-gen directory. */ public void copyTargetHeaderFile() throws IOException{ - FileUtil.copyFileFromClassPath("/lib/c/reactor-c/include/ctarget.h", fileConfig.getSrcGenPath().resolve("ctarget.h")); - FileUtil.copyFileFromClassPath("/lib/c/reactor-c/lib/ctarget.c", fileConfig.getSrcGenPath().resolve("ctarget.c")); + FileUtil.copyFilesFromClassPath( + "/lib/c/reactor-c/include", + fileConfig.getSrcGenPath(), + CCoreFilesUtils.getCTargetHeaders() + ); + FileUtil.copyFilesFromClassPath( + "/lib/c/reactor-c/lib", + fileConfig.getSrcGenPath(), + CCoreFilesUtils.getCTargetSrc() + ); } //////////////////////////////////////////// @@ -2340,7 +2348,7 @@ public TargetTypes getTargetTypes() { protected void setUpParameters(LFGeneratorContext context) { accommodatePhysicalActionsIfPresent(); targetConfig.compileDefinitions.put("LOG_LEVEL", targetConfig.logLevel.ordinal() + ""); - targetConfig.compileAdditionalSources.add("ctarget.c"); + targetConfig.compileAdditionalSources.addAll(CCoreFilesUtils.getCTargetSrc()); targetConfig.compileAdditionalSources.add("core" + File.separator + "mixed_radix.c"); setCSpecificDefaults(context); // Create the main reactor instance if there is a main reactor. diff --git a/org.lflang/src/org/lflang/generator/c/CPreambleGenerator.java b/org.lflang/src/org/lflang/generator/c/CPreambleGenerator.java index 7f12caab20..53814487eb 100644 --- a/org.lflang/src/org/lflang/generator/c/CPreambleGenerator.java +++ b/org.lflang/src/org/lflang/generator/c/CPreambleGenerator.java @@ -35,7 +35,7 @@ public static String generateIncludeStatements( ) { var tracing = targetConfig.tracing; CodeBuilder code = new CodeBuilder(); - code.pr("#include \"ctarget.h\""); + code.pr("#include \"ctarget_schedule.h\""); if (targetConfig.threading) { code.pr("#include \"core/threaded/reactor_threaded.c\""); code.pr("#include \"core/threaded/scheduler.h\""); diff --git a/org.lflang/src/org/lflang/generator/c/CReactionGenerator.java b/org.lflang/src/org/lflang/generator/c/CReactionGenerator.java index b36a767a49..2ef049d562 100644 --- a/org.lflang/src/org/lflang/generator/c/CReactionGenerator.java +++ b/org.lflang/src/org/lflang/generator/c/CReactionGenerator.java @@ -357,7 +357,7 @@ public static String generateIntendedTagInheritence(String body, Reaction reacti if (ASTUtils.isMultiport(outputPort)) { intendedTagInheritenceCode.pr(String.join("\n", "for (int i=0; i < "+containerName+"."+generateWidthVariable(variableName)+"; i++) {", - " if (compare_tags("+containerName+"."+variableName+"[i]->intended_tag,", + " if (lf_compare_tags("+containerName+"."+variableName+"[i]->intended_tag,", " inherited_min_intended_tag) < 0) {", " inherited_min_intended_tag = "+containerName+"."+variableName+"[i]->intended_tag;", " }", @@ -365,7 +365,7 @@ public static String generateIntendedTagInheritence(String body, Reaction reacti )); } else intendedTagInheritenceCode.pr(String.join("\n", - "if (compare_tags("+containerName+"."+variableName+"->intended_tag,", + "if (lf_compare_tags("+containerName+"."+variableName+"->intended_tag,", " inherited_min_intended_tag) < 0) {", " inherited_min_intended_tag = "+containerName+"."+variableName+"->intended_tag;", "}" @@ -376,21 +376,21 @@ public static String generateIntendedTagInheritence(String body, Reaction reacti if (ASTUtils.isMultiport(inputPort)) { intendedTagInheritenceCode.pr(String.join("\n", "for (int i=0; i < "+generateWidthVariable(variableName)+"; i++) {", - " if (compare_tags("+variableName+"[i]->intended_tag, inherited_min_intended_tag) < 0) {", + " if (lf_compare_tags("+variableName+"[i]->intended_tag, inherited_min_intended_tag) < 0) {", " inherited_min_intended_tag = "+variableName+"[i]->intended_tag;", " }", "}" )); } else { intendedTagInheritenceCode.pr(String.join("\n", - "if (compare_tags("+variableName+"->intended_tag, inherited_min_intended_tag) < 0) {", + "if (lf_compare_tags("+variableName+"->intended_tag, inherited_min_intended_tag) < 0) {", " inherited_min_intended_tag = "+variableName+"->intended_tag;", "}" )); } } else if (variable instanceof Action) { intendedTagInheritenceCode.pr(String.join("\n", - "if (compare_tags("+variableName+"->trigger->intended_tag, inherited_min_intended_tag) < 0) {", + "if (lf_compare_tags("+variableName+"->trigger->intended_tag, inherited_min_intended_tag) < 0) {", " inherited_min_intended_tag = "+variableName+"->trigger->intended_tag;", "}" )); @@ -404,7 +404,7 @@ public static String generateIntendedTagInheritence(String body, Reaction reacti // NOTE: this does not include contained outputs. for (Input input : ((Reactor) reaction.eContainer()).getInputs()) { intendedTagInheritenceCode.pr(String.join("\n", - "if (compare_tags("+input.getName()+"->intended_tag, inherited_min_intended_tag) > 0) {", + "if (lf_compare_tags("+input.getName()+"->intended_tag, inherited_min_intended_tag) > 0) {", " inherited_min_intended_tag = "+input.getName()+"->intended_tag;", "}" )); @@ -1187,6 +1187,7 @@ public static String generateReaction( types, errorReporter, mainDef, isFederatedAndDecentralized, requiresType); + code.pr("#include \"ctarget_set.h\""); code.pr(generateFunction( generateReactionFunctionHeader(decl, reactionIndex), init, reaction.getCode() @@ -1207,6 +1208,7 @@ public static String generateReaction( generateDeadlineFunctionHeader(decl, reactionIndex), init, reaction.getDeadline().getCode())); } + code.pr("#include \"ctarget_set_undef.h\""); return code.toString(); } diff --git a/org.lflang/src/org/lflang/generator/c/CTriggerObjectsGenerator.java b/org.lflang/src/org/lflang/generator/c/CTriggerObjectsGenerator.java index f0e601df70..98bd059e76 100644 --- a/org.lflang/src/org/lflang/generator/c/CTriggerObjectsGenerator.java +++ b/org.lflang/src/org/lflang/generator/c/CTriggerObjectsGenerator.java @@ -269,7 +269,7 @@ private static String initializeFederate( // If a test clock offset has been specified, insert code to set it here. if (targetConfig.clockSyncOptions.testOffset != null) { - code.pr("set_physical_clock_offset((1 + "+federate.id+") * "+targetConfig.clockSyncOptions.testOffset.toNanoSeconds()+"LL);"); + code.pr("lf_set_physical_clock_offset((1 + "+federate.id+") * "+targetConfig.clockSyncOptions.testOffset.toNanoSeconds()+"LL);"); } code.pr(String.join("\n", diff --git a/org.lflang/src/org/lflang/generator/python/PythonReactionGenerator.java b/org.lflang/src/org/lflang/generator/python/PythonReactionGenerator.java index f7eb59ba19..42166dc993 100644 --- a/org.lflang/src/org/lflang/generator/python/PythonReactionGenerator.java +++ b/org.lflang/src/org/lflang/generator/python/PythonReactionGenerator.java @@ -129,6 +129,7 @@ public static String generateCReaction( types, errorReporter, mainDef, isFederatedAndDecentralized, Target.Python.requiresTypes); + code.pr("#include \"ctarget_set.h\""); code.pr(generateFunction( CReactionGenerator.generateReactionFunctionHeader(decl, reactionIndex), cInit, reaction.getCode(), @@ -143,6 +144,7 @@ public static String generateCReaction( generateCPythonDeadlineCaller(decl, reactionIndex, pyObjects) )); } + code.pr("#include \"ctarget_set_undef.h\""); return code.toString(); } diff --git a/test/C/src/SetArray.lf b/test/C/src/SetArray.lf index 7b95af591e..a58b2c90fe 100644 --- a/test/C/src/SetArray.lf +++ b/test/C/src/SetArray.lf @@ -7,7 +7,7 @@ reactor Source { reaction(startup) -> out {= // Dynamically allocate an output array of length 3. int* array = (int*)malloc(3 * sizeof(int)); - SET_ARRAY(out, array, 3); + SET_ARRAY(out, array, sizeof(int), 3); // Above allocates the array, which then must be populated. out->value[0] = 0; diff --git a/test/C/src/SetCopyConstructor.lf b/test/C/src/SetCopyConstructor.lf index 20b57a9bb0..4125b83158 100644 --- a/test/C/src/SetCopyConstructor.lf +++ b/test/C/src/SetCopyConstructor.lf @@ -1,4 +1,4 @@ -// This tests SET_DESTRUCTOR() +// This tests lf_set_copy_constructor() // This tests the use of the "polymorphic" delay reactor on a struct. // It delays by a logical time any pointer datatype. target C {files: ["include/array.h"]}; @@ -10,8 +10,8 @@ preamble {= reactor Source { output out:int_array_t*; reaction(startup) -> out {= - SET_COPY_CONSTRUCTOR(out, int_array_copy_constructor); - SET_DESTRUCTOR(out, int_array_destructor); + lf_set_copy_constructor(out, int_array_copy_constructor); + lf_set_destructor(out, int_array_destructor); int_array_t* arr = int_array_constructor(1000); arr->data[0] = 42; arr->data[1] = 24; diff --git a/test/C/src/SetDestructor.lf b/test/C/src/SetDestructor.lf index 8ee15532e6..25231f2fe6 100644 --- a/test/C/src/SetDestructor.lf +++ b/test/C/src/SetDestructor.lf @@ -1,4 +1,4 @@ -// This tests SET_DESTRUCTOR() +// This tests lf_set_destructor() // This tests the use of the "polymorphic" delay reactor on a struct. // It delays by a logical time any pointer datatype. target C {files: ["include/array.h"]}; @@ -11,7 +11,7 @@ reactor Source { output out:int_array_t*; reaction(startup) -> out {= info_print("%d", out->destructor); - SET_DESTRUCTOR(out, int_array_destructor); + lf_set_destructor(out, int_array_destructor); int_array_t* array = (int_array_t*) malloc(sizeof(int_array_t)); array->length = 1000; array->data = (int*) calloc(array->length, sizeof(int)); diff --git a/test/C/src/include/array.h b/test/C/src/include/array.h index 292012c2a4..167b41d0c3 100644 --- a/test/C/src/include/array.h +++ b/test/C/src/include/array.h @@ -20,7 +20,9 @@ void* int_array_copy_constructor(void* arr) { int_array_t* val = (int_array_t*) malloc(sizeof(int_array_t)); val->data = (int*) calloc(other_arr->length, sizeof(int)); val->length = other_arr->length; - memcpy(val->data, other_arr->data, other_arr->length * sizeof(int)); + for (size_t i = 0; i < other_arr->length; i++) { + val->data[i] = other_arr->data[i]; + } return (void*) val; }