Skip to content

Commit 1e450c1

Browse files
committed
UcReactionGenerator
1 parent e6fb4e1 commit 1e450c1

27 files changed

+444
-404
lines changed
Lines changed: 43 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
11
package org.lflang.generator.uc
22

33
import org.lflang.generator.PrependOperator
4-
import org.lflang.ir.Reactor
54
import org.lflang.ir.Action
5+
import org.lflang.ir.Reactor
66
import org.lflang.ir.Shutdown
77
import org.lflang.ir.Startup
88

99
class UcActionGenerator(private val reactor: Reactor) {
1010
private fun generateSelfStruct(action: Action): String {
11-
return if (action.type.isVoid) {
12-
"LF_DEFINE_ACTION_STRUCT_VOID(${reactor.codeType}, ${action.lfName}, ${action.actionType}, ${action.getEffects().size}, ${action.getSources().size}, ${action.getObservers().size}, ${action.maxNumPendingEvents});"
13-
} else if (action.type.isArray) {
14-
"LF_DEFINE_ACTION_STRUCT_ARRAY(${reactor.codeType}, ${action.lfName}, ${action.actionType}, ${action.getEffects().size}, ${action.getSources().size}, ${action.getObservers().size}, ${action.maxNumPendingEvents}, ${action.type.targetCode}, ${action.type.arrayLength});"
15-
} else {
16-
"LF_DEFINE_ACTION_STRUCT(${reactor.codeType}, ${action.lfName}, ${action.actionType}, ${action.getEffects().size}, ${action.getSources().size}, ${action.getObservers().size}, ${action.maxNumPendingEvents}, ${action.type.targetCode});"
17-
}
11+
return if (action.type.isVoid) {
12+
"LF_DEFINE_ACTION_STRUCT_VOID(${reactor.codeType}, ${action.lfName}, ${action.actionType}, ${action.getEffects().size}, ${action.getSources().size}, ${action.getObservers().size}, ${action.maxNumPendingEvents});"
13+
} else if (action.type.isArray) {
14+
"LF_DEFINE_ACTION_STRUCT_ARRAY(${reactor.codeType}, ${action.lfName}, ${action.actionType}, ${action.getEffects().size}, ${action.getSources().size}, ${action.getObservers().size}, ${action.maxNumPendingEvents}, ${action.type.targetCode}, ${action.type.arrayLength});"
15+
} else {
16+
"LF_DEFINE_ACTION_STRUCT(${reactor.codeType}, ${action.lfName}, ${action.actionType}, ${action.getEffects().size}, ${action.getSources().size}, ${action.getObservers().size}, ${action.maxNumPendingEvents}, ${action.type.targetCode});"
17+
}
1818
}
1919

2020
private fun generateCtor(action: Action) =
@@ -26,68 +26,62 @@ class UcActionGenerator(private val reactor: Reactor) {
2626
.trimMargin()
2727
}
2828

29-
30-
fun generateCtors(): String =
31-
reactor.actions.joinToString(separator = "\n") { generateCtor(it) }
29+
fun generateCtors(): String = reactor.actions.joinToString(separator = "\n") { generateCtor(it) }
3230

3331
fun generateSelfStructs(): String =
3432
reactor.actions.joinToString(separator = "\n") { generateSelfStruct(it) }
3533

36-
3734
fun generateReactorStructFields(): String =
3835
reactor.actions.joinToString(
39-
prefix = "// Actions and builtin triggers\n", separator = "\n", postfix = "\n") {
40-
"LF_ACTION_INSTANCE(${reactor.codeType}, ${it.lfName});"
41-
}
36+
prefix = "// Actions and builtin triggers\n", separator = "\n", postfix = "\n") {
37+
"LF_ACTION_INSTANCE(${reactor.codeType}, ${it.lfName});"
38+
}
4239

4340
private fun generateReactorCtorCode(action: Action) =
4441
"LF_INITIALIZE_ACTION(${reactor.codeType}, ${action.lfName}, ${action.minDelay.toCCode()}, ${action.minSpacing.toCCode()});"
4542

46-
4743
fun generateReactorCtorCodes(): String =
4844
reactor.actions.joinToString(
49-
prefix = "// Initialize actions and builtin triggers\n",
50-
separator = "\n",
51-
postfix = "\n") {
52-
generateReactorCtorCode(it)
53-
}
45+
prefix = "// Initialize actions and builtin triggers\n",
46+
separator = "\n",
47+
postfix = "\n") {
48+
generateReactorCtorCode(it)
49+
}
5450
}
5551

5652
class BuiltInGenerator(private val reactor: Reactor) {
57-
private fun generateShutdownCtor() =
58-
"LF_DEFINE_SHUTDOWN_CTOR(${reactor.codeType});\n"
53+
private fun generateShutdownCtor() = "LF_DEFINE_SHUTDOWN_CTOR(${reactor.codeType});\n"
5954

60-
private fun generateStartUpCtor() =
61-
"LF_DEFINE_STARTUP_CTOR(${reactor.codeType});\n"
55+
private fun generateStartUpCtor() = "LF_DEFINE_STARTUP_CTOR(${reactor.codeType});\n"
6256

63-
private fun generateShutdownSelfStruct(trigger: Shutdown) =
64-
"LF_DEFINE_SHUTDOWN_STRUCT(${reactor.codeType}, ${trigger.getEffects().size}, ${trigger.getObservers().size});\n"
57+
private fun generateShutdownSelfStruct(trigger: Shutdown) =
58+
"LF_DEFINE_SHUTDOWN_STRUCT(${reactor.codeType}, ${trigger.getEffects().size}, ${trigger.getObservers().size});\n"
6559

66-
private fun generateStartupSelfStruct(trigger: Startup) =
67-
"LF_DEFINE_STARTUP_STRUCT(${reactor.codeType}, ${trigger.getEffects().size}, ${trigger.getObservers().size});\n"
60+
private fun generateStartupSelfStruct(trigger: Startup) =
61+
"LF_DEFINE_STARTUP_STRUCT(${reactor.codeType}, ${trigger.getEffects().size}, ${trigger.getObservers().size});\n"
6862

63+
private fun generateReactorCtorCodeStartup() = "LF_INITIALIZE_STARTUP(${reactor.codeType});\n"
6964

70-
private fun generateReactorCtorCodeStartup() = "LF_INITIALIZE_STARTUP(${reactor.codeType});\n"
71-
private fun generateReactorCtorCodeShutdown() = "LF_INITIALIZE_SHUTDOWN(${reactor.codeType});\n"
65+
private fun generateReactorCtorCodeShutdown() = "LF_INITIALIZE_SHUTDOWN(${reactor.codeType});\n"
7266

73-
fun generateCtors() : String {
74-
var code = String()
75-
if (reactor.hasStartup) code += generateStartUpCtor()
76-
if (reactor.hasShutdown) code += generateShutdownCtor()
77-
return code
78-
}
67+
fun generateCtors(): String {
68+
var code = String()
69+
if (reactor.hasStartup) code += generateStartUpCtor()
70+
if (reactor.hasShutdown) code += generateShutdownCtor()
71+
return code
72+
}
7973

80-
fun generateSelfStructs(): String {
81-
var code = String()
82-
if (reactor.hasStartup) code += generateStartupSelfStruct(reactor.startup!!)
83-
if (reactor.hasShutdown) code += generateShutdownSelfStruct(reactor.shutdown!!)
84-
return code
85-
}
74+
fun generateSelfStructs(): String {
75+
var code = String()
76+
if (reactor.hasStartup) code += generateStartupSelfStruct(reactor.startup!!)
77+
if (reactor.hasShutdown) code += generateShutdownSelfStruct(reactor.shutdown!!)
78+
return code
79+
}
8680

87-
fun generateReactorCtorCodes(): String {
88-
var code = String()
89-
if (reactor.hasStartup) code += generateReactorCtorCodeStartup()
90-
if (reactor.hasShutdown) code += generateReactorCtorCodeShutdown()
91-
return code
92-
}
81+
fun generateReactorCtorCodes(): String {
82+
var code = String()
83+
if (reactor.hasStartup) code += generateReactorCtorCodeStartup()
84+
if (reactor.hasShutdown) code += generateReactorCtorCodeShutdown()
85+
return code
86+
}
9387
}

lfc/core/src/main/kotlin/org/lflang/generator/uc/UcConnectionGenerator.kt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
package org.lflang.generator.uc
22

3-
import org.lflang.generator.uc.federated.UcFederate
4-
import org.lflang.ir.Connection
5-
import org.lflang.ir.Reactor
3+
import java.util.LinkedList
4+
import java.util.Queue
65
import org.lflang.generator.PrependOperator
6+
import org.lflang.generator.uc.federated.UcFederate
77
import org.lflang.generator.uc.federated.UcNetworkInterfaceFactory
88
import org.lflang.generator.uc.mics.name
99
import org.lflang.generator.uc.mics.toCCode
10+
import org.lflang.ir.Connection
1011
import org.lflang.ir.Instantiation
1112
import org.lflang.ir.Port
13+
import org.lflang.ir.Reactor
1214
import org.lflang.joinWithLn
13-
import java.util.LinkedList
14-
import java.util.Queue
1515

1616
/**
1717
* This generator creates code for configuring the connections between reactors. This is perhaps the
@@ -111,7 +111,7 @@ class UcConnectionGenerator(
111111
channels.filter {
112112
it.conn.delayString == c.conn.delayString &&
113113
it.conn.isPhysical == c.conn.isPhysical &&
114-
it.src.port == c.src.port && //TODO?
114+
it.src.port == c.src.port && // TODO?
115115
it.src.federate == c.src.federate &&
116116
it.dest.federate == c.dest.federate &&
117117
it.getChannelType() == c.getChannelType()

lfc/core/src/main/kotlin/org/lflang/generator/uc/UcConnectionUtils.kt

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import org.lflang.ir.Connection
1010
import org.lflang.ir.Port
1111
import org.lflang.ir.Reactor
1212

13-
1413
/**
1514
* A UcConnectionChannel is the fundamental lowest-level representation of a connection in a LF
1615
* program. It connects two UcChannels, one at the source and one at the destination.
@@ -121,9 +120,9 @@ class UcFederatedGroupedConnection(
121120
* federate.
122121
*/
123122
class UcFederatedConnectionBundle(
124-
val src: UcFederate,
125-
val dest: UcFederate,
126-
val groupedConnections: List<UcFederatedGroupedConnection>
123+
val src: UcFederate,
124+
val dest: UcFederate,
125+
val groupedConnections: List<UcFederatedGroupedConnection>
127126
) {
128127

129128
init {
@@ -150,7 +149,13 @@ class UcFederatedConnectionBundle(
150149
* An UcChannel represents a single channel of an LF Port. Due to Multiports and Banks, each LF Port
151150
* can have multiple channels.
152151
*/
153-
class UcChannel(val container: Reactor?, val port: Port, val portIdx: Int, val bankIdx: Int, val federate: UcFederate?) {
152+
class UcChannel(
153+
val container: Reactor?,
154+
val port: Port,
155+
val portIdx: Int,
156+
val bankIdx: Int,
157+
val federate: UcFederate?
158+
) {
154159
fun getCodePortIdx() = portIdx
155160

156161
fun getCodeBankIdx() = if (federate == null) bankIdx else 0

lfc/core/src/main/kotlin/org/lflang/generator/uc/UcFileConfig.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,5 +39,6 @@ class UcFileConfig(
3939
fun getReactorSourcePath(r: Reactor): Path = getGenDir(r.eResource()).resolve("${r.name}.c")
4040

4141
/** Path to the header file corresponding to this reactor */
42-
fun getReactorHeaderPath(r: org.lflang.ir.Reactor): Path = getGenDir(r.eResource()).resolve("${r.name}.h")
42+
fun getReactorHeaderPath(r: org.lflang.ir.Reactor): Path =
43+
getGenDir(r.eResource()).resolve("${r.name}.h")
4344
}

lfc/core/src/main/kotlin/org/lflang/generator/uc/UcGenerator.kt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,24 @@
11
package org.lflang.generator.uc
22

3+
import java.nio.file.Path
34
import org.apache.commons.lang3.tuple.MutablePair
45
import org.lflang.generator.LFGeneratorContext
56
import org.lflang.ir.Environment
67
import org.lflang.ir.File
78
import org.lflang.ir.Instantiation
89
import org.lflang.ir.Reactor
910
import org.lflang.scoping.LFGlobalScopeProvider
10-
import java.nio.file.Path
1111

1212
/** Creates either a Federated or NonFederated generator depending on the type of LF program */
1313
fun createUcGenerator(
14-
context: LFGeneratorContext,
15-
scopeProvider: LFGlobalScopeProvider,
16-
env: Environment
14+
context: LFGeneratorContext,
15+
scopeProvider: LFGlobalScopeProvider,
16+
env: Environment
1717
): UcGenerator {
1818
if (env.isFederated) {
19-
//return UcGeneratorFederated(context, scopeProvider)
19+
// return UcGeneratorFederated(context, scopeProvider)
2020
} else {
21-
//return UcGeneratorNonFederated(context, scopeProvider)
21+
// return UcGeneratorNonFederated(context, scopeProvider)
2222
}
2323
return UcGeneratorNonFederated(context, scopeProvider)
2424
}

lfc/core/src/main/kotlin/org/lflang/generator/uc/UcGeneratorNonFederated.kt

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,29 @@
11
package org.lflang.generator.uc
22

3+
import java.nio.file.Path
34
import org.lflang.generator.GeneratorResult
4-
import org.lflang.generator.GeneratorUtils.canGenerate
55
import org.lflang.generator.LFGeneratorContext
6+
import org.lflang.ir.Environment
7+
import org.lflang.ir.Federate
68
import org.lflang.ir.File
79
import org.lflang.ir.Reactor
810
import org.lflang.scoping.LFGlobalScopeProvider
911
import org.lflang.target.property.NoCompileProperty
1012
import org.lflang.target.property.type.PlatformType
1113
import org.lflang.util.FileUtil
12-
import java.nio.file.Path
1314

14-
class UcGeneratorNonFederated(context: LFGeneratorContext, scopeProvider: LFGlobalScopeProvider) :
15-
UcGenerator(context, scopeProvider) {
16-
fun doGenerateReactor(
17-
file: File,
15+
class UcGeneratorNonFederated(
16+
val env: Environment,
17+
val federate: Federate,
1818
context: LFGeneratorContext,
19-
srcGenPath: Path,
19+
scopeProvider: LFGlobalScopeProvider
20+
) : UcGenerator(context, scopeProvider) {
21+
fun doGenerateReactor(
22+
file: File,
23+
context: LFGeneratorContext,
24+
srcGenPath: Path,
2025
): GeneratorResult.Status {
21-
//if (!canGenerate(errorsOccurred(), mainDef, messageReporter, context))
26+
// if (!canGenerate(errorsOccurred(), mainDef, messageReporter, context))
2227
// return GeneratorResult.Status.FAILED
2328

2429
if (context.args.generateFedTemplates) {
@@ -29,10 +34,10 @@ class UcGeneratorNonFederated(context: LFGeneratorContext, scopeProvider: LFGlob
2934
}
3035

3136
// Generate header and source files for all instantiated reactors.
32-
getAllInstantiatedReactors(mainDef.reactor).map { generateReactorFiles(it, srcGenPath) }
37+
getAllInstantiatedReactors(federate.mainReactor).map { generateReactorFiles(it, srcGenPath) }
3338

3439
// Generate header and source files for the main reactor.
35-
generateReactorFiles(mainDef.reactor, srcGenPath)
40+
generateReactorFiles(federate.mainReactor, srcGenPath)
3641

3742
// Generate preambles for all reactors.
3843
for (r in getAllImportedResources(resource)) {
@@ -46,7 +51,7 @@ class UcGeneratorNonFederated(context: LFGeneratorContext, scopeProvider: LFGlob
4651
}
4752

4853
override fun doGenerate(file: File, context: LFGeneratorContext) {
49-
super.doGenerate(resource, context)
54+
super.doGenerate(file, context)
5055

5156
if (getAllFederates().isNotEmpty()) {
5257
context.errorReporter.nowhere().error("Federated program detected in non-federated generator")

lfc/core/src/main/kotlin/org/lflang/generator/uc/UcInstanceGenerator.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package org.lflang.generator.uc
33
import org.lflang.generator.uc.mics.name
44
import org.lflang.ir.Reactor
55

6-
76
class UcInstanceGenerator(
87
private val reactor: Reactor,
98
private val parameters: UcParameterGenerator,

lfc/core/src/main/kotlin/org/lflang/generator/uc/UcMakeGenerator.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ import org.lflang.FileConfig
66
import org.lflang.generator.PrependOperator
77
import org.lflang.generator.uc.federated.NetworkChannelType
88
import org.lflang.generator.uc.federated.UcFederate
9-
import org.lflang.joinWithLn
109
import org.lflang.ir.Reactor
10+
import org.lflang.joinWithLn
1111
import org.lflang.target.TargetConfig
1212
import org.lflang.toUnixString
1313

lfc/core/src/main/kotlin/org/lflang/generator/uc/UcPlatformGenerator.kt

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,14 @@
11
package org.lflang.generator.uc
22

3+
import java.nio.file.Files
4+
import java.nio.file.Path
5+
import java.nio.file.Paths
6+
import kotlin.io.path.ExperimentalPathApi
7+
import kotlin.io.path.createSymbolicLinkPointingTo
8+
import kotlin.io.path.deleteIfExists
9+
import kotlin.io.path.deleteRecursively
10+
import kotlin.io.path.exists
11+
import kotlin.io.path.isSymbolicLink
312
import org.lflang.MessageReporter
413
import org.lflang.generator.CodeMap
514
import org.lflang.generator.GeneratorCommandFactory
@@ -10,15 +19,6 @@ import org.lflang.target.property.BuildTypeProperty
1019
import org.lflang.target.property.type.BuildTypeType
1120
import org.lflang.toUnixString
1221
import org.lflang.util.FileUtil
13-
import java.nio.file.Files
14-
import java.nio.file.Path
15-
import java.nio.file.Paths
16-
import kotlin.io.path.ExperimentalPathApi
17-
import kotlin.io.path.createSymbolicLinkPointingTo
18-
import kotlin.io.path.deleteIfExists
19-
import kotlin.io.path.deleteRecursively
20-
import kotlin.io.path.exists
21-
import kotlin.io.path.isSymbolicLink
2222
import org.lflang.util.LFCommand
2323

2424
/** Abstract class for generating platform specific files and invoking the target compiler. */

lfc/core/src/main/kotlin/org/lflang/generator/uc/UcPlatformGeneratorNonFederated.kt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
package org.lflang.generator.uc
22

3-
import org.lflang.ir.Reactor
43
import java.nio.file.Path
4+
import org.lflang.ir.Reactor
55
import org.lflang.reactor
66

7-
class UcPlatformGeneratorNonFederated(generator: UcGenerator, override val srcGenPath: Path, mainReactor: Reactor) :
8-
UcPlatformGenerator(generator, mainReactor) {
7+
class UcPlatformGeneratorNonFederated(
8+
generator: UcGenerator,
9+
override val srcGenPath: Path,
10+
mainReactor: Reactor
11+
) : UcPlatformGenerator(generator, mainReactor) {
912

1013
override val buildPath = srcGenPath.resolve("build")
1114
override val targetName = fileConfig.name

0 commit comments

Comments
 (0)