|
1 | 1 | package org.lflang.generator.uc |
2 | 2 |
|
3 | | -import org.lflang.* |
4 | | -import org.lflang.AttributeUtils.getMaxNumberOfPendingEvents |
5 | 3 | import org.lflang.generator.PrependOperator |
6 | | -import org.lflang.generator.orZero |
7 | | -import org.lflang.generator.uc.UcPortGenerator.Companion.arrayLength |
8 | | -import org.lflang.generator.uc.UcPortGenerator.Companion.isArray |
9 | | -import org.lflang.generator.uc.UcReactorGenerator.Companion.codeType |
10 | | -import org.lflang.generator.uc.UcReactorGenerator.Companion.getEffects |
11 | | -import org.lflang.generator.uc.UcReactorGenerator.Companion.getObservers |
12 | | -import org.lflang.generator.uc.UcReactorGenerator.Companion.getSources |
13 | | -import org.lflang.generator.uc.UcReactorGenerator.Companion.hasShutdown |
14 | | -import org.lflang.generator.uc.UcReactorGenerator.Companion.hasStartup |
15 | | -import org.lflang.lf.* |
| 4 | +import org.lflang.ir.Reactor |
| 5 | +import org.lflang.ir.Action |
| 6 | +import org.lflang.ir.Shutdown |
| 7 | +import org.lflang.ir.Startup |
16 | 8 |
|
17 | 9 | class UcActionGenerator(private val reactor: Reactor) { |
18 | | - |
19 | | - companion object { |
20 | | - public val Action.maxNumPendingEvents |
21 | | - get(): Int { |
22 | | - val num = getMaxNumberOfPendingEvents(this) |
23 | | - return if (num > 0) num else 1 |
24 | | - } |
25 | | - } |
26 | | - |
27 | | - /** Returns the C Enum representing the type of action. */ |
28 | | - private val Action.actionType |
29 | | - get(): String = if (isPhysical) "PhysicalAction" else "LogicalAction" |
30 | | - |
31 | 10 | private fun generateSelfStruct(action: Action): String { |
32 | | - if (action.type == null) { |
33 | | - return "LF_DEFINE_ACTION_STRUCT_VOID(${reactor.codeType}, ${action.name}, ${action.actionType}, ${reactor.getEffects(action).size}, ${reactor.getSources(action).size}, ${reactor.getObservers(action).size}, ${action.maxNumPendingEvents});" |
34 | | - } else if (action.type.isArray) { |
35 | | - return "LF_DEFINE_ACTION_STRUCT_ARRAY(${reactor.codeType}, ${action.name}, ${action.actionType}, ${reactor.getEffects(action).size}, ${reactor.getSources(action).size}, ${reactor.getObservers(action).size}, ${action.maxNumPendingEvents}, ${action.type.id}, ${action.type.arrayLength});" |
36 | | - } else { |
37 | | - return "LF_DEFINE_ACTION_STRUCT(${reactor.codeType}, ${action.name}, ${action.actionType}, ${reactor.getEffects(action).size}, ${reactor.getSources(action).size}, ${reactor.getObservers(action).size}, ${action.maxNumPendingEvents}, ${action.type.toText()});" |
38 | | - } |
| 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 | + } |
39 | 18 | } |
40 | 19 |
|
41 | 20 | private fun generateCtor(action: Action) = |
42 | 21 | with(PrependOperator) { |
43 | 22 | """ |
44 | | - |LF_DEFINE_ACTION_CTOR${if (action.type == null) "_VOID" else ""}(${reactor.codeType}, ${action.name}, ${action.actionType}, ${reactor.getEffects(action).size}, ${reactor.getSources(action).size}, ${reactor.getObservers(action).size}, ${action.maxNumPendingEvents} ${if (action.type != null) ", ${action.type.toText()}" else ""}); |
| 23 | + |LF_DEFINE_ACTION_CTOR${if (action.type.isVoid) "_VOID" else ""}(${reactor.codeType}, ${action.lfName}, ${action.actionType}, ${action.getEffects().size}, ${action.getSources().size}, ${action.getObservers().size}, ${action.maxNumPendingEvents} ${if (action.type.isVoid) ", ${action.type.targetCode}" else ""}); |
45 | 24 | | |
46 | 25 | """ |
47 | 26 | .trimMargin() |
48 | 27 | } |
49 | 28 |
|
50 | | - private fun generateCtor(builtin: BuiltinTrigger) = |
51 | | - (if (builtin == BuiltinTrigger.STARTUP) "LF_DEFINE_STARTUP_CTOR" |
52 | | - else "LF_DEFINE_SHUTDOWN_CTOR") + "(${reactor.codeType});\n" |
53 | 29 |
|
54 | | - fun generateCtors(): String { |
55 | | - var code = reactor.allActions.joinToString(separator = "\n") { generateCtor(it) } |
56 | | - if (reactor.hasStartup) code += generateCtor(BuiltinTrigger.STARTUP) |
57 | | - if (reactor.hasShutdown) code += generateCtor(BuiltinTrigger.SHUTDOWN) |
58 | | - return code |
59 | | - } |
| 30 | + fun generateCtors(): String = |
| 31 | + reactor.actions.joinToString(separator = "\n") { generateCtor(it) } |
60 | 32 |
|
61 | | - private fun generateSelfStruct(builtin: BuiltinTrigger) = |
62 | | - (if (builtin == BuiltinTrigger.STARTUP) "LF_DEFINE_STARTUP_STRUCT" |
63 | | - else "LF_DEFINE_SHUTDOWN_STRUCT") + |
64 | | - "(${reactor.codeType}, ${reactor.getEffects(builtin).size}, ${reactor.getObservers(builtin).size});\n" |
| 33 | + fun generateSelfStructs(): String = |
| 34 | + reactor.actions.joinToString(separator = "\n") { generateSelfStruct(it) } |
65 | 35 |
|
66 | | - fun generateSelfStructs(): String { |
67 | | - var code = reactor.allActions.joinToString(separator = "\n") { generateSelfStruct(it) } |
68 | | - if (reactor.hasStartup) { |
69 | | - code += generateSelfStruct(BuiltinTrigger.STARTUP) |
70 | | - } |
71 | | - if (reactor.hasShutdown) { |
72 | | - code += generateSelfStruct(BuiltinTrigger.SHUTDOWN) |
73 | | - } |
74 | | - return code |
75 | | - } |
76 | 36 |
|
77 | | - fun generateReactorStructFields(): String { |
78 | | - var code = |
79 | | - reactor.allActions.joinToString( |
| 37 | + fun generateReactorStructFields(): String = |
| 38 | + reactor.actions.joinToString( |
80 | 39 | prefix = "// Actions and builtin triggers\n", separator = "\n", postfix = "\n") { |
81 | | - "LF_ACTION_INSTANCE(${reactor.codeType}, ${it.name});" |
| 40 | + "LF_ACTION_INSTANCE(${reactor.codeType}, ${it.lfName});" |
82 | 41 | } |
83 | | - if (reactor.hasStartup) code += "LF_STARTUP_INSTANCE(${reactor.codeType});" |
84 | | - if (reactor.hasShutdown) code += "LF_SHUTDOWN_INSTANCE(${reactor.codeType});" |
85 | | - return code |
86 | | - } |
87 | 42 |
|
88 | 43 | private fun generateReactorCtorCode(action: Action) = |
89 | | - "LF_INITIALIZE_ACTION(${reactor.codeType}, ${action.name}, ${action.minDelay.orZero().toCCode()}, ${action.minSpacing.orZero().toCCode()});" |
90 | | - |
91 | | - private fun generateReactorCtorCodeStartup() = "LF_INITIALIZE_STARTUP(${reactor.codeType});" |
| 44 | + "LF_INITIALIZE_ACTION(${reactor.codeType}, ${action.lfName}, ${action.minDelay.toCCode()}, ${action.minSpacing.toCCode()});" |
92 | 45 |
|
93 | | - private fun generateReactorCtorCodeShutdown() = "LF_INITIALIZE_SHUTDOWN(${reactor.codeType});" |
94 | 46 |
|
95 | | - fun generateReactorCtorCodes(): String { |
96 | | - var code = |
97 | | - reactor.allActions.joinToString( |
| 47 | + fun generateReactorCtorCodes(): String = |
| 48 | + reactor.actions.joinToString( |
98 | 49 | prefix = "// Initialize actions and builtin triggers\n", |
99 | 50 | separator = "\n", |
100 | 51 | postfix = "\n") { |
101 | 52 | generateReactorCtorCode(it) |
102 | 53 | } |
103 | | - if (reactor.hasStartup) code += "${generateReactorCtorCodeStartup()}\n" |
104 | | - if (reactor.hasShutdown) code += "${generateReactorCtorCodeShutdown()}\n" |
105 | | - return code |
106 | | - } |
| 54 | +} |
| 55 | + |
| 56 | +class BuiltInGenerator(private val reactor: Reactor) { |
| 57 | + private fun generateShutdownCtor() = |
| 58 | + "LF_DEFINE_SHUTDOWN_CTOR(${reactor.codeType});\n" |
| 59 | + |
| 60 | + private fun generateStartUpCtor() = |
| 61 | + "LF_DEFINE_STARTUP_CTOR(${reactor.codeType});\n" |
| 62 | + |
| 63 | + private fun generateShutdownSelfStruct(trigger: Shutdown) = |
| 64 | + "LF_DEFINE_SHUTDOWN_STRUCT(${reactor.codeType}, ${trigger.getEffects().size}, ${trigger.getObservers().size});\n" |
| 65 | + |
| 66 | + private fun generateStartupSelfStruct(trigger: Startup) = |
| 67 | + "LF_DEFINE_STARTUP_STRUCT(${reactor.codeType}, ${trigger.getEffects().size}, ${trigger.getObservers().size});\n" |
| 68 | + |
| 69 | + |
| 70 | + private fun generateReactorCtorCodeStartup() = "LF_INITIALIZE_STARTUP(${reactor.codeType});\n" |
| 71 | + private fun generateReactorCtorCodeShutdown() = "LF_INITIALIZE_SHUTDOWN(${reactor.codeType});\n" |
| 72 | + |
| 73 | + fun generateCtors() : String { |
| 74 | + var code = String() |
| 75 | + if (reactor.hasStartup) code += generateStartUpCtor() |
| 76 | + if (reactor.hasShutdown) code += generateShutdownCtor() |
| 77 | + return code |
| 78 | + } |
| 79 | + |
| 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 | + } |
| 86 | + |
| 87 | + fun generateReactorCtorCodes(): String { |
| 88 | + var code = String() |
| 89 | + if (reactor.hasStartup) code += generateReactorCtorCodeStartup() |
| 90 | + if (reactor.hasShutdown) code += generateReactorCtorCodeShutdown() |
| 91 | + return code |
| 92 | + } |
107 | 93 | } |
0 commit comments