diff --git a/org.lflang/src/lib/c/reactor-c b/org.lflang/src/lib/c/reactor-c index ebc4187838..5f472b3eb9 160000 --- a/org.lflang/src/lib/c/reactor-c +++ b/org.lflang/src/lib/c/reactor-c @@ -1 +1 @@ -Subproject commit ebc41878384d9158127ac1c8d4a31780f0546f63 +Subproject commit 5f472b3eb958e986a63ad88b9ca0d32e0cc50d18 diff --git a/org.lflang/src/lib/py/reactor-c-py b/org.lflang/src/lib/py/reactor-c-py index a5b82a1eaa..e0f8615431 160000 --- a/org.lflang/src/lib/py/reactor-c-py +++ b/org.lflang/src/lib/py/reactor-c-py @@ -1 +1 @@ -Subproject commit a5b82a1eaad03050adaab7671e98f02816dd9306 +Subproject commit e0f861543122a660694643aad329aa7c93450d61 diff --git a/org.lflang/src/org/lflang/generator/c/CCoreFilesUtils.java b/org.lflang/src/org/lflang/generator/c/CCoreFilesUtils.java index cc1b6ef02e..64ed1169d8 100644 --- a/org.lflang/src/org/lflang/generator/c/CCoreFilesUtils.java +++ b/org.lflang/src/org/lflang/generator/c/CCoreFilesUtils.java @@ -13,8 +13,8 @@ */ public class CCoreFilesUtils { public static List getCoreFiles( - boolean isFederated, - boolean threading, + boolean isFederated, + boolean threading, SchedulerOption scheduler ) { List coreFiles = new ArrayList<>(); @@ -26,13 +26,30 @@ public static List getCoreFiles( coreFiles.addAll(getThreadSupportFiles(threading, scheduler)); return coreFiles; } + public static List getCTargetSrc() { return List.of( - "ctarget/schedule.c", - "ctarget/util.c" + "lib/schedule.c", + "lib/util.c", + "lib/tag.c", + "lib/time.c" + ); + } + + public static List getCTargetHeader() { + return List.of( + "include/ctarget/ctarget.h" ); } + public static String getCTargetSetHeader() { + return "include/ctarget/set.h"; + } + + public static String getCTargetSetUndefHeader() { + return "include/ctarget/set_undef.h"; + } + private static List getBaseCoreFiles() { return List.of( "reactor_common.c", @@ -48,7 +65,7 @@ private static List getBaseCoreFiles() { "utils/vector.h", "utils/semaphore.h", "utils/semaphore.c", - "utils/util.h", + "utils/util.h", "utils/util.c", "platform.h", "platform/Platform.cmake", @@ -82,19 +99,19 @@ private static List getFederatedFiles() { return List.of( "federated/net_util.c", "federated/net_util.h", - "federated/net_common.h", - "federated/federate.c", - "federated/federate.h", - "federated/clock-sync.h", + "federated/net_common.h", + "federated/federate.c", + "federated/federate.h", + "federated/clock-sync.h", "federated/clock-sync.c" ); } private static List getThreadSupportFiles( - boolean threading, + boolean threading, SchedulerOption scheduler ) { - return threading ? + return threading ? List.of( "threaded/scheduler.h", "threaded/scheduler_instance.h", diff --git a/org.lflang/src/org/lflang/generator/c/CGenerator.java b/org.lflang/src/org/lflang/generator/c/CGenerator.java index 6bb25d69e6..897375a43f 100644 --- a/org.lflang/src/org/lflang/generator/c/CGenerator.java +++ b/org.lflang/src/org/lflang/generator/c/CGenerator.java @@ -1276,12 +1276,12 @@ protected void initializeClockSynchronization() { private void copyTargetFiles() throws IOException{ FileUtil.copyDirectoryFromClassPath( "/lib/c/reactor-c/include", - fileConfig.getSrcGenPath(), + fileConfig.getSrcGenPath().resolve("include"), false ); FileUtil.copyDirectoryFromClassPath( "/lib/c/reactor-c/lib", - fileConfig.getSrcGenPath(), + fileConfig.getSrcGenPath().resolve("lib"), false ); } diff --git a/org.lflang/src/org/lflang/generator/c/CPreambleGenerator.java b/org.lflang/src/org/lflang/generator/c/CPreambleGenerator.java index 332420089b..c68eb57798 100644 --- a/org.lflang/src/org/lflang/generator/c/CPreambleGenerator.java +++ b/org.lflang/src/org/lflang/generator/c/CPreambleGenerator.java @@ -10,14 +10,15 @@ import org.lflang.TargetProperty.CoordinationType; import org.lflang.generator.CodeBuilder; import org.lflang.generator.GeneratorBase; +import org.lflang.util.StringUtil; import static org.lflang.util.StringUtil.addDoubleQuotes; /** * Generates code for preambles for the C and CCpp target. * This includes #include and #define directives at the top - * of each generated ".c" file. - * + * of each generated ".c" file. + * * @author{Edward A. Lee } * @author{Marten Lohstroh } * @author{Mehrdad Niknami } @@ -30,12 +31,14 @@ public class CPreambleGenerator { /** Add necessary source files specific to the target language. */ public static String generateIncludeStatements( - TargetConfig targetConfig, + TargetConfig targetConfig, boolean isFederated ) { var tracing = targetConfig.tracing; CodeBuilder code = new CodeBuilder(); - code.pr("#include \"ctarget/ctarget.h\""); + CCoreFilesUtils.getCTargetHeader().forEach( + it -> code.pr("#include " + StringUtil.addDoubleQuotes(it)) + ); if (targetConfig.threading) { code.pr("#include \"core/threaded/reactor_threaded.c\""); code.pr("#include \"core/threaded/scheduler.h\""); @@ -71,7 +74,7 @@ public static String generateDefineDirectives( code.pr("#define NUMBER_OF_FEDERATES " + numFederates); code.pr(generateFederatedDefineDirective(coordinationType)); if (advanceMessageInterval != null) { - code.pr("#define ADVANCE_MESSAGE_INTERVAL " + + code.pr("#define ADVANCE_MESSAGE_INTERVAL " + GeneratorBase.timeInTargetLanguage(advanceMessageInterval)); } } @@ -92,12 +95,12 @@ public static String generateDefineDirectives( /** * Returns the #define directive for the given coordination type. - * + * * NOTE: Instead of checking #ifdef FEDERATED, we could * use #if (NUMBER_OF_FEDERATES > 1). * To Soroush Bateni, the former is more accurate. */ - private static String generateFederatedDefineDirective(CoordinationType coordinationType) { + private static String generateFederatedDefineDirective(CoordinationType coordinationType) { List directives = new ArrayList<>(); directives.add("#define FEDERATED"); if (coordinationType == CoordinationType.CENTRALIZED) { @@ -122,12 +125,12 @@ private static String generateTracingDefineDirective( /** * Initialize clock synchronization (if enabled) and its related options for a given federate. - * + * * Clock synchronization can be enabled using the clock-sync target property. * @see https://github.com/icyphy/lingua-franca/wiki/Distributed-Execution#clock-synchronization */ private static String generateClockSyncDefineDirective( - ClockSyncMode mode, + ClockSyncMode mode, ClockSyncOptions options ) { List code = new ArrayList<>(); diff --git a/org.lflang/src/org/lflang/generator/c/CReactionGenerator.java b/org.lflang/src/org/lflang/generator/c/CReactionGenerator.java index f778e22336..3e0961e035 100644 --- a/org.lflang/src/org/lflang/generator/c/CReactionGenerator.java +++ b/org.lflang/src/org/lflang/generator/c/CReactionGenerator.java @@ -33,6 +33,8 @@ import org.lflang.lf.TriggerRef; import org.lflang.lf.VarRef; import org.lflang.lf.Variable; +import org.lflang.util.StringUtil; + import static org.lflang.util.StringUtil.addDoubleQuotes; public class CReactionGenerator { @@ -1187,7 +1189,9 @@ public static String generateReaction( types, errorReporter, mainDef, isFederatedAndDecentralized, requiresType); - code.pr("#include \"ctarget/set.h\""); + code.pr( + "#include " + StringUtil.addDoubleQuotes( + CCoreFilesUtils.getCTargetSetHeader())); code.pr(generateFunction( generateReactionFunctionHeader(decl, reactionIndex), init, reaction.getCode() @@ -1208,7 +1212,9 @@ public static String generateReaction( generateDeadlineFunctionHeader(decl, reactionIndex), init, reaction.getDeadline().getCode())); } - code.pr("#include \"ctarget/set_undef.h\""); + code.pr( + "#include " + StringUtil.addDoubleQuotes( + CCoreFilesUtils.getCTargetSetUndefHeader())); return code.toString(); } diff --git a/org.lflang/src/org/lflang/generator/python/PythonReactionGenerator.java b/org.lflang/src/org/lflang/generator/python/PythonReactionGenerator.java index 16d7758cb3..82ff226a21 100644 --- a/org.lflang/src/org/lflang/generator/python/PythonReactionGenerator.java +++ b/org.lflang/src/org/lflang/generator/python/PythonReactionGenerator.java @@ -14,10 +14,12 @@ import org.lflang.lf.Code; import org.lflang.lf.TriggerRef; import org.lflang.lf.VarRef; +import org.lflang.util.StringUtil; import org.lflang.lf.Instantiation; import org.lflang.lf.Port; import org.lflang.lf.Input; import org.lflang.lf.Output; +import org.lflang.generator.c.CCoreFilesUtils; import org.lflang.generator.c.CReactionGenerator; import org.lflang.generator.c.CTypes; import org.lflang.generator.c.CUtil; @@ -129,7 +131,9 @@ public static String generateCReaction( types, errorReporter, mainDef, isFederatedAndDecentralized, Target.Python.requiresTypes); - code.pr("#include \"ctarget/set.h\""); + code.pr( + "#include " + StringUtil.addDoubleQuotes( + CCoreFilesUtils.getCTargetSetHeader())); code.pr(generateFunction( CReactionGenerator.generateReactionFunctionHeader(decl, reactionIndex), cInit, reaction.getCode(), @@ -144,7 +148,9 @@ public static String generateCReaction( generateCPythonDeadlineCaller(decl, reactionIndex, pyObjects) )); } - code.pr("#include \"ctarget/set_undef.h\""); + code.pr( + "#include " + StringUtil.addDoubleQuotes( + CCoreFilesUtils.getCTargetSetUndefHeader())); return code.toString(); }