Consolidated (intermediate) state of SLG, Linux and ROS2: transformers, generators, reduced translation units, ...
diff --git a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/LabelAccessTranslationUnit.java b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/LabelAccessTranslationUnit.java
deleted file mode 100644
index b437210..0000000
--- a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/LabelAccessTranslationUnit.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/**
- * Copyright (c) 2020 Robert Bosch GmbH.
- *
- * This program and the accompanying materials are made
- * available under the terms of the Eclipse Public License 2.0
- * which is available at https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *
- * Contributors:
- * Robert Bosch GmbH - initial API and implementation
- */
-package org.eclipse.app4mc.slg.commons.m2t.generators;
-
-import java.util.Arrays;
-
-import org.eclipse.app4mc.amalthea.model.LabelAccess;
-import org.eclipse.app4mc.amalthea.model.LabelAccessEnum;
-import org.eclipse.app4mc.amalthea.model.LabelAccessStatistic;
-import org.eclipse.app4mc.amalthea.model.MinAvgMaxStatistic;
-import org.eclipse.app4mc.amalthea.model.NumericStatistic;
-import org.eclipse.app4mc.amalthea.model.SingleValueStatistic;
-import org.eclipse.app4mc.transformation.util.OutputBuffer;
-
-public class LabelAccessTranslationUnit extends TranslationUnit {
- public String getBasePath() {
- return this.tuLabel.getBasePath();
- }
-
- public String getModuleName() {
- return this.tuLabel.getModuleName();
- }
-
- public String getIncFile() {
- return this.tuLabel.getIncFile();
- }
-
- @Override
- public String getCall() {
- String _xblockexpression = null;
- {
- String statString = "1";
- LabelAccessStatistic _statistic = null;
- if (this.labelAccess != null) {
- _statistic = this.labelAccess.getStatistic();
- }
- NumericStatistic _value = null;
- if (_statistic != null) {
- _value = _statistic.getValue();
- }
- final NumericStatistic stat = _value;
- if ((stat != null)) {
- LabelAccessStatistic _statistic_1 = null;
- if (this.labelAccess != null) {
- _statistic_1 = this.labelAccess.getStatistic();
- }
- NumericStatistic _value_1 = null;
- if (_statistic_1 != null) {
- _value_1 = _statistic_1.getValue();
- }
- statString = LabelAccessTranslationUnit.getNumericStatistic(_value_1);
- }
- String _switchResult = null;
- LabelAccessEnum _access = this.labelAccess.getAccess();
- if (_access != null) {
- switch (_access) {
- case READ:
- _switchResult = this.tuLabel.readCall(statString);
- break;
- case WRITE:
- _switchResult = this.tuLabel.writeCall(statString);
- break;
- default:
- _switchResult = (("/*underspecified access to label" + this.labelAccess.getData().getName()) + "*/");
- break;
- }
- } else {
- _switchResult = (("/*underspecified access to label" + this.labelAccess.getData().getName()) + "*/");
- }
- _xblockexpression = _switchResult;
- }
- return _xblockexpression;
- }
-
- public String getModulePath() {
- return getBasePath() + "/" + getModuleName();
- }
-
- private OutputBuffer outputBuffer;
-
- @Override
- public String getSrcFile() {
- return getModuleName() + ".cpp";
- }
-
- public String getIncPath() {
- return getModulePath() + "/_inc/" + getIncFile();
- }
-
- public String getSrcPath() {
- return getModulePath() + "/_src/" + getSrcFile();
- }
-
- public boolean isIncFileEmpty() {
- return !outputBuffer.bufferExists("INC", getModulePath() + "/_inc/" + getModuleName());
- }
-
- public boolean isSrcFileEmpty() {
- return !outputBuffer.bufferExists("SRC", getModulePath() + "/_src/" + getModuleName());
- }
-
- public boolean incAppend(final String str) {
- return outputBuffer.appendTo("INC", getModulePath() + "/_inc/" + getModuleName(), str);
- }
-
- public boolean srcAppend(final String str) {
- return outputBuffer.appendTo("SRC", getModulePath() + "/_src/" + getModuleName(), str);
- }
-
- private final LabelTranslationUnit tuLabel;
-
- private final LabelAccess labelAccess;
-
- public LabelAccessTranslationUnit(final OutputBuffer outputBuffer, final LabelTranslationUnit tuLabel,
- final LabelAccess labelAccess) {
- super();
- this.tuLabel = tuLabel;
- this.labelAccess = labelAccess;
- this.outputBuffer = outputBuffer;
- }
-
- protected static String _getNumericStatistic(final MinAvgMaxStatistic stat) {
- String _string = Integer.valueOf(Double.valueOf(Math.ceil(stat.getAvg())).intValue()).toString();
- return (_string + "/*MinAvgMaxStatistic not supported yet*/");
- }
-
- protected static String _getNumericStatistic(final SingleValueStatistic stat) {
- return Integer.valueOf(Double.valueOf(Math.ceil(stat.getValue())).intValue()).toString();
- }
-
- public static String getNumericStatistic(final NumericStatistic stat) {
- if (stat instanceof MinAvgMaxStatistic) {
- return _getNumericStatistic((MinAvgMaxStatistic) stat);
- } else if (stat instanceof SingleValueStatistic) {
- return _getNumericStatistic((SingleValueStatistic) stat);
- } else {
- throw new IllegalArgumentException("Unhandled parameter types: " + Arrays.<Object>asList(stat).toString());
- }
- }
-}
diff --git a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/LabelGenerator.xtend b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/LabelGenerator.xtend
index b62ecf3..0198f5a 100644
--- a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/LabelGenerator.xtend
+++ b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/LabelGenerator.xtend
@@ -26,26 +26,34 @@
throw new IllegalStateException("Utility class");
}
- static def String toCMake(List<String> srcFiles)
+ // ---------- names of generated 'C' functions ----------
+
+ static def String initCall(Label label) '''initialize_«label.name»()'''
+ static def String readCall(Label label, String param) '''read_«label.name»(«param»)'''
+ static def String writeCall(Label label, String param) '''write_«label.name»(«param»)'''
+
+ // ---------- generate file contents ----------
+
+ static def String toCMake(String libName, List<String> srcFiles)
'''
- # «LabelTranslationUnit.libName» ################################################################
+ # «libName» ################################################################
####
- add_library(«LabelTranslationUnit.libName» STATIC
+ add_library(«libName» STATIC
«FOR srcFile : srcFiles»
${CMAKE_CURRENT_LIST_DIR}/_src/«srcFile»
«ENDFOR»
)
- target_include_directories(«LabelTranslationUnit.getLibName()»
+ target_include_directories(«libName»
PUBLIC ${CMAKE_CURRENT_LIST_DIR}/_inc
)
'''
static def String toH(Label label)
'''
- void «initCall(label.name)»;
- void «readCall(label.name, "int labelAccessStatistics")»;
- void «writeCall(label.name, "int labelAccessStatistics")»;
+ void «initCall(label)»;
+ void «readCall(label, "int labelAccessStatistics")»;
+ void «writeCall(label, "int labelAccessStatistics")»;
'''
@@ -54,7 +62,7 @@
int «label.name»[«AmaltheaModelUtils.getLabelArraySize(label)»];
static bool isIinitialized_«label.name» = false;
- void «initCall(label.name)» {
+ void «initCall(label)» {
if (!isIinitialized_«label.name»){
for (int i=0; i < «AmaltheaModelUtils.getLabelArraySize(label)»; i++){
«label.name»[i] = i+1;
@@ -64,7 +72,7 @@
}
- void «readCall(label.name, "int labelAccessStatistics")» {
+ void «readCall(label, "int labelAccessStatistics")» {
int numberOfBytes = «label?.size?.numberBytes»;
for (int repeat = 0 ; repeat < labelAccessStatistics; repeat++){
@@ -97,7 +105,7 @@
}
}
- void «writeCall(label.name, "int labelAccessStatistics")» {
+ void «writeCall(label, "int labelAccessStatistics")» {
int numberOfBytes = «label?.size?.numberBytes»;
for (int repeat = 0 ; repeat < labelAccessStatistics; repeat++){
if(numberOfBytes < 4){
@@ -128,10 +136,4 @@
'''
- static def String initCall(String name) '''initialize_«name»()'''
-
- static def String readCall(String name, String param) '''read_«name»(«param»)'''
-
- static def String writeCall(String name, String param) '''write_«name»(«param»)'''
-
}
diff --git a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/LabelTranslationUnit.java b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/LabelTranslationUnit.java
deleted file mode 100644
index ed2b664..0000000
--- a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/LabelTranslationUnit.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/**
- * Copyright (c) 2020 Robert Bosch GmbH.
- *
- * This program and the accompanying materials are made
- * available under the terms of the Eclipse Public License 2.0
- * which is available at https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *
- * Contributors:
- * Robert Bosch GmbH - initial API and implementation
- */
-package org.eclipse.app4mc.slg.commons.m2t.generators;
-
-import org.eclipse.app4mc.amalthea.model.Label;
-import org.eclipse.app4mc.transformation.util.OutputBuffer;
-
-public class LabelTranslationUnit extends TranslationUnit {
- public static String getModulePathStatic() {
- return "synthetic_gen" + "/" + getModuleNameStatic();
- }
-
- public static String getMakeFilePathStatic() {
- return getModulePathStatic() + "/" + "CMakeLists.txt";
- }
-
- public static String getModuleNameStatic() {
- return "labels";
- }
-
- public static String getLibName() {
- return "LABELS_LIB";
- }
-
- public String getModuleName() {
- return LabelTranslationUnit.getModuleNameStatic();
- }
-
- protected String getName() {
- return this.label.getName();
- }
-
- public String getInitCall() { return "initialize_" + getName() + "()"; }
-
- public String readCall(final String param) { return "read_" + getName() + "(" + param + ")"; }
-
- public String writeCall(final String param) { return "write_" + getName() + "(" + param + ")"; }
-
- public String getIncFile() { return getModuleName() + ".h"; }
-
- private final Label label;
- private OutputBuffer outputBuffer;
-
- public LabelTranslationUnit(final OutputBuffer outputBuffer, final Label label) {
- super();
- this.label = label;
- this.outputBuffer = outputBuffer;
- this.genFiles();
- }
-
- public void genFiles() {
- if (isSrcFileEmpty()) {
- srcAppend("#include \"" + getIncFile() + "\"\n\n");
- }
- if (isIncFileEmpty()) {
- incAppend("#include <stdbool.h>\n\n");
- }
-
- incAppend(LabelGenerator.toH(label));
- srcAppend(LabelGenerator.toCpp(label));
- }
-
- protected long getSize() {
- return this.label.getSize().getNumberBytes();
- }
-
- public String getBasePath() {
- return "synthetic_gen";
- }
-
- public String getModulePath() { return this.getBasePath() + "/" + this.getModuleName(); }
-
- @Override
- public String getSrcFile() { return this.getModuleName() + ".cpp"; }
-
- public String getIncPath() { return this.getModulePath() + "/_inc/" + this.getIncFile(); }
-
- public String getSrcPath() { return this.getModulePath() + "/_src/" + this.getSrcFile(); }
-
- public boolean isIncFileEmpty() {
- return (!this.outputBuffer.bufferExists("INC", ((this.getModulePath() + "/_inc/") + this.getModuleName())));
- }
-
- public boolean isSrcFileEmpty() {
- return (!this.outputBuffer.bufferExists("SRC", ((this.getModulePath() + "/_src/") + this.getModuleName())));
- }
-
- public boolean incAppend(final String str) {
- return this.outputBuffer.appendTo("INC", ((this.getModulePath() + "/_inc/") + this.getModuleName()), str);
- }
-
- public boolean srcAppend(final String str) {
- return this.outputBuffer.appendTo("SRC", ((this.getModulePath() + "/_src/") + this.getModuleName()), str);
- }
-
-}
diff --git a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/RunnableGenerator.xtend b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/RunnableGenerator.xtend
index 8099bcf..f29dc3d 100644
--- a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/RunnableGenerator.xtend
+++ b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/RunnableGenerator.xtend
@@ -19,30 +19,32 @@
class RunnableGenerator {
+ public static val String LIB_NAME = "RUNNABLES_LIB";
+
// Suppress default constructor
private new() {
throw new IllegalStateException("Utility class");
}
static def String toCMake(List<String> srcFiles) '''
- # «RunnableTranslationUnit.libName» ################################################################
+ # «LIB_NAME» ################################################################
####
- add_library(«RunnableTranslationUnit.libName» STATIC
+ add_library(«LIB_NAME» STATIC
«FOR srcFile : srcFiles»
${CMAKE_CURRENT_LIST_DIR}/_src/«srcFile»
«ENDFOR»
)
- target_include_directories(«RunnableTranslationUnit.libName»
+ target_include_directories(«LIB_NAME»
PUBLIC ${CMAKE_CURRENT_LIST_DIR}/_inc
)
- target_include_directories(«RunnableTranslationUnit.libName»
+ target_include_directories(«LIB_NAME»
PUBLIC ${CMAKE_CURRENT_LIST_DIR}/../ticksUtils/_inc
${CMAKE_CURRENT_LIST_DIR}/../labels/_inc
)
- target_link_libraries(RUNNABLES_LIB
+ target_link_libraries(«LIB_NAME»
PRIVATE LABELS_LIB TICKS_UTILS
)
'''
diff --git a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/RunnableTranslationUnit.java b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/RunnableTranslationUnit.java
deleted file mode 100644
index 296d9c8..0000000
--- a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/RunnableTranslationUnit.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/**
- * Copyright (c) 2020 Robert Bosch GmbH.
- *
- * This program and the accompanying materials are made
- * available under the terms of the Eclipse Public License 2.0
- * which is available at https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *
- * Contributors:
- * Robert Bosch GmbH - initial API and implementation
- */
-package org.eclipse.app4mc.slg.commons.m2t.generators;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.function.Consumer;
-
-import org.eclipse.app4mc.amalthea.model.ActivityGraph;
-import org.eclipse.app4mc.amalthea.model.ActivityGraphItem;
-import org.eclipse.app4mc.slg.commons.m2t.transformers.sw.ActivityGraphItemTransformer;
-import org.eclipse.app4mc.transformation.util.OutputBuffer;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.xtend2.lib.StringConcatenation;
-import org.eclipse.xtext.xbase.lib.StringExtensions;
-
-public class RunnableTranslationUnit extends TranslationUnit {
- public static String getModulePathStatic() {
- return "synthetic_gen" + "/" + getModuleNameStatic();
- }
-
- public static String getMakeFilePathStatic() {
- return getModulePathStatic() + "/" + "CMakeLists.txt";
- }
-
- public static String getModuleNameStatic() {
- return "runnables";
- }
-
- public static String getLibName() {
- return "RUNNABLES_LIB";
- }
-
- public String getModuleName() {
- return RunnableTranslationUnit.getModuleNameStatic();
- }
-
- @Override
- public String getCall() {
- StringConcatenation builder = new StringConcatenation();
- builder.append("run_");
- builder.append(this.runnable.getName());
- builder.append("()");
- return builder.toString();
- }
-
- @Override
- public String getIncFile() {
- return getModuleName() + ".h";
- }
-
- public ActivityGraphItemTransformer callGraphItemTransformer;
-
- public org.eclipse.app4mc.amalthea.model.Runnable runnable;
-
- private OutputBuffer outputBuffer;
-
- public RunnableTranslationUnit(final OutputBuffer outputBuffer,
- final ActivityGraphItemTransformer callGraphItemTransformer,
- final org.eclipse.app4mc.amalthea.model.Runnable runnable) {
- super();
- this.callGraphItemTransformer = callGraphItemTransformer;
- this.runnable = runnable;
- this.outputBuffer = outputBuffer;
-
- this.genFiles();
- }
-
- public void genFiles() {
- if (isSrcFileEmpty()) {
- srcAppend("#include \"" + getIncFile() + "\"\n");
- }
- final LinkedHashSet<String> includes = new LinkedHashSet<>();
- final ArrayList<String> calls = new ArrayList<>();
- ActivityGraph _activityGraph = null;
- if (this.runnable != null) {
- _activityGraph = this.runnable.getActivityGraph();
- }
- EList<ActivityGraphItem> _items = null;
- if (_activityGraph != null) {
- _items = _activityGraph.getItems();
- }
- final Consumer<ActivityGraphItem> _function = new Consumer<ActivityGraphItem>() {
- @Override
- public void accept(final ActivityGraphItem item) {
- final TranslationUnit tmp = RunnableTranslationUnit.this.callGraphItemTransformer.transform(item);
- if (((!StringExtensions.isNullOrEmpty(tmp.getIncFile()))
- && (!RunnableTranslationUnit.this.getIncFile().equals(tmp.getIncFile())))) {
- includes.add(tmp.getIncFile());
- }
- final String call = tmp.getCall();
- if (!StringExtensions.isNullOrEmpty(call)) {
- calls.add(call);
- }
- }
- };
- _items.forEach(_function);
-
- incAppend("\n//Runnable " + runnable.getName() + "----\n");
- toH(includes);
-
- srcAppend("\n//Runnable " + runnable.getName() + "----\n");
- toCpp(includes, calls);
- }
-
- public void toH(final HashSet<String> includes) {
- final Consumer<String> _function = new Consumer<String>() {
- @Override
- public void accept(final String include) {
- RunnableTranslationUnit.this.incAppend((("#include \"" + include) + "\"\n"));
- }
- };
- includes.forEach(_function);
- StringConcatenation builder = new StringConcatenation();
- builder.append("void ");
- builder.append(this.getCall());
- builder.append(";");
- builder.newLineIfNotEmpty();
- this.incAppend(builder.toString());
- }
-
- public void toCpp(final HashSet<String> includes, final List<String> calls) {
- srcAppend("void " + getCall() + "{\n");
-
- final Consumer<String> _function = new Consumer<String>() {
- @Override
- public void accept(final String call) {
- RunnableTranslationUnit.this.srcAppend((("\t" + call) + ";\n"));
- }
- };
- calls.forEach(_function);
-
- srcAppend("}\n\n");
- }
-
- public String getBasePath() {
- return "synthetic_gen";
- }
-
- public String getModulePath() {
- return getBasePath() + "/" + getModuleName();
- }
-
- @Override
- public String getSrcFile() {
- return getModuleName() + ".cpp";
- }
-
- public String getIncPath() {
- return getModulePath() + "/_inc/" + getIncFile();
- }
-
- public String getSrcPath() {
- return getModulePath() + "/_src/" + getSrcFile();
- }
-
- public boolean isIncFileEmpty() {
- return !outputBuffer.bufferExists("INC", getModulePath() + "/_inc/" + getModuleName());
- }
-
- public boolean isSrcFileEmpty() {
- return !outputBuffer.bufferExists("SRC", getModulePath() + "/_src/" + getModuleName());
- }
-
- public void incAppend(final String str) {
- outputBuffer.appendTo("INC", getModulePath() + "/_inc/" + getModuleName(), str);
- }
-
- public void srcAppend(final String str) {
- outputBuffer.appendTo("SRC", getModulePath() + "/_src/" + getModuleName(), str);
- }
-}
diff --git a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/TaskGenerator.xtend b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/TaskGenerator.xtend
index 2bc39d7..a5ee31e 100644
--- a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/TaskGenerator.xtend
+++ b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/TaskGenerator.xtend
@@ -17,57 +17,60 @@
import java.util.List
import java.util.Set
+import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGTranslationUnit
class TaskGenerator {
+ public static val String LIB_NAME = "TASKS_LIB";
+
// Suppress default constructor
private new() {
throw new IllegalStateException("Utility class");
}
- static def String toH(String moduleName)
+ static def String toH(SLGTranslationUnit tu)
'''
- //Header of Task «moduleName»
+ //Header of Task «tu.moduleName»
#include <stdint.h>
- class «moduleName» {
+ class «tu.moduleName» {
public:
//constructor
- «moduleName»(void);
+ «tu.moduleName»(void);
// destructor
- virtual ~«moduleName»() =default;
+ virtual ~«tu.moduleName»() =default;
- void «initCall(moduleName)»;
+ void «initCall(tu.moduleName)»;
- void «stepCall(moduleName)»;
+ void «stepCall(tu.moduleName)»;
};
'''
- static def String toCpp(String moduleName, String incFile, Set<String> includes, List<String> initCalls, List<String> stepCalls)
+ static def String toCpp(SLGTranslationUnit tu, String incFile, Set<String> includes, List<String> initCalls, List<String> stepCalls)
'''
#include "«incFile»"
«FOR include : includes»
#include "«include»"
«ENDFOR»
- «moduleName»::«moduleName»(){
+ «tu.moduleName»::«tu.moduleName»(){
//default constructor
}
- void «moduleName»::«initCall(moduleName)» {
+ void «tu.moduleName»::«initCall(tu.moduleName)» {
«FOR call : initCalls»
«call»;
«ENDFOR»
}
- void «moduleName»::«stepCall(moduleName)» {
+ void «tu.moduleName»::«stepCall(tu.moduleName)» {
«FOR call : stepCalls»
«call»;
«ENDFOR»
diff --git a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/TaskTranslationUnit.java b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/TaskTranslationUnit.java
deleted file mode 100644
index c0c750b..0000000
--- a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/TaskTranslationUnit.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/**
- * Copyright (c) 2020 Robert Bosch GmbH.
- *
- * This program and the accompanying materials are made
- * available under the terms of the Eclipse Public License 2.0
- * which is available at https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *
- * Contributors:
- * Robert Bosch GmbH - initial API and implementation
- */
-package org.eclipse.app4mc.slg.commons.m2t.generators;
-
-import java.util.ArrayList;
-import java.util.LinkedHashSet;
-import java.util.LinkedList;
-import java.util.function.BiConsumer;
-import java.util.function.Consumer;
-
-import org.eclipse.app4mc.amalthea.model.ActivityGraph;
-import org.eclipse.app4mc.amalthea.model.ActivityGraphItem;
-import org.eclipse.app4mc.amalthea.model.Component;
-import org.eclipse.app4mc.amalthea.model.RunnableCall;
-import org.eclipse.app4mc.amalthea.model.Tag;
-import org.eclipse.app4mc.amalthea.model.Task;
-import org.eclipse.app4mc.slg.commons.m2t.transformers.sw.LabelTransformer;
-import org.eclipse.app4mc.slg.commons.m2t.transformers.sw.RunnableTransformer;
-import org.eclipse.app4mc.transformation.util.OutputBuffer;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.xtext.xbase.lib.Functions.Function1;
-import org.eclipse.xtext.xbase.lib.IterableExtensions;
-
-public class TaskTranslationUnit extends TranslationUnit {
- public RunnableTransformer runnableTransformer;
-
- public LabelTransformer labelTransformer;
-
- public String getBasePath() {
- return "";
- }
-
- public String getModuleName() {
- return this.task.getName();
- }
-
- private final Task task;
-
- private OutputBuffer outputBuffer;
-
- public TaskTranslationUnit(final OutputBuffer outputBuffer, final RunnableTransformer runnableTransformer,
- final LabelTransformer labelTransformer, final Task task, final Component component) {
- super();
- this.runnableTransformer = runnableTransformer;
- this.labelTransformer = labelTransformer;
- this.task = task;
- this.outputBuffer = outputBuffer;
- this.genFiles();
- }
-
- public TaskTranslationUnit(final OutputBuffer outputBuffer, final RunnableTransformer runnableTransformer,
- final LabelTransformer labelTransformer, final Task task) {
- super();
- this.task = task;
- this.runnableTransformer = runnableTransformer;
- this.labelTransformer = labelTransformer;
- this.outputBuffer = outputBuffer;
- }
-
- public void genFiles() {
-
- final LinkedHashSet<String> includes = new LinkedHashSet<>();
- final LinkedList<String> initCalls = new LinkedList<>();
- final LinkedList<String> stepCalls = new LinkedList<>();
- ActivityGraph _activityGraph = null;
- if (this.task != null) {
- _activityGraph = this.task.getActivityGraph();
- }
- EList<ActivityGraphItem> _items = null;
- if (_activityGraph != null) {
- _items = _activityGraph.getItems();
- }
- final Consumer<ActivityGraphItem> _function = item -> {
- if ((item instanceof RunnableCall)) {
- final org.eclipse.app4mc.amalthea.model.Runnable runnable = ((RunnableCall) item).getRunnable();
- final RunnableTranslationUnit tu = TaskTranslationUnit.this.runnableTransformer
- .transform(((org.eclipse.app4mc.amalthea.model.Runnable) runnable));
- includes.add(tu.getIncFile());
- final Function1<Tag, Boolean> _function1 = tag -> Boolean.valueOf("initialize".equals(tag.getName()));
- boolean _isEmpty = IterableExtensions
- .isEmpty(IterableExtensions.<Tag>filter(((RunnableCall) item).getTags(), _function1));
- boolean _not = (!_isEmpty);
- if (_not) {
- initCalls.add(tu.getCall());
- } else {
- stepCalls.add(tu.getCall());
- }
- }
- };
- _items.forEach(_function);
- labelTransformer.getCache().forEach((BiConsumer<ArrayList<?>, LabelTranslationUnit>) (label, tu) -> {
- includes.add(tu.getIncFile());
- initCalls.add(tu.getInitCall());
- });
- this.incAppend(TaskGenerator.toH(getModuleName()));
- this.srcAppend(TaskGenerator.toCpp(getModuleName(), getIncFile(), includes, initCalls, stepCalls));
-
- }
-
- public String getModulePath() { return getBasePath() + "/" + getModuleName(); }
-
- @Override
- public String getIncFile() { return getModuleName() + ".hpp"; }
-
- @Override
- public String getSrcFile() { return getModuleName() + ".cpp"; }
-
- public String getIncPath() { return getModulePath() + "/_inc/" + getIncFile(); }
-
- public String getSrcPath() { return getModulePath() + "/_src/" + getSrcFile(); }
-
- public boolean isIncFileEmpty() {
- return !outputBuffer.bufferExists("INC", getModulePath() + "/_inc/" + getModuleName());
- }
-
- public boolean isSrcFileEmpty() {
- return !outputBuffer.bufferExists("SRC", getModulePath() + "/_src/" + getModuleName());
- }
-
- public boolean incAppend(final String str) {
- return outputBuffer.appendTo("INC", getModulePath() + "/_inc/" + getModuleName(), str);
- }
-
- public boolean srcAppend(final String str) {
- return outputBuffer.appendTo("SRC", getModulePath() + "/_src/" + getModuleName(), str);
- }
-}
diff --git a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/TicksGenerator.xtend b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/TicksGenerator.xtend
new file mode 100644
index 0000000..b813385
--- /dev/null
+++ b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/TicksGenerator.xtend
@@ -0,0 +1,69 @@
+/**
+ * *******************************************************************************
+ * Copyright (c) 2020-2021 Robert Bosch GmbH.
+ *
+ * This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Robert Bosch GmbH - initial API and implementation
+ * *******************************************************************************
+ */
+
+package org.eclipse.app4mc.slg.commons.m2t.generators
+
+import org.eclipse.app4mc.amalthea.model.DiscreteValueBetaDistribution
+import org.eclipse.app4mc.amalthea.model.DiscreteValueBoundaries
+import org.eclipse.app4mc.amalthea.model.DiscreteValueConstant
+import org.eclipse.app4mc.amalthea.model.DiscreteValueGaussDistribution
+import org.eclipse.app4mc.amalthea.model.DiscreteValueHistogram
+import org.eclipse.app4mc.amalthea.model.DiscreteValueStatistics
+import org.eclipse.app4mc.amalthea.model.DiscreteValueUniformDistribution
+import org.eclipse.app4mc.amalthea.model.DiscreteValueWeibullEstimatorsDistribution
+import org.eclipse.app4mc.amalthea.model.IDiscreteValueDeviation
+
+class TicksGenerator {
+
+ // Suppress default constructor
+ private new() {
+ throw new IllegalStateException("Utility class");
+ }
+
+ static def dispatch String getParameters(DiscreteValueConstant value)
+ '''«value.value»'''
+
+ static def dispatch String getParameters(DiscreteValueStatistics value)
+ '''«value.average», «value.lowerBound», «value.upperBound»'''
+
+ static def dispatch String getParameters(IDiscreteValueDeviation value) '''
+ WARNING:VALUE_FORMAT_NOT_SUPPORTED
+ '''
+
+ static def dispatch String getParameters(DiscreteValueBetaDistribution value) '''
+ WARNING:VALUE_FORMAT_NOT_SUPPORTED
+ '''
+
+ static def dispatch String getParameters(DiscreteValueBoundaries value) '''
+ WARNING:VALUE_FORMAT_NOT_SUPPORTED
+ '''
+
+ static def dispatch String getParameters(DiscreteValueGaussDistribution value) '''
+ WARNING:VALUE_FORMAT_NOT_SUPPORTED
+ '''
+
+ static def dispatch String getParameters(DiscreteValueHistogram value) '''
+ WARNING:VALUE_FORMAT_NOT_SUPPORTED
+ '''
+
+ static def dispatch String getParameters(DiscreteValueUniformDistribution value) '''
+ WARNING:VALUE_FORMAT_NOT_SUPPORTED
+ '''
+
+ static def dispatch String getParameters(DiscreteValueWeibullEstimatorsDistribution value) '''
+ WARNING:VALUE_FORMAT_NOT_SUPPORTED
+ '''
+
+}
diff --git a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/TicksTranslationUnit.java b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/TicksTranslationUnit.java
deleted file mode 100644
index 0e7beaf..0000000
--- a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/TicksTranslationUnit.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/**
- * Copyright (c) 2020 Robert Bosch GmbH.
- *
- * This program and the accompanying materials are made
- * available under the terms of the Eclipse Public License 2.0
- * which is available at https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *
- * Contributors:
- * Robert Bosch GmbH - initial API and implementation
- */
-package org.eclipse.app4mc.slg.commons.m2t.generators;
-
-import java.util.Arrays;
-
-import org.eclipse.app4mc.amalthea.model.DiscreteValueBetaDistribution;
-import org.eclipse.app4mc.amalthea.model.DiscreteValueBoundaries;
-import org.eclipse.app4mc.amalthea.model.DiscreteValueConstant;
-import org.eclipse.app4mc.amalthea.model.DiscreteValueGaussDistribution;
-import org.eclipse.app4mc.amalthea.model.DiscreteValueHistogram;
-import org.eclipse.app4mc.amalthea.model.DiscreteValueStatistics;
-import org.eclipse.app4mc.amalthea.model.DiscreteValueUniformDistribution;
-import org.eclipse.app4mc.amalthea.model.DiscreteValueWeibullEstimatorsDistribution;
-import org.eclipse.app4mc.amalthea.model.IDiscreteValueDeviation;
-import org.eclipse.app4mc.amalthea.model.Ticks;
-import org.eclipse.app4mc.transformation.util.OutputBuffer;
-import org.eclipse.xtend2.lib.StringConcatenation;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class TicksTranslationUnit extends TranslationUnit {
- private static final Logger LOG = LoggerFactory.getLogger(TicksTranslationUnit.class);
-
- public String getBasePath() {
- return this.tuTicksUtils.getBasePath();
- }
-
- public String getModuleName() {
- return this.tuTicksUtils.getModuleName();
- }
-
- @Override
- public String getCall() {
- if (((this.ticksValue != null) && ((this.ticksValue instanceof DiscreteValueStatistics)
- || (this.ticksValue instanceof DiscreteValueConstant)))) {
- return this.tuTicksUtils.getExecCall(this.getParameters(this.ticksValue)).toString();
- }
- TicksTranslationUnit.LOG.error("Unsupported element for Ticks : " + this.ticksValue.eClass().getName());
- return "";
- }
-
- private final TicksUtilsTranslationUnit tuTicksUtils;
- private final Ticks ticks;
- private String puName;
- private IDiscreteValueDeviation ticksValue;
-
- private OutputBuffer outputBuffer;
-
- public TicksTranslationUnit(final OutputBuffer outputBuffer, final TicksUtilsTranslationUnit tuTicksUtils,
- final Ticks ticks, final String puName, final IDiscreteValueDeviation ticksValue) {
- super();
- this.tuTicksUtils = tuTicksUtils;
- this.ticks = ticks;
- this.puName = puName;
- this.ticksValue = ticksValue;
- this.outputBuffer = outputBuffer;
- }
-
- public String getPuName() {
- return this.puName;
- }
-
- public String getIncFile() {
- return this.getModuleName() + ".h";
- }
-
- private String _getParameters(final IDiscreteValueDeviation value) {
- StringConcatenation _builder = new StringConcatenation();
- _builder.append("WARNING:VALUE_FORMAT_NOT_SUPPORTED\t\t");
- _builder.newLine();
- return _builder.toString();
- }
-
- private String _getParameters(final DiscreteValueBetaDistribution value) {
- StringConcatenation _builder = new StringConcatenation();
- _builder.append("WARNING:VALUE_FORMAT_NOT_SUPPORTED");
- _builder.newLine();
- return _builder.toString();
- }
-
- private String _getParameters(final DiscreteValueBoundaries value) {
- StringConcatenation _builder = new StringConcatenation();
- _builder.append("WARNING:VALUE_FORMAT_NOT_SUPPORTED");
- _builder.newLine();
- return _builder.toString();
- }
-
- private String _getParameters(final DiscreteValueConstant value) {
- StringConcatenation _builder = new StringConcatenation();
- long _value = value.getValue();
- _builder.append(_value);
- return _builder.toString();
- }
-
- private String _getParameters(final DiscreteValueGaussDistribution value) {
- StringConcatenation _builder = new StringConcatenation();
- _builder.append("WARNING:VALUE_FORMAT_NOT_SUPPORTED");
- _builder.newLine();
- return _builder.toString();
- }
-
- private String _getParameters(final DiscreteValueHistogram value) {
- StringConcatenation _builder = new StringConcatenation();
- _builder.append("WARNING:VALUE_FORMAT_NOT_SUPPORTED");
- _builder.newLine();
- return _builder.toString();
- }
-
- private String _getParameters(final DiscreteValueStatistics value) {
- StringConcatenation _builder = new StringConcatenation();
- _builder.append(value.getAverage());
- _builder.append(", ");
- _builder.append(value.getLowerBound());
- _builder.append(", ");
- _builder.append(value.getUpperBound());
- return _builder.toString();
- }
-
- private String _getParameters(final DiscreteValueUniformDistribution value) {
- StringConcatenation _builder = new StringConcatenation();
- _builder.append("WARNING:VALUE_FORMAT_NOT_SUPPORTED");
- _builder.newLine();
- return _builder.toString();
- }
-
- private String _getParameters(final DiscreteValueWeibullEstimatorsDistribution value) {
- StringConcatenation _builder = new StringConcatenation();
- _builder.append("WARNING:VALUE_FORMAT_NOT_SUPPORTED");
- return _builder.toString();
- }
-
- private String getParameters(final IDiscreteValueDeviation value) {
- if (value instanceof DiscreteValueBetaDistribution) {
- return _getParameters((DiscreteValueBetaDistribution) value);
- } else if (value instanceof DiscreteValueBoundaries) {
- return _getParameters((DiscreteValueBoundaries) value);
- } else if (value instanceof DiscreteValueGaussDistribution) {
- return _getParameters((DiscreteValueGaussDistribution) value);
- } else if (value instanceof DiscreteValueStatistics) {
- return _getParameters((DiscreteValueStatistics) value);
- } else if (value instanceof DiscreteValueUniformDistribution) {
- return _getParameters((DiscreteValueUniformDistribution) value);
- } else if (value instanceof DiscreteValueWeibullEstimatorsDistribution) {
- return _getParameters((DiscreteValueWeibullEstimatorsDistribution) value);
- } else if (value instanceof DiscreteValueConstant) {
- return _getParameters((DiscreteValueConstant) value);
- } else if (value instanceof DiscreteValueHistogram) {
- return _getParameters((DiscreteValueHistogram) value);
- } else if (value != null) {
- return _getParameters(value);
- } else {
- throw new IllegalArgumentException("Unhandled parameter types: " + Arrays.<Object>asList(value).toString());
- }
- }
-
- public String getModulePath() {
- return getBasePath() + "/" + getModuleName();
- }
-
- @Override
- public String getSrcFile() {
- return getModuleName() + ".cpp";
- }
-
- public String getIncPath() {
- return getModulePath() + "/_inc/" + getIncFile();
- }
-
- public String getSrcPath() {
- return getModulePath() + "/_src/" + getSrcFile();
- }
-
- public boolean isIncFileEmpty() {
- return !outputBuffer.bufferExists("INC", getModulePath() + "/_inc/" + getModuleName());
- }
-
- public boolean isSrcFileEmpty() {
- return !outputBuffer.bufferExists("SRC", getModulePath() + "/_src/" + getModuleName());
- }
-
- public boolean incAppend(final String str) {
- return outputBuffer.appendTo("INC", getModulePath() + "/_inc/" + getModuleName(), str);
- }
-
- public boolean srcAppend(final String str) {
- return outputBuffer.appendTo("SRC", getModulePath() + "/_src/" + getModuleName(), str);
- }
-
-}
diff --git a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/TicksUtilsGenerator.xtend b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/TicksUtilsGenerator.xtend
index 7b139dc..8fccef6 100644
--- a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/TicksUtilsGenerator.xtend
+++ b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/TicksUtilsGenerator.xtend
@@ -16,13 +16,15 @@
package org.eclipse.app4mc.slg.commons.m2t.generators
import java.util.List
-import org.eclipse.app4mc.amalthea.model.impl.DiscreteValueStatisticsImpl
-import org.eclipse.app4mc.amalthea.model.impl.DiscreteValueConstantImpl
+import org.eclipse.app4mc.amalthea.model.AmaltheaPackage
import org.eclipse.app4mc.slg.config.ConfigModel
import org.eclipse.app4mc.slg.config.TickType
+import org.eclipse.emf.ecore.EClass
class TicksUtilsGenerator {
+ public static val String LIB_NAME = "TICKS_UTILS";
+
// Suppress default constructor
private new() {
throw new IllegalStateException("Utility class");
@@ -30,29 +32,29 @@
static def String toCMake(List<String> srcFiles)
'''
- # «TicksUtilsTranslationUnit.getLibName» ################################################################
+ # «LIB_NAME» ################################################################
####
- add_library(«TicksUtilsTranslationUnit.getLibName()» STATIC
+ add_library(«LIB_NAME» STATIC
«FOR srcFile : srcFiles»
${CMAKE_CURRENT_LIST_DIR}/_src/«srcFile»
«ENDFOR»
)
- target_include_directories(«TicksUtilsTranslationUnit.getLibName()»
+ target_include_directories(«LIB_NAME»
PUBLIC ${CMAKE_CURRENT_LIST_DIR}/_inc/
)
'''
// ----- generate ticks -----
- static def String generateTicksDeclaration(Object valueClass) {
- switch valueClass {
- case DiscreteValueConstantImpl: '''
- void «execCall(valueClass, "int ticks")»;
+ static def String generateTicksDeclaration(EClass eClass) {
+ switch eClass {
+ case AmaltheaPackage.eINSTANCE.discreteValueConstant: '''
+ void «execCall(eClass, "int ticks")»;
'''
- case DiscreteValueStatisticsImpl: '''
- void «execCall(valueClass, "double average, int lowerBound, int upperBound")»;
+ case AmaltheaPackage.eINSTANCE.discreteValueStatistics: '''
+ void «execCall(eClass, "double average, int lowerBound, int upperBound")»;
'''
default: {
@@ -61,16 +63,16 @@
}
}
- static def String generateTicks(Object valueClass) {
- switch valueClass {
- case DiscreteValueConstantImpl: '''
- void «execCall(valueClass, "int ticks")» {
+ static def String generateTicks(EClass eClass) {
+ switch eClass {
+ case AmaltheaPackage.eINSTANCE.discreteValueConstant: '''
+ void «execCall(eClass, "int ticks")» {
burnTicks(ticks);
}
'''
- case DiscreteValueStatisticsImpl: '''
- void «execCall(valueClass, "double average, int lowerBound, int upperBound")» {
+ case AmaltheaPackage.eINSTANCE.discreteValueStatistics: '''
+ void «execCall(eClass, "double average, int lowerBound, int upperBound")» {
burnTicksStatistics(average, lowerBound, upperBound);
}
@@ -81,7 +83,7 @@
}
}
- private static def String execCall(Object valueClass, String params) '''executeTicks_«valueClass.toString.split("\\.").last»(«params»)'''
+ static def String execCall(EClass eClass, String params) '''executeTicks_«eClass.name»(«params»)'''
// ----- burn ticks -----
diff --git a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/TicksUtilsTranslationUnit.java b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/TicksUtilsTranslationUnit.java
deleted file mode 100644
index 7a311f3..0000000
--- a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/TicksUtilsTranslationUnit.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/**
- * Copyright (c) 2020 Robert Bosch GmbH.
- *
- * This program and the accompanying materials are made
- * available under the terms of the Eclipse Public License 2.0
- * which is available at https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *
- * Contributors:
- * Robert Bosch GmbH - initial API and implementation
- */
-
-package org.eclipse.app4mc.slg.commons.m2t.generators;
-
-import org.eclipse.app4mc.slg.config.ConfigModel;
-import org.eclipse.app4mc.transformation.util.OutputBuffer;
-import org.eclipse.xtend2.lib.StringConcatenation;
-import org.eclipse.xtext.xbase.lib.Conversions;
-import org.eclipse.xtext.xbase.lib.IterableExtensions;
-
-public class TicksUtilsTranslationUnit extends TranslationUnit {
- public static String getModulePathStatic() {
- return "synthetic_gen" + "/" + getModuleNameStatic();
- }
-
- public static String getMakeFilePathStatic() {
- return getModulePathStatic() + "/" + "CMakeLists.txt";
- }
-
- public static String getModuleNameStatic() {
- return "ticksUtils";
- }
-
- public static String getLibName() {
- return "TICKS_UTILS";
- }
-
- public String getModuleName() {
- return TicksUtilsTranslationUnit.getModuleNameStatic();
- }
-
- public CharSequence getExecCall(final String params) {
- StringConcatenation _builder = new StringConcatenation();
- _builder.append("executeTicks_");
- String _last = IterableExtensions
- .<String>last(((Iterable<String>) Conversions.doWrapArray(this.valueClass.toString().split("\\."))));
- _builder.append(_last);
- _builder.append("(");
- _builder.append(params);
- _builder.append(")");
- return _builder;
- }
-
- public String getIncFile() {
- return this.getModuleName() + ".h";
- }
-
- private final ConfigModel configModel;
-
- private final Object valueClass;
-
- private OutputBuffer outputBuffer;
-
- public TicksUtilsTranslationUnit(final OutputBuffer outputBuffer, final ConfigModel configModel,
- final Object valueClass) {
- super();
- this.configModel = configModel;
- this.valueClass = valueClass;
- this.outputBuffer = outputBuffer;
- this.genFiles();
- }
-
- public void genFiles() {
-
- if (this.isIncFileEmpty()) {
- this.toH();
- }
- if (this.isSrcFileEmpty()) {
- this.toCPP();
- }
- srcAppend(TicksUtilsGenerator.generateTicks(valueClass));
- incAppend(TicksUtilsGenerator.generateTicksDeclaration(valueClass));
- }
-
- private void toCPP() {
- srcAppend("#include \"" + getIncFile() + "\"\n");
-
- final String ticksCodeSnippet = configModel.getCustomTickImpl().getValue();
- final boolean ticksCodeEnabled = configModel.getCustomTickImpl().isEnable();
-
- final String burnTicksBody = ticksCodeEnabled ? ticksCodeSnippet : TicksUtilsGenerator.burnTicksDefault();
-
- srcAppend(TicksUtilsGenerator.burnTicks(burnTicksBody));
- srcAppend(TicksUtilsGenerator.burnTicksStatistics(configModel));
- }
-
- private void toH() {
-
- incAppend(TicksUtilsGenerator.burnTicksDeclaration());
- incAppend(TicksUtilsGenerator.burnTicksStatisticsDeclaration());
-
- }
-
- public String getBasePath() {
- return "synthetic_gen";
- }
-
- public String getModulePath() {
- return this.getBasePath() + "/" + this.getModuleName();
- }
-
- @Override
- public String getSrcFile() {
- return this.getModuleName() + ".cpp";
- }
-
- public String getIncPath() {
- return this.getModulePath() + "/_inc/" + this.getIncFile();
- }
-
- public String getSrcPath() {
- return this.getModulePath() + "/_src/" + this.getSrcFile();
- }
-
- public boolean isIncFileEmpty() {
- return !this.outputBuffer.bufferExists("INC", this.getModulePath() + "/_inc/" + this.getModuleName());
- }
-
- public boolean isSrcFileEmpty() {
- return !this.outputBuffer.bufferExists("SRC", this.getModulePath() + "/_src/" + this.getModuleName());
- }
-
- public boolean incAppend(final String str) {
- return this.outputBuffer.appendTo("INC", ((this.getModulePath() + "/_inc/") + this.getModuleName()), str);
- }
-
- public boolean srcAppend(final String str) {
- return this.outputBuffer.appendTo("SRC", ((this.getModulePath() + "/_src/") + this.getModuleName()), str);
- }
-}
diff --git a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/TranslationUnit.java b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/TranslationUnit.java
deleted file mode 100644
index 6251446..0000000
--- a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/generators/TranslationUnit.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/**
- * Copyright (c) 2020 Robert Bosch GmbH.
- *
- * This program and the accompanying materials are made
- * available under the terms of the Eclipse Public License 2.0
- * which is available at https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *
- * Contributors:
- * Robert Bosch GmbH - initial API and implementation
- */
-
-package org.eclipse.app4mc.slg.commons.m2t.generators;
-
-public class TranslationUnit {
- private String path;
- private String call;
- private String incFile;
- private String srcFile;
-
- public TranslationUnit(final String path, final String call, final String incFile, final String srcFile) {
- this.path = path;
- this.call = call;
- this.incFile = incFile;
- this.srcFile = srcFile;
- }
-
- public TranslationUnit() {
- this("MODULE_PATH", "CALL", "MODULE.H", "MODULE.CPP"); // dummy values for unused data
- }
-
- public String getCall() {
- return this.call;
- }
-
- public void setCall(final String _call) {
- this.call = _call;
- }
-
- public String getPath() {
- return this.path;
- }
-
- public void setPath(final String _path) {
- this.path = _path;
- }
-
- public String getSrcFile() {
- return this.srcFile;
- }
-
- public String getIncFile() {
- return this.incFile;
- }
-
- public String getExtendedIncPath() {
- return ((this.path + "/_inc/") + this.incFile);
- }
-
- public String getExtendedSrcPath() {
- return ((this.path + "/_src/") + this.srcFile);
- }
-
-}
diff --git a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/SLGBaseSettings.java b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/SLGBaseSettings.java
index 0715c88..aa8fd76 100644
--- a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/SLGBaseSettings.java
+++ b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/SLGBaseSettings.java
@@ -25,11 +25,11 @@
}
public static final String SRC_TYPE = "SRC";
- public static final String SRC_EXT = ".cpp";
+ public static final String SRC_EXT = ".c";
public static final String SRC_FOLDER = "/_src/";
public static final String INC_TYPE = "INC";
- public static final String INC_EXT = ".hpp";
+ public static final String INC_EXT = ".h";
public static final String INC_FOLDER = "/_inc/";
public static final String OTHER_TYPE = "OTHER";
diff --git a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/SLGBaseTransformer.java b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/SLGBaseTransformer.java
index d9fb202..d5334a4 100644
--- a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/SLGBaseTransformer.java
+++ b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/SLGBaseTransformer.java
@@ -22,14 +22,12 @@
import static org.eclipse.app4mc.slg.commons.m2t.transformers.SLGBaseSettings.SRC_FOLDER;
import static org.eclipse.app4mc.slg.commons.m2t.transformers.SLGBaseSettings.SRC_TYPE;
-import java.util.ArrayList;
-import java.util.HashMap;
+import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.stream.Collectors;
-import org.eclipse.app4mc.slg.commons.m2t.generators.TranslationUnit;
import org.eclipse.app4mc.transformation.util.OutputBuffer;
import com.google.inject.Inject;
@@ -67,6 +65,22 @@
public String getSrcPath(SLGTranslationUnit tu) { return tu.getModulePath() + SRC_FOLDER + getSrcFile(tu); }
public String getIncPath(SLGTranslationUnit tu) { return tu.getModulePath() + INC_FOLDER + getIncFile(tu); }
+ // Generic cache handling
+
+ public List<String> getSrcFiles() {
+
+ return getCache().values().stream()
+ .map(this::getSrcFile)
+ .sorted()
+ .distinct()
+ .collect(Collectors.toList());
+ }
+
+ public Map<List<Object>, SLGTranslationUnit> getCache() {
+ return Collections.emptyMap();
+ }
+
+
// still necessary ???
@Inject Properties properties;
@@ -80,17 +94,4 @@
return value.toString();
}
- public Map<ArrayList<?>, ? extends TranslationUnit> getCache() {
- return new HashMap<>();
- }
-
- public List<String> getSrcFiles() {
-
- return getCache().values().stream()
- .map(TranslationUnit::getSrcFile)
- .sorted()
- .distinct()
- .collect(Collectors.toList());
- }
-
}
diff --git a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/ActivityGraphItemTransformer.java b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/ActivityGraphItemTransformer.java
index ee07a46..cd0fd5b 100644
--- a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/ActivityGraphItemTransformer.java
+++ b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/ActivityGraphItemTransformer.java
@@ -15,8 +15,7 @@
package org.eclipse.app4mc.slg.commons.m2t.transformers.sw;
-import java.util.Arrays;
-import java.util.List;
+import java.util.Map;
import org.eclipse.app4mc.amalthea.model.ActivityGraphItem;
import org.eclipse.app4mc.amalthea.model.ChannelReceive;
@@ -24,9 +23,8 @@
import org.eclipse.app4mc.amalthea.model.LabelAccess;
import org.eclipse.app4mc.amalthea.model.RunnableCall;
import org.eclipse.app4mc.amalthea.model.Ticks;
-import org.eclipse.app4mc.slg.commons.m2t.generators.TicksTranslationUnit;
-import org.eclipse.app4mc.slg.commons.m2t.generators.TranslationUnit;
import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGBaseTransformer;
+import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGTranslationUnit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -43,54 +41,35 @@
@Inject private LabelAccessTransformer labelAccessTransformer;
@Inject private TicksTransformer ticksTransformer;
- protected TranslationUnit _transform(final ActivityGraphItem activityGraphItem) {
- ActivityGraphItemTransformer.LOG.error(UNSUPPORTED_ELEMENT, activityGraphItem.getClass().getName());
- return new TranslationUnit("undefined", "", "", "");
- }
-
- protected TranslationUnit _transform(final RunnableCall runnableCall) {
- return this.runnableTransformer.transform(runnableCall.getRunnable());
- }
-
- protected TranslationUnit _transform(final Ticks ticks) {
- return this.ticksTransformer.transform(ticks);
- }
-
- public List<TicksTranslationUnit> transformAllItems(final Ticks ticks) {
- return this.ticksTransformer.transformAllItems(ticks);
- }
-
- protected TranslationUnit _transform(final LabelAccess labelAccess) {
- return this.labelAccessTransformer.transform(labelAccess);
- }
-
- protected TranslationUnit _transform(final ChannelReceive channelReceive) {
- ActivityGraphItemTransformer.LOG.error(UNSUPPORTED_ELEMENT, channelReceive.getClass().getName());
- return new TranslationUnit("undefined", "", "", "");
- }
-
- protected TranslationUnit _transform(final ChannelSend channelSend) {
- ActivityGraphItemTransformer.LOG.error(UNSUPPORTED_ELEMENT, channelSend.getClass().getName());
- return new TranslationUnit("undefined", "", "", "");
- }
-
- public TranslationUnit transform(final ActivityGraphItem channelReceive) {
- if (channelReceive instanceof ChannelReceive) {
- return _transform((ChannelReceive) channelReceive);
- } else if (channelReceive instanceof ChannelSend) {
- return _transform((ChannelSend) channelReceive);
- } else if (channelReceive instanceof LabelAccess) {
- return _transform((LabelAccess) channelReceive);
- } else if (channelReceive instanceof Ticks) {
- return _transform((Ticks) channelReceive);
- } else if (channelReceive instanceof RunnableCall) {
- return _transform((RunnableCall) channelReceive);
- } else if (channelReceive != null) {
- return _transform(channelReceive);
- } else {
- throw new IllegalArgumentException(
- "Unhandled parameter types: " + Arrays.<Object>asList(channelReceive).toString());
+ public SLGTranslationUnit transform(final ActivityGraphItem graphItem) {
+ if (graphItem == null) {
+ throw new IllegalArgumentException("Unhandled parameter type: null");
}
+
+ if (graphItem instanceof LabelAccess) {
+ return labelAccessTransformer.transform((LabelAccess) graphItem);
+
+ } else if (graphItem instanceof Ticks) {
+ return ticksTransformer.transform((Ticks) graphItem);
+
+ } else if (graphItem instanceof RunnableCall) {
+ return runnableTransformer.transform(((RunnableCall) graphItem).getRunnable());
+
+ } else if (graphItem instanceof ChannelReceive) {
+ LOG.error(UNSUPPORTED_ELEMENT, "ChannelReceive");
+ return new SLGTranslationUnit("ChannelReceive is not yet implemented");
+
+ } else if (graphItem instanceof ChannelSend) {
+ LOG.error(UNSUPPORTED_ELEMENT, "ChannelSend");
+ return new SLGTranslationUnit("ChannelSend is not yet implemented");
+ }
+
+ LOG.error(UNSUPPORTED_ELEMENT, graphItem.getClass().getName());
+ return new SLGTranslationUnit(graphItem.eClass().getName() + " in not supported");
+ }
+
+ public Map<String, SLGTranslationUnit> transformAllItems(final Ticks ticks) {
+ return ticksTransformer.transformAllItems(ticks);
}
}
diff --git a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/GroupHeaderTransformer.java b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/GroupHeaderTransformer.java
index 7219c1a..1547a86 100644
--- a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/GroupHeaderTransformer.java
+++ b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/GroupHeaderTransformer.java
@@ -16,18 +16,16 @@
package org.eclipse.app4mc.slg.commons.m2t.transformers.sw;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.LinkedHashSet;
-import java.util.function.Consumer;
+import java.util.List;
+import java.util.Map;
import org.eclipse.app4mc.amalthea.model.ActivityGraphItem;
-import org.eclipse.app4mc.amalthea.model.Component;
import org.eclipse.app4mc.amalthea.model.Group;
-import org.eclipse.app4mc.slg.commons.m2t.generators.TranslationUnit;
-import org.eclipse.app4mc.transformation.util.OutputBuffer;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.xtext.xbase.lib.CollectionLiterals;
-import org.eclipse.xtext.xbase.lib.StringExtensions;
+import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGTranslationUnit;
import com.google.inject.Inject;
import com.google.inject.Singleton;
@@ -35,66 +33,78 @@
@Singleton
public class GroupHeaderTransformer extends ActivityGraphItemTransformer {
- @Inject private OutputBuffer outputBuffer;
- @Inject private ActivityGraphItemTransformer psCallGraphItemTransformer;
+ @Inject private ActivityGraphItemTransformer activityGraphItemTransformer;
- public static String getModuleName(final Group group) {
- return "groups";
+ // ---------- generic part "def create new transform(...)" ----------
+
+ private final Map<List<Object>, SLGTranslationUnit> transformCache = new HashMap<>();
+
+ public Map<List<Object>, SLGTranslationUnit> getCache() {
+ return this.transformCache;
}
- public static String getFunctionDef(final Group group) {
- return "group_" + group.getName() + "()";
- }
+ public SLGTranslationUnit transform(final Group group) {
+ final List<Object> key = new ArrayList<>(Arrays.asList(group));
+ final SLGTranslationUnit tu;
- public TranslationUnit transform(final Group group, final Component component) {
- final ArrayList<?> key = CollectionLiterals.newArrayList(group, component);
- final TranslationUnit _result;
- synchronized (cache) {
- if (cache.containsKey(key)) {
- return cache.get(key);
+ synchronized (transformCache) {
+ if (transformCache.containsKey(key)) {
+ return transformCache.get(key);
}
- TranslationUnit _translationUnit = new TranslationUnit();
- _result = _translationUnit;
- cache.put(key, _result);
+ tu = createTranslationUnit(group);
+ transformCache.put(key, tu);
}
- _init_transform(_result, group, component);
- return _result;
+
+ // if translation unit is newly created and valid -> create files
+ if (tu.isValid()) {
+ doTransform(tu, group);
+ }
+
+ return tu;
}
- private final HashMap<ArrayList<?>, TranslationUnit> cache = CollectionLiterals.newHashMap();
+ // ---------------------------------------------------
- private void _init_transform(final TranslationUnit it, final Group group, final Component component) {
- it.setPath(GroupHeaderTransformer.getModuleName(group));
- it.setCall(GroupHeaderTransformer.getFunctionDef(group));
-
- final LinkedHashSet<String> groupItemIncludes = new LinkedHashSet<>();
- final LinkedHashSet<String> groupItemCalls = new LinkedHashSet<>();
-
- EList<ActivityGraphItem> _items = null;
- if (group != null) {
- _items = group.getItems();
+ private SLGTranslationUnit createTranslationUnit(final Group group) {
+ if ((group == null)) {
+ return new SLGTranslationUnit("UNSPECIFIED GROUP");
+ } else {
+ String basePath = "groups";
+ String moduleName = "groups";
+ String call = "group_" + group.getName() + "()";
+ return new SLGTranslationUnit(basePath, moduleName, call);
}
- final Consumer<ActivityGraphItem> _function = (ActivityGraphItem item) -> {
- final TranslationUnit tmp = this.psCallGraphItemTransformer.transform(item);
- if (((!StringExtensions.isNullOrEmpty(tmp.getExtendedIncPath()))
- && (!it.getExtendedIncPath().equals(tmp.getExtendedIncPath())))) {
- groupItemIncludes.add(tmp.getExtendedIncPath());
+ }
+
+ private void doTransform(final SLGTranslationUnit tu, final Group group) {
+ genFiles(tu, group);
+ }
+
+ private void genFiles(SLGTranslationUnit tu, final Group group) {
+ if (group == null)
+ return; // do nothing
+
+ final HashSet<String> groupItemIncludes = new LinkedHashSet<>();
+ final HashSet<String> groupItemCalls = new LinkedHashSet<>();
+
+ for (ActivityGraphItem item : group.getItems()) {
+
+ final SLGTranslationUnit tmpTU = activityGraphItemTransformer.transform(item);
+ if (tmpTU.isValid()) {
+ if (!getIncPath(tu).equals(getIncPath(tmpTU))) {
+ groupItemIncludes.add(getIncPath(tmpTU));
+ }
+ groupItemCalls.add(tmpTU.getCall());
}
- if (!StringExtensions.isNullOrEmpty(tmp.getCall())) {
- groupItemCalls.add(tmp.getCall());
- }
- };
- _items.forEach(_function);
+ }
- final int index = it.getExtendedIncPath().lastIndexOf(".");
- final String trimmedIncPath = it.getExtendedIncPath().substring(0, index);
+ incAppend(tu, "\n//Group " + group.getName() + "----\n");
- outputBuffer.appendTo("INC", trimmedIncPath, "\n//Group " + group.getName() + "----\n");
+ for (String include : groupItemIncludes) {
+ incAppend(tu, "#include \"" + include + "\"\n");
+ }
- groupItemIncludes.forEach(include ->
- outputBuffer.appendTo("INC", trimmedIncPath, "#include \"" + include + ".h\"\n"));
-
- outputBuffer.appendTo("INC", trimmedIncPath, "void " + it.getCall() + ";\n");
+ incAppend(tu, "void " + tu.getCall() + ";\n");
}
}
diff --git a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/GroupSourceTransformer.java b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/GroupSourceTransformer.java
index 2fc792b..138ace5 100644
--- a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/GroupSourceTransformer.java
+++ b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/GroupSourceTransformer.java
@@ -16,16 +16,15 @@
package org.eclipse.app4mc.slg.commons.m2t.transformers.sw;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
import org.eclipse.app4mc.amalthea.model.ActivityGraphItem;
-import org.eclipse.app4mc.amalthea.model.Component;
import org.eclipse.app4mc.amalthea.model.Group;
-import org.eclipse.app4mc.slg.commons.m2t.generators.TranslationUnit;
-import org.eclipse.app4mc.transformation.util.OutputBuffer;
-import org.eclipse.xtext.xbase.lib.CollectionLiterals;
-import org.eclipse.xtext.xbase.lib.StringExtensions;
+import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGTranslationUnit;
import com.google.inject.Inject;
import com.google.inject.Singleton;
@@ -33,60 +32,82 @@
@Singleton
public class GroupSourceTransformer extends ActivityGraphItemTransformer {
- @Inject private OutputBuffer outputBuffer;
- @Inject private ActivityGraphItemTransformer psCallGraphItemTransformer;
+ @Inject private ActivityGraphItemTransformer activityGraphItemTransformer;
- public TranslationUnit transform(final Group group, final Component component) {
- final ArrayList<?> key = CollectionLiterals.newArrayList(group, component);
- final TranslationUnit _result;
- synchronized (cache) {
- if (cache.containsKey(key)) {
- return cache.get(key);
- }
- TranslationUnit tu = new TranslationUnit();
- _result = tu;
- cache.put(key, _result);
- }
- _init_transform(_result, group, component);
- return _result;
+ // ---------- generic part "def create new transform(...)" ----------
+
+ private final Map<List<Object>, SLGTranslationUnit> transformCache = new HashMap<>();
+
+ public Map<List<Object>, SLGTranslationUnit> getCache() {
+ return this.transformCache;
}
- private final HashMap<ArrayList<?>, TranslationUnit> cache = CollectionLiterals.newHashMap();
+ public SLGTranslationUnit transform(final Group group) {
+ final List<Object> key = new ArrayList<>(Arrays.asList(group));
+ final SLGTranslationUnit tu;
- private void _init_transform(final TranslationUnit it, final Group group, final Component component) {
- it.setPath(GroupHeaderTransformer.getModuleName(group));
- it.setCall(GroupHeaderTransformer.getFunctionDef(group));
+ synchronized (transformCache) {
+ if (transformCache.containsKey(key)) {
+ return transformCache.get(key);
+ }
+ tu = createTranslationUnit(group);
+ transformCache.put(key, tu);
+ }
- final LinkedList<String> groupItemIncludes = new LinkedList<>();
- final LinkedList<String> groupItemCalls = new LinkedList<>();
+ // if translation unit is newly created and valid -> create files
+ if (tu.isValid()) {
+ doTransform(tu, group);
+ }
+ return tu;
+ }
- if (group != null) {
- for (ActivityGraphItem item : group.getItems()) {
- final TranslationUnit tmp = psCallGraphItemTransformer.transform(item);
- if (!StringExtensions.isNullOrEmpty(tmp.getPath())) {
- groupItemIncludes.add(tmp.getPath());
- }
- if (!StringExtensions.isNullOrEmpty(tmp.getCall())) {
- groupItemCalls.add(tmp.getCall());
- }
+ // ---------------------------------------------------
+
+ private SLGTranslationUnit createTranslationUnit(final Group group) {
+ if ((group == null)) {
+ return new SLGTranslationUnit("UNSPECIFIED GROUP");
+ } else {
+ String basePath = "groups";
+ String moduleName = "groups";
+ String call = "group_" + group.getName() + "()";
+ return new SLGTranslationUnit(basePath, moduleName, call);
+ }
+ }
+
+ private void doTransform(final SLGTranslationUnit tu, final Group group) {
+ genFiles(tu, group);
+ }
+
+ private void genFiles(SLGTranslationUnit tu, final Group group) {
+ if (group == null)
+ return; // do nothing
+
+ final List<String> groupItemIncludes = new LinkedList<>(); // Mc: why list here ? (See GroupHeaderTransformer)
+ final List<String> groupItemCalls = new LinkedList<>();
+
+ for (ActivityGraphItem item : group.getItems()) {
+
+ final SLGTranslationUnit tmpTU = activityGraphItemTransformer.transform(item);
+ if (tmpTU.isValid()) {
+ groupItemIncludes.add(getIncPath(tmpTU));
+ groupItemCalls.add(tmpTU.getCall());
}
}
- final int index = it.getExtendedSrcPath().lastIndexOf(".");
- final String trimmedSrcPath = it.getExtendedSrcPath().substring(0, index);
+ srcAppend(tu, "\n//Group " + group.getName() + "----\n");
- outputBuffer.appendTo("SRC", trimmedSrcPath, (("\n//Group " + group.getName()) + "----\n"));
+ for (String include : groupItemIncludes) {
+ srcAppend(tu, "#include \"" + include + ".h\"\n");
+ }
- groupItemIncludes.forEach(include ->
- outputBuffer.appendTo("SRC", trimmedSrcPath, "#include \"" + include + ".h\"\n"));
-
- outputBuffer.appendTo("SRC", trimmedSrcPath, "void " + it.getCall() + "{\n");
+ srcAppend(tu, "void " + tu.getCall() + "{\n");
- groupItemCalls.forEach(call ->
- outputBuffer.appendTo("SRC", trimmedSrcPath, call + ";\n"));
+ for (String call : groupItemCalls) {
+ srcAppend(tu, call + ";\n");
+ }
- outputBuffer.appendTo("SRC", trimmedSrcPath, "}");
+ srcAppend(tu, "}");
}
}
diff --git a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/InstrumentationTransformer.java b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/InstrumentationTransformer.java
index 3d4b628..f4247d0 100644
--- a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/InstrumentationTransformer.java
+++ b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/InstrumentationTransformer.java
@@ -23,6 +23,7 @@
import org.eclipse.app4mc.transformation.util.OutputBuffer;
import com.google.inject.Inject;
+
public class InstrumentationTransformer extends SLGBaseTransformer {
@Inject private OutputBuffer outputBuffer;
diff --git a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/LabelAccessTransformer.java b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/LabelAccessTransformer.java
index 293c2e5..d5969a1 100644
--- a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/LabelAccessTransformer.java
+++ b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/LabelAccessTransformer.java
@@ -1,6 +1,6 @@
/**
********************************************************************************
- * Copyright (c) 2021 Robert Bosch GmbH.
+ * Copyright (c) 2020-2021 Robert Bosch GmbH.
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
@@ -15,10 +15,13 @@
package org.eclipse.app4mc.slg.commons.m2t.transformers.sw;
+import static org.eclipse.app4mc.amalthea.model.LabelAccessEnum._UNDEFINED_;
+
import org.eclipse.app4mc.amalthea.model.LabelAccess;
-import org.eclipse.app4mc.slg.commons.m2t.generators.LabelAccessTranslationUnit;
-import org.eclipse.app4mc.slg.commons.m2t.generators.LabelTranslationUnit;
-import org.eclipse.app4mc.transformation.util.OutputBuffer;
+import org.eclipse.app4mc.amalthea.model.MinAvgMaxStatistic;
+import org.eclipse.app4mc.amalthea.model.NumericStatistic;
+import org.eclipse.app4mc.amalthea.model.SingleValueStatistic;
+import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGTranslationUnit;
import com.google.inject.Inject;
import com.google.inject.Singleton;
@@ -26,12 +29,64 @@
@Singleton
public class LabelAccessTransformer {
- @Inject private OutputBuffer outputBuffer;
@Inject private LabelTransformer labelTransformer;
- public LabelAccessTranslationUnit transform(final LabelAccess labelAccess) {
- final LabelTranslationUnit tuLabel = this.labelTransformer.transform(labelAccess.getData());
- return new LabelAccessTranslationUnit(this.outputBuffer, tuLabel, labelAccess);
+ public SLGTranslationUnit transform(final LabelAccess labelAccess) {
+ final SLGTranslationUnit labelTU = labelTransformer.transform(labelAccess.getData());
+
+ return createTranslationUnit(labelAccess, labelTU);
+ }
+
+ private SLGTranslationUnit createTranslationUnit(LabelAccess labelAccess, SLGTranslationUnit labelTU) {
+ if ((labelTU == null)) {
+ return new SLGTranslationUnit("UNSPECIFIED LABEL ACCESS");
+ }
+
+ String basePath = labelTU.getBasePath();
+ String moduleName = labelTU.getModuleName();
+ String call = computeCall(labelAccess);
+ return new SLGTranslationUnit(basePath, moduleName, call);
+ }
+
+ private String computeCall(final LabelAccess labelAccess) {
+
+ if (labelAccess == null
+ || labelAccess.getData() == null
+ || labelAccess.getData().getName() == null
+ || labelAccess.getData().getName().isEmpty())
+ return "/* unspecified label access */";
+
+ if (labelAccess.getAccess() == _UNDEFINED_) {
+ return ("/*underspecified access to label" + labelAccess.getData().getName()) + "*/";
+ }
+
+ final NumericStatistic stat = statisticValueOrNull(labelAccess);
+ final String statString = (stat == null) ? "1" : getNumericStatistic(stat);
+
+ switch (labelAccess.getAccess()) {
+ case READ:
+ return "read_" + labelAccess.getData().getName() + "(" + statString + ")";
+ case WRITE:
+ return "write_" + labelAccess.getData().getName() + "(" + statString + ")";
+ default:
+ return null;
+ }
+ }
+
+ private NumericStatistic statisticValueOrNull(final LabelAccess access) {
+ if (access == null || access.getStatistic() == null) return null;
+
+ return access.getStatistic().getValue();
+ }
+
+ private String getNumericStatistic(final NumericStatistic statistic) {
+ if (statistic instanceof MinAvgMaxStatistic) {
+ String valueString = String.format("%d", Math.ceil(((MinAvgMaxStatistic) statistic).getAvg()));
+ return (valueString + " /*MinAvgMaxStatistic not supported yet*/");
+ } else if (statistic instanceof SingleValueStatistic) {
+ return String.format("%d", Math.ceil(((SingleValueStatistic) statistic).getValue()));
+ }
+ return null;
}
}
diff --git a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/LabelTransformer.java b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/LabelTransformer.java
index 995fef5..c2c2ed3 100644
--- a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/LabelTransformer.java
+++ b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/LabelTransformer.java
@@ -16,14 +16,16 @@
package org.eclipse.app4mc.slg.commons.m2t.transformers.sw;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
import org.eclipse.app4mc.amalthea.model.Label;
import org.eclipse.app4mc.slg.commons.m2t.generators.LabelGenerator;
-import org.eclipse.app4mc.slg.commons.m2t.generators.LabelTranslationUnit;
import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGBaseTransformer;
+import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGTranslationUnit;
import org.eclipse.app4mc.transformation.util.OutputBuffer;
-import org.eclipse.xtext.xbase.lib.CollectionLiterals;
import com.google.inject.Inject;
import com.google.inject.Singleton;
@@ -31,36 +33,74 @@
@Singleton
public class LabelTransformer extends SLGBaseTransformer {
+ public static final String LIB_NAME = "LABELS_LIB";
+ public static final String BASE_PATH = "synthetic_gen";
+ public static final String MODULE_NAME = "labels";
+ public static final String MODULE_PATH = BASE_PATH + "/" + MODULE_NAME;
+ public static final String MAKEFILE_PATH = MODULE_PATH + "/CMakeLists.txt";
+
@Inject private OutputBuffer outputBuffer;
- public LabelTranslationUnit transform(final Label label) {
- final ArrayList<?> key = CollectionLiterals.newArrayList(label);
- final LabelTranslationUnit _result;
- synchronized (cache) {
- if (cache.containsKey(key)) {
- return cache.get(key);
+ // ---------- generic part "def create new transform(...)" ----------
+
+ private final Map<List<Object>, SLGTranslationUnit> transformCache = new HashMap<>();
+
+ public Map<List<Object>, SLGTranslationUnit> getCache() {
+ return this.transformCache;
+ }
+
+ public SLGTranslationUnit transform(final Label label) {
+ final List<Object> key = new ArrayList<>(Arrays.asList(label));
+ final SLGTranslationUnit tu;
+
+ synchronized (transformCache) {
+ if (transformCache.containsKey(key)) {
+ return transformCache.get(key);
}
- LabelTranslationUnit tu = new LabelTranslationUnit(this.outputBuffer, label);
- _result = tu;
- cache.put(key, _result);
+ tu = createTranslationUnit(label);
+ transformCache.put(key, tu);
}
- _init_transform(_result, label);
- return _result;
+
+ // if translation unit is newly created and valid -> create files
+ if (tu.isValid()) {
+ doTransform(tu, label);
+ }
+
+ return tu;
}
- private final HashMap<ArrayList<?>, LabelTranslationUnit> cache = CollectionLiterals.newHashMap();
+ // ---------------------------------------------------
- private void _init_transform(final LabelTranslationUnit it, final Label label) {
+ public SLGTranslationUnit createTranslationUnit(final Label label) {
+ if ((label == null)) {
+ return new SLGTranslationUnit("UNSPECIFIED LABEL");
+ } else {
+ String basePath = BASE_PATH;
+ String moduleName = MODULE_NAME;
+ String call = label.getName();
+ return new SLGTranslationUnit(basePath, moduleName, call);
+ }
}
- @Override
- public HashMap<ArrayList<?>, LabelTranslationUnit> getCache() {
- return this.cache;
+ private void doTransform(final SLGTranslationUnit tu, final Label label) {
+ genFiles(tu, label);
+ }
+
+ public void genFiles(SLGTranslationUnit tu, Label label) {
+ if (isSrcFileEmpty(tu)) {
+ srcAppend(tu, "#include \"" + getIncFile(tu) + "\"\n\n");
+ }
+ if (isIncFileEmpty(tu)) { // Mc: ???
+ incAppend(tu, "#include <stdbool.h>\n\n");
+ }
+
+ incAppend(tu, LabelGenerator.toH(label));
+ srcAppend(tu, LabelGenerator.toCpp(label));
}
public boolean createCMake() {
- return this.outputBuffer.appendTo("OTHER", LabelTranslationUnit.getMakeFilePathStatic(),
- LabelGenerator.toCMake(this.getSrcFiles()));
+ return outputBuffer.appendTo(
+ "OTHER", MAKEFILE_PATH, LabelGenerator.toCMake(LIB_NAME, getSrcFiles()));
}
}
diff --git a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/RunnableTransformer.java b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/RunnableTransformer.java
index 1633866..a690a58 100644
--- a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/RunnableTransformer.java
+++ b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/RunnableTransformer.java
@@ -1,6 +1,6 @@
/**
********************************************************************************
- * Copyright (c) 2021 Robert Bosch GmbH.
+ * Copyright (c) 2020-2021 Robert Bosch GmbH.
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
@@ -16,15 +16,19 @@
package org.eclipse.app4mc.slg.commons.m2t.transformers.sw;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedHashSet;
+import java.util.List;
import java.util.Map;
+import org.eclipse.app4mc.amalthea.model.ActivityGraphItem;
+import org.eclipse.app4mc.amalthea.model.Runnable;
import org.eclipse.app4mc.slg.commons.m2t.generators.RunnableGenerator;
-import org.eclipse.app4mc.slg.commons.m2t.generators.RunnableTranslationUnit;
-import org.eclipse.app4mc.slg.commons.m2t.generators.TranslationUnit;
import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGBaseTransformer;
+import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGTranslationUnit;
import org.eclipse.app4mc.transformation.util.OutputBuffer;
-import org.eclipse.xtext.xbase.lib.CollectionLiterals;
import com.google.inject.Inject;
import com.google.inject.Singleton;
@@ -33,39 +37,107 @@
public class RunnableTransformer extends SLGBaseTransformer {
@Inject private OutputBuffer outputBuffer;
- @Inject private ActivityGraphItemTransformer psCallGraphItemTransformer;
+ @Inject private ActivityGraphItemTransformer activityGraphItemTransformer;
- public RunnableTranslationUnit transform(final org.eclipse.app4mc.amalthea.model.Runnable runnable) {
- final ArrayList<?> key = CollectionLiterals.newArrayList(runnable);
- final RunnableTranslationUnit _result;
- synchronized (cache) {
- if (cache.containsKey(key)) {
- return cache.get(key);
- }
- RunnableTranslationUnit tu = new RunnableTranslationUnit(this.outputBuffer,
- this.psCallGraphItemTransformer, runnable);
- _result = tu;
- cache.put(key, _result);
- }
- _init_transform(_result, runnable);
- return _result;
- }
+ // ---------- generic part "def create new transform(...)" ----------
- private final HashMap<ArrayList<?>, RunnableTranslationUnit> cache = CollectionLiterals
- .newHashMap();
-
- private void _init_transform(final RunnableTranslationUnit it,
- final org.eclipse.app4mc.amalthea.model.Runnable runnable) {
- }
+ private final Map<List<Object>, SLGTranslationUnit> transformCache = new HashMap<>();
@Override
- public Map<ArrayList<?>, ? extends TranslationUnit> getCache() {
- return this.cache;
+ public Map<List<Object>, SLGTranslationUnit> getCache() {
+ return this.transformCache;
+ }
+
+ public SLGTranslationUnit transform(final Runnable runnable) {
+ final List<Object> key = new ArrayList<>(Arrays.asList(runnable));
+ final SLGTranslationUnit tu;
+
+ synchronized (transformCache) {
+ if (transformCache.containsKey(key)) {
+ return transformCache.get(key);
+ }
+ tu = createTranslationUnit(runnable);
+ transformCache.put(key, tu);
+ }
+
+ // if translation unit is newly created and valid -> create files
+ if (tu.isValid()) {
+ doTransform(tu, runnable);
+ }
+
+ return tu;
+ }
+
+ // ---------------------------------------------------
+
+ public SLGTranslationUnit createTranslationUnit(final Runnable runnable) {
+ if ((runnable == null)) {
+ return new SLGTranslationUnit("UNSPECIFIED RUNNABLE");
+ } else {
+ String basePath = "synthetic_gen";
+ String moduleName = "runnables";
+ String call = "run_" + runnable.getName() + "()";
+ return new SLGTranslationUnit(basePath, moduleName, call);
+ }
+ }
+
+ private void doTransform(final SLGTranslationUnit tu, final Runnable runnable) {
+ genFiles(tu, runnable);
+ }
+
+ public void genFiles(final SLGTranslationUnit tu, final Runnable runnable) {
+ if (isSrcFileEmpty(tu)) {
+ srcAppend(tu, "#include \"" + getIncFile(tu) + "\"\n");
+ }
+
+ final HashSet<String> includes = new LinkedHashSet<>();
+ final List<String> calls = new ArrayList<>();
+
+ if (runnable != null && runnable.getActivityGraph() != null) {
+ for (ActivityGraphItem item : runnable.getActivityGraph().getItems()) {
+
+ final SLGTranslationUnit tmpTU = activityGraphItemTransformer.transform(item);
+
+ String tmpIncFile = getIncFile(tmpTU);
+ if (tmpIncFile != null && !tmpIncFile.isEmpty() && !tmpIncFile.equals(getIncFile(tu))) {
+ includes.add(tmpIncFile);
+ }
+ final String tmpCall = tmpTU.getCall();
+ if (tmpCall != null && !tmpCall.isEmpty()) {
+ calls.add(tmpCall);
+ }
+ }
+ }
+
+ incAppend(tu, "\n//Runnable " + runnable.getName() + "----\n");
+ toH(tu, includes);
+
+ srcAppend(tu, "\n//Runnable " + runnable.getName() + "----\n");
+ toCpp(tu, calls);
+ }
+
+ private void toH(final SLGTranslationUnit tu, final HashSet<String> includes) {
+ for (String include : includes) {
+ incAppend(tu, "#include \"" + include + "\"\n");
+ }
+
+ incAppend(tu, "void " + tu.getCall() + ";\n");
+ }
+
+ private void toCpp(final SLGTranslationUnit tu, final List<String> calls) {
+ srcAppend(tu, "void " + tu.getCall() + "{\n");
+
+ for (String call : calls) {
+ srcAppend(tu, "\t" + call + ";\n");
+ }
+
+ srcAppend(tu, "}\n\n");
}
public boolean createCMake() {
- return this.outputBuffer.appendTo("OTHER", RunnableTranslationUnit.getMakeFilePathStatic(),
- RunnableGenerator.toCMake(this.getSrcFiles()));
+ // Building rule: basePath + moduleName + "CMakeLists.txt"
+ String makeFilePath = "synthetic_gen/runnables/CMakeLists.txt";
+ return outputBuffer.appendTo("OTHER", makeFilePath, RunnableGenerator.toCMake(getSrcFiles()));
}
}
diff --git a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/TaskTransformer.java b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/TaskTransformer.java
index 17b31fe..8b6667c 100644
--- a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/TaskTransformer.java
+++ b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/TaskTransformer.java
@@ -16,16 +16,24 @@
package org.eclipse.app4mc.slg.commons.m2t.transformers.sw;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.HashMap;
+import java.util.LinkedHashSet;
+import java.util.LinkedList;
+import java.util.List;
import java.util.Map;
+import java.util.Map.Entry;
-import org.eclipse.app4mc.amalthea.model.Component;
+import org.eclipse.app4mc.amalthea.model.ActivityGraphItem;
+import org.eclipse.app4mc.amalthea.model.Label;
+import org.eclipse.app4mc.amalthea.model.Runnable;
+import org.eclipse.app4mc.amalthea.model.RunnableCall;
+import org.eclipse.app4mc.amalthea.model.Tag;
import org.eclipse.app4mc.amalthea.model.Task;
-import org.eclipse.app4mc.slg.commons.m2t.generators.TaskTranslationUnit;
-import org.eclipse.app4mc.slg.commons.m2t.generators.TranslationUnit;
+import org.eclipse.app4mc.slg.commons.m2t.generators.LabelGenerator;
+import org.eclipse.app4mc.slg.commons.m2t.generators.TaskGenerator;
import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGBaseTransformer;
-import org.eclipse.app4mc.transformation.util.OutputBuffer;
-import org.eclipse.xtext.xbase.lib.CollectionLiterals;
+import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGTranslationUnit;
import com.google.inject.Inject;
import com.google.inject.Singleton;
@@ -33,34 +41,92 @@
@Singleton
public class TaskTransformer extends SLGBaseTransformer {
- @Inject private OutputBuffer outputBuffer;
@Inject private RunnableTransformer runnableTransformer;
@Inject private LabelTransformer labelTransformer;
- public TaskTranslationUnit transform(final Task task, final Component component) {
- final ArrayList<?> key = CollectionLiterals.newArrayList(task, component);
- final TaskTranslationUnit _result;
- synchronized (cache) {
- if (cache.containsKey(key)) {
- return cache.get(key);
- }
- TaskTranslationUnit _taskTranslationUnit = new TaskTranslationUnit(this.outputBuffer,
- this.runnableTransformer, this.labelTransformer, task, component);
- _result = _taskTranslationUnit;
- cache.put(key, _result);
- }
- _init_transform(_result, task, component);
- return _result;
- }
+ // ---------- generic part "def create new transform(...)" ----------
- private final HashMap<ArrayList<?>, TaskTranslationUnit> cache = CollectionLiterals.newHashMap();
-
- private void _init_transform(final TaskTranslationUnit it, final Task task, final Component component) {
- }
+ private final Map<List<Object>, SLGTranslationUnit> transformCache = new HashMap<>();
@Override
- public Map<ArrayList<?>, ? extends TranslationUnit> getCache() {
- return this.cache;
+ public Map<List<Object>, SLGTranslationUnit> getCache() {
+ return this.transformCache;
+ }
+
+ public SLGTranslationUnit transform(final Task task) {
+ final List<Object> key = new ArrayList<>(Arrays.asList(task));
+ final SLGTranslationUnit tu;
+
+ synchronized (transformCache) {
+ if (transformCache.containsKey(key)) {
+ return transformCache.get(key);
+ }
+ tu = createTranslationUnit(task);
+ transformCache.put(key, tu);
+ }
+
+ // if translation unit is newly created and valid -> create files
+ if (tu.isValid()) {
+ doTransform(tu, task);
+ }
+
+ return tu;
+ }
+
+ // ---------------------------------------------------
+
+ public SLGTranslationUnit createTranslationUnit(final Task task) {
+ if ((task == null)) {
+ return new SLGTranslationUnit("UNSPECIFIED TASK");
+ } else {
+ String basePath = "";
+ String moduleName = task.getName();
+ String call = "" + task.getName() + "()"; // unused
+ return new SLGTranslationUnit(basePath, moduleName, call);
+ }
+ }
+
+ private void doTransform(final SLGTranslationUnit tu, final Task task) {
+ genFiles(tu, task);
+ }
+
+ public void genFiles(SLGTranslationUnit tu, final Task task) {
+
+ final LinkedHashSet<String> includes = new LinkedHashSet<>();
+ final LinkedList<String> initCalls = new LinkedList<>();
+ final LinkedList<String> stepCalls = new LinkedList<>();
+
+ if (task != null && task.getActivityGraph() != null) {
+ for (ActivityGraphItem item : task.getActivityGraph().getItems()) {
+
+ if (item instanceof RunnableCall) {
+ final Runnable runnable = ((RunnableCall) item).getRunnable();
+ final SLGTranslationUnit runnableTU = runnableTransformer.transform(runnable);
+
+ includes.add(getIncFile(runnableTU));
+
+ List<Tag> tags = ((RunnableCall) item).getTags();
+ if (tags.stream().anyMatch(tag -> "initialize".equals(tag.getName()))) {
+ initCalls.add(runnableTU.getCall());
+ } else {
+ stepCalls.add(runnableTU.getCall());
+ }
+ }
+ }
+ }
+
+ for (Entry<List<Object>, SLGTranslationUnit> entry : labelTransformer.getCache().entrySet()) {
+ if (entry.getKey().get(0) instanceof Label) { // Mc: use better way to get the object of interest
+ Label label = (Label) entry.getKey();
+ SLGTranslationUnit labelTU = entry.getValue();
+
+ includes.add(getIncFile(labelTU));
+ initCalls.add(LabelGenerator.initCall(label));
+ }
+ }
+
+ incAppend(tu, TaskGenerator.toH(tu));
+ srcAppend(tu, TaskGenerator.toCpp(tu, getIncFile(tu), includes, initCalls, stepCalls));
}
}
diff --git a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/TicksTransformer.java b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/TicksTransformer.java
index fee1ec6..839f1be 100644
--- a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/TicksTransformer.java
+++ b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/TicksTransformer.java
@@ -1,6 +1,6 @@
/**
********************************************************************************
- * Copyright (c) 2021 Robert Bosch GmbH.
+ * Copyright (c) 2020-2021 Robert Bosch GmbH.
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
@@ -15,17 +15,16 @@
package org.eclipse.app4mc.slg.commons.m2t.transformers.sw;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
import org.eclipse.app4mc.amalthea.model.IDiscreteValueDeviation;
import org.eclipse.app4mc.amalthea.model.ProcessingUnitDefinition;
import org.eclipse.app4mc.amalthea.model.Ticks;
-import org.eclipse.app4mc.slg.commons.m2t.generators.TicksTranslationUnit;
-import org.eclipse.app4mc.slg.commons.m2t.generators.TicksUtilsTranslationUnit;
+import org.eclipse.app4mc.slg.commons.m2t.generators.TicksGenerator;
import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGBaseTransformer;
-import org.eclipse.app4mc.transformation.util.OutputBuffer;
+import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGTranslationUnit;
import org.eclipse.emf.common.util.EMap;
import com.google.inject.Inject;
@@ -34,42 +33,54 @@
@Singleton
public class TicksTransformer extends SLGBaseTransformer {
- @Inject private OutputBuffer outputBuffer;
@Inject private TicksUtilsTransformer ticksUtilsTransformer;
- public TicksTranslationUnit transform(final Ticks ticks) {
+ public SLGTranslationUnit transform(final Ticks ticks) {
if (ticks.getDefault() != null) {
- final TicksUtilsTranslationUnit tuTicks = ticksUtilsTransformer.generate(ticks.getDefault());
- return new TicksTranslationUnit(outputBuffer, tuTicks, ticks, "default", ticks.getDefault());
+ final SLGTranslationUnit ticksUtilsTU = ticksUtilsTransformer.transform(ticks.getDefault());
+
+ return createTranslationUnit(ticks, ticksUtilsTU);
}
+
return null;
}
- public List<TicksTranslationUnit> transformAllItems(final Ticks ticks) {
- final List<TicksTranslationUnit> result = new ArrayList<TicksTranslationUnit>();
+ private SLGTranslationUnit createTranslationUnit(Ticks ticks, SLGTranslationUnit ticksUtilsTU) {
+ if ((ticksUtilsTU == null)) {
+ return new SLGTranslationUnit("UNSPECIFIED TICKS");
+ }
+
+ String basePath = ticksUtilsTU.getBasePath();
+ String moduleName = ticksUtilsTU.getModuleName();
+ String call = computeCall(ticks);
+ return new SLGTranslationUnit(basePath, moduleName, call);
+ }
+
+ private String computeCall(Ticks ticks) {
+ String parameters = TicksGenerator.getParameters(ticks.getDefault());
+ String className = ticks.getDefault().eClass().getName();
+ return "executeTicks_" + className +"(" + parameters + ")";
+ }
+
+ public Map<String, SLGTranslationUnit> transformAllItems(final Ticks ticks) {
+ final Map<String, SLGTranslationUnit> result = new HashMap<>();
+
final IDiscreteValueDeviation defaultTicks = ticks.getDefault();
if ((defaultTicks != null)) {
- final TicksUtilsTranslationUnit tuTicks = this.ticksUtilsTransformer.generate(ticks.getDefault());
- result.add(new TicksTranslationUnit(this.outputBuffer, tuTicks, ticks,
- "default", ticks.getDefault()));
+ final SLGTranslationUnit ticksUtilsTU = ticksUtilsTransformer.transform(defaultTicks);
+ result.put("default", createTranslationUnit(ticks, ticksUtilsTU));
}
- EMap<ProcessingUnitDefinition, IDiscreteValueDeviation> _extended = null;
- if (ticks != null) {
- _extended = ticks.getExtended();
- }
- final EMap<ProcessingUnitDefinition, IDiscreteValueDeviation> puExtendedMap = _extended;
- Set<ProcessingUnitDefinition> _keySet = puExtendedMap.keySet();
- for (final ProcessingUnitDefinition puDefinition : _keySet) {
- {
- final IDiscreteValueDeviation ticksValue = puExtendedMap.get(puDefinition);
- if (((puDefinition != null) && (ticksValue != null))) {
- final TicksUtilsTranslationUnit tuTicks_1 = this.ticksUtilsTransformer.generate(ticksValue);
- String _name = puDefinition.getName();
- TicksTranslationUnit _ticksTranslationUnit_1 = new TicksTranslationUnit(this.outputBuffer,
- tuTicks_1, ticks, _name, ticksValue);
- result.add(_ticksTranslationUnit_1);
- }
+
+ final EMap<ProcessingUnitDefinition, IDiscreteValueDeviation> extendedTicksMap = ticks.getExtended();
+ for (final Entry<ProcessingUnitDefinition, IDiscreteValueDeviation> entry : extendedTicksMap.entrySet()) {
+ final ProcessingUnitDefinition puDefinition = entry.getKey();
+ final IDiscreteValueDeviation ticksDeviation = entry.getValue();
+
+ if (puDefinition != null && ticksDeviation != null) {
+ final SLGTranslationUnit ticksUtilsTU = this.ticksUtilsTransformer.transform(ticksDeviation);
+ result.put(puDefinition.getName(), createTranslationUnit(ticks, ticksUtilsTU));
}
+
}
return result;
}
diff --git a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/TicksUtilsTransformer.java b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/TicksUtilsTransformer.java
index 6e81f1f..a7af03f 100644
--- a/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/TicksUtilsTransformer.java
+++ b/load_generator/commons/plugins/org.eclipse.app4mc.slg.commons.m2t/src/org/eclipse/app4mc/slg/commons/m2t/transformers/sw/TicksUtilsTransformer.java
@@ -15,19 +15,22 @@
package org.eclipse.app4mc.slg.commons.m2t.transformers.sw;
+import static org.eclipse.app4mc.slg.commons.m2t.transformers.SLGBaseSettings.OTHER_TYPE;
+
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import org.eclipse.app4mc.amalthea.model.IDiscreteValueDeviation;
import org.eclipse.app4mc.slg.commons.m2t.CustomObjectsStore;
import org.eclipse.app4mc.slg.commons.m2t.generators.TicksUtilsGenerator;
-import org.eclipse.app4mc.slg.commons.m2t.generators.TicksUtilsTranslationUnit;
-import org.eclipse.app4mc.slg.commons.m2t.generators.TranslationUnit;
import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGBaseTransformer;
+import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGTranslationUnit;
import org.eclipse.app4mc.slg.config.ConfigModel;
import org.eclipse.app4mc.transformation.util.OutputBuffer;
-import org.eclipse.xtext.xbase.lib.CollectionLiterals;
+import org.eclipse.emf.ecore.EClass;
import com.google.inject.Inject;
import com.google.inject.Singleton;
@@ -38,45 +41,94 @@
@Inject private OutputBuffer outputBuffer;
@Inject private CustomObjectsStore customObjsStore;
- public TicksUtilsTranslationUnit generate(final IDiscreteValueDeviation value) {
- return this.generateIntern(value.getClass());
+ public SLGTranslationUnit transform(final IDiscreteValueDeviation value) {
+ if (value == null)
+ return new SLGTranslationUnit("UNSPECIFIED TICKS");
+
+ return transformClass(value.eClass()); // hash according to class not instance
}
- public TicksUtilsTranslationUnit generateIntern(final Object valueClass) {
- final ArrayList<?> key = CollectionLiterals.newArrayList(valueClass);
- final TicksUtilsTranslationUnit _result;
- synchronized (cache) {
- if (cache.containsKey(key)) {
- return cache.get(key);
+ // ---------- generic part "def create new transform(...)" ----------
+
+ private final Map<List<Object>, SLGTranslationUnit> transformCache = new HashMap<>();
+
+ public Map<List<Object>, SLGTranslationUnit> getCache() {
+ return this.transformCache;
+ }
+
+ public SLGTranslationUnit transformClass(final EClass eClass) {
+ final List<Object> key = new ArrayList<>(Arrays.asList(eClass));
+ final SLGTranslationUnit tu;
+
+ synchronized (transformCache) {
+ if (transformCache.containsKey(key)) {
+ return transformCache.get(key);
}
- ConfigModel _instance = this.customObjsStore.<ConfigModel>getInstance(ConfigModel.class);
- TicksUtilsTranslationUnit tu = new TicksUtilsTranslationUnit(this.outputBuffer,
- _instance, valueClass);
- _result = tu;
- cache.put(key, _result);
+ tu = createTranslationUnit(eClass);
+ transformCache.put(key, tu);
}
- _init_generateIntern(_result, valueClass);
- return _result;
+
+ // if translation unit is newly created and valid -> create files
+ if (tu.isValid()) {
+ doTransform(tu, eClass);
+ }
+
+ return tu;
}
- private final HashMap<ArrayList<?>, TicksUtilsTranslationUnit> cache = CollectionLiterals
- .newHashMap();
+ // ---------------------------------------------------
- private void _init_generateIntern(final TicksUtilsTranslationUnit it, final Object valueClass) {
+ private SLGTranslationUnit createTranslationUnit(final EClass eClass) {
+ if (eClass == null) {
+ return new SLGTranslationUnit("UNSPECIFIED TICKS");
+ } else {
+ String basePath = "synthetic_gen";
+ String moduleName = "ticksUtils";
+ String call = "burnTicks(<params>)"; // unused
+ return new SLGTranslationUnit(basePath, moduleName, call);
+ }
}
- @Override
- public Map<ArrayList<?>, ? extends TranslationUnit> getCache() {
- return this.cache;
+ private void doTransform(final SLGTranslationUnit tu, final EClass eClass) {
+ genFiles(tu, eClass);
}
- public boolean write() {
- return this.createCMake();
+ public void genFiles(SLGTranslationUnit tu, final EClass eClass) {
+ if (isIncFileEmpty(tu)) {
+ toH(tu);
+ }
+ if (isSrcFileEmpty(tu)) {
+ toCPP(tu);
+ }
+ srcAppend(tu, TicksUtilsGenerator.generateTicks(eClass));
+ incAppend(tu, TicksUtilsGenerator.generateTicksDeclaration(eClass));
}
- public boolean createCMake() {
- return this.outputBuffer.appendTo("OTHER", TicksUtilsTranslationUnit.getMakeFilePathStatic(),
- TicksUtilsGenerator.toCMake(this.getSrcFiles()));
+ private void toCPP(SLGTranslationUnit tu) {
+ srcAppend(tu, "#include \"" + getIncFile(tu) + "\"\n");
+
+ final ConfigModel configModel = customObjsStore.<ConfigModel>getInstance(ConfigModel.class);
+
+ final String ticksCodeSnippet = configModel.getCustomTickImpl().getValue();
+ final boolean ticksCodeEnabled = configModel.getCustomTickImpl().isEnable();
+
+ final String burnTicksBody = ticksCodeEnabled ? ticksCodeSnippet : TicksUtilsGenerator.burnTicksDefault();
+
+ srcAppend(tu, TicksUtilsGenerator.burnTicks(burnTicksBody));
+ srcAppend(tu, TicksUtilsGenerator.burnTicksStatistics(configModel));
+ }
+
+ private void toH(SLGTranslationUnit tu) {
+
+ incAppend(tu, TicksUtilsGenerator.burnTicksDeclaration());
+ incAppend(tu, TicksUtilsGenerator.burnTicksStatisticsDeclaration());
+
+ }
+
+ public void createCMake() {
+ // Building rule: basePath + moduleName + "CMakeLists.txt"
+ String makeFilePath = "synthetic_gen/ticksUtils/CMakeLists.txt";
+ outputBuffer.appendTo(OTHER_TYPE, makeFilePath, TicksUtilsGenerator.toCMake(getSrcFiles()));
}
}
diff --git a/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/customization/CustomRunnableTransformer.java b/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/customization/CustomRunnableTransformer.java
index d1feece..c89da4c 100644
--- a/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/customization/CustomRunnableTransformer.java
+++ b/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/customization/CustomRunnableTransformer.java
@@ -1,4 +1,5 @@
/**
+ ********************************************************************************
* Copyright (c) 2020-2021 Robert Bosch GmbH.
*
* This program and the accompanying materials are made
@@ -9,47 +10,201 @@
*
* Contributors:
* Robert Bosch GmbH - initial API and implementation
+ ********************************************************************************
*/
package org.eclipse.app4mc.slg.customization;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import org.eclipse.app4mc.amalthea.model.ActivityGraphItem;
+import org.eclipse.app4mc.amalthea.model.InterProcessTrigger;
+import org.eclipse.app4mc.amalthea.model.Process;
import org.eclipse.app4mc.amalthea.model.Runnable;
-import org.eclipse.app4mc.slg.commons.m2t.generators.RunnableTranslationUnit;
+import org.eclipse.app4mc.amalthea.model.Ticks;
+import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGTranslationUnit;
import org.eclipse.app4mc.slg.commons.m2t.transformers.sw.ActivityGraphItemTransformer;
import org.eclipse.app4mc.slg.commons.m2t.transformers.sw.RunnableTransformer;
-import org.eclipse.app4mc.transformation.util.OutputBuffer;
-import org.eclipse.xtext.xbase.lib.CollectionLiterals;
+import org.eclipse.app4mc.slg.linux.transformers.LinuxBaseSettings;
import com.google.inject.Inject;
+import com.google.inject.Singleton;
+@Singleton
public class CustomRunnableTransformer extends RunnableTransformer {
- @Inject private OutputBuffer outputBuffer;
- @Inject private ActivityGraphItemTransformer psCallGraphItemTransformer;
+ @Inject private ActivityGraphItemTransformer activityGraphItemTransformer;
+
+ // ---------- generic part "def create new transform(...)" ----------
+
+ private final Map<List<Object>, SLGTranslationUnit> transformCache = new HashMap<>();
@Override
- public RunnableTranslationUnit transform(final Runnable runnable) {
- final ArrayList<?> key = CollectionLiterals.newArrayList(runnable);
- final CustomRunnableTranslationUnit result;
- synchronized (_createCache_transform) {
- if (_createCache_transform.containsKey(key)) {
- return _createCache_transform.get(key);
+ public Map<List<Object>, SLGTranslationUnit> getCache() {
+ return this.transformCache;
+ }
+
+ @Override
+ public SLGTranslationUnit transform(final Runnable runnable) {
+ final List<Object> key = new ArrayList<>(Arrays.asList(runnable));
+ final SLGTranslationUnit tu;
+
+ synchronized (transformCache) {
+ if (transformCache.containsKey(key)) {
+ return transformCache.get(key);
}
- CustomRunnableTranslationUnit tu = new CustomRunnableTranslationUnit(
- this.outputBuffer, this.psCallGraphItemTransformer, runnable);
- result = tu;
- _createCache_transform.put(key, result);
+ tu = createTranslationUnit(runnable);
+ transformCache.put(key, tu);
}
- doTransform(result, runnable);
- return result;
+
+ // if translation unit is newly created and valid -> create files
+ if (tu.isValid()) {
+ doTransform(tu, runnable);
+ }
+
+ return tu;
}
- private final HashMap<ArrayList<?>, RunnableTranslationUnit> _createCache_transform = CollectionLiterals
- .newHashMap();
+ // ---------------------------------------------------
- private void doTransform(final CustomRunnableTranslationUnit tu, final Runnable runnable) {
+ @Override
+ public String getSrcFile(SLGTranslationUnit tu) { return tu.getModuleName() + LinuxBaseSettings.SRC_EXT; }
+
+ @Override
+ public String getIncFile(SLGTranslationUnit tu) { return tu.getModuleName() + LinuxBaseSettings.INC_EXT; }
+
+ // ---------------------------------------------------
+
+ @Override
+ public SLGTranslationUnit createTranslationUnit(final Runnable runnable) {
+ if ((runnable == null)) {
+ return new SLGTranslationUnit("UNSPECIFIED RUNNABLE");
+ } else {
+ String basePath = "synthetic_gen";
+ String moduleName = "runnables";
+ String call = "run_" + runnable.getName();
+ return new SLGTranslationUnit(basePath, moduleName, call);
+ }
}
+
+ private void doTransform(final SLGTranslationUnit tu, final Runnable runnable) {
+ genFiles(tu, runnable);
+ }
+
+ @Override
+ public void genFiles(final SLGTranslationUnit tu, final Runnable runnable) {
+ if (isSrcFileEmpty(tu)) {
+ srcAppend(tu, "#include \"" + getIncFile(tu) + "\"\n");
+ }
+
+ final HashSet<String> includes = new LinkedHashSet<>();
+ final List<String> calls = new ArrayList<>();
+ final List<Process> processedTasks = new ArrayList<>();
+
+ if (runnable != null && runnable.getActivityGraph() != null) {
+ for (final ActivityGraphItem item : runnable.getActivityGraph().getItems()) {
+ if (item instanceof Ticks) {
+ Ticks ticks = (Ticks) item;
+ final Map<String, SLGTranslationUnit> translationUnits = activityGraphItemTransformer.transformAllItems(ticks); // Mc: move method to TicksTransformer ?
+
+ SLGTranslationUnit defaultTicksTU = null;
+ boolean ticksAssociatedToPUs = false;
+
+ for (final Entry<String, SLGTranslationUnit> entry : translationUnits.entrySet()) {
+ String puName = entry.getKey();
+ SLGTranslationUnit tmpTU = entry.getValue();
+
+ if (puName.equals("default")) {
+ defaultTicksTU = tmpTU;
+ } else {
+ final String tmpIncFile = getIncFile(tmpTU);
+ if (tmpIncFile != null && !tmpIncFile.isEmpty() && !getIncFile(tu).equals(tmpIncFile)) {
+ includes.add(tmpIncFile);
+ }
+ final String call = tmpTU.getCall();
+ if (call != null && !call.isEmpty()) {
+ calls.add(ticksAssociatedToPUs ? "else" : " if(strcmp(coreName,\"" + puName + "\")==0){");
+ calls.add(call);
+ calls.add("}");
+ ticksAssociatedToPUs = true;
+ }
+ }
+ }
+
+ if ((defaultTicksTU != null)) {
+ if (ticksAssociatedToPUs) {
+ calls.add("else ");
+ }
+
+ if (defaultTicksTU.getCall() != null && !defaultTicksTU.getCall().isEmpty()) {
+ calls.add("{");
+ calls.add(defaultTicksTU.getCall());
+ calls.add("}");
+ }
+ }
+ } else {
+ if ((item instanceof InterProcessTrigger)) {
+ InterProcessTrigger trigger = (InterProcessTrigger) item;
+ final String value = CustomRunnableGenerator.handleInterProcessTrigger(trigger.getStimulus(), processedTasks);
+ if (value != null && !value.trim().isEmpty()) {
+ calls.add(value);
+ }
+ } else {
+ final SLGTranslationUnit tmpTU = activityGraphItemTransformer.transform(item);
+
+ final String tmpIncFile = getIncFile(tmpTU);
+ if (tmpIncFile != null && !tmpIncFile.isEmpty() && !getIncFile(tu).equals(tmpIncFile)) {
+ includes.add(tmpIncFile);
+ }
+ final String call = tmpTU.getCall();
+ if (call != null && !call.isEmpty()) {
+ calls.add(call);
+ }
+ }
+ }
+ }
+
+ }
+
+ String runnableName = runnable.getName();
+
+ // write header
+ this.toH(tu, runnableName, includes);
+
+ // write body
+ srcAppend(tu, "\n//Runnable " + runnableName + "----\n");
+ toCpp(tu, calls);
+ }
+
+ private void toH(final SLGTranslationUnit tu, final String runnableName, final HashSet<String> includes) {
+ if (isIncFileEmpty(tu)) {
+ incAppend(tu, "#include <string.h>\n");
+ }
+
+ for(String include : includes) {
+ incAppend(tu, "#include \"" + include + "\"\n");
+ }
+
+ incAppend(tu, "\n//Runnable " + runnableName + "----\n");
+
+ incAppend(tu, "void " + tu.getCall() + "(char* coreName);\n");
+ }
+
+ private void toCpp(final SLGTranslationUnit tu, final List<String> calls) {
+ srcAppend(tu, "void " + tu.getCall() + "(char* coreName){\n");
+
+ for (String call : calls) {
+ srcAppend(tu, "\t" + call + (call.endsWith(")") ? ";" : "") + "\n");
+ }
+
+ srcAppend(tu, "}\n\n");
+ }
+
}
diff --git a/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/customization/CustomRunnableTranslationUnit.java b/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/customization/CustomRunnableTranslationUnit.java
deleted file mode 100644
index 0227a1e..0000000
--- a/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/customization/CustomRunnableTranslationUnit.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/**
- * Copyright (c) 2020-2021 Robert Bosch GmbH.
- *
- * This program and the accompanying materials are made
- * available under the terms of the Eclipse Public License 2.0
- * which is available at https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *
- * Contributors:
- * Robert Bosch GmbH - initial API and implementation
- */
-package org.eclipse.app4mc.slg.customization;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.LinkedHashSet;
-import java.util.List;
-
-import org.eclipse.app4mc.amalthea.model.ActivityGraphItem;
-import org.eclipse.app4mc.amalthea.model.InterProcessTrigger;
-import org.eclipse.app4mc.amalthea.model.Process;
-import org.eclipse.app4mc.amalthea.model.Runnable;
-import org.eclipse.app4mc.amalthea.model.Ticks;
-import org.eclipse.app4mc.slg.commons.m2t.generators.RunnableTranslationUnit;
-import org.eclipse.app4mc.slg.commons.m2t.generators.TicksTranslationUnit;
-import org.eclipse.app4mc.slg.commons.m2t.generators.TranslationUnit;
-import org.eclipse.app4mc.slg.commons.m2t.transformers.sw.ActivityGraphItemTransformer;
-import org.eclipse.app4mc.transformation.util.OutputBuffer;
-
-public class CustomRunnableTranslationUnit extends RunnableTranslationUnit {
- private final List<Process> processedTasks = new ArrayList<>();
-
- public CustomRunnableTranslationUnit(final OutputBuffer outputBuffer,
- final ActivityGraphItemTransformer callGraphItemTransformer,
- final Runnable runnable) {
- super(outputBuffer, callGraphItemTransformer, runnable);
- }
-
- @Override
- public String getCall() {
- return "run_" + runnable.getName();
- }
-
- @Override
- public void genFiles() {
- if (isSrcFileEmpty()) {
- srcAppend("#include \"" + this.getIncFile() + "\"\n");
- }
- final HashSet<String> includes = new LinkedHashSet<>();
- final List<String> calls = new ArrayList<>();
-
- if (runnable != null && runnable.getActivityGraph() != null) {
- for (final ActivityGraphItem item : runnable.getActivityGraph().getItems()) {
- if ((item instanceof Ticks)) {
- Ticks ticks = (Ticks) item;
- final List<TicksTranslationUnit> translationUnits = callGraphItemTransformer.transformAllItems(ticks);
-
- TicksTranslationUnit defaultPUTicks = null;
- boolean ticksAssociatedToPUs = false;
-
- for (final TicksTranslationUnit tmp : translationUnits) {
- if (tmp.getPuName().equals("default")) {
- defaultPUTicks = tmp;
- } else {
- if (tmp.getIncFile() != null && !tmp.getIncFile().isEmpty() && !getIncFile().equals(tmp.getIncFile())) {
- includes.add(tmp.getIncFile());
- }
- final String call = tmp.getCall();
- if (call != null && !call.isEmpty()) {
- calls.add((ticksAssociatedToPUs ? "else" : "") + " if(strcmp(coreName,\"" + tmp.getPuName() + "\")==0){");
- calls.add(call);
- calls.add("}");
- ticksAssociatedToPUs = true;
- }
- }
- }
-
- if ((defaultPUTicks != null)) {
- if (ticksAssociatedToPUs) {
- calls.add("else ");
- }
-
- if (defaultPUTicks.getCall() != null && !defaultPUTicks.getCall().isEmpty()) {
- calls.add("{");
- calls.add(defaultPUTicks.getCall());
- calls.add("}");
- }
- }
- } else {
- if ((item instanceof InterProcessTrigger)) {
- InterProcessTrigger trigger = (InterProcessTrigger) item;
- final String value = CustomRunnableGenerator.handleInterProcessTrigger(trigger.getStimulus(), processedTasks);
- if (value != null && !value.trim().isEmpty()) {
- calls.add(value);
- }
- } else {
- final TranslationUnit tmp = callGraphItemTransformer.transform(item);
-
- if (tmp.getIncFile() != null && !tmp.getIncFile().isEmpty() && !getIncFile().equals(tmp.getIncFile())) {
- includes.add(tmp.getIncFile());
- }
- final String call = tmp.getCall();
- if (call != null && !call.isEmpty()) {
- calls.add(call);
- }
- }
- }
- }
-
- }
- // write header
- this.toH(includes);
-
- // write body
- this.srcAppend("\n//Runnable " + runnable.getName() + "----\n");
- this.toCpp(includes, calls);
- }
-
- @Override
- public void toH(final HashSet<String> includes) {
- if (isIncFileEmpty()) {
- incAppend("#include <string.h>\n");
- }
-
- for(String include : includes) {
- incAppend("#include \"" + include + "\"\n");
- }
-
- incAppend("\n//Runnable " + this.runnable.getName() + "----\n");
-
- incAppend("void " + getCall() + "(char* coreName);\n");
- }
-
- @Override
- public void toCpp(final HashSet<String> includes, final List<String> calls) {
- srcAppend((("void " + this.getCall()) + "(char* coreName){\n"));
-
- for (String call : calls) {
- srcAppend("\t" + call + (call.endsWith(")") ? ";" : "") + "\n");
- }
-
- srcAppend("}\n\n");
- }
-
-}
diff --git a/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/linux/generators/LinuxTicksGenerator.xtend b/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/linux/generators/LinuxTicksGenerator.xtend
index e7d223b..d7b55b0 100644
--- a/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/linux/generators/LinuxTicksGenerator.xtend
+++ b/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/linux/generators/LinuxTicksGenerator.xtend
@@ -32,6 +32,15 @@
throw new IllegalStateException("Utility class");
}
+ static def dispatch String getParameters(DiscreteValueConstant value)
+ '''«value.value»'''
+
+ static def dispatch String getParameters(DiscreteValueStatistics value)
+ '''«value.average», «value.lowerBound», «value.upperBound»'''
+
+ static def dispatch String getParameters(DiscreteValueWeibullEstimatorsDistribution value)
+ '''«value.average»'''
+
static def dispatch String getParameters(IDiscreteValueDeviation value) '''
WARNING:VALUE_FORMAT_NOT_SUPPORTED
'''
@@ -44,8 +53,6 @@
WARNING:VALUE_FORMAT_NOT_SUPPORTED
'''
- static def dispatch String getParameters(DiscreteValueConstant value) '''«value.value»'''
-
static def dispatch String getParameters(DiscreteValueGaussDistribution value) '''
WARNING:VALUE_FORMAT_NOT_SUPPORTED
'''
@@ -54,14 +61,8 @@
WARNING:VALUE_FORMAT_NOT_SUPPORTED
'''
- static def dispatch String getParameters(
- DiscreteValueStatistics value) '''«value.average», «value.lowerBound», «value.upperBound»'''
-
static def dispatch String getParameters(DiscreteValueUniformDistribution value) '''
WARNING:VALUE_FORMAT_NOT_SUPPORTED
'''
- static def dispatch String getParameters(DiscreteValueWeibullEstimatorsDistribution value) '''
- «value.average»'''
-
}
diff --git a/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/linux/generators/LinuxTicksUtilsGenerator.xtend b/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/linux/generators/LinuxTicksUtilsGenerator.xtend
index 978246f..cc6846a 100644
--- a/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/linux/generators/LinuxTicksUtilsGenerator.xtend
+++ b/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/linux/generators/LinuxTicksUtilsGenerator.xtend
@@ -10,7 +10,7 @@
*
* Contributors:
* Robert Bosch GmbH - initial API and implementation
- ********************************************************************************
+ * *******************************************************************************
*/
package org.eclipse.app4mc.slg.linux.generators
@@ -28,96 +28,49 @@
}
// ---------- names of generated 'C' functions ----------
-
static def String getExecCall(String params) '''burnTicks(«params»)'''
-
- /*'''executeTicks_«valueClass.toString.split("\\.").last»(«params»)'''*/
-
- //--------------------------------------------------------------------
+ /*'''executeTicks_«valueClass.toString.split("\\.").last»(«params»)'''*/
+ // --------------------------------------------------------------------
static def String generateTicks(Object valueClass) {
switch valueClass {
case DiscreteValueConstantImpl: '''
- void «getExecCall("int ticks")» {
- burnTicks(ticks);
- }
-
+ void «getExecCall("int ticks")» {
+ burnTicks(ticks);
+ }
+
'''
-
case DiscreteValueStatisticsImpl: '''
- void «getExecCall("double average, int lowerBound, int upperBound")» {
- burnTicksStatistics(average, lowerBound, upperBound);
- }
-
+ void «getExecCall("double average, int lowerBound, int upperBound")» {
+ burnTicksStatistics(average, lowerBound, upperBound);
+ }
+
'''
-
default: ''''''
- /*
- '''
- WARNING:VALUE_FORMAT_NOT_SUPPORTED: «valueClass»
-
- ''' */
+ /*
+ * '''
+ * WARNING:VALUE_FORMAT_NOT_SUPPORTED: «valueClass»
+ *
+ ''' */
}
}
-// static def dispatch String generateTicks(IDiscreteValueDeviation value) '''
-// WARNING:VALUE_FORMAT_NOT_SUPPORTED: IDiscreteValueDeviation
-// '''
-//
-// static def dispatch String generateTicks(DiscreteValueBetaDistribution value) '''
-// WARNING:VALUE_FORMAT_NOT_SUPPORTED: DiscreteValueBetaDistribution
-// '''
-//
-// static def dispatch String generateTicks(DiscreteValueBoundaries value) '''
-// WARNING:VALUE_FORMAT_NOT_SUPPORTED: DiscreteValueBoundaries
-// '''
-//
-// static def dispatch String generateTicks(DiscreteValueConstant value) '''
-// void «call»(int ticks) {
-// burnTicks(ticks);
-// }
-//
-// '''
-//
-// static def dispatch String generateTicks(DiscreteValueGaussDistribution value) '''
-// WARNING:VALUE_FORMAT_NOT_SUPPORTED:DiscreteValueGaussDistribution
-// '''
-//
-// static def dispatch String generateTicks(DiscreteValueHistogram value) '''
-// WARNING:VALUE_FORMAT_NOT_SUPPORTED:DiscreteValueHistogram
-// '''
-//
-//// TODO:what to do with boundaries, maybe better toggle between upper/lower or random selection from range
-// static def dispatch String generateTicks(DiscreteValueStatistics value) '''
-// void «call»(double average, int lowerBound, int upperBound) {
-// burnTicksStatistics(average, lowerBound, upperBound);
-// }
-// '''
-//
-// static def dispatch String generateTicks(DiscreteValueUniformDistribution value) '''
-// WARNING:VALUE_FORMAT_NOT_SUPPORTED:DiscreteValueUniformDistribution
-// '''
-//
-// static def dispatch String generateTicks(DiscreteValueWeibullEstimatorsDistribution value) '''
-// WARNING:VALUE_FORMAT_NOT_SUPPORTED:DiscreteValueWeibullEstimatorsDistribution
-// '''
-
- // ----- public interfaces -----
- static def String burnTicks(String burnTicksBody) '''
- void burnTicks(int ticks) {
- «burnTicksBody»
- }
-
+ // ----- public interfaces -----
+ static def String burnTicks(String burnTicksBody) '''
+ void burnTicks(int ticks) {
+ «burnTicksBody»
+ }
+
'''
-
+
// select statistics parameter according to configuration model
// TODO: choose final names of configuration parameters
static def String chooseTicks(ConfigModel configModel) {
switch configModel.defaultTickType {
- case TickType.MINIMUM: "lowerBound"
- case TickType.MAXIMUM: "upperBound"
- case TickType.AVERAGE : "(int)average"
- default: "(int)average"
+ case TickType.MINIMUM: "lowerBound"
+ case TickType.MAXIMUM: "upperBound"
+ case TickType.AVERAGE: "(int)average"
+ default: "(int)average"
}
}
@@ -126,20 +79,19 @@
burnTicks(«chooseTicks(configModel)»);
}
- '''
-
- // ----- default implementations -----
+ '''
+ // ----- default implementations -----
static def String burnTicksDefault() '''
// default implementation of tick burning
int numLoops = ticks / 400;
# if defined (__x86_64__)
int i;
- for (i = 0; i < numLoops; i++) {
- «FOR i : 1..400»
- __asm volatile("nop");
- «ENDFOR»
- }
+ for (i = 0; i < numLoops; i++) {
+ «FOR i : 1..400»
+ __asm volatile("nop");
+ «ENDFOR»
+ }
# elif defined (__x86_32__)
for (i = 0; i < numLoops; i++) {
«FOR i : 1..400»
@@ -154,80 +106,35 @@
}
# endif
'''
-
-
- //********************** API's to generate decleration **************************
-
- static def String burnTicksDecleration() '''
- void burnTicks(int ticks);
+ // ********************** API's to generate decleration **************************
+ static def String burnTicksDeclaration() '''
+ void burnTicks(int ticks);
+
'''
+
static def String burnTicksStatisticsDecleration() '''
void burnTicksStatistics(double average, int lowerBound, int upperBound);
- '''
-
-
-
- static def String generateTicksDecleration(Object valueClass) {
+ '''
+
+ static def String generateTicksDeclaration(Object valueClass) {
switch valueClass {
case DiscreteValueConstantImpl: '''
- void «getExecCall("int ticks")»;
-
+ void «getExecCall("int ticks")»;
+
'''
-
case DiscreteValueStatisticsImpl: '''
- void «getExecCall("double average, int lowerBound, int upperBound")»;
-
+ void «getExecCall("double average, int lowerBound, int upperBound")»;
+
'''
-
default: ''''''
-
- /*
- '''
- WARNING:VALUE_FORMAT_NOT_SUPPORTED: «valueClass»
-
- ''' */
+ /*
+ * '''
+ * WARNING:VALUE_FORMAT_NOT_SUPPORTED: «valueClass»
+ *
+ ''' */
}
}
-
-// static def dispatch String generateTicksDecleration(IDiscreteValueDeviation value) '''
-// WARNING:VALUE_FORMAT_NOT_SUPPORTED: IDiscreteValueDeviation
-// '''
-//
-// static def dispatch String generateTicksDecleration(DiscreteValueBetaDistribution value) '''
-// WARNING:VALUE_FORMAT_NOT_SUPPORTED: DiscreteValueBetaDistribution
-// '''
-//
-// static def dispatch String generateTicksDecleration(DiscreteValueBoundaries value) '''
-// WARNING:VALUE_FORMAT_NOT_SUPPORTED: DiscreteValueBoundaries
-// '''
-//
-// static def dispatch String generateTicksDecleration(DiscreteValueConstant value) '''
-// void «call»(int ticks);
-//
-// '''
-//
-// static def dispatch String generateTicksDecleration(DiscreteValueGaussDistribution value) '''
-// WARNING:VALUE_FORMAT_NOT_SUPPORTED:DiscreteValueGaussDistribution
-// '''
-//
-// static def dispatch String generateTicksDecleration(DiscreteValueHistogram value) '''
-// WARNING:VALUE_FORMAT_NOT_SUPPORTED:DiscreteValueHistogram
-// '''
-//
-//// TODO:what to do with boundaries, maybe better toggle between upper/lower or random selection from range
-// static def dispatch String generateTicksDecleration(DiscreteValueStatistics value) '''
-// void «call»(double average, int lowerBound, int upperBound) ;
-// '''
-//
-// static def dispatch String generateTicksDecleration(DiscreteValueUniformDistribution value) '''
-// WARNING:VALUE_FORMAT_NOT_SUPPORTED:DiscreteValueUniformDistribution
-// '''
-//
-// static def dispatch String generateTicksDecleration(DiscreteValueWeibullEstimatorsDistribution value) '''
-// WARNING:VALUE_FORMAT_NOT_SUPPORTED:DiscreteValueWeibullEstimatorsDistribution
-// '''
-
}
diff --git a/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/linux/transformers/LinuxBaseTransformer.java b/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/linux/transformers/LinuxBaseTransformer.java
index 899d6d5..7e689b6 100644
--- a/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/linux/transformers/LinuxBaseTransformer.java
+++ b/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/linux/transformers/LinuxBaseTransformer.java
@@ -22,6 +22,11 @@
import static org.eclipse.app4mc.slg.linux.transformers.LinuxBaseSettings.SRC_FOLDER;
import static org.eclipse.app4mc.slg.linux.transformers.LinuxBaseSettings.SRC_TYPE;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGTranslationUnit;
import org.eclipse.app4mc.transformation.util.OutputBuffer;
@@ -60,4 +65,19 @@
public String getSrcPath(SLGTranslationUnit tu) { return tu.getModulePath() + SRC_FOLDER + getSrcFile(tu); }
public String getIncPath(SLGTranslationUnit tu) { return tu.getModulePath() + INC_FOLDER + getIncFile(tu); }
+ // Generic cache handling
+
+ public List<String> getSrcFiles() {
+
+ return getCache().values().stream()
+ .map(this::getSrcFile)
+ .sorted()
+ .distinct()
+ .collect(Collectors.toList());
+ }
+
+ public Map<List<Object>, SLGTranslationUnit> getCache() {
+ return Collections.emptyMap();
+ }
+
}
diff --git a/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/linux/transformers/sw/LinuxLabelTransformer.java b/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/linux/transformers/sw/LinuxLabelTransformer.java
index 294eca4..3a7507b 100644
--- a/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/linux/transformers/sw/LinuxLabelTransformer.java
+++ b/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/linux/transformers/sw/LinuxLabelTransformer.java
@@ -74,7 +74,7 @@
genFiles(tu, label);
}
- private void genFiles(SLGTranslationUnit tu, Label label) {
+ private void genFiles(final SLGTranslationUnit tu, final Label label) {
if (isSrcFileEmpty(tu)) {
srcAppend(tu, "#include \"" + getIncFile(tu) + "\"\n");
srcAppend(tu, "#include <stdbool.h>\n\n");
diff --git a/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/linux/transformers/sw/LinuxTicksTransformer.java b/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/linux/transformers/sw/LinuxTicksTransformer.java
index e92eff9..ac5a12c 100644
--- a/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/linux/transformers/sw/LinuxTicksTransformer.java
+++ b/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/linux/transformers/sw/LinuxTicksTransformer.java
@@ -49,7 +49,8 @@
private String computeCall(Ticks ticks) {
String parameters = LinuxTicksGenerator.getParameters(ticks.getDefault());
- return "burnTicks(" + parameters + ")";
+ String className = ticks.getDefault().eClass().getName();
+ return "executeTicks_" + className +"(" + parameters + ")";
}
}
diff --git a/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/linux/transformers/sw/LinuxTicksUtilsTransformer.java b/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/linux/transformers/sw/LinuxTicksUtilsTransformer.java
index 1a03dd1..d904134 100644
--- a/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/linux/transformers/sw/LinuxTicksUtilsTransformer.java
+++ b/load_generator/linux/plugins/org.eclipse.app4mc.slg.linux/src/org/eclipse/app4mc/slg/linux/transformers/sw/LinuxTicksUtilsTransformer.java
@@ -91,16 +91,18 @@
toCPP(tu);
}
srcAppend(tu, LinuxTicksUtilsGenerator.generateTicks(devClass));
- incAppend(tu, LinuxTicksUtilsGenerator.generateTicksDecleration(devClass));
+ incAppend(tu, LinuxTicksUtilsGenerator.generateTicksDeclaration(devClass));
}
private void toCPP(SLGTranslationUnit tu) {
srcAppend(tu, "#include \"" + getIncFile(tu) + "\"\n");
- ConfigModel configModel = customObjsStore.<ConfigModel>getInstance(ConfigModel.class);
+ final ConfigModel configModel = customObjsStore.<ConfigModel>getInstance(ConfigModel.class);
final String ticksCodeSnippet = configModel.getCustomTickImpl().getValue();
- final String burnTicksBody = configModel.getCustomTickImpl().isEnable() ? ticksCodeSnippet : LinuxTicksUtilsGenerator.burnTicksDefault();
+ final boolean ticksCodeEnabled = configModel.getCustomTickImpl().isEnable();
+
+ final String burnTicksBody = ticksCodeEnabled ? ticksCodeSnippet : LinuxTicksUtilsGenerator.burnTicksDefault();
srcAppend(tu, LinuxTicksUtilsGenerator.burnTicks(burnTicksBody));
srcAppend(tu, LinuxTicksUtilsGenerator.burnTicksStatistics(configModel));
@@ -108,7 +110,7 @@
}
private void toH(SLGTranslationUnit tu) {
- incAppend(tu, LinuxTicksUtilsGenerator.burnTicksDecleration());
+ incAppend(tu, LinuxTicksUtilsGenerator.burnTicksDeclaration());
incAppend(tu, LinuxTicksUtilsGenerator.burnTicksStatisticsDecleration());
}
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosAmlTranslationUnit.java b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosAmlTranslationUnit.java
deleted file mode 100644
index 395f2ee..0000000
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosAmlTranslationUnit.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/**
- * Copyright (c) 2020-2021 Robert Bosch GmbH.
- *
- * This program and the accompanying materials are made
- * available under the terms of the Eclipse Public License 2.0
- * which is available at https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *
- * Contributors:
- * Robert Bosch GmbH - initial API and implementation
- */
-
-package org.eclipse.app4mc.slg.ros2.generators;
-
-import org.eclipse.app4mc.slg.commons.m2t.generators.TranslationUnit;
-import org.eclipse.app4mc.transformation.util.OutputBuffer;
-
-public class RosAmlTranslationUnit extends TranslationUnit {
-
- private OutputBuffer outputBuffer;
-
- public RosAmlTranslationUnit(final OutputBuffer outputBuffer) {
- super();
- this.outputBuffer = outputBuffer;
-
- genFiles();
- }
-
- public String getBasePath() {
- return "utils";
- }
-
- public String getModuleName() {
- return "aml";
- }
-
- public String getModulePath() {
- return getBasePath() + "/" + getModuleName();
- }
-
- @Override
- public String getIncFile() {
- return getModuleName() + ".h";
- }
-
- @Override
- public String getSrcFile() {
- return getModuleName() + ".cpp";
- }
-
- public String getIncPath() {
- return getModulePath() + "/inc/" + getIncFile();
- }
-
- public String getSrcPath() {
- return getModulePath() + "/src/" + getSrcFile();
- }
-
- public void genFiles() {
- incAppend(RosAmlGenerator.toH());
- srcAppend(RosAmlGenerator.toCpp());
- }
-
- public void incAppend(final String str) {
- outputBuffer.appendTo("INC", getModulePath() + "/_inc/" + getModuleName(), str);
- }
-
- public void srcAppend(final String str) {
- outputBuffer.appendTo("SRC", getModulePath() + "/_src/" + getModuleName(), str);
- }
-
-}
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosChannelSendTranslationUnit.java b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosChannelSendTranslationUnit.java
deleted file mode 100644
index 2c9443a..0000000
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosChannelSendTranslationUnit.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/**
- * Copyright (c) 2020-2021 Robert Bosch GmbH.
- *
- * This program and the accompanying materials are made
- * available under the terms of the Eclipse Public License 2.0
- * which is available at https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *
- * Contributors:
- * Robert Bosch GmbH - initial API and implementation
- */
-
-package org.eclipse.app4mc.slg.ros2.generators;
-
-import org.eclipse.app4mc.amalthea.model.ChannelSend;
-import org.eclipse.app4mc.slg.commons.m2t.generators.TranslationUnit;
-import org.eclipse.app4mc.transformation.util.OutputBuffer;
-
-public class RosChannelSendTranslationUnit extends TranslationUnit {
- private RosChannelSendUtilsTranslationUnit tuIpUtils;
-
- private ChannelSend cs;
- private OutputBuffer outputBuffer;
-
- public RosChannelSendTranslationUnit(final OutputBuffer outputBuffer,
- final RosChannelSendUtilsTranslationUnit tuIpUtils, final ChannelSend cs) {
- super();
- this.cs = cs;
- this.tuIpUtils = tuIpUtils;
- this.outputBuffer = outputBuffer;
- }
-
- public String getBasePath() {
- return tuIpUtils.getBasePath();
- }
-
- public String getModuleName() {
- return tuIpUtils.getModuleName();
- }
-
- public String getIncFile() {
- return getModuleName() + ".h";
- }
-
- @Override
- public String getCall() {
- return tuIpUtils.getExecCall(cs.getData().getName());
- }
-
- public String getModulePath() {
- return getBasePath() + "/" + getModuleName();
- }
-
- @Override
- public String getSrcFile() {
- return getModuleName() + ".cpp";
- }
-
- public String getIncPath() {
- return getModulePath() + "/_inc/" + this.getIncFile();
- }
-
- public String getSrcPath() {
- return getModulePath() + "/_src/" + this.getSrcFile();
- }
-
- public boolean isIncFileEmpty() {
- return !outputBuffer.bufferExists("INC", getModulePath() + "/_inc/" + getModuleName());
- }
-
- public boolean isSrcFileEmpty() {
- return !outputBuffer.bufferExists("SRC", getModulePath() + "/_src/" + getModuleName());
- }
-
- public boolean incAppend(final String str) {
- return outputBuffer.appendTo("INC", this.getModulePath() + "/_inc/" + getModuleName(), str);
- }
-
- public boolean srcAppend(final String str) {
- return outputBuffer.appendTo("SRC", getModulePath() + "/_src/" + getModuleName(), str);
- }
-
-}
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosChannelSendUtilsTranslationUnit.java b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosChannelSendUtilsTranslationUnit.java
deleted file mode 100644
index 8fc76ac..0000000
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosChannelSendUtilsTranslationUnit.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/**
- * Copyright (c) 2020-2021 Robert Bosch GmbH.
- *
- * This program and the accompanying materials are made
- * available under the terms of the Eclipse Public License 2.0
- * which is available at https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *
- * Contributors:
- * Robert Bosch GmbH - initial API and implementation
- */
-
-package org.eclipse.app4mc.slg.ros2.generators;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.app4mc.amalthea.model.ChannelSend;
-import org.eclipse.app4mc.slg.commons.m2t.generators.TranslationUnit;
-import org.eclipse.app4mc.transformation.util.OutputBuffer;
-
-public class RosChannelSendUtilsTranslationUnit extends TranslationUnit {
- public static final String LIB_NAME = "CHANNELSEND_UTIL";
- public static final String MODULE_NAME = "channelSendUtils";
- public static final String MODULE_PATH = "synthetic_gen/" + MODULE_NAME;
- public static final String MAKEFILE_PATH = MODULE_PATH + "/CMakeLists.txt";
-
- private ChannelSend cs;
- private OutputBuffer outputBuffer;
-
- public RosChannelSendUtilsTranslationUnit(final OutputBuffer outputBuffer, final ChannelSend cs) {
- super();
- this.cs = cs;
- this.outputBuffer = outputBuffer;
-
- this.genFiles();
- }
-
- private static List<String> topic_list = new ArrayList<>();
-
- public String getModuleName() {
- return MODULE_NAME;
- }
-
- @Override
- public String getIncFile() {
- return (MODULE_NAME + ".h");
- }
-
- public String getExecCall(final String param) {
- return "publish_to_" + param + "(" + param + "_publisher)";
- }
-
- public void genFiles() {
-
- if (this.isSrcFileEmpty()) {
- this.incAppend(RosChannelSendUtilsGenerator.toHeader());
- }
- if (this.isSrcFileEmpty()) {
- this.srcAppend(RosChannelSendUtilsGenerator.toCPPHead());
- }
- boolean already_defined = false;
- for (final String topic_name : RosChannelSendUtilsTranslationUnit.topic_list) {
- if (topic_name.equals(this.cs.getData().getName())) {
- already_defined = true;
- }
- }
-
- if ((!already_defined)) {
-
- this.incAppend(RosChannelSendUtilsGenerator.toH(cs));
- this.srcAppend(RosChannelSendUtilsGenerator.toCPP(cs));
-
- RosChannelSendUtilsTranslationUnit.topic_list.add(this.cs.getData().getName());
- }
- }
-
- public String getBasePath() {
- return "synthetic_gen";
- }
-
- public String getModulePath() {
- return getBasePath() + "/" + getModuleName();
- }
-
- @Override
- public String getSrcFile() {
- return getModuleName() + ".cpp";
- }
-
- public String getIncPath() {
- return getModulePath() + "/_inc/" + getIncFile();
- }
-
- public String getSrcPath() {
- return getModulePath() + "/_src/" + getSrcFile();
- }
-
- public boolean isIncFileEmpty() {
- return !outputBuffer.bufferExists("INC", getModulePath() + "/_inc/" + getModuleName());
- }
-
- public boolean isSrcFileEmpty() {
- return !outputBuffer.bufferExists("SRC", getModulePath() + "/_src/" + getModuleName());
- }
-
- public boolean incAppend(final String str) {
- return outputBuffer.appendTo("INC", getModulePath() + "/_inc/" + getModuleName(), str);
- }
-
- public boolean srcAppend(final String str) {
- return outputBuffer.appendTo("SRC", getModulePath() + "/_src/" + getModuleName(), str);
- }
-
-}
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosInterProcessTriggerTranslationUnit.java b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosInterProcessTriggerTranslationUnit.java
deleted file mode 100644
index b63758a..0000000
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosInterProcessTriggerTranslationUnit.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/**
- * Copyright (c) 2020-2021 Robert Bosch GmbH.
- *
- * This program and the accompanying materials are made
- * available under the terms of the Eclipse Public License 2.0
- * which is available at https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *
- * Contributors:
- * Robert Bosch GmbH - initial API and implementation
- */
-
-package org.eclipse.app4mc.slg.ros2.generators;
-
-import org.eclipse.app4mc.amalthea.model.InterProcessTrigger;
-import org.eclipse.app4mc.slg.commons.m2t.generators.TranslationUnit;
-import org.eclipse.app4mc.transformation.util.OutputBuffer;
-
-public class RosInterProcessTriggerTranslationUnit extends TranslationUnit {
- private RosInterProcessTriggerUtilsTranslationUnit tuIpUtils;
-
- private InterProcessTrigger ip;
-
- private OutputBuffer outputBuffer;
-
- public RosInterProcessTriggerTranslationUnit(final OutputBuffer outputBuffer,
- final RosInterProcessTriggerUtilsTranslationUnit tuIpUtils, final InterProcessTrigger ip) {
- super();
- this.tuIpUtils = tuIpUtils;
- this.ip = ip;
- this.outputBuffer = outputBuffer;
- }
-
- public String getBasePath() {
- return this.tuIpUtils.getBasePath();
- }
-
- public String getModuleName() {
- return this.tuIpUtils.getModuleName();
- }
-
- @Override
- public String getIncFile() {
- return getModuleName() + ".h";
- }
-
- @Override
- public String getCall() {
- return tuIpUtils.getExecCall(ip.getStimulus().getName());
- }
-
- public String getModulePath() {
- return getBasePath() + "/" + getModuleName();
- }
-
- @Override
- public String getSrcFile() {
- return getModuleName() + ".cpp";
- }
-
- public String getIncPath() {
- return getModulePath() + "/_inc/" + getIncFile();
- }
-
- public String getSrcPath() {
- return getModulePath() + "/_src/" + getSrcFile();
- }
-
- public boolean isIncFileEmpty() {
- return !outputBuffer.bufferExists("INC", getModulePath() + "/_inc/" + getModuleName());
- }
-
- public boolean isSrcFileEmpty() {
- return !this.outputBuffer.bufferExists("SRC", getModulePath() + "/_src/" + getModuleName());
- }
-
- public boolean incAppend(final String str) {
- return outputBuffer.appendTo("INC", getModulePath() + "/_inc/" + getModuleName(), str);
- }
-
- public boolean srcAppend(final String str) {
- return outputBuffer.appendTo("SRC", getModulePath() + "/_src/" + getModuleName(), str);
- }
-
-}
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosInterProcessTriggerUtilsGenerator.xtend b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosInterProcessTriggerUtilsGenerator.xtend
index 8b2d0ed..92d0cad 100644
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosInterProcessTriggerUtilsGenerator.xtend
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosInterProcessTriggerUtilsGenerator.xtend
@@ -37,11 +37,11 @@
'''
- static def String toCPP(InterProcessTrigger ip) '''
+ static def String toCPP(InterProcessTrigger ipt) '''
- void call_service_«ip.stimulus.name»(rclcpp::Client<«ip.stimulus.name»_service::srv::«Utils.toIdlCompliantName(ip.stimulus.name + '_service')»>::SharedPtr& client) {
+ void call_service_«ipt.stimulus.name»(rclcpp::Client<«ipt.stimulus.name»_service::srv::«Utils.toIdlCompliantName(ipt.stimulus.name + '_service')»>::SharedPtr& client) {
- auto request = std::make_shared<«ip.stimulus.name»_service::srv::«Utils.toIdlCompliantName(ip.stimulus.name + '_service')»::Request>();
+ auto request = std::make_shared<«ipt.stimulus.name»_service::srv::«Utils.toIdlCompliantName(ipt.stimulus.name + '_service')»::Request>();
while (!client->wait_for_service(50ms)) {
if (!rclcpp::ok()) {
@@ -54,9 +54,9 @@
}
'''
- static def String toH(InterProcessTrigger ip) '''
- #include "«ip.stimulus.name»_service/srv/«ip.stimulus.name»_service.hpp"
- void call_service_«ip.stimulus.name»(rclcpp::Client<«ip.stimulus.name»_service::srv::«Utils.toIdlCompliantName(ip.stimulus.name + '_service')»>::SharedPtr& client);
+ static def String toH(InterProcessTrigger ipt) '''
+ #include "«ipt.stimulus.name»_service/srv/«ipt.stimulus.name»_service.hpp"
+ void call_service_«ipt.stimulus.name»(rclcpp::Client<«ipt.stimulus.name»_service::srv::«Utils.toIdlCompliantName(ipt.stimulus.name + '_service')»>::SharedPtr& client);
'''
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosInterProcessTriggerUtilsTranslationUnit.java b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosInterProcessTriggerUtilsTranslationUnit.java
deleted file mode 100644
index ad09865..0000000
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosInterProcessTriggerUtilsTranslationUnit.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/**
- * Copyright (c) 2020-2021 Robert Bosch GmbH.
- *
- * This program and the accompanying materials are made
- * available under the terms of the Eclipse Public License 2.0
- * which is available at https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *
- * Contributors:
- * Robert Bosch GmbH - initial API and implementation
- */
-
-package org.eclipse.app4mc.slg.ros2.generators;
-
-import org.eclipse.app4mc.amalthea.model.InterProcessTrigger;
-import org.eclipse.app4mc.slg.commons.m2t.generators.TranslationUnit;
-import org.eclipse.app4mc.transformation.util.OutputBuffer;
-
-public class RosInterProcessTriggerUtilsTranslationUnit extends TranslationUnit {
- public static final String LIB_NAME = "INTERPROCESSTRIGGER_UTIL";
- public static final String MODULE_NAME = "interProcessTriggerUtils";
- public static final String MODULE_PATH = "synthetic_gen/" + MODULE_NAME;
- public static final String MAKEFILE_PATH = MODULE_PATH + "/CMakeLists.txt";
-
- private InterProcessTrigger ip;
- private OutputBuffer outputBuffer;
-
- public RosInterProcessTriggerUtilsTranslationUnit(final OutputBuffer outputBuffer, final InterProcessTrigger ip) {
- super();
- this.ip = ip;
- this.outputBuffer = outputBuffer;
- this.genFiles();
- }
-
- public String getModuleName() {
- return MODULE_NAME;
- }
-
- @Override
- public String getIncFile() {
- return MODULE_NAME + ".h";
- }
-
- public String getExecCall(final String param) {
- return "call_service_" + param + "(" + param + "_client)";
- }
-
- public void genFiles() {
- if (isSrcFileEmpty()) {
- incAppend(RosInterProcessTriggerUtilsGenerator.toHeader());
- }
- if (isSrcFileEmpty()) {
- srcAppend(RosInterProcessTriggerUtilsGenerator.toCPPHead());
- }
-
- incAppend(RosInterProcessTriggerUtilsGenerator.toH(ip));
- srcAppend(RosInterProcessTriggerUtilsGenerator.toCPP(ip));
- }
-
- public String getBasePath() {
- return "synthetic_gen";
- }
-
- public String getModulePath() {
- return getBasePath() + "/" + getModuleName();
- }
-
- @Override
- public String getSrcFile() {
- return getModuleName() + ".cpp";
- }
-
- public String getIncPath() {
- return getModulePath() + "/_inc/" + getIncFile();
- }
-
- public String getSrcPath() {
- return getModulePath() + "/_src/" + getSrcFile();
- }
-
- public boolean isIncFileEmpty() {
- return !outputBuffer.bufferExists("INC", getModulePath() + "/_inc/" + getModuleName());
- }
-
- public boolean isSrcFileEmpty() {
- return !outputBuffer.bufferExists("SRC", getModulePath() + "/_src/" + getModuleName());
- }
-
- public boolean incAppend(final String str) {
- return outputBuffer.appendTo("INC", getModulePath() + "/_inc/" + getModuleName(), str);
- }
-
- public boolean srcAppend(final String str) {
- return outputBuffer.appendTo("SRC", getModulePath() + "/_src/" + getModuleName(), str);
- }
-}
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosLabelAccessTranslationUnit.java b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosLabelAccessTranslationUnit.java
deleted file mode 100644
index b476be1..0000000
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosLabelAccessTranslationUnit.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/**
- * Copyright (c) 2020-2021 Robert Bosch GmbH.
- *
- * This program and the accompanying materials are made
- * available under the terms of the Eclipse Public License 2.0
- * which is available at https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *
- * Contributors:
- * Robert Bosch GmbH - initial API and implementation
- */
-
-package org.eclipse.app4mc.slg.ros2.generators;
-
-import java.util.Arrays;
-
-import org.eclipse.app4mc.amalthea.model.LabelAccess;
-import org.eclipse.app4mc.amalthea.model.MinAvgMaxStatistic;
-import org.eclipse.app4mc.amalthea.model.NumericStatistic;
-import org.eclipse.app4mc.amalthea.model.SingleValueStatistic;
-import org.eclipse.app4mc.slg.commons.m2t.generators.TranslationUnit;
-import org.eclipse.app4mc.transformation.util.OutputBuffer;
-
-public class RosLabelAccessTranslationUnit extends TranslationUnit {
- private RosLabelTranslationUnit tuLabel;
-
- private LabelAccess labelAccess;
-
- private OutputBuffer outputBuffer;
-
- public RosLabelAccessTranslationUnit(final OutputBuffer outputBuffer, final RosLabelTranslationUnit tuLabel,
- final LabelAccess labelAccess) {
- super();
- this.tuLabel = tuLabel;
- this.labelAccess = labelAccess;
- this.outputBuffer = outputBuffer;
- }
-
- public String getBasePath() {
- return this.tuLabel.getBasePath();
- }
-
- public String getModuleName() {
- return this.tuLabel.getModuleName();
- }
-
- @Override
- public String getIncFile() {
- return this.tuLabel.getIncFile();
- }
-
- // ---------- names of generated 'C' functions ----------
-
- @Override
- public String getCall() {
- NumericStatistic stat = null;
- if (labelAccess != null && labelAccess.getStatistic() != null) {
- stat = labelAccess.getStatistic().getValue();
- }
-
- String statString = (stat == null) ? "1" : getNumericStatistic(stat);
-
- if (labelAccess.getAccess() != null) {
- switch (labelAccess.getAccess()) {
- case READ:
- return tuLabel.readCall(statString);
- case WRITE:
- return tuLabel.writeCall(statString);
- default:
- // underspecified
- }
- }
-
- return "/*underspecified access to label" + labelAccess.getData().getName() + "*/";
-
- }
-
- public String getModulePath() {
- return getBasePath() + "/" + getModuleName();
- }
-
- @Override
- public String getSrcFile() {
- return getModuleName() + ".cpp";
- }
-
- public String getIncPath() {
- return getModulePath() + "/_inc/" + getIncFile();
- }
-
- public String getSrcPath() {
- return getModulePath() + "/_src/" + getSrcFile();
- }
-
- public boolean isIncFileEmpty() {
- return !outputBuffer.bufferExists("INC", getModulePath() + "/_inc/" + getModuleName());
- }
-
- public boolean isSrcFileEmpty() {
- return !outputBuffer.bufferExists("SRC", getModulePath() + "/_src/" + getModuleName());
- }
-
- public boolean incAppend(final String str) {
- return outputBuffer.appendTo("INC", getModulePath() + "/_inc/" + getModuleName(), str);
- }
-
- public boolean srcAppend(final String str) {
- return outputBuffer.appendTo("SRC", getModulePath() + "/_src/" + getModuleName(), str);
- }
-
- protected static String _getNumericStatistic(final MinAvgMaxStatistic stat) {
- String _string = Integer.valueOf(Double.valueOf(Math.ceil(stat.getAvg())).intValue()).toString();
- return (_string + "/*MinAvgMaxStatistic not supported yet*/");
- }
-
- protected static String _getNumericStatistic(final SingleValueStatistic stat) {
- return Integer.valueOf(Double.valueOf(Math.ceil(stat.getValue())).intValue()).toString();
- }
-
- public static String getNumericStatistic(final NumericStatistic stat) {
- if (stat instanceof MinAvgMaxStatistic) {
- return _getNumericStatistic((MinAvgMaxStatistic) stat);
- } else if (stat instanceof SingleValueStatistic) {
- return _getNumericStatistic((SingleValueStatistic) stat);
- } else {
- throw new IllegalArgumentException("Unhandled parameter types: " + Arrays.<Object>asList(stat).toString());
- }
- }
-}
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosLabelGenerator.xtend b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosLabelGenerator.xtend
index 453631c..ac3d394 100644
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosLabelGenerator.xtend
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosLabelGenerator.xtend
@@ -14,6 +14,7 @@
package org.eclipse.app4mc.slg.ros2.generators
import java.util.List
+import org.eclipse.app4mc.amalthea.model.Label
class RosLabelGenerator {
@@ -22,6 +23,16 @@
throw new IllegalStateException("Utility class");
}
+ // ---------- names of generated 'C' functions ----------
+
+ static def String initCall(String labelName) { initCall(labelName, "_CacheLine* array,int array_elements") }
+
+ static def String initCall(String labelName, String param) '''initialize_«labelName»(«labelName»«param»)'''
+ static def String readCall(String labelName, String param) '''read_«labelName»(«param»)'''
+ static def String writeCall(String labelName, String param) '''write_«labelName»(«param»)'''
+
+ // ---------- generate file contents ----------
+
static def String toCMake(String libName, List<String> srcFiles)
'''
# «libName» ################################################################
@@ -38,21 +49,21 @@
'''
- static def String toH(String name, String readCall, String writeCall)
+ static def String toH(Label label)
'''
- typedef struct «name»_CacheLine
+ typedef struct «label.name»_CacheLine
{
- struct «name»_CacheLine* ptrCacheLine[8] ;
- } «name»_CacheLine ;
- void initialize_«name»(«name»_CacheLine* array,int array_elements);
- void «readCall»;
- void «writeCall»;
+ struct «label.name»_CacheLine* ptrCacheLine[8] ;
+ } «label.name»_CacheLine ;
+ void «initCall(label.name, "_CacheLine* array, int array_elements")»;
+ void «readCall(label.name, "int labelAccessStatistics")»;
+ void «writeCall(label.name, "int labelAccessStatistics")»;
'''
- static def String toCpp(String name, String size, String readCall, String writeCall)
+ static def String toCpp(Label label)
'''
- void initialize_«name»(«name»_CacheLine* array,int array_elements) {
+ void initialize_«label.name»(«label.name»_CacheLine* array,int array_elements) {
int steps = array_elements / 2 ;
int bottom = 0 ;
int top = steps ;
@@ -68,23 +79,23 @@
- void «readCall» {
+ void «readCall(label.name, "int labelAccessStatistics")» {
static bool initialized = false;
- int numberOfBytes = «size»;
- static «name»_CacheLine* «name»;
+ int numberOfBytes = «label?.size?.numberBytes»;
+ static «label.name»_CacheLine* «label.name»;
if(!initialized) {
//init
- «name» = («name»_CacheLine*) malloc(sizeof(«name»_CacheLine) * 17000);
- initialize_«name»(«name», 17000);
+ «label.name» = («label.name»_CacheLine*) malloc(sizeof(«label.name»_CacheLine) * 17000);
+ initialize_«label.name»(«label.name», 17000);
initialized = true;
}
- static «name»_CacheLine* i = «name»;
+ static «label.name»_CacheLine* i = «label.name»;
static int counter = 0;
if(counter > 16100) {
counter = 0;
- i = «name»;
+ i = «label.name»;
}
int end_value = counter + numberOfBytes;
@@ -97,23 +108,23 @@
- void «writeCall» {
+ void «writeCall(label.name, "int labelAccessStatistics")» {
static bool initialized = false;
- int numberOfBytes = «size»;
- static «name»_CacheLine* «name»;
+ int numberOfBytes = «label?.size?.numberBytes»;
+ static «label.name»_CacheLine* «label.name»;
if(!initialized) {
//init
- «name» = («name»_CacheLine*) malloc(sizeof(«name»_CacheLine) * 17000);
- initialize_«name»(«name», 17000);
+ «label.name» = («label.name»_CacheLine*) malloc(sizeof(«label.name»_CacheLine) * 17000);
+ initialize_«label.name»(«label.name», 17000);
initialized = true;
}
- static «name»_CacheLine* i = «name»;
+ static «label.name»_CacheLine* i = «label.name»;
static int counter = 0;
if(counter > 16100) {
counter = 0;
- i = «name»;
+ i = «label.name»;
}
int end_value = counter + numberOfBytes;
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosLabelTranslationUnit.java b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosLabelTranslationUnit.java
deleted file mode 100644
index 9813d5d..0000000
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosLabelTranslationUnit.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/**
- * Copyright (c) 2020-2021 Robert Bosch GmbH.
- *
- * This program and the accompanying materials are made
- * available under the terms of the Eclipse Public License 2.0
- * which is available at https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *
- * Contributors:
- * Robert Bosch GmbH - initial API and implementation
- */
-
-package org.eclipse.app4mc.slg.ros2.generators;
-
-import org.eclipse.app4mc.amalthea.model.Label;
-import org.eclipse.app4mc.slg.commons.m2t.generators.LabelTranslationUnit;
-import org.eclipse.app4mc.transformation.util.OutputBuffer;
-
-public class RosLabelTranslationUnit extends LabelTranslationUnit {
- public static final String MODULLIB_NAME = "LABELS_LIB";
- public static final String MODULE_NAME = "labels";
- public static final String MODULE_PATH = "synthetic_gen/" + MODULE_NAME;
- public static final String MAKEFILE_PATH = MODULE_PATH + "/CMakeLists.txt";
-
- public RosLabelTranslationUnit(final OutputBuffer outputBuffer, final Label label) {
- super(outputBuffer, label);
- }
-
- @Override
- public String getModuleName() {
- return MODULE_NAME;
- }
-
- @Override
- public String getIncFile() {
- return MODULE_NAME + ".h";
- }
-
- @Override
- public void genFiles() {
- if (isSrcFileEmpty()) {
- srcAppend("#include \"" + getIncFile() + "\"\n\n");
- srcAppend("#include <stdlib.h>\n");
- }
- String readCall = readCall("int labelAccessStatistics");
- String writeCall = writeCall("int labelAccessStatistics");
-
- incAppend(RosLabelGenerator.toH(getName(), readCall, writeCall));
- srcAppend(RosLabelGenerator.toCpp(getName(), "" + getSize(), readCall, writeCall));
- }
-
-}
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosRunnableGenerator.xtend b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosRunnableGenerator.xtend
index cc46ce5..1c8ded2 100644
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosRunnableGenerator.xtend
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosRunnableGenerator.xtend
@@ -28,7 +28,7 @@
'''
# «libName» ################################################################
####
- add_library(«RosRunnableTranslationUnit.libName» STATIC
+ add_library(«libName» STATIC
«FOR srcFile : srcFiles»
«""» ${CMAKE_CURRENT_LIST_DIR}/_src/«srcFile»
«ENDFOR»
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosRunnableTranslationUnit.java b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosRunnableTranslationUnit.java
deleted file mode 100644
index b097fa5..0000000
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosRunnableTranslationUnit.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/**
- * Copyright (c) 2020-2021 Robert Bosch GmbH.
- *
- * This program and the accompanying materials are made
- * available under the terms of the Eclipse Public License 2.0
- * which is available at https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *
- * Contributors:
- * Robert Bosch GmbH - initial API and implementation
- */
-
-package org.eclipse.app4mc.slg.ros2.generators;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.LinkedHashSet;
-import java.util.List;
-
-import org.eclipse.app4mc.amalthea.model.ActivityGraphItem;
-import org.eclipse.app4mc.amalthea.model.BooleanObject;
-import org.eclipse.app4mc.amalthea.model.Channel;
-import org.eclipse.app4mc.amalthea.model.ChannelSend;
-import org.eclipse.app4mc.amalthea.model.InterProcessStimulus;
-import org.eclipse.app4mc.amalthea.model.InterProcessTrigger;
-import org.eclipse.app4mc.slg.commons.m2t.generators.RunnableTranslationUnit;
-import org.eclipse.app4mc.slg.commons.m2t.generators.TranslationUnit;
-import org.eclipse.app4mc.slg.commons.m2t.transformers.sw.ActivityGraphItemTransformer;
-import org.eclipse.app4mc.slg.ros2.transformers.utils.Utils;
-import org.eclipse.app4mc.transformation.util.OutputBuffer;
-
-public class RosRunnableTranslationUnit extends RunnableTranslationUnit {
- private String param;
- private String nodeParam;
- private boolean measurePerformance;
- private List<String> publishers;
- private List<String> client_declarations;
- private List<String> client_inits;
-
- public RosRunnableTranslationUnit(final OutputBuffer outputBuffer, final ActivityGraphItemTransformer transformer,
- final org.eclipse.app4mc.amalthea.model.Runnable runnable) {
- super(outputBuffer, transformer, runnable);
- }
-
- @Override
- public String getCall() {
- return "run_" + runnable.getName() + "(" + param + ")";
- }
-
- public String getNodeCall() {
- return "run_" + runnable.getName() + "(" + nodeParam + ")";
- }
-
- public List<String> getPublishers() {
- return this.publishers;
- }
-
- public List<String> getClientDeclarations() {
- return this.client_declarations;
- }
-
- public List<String> getClientInits() {
- return this.client_inits;
- }
-
- @Override
- public void genFiles() {
- param = "";
- nodeParam = "";
- publishers = new ArrayList<>();
- client_declarations = new ArrayList<>();
- client_inits = new ArrayList<>();
-
- if (isSrcFileEmpty()) { // all stuff only required once regardless of runnable instance
- srcAppend("#include \"" + this.getIncFile() + "\"\n");
- }
- final HashSet<String> includes = new LinkedHashSet<>();
- final List<String> calls = new ArrayList<>();
-
- measurePerformance = false;
- if (runnable != null && runnable.getCustomProperties().get("measure_performance") instanceof BooleanObject) {
- measurePerformance = ((BooleanObject) runnable.getCustomProperties().get("measure_performance")).isValue();
- }
-
- if (measurePerformance) {
- includes.add("aml.h");
- }
-
- if (runnable != null && runnable.getActivityGraph() != null) {
- for (ActivityGraphItem item : runnable.getActivityGraph().getItems()) {
-
- final TranslationUnit tmp = callGraphItemTransformer.transform(item);
- if (tmp.getIncFile() != null && !tmp.getIncFile().isEmpty() && !getIncFile().equals(tmp.getIncFile())) {
- includes.add(tmp.getIncFile());
- }
-
- // check if item is publisher
-
- if ((item instanceof ChannelSend)) {
- ChannelSend cs = (ChannelSend) item;
- Channel data = cs.getData();
-
- publishers.add(data.getName() + "_publisher");
-
- nodeParam = nodeParam + ((nodeParam.equals("")) ? "" : ";") + data.getName() + "_publisher";
- param = ((param.equals("")) ? "" : ";") + "rclcpp::Publisher<std_msgs::msg::String>::SharedPtr& "
- + data.getName() + "_publisher";
- }
-
- if ((item instanceof InterProcessTrigger)) {
- InterProcessTrigger trigger = (InterProcessTrigger) item;
- InterProcessStimulus stimulus = trigger.getStimulus();
-
- includes.add(stimulus.getName() + "_service/srv/" + stimulus.getName() + "_service" + ".hpp");
- client_declarations.add(
- "rclcpp::Client<" + stimulus.getName() + "_service::srv::"
- + Utils.toIdlCompliantName(stimulus.getName() + "_service")
- + ">::SharedPtr " + stimulus.getName() + "_client");
- client_inits.add(
- stimulus.getName() + "_client = this->create_client<" + stimulus.getName() + "_service::srv::"
- + Utils.toIdlCompliantName(stimulus.getName() + "_service") + ">"
- + "(\"" + stimulus.getName() + "_service\")");
- nodeParam = nodeParam + (nodeParam.equals("") ? "" : ";") + stimulus.getName() + "_client";
- param = (param.equals("") ? "" : ";") + "rclcpp::Client<"
- + stimulus.getName() + "_service::srv::" + Utils.toIdlCompliantName(stimulus.getName() + "_service")
- + ">::SharedPtr& " + stimulus.getName() + "_client";
- }
-
- final String call = tmp.getCall();
- if (call != null && !call.isEmpty()) {
- calls.add(call);
- }
- }
- }
-
- // write header
- incAppend("\n//Runnable " + runnable.getName() + "----\n");
- toH(includes);
-
- // write body
- srcAppend("\n//Runnable " + runnable.getName() + "----\n");
- toCpp(includes, calls);
- }
-
- @Override
- public void toH(final HashSet<String> includes) {
- for (String include : includes) {
- incAppend("#include \"" + include + "\"\n");
- }
- incAppend("void " + getCall() + ";\n");
- }
-
- @Override
- public void toCpp(final HashSet<String> includes, final List<String> calls) {
- this.srcAppend("void " + this.getCall() + "{\n");
- if (measurePerformance) {
- srcAppend(
- "uint64_t event_list[] = {0x11, 0x13, 0x17}; //CPU CYCLES, MEM ACCESS, L2 Cache Refill\n"
- + "int total_events = sizeof(event_list)/sizeof(event_list[0]);\n"
- + "int fd = instrument_start(0,event_list, total_events);\n");
- }
-
- for (String call : calls) {
- srcAppend("\t" + call + ";\n");
- }
-
- if (this.measurePerformance) {
- this.srcAppend("instrument_stop(fd, \"" + runnable.getName() + ".log\");\n");
- }
- this.srcAppend("}\n\n");
- }
-
-}
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosTaskGenerator.xtend b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosTaskGenerator.xtend
index 2b81adf..d70f2ad 100644
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosTaskGenerator.xtend
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosTaskGenerator.xtend
@@ -13,8 +13,7 @@
package org.eclipse.app4mc.slg.ros2.generators
-import java.util.List
-import java.util.Set
+import java.util.Collection
import org.eclipse.app4mc.amalthea.model.EventStimulus
import org.eclipse.app4mc.amalthea.model.InterProcessStimulus
import org.eclipse.app4mc.amalthea.model.PeriodicStimulus
@@ -28,7 +27,7 @@
throw new IllegalStateException("Utility class");
}
- static def String getDeclaration(List<Stimulus> stimuli, List<String> publishers, List<String> clientDeclarations) '''
+ static def String getDeclaration(Collection<Stimulus> stimuli, Collection<String> publishers, Collection<String> clientDeclarations) '''
«FOR stimulus : stimuli»
«IF stimulus instanceof PeriodicStimulus»
rclcpp::TimerBase::SharedPtr «(stimulus as PeriodicStimulus).name»_timer_;
@@ -48,7 +47,7 @@
«ENDFOR»
'''
- static def String getInitialisation(String nodeName, List<Stimulus> stimuli, List<String> publishers, List<String> clientInits) '''
+ static def String getInitialisation(String nodeName, Collection<Stimulus> stimuli, Collection<String> publishers, Collection<String> clientInits) '''
«FOR stimulus : stimuli»
«IF stimulus instanceof PeriodicStimulus»
«(stimulus as PeriodicStimulus).name»_timer_ = this->create_wall_timer(
@@ -70,7 +69,7 @@
«ENDFOR»
'''
- static def String getServiceCallback(List<Stimulus> stimuli, List<String> stepCalls) '''
+ static def String getServiceCallback(Collection<Stimulus> stimuli, Collection<String> stepCalls) '''
«FOR stimulus : stimuli»
«IF stimulus instanceof InterProcessStimulus»
void «(stimulus as InterProcessStimulus).name»_service_callback(const std::shared_ptr<«(stimulus as InterProcessStimulus).name»_service::srv::«Utils.toIdlCompliantName((stimulus as InterProcessStimulus).name + '_service')»::Request> request,
@@ -85,7 +84,7 @@
«ENDFOR»
'''
- static def String getCallback(List<Stimulus> stimuli, List<String> stepCalls) '''
+ static def String getCallback(Collection<Stimulus> stimuli, Collection<String> stepCalls) '''
«FOR stimulus : stimuli»
«IF stimulus instanceof PeriodicStimulus»
void «(stimulus as PeriodicStimulus).name»_timer_callback() {
@@ -104,7 +103,7 @@
«ENDFOR»
'''
- static def String getHeaders(Set<String> includes) '''
+ static def String getHeaders(Collection<String> includes) '''
«FOR include : includes»
#include "«include»"
«ENDFOR»
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosTaskTranslationUnit.java b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosTaskTranslationUnit.java
deleted file mode 100644
index 4e58591..0000000
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/generators/RosTaskTranslationUnit.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/**
- * Copyright (c) 2020-2021 Robert Bosch GmbH.
- *
- * This program and the accompanying materials are made
- * available under the terms of the Eclipse Public License 2.0
- * which is available at https://www.eclipse.org/legal/epl-2.0/
- *
- * SPDX-License-Identifier: EPL-2.0
- *
- * Contributors:
- * Robert Bosch GmbH - initial API and implementation
- */
-
-package org.eclipse.app4mc.slg.ros2.generators;
-
-import java.util.ArrayList;
-import java.util.LinkedHashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Set;
-import java.util.function.BiConsumer;
-
-import org.eclipse.app4mc.amalthea.model.ActivityGraphItem;
-import org.eclipse.app4mc.amalthea.model.Component;
-import org.eclipse.app4mc.amalthea.model.Group;
-import org.eclipse.app4mc.amalthea.model.ITaggable;
-import org.eclipse.app4mc.amalthea.model.InterProcessStimulus;
-import org.eclipse.app4mc.amalthea.model.Runnable;
-import org.eclipse.app4mc.amalthea.model.RunnableCall;
-import org.eclipse.app4mc.amalthea.model.Stimulus;
-import org.eclipse.app4mc.amalthea.model.Tag;
-import org.eclipse.app4mc.amalthea.model.Task;
-import org.eclipse.app4mc.slg.commons.m2t.generators.LabelTranslationUnit;
-import org.eclipse.app4mc.slg.commons.m2t.generators.TaskTranslationUnit;
-import org.eclipse.app4mc.slg.ros2.transformers.stimuli.RosInterProcessStimulusTransformer;
-import org.eclipse.app4mc.slg.ros2.transformers.sw.RosLabelTransformer;
-import org.eclipse.app4mc.slg.ros2.transformers.sw.RosRunnableTransformer;
-import org.eclipse.app4mc.transformation.util.OutputBuffer;
-
-public class RosTaskTranslationUnit extends TaskTranslationUnit {
- private RosInterProcessStimulusTransformer ipStimulusTransformer;
- private Task task;
-
- private final Set<String> includes = new LinkedHashSet<>();
- private final List<String> initCalls = new LinkedList<>();
- private final List<String> stepCalls = new LinkedList<>();
- private final List<Stimulus> stimuli = new ArrayList<>();
- private final List<String> publishers = new ArrayList<>();
- private final List<String> clientDeclarations = new ArrayList<>();
- private final List<String> clientInits = new ArrayList<>();
-
- public RosTaskTranslationUnit(final OutputBuffer outputBuffer, final RosRunnableTransformer transformerRunnable,
- final RosLabelTransformer transformerLabel, final RosInterProcessStimulusTransformer ipStimulusTransformer,
- final Task task, final Component c) {
- super(outputBuffer, transformerRunnable, transformerLabel, task);
- this.ipStimulusTransformer = ipStimulusTransformer;
- this.task = task;
-
- this.genFiles();
- }
-
- @Override
- public String getBasePath() {
- return "";
- }
-
- @Override
- public String getModuleName() {
- return this.task.getName();
- }
-
- @Override
- public void genFiles() {
-
- if (task != null && task.getActivityGraph() != null) {
- for (ActivityGraphItem item : task.getActivityGraph().getItems()) {
-
- if ((item instanceof RunnableCall)) {
- final RunnableCall runnableCall = (RunnableCall) item;
- final Runnable runnable = runnableCall.getRunnable();
-
- RosRunnableTranslationUnit tu = (RosRunnableTranslationUnit) runnableTransformer.transform(runnable);
- includes.add(tu.getIncFile());
-
- if (hasTagNamed(runnableCall, "initialize")) {
- initCalls.add(tu.getNodeCall());
- } else {
- stepCalls.add(tu.getNodeCall());
- }
-
- // TODO: Make set
- publishers.addAll(tu.getPublishers());
- clientDeclarations.addAll(tu.getClientDeclarations());
- clientInits.addAll(tu.getClientInits());
- // TODO: add terminate function, if requested
-
- } else if (item instanceof Group) {
- final Group group = ((Group) item);
- for (ActivityGraphItem groupitem : group.getItems()) {
- if ((groupitem instanceof RunnableCall)) {
- final RunnableCall runnableCall = (RunnableCall) groupitem;
- final Runnable runnable = runnableCall.getRunnable();
-
- RosRunnableTranslationUnit tu = (RosRunnableTranslationUnit) runnableTransformer.transform(runnable);
- includes.add(tu.getIncFile());
-
- if (hasTagNamed(runnableCall, "initialize")) {
- initCalls.add((tu).getNodeCall());
- } else {
- stepCalls.add((tu).getNodeCall());
- }
- //TODO: add terminate function, if requested
- }
- }
- }
- }
- }
-
- // labels must be initialized before usage, generated labels provide this method
-
- for (LabelTranslationUnit tu : labelTransformer.getCache().values()) {
- includes.add(tu.getIncFile());
- initCalls.add(tu.getInitCall());
- }
-
- labelTransformer.getCache().forEach(
- (BiConsumer<ArrayList<?>, LabelTranslationUnit>) (ArrayList<?> label, LabelTranslationUnit tu) -> {
-
- });
-
- // add header for srv file in case of an interprocessstimulus
- // create .srv file for the messages to be translated
-
- if (task != null) {
- for (Stimulus stimulus : task.getStimuli()) {
- if (stimulus instanceof InterProcessStimulus) {
- String name = stimulus.getName();
- includes.add(name + "_service/srv/" + name + "_service.hpp");
-
- ipStimulusTransformer.transform(((InterProcessStimulus) stimulus));
- }
- }
-
- stimuli.addAll(task.getStimuli());
- }
-
- }
-
- private boolean hasTagNamed(ITaggable element, String name) {
- for (Tag tag : element.getTags()) {
- if (tag.getName().equals(name))
- return true;
- }
- return false;
- }
-
- public String getDeclaration() {
- return RosTaskGenerator.getDeclaration(stimuli, publishers, clientDeclarations);
- }
-
- public String getInitialisation(String nodeName) {
- return RosTaskGenerator.getInitialisation(nodeName, stimuli, publishers, clientInits);
- }
-
- public String getServiceCallback() {
- return RosTaskGenerator.getServiceCallback(stimuli, stepCalls);
- }
-
- public String getCallback() {
- return RosTaskGenerator.getCallback(stimuli, stepCalls);
- }
-
- public String getHeaders() {
- return RosTaskGenerator.getHeaders(includes);
- }
-}
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosBaseTransformer.java b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosBaseTransformer.java
index 7bffcc3..50eae90 100644
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosBaseTransformer.java
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosBaseTransformer.java
@@ -22,6 +22,11 @@
import static org.eclipse.app4mc.slg.ros2.transformers.RosBaseSettings.SRC_FOLDER;
import static org.eclipse.app4mc.slg.ros2.transformers.RosBaseSettings.SRC_TYPE;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGTranslationUnit;
import org.eclipse.app4mc.transformation.util.OutputBuffer;
@@ -60,4 +65,19 @@
public String getSrcPath(SLGTranslationUnit tu) { return tu.getModulePath() + SRC_FOLDER + getSrcFile(tu); }
public String getIncPath(SLGTranslationUnit tu) { return tu.getModulePath() + INC_FOLDER + getIncFile(tu); }
+ // Generic cache handling
+
+ public List<String> getSrcFiles() {
+
+ return getCache().values().stream()
+ .map(this::getSrcFile)
+ .sorted()
+ .distinct()
+ .collect(Collectors.toList());
+ }
+
+ public Map<List<Object>, SLGTranslationUnit> getCache() {
+ return Collections.emptyMap();
+ }
+
}
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosModel2TextTransformer.java b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosModel2TextTransformer.java
index ce9df52..fb1dc3f 100644
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosModel2TextTransformer.java
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/RosModel2TextTransformer.java
@@ -39,8 +39,8 @@
import org.eclipse.app4mc.amalthea.model.util.SoftwareUtil;
import org.eclipse.app4mc.slg.commons.m2t.transformers.AmaltheaModel2TextTransformer;
import org.eclipse.app4mc.slg.commons.m2t.transformers.sw.TicksUtilsTransformer;
-import org.eclipse.app4mc.slg.ros2.generators.RosAmlTranslationUnit;
import org.eclipse.app4mc.slg.ros2.generators.RosModel2TextGenerator;
+import org.eclipse.app4mc.slg.ros2.transformers.common.RosAmlTransformer;
import org.eclipse.app4mc.slg.ros2.transformers.common.RosTagTransformer;
import org.eclipse.app4mc.slg.ros2.transformers.sw.RosLabelTransformer;
import org.eclipse.app4mc.transformation.util.OutputBuffer;
@@ -52,6 +52,7 @@
public class RosModel2TextTransformer extends AmaltheaModel2TextTransformer {
@Inject private OutputBuffer outputBuffer;
+ @Inject private RosAmlTransformer amlTransformer;
@Inject private RosTagTransformer tagTransformer;
@Inject private TicksUtilsTransformer ticksUtilsTransformer;
@Inject private RosLabelTransformer labelTransformer;
@@ -67,12 +68,9 @@
RosBaseSettings.initializeOutputBuffer(this.outputBuffer, outputFolder);
- Set<String> nodes = new HashSet<>();
- Set<String> services = new HashSet<>();
-
+ amlTransformer.transform(model);
+
CommonElements commonElements = ModelUtil.getOrCreateCommonElements(model);
- SWModel swModel = ModelUtil.getOrCreateSwModel(model);
-
for (Tag tag : commonElements.getTags()) {
// instance to know which node published a message
tagTransformer.transform(tag, model);
@@ -81,6 +79,10 @@
/* extract information needed for top-level CMake file */
/* find runnables that use service files and use the tag to set the dependencies */
+ Set<String> nodes = new HashSet<>();
+ Set<String> services = new HashSet<>();
+
+ SWModel swModel = ModelUtil.getOrCreateSwModel(model);
for (Task task : swModel.getTasks()) {
Stimulus stimulus = task.getStimuli().get(0); // Mc: Why only the first ?
@@ -119,15 +121,16 @@
}
}
- this.ticksUtilsTransformer.createCMake();
- this.labelTransformer.createCMake();
- new RosAmlTranslationUnit(this.outputBuffer);
- this.outputBuffer.appendTo(OTHER_TYPE, "CMakeLists.txt", RosModel2TextGenerator.toCmake(nodes, services, label,
+ ticksUtilsTransformer.createCMake();
+ labelTransformer.createCMake();
+
+ outputBuffer.appendTo(OTHER_TYPE, "CMakeLists.txt", RosModel2TextGenerator.toCmake(nodes, services, label,
ticks, interprocess, channelSend, performance_measurement));
- this.outputBuffer.appendTo(OTHER_TYPE, "package.xml", RosModel2TextGenerator.toPackageXml(services));
- this.outputBuffer.appendTo(OTHER_TYPE, "build.sh", RosModel2TextGenerator.toBuildScript(services));
- this.outputBuffer.appendTo(OTHER_TYPE, "launch.py", RosModel2TextGenerator.toLaunchFile(nodes));
- this.outputBuffer.finish();
+ outputBuffer.appendTo(OTHER_TYPE, "package.xml", RosModel2TextGenerator.toPackageXml(services));
+ outputBuffer.appendTo(OTHER_TYPE, "build.sh", RosModel2TextGenerator.toBuildScript(services));
+ outputBuffer.appendTo(OTHER_TYPE, "launch.py", RosModel2TextGenerator.toLaunchFile(nodes));
+
+ outputBuffer.finish();
}
}
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/common/RosAmlTransformer.java b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/common/RosAmlTransformer.java
new file mode 100644
index 0000000..a6d9f4a
--- /dev/null
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/common/RosAmlTransformer.java
@@ -0,0 +1,57 @@
+/**
+ ********************************************************************************
+ * Copyright (c) 2020-2021 Robert Bosch GmbH.
+ *
+ * This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Robert Bosch GmbH - initial API and implementation
+ * *******************************************************************************
+ */
+
+package org.eclipse.app4mc.slg.ros2.transformers.common;
+
+
+import org.eclipse.app4mc.amalthea.model.Amalthea;
+import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGTranslationUnit;
+import org.eclipse.app4mc.slg.ros2.generators.RosAmlGenerator;
+import org.eclipse.app4mc.slg.ros2.transformers.RosBaseTransformer;
+
+public class RosAmlTransformer extends RosBaseTransformer {
+
+ public SLGTranslationUnit transform(final Amalthea model) {
+ final SLGTranslationUnit tu = createTranslationUnit(model);
+
+ // if translation unit is newly created and valid -> create files
+ if (tu.isValid()) {
+ doTransform(tu, model);
+ }
+
+ return tu;
+ }
+
+ private SLGTranslationUnit createTranslationUnit(final Amalthea model) {
+ if (model == null) {
+ return new SLGTranslationUnit("UNSPECIFIED MODEL");
+ } else {
+ String basePath = "utils";
+ String moduleName = "aml";
+ String call = ""; // unused
+ return new SLGTranslationUnit(basePath, moduleName, call);
+ }
+ }
+
+ private void doTransform(final SLGTranslationUnit tu, final Amalthea model) {
+ genFiles(tu, model);
+ }
+
+ private void genFiles(SLGTranslationUnit tu, final Amalthea model) {
+ incAppend(tu, RosAmlGenerator.toH());
+ srcAppend(tu, RosAmlGenerator.toCpp());
+ }
+
+}
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/common/RosTagTransformer.java b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/common/RosTagTransformer.java
index 302f1e1..e451c1c 100644
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/common/RosTagTransformer.java
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/common/RosTagTransformer.java
@@ -28,8 +28,9 @@
import org.eclipse.app4mc.amalthea.model.Task;
import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGTranslationUnit;
import org.eclipse.app4mc.slg.ros2.generators.RosTagGenerator;
-import org.eclipse.app4mc.slg.ros2.generators.RosTaskTranslationUnit;
import org.eclipse.app4mc.slg.ros2.transformers.RosBaseTransformer;
+import org.eclipse.app4mc.slg.ros2.transformers.sw.RosTaskCache;
+import org.eclipse.app4mc.slg.ros2.transformers.sw.RosTaskCache.TaskStore;
import org.eclipse.app4mc.slg.ros2.transformers.sw.RosTaskTransformer;
import com.google.inject.Inject;
@@ -39,6 +40,7 @@
public class RosTagTransformer extends RosBaseTransformer {
@Inject private RosTaskTransformer rosTaskTransformer;
+ @Inject private RosTaskCache rosTaskCache;
// ---------- generic part "def create new transform(...)" ----------
@@ -96,12 +98,13 @@
if (model != null && model.getSwModel() != null) {
for (Task task : model.getSwModel().getTasks()) {
if (task.getTags().contains(tag)) {
- final RosTaskTranslationUnit taskTU = (RosTaskTranslationUnit) rosTaskTransformer.transform(task, null);
- header.add(taskTU.getHeaders());
- declaration.add(taskTU.getDeclaration());
- initialization.add(taskTU.getInitialisation(tu.getModuleName()));
- calls.add(taskTU.getCallback());
- serviceCallbacks.add(taskTU.getServiceCallback());
+ final SLGTranslationUnit taskTU = rosTaskTransformer.transform(task);
+ final TaskStore store = rosTaskCache.getStore(taskTU);
+ header.add(store.getHeaders());
+ declaration.add(store.getDeclaration());
+ initialization.add(store.getInitialisation(tu.getModuleName()));
+ calls.add(store.getCallback());
+ serviceCallbacks.add(store.getServiceCallback());
}
}
}
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosActivityGraphItemTransformer.java b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosActivityGraphItemTransformer.java
index e6275df..13199a8 100644
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosActivityGraphItemTransformer.java
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosActivityGraphItemTransformer.java
@@ -15,18 +15,11 @@
package org.eclipse.app4mc.slg.ros2.transformers.sw;
-import java.util.Arrays;
-
import org.eclipse.app4mc.amalthea.model.ActivityGraphItem;
-import org.eclipse.app4mc.amalthea.model.ChannelReceive;
import org.eclipse.app4mc.amalthea.model.ChannelSend;
import org.eclipse.app4mc.amalthea.model.InterProcessTrigger;
-import org.eclipse.app4mc.amalthea.model.LabelAccess;
-import org.eclipse.app4mc.amalthea.model.RunnableCall;
-import org.eclipse.app4mc.amalthea.model.Ticks;
-import org.eclipse.app4mc.slg.commons.m2t.generators.TranslationUnit;
+import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGTranslationUnit;
import org.eclipse.app4mc.slg.commons.m2t.transformers.sw.ActivityGraphItemTransformer;
-import org.eclipse.xtend2.lib.StringConcatenation;
import com.google.inject.Inject;
import com.google.inject.Singleton;
@@ -34,47 +27,23 @@
@Singleton
public class RosActivityGraphItemTransformer extends ActivityGraphItemTransformer {
- @Inject private RosChannelSendTransformer channelSendTransformer;
@Inject private RosInterProcessTriggerTransformer ipTransformer;
+ @Inject private RosChannelSendTransformer channelSendTransformer;
@Override
- protected TranslationUnit _transform(final ChannelSend cs) {
- return this.channelSendTransformer.transform(cs);
- }
+ public SLGTranslationUnit transform(final ActivityGraphItem graphItem) {
+ if (graphItem == null) {
+ throw new IllegalArgumentException("Unhandled parameter type: null");
+ }
- protected TranslationUnit _transform(final InterProcessTrigger ip) {
- return this.ipTransformer.transform(ip);
- }
+ if (graphItem instanceof InterProcessTrigger) {
+ return ipTransformer.transform((InterProcessTrigger) graphItem);
- @Override
- protected TranslationUnit _transform(final ActivityGraphItem ActivityGraphItem) {
- StringConcatenation _builder = new StringConcatenation();
- _builder.append("/*[feature ");
- Class<? extends org.eclipse.app4mc.amalthea.model.ActivityGraphItem> _class = ActivityGraphItem.getClass();
- _builder.append(_class);
- _builder.append(" in not supported]*/");
- final String message = _builder.toString();
- return new TranslationUnit("undefined", message, message, message);
- }
+ } else if (graphItem instanceof ChannelSend) {
+ return channelSendTransformer.transform((ChannelSend) graphItem);
- @Override
- public TranslationUnit transform(final ActivityGraphItem cs) {
- if (cs instanceof ChannelReceive) {
- return _transform((ChannelReceive) cs);
- } else if (cs instanceof ChannelSend) {
- return _transform((ChannelSend) cs);
- } else if (cs instanceof LabelAccess) {
- return _transform((LabelAccess) cs);
- } else if (cs instanceof Ticks) {
- return _transform((Ticks) cs);
- } else if (cs instanceof InterProcessTrigger) {
- return _transform((InterProcessTrigger) cs);
- } else if (cs instanceof RunnableCall) {
- return _transform((RunnableCall) cs);
- } else if (cs != null) {
- return _transform(cs);
} else {
- throw new IllegalArgumentException("Unhandled parameter types: " + Arrays.<Object>asList(cs).toString());
+ return super.transform(graphItem);
}
}
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosChannelSendTransformer.java b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosChannelSendTransformer.java
index 6794357..5cd8da3 100644
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosChannelSendTransformer.java
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosChannelSendTransformer.java
@@ -16,9 +16,7 @@
package org.eclipse.app4mc.slg.ros2.transformers.sw;
import org.eclipse.app4mc.amalthea.model.ChannelSend;
-import org.eclipse.app4mc.slg.ros2.generators.RosChannelSendTranslationUnit;
-import org.eclipse.app4mc.slg.ros2.generators.RosChannelSendUtilsTranslationUnit;
-import org.eclipse.app4mc.transformation.util.OutputBuffer;
+import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGTranslationUnit;
import com.google.inject.Inject;
import com.google.inject.Singleton;
@@ -26,12 +24,28 @@
@Singleton
public class RosChannelSendTransformer {
- @Inject private OutputBuffer outputBuffer;
@Inject private RosChannelSendUtilsTransformer channelSendUtilTransformer;
- public RosChannelSendTranslationUnit transform(final ChannelSend cs) {
- final RosChannelSendUtilsTranslationUnit tuIp = this.channelSendUtilTransformer.generate(cs);
- return new RosChannelSendTranslationUnit(this.outputBuffer, tuIp, cs);
+ public SLGTranslationUnit transform(final ChannelSend cs) {
+ final SLGTranslationUnit utilTU = this.channelSendUtilTransformer.transform(cs);
+
+ return createTranslationUnit(cs, utilTU);
+ }
+
+ private SLGTranslationUnit createTranslationUnit(final ChannelSend cs, final SLGTranslationUnit utilTU) {
+ if (cs == null) {
+ return new SLGTranslationUnit("UNSPECIFIED CHANNEL SEND");
+ }
+
+ String basePath = utilTU.getBasePath();
+ String moduleName = utilTU.getModuleName();
+ String call = computeCall(cs);
+ return new SLGTranslationUnit(basePath, moduleName, call);
+ }
+
+ private String computeCall(final ChannelSend cs) {
+ String param = cs.getData().getName();
+ return "publish_to_" + param + "(" + param + "_publisher)";
}
}
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosChannelSendUtilsTransformer.java b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosChannelSendUtilsTransformer.java
index 5bcba77..cb68a3e 100644
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosChannelSendUtilsTransformer.java
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosChannelSendUtilsTransformer.java
@@ -15,53 +15,97 @@
package org.eclipse.app4mc.slg.ros2.transformers.sw;
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
+
import org.eclipse.app4mc.amalthea.model.ChannelSend;
-import org.eclipse.app4mc.slg.commons.m2t.generators.TranslationUnit;
-import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGBaseTransformer;
-import org.eclipse.app4mc.slg.ros2.generators.RosChannelSendUtilsTranslationUnit;
-import org.eclipse.app4mc.transformation.util.OutputBuffer;
-import org.eclipse.xtext.xbase.lib.CollectionLiterals;
+import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGTranslationUnit;
+import org.eclipse.app4mc.slg.ros2.generators.RosChannelSendUtilsGenerator;
+import org.eclipse.app4mc.slg.ros2.transformers.RosBaseTransformer;
+
+import com.google.inject.Singleton;
@Singleton
-public class RosChannelSendUtilsTransformer extends SLGBaseTransformer {
+public class RosChannelSendUtilsTransformer extends RosBaseTransformer {
- @Inject private OutputBuffer outputBuffer;
+ public static final String LIB_NAME = "CHANNELSEND_UTIL";
+ public static final String MODULE_NAME = "channelSendUtils";
+ public static final String MODULE_PATH = "synthetic_gen/" + MODULE_NAME;
+ public static final String MAKEFILE_PATH = MODULE_PATH + "/CMakeLists.txt";
- private final HashMap<ArrayList<?>, RosChannelSendUtilsTranslationUnit> cache = CollectionLiterals
- .newHashMap();
+ private List<String> topicList = new ArrayList<>();
- public RosChannelSendUtilsTranslationUnit generate(final ChannelSend cs) {
- return this.generateIntern(cs); // hash according to class not instance
+ // ---------- generic part "def create new transform(...)" ----------
+
+ private final Map<List<Object>, SLGTranslationUnit> transformCache = new HashMap<>();
+
+ public Map<List<Object>, SLGTranslationUnit> getCache() {
+ return this.transformCache;
}
- public RosChannelSendUtilsTranslationUnit generateIntern(final ChannelSend cs) {
- final ArrayList<?> key = CollectionLiterals.newArrayList(cs);
- final RosChannelSendUtilsTranslationUnit _result;
- synchronized (cache) {
- if (cache.containsKey(key)) {
- return cache.get(key);
+ public SLGTranslationUnit transform(final ChannelSend cs) {
+ final List<Object> key = new ArrayList<>(Arrays.asList(cs));
+ final SLGTranslationUnit tu;
+
+ synchronized (transformCache) {
+ if (transformCache.containsKey(key)) {
+ return transformCache.get(key);
}
- RosChannelSendUtilsTranslationUnit _rosChannelSendUtilsTranslationUnit = new RosChannelSendUtilsTranslationUnit(
- this.outputBuffer, cs);
- _result = _rosChannelSendUtilsTranslationUnit;
- cache.put(key, _result);
+ tu = createTranslationUnit(cs);
+ transformCache.put(key, tu);
}
- _init_generateIntern(_result, cs);
- return _result;
+
+ // if translation unit is newly created and valid -> create files
+ if (tu.isValid()) {
+ doTransform(tu, cs);
+ }
+
+ return tu;
}
+ // ---------------------------------------------------
- private void _init_generateIntern(final RosChannelSendUtilsTranslationUnit it, final ChannelSend cs) {
+ private SLGTranslationUnit createTranslationUnit(final ChannelSend cs) {
+ if (cs == null) {
+ return new SLGTranslationUnit("UNSPECIFIED CHANNEL SEND");
+ } else {
+ String basePath = "synthetic_gen";
+ String moduleName = "channelSendUtils";
+ String call = ""; // unused
+ return new SLGTranslationUnit(basePath, moduleName, call);
+ }
}
- @Override
- public Map<ArrayList<?>, ? extends TranslationUnit> getCache() {
- return this.cache;
+ private void doTransform(final SLGTranslationUnit tu, final ChannelSend cs) {
+ genFiles(tu, cs);
+ }
+
+ private void genFiles(final SLGTranslationUnit tu, final ChannelSend cs) {
+ if (isSrcFileEmpty(tu)) {
+ incAppend(tu, RosChannelSendUtilsGenerator.toHeader());
+ }
+ if (isSrcFileEmpty(tu)) {
+ srcAppend(tu, RosChannelSendUtilsGenerator.toCPPHead());
+ }
+
+ defineData(tu, cs);
+ }
+
+ private void defineData(final SLGTranslationUnit tu, final ChannelSend cs) {
+ if (cs.getData() == null || cs.getData().getName() == null || cs.getData().getName().isEmpty())
+ return;
+
+ String topic = cs.getData().getName();
+
+ if (!topicList.contains(topic)) {
+ incAppend(tu, RosChannelSendUtilsGenerator.toH(cs));
+ srcAppend(tu, RosChannelSendUtilsGenerator.toCPP(cs));
+
+ topicList.add(topic);
+ }
}
}
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosInterProcessTriggerTransformer.java b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosInterProcessTriggerTransformer.java
index 508ce20..ca0ffbc 100644
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosInterProcessTriggerTransformer.java
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosInterProcessTriggerTransformer.java
@@ -16,9 +16,7 @@
package org.eclipse.app4mc.slg.ros2.transformers.sw;
import org.eclipse.app4mc.amalthea.model.InterProcessTrigger;
-import org.eclipse.app4mc.slg.ros2.generators.RosInterProcessTriggerTranslationUnit;
-import org.eclipse.app4mc.slg.ros2.generators.RosInterProcessTriggerUtilsTranslationUnit;
-import org.eclipse.app4mc.transformation.util.OutputBuffer;
+import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGTranslationUnit;
import com.google.inject.Inject;
import com.google.inject.Singleton;
@@ -26,12 +24,28 @@
@Singleton
public class RosInterProcessTriggerTransformer {
- @Inject private OutputBuffer outputBuffer;
- @Inject private RosInterProcessTriggerUtilsTransformer ipUtilTransformer;
+ @Inject private RosInterProcessTriggerUtilsTransformer iptUtilTransformer;
- public RosInterProcessTriggerTranslationUnit transform(final InterProcessTrigger ip) {
- final RosInterProcessTriggerUtilsTranslationUnit tuIp = this.ipUtilTransformer.generate(ip);
- return new RosInterProcessTriggerTranslationUnit(this.outputBuffer, tuIp, ip);
+ public SLGTranslationUnit transform(final InterProcessTrigger ipt) {
+ final SLGTranslationUnit utilTU = this.iptUtilTransformer.transform(ipt);
+
+ return createTranslationUnit(ipt, utilTU);
+ }
+
+ private SLGTranslationUnit createTranslationUnit(final InterProcessTrigger ipt, final SLGTranslationUnit utilTU) {
+ if (ipt == null) {
+ return new SLGTranslationUnit("UNSPECIFIED INTER PROCESS TRIGGER");
+ }
+
+ String basePath = utilTU.getBasePath();
+ String moduleName = utilTU.getModuleName();
+ String call = computeCall(ipt);
+ return new SLGTranslationUnit(basePath, moduleName, call);
+ }
+
+ private String computeCall(final InterProcessTrigger ipt) {
+ String param = ipt.getStimulus().getName();
+ return "call_service_" + param + "(" + param + "_client)";
}
}
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosInterProcessTriggerUtilsTransformer.java b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosInterProcessTriggerUtilsTransformer.java
index 509f4df..51c0a29 100644
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosInterProcessTriggerUtilsTransformer.java
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosInterProcessTriggerUtilsTransformer.java
@@ -16,54 +16,81 @@
package org.eclipse.app4mc.slg.ros2.transformers.sw;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import org.eclipse.app4mc.amalthea.model.InterProcessTrigger;
-import org.eclipse.app4mc.slg.commons.m2t.generators.TranslationUnit;
import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGBaseTransformer;
-import org.eclipse.app4mc.slg.ros2.generators.RosInterProcessTriggerUtilsTranslationUnit;
-import org.eclipse.app4mc.transformation.util.OutputBuffer;
-import org.eclipse.xtext.xbase.lib.CollectionLiterals;
+import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGTranslationUnit;
+import org.eclipse.app4mc.slg.ros2.generators.RosInterProcessTriggerUtilsGenerator;
-import com.google.inject.Inject;
import com.google.inject.Singleton;
@Singleton
public class RosInterProcessTriggerUtilsTransformer extends SLGBaseTransformer {
- @Inject private OutputBuffer outputBuffer;
+ public static final String LIB_NAME = "INTERPROCESSTRIGGER_UTIL";
+ public static final String MODULE_NAME = "interProcessTriggerUtils";
+ public static final String MODULE_PATH = "synthetic_gen/" + MODULE_NAME;
+ public static final String MAKEFILE_PATH = MODULE_PATH + "/CMakeLists.txt";
- private final HashMap<ArrayList<?>, RosInterProcessTriggerUtilsTranslationUnit> cache = CollectionLiterals
- .newHashMap();
+ // ---------- generic part "def create new transform(...)" ----------
- public RosInterProcessTriggerUtilsTranslationUnit generate(final InterProcessTrigger ip) {
- return this.generateIntern(ip); // hash according to class not instance
+ private final Map<List<Object>, SLGTranslationUnit> transformCache = new HashMap<>();
+
+ public Map<List<Object>, SLGTranslationUnit> getCache() {
+ return this.transformCache;
}
- public RosInterProcessTriggerUtilsTranslationUnit generateIntern(final InterProcessTrigger ip) {
- final ArrayList<?> key = CollectionLiterals.newArrayList(ip);
- final RosInterProcessTriggerUtilsTranslationUnit _result;
- synchronized (cache) {
- if (cache.containsKey(key)) {
- return cache.get(key);
+ public SLGTranslationUnit transform(final InterProcessTrigger ipt) {
+ final List<Object> key = new ArrayList<>(Arrays.asList(ipt));
+ final SLGTranslationUnit tu;
+
+ synchronized (transformCache) {
+ if (transformCache.containsKey(key)) {
+ return transformCache.get(key);
}
- RosInterProcessTriggerUtilsTranslationUnit tu = new RosInterProcessTriggerUtilsTranslationUnit(
- this.outputBuffer, ip);
- _result = tu;
- cache.put(key, _result);
+ tu = createTranslationUnit(ipt);
+ transformCache.put(key, tu);
}
- _init_generateIntern(_result, ip);
- return _result;
+
+ // if translation unit is newly created and valid -> create files
+ if (tu.isValid()) {
+ doTransform(tu, ipt);
+ }
+
+ return tu;
}
- private void _init_generateIntern(final RosInterProcessTriggerUtilsTranslationUnit it,
- final InterProcessTrigger ip) {
+ // ---------------------------------------------------
+
+ private SLGTranslationUnit createTranslationUnit(final InterProcessTrigger ipt) {
+ if (ipt == null) {
+ return new SLGTranslationUnit("UNSPECIFIED INTER PROCESS TRIGGER");
+ } else {
+ String basePath = "synthetic_gen";
+ String moduleName = "interProcessTriggerUtils";
+ String call = ""; // unused
+ return new SLGTranslationUnit(basePath, moduleName, call);
+ }
}
- @Override
- public Map<ArrayList<?>, ? extends TranslationUnit> getCache() {
- return this.cache;
+ private void doTransform(final SLGTranslationUnit tu, final InterProcessTrigger ipt) {
+ genFiles(tu, ipt);
+ }
+
+ private void genFiles(final SLGTranslationUnit tu, final InterProcessTrigger ipt) {
+ if (isSrcFileEmpty(tu)) {
+ incAppend(tu, RosInterProcessTriggerUtilsGenerator.toHeader());
+ }
+ if (isSrcFileEmpty(tu)) {
+ srcAppend(tu, RosInterProcessTriggerUtilsGenerator.toCPPHead());
+ }
+
+ incAppend(tu, RosInterProcessTriggerUtilsGenerator.toH(ipt));
+ srcAppend(tu, RosInterProcessTriggerUtilsGenerator.toCPP(ipt));
}
}
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosLabelTransformer.java b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosLabelTransformer.java
index 6ee6333..0d07a1c 100644
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosLabelTransformer.java
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosLabelTransformer.java
@@ -15,57 +15,43 @@
package org.eclipse.app4mc.slg.ros2.transformers.sw;
-import java.util.ArrayList;
-import java.util.HashMap;
-
import org.eclipse.app4mc.amalthea.model.Label;
-import org.eclipse.app4mc.slg.commons.m2t.generators.LabelTranslationUnit;
+import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGTranslationUnit;
import org.eclipse.app4mc.slg.commons.m2t.transformers.sw.LabelTransformer;
import org.eclipse.app4mc.slg.ros2.generators.RosLabelGenerator;
-import org.eclipse.app4mc.slg.ros2.generators.RosLabelTranslationUnit;
import org.eclipse.app4mc.transformation.util.OutputBuffer;
-import org.eclipse.xtext.xbase.lib.CollectionLiterals;
import com.google.inject.Inject;
public class RosLabelTransformer extends LabelTransformer {
- @Inject
- private OutputBuffer outputBuffer;
- private static final String LIB_NAME = "LABELS_LIB";
+ public static final String LIB_NAME = "LABELS_LIB";
+ public static final String BASE_PATH = "synthetic_gen";
+ public static final String MODULE_NAME = "labels";
+ public static final String MODULE_PATH = BASE_PATH + "/" + MODULE_NAME;
+ public static final String MAKEFILE_PATH = MODULE_PATH + "/CMakeLists.txt";
+
+ @Inject private OutputBuffer outputBuffer;
@Override
- public LabelTranslationUnit transform(final Label label) {
- final ArrayList<?> key = CollectionLiterals.newArrayList(label);
- final RosLabelTranslationUnit _result;
- synchronized (_createCache_transform) {
- if (_createCache_transform.containsKey(key)) {
- return _createCache_transform.get(key);
- }
- RosLabelTranslationUnit tu = new RosLabelTranslationUnit(this.outputBuffer, label);
- _result = tu;
- _createCache_transform.put(key, _result);
- }
- _init_transform(_result, label);
- return _result;
- }
-
- private final HashMap<ArrayList<?>, LabelTranslationUnit> _createCache_transform = CollectionLiterals.newHashMap();
-
- private void _init_transform(final RosLabelTranslationUnit it, final Label label) {
+ public SLGTranslationUnit transform(final Label label) {
+ return super.transform(label);
}
@Override
- public HashMap<ArrayList<?>, LabelTranslationUnit> getCache() {
- return this._createCache_transform;
+ public void genFiles(SLGTranslationUnit tu, Label label) {
+ if (isSrcFileEmpty(tu)) {
+ srcAppend(tu,"#include \"" + getIncFile(tu) + "\"\n\n");
+ srcAppend(tu, "#include <stdlib.h>\n");
+ }
+ incAppend(tu, RosLabelGenerator.toH(label));
+ srcAppend(tu, RosLabelGenerator.toCpp(label));
}
@Override
public boolean createCMake() {
return outputBuffer.appendTo(
- "OTHER",
- RosLabelTranslationUnit.MAKEFILE_PATH,
- RosLabelGenerator.toCMake(LIB_NAME, getSrcFiles()));
+ "OTHER", MAKEFILE_PATH, RosLabelGenerator.toCMake(LIB_NAME, getSrcFiles()));
}
}
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosRunnableCache.java b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosRunnableCache.java
new file mode 100644
index 0000000..802eb44
--- /dev/null
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosRunnableCache.java
@@ -0,0 +1,93 @@
+/**
+ ********************************************************************************
+ * Copyright (c) 2020-2021 Robert Bosch GmbH.
+ *
+ * This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Robert Bosch GmbH - initial API and implementation
+ * *******************************************************************************
+ */
+
+package org.eclipse.app4mc.slg.ros2.transformers.sw;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.app4mc.amalthea.model.Runnable;
+import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGTranslationUnit;
+
+import com.google.inject.Singleton;
+
+@Singleton
+public class RosRunnableCache {
+
+ private Map<SLGTranslationUnit, RunnableStore> cache = new HashMap<>();
+
+ public RunnableStore getStore(SLGTranslationUnit tu) {
+ return cache.get(tu);
+ }
+
+ public void storeValues(SLGTranslationUnit tu, Runnable runnable, String param, String nodeParam,
+ Collection<String> publishers, Collection<String> clientDeclarations, Collection<String> clientInits) {
+ RunnableStore store = new RunnableStore(runnable, param, nodeParam, publishers, clientDeclarations, clientInits);
+ cache.put(tu, store);
+ }
+
+ public class RunnableStore {
+ private final Runnable runnable;
+ private final String param;
+ private final String nodeParam;
+ private final Collection<String> publishers;
+ private final Collection<String> clientDeclarations;
+ private final Collection<String> clientInits;
+
+ public RunnableStore(Runnable runnable, String param, String nodeParam, Collection<String> publishers,
+ Collection<String> clientDeclarations, Collection<String> clientInits) {
+ this.runnable = runnable;
+ this.param = param;
+ this.nodeParam = nodeParam;
+ this.publishers = publishers;
+ this.clientDeclarations = clientDeclarations;
+ this.clientInits = clientInits;
+ }
+
+ public Runnable getRunnable() {
+ return runnable;
+ }
+
+ public String getParam() {
+ return param;
+ }
+
+ public String getNodeParam() {
+ return nodeParam;
+ }
+
+ public Collection<String> getPublishers() {
+ return publishers;
+ }
+
+ public Collection<String> getClientDeclarations() {
+ return clientDeclarations;
+ }
+
+ public Collection<String> getClientInits() {
+ return clientInits;
+ }
+
+ public String getCall() {
+ return "run_" + runnable.getName() + "(" + param + ")";
+ }
+
+ public String getNodeCall() {
+ return "run_" + runnable.getName() + "(" + nodeParam + ")";
+ }
+ }
+
+}
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosRunnableTransformer.java b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosRunnableTransformer.java
index 1854398..6cf53b7 100644
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosRunnableTransformer.java
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosRunnableTransformer.java
@@ -16,59 +16,154 @@
package org.eclipse.app4mc.slg.ros2.transformers.sw;
import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Map;
+import java.util.HashSet;
+import java.util.LinkedHashSet;
+import java.util.List;
-import org.eclipse.app4mc.slg.commons.m2t.generators.RunnableTranslationUnit;
-import org.eclipse.app4mc.slg.commons.m2t.generators.TranslationUnit;
+import org.eclipse.app4mc.amalthea.model.ActivityGraphItem;
+import org.eclipse.app4mc.amalthea.model.BooleanObject;
+import org.eclipse.app4mc.amalthea.model.Channel;
+import org.eclipse.app4mc.amalthea.model.ChannelSend;
+import org.eclipse.app4mc.amalthea.model.InterProcessStimulus;
+import org.eclipse.app4mc.amalthea.model.InterProcessTrigger;
+import org.eclipse.app4mc.amalthea.model.Runnable;
+import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGTranslationUnit;
import org.eclipse.app4mc.slg.commons.m2t.transformers.sw.RunnableTransformer;
import org.eclipse.app4mc.slg.ros2.generators.RosRunnableGenerator;
-import org.eclipse.app4mc.slg.ros2.generators.RosRunnableTranslationUnit;
+import org.eclipse.app4mc.slg.ros2.transformers.utils.Utils;
import org.eclipse.app4mc.transformation.util.OutputBuffer;
-import org.eclipse.xtext.xbase.lib.CollectionLiterals;
import com.google.inject.Inject;
public class RosRunnableTransformer extends RunnableTransformer {
+ public static final String LIB_NAME = "RUNNABLES_LIB";
+ public static final String BASE_PATH = "synthetic_gen";
+ public static final String MODULE_NAME = "runnables";
+ public static final String MODULE_PATH = BASE_PATH + "/" + MODULE_NAME;
+ public static final String MAKEFILE_PATH = MODULE_PATH + "/CMakeLists.txt";
+
@Inject private OutputBuffer outputBuffer;
- @Inject private RosActivityGraphItemTransformer psCallGraphItemTransformer;
-
- private final HashMap<ArrayList<?>, RunnableTranslationUnit> cache = CollectionLiterals.newHashMap();
+ @Inject private RosActivityGraphItemTransformer activityGraphItemTransformer;
+ @Inject private RosRunnableCache rosRunnableCache;
@Override
- public RunnableTranslationUnit transform(final org.eclipse.app4mc.amalthea.model.Runnable runnable) {
- final ArrayList<?> key = CollectionLiterals.newArrayList(runnable);
- final RosRunnableTranslationUnit _result;
- synchronized (cache) {
- if (cache.containsKey(key)) {
- return cache.get(key);
- }
- RosRunnableTranslationUnit tu = new RosRunnableTranslationUnit(this.outputBuffer,
- this.psCallGraphItemTransformer, runnable);
- _result = tu;
- cache.put(key, _result);
+ public void genFiles(SLGTranslationUnit tu, Runnable runnable) {
+ if (isSrcFileEmpty(tu)) { // all stuff only required once regardless of runnable instance
+ srcAppend(tu, "#include \"" + getIncFile(tu) + "\"\n");
}
- _init_transform(_result, runnable);
- return _result;
+ final HashSet<String> includes = new LinkedHashSet<>();
+ final List<String> calls = new ArrayList<>();
+
+ boolean measurePerformance = false;
+ if (runnable != null && runnable.getCustomProperties().get("measure_performance") instanceof BooleanObject) {
+ measurePerformance = ((BooleanObject) runnable.getCustomProperties().get("measure_performance")).isValue();
+ }
+
+ if (measurePerformance) {
+ includes.add("aml.h");
+ }
+
+ // Compute characteristic values of runnable
+
+ String param = "";
+ String nodeParam = "";
+ final List<String> publishers = new ArrayList<>();
+ final List<String> clientDeclarations = new ArrayList<>();
+ final List<String> clientInits = new ArrayList<>();
+
+ if (runnable != null && runnable.getActivityGraph() != null) {
+ for (ActivityGraphItem item : runnable.getActivityGraph().getItems()) {
+
+ final SLGTranslationUnit graphItemTU = activityGraphItemTransformer.transform(item);
+ String graphItemIncFile = getIncFile(graphItemTU);
+ if (graphItemIncFile != null && !graphItemIncFile.isEmpty() && !getIncFile(tu).equals(graphItemIncFile)) {
+ includes.add(graphItemIncFile);
+ }
+
+ // check if item is publisher
+
+ if (item instanceof ChannelSend) {
+ ChannelSend cs = (ChannelSend) item;
+ Channel data = cs.getData();
+
+ publishers.add(data.getName() + "_publisher");
+
+ nodeParam = nodeParam + ((nodeParam.equals("")) ? "" : ";") + data.getName() + "_publisher";
+ param = ((param.equals("")) ? "" : ";") + "rclcpp::Publisher<std_msgs::msg::String>::SharedPtr& "
+ + data.getName() + "_publisher";
+ }
+
+ if (item instanceof InterProcessTrigger) {
+ InterProcessTrigger trigger = (InterProcessTrigger) item;
+ InterProcessStimulus stimulus = trigger.getStimulus();
+
+ includes.add(stimulus.getName() + "_service/srv/" + stimulus.getName() + "_service" + ".hpp");
+ clientDeclarations.add(
+ "rclcpp::Client<" + stimulus.getName() + "_service::srv::"
+ + Utils.toIdlCompliantName(stimulus.getName() + "_service")
+ + ">::SharedPtr " + stimulus.getName() + "_client");
+ clientInits.add(
+ stimulus.getName() + "_client = this->create_client<" + stimulus.getName() + "_service::srv::"
+ + Utils.toIdlCompliantName(stimulus.getName() + "_service") + ">"
+ + "(\"" + stimulus.getName() + "_service\")");
+ nodeParam = nodeParam + (nodeParam.equals("") ? "" : ";") + stimulus.getName() + "_client";
+ param = (param.equals("") ? "" : ";") + "rclcpp::Client<"
+ + stimulus.getName() + "_service::srv::" + Utils.toIdlCompliantName(stimulus.getName() + "_service")
+ + ">::SharedPtr& " + stimulus.getName() + "_client";
+ }
+
+ final String call = graphItemTU.getCall();
+ if (call != null && !call.isEmpty()) {
+ calls.add(call);
+ }
+ }
+ }
+
+ // store characteristic values in runnable cache
+ rosRunnableCache.storeValues(tu, runnable, param, nodeParam, publishers, clientDeclarations, clientInits);
+
+ String fullCall = "run_" + runnable.getName() + "(" + param + ")";
+
+ // write header
+ incAppend(tu, "\n//Runnable " + runnable.getName() + "----\n");
+ toH(tu, includes, fullCall);
+
+ // write body
+ srcAppend(tu, "\n//Runnable " + runnable.getName() + "----\n");
+ toCpp(tu, runnable.getName(), fullCall, calls, measurePerformance);
}
-
- private void _init_transform(final RosRunnableTranslationUnit it,
- final org.eclipse.app4mc.amalthea.model.Runnable runnable) {
+ private void toH(SLGTranslationUnit tu, final HashSet<String> includes, final String fullCall) {
+ for (String include : includes) {
+ incAppend(tu, "#include \"" + include + "\"\n");
+ }
+ incAppend(tu, "void " + fullCall + ";\n");
}
- @Override
- public Map<ArrayList<?>, ? extends TranslationUnit> getCache() {
- return this.cache;
+ private void toCpp(SLGTranslationUnit tu, final String runnableName, final String fullCall, final List<String> calls, boolean measurePerformance) {
+ srcAppend(tu, "void " + fullCall + "{\n");
+ if (measurePerformance) {
+ srcAppend(tu,
+ "uint64_t event_list[] = {0x11, 0x13, 0x17}; //CPU CYCLES, MEM ACCESS, L2 Cache Refill\n"
+ + "int total_events = sizeof(event_list)/sizeof(event_list[0]);\n"
+ + "int fd = instrument_start(0,event_list, total_events);\n");
+ }
+
+ for (String call : calls) {
+ srcAppend(tu, "\t" + call + ";\n");
+ }
+
+ if (measurePerformance) {
+ srcAppend(tu, "instrument_stop(fd, \"" + runnableName + ".log\");\n");
+ }
+ srcAppend(tu, "}\n\n");
}
@Override
public boolean createCMake() {
return outputBuffer.appendTo(
- "OTHER",
- RosRunnableTranslationUnit.getMakeFilePathStatic(),
- RosRunnableGenerator.toCMake(RosRunnableTranslationUnit.getLibName(), getSrcFiles()));
+ "OTHER", MAKEFILE_PATH, RosRunnableGenerator.toCMake(LIB_NAME, getSrcFiles()));
}
}
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosTaskCache.java b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosTaskCache.java
new file mode 100644
index 0000000..f7a44bb
--- /dev/null
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosTaskCache.java
@@ -0,0 +1,121 @@
+/**
+ ********************************************************************************
+ * Copyright (c) 2020-2021 Robert Bosch GmbH.
+ *
+ * This program and the accompanying materials are made
+ * available under the terms of the Eclipse Public License 2.0
+ * which is available at https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * Robert Bosch GmbH - initial API and implementation
+ * *******************************************************************************
+ */
+
+package org.eclipse.app4mc.slg.ros2.transformers.sw;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.app4mc.amalthea.model.Stimulus;
+import org.eclipse.app4mc.amalthea.model.Task;
+import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGTranslationUnit;
+import org.eclipse.app4mc.slg.ros2.generators.RosTaskGenerator;
+
+import com.google.inject.Singleton;
+
+@Singleton
+public class RosTaskCache {
+
+ private Map<SLGTranslationUnit, TaskStore> cache = new HashMap<>();
+
+ public TaskStore getStore(SLGTranslationUnit tu) {
+ return cache.get(tu);
+ }
+
+ public void storeValues(SLGTranslationUnit tu, Task task, Collection<Stimulus> stimuli,
+ Collection<String> includes, Collection<String> initCalls, Collection<String> stepCalls,
+ Collection<String> publishers, Collection<String> clientDeclarations, Collection<String> clientInits) {
+ TaskStore store = new TaskStore(task, stimuli, includes, initCalls, stepCalls, publishers, clientDeclarations, clientInits);
+ cache.put(tu, store);
+ }
+
+ public class TaskStore {
+ private final Task task;
+ private final Collection<Stimulus> stimuli;
+ private final Collection<String> includes;
+ private final Collection<String> initCalls;
+ private final Collection<String> stepCalls;
+ private final Collection<String> publishers;
+ private final Collection<String> clientDeclarations;
+ private final Collection<String> clientInits;
+
+ public TaskStore(Task task, Collection<Stimulus> stimuli,
+ Collection<String> includes, Collection<String> initCalls, Collection<String> stepCalls,
+ Collection<String> publishers, Collection<String> clientDeclarations, Collection<String> clientInits) {
+ this.task = task;
+ this.stimuli = stimuli;
+ this.includes = includes;
+ this.initCalls = initCalls;
+ this.stepCalls = stepCalls;
+ this.publishers = publishers;
+ this.clientDeclarations = clientDeclarations;
+ this.clientInits = clientInits;
+ }
+
+ public Task getTask() {
+ return task;
+ }
+
+ public Collection<Stimulus> getStimuli() {
+ return stimuli;
+ }
+
+ public Collection<String> getIncludes() {
+ return includes;
+ }
+
+ public Collection<String> getInitCalls() {
+ return initCalls;
+ }
+
+ public Collection<String> getStepCalls() {
+ return stepCalls;
+ }
+
+ public Collection<String> getPublishers() {
+ return publishers;
+ }
+
+ public Collection<String> getClientDeclarations() {
+ return clientDeclarations;
+ }
+
+ public Collection<String> getClientInits() {
+ return clientInits;
+ }
+
+ public String getDeclaration() {
+ return RosTaskGenerator.getDeclaration(stimuli, publishers, clientDeclarations);
+ }
+
+ public String getInitialisation(String nodeName) {
+ return RosTaskGenerator.getInitialisation(nodeName, stimuli, publishers, clientInits);
+ }
+
+ public String getServiceCallback() {
+ return RosTaskGenerator.getServiceCallback(stimuli, stepCalls);
+ }
+
+ public String getCallback() {
+ return RosTaskGenerator.getCallback(stimuli, stepCalls);
+ }
+
+ public String getHeaders() {
+ return RosTaskGenerator.getHeaders(includes);
+ }
+ }
+
+}
diff --git a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosTaskTransformer.java b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosTaskTransformer.java
index 03e16e6..117423a 100644
--- a/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosTaskTransformer.java
+++ b/load_generator/ros2/plugins/org.eclipse.app4mc.slg.ros2/src/org/eclipse/app4mc/slg/ros2/transformers/sw/RosTaskTransformer.java
@@ -16,18 +16,25 @@
package org.eclipse.app4mc.slg.ros2.transformers.sw;
import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Map;
+import java.util.LinkedHashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
-import org.eclipse.app4mc.amalthea.model.Component;
+import org.eclipse.app4mc.amalthea.model.ActivityGraphItem;
+import org.eclipse.app4mc.amalthea.model.Group;
+import org.eclipse.app4mc.amalthea.model.ITaggable;
+import org.eclipse.app4mc.amalthea.model.InterProcessStimulus;
+import org.eclipse.app4mc.amalthea.model.Runnable;
+import org.eclipse.app4mc.amalthea.model.RunnableCall;
+import org.eclipse.app4mc.amalthea.model.Stimulus;
+import org.eclipse.app4mc.amalthea.model.Tag;
import org.eclipse.app4mc.amalthea.model.Task;
-import org.eclipse.app4mc.slg.commons.m2t.generators.TaskTranslationUnit;
-import org.eclipse.app4mc.slg.commons.m2t.generators.TranslationUnit;
+import org.eclipse.app4mc.slg.commons.m2t.transformers.SLGTranslationUnit;
import org.eclipse.app4mc.slg.commons.m2t.transformers.sw.TaskTransformer;
-import org.eclipse.app4mc.slg.ros2.generators.RosTaskTranslationUnit;
+import org.eclipse.app4mc.slg.ros2.generators.RosLabelGenerator;
import org.eclipse.app4mc.slg.ros2.transformers.stimuli.RosInterProcessStimulusTransformer;
-import org.eclipse.app4mc.transformation.util.OutputBuffer;
-import org.eclipse.xtext.xbase.lib.CollectionLiterals;
+import org.eclipse.app4mc.slg.ros2.transformers.sw.RosRunnableCache.RunnableStore;
import com.google.inject.Inject;
import com.google.inject.Singleton;
@@ -35,36 +42,110 @@
@Singleton
public class RosTaskTransformer extends TaskTransformer {
- @Inject private OutputBuffer outputBuffer;
- @Inject private RosLabelTransformer rosTransformerLabel;
- @Inject private RosRunnableTransformer rosTransformerRunnable;
- @Inject private RosInterProcessStimulusTransformer ipStimulusTransformer;
-
- private final HashMap<ArrayList<?>, TaskTranslationUnit> cache = CollectionLiterals.newHashMap();
+ @Inject private RosLabelTransformer rosLabelTransformer;
+ @Inject private RosRunnableTransformer rosRunnableTransformer;
+ @Inject private RosRunnableCache rosRunnableCache;
+ @Inject private RosInterProcessStimulusTransformer rosInterProcessStimulusTransformer;
+ @Inject private RosTaskCache rosTaskCache;
@Override
- public TaskTranslationUnit transform(final Task task, final Component component) {
- final ArrayList<?> key = CollectionLiterals.newArrayList(task, component);
- final RosTaskTranslationUnit _result;
- synchronized (cache) {
- if (cache.containsKey(key)) {
- return cache.get(key);
+ public void genFiles(SLGTranslationUnit tu, Task task) {
+
+ final Set<String> includes = new LinkedHashSet<>();
+ final List<String> initCalls = new LinkedList<>();
+ final List<String> stepCalls = new LinkedList<>();
+ final List<Stimulus> stimuli = new ArrayList<>();
+ final List<String> publishers = new ArrayList<>();
+ final List<String> clientDeclarations = new ArrayList<>();
+ final List<String> clientInits = new ArrayList<>();
+
+ if (task != null && task.getActivityGraph() != null) {
+ for (ActivityGraphItem item : task.getActivityGraph().getItems()) {
+
+ if ((item instanceof RunnableCall)) {
+ final RunnableCall runnableCall = (RunnableCall) item;
+ final Runnable runnable = runnableCall.getRunnable();
+
+ SLGTranslationUnit runnableTU = rosRunnableTransformer.transform(runnable);
+ RunnableStore runnableStore = rosRunnableCache.getStore(runnableTU);
+
+ includes.add(getIncFile(runnableTU));
+
+ if (hasTagNamed(runnableCall, "initialize")) {
+ initCalls.add(runnableStore.getNodeCall());
+ } else {
+ stepCalls.add(runnableStore.getNodeCall());
+ }
+
+ // TODO: Make set
+ publishers.addAll(runnableStore.getPublishers());
+ clientDeclarations.addAll(runnableStore.getClientDeclarations());
+ clientInits.addAll(runnableStore.getClientInits());
+ // TODO: add terminate function, if requested
+
+ } else if (item instanceof Group) {
+ final Group group = ((Group) item);
+ for (ActivityGraphItem groupitem : group.getItems()) {
+ if ((groupitem instanceof RunnableCall)) {
+ final RunnableCall runnableCall = (RunnableCall) groupitem;
+ final Runnable runnable = runnableCall.getRunnable();
+
+ SLGTranslationUnit runnableTU = rosRunnableTransformer.transform(runnable);
+ RunnableStore runnableStore = rosRunnableCache.getStore(runnableTU);
+
+ includes.add(getIncFile(runnableTU));
+
+ if (hasTagNamed(runnableCall, "initialize")) {
+ initCalls.add(runnableStore.getNodeCall());
+ } else {
+ stepCalls.add(runnableStore.getNodeCall());
+ }
+ // TODO: add terminate function, if requested
+ }
+ }
+ }
}
- RosTaskTranslationUnit _rosTaskTranslationUnit = new RosTaskTranslationUnit(this.outputBuffer,
- this.rosTransformerRunnable, this.rosTransformerLabel, this.ipStimulusTransformer, task, component);
- _result = _rosTaskTranslationUnit;
- cache.put(key, _result);
}
- _init_transform(_result, task, component);
- return _result;
+
+ // labels must be initialized before usage, generated labels provide this method
+
+ for (SLGTranslationUnit labelTU : rosLabelTransformer.getCache().values()) {
+ includes.add(getIncFile(labelTU));
+ initCalls.add(RosLabelGenerator.initCall(labelTU.getCall()));
+ }
+
+// rosLabelTransformer.getCache().forEach(
+// (BiConsumer<ArrayList<?>, LabelTranslationUnit>) (ArrayList<?> label, LabelTranslationUnit tu) -> {
+//
+// });
+
+ // add header for srv file in case of an interprocessstimulus
+ // create .srv file for the messages to be translated
+
+ if (task != null) {
+ for (Stimulus stimulus : task.getStimuli()) {
+ if (stimulus instanceof InterProcessStimulus) {
+ String name = stimulus.getName();
+ includes.add(name + "_service/srv/" + name + "_service.hpp");
+
+ rosInterProcessStimulusTransformer.transform(((InterProcessStimulus) stimulus));
+ }
+ }
+
+ stimuli.addAll(task.getStimuli());
+ }
+
+ // store characteristic values in task cache
+ rosTaskCache.storeValues(tu, task, stimuli, includes, initCalls, stepCalls, publishers, clientDeclarations, clientInits);
+
}
- private void _init_transform(final RosTaskTranslationUnit it, final Task task, final Component component) {
- }
-
- @Override
- public Map<ArrayList<?>, ? extends TranslationUnit> getCache() {
- return this.cache;
+ private boolean hasTagNamed(ITaggable element, String name) {
+ for (Tag tag : element.getTags()) {
+ if (tag.getName().equals(name))
+ return true;
+ }
+ return false;
}
}