Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
7e7cffc
reactor-uc debugging
tanneberger Mar 11, 2025
8e0724f
Drop handshake responses if handshake is already completed.
erlingrj Mar 11, 2025
4a615d2
reverting LF_DEBUG prints
tanneberger Mar 11, 2025
3c25f2a
bugs
tanneberger Mar 20, 2025
b4e3fc6
Bring back interrupt disabling in UartPolledChannel_poll
erlingrj Mar 20, 2025
50b8f5e
changes
tanneberger Mar 22, 2025
4cd041a
reverting changes
tanneberger Mar 22, 2025
d635f48
cleaning
tanneberger Mar 22, 2025
625c214
semi working version
tanneberger Mar 24, 2025
afb8c8f
transient
tanneberger Mar 24, 2025
87787b6
merging with main
tanneberger Apr 2, 2025
573f014
adding new parameters to StartupCoordinator_ctor
tanneberger Apr 3, 2025
5fb9403
transient stuff
tanneberger May 12, 2025
5388a7f
merging with main
tanneberger May 13, 2025
3eea4fa
adding joining_policy attribute
tanneberger May 13, 2025
124ecb0
cleaning up
tanneberger May 13, 2025
2244ebe
merging with main
tanneberger May 13, 2025
6581dc5
refactor
tanneberger May 13, 2025
121540c
more cleaning up
tanneberger May 13, 2025
0357776
clean up
tanneberger May 13, 2025
f54324c
merge with main
tanneberger May 25, 2025
f6a922e
stuff
tanneberger May 26, 2025
55d9fd2
working version
tanneberger Jun 4, 2025
d79472e
fixing test
tanneberger Jun 5, 2025
53d4b82
lfc shebang
tanneberger Jun 5, 2025
565403b
formatting
tanneberger Jun 5, 2025
cac3d75
fixing startup in non-federated
tanneberger Jun 5, 2025
c42b3b4
startup coordinator
tanneberger Jun 5, 2025
0c3ba66
revert CmakeGenerator changes
tanneberger Jun 5, 2025
5bea031
revert lfc.cmake
tanneberger Jun 5, 2025
41b4d6d
handling joining time announcement
tanneberger Jun 6, 2025
63ed0d1
testing support for annotations
tanneberger Jun 7, 2025
553126f
adding classes for IR
tanneberger Jun 16, 2025
5267b9f
lfc: introducing LF-IR
tanneberger Sep 15, 2025
e6fb4e1
merge with main
tanneberger Sep 15, 2025
1e450c1
UcReactionGenerator
tanneberger Sep 24, 2025
91e8f1b
uc2 version 2 of the code-generator
tanneberger Oct 28, 2025
71bea06
merge with main
tanneberger Oct 29, 2025
6a368ef
compiling code-generator
tanneberger Oct 31, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion cmake/lfc.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -72,4 +72,4 @@ function(lf_build_generated_code MAIN_TARGET SOURCE_GEN_DIR)
target_link_libraries(${MAIN_TARGET} PUBLIC reactor-uc)
target_compile_definitions(reactor-uc PUBLIC LF_LOG_LEVEL_ALL=${LOG_LEVEL})
target_compile_definitions(reactor-uc PUBLIC ${LFC_GEN_COMPILE_DEFS})
endfunction()
endfunction()
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
package org.lflang.generator.uc
package org.lflang.generator.uc.federated

import org.lflang.AttributeUtils
import org.lflang.TimeValue
import org.lflang.generator.uc.UcInstanceGenerator.Companion.codeTypeFederate
import org.lflang.generator.uc.mics.UcClockSyncParameters
import org.lflang.ir.FederateInstantiation
import org.lflang.isBank
import org.lflang.lf.Attribute
import org.lflang.lf.Instantiation
import org.lflang.target.property.type.PlatformType

class UcFederate(val inst: Instantiation, val bankIdx: Int) {
val isBank = inst.isBank
class UcFederate(val inst: FederateInstantiation, val bankIdx: Int) {
val isBank = inst.codeWidth > 1
val platform: PlatformType.Platform = AttributeUtils.getFederatePlatform(inst)
val interfaces = mutableListOf<UcNetworkInterface>()
val codeType = if (isBank) "${inst.codeTypeFederate}_${bankIdx}" else inst.codeTypeFederate
Expand All @@ -35,8 +36,8 @@ class UcFederate(val inst: Instantiation, val bankIdx: Int) {
fun getJoiningPolicy(): JoiningPolicy {
val attr: Attribute? = AttributeUtils.getJoiningPolicy(inst)
return attr
?.let { JoiningPolicy.parse(it.getAttrParms().get(0).getValue()) }
.run { JoiningPolicy.JOIN_IMMEDIATELY }
?.let { JoiningPolicy.Companion.parse(it.getAttrParms().get(0).getValue()) }
.run { JoiningPolicy.IMMEDIATELY }
}

fun getDefaultInterface(): UcNetworkInterface = interfaces.first()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,14 @@
package org.lflang.generator.uc
package org.lflang.generator.uc.federated

import org.lflang.*
import org.lflang.generator.PrependOperator
import org.lflang.generator.uc.UcConnectionGenerator
import org.lflang.generator.uc.UcFileConfig
import org.lflang.generator.uc.UcInstanceGenerator
import org.lflang.generator.uc.UcParameterGenerator
import org.lflang.generator.uc.UcPortGenerator
import org.lflang.generator.uc.UcReactionGenerator
import org.lflang.generator.uc.mics.UcClockSyncGenerator
import org.lflang.lf.*
import org.lflang.target.TargetConfig

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package org.lflang.generator.uc
package org.lflang.generator.uc.federated

import org.lflang.generator.PrependOperator
import org.lflang.generator.uc.UcFileConfig
import org.lflang.joinWithLn

class UcFederatedLaunchScriptGenerator(private val fileConfig: UcFileConfig) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.lflang.generator.uc
package org.lflang.generator.uc.federated

import java.nio.file.Files
import java.nio.file.Path
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
package org.lflang.generator.uc
package org.lflang.generator.uc.federated

import java.nio.file.Path
import java.nio.file.Paths
import org.eclipse.emf.ecore.resource.Resource
import org.lflang.generator.CodeMap
import org.lflang.generator.GeneratorResult
import org.lflang.generator.GeneratorUtils.canGenerate
import org.lflang.generator.GeneratorUtils
import org.lflang.generator.LFGeneratorContext
import org.lflang.generator.uc.UcGenerator
import org.lflang.generator.uc.UcGeneratorNonFederated
import org.lflang.generator.uc.UcInstanceGenerator.Companion.width
import org.lflang.generator.uc.UcPreambleGenerator
import org.lflang.lf.LfFactory
import org.lflang.lf.Reactor
import org.lflang.reactor
Expand Down Expand Up @@ -41,7 +44,7 @@ class UcGeneratorFederated(context: LFGeneratorContext, scopeProvider: LFGlobalS
srcGenPath: Path,
federate: UcFederate
): GeneratorResult.Status {
if (!canGenerate(errorsOccurred(), federate.inst, messageReporter, context))
if (!GeneratorUtils.canGenerate(errorsOccurred(), federate.inst, messageReporter, context))
return GeneratorResult.Status.FAILED

super.copyUserFiles(targetConfig, fileConfig)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package org.lflang.generator.uc
package org.lflang.generator.uc.federated

import java.math.BigInteger
import java.net.Inet4Address
import java.net.Inet6Address
import java.net.InetAddress
import java.net.UnknownHostException
import java.util.concurrent.atomic.AtomicInteger
Expand All @@ -23,7 +25,7 @@ sealed class IPAddress {
companion object {
fun isValidIPv4(ip: String): Boolean {
return try {
InetAddress.getByName(ip) is java.net.Inet4Address
InetAddress.getByName(ip) is Inet4Address
} catch (e: UnknownHostException) {
false
}
Expand All @@ -39,7 +41,7 @@ sealed class IPAddress {
companion object {
fun isValidIPv6(ip: String): Boolean {
return try {
InetAddress.getByName(ip) is java.net.Inet6Address
InetAddress.getByName(ip) is Inet6Address
} catch (e: UnknownHostException) {
false
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
package org.lflang.generator.uc
package org.lflang.generator.uc.federated

import org.lflang.AttributeUtils.getInterfaceAttributes
import org.lflang.AttributeUtils.getLinkAttribute
import org.lflang.generator.uc.NetworkChannelType.*
import org.lflang.generator.uc.UcFederatedConnectionBundle
import org.lflang.generator.uc.federated.NetworkChannelType.*
import org.lflang.generator.uc.mics.getParamInt
import org.lflang.generator.uc.mics.getParamString
import org.lflang.lf.Attribute

// An enumeration of the supported NetworkChannels
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
package org.lflang.generator.uc
package org.lflang.generator.uc.federated

import java.nio.file.Path
import org.lflang.generator.uc.UcCmakeGeneratorFederated
import org.lflang.generator.uc.UcMainGeneratorFederated
import org.lflang.generator.uc.UcMakeGeneratorFederated
import org.lflang.generator.uc.UcPlatformGenerator
import org.lflang.ir.Reactor
import org.lflang.target.property.NoCompileProperty
import org.lflang.target.property.PlatformProperty
import org.lflang.target.property.type.PlatformType
Expand All @@ -9,8 +14,9 @@ import org.lflang.util.FileUtil
class UcPlatformGeneratorFederated(
generator: UcGeneratorFederated,
override val srcGenPath: Path,
private val federate: UcFederate
) : UcPlatformGenerator(generator) {
private val federate: UcFederate,
mainReactor: Reactor
) : UcPlatformGenerator(generator, mainReactor) {

override val buildPath = srcGenPath.resolve("build")
override val targetName: String = federate.codeType
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,27 @@
package org.lflang.generator.uc
package org.lflang.generator.uc.federated

import org.lflang.*
import org.lflang.lf.*
import org.lflang.generator.uc.UcConnectionGenerator

enum class JoiningPolicy {
IMMEDIATELY,
TIMER_ALIGNED;

companion object {
fun parse(str: String): JoiningPolicy =
when (str) {
"\"IMMEDIATELY\"" -> IMMEDIATELY
"\"TIMER_ALIGNED\"" -> TIMER_ALIGNED
else -> throw IllegalArgumentException("Unknown joining policy: $str")
}
}
}

fun JoiningPolicy.toCString() =
when (this) {
JoiningPolicy.IMMEDIATELY -> "JOIN_IMMEDIATELY"
JoiningPolicy.TIMER_ALIGNED -> "JOIN_INDIVIDUAL_TIMER_ALIGNED"
else -> throw IllegalArgumentException("Joining policy not handled")
}

enum class JoiningPolicy {
JOIN_IMMEDIATELY,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.lflang.generator.uc
package org.lflang.generator.uc.federated

import java.util.concurrent.atomic.AtomicInteger

Expand Down
7 changes: 7 additions & 0 deletions include/reactor-uc/platform.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,13 @@ struct Mutex {
/** Construct a Mutex*/
void Mutex_ctor(Mutex *super);

struct RealtimePlatform {
Platform platform;


}


struct Platform {
/**
* @brief Return the current physical time in nanoseconds.
Expand Down
2 changes: 1 addition & 1 deletion lfc/bin/lfc-dev
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#!/bin/bash
#!/nix/store/5mh7kaj2fyv8mk4sfq1brwxgc02884wi-bash-5.2p37/bin/bash

#============================================================================
# Description: Build and run the Lingua Franca compiler (lfc).
Expand Down
2 changes: 1 addition & 1 deletion lfc/cli/base/src/main/java/org/lflang/cli/CliBase.java
Original file line number Diff line number Diff line change
Expand Up @@ -298,7 +298,7 @@ public List<LfIssue> printErrorsIfAny() {
*/
public void validateResource(Resource resource) {
assert resource != null;

System.out.println(resource.toString());
List<Issue> issues = this.validator.validate(resource, CheckMode.ALL, CancelIndicator.NullImpl);

for (Issue issue : issues) {
Expand Down
9 changes: 0 additions & 9 deletions lfc/core/src/main/java/org/lflang/AttributeUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -234,15 +234,6 @@ public static Attribute getJoiningPolicy(Instantiation node) {
return findAttributeByName(node, "joining_policy");
}

public static int getMaxNumberOfPendingEvents(Action node) {
Attribute attr = findAttributeByName(node, "max_pending_events");
if (attr != null) {
return Integer.valueOf(attr.getAttrParms().get(0).getValue());
} else {
return -1;
}
}

public static int getConnectionBufferSize(Connection node) {
Attribute attr = findAttributeByName(node, "buffer");
if (attr != null) {
Expand Down
2 changes: 1 addition & 1 deletion lfc/core/src/main/java/org/lflang/LinguaFranca.xtext
Original file line number Diff line number Diff line change
Expand Up @@ -533,4 +533,4 @@ Token:
'@' |
// Single quotes
"'"
;
;
59 changes: 33 additions & 26 deletions lfc/core/src/main/java/org/lflang/generator/LFGenerator.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
package org.lflang.generator;

import static org.lflang.generator.uc.UcGeneratorKt.createUcGenerator;
import static org.lflang.generator.uc2.UcGeneratorKt.createUcGenerator;

import com.google.common.collect.Lists;
import com.google.inject.Inject;
import com.google.inject.Injector;
import java.nio.file.Path;
Expand All @@ -12,7 +13,12 @@
import org.lflang.FileConfig;
import org.lflang.MessageReporter;
import org.lflang.ast.ASTUtils;
import org.lflang.generator.uc.UcFileConfig;
import org.lflang.generator.uc2.UcFileConfig;
import org.lflang.generator.uc2.UcGenerator;
import org.lflang.generator.uc2.UcGeneratorNonFederated;
import org.lflang.ir.Environment;
import org.lflang.ir.Federate;
import org.lflang.ir.XTextConverter;
import org.lflang.scoping.LFGlobalScopeProvider;
import org.lflang.target.Target;

Expand Down Expand Up @@ -41,29 +47,27 @@ public static FileConfig createFileConfig(
// return new FederationFileConfig(resource, srcGenBasePath, useHierarchicalBin);
// }

return switch (target) {
// case CCPP, C -> new CFileConfig(resource, srcGenBasePath, useHierarchicalBin);
// case Python -> new PyFileConfig(resource, srcGenBasePath, useHierarchicalBin);
// case CPP -> new CppFileConfig(resource, srcGenBasePath, useHierarchicalBin);
// case Rust -> new RustFileConfig(resource, srcGenBasePath, useHierarchicalBin);
// case TS -> new TSFileConfig(resource, srcGenBasePath, useHierarchicalBin);
case UC -> new UcFileConfig(resource, srcGenBasePath, useHierarchicalBin, runtimeSymlink);
};
return new UcFileConfig(resource, srcGenBasePath, useHierarchicalBin, runtimeSymlink);
}

/** Create a generator object for the given target. */
private GeneratorBase createGenerator(LFGeneratorContext context) {
private UcGenerator createGenerator(Resource resource, LFGeneratorContext context, MessageReporter messageReporter) {
final Target target = Target.fromDecl(ASTUtils.targetDecl(context.getFileConfig().resource));
assert target != null;
return switch (target) {
// case C -> new CGenerator(context, false);
// case CCPP -> new CGenerator(context, true);
// case Python -> new PythonGenerator(context);
// case CPP -> new CppGenerator(context, scopeProvider);
// case TS -> new TSGenerator(context);
// case Rust -> new RustGenerator(context, scopeProvider);
case UC -> createUcGenerator(context, scopeProvider);
};
var converter = new XTextConverter(resource);
var env = converter.convert();

var generator = createUcGenerator(
context,
scopeProvider,
env.getFirst(),
env.getFirst().getMainReactor(),
messageReporter
);

var gen1 = (UcGeneratorNonFederated) generator;
gen1.file = env.getSecond();

return generator;
}

@Override
Expand All @@ -76,18 +80,21 @@ public void doGenerate(Resource resource, IFileSystemAccess2 fsa, IGeneratorCont
lfContext = LFGeneratorContext.lfGeneratorContextOf(resource, fsa, context);
}


// The fastest way to generate code is to not generate any code.
if (lfContext.getMode() == LFGeneratorContext.Mode.LSP_FAST) return;

final GeneratorBase generator = createGenerator(lfContext);
if (generator != null) {
generatorErrorsOccurred = generator.errorsOccurred();
generator.doGenerate(resource, lfContext);
}
final MessageReporter messageReporter = lfContext.getErrorReporter();
if (messageReporter instanceof LanguageServerMessageReporter) {
((LanguageServerMessageReporter) messageReporter).publishDiagnostics();
}

var generator = createGenerator(resource, lfContext, messageReporter);
var generator1 = (UcGeneratorNonFederated)generator;
generatorErrorsOccurred = generator.errorsOccurred();

generator.doGenerate(resource, lfContext);

}

/** Return true if errors occurred in the last call to doGenerate(). */
Expand Down
Loading
Loading