From 3e6d5745b189b51f879b9e2c95ff07afe4c0eacd Mon Sep 17 00:00:00 2001 From: Logan Kenwright Date: Tue, 17 Feb 2026 10:47:17 +1300 Subject: [PATCH 1/3] prevent pre() from adding underscores to generated C variables for IO signals --- .../scg/processors/codegen/c/CCodeGeneratorLogicModule.xtend | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/plugins/de.cau.cs.kieler.scg/src/de/cau/cs/kieler/scg/processors/codegen/c/CCodeGeneratorLogicModule.xtend b/plugins/de.cau.cs.kieler.scg/src/de/cau/cs/kieler/scg/processors/codegen/c/CCodeGeneratorLogicModule.xtend index d1ecbc35a8..de845f7554 100644 --- a/plugins/de.cau.cs.kieler.scg/src/de/cau/cs/kieler/scg/processors/codegen/c/CCodeGeneratorLogicModule.xtend +++ b/plugins/de.cau.cs.kieler.scg/src/de/cau/cs/kieler/scg/processors/codegen/c/CCodeGeneratorLogicModule.xtend @@ -431,10 +431,11 @@ class CCodeGeneratorLogicModule extends SCGCodeGeneratorModule { reset.code.append(indentation).append(struct.getVariableName).append(struct.separator).append(name).append(" = 0;\n") // Add the "register save" in the tick function. - prePrefix = "_" + valuedObjectPrefix = struct.getVariableName + struct.separator + prePrefix = "" tick.code.append(indentation) tick.code.append(struct.getVariableName).append(struct.separator).append(name).append(" = ") - tick.code.append(struct.getVariableName).append(struct.separator).append(operatorExpression.serializeHR).append(";\n") + tick.code.append(operatorExpression.subExpressions.head.serializeHR).append(";\n") } protected def List splitAssignment(Assignment assignment) { From 47e8f0cfa6c09f4e09a0ed53583d24a1f1787c2a Mon Sep 17 00:00:00 2001 From: Logan Kenwright Date: Tue, 17 Feb 2026 12:41:43 +1300 Subject: [PATCH 2/3] allow handing of host types --- .../incremental/EmitTransformation.xtend | 5 +++-- .../incremental/SCLTransformation.xtend | 4 ++++ .../incremental/SignalTransformation.xtend | 22 ++++++++++--------- .../SCLToSCGTransformation.xtend | 4 ++++ 4 files changed, 23 insertions(+), 12 deletions(-) diff --git a/plugins/de.cau.cs.kieler.esterel/src/de/cau/cs/kieler/esterel/processors/transformators/incremental/EmitTransformation.xtend b/plugins/de.cau.cs.kieler.esterel/src/de/cau/cs/kieler/esterel/processors/transformators/incremental/EmitTransformation.xtend index 1b507048f2..3084c57d23 100644 --- a/plugins/de.cau.cs.kieler.esterel/src/de/cau/cs/kieler/esterel/processors/transformators/incremental/EmitTransformation.xtend +++ b/plugins/de.cau.cs.kieler.esterel/src/de/cau/cs/kieler/esterel/processors/transformators/incremental/EmitTransformation.xtend @@ -47,7 +47,8 @@ class EmitTransformation extends AbstractSCEstDynamicProcessor { override transform(Emit emit) { var signal = emit.signal as Signal - if (emit.expression === null && signal.type != ValueType.PURE) { + val isValued = signal.type != ValueType.PURE || signal.idType !== null + if (emit.expression === null && isValued) { throw new UnsupportedOperationException("The following signal is a valued signal. Thus a non valued emit is invalid! " + signal.toString) } @@ -57,7 +58,7 @@ class EmitTransformation extends AbstractSCEstDynamicProcessor { val assign = createAssignment(signal.createSignalReference, expr) emit.replace(assign) if (emit.expression !== null) { - if (signal.type != ValueType.PURE) { + if (isValued) { var Assignment assign2 // if no combineOperator exists, handle valued signal like Karsten Rathlev did in his master thesis if (signal.combineOperator === null || signal.combineOperator == CombineOperator.NONE) { diff --git a/plugins/de.cau.cs.kieler.esterel/src/de/cau/cs/kieler/esterel/processors/transformators/incremental/SCLTransformation.xtend b/plugins/de.cau.cs.kieler.esterel/src/de/cau/cs/kieler/esterel/processors/transformators/incremental/SCLTransformation.xtend index d7613cd661..0bd0747128 100644 --- a/plugins/de.cau.cs.kieler.esterel/src/de/cau/cs/kieler/esterel/processors/transformators/incremental/SCLTransformation.xtend +++ b/plugins/de.cau.cs.kieler.esterel/src/de/cau/cs/kieler/esterel/processors/transformators/incremental/SCLTransformation.xtend @@ -19,6 +19,7 @@ import de.cau.cs.kieler.scl.Module import de.cau.cs.kieler.scl.SCLProgram import de.cau.cs.kieler.kicool.compilation.Processor import de.cau.cs.kieler.kicool.compilation.ProcessorType +import org.eclipse.emf.ecore.util.EcoreUtil /** * @author mrb @@ -71,6 +72,9 @@ class SCLTransformation extends Processor { def transform(EsterelProgram prog) { val sclProg = createSCLProg + for (p : prog.pragmas) { + sclProg.pragmas += EcoreUtil.copy(p) + } for (m : prog.modules.filter(Module)) { val module = createSCLModule sclProg.modules += module diff --git a/plugins/de.cau.cs.kieler.esterel/src/de/cau/cs/kieler/esterel/processors/transformators/incremental/SignalTransformation.xtend b/plugins/de.cau.cs.kieler.esterel/src/de/cau/cs/kieler/esterel/processors/transformators/incremental/SignalTransformation.xtend index adb7c027e6..fd9e25e9f7 100644 --- a/plugins/de.cau.cs.kieler.esterel/src/de/cau/cs/kieler/esterel/processors/transformators/incremental/SignalTransformation.xtend +++ b/plugins/de.cau.cs.kieler.esterel/src/de/cau/cs/kieler/esterel/processors/transformators/incremental/SignalTransformation.xtend @@ -69,9 +69,9 @@ class SignalTransformation extends AbstractSCEstDynamicProcessor { val decl = createDeclaration(ValueType.BOOL, s) voStore.update(s, "signal") var decl2 = createDeclaration(null, null) - if (signal.type !== null) { + if (signal.type !== null || signal.idType !== null) { module.declarations.add(decl) - if (signal.type == ValueType.PURE) { + if (signal.type == ValueType.PURE && signal.idType === null) { newSignals.put(signal, new NewSignals(s)) } else { @@ -79,8 +79,17 @@ class SignalTransformation extends AbstractSCEstDynamicProcessor { decl.valuedObjects.add(s_set) val s_cur = createSignalVariable(null, signal.combineOperator, s.name + "_cur") val s_val = createSignalVariable(signal.initialValue, signal.combineOperator, s.name + "_val") - val tempType = if (signal.type == ValueType.DOUBLE) ValueType.FLOAT else signal.type + val tempType = if (signal.idType !== null) { + ValueType.HOST + } else if (signal.type == ValueType.DOUBLE) { + ValueType.FLOAT + } else { + signal.type + } decl2 = createDeclaration(tempType, null) + if (signal.idType !== null) { + decl2.hostType = signal.idType + } decl2.valuedObjects.add(s_cur) decl2.valuedObjects.add(s_val) newSignals.put(signal, new NewSignals(s, s_set, s_cur, s_val)) @@ -113,13 +122,6 @@ class SignalTransformation extends AbstractSCEstDynamicProcessor { model.checkGotos } - /* - * TODO only the signals with type != null will be transformed - * signals with typeID != null are not handled - * SCL doesn't allow anything else then the predefined types - * see KExt.xtext => Declaration - */ - def createParallelForSignals(Module module, HashMap signalsMap) { var necessary = false val signals = signalsMap.keySet.iterator.toList diff --git a/plugins/de.cau.cs.kieler.scl/src/de/cau/cs/kieler/scl/processors/transformators/SCLToSCGTransformation.xtend b/plugins/de.cau.cs.kieler.scl/src/de/cau/cs/kieler/scl/processors/transformators/SCLToSCGTransformation.xtend index fa514b6360..71651dc1da 100644 --- a/plugins/de.cau.cs.kieler.scl/src/de/cau/cs/kieler/scl/processors/transformators/SCLToSCGTransformation.xtend +++ b/plugins/de.cau.cs.kieler.scl/src/de/cau/cs/kieler/scl/processors/transformators/SCLToSCGTransformation.xtend @@ -16,6 +16,7 @@ package de.cau.cs.kieler.scl.processors.transformators import com.google.inject.Inject import de.cau.cs.kieler.annotations.StringAnnotation import de.cau.cs.kieler.annotations.extensions.AnnotationsExtensions +import de.cau.cs.kieler.annotations.extensions.PragmaExtensions import de.cau.cs.kieler.kexpressions.Declaration import de.cau.cs.kieler.kexpressions.Expression import de.cau.cs.kieler.kexpressions.MethodDeclaration @@ -78,6 +79,7 @@ import static de.cau.cs.kieler.scg.processors.SCGAnnotations.* import static extension de.cau.cs.kieler.kicool.kitt.tracing.TracingEcoreUtil.* import static extension de.cau.cs.kieler.kicool.kitt.tracing.TransformationTracing.* + /** * SCL to SCG Transformation * @@ -97,6 +99,7 @@ class SCLToSCGTransformation extends Processor implements @Inject extension AnnotationsExtensions @Inject extension SCLExtensions @Inject extension KEffectsExtensions + @Inject extension PragmaExtensions static val sCGFactory = ScgFactory.eINSTANCE extension ScgFactory = ScgFactory::eINSTANCE static val sclFactory = SCLFactory::eINSTANCE @@ -149,6 +152,7 @@ class SCLToSCGTransformation extends Processor implements // Create new SCG... val scgs = createSCGraphs creationalTransformation(program, scgs) + program.copyPragmas(scgs) for (module : program.modules) { val scg = createSCGraph From 54d464abe2cccb24373f5cd1e6568c0643cbad52 Mon Sep 17 00:00:00 2001 From: Logan Kenwright Date: Sun, 22 Feb 2026 21:15:03 +1300 Subject: [PATCH 3/3] fix a bug where local signals were not correctly being identified as typed --- .../incremental/LocalSignalDeclTransformation.xtend | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/plugins/de.cau.cs.kieler.esterel/src/de/cau/cs/kieler/esterel/processors/transformators/incremental/LocalSignalDeclTransformation.xtend b/plugins/de.cau.cs.kieler.esterel/src/de/cau/cs/kieler/esterel/processors/transformators/incremental/LocalSignalDeclTransformation.xtend index d4a18910ea..7b0cafcb0a 100644 --- a/plugins/de.cau.cs.kieler.esterel/src/de/cau/cs/kieler/esterel/processors/transformators/incremental/LocalSignalDeclTransformation.xtend +++ b/plugins/de.cau.cs.kieler.esterel/src/de/cau/cs/kieler/esterel/processors/transformators/incremental/LocalSignalDeclTransformation.xtend @@ -58,9 +58,10 @@ class LocalSignalDeclTransformation extends AbstractSCEstDynamicProcessor