[SystemCSim] added support for distributed submodels (sw, hw, mapping ...)
Signed-off-by: Sebastian Reiser <Sebastian.Reiser@de.bosch.com>
diff --git a/simulation_generator/app4mc.sim/plugins/org.eclipse.app4mc.amlt2systemc.m2t/src/org/eclipse/app4mc/amlt2systemc/m2t/transformers/AmaltheaModel2TextTransformer.java b/simulation_generator/app4mc.sim/plugins/org.eclipse.app4mc.amlt2systemc.m2t/src/org/eclipse/app4mc/amlt2systemc/m2t/transformers/AmaltheaModel2TextTransformer.java
index 9c4f351..cf1178e 100644
--- a/simulation_generator/app4mc.sim/plugins/org.eclipse.app4mc.amlt2systemc.m2t/src/org/eclipse/app4mc/amlt2systemc/m2t/transformers/AmaltheaModel2TextTransformer.java
+++ b/simulation_generator/app4mc.sim/plugins/org.eclipse.app4mc.amlt2systemc.m2t/src/org/eclipse/app4mc/amlt2systemc/m2t/transformers/AmaltheaModel2TextTransformer.java
@@ -45,16 +45,20 @@
this.outputBuffer.configureFiletype("INC", ".h", "// This code was generated for simulation with app4mc.sim\n\n#pragma once\n\n", null);
this.outputBuffer.configureFiletype("OTHER", "", "", "");
+ ArrayList<Amalthea> amaltheas = new ArrayList<Amalthea>();
for (final Resource resource : inputResourceSet.getResources()) {
for (final EObject model : resource.getContents()) {
logger.info("Processing file : {0}", resource.getURI());
-
+
if ((model instanceof Amalthea)) {
- this.amaltheaTransformer.transform(((Amalthea) model));
+ amaltheas.add((Amalthea) model);
}
}
}
+
+ //transform models
+ this.amaltheaTransformer.transform(amaltheas.toArray(new Amalthea[amaltheas.size()]));
logger.info("Generating cmake");
diff --git a/simulation_generator/app4mc.sim/plugins/org.eclipse.app4mc.amlt2systemc.m2t/src/org/eclipse/app4mc/amlt2systemc/m2t/transformers/AmaltheaTransformer.xtend b/simulation_generator/app4mc.sim/plugins/org.eclipse.app4mc.amlt2systemc.m2t/src/org/eclipse/app4mc/amlt2systemc/m2t/transformers/AmaltheaTransformer.xtend
index cf40baa..48567d8 100644
--- a/simulation_generator/app4mc.sim/plugins/org.eclipse.app4mc.amlt2systemc.m2t/src/org/eclipse/app4mc/amlt2systemc/m2t/transformers/AmaltheaTransformer.xtend
+++ b/simulation_generator/app4mc.sim/plugins/org.eclipse.app4mc.amlt2systemc.m2t/src/org/eclipse/app4mc/amlt2systemc/m2t/transformers/AmaltheaTransformer.xtend
@@ -16,6 +16,7 @@
package org.eclipse.app4mc.amlt2systemc.m2t.transformers
import com.google.inject.Inject
+import com.google.inject.Singleton
import org.eclipse.app4mc.amalthea.model.Amalthea
import org.eclipse.app4mc.amalthea.model.util.ModelUtil
import org.eclipse.app4mc.amlt2systemc.m2t.module.BaseTransformer
@@ -28,9 +29,11 @@
import org.eclipse.app4mc.amlt2systemc.m2t.transformers.os.OsModelTransformer
import org.eclipse.app4mc.amlt2systemc.m2t.transformers.stimuli.StimuliModelTransformer
import org.eclipse.app4mc.amlt2systemc.m2t.transformers.sw.SWModelTransformer
+import org.eclipse.app4mc.amlt2systemc.m2t.utils.TuSort
import org.eclipse.app4mc.transformation.util.OutputBuffer
import org.eclipse.app4mc.util.sessionlog.SessionLogger
+@Singleton
class AmaltheaTransformer extends BaseTransformer {
@Inject OutputBuffer outputBuffer
@@ -54,18 +57,27 @@
return getModulePath() + "/amalthea"
}
- def void transform(Amalthea amalthea) {
-
- if (amalthea === null) {
- logger.error("Input Amalthea model invalid (received null).")
+ def void transform(Amalthea[] amaltheas) {
+ if (amaltheas === null || amaltheas.empty) {
+ logger.error("Input Amalthea model(s) invalid (received null).")
return
}
+
+ //make sure all submodels are present in at least one input model
+ //Note: chose index 0 at will, any list element would do just fine
+ adjustModel(amaltheas.get(0))
- adjustModel(amalthea)
+ swModelTransformer.transform(amaltheas.map[it.swModel])
+ hwModelTransformer.transform(amaltheas.map[it.hwModel])
+ mappingModelTransformer.transform(amaltheas.map[it.mappingModel])
+ osModelTransformer.transform(amaltheas.map[it.osModel])
+ eventModelTransformer.transform(amaltheas.map[it.eventModel])
+ stimuliModelTransformer.transform(amaltheas.map[it.stimuliModel])
- outputBuffer.appendTo("INC", getModuleName(), toH(amalthea))
- outputBuffer.appendTo("SRC", getModuleName(), toCpp(amalthea))
+ outputBuffer.appendTo("INC", getModuleName(), toH())
+ outputBuffer.appendTo("SRC", getModuleName(), toCpp())//swModels, hwModels, mappingModels, osModels, eventModels, stimuliModels))
outputBuffer.appendTo("OTHER", getModulePath() + "/CMakeLists.txt", getCMake());
+
}
private def void adjustModel(Amalthea amalthea) {
@@ -78,95 +90,115 @@
ModelUtil.getOrCreateStimuliModel(amalthea);
}
- private def String toH(Amalthea amalthea) '''
+ private def String toH() '''
//top level header
'''
- private def String toCpp(Amalthea amalthea) '''
- #include "APP4MCsim.h"
- #include "Tracer/Tracer.h"
- #include "Tracer/BTFTracer.h"
-
- #include "«getModuleName()».h"
- //include model elements
- #include "«swModelTransformer.transform(ModelUtil.getOrCreateSwModel(amalthea)).module».h"
- #include "«hwModelTransformer.transform(ModelUtil.getOrCreateHwModel(amalthea)).module».h"
- #include "«mappingModelTransformer.transform(ModelUtil.getOrCreateMappingModel(amalthea)).module».h"
- #include "«osModelTransformer.transform(ModelUtil.getOrCreateOsModel(amalthea)).module».h"
- #include "«eventModelTransformer.transform(ModelUtil.getOrCreateEventModel(amalthea)).module».h"
- #include "«stimuliModelTransformer.transform(ModelUtil.getOrCreateStimuliModel(amalthea)).module».h"
-
-
- //include processing units and memories for tracing -----
- «FOR tu: processingUnitTransformer.cache.values»
- #include "«tu.module».h"
- «ENDFOR»
- «FOR tu: memoryTransformer.cache.values»
- #include "«tu.module».h"
- «ENDFOR»
- // tracing includes -----------------
-
- INITIALIZE_EASYLOGGINGPP;
-
- int sc_main(int argc, char *argv[]) {
- //static code ----------------------
- START_EASYLOGGINGPP(argc, argv);
- sc_core::sc_set_time_resolution(1.0,sc_core::SC_NS);
- //end static code ------------------
-
- /* Hardware */
- «hwModelTransformer.transform(amalthea.hwModel).call»;
-
- /* Software */
- «swModelTransformer.transform(amalthea.swModel).call»;
-
- /* OS */
- «osModelTransformer.transform(amalthea.osModel).call»;
-
-
- /* Mapping */
- «mappingModelTransformer.transform(amalthea.mappingModel).call»;
+ private def String toCpp()'''
+ #include "APP4MCsim.h"
+ #include "Tracer/Tracer.h"
+ #include "Tracer/BTFTracer.h"
- /* Event */
- «eventModelTransformer.transform(amalthea.eventModel).call»;
-
- /* Stimuli */
- «stimuliModelTransformer.transform(amalthea.stimuliModel).call»;
-
- «val tracerProperty = super.getProperty("tracer", "BtfTracer")»
- auto tracer = std::make_shared<«tracerProperty»>();
- TraceManager::setTracer(tracer);
+ #include "«getModuleName()».h"
+ //include model elements
+ «FOR obj : TuSort.byModule(swModelTransformer.cache.values)»
+ #include "«obj.module».h"
+ «ENDFOR»
+ «FOR obj : TuSort.byModule(hwModelTransformer.cache.values)»
+ #include "«obj.module».h"
+ «ENDFOR»
+ «FOR obj : TuSort.byModule(osModelTransformer.cache.values)»
+ #include "«obj.module».h"
+ «ENDFOR»
+ «FOR obj : TuSort.byModule(mappingModelTransformer.cache.values)»
+ #include "«obj.module».h"
+ «ENDFOR»
+ «FOR obj : TuSort.byModule(eventModelTransformer.cache.values)»
+ #include "«obj.module».h"
+ «ENDFOR»
+ «FOR obj : TuSort.byModule(stimuliModelTransformer.cache.values)»
+ #include "«obj.module».h"
+ «ENDFOR»
- //static code ----------------------
- sc_core::sc_trace_file *tf = sc_core::sc_create_vcd_trace_file("trace");
-
- //trace processing units and memories -----
+ //include processing units and memories for tracing -----
«FOR tu: processingUnitTransformer.cache.values»
- sc_trace(tf, &*«tu.call»(), "«tu.module.replaceAll("/", "_")»");
+ #include "«tu.module».h"
«ENDFOR»
«FOR tu: memoryTransformer.cache.values»
- sc_trace(tf, &*«tu.call»(), "«tu.module.replaceAll("/", "_")»");
- «ENDFOR»
+ #include "«tu.module».h"
+ «ENDFOR»
+ // tracing includes -----------------
- //run simulation
- try {
- «val simDuration = super.getProperty("simDurationInMS", "1000")»
- sc_core::sc_start(«simDuration», sc_core::SC_MS);
+ INITIALIZE_EASYLOGGINGPP;
+
+ int sc_main(int argc, char *argv[]) {
+ //static code ----------------------
+ START_EASYLOGGINGPP(argc, argv);
+ sc_core::sc_set_time_resolution(1.0,sc_core::SC_NS);
+ //end static code ------------------
+
+ /* Software */
+ «FOR obj : TuSort.byModule(swModelTransformer.cache.values)»
+ «obj.call»;
+ «ENDFOR»
+ /* Hardware */
+ «FOR obj : TuSort.byModule(hwModelTransformer.cache.values)»
+ «obj.call»;
+ «ENDFOR»
+ /* OS */
+ «FOR obj : TuSort.byModule(osModelTransformer.cache.values)»
+ «obj.call»;
+ «ENDFOR»
+ /* Mapping */
+ «FOR obj : TuSort.byModule(mappingModelTransformer.cache.values)»
+ «obj.call»;
+ «ENDFOR»
+ /* Event */
+ «FOR obj : TuSort.byModule(eventModelTransformer.cache.values)»
+ «obj.call»;
+ «ENDFOR»
+ /* Stimuli */
+ «FOR obj : TuSort.byModule(stimuliModelTransformer.cache.values)»
+ «obj.call»;
+ «ENDFOR»
+
+ «val tracerProperty = super.getProperty("tracer", "BtfTracer")»
+ auto tracer = std::make_shared<«tracerProperty»>();
+ TraceManager::setTracer(tracer);
+
+ //static code ----------------------
+ sc_core::sc_trace_file *tf = sc_core::sc_create_vcd_trace_file("trace");
+
+ //trace processing units and memories -----
+ «FOR tu: processingUnitTransformer.cache.values»
+ sc_trace(tf, &*«tu.call»(), "«tu.module.replaceAll("/", "_")»");
+ «ENDFOR»
+ «FOR tu: memoryTransformer.cache.values»
+ sc_trace(tf, &*«tu.call»(), "«tu.module.replaceAll("/", "_")»");
+ «ENDFOR»
+
+ //run simulation
+ try {
+ «val simDuration = super.getProperty("simDurationInMS", "1000")»
+ sc_core::sc_start(«simDuration», sc_core::SC_MS);
+ }
+ catch (sc_core::sc_report e) {
+ const char* file = e.get_file_name();
+ const int line = e.get_line_number();
+ const char* msg = e.get_msg();
+ VLOG(0) << msg << "\nin file: " << file << "\nline: " << line;
+ return -1;
+ }
+
+ sc_core::sc_close_vcd_trace_file(tf);
+
+ VLOG(0) << " done ";
+ return 0;
}
- catch (sc_core::sc_report e) {
- const char* file = e.get_file_name();
- const int line = e.get_line_number();
- const char* msg = e.get_msg();
- VLOG(0) << msg << "\nin file: " << file << "\nline: " << line;
- return -1;
- }
+ '''
+
- sc_core::sc_close_vcd_trace_file(tf);
-
- VLOG(0) << " done ";
- return 0;
- }'''
def String getCMake() '''
include_directories(${PROJECT_SOURCE_DIR})
@@ -193,9 +225,9 @@
«ENDIF»
add_custom_target(model_execution
- COMMAND «getProperty(PropertyKeys.PROJECT_NAME)»
- WORKING_DIRECTORY "${MODEL_WORKING_DIR}"
- )
+ COMMAND «getProperty(PropertyKeys.PROJECT_NAME)»
+ WORKING_DIRECTORY "${MODEL_WORKING_DIR}"
+ )
'''
}
diff --git a/simulation_generator/app4mc.sim/plugins/org.eclipse.app4mc.amlt2systemc.m2t/src/org/eclipse/app4mc/amlt2systemc/m2t/transformers/event/EventModelTransformer.xtend b/simulation_generator/app4mc.sim/plugins/org.eclipse.app4mc.amlt2systemc.m2t/src/org/eclipse/app4mc/amlt2systemc/m2t/transformers/event/EventModelTransformer.xtend
index 302a31d..832e7c8 100644
--- a/simulation_generator/app4mc.sim/plugins/org.eclipse.app4mc.amlt2systemc.m2t/src/org/eclipse/app4mc/amlt2systemc/m2t/transformers/event/EventModelTransformer.xtend
+++ b/simulation_generator/app4mc.sim/plugins/org.eclipse.app4mc.amlt2systemc.m2t/src/org/eclipse/app4mc/amlt2systemc/m2t/transformers/event/EventModelTransformer.xtend
@@ -50,11 +50,12 @@
def create new TranslationUnit(
getModuleName(),
getFunctionDef()
- ) transform(EventModel eventModel) {
- // start transformation @ task level,
- // Note: generate referenced object (e.g. runnables) when referenced (eg. in a runnable call within the call graph)
- eventModel.events.forEach[eventsDispatcher.transform(it)]
-
+ ) transform(EventModel[] eventModels) {
+ eventModels.forEach[eventModel |{
+ // start transformation @ task level,
+ // Note: generate referenced object (e.g. runnables) when referenced (eg. in a runnable call within the call graph)
+ eventModel.events.forEach[eventsDispatcher.transform(it)]
+ }]
outputBuffer.appendTo("INC", it.module, toH())
outputBuffer.appendTo("SRC", it.module, toCpp())
outputBuffer.appendTo("OTHER", getModulePath() + "/CMakeLists.txt", getCMake(it.module));
@@ -101,4 +102,7 @@
"${PROJECT_SOURCE_DIR}/«thisModule».cpp")
'''
+ def getCache(){
+ return this._createCache_transform
+ }
}
diff --git a/simulation_generator/app4mc.sim/plugins/org.eclipse.app4mc.amlt2systemc.m2t/src/org/eclipse/app4mc/amlt2systemc/m2t/transformers/hw/HwModelTransformer.xtend b/simulation_generator/app4mc.sim/plugins/org.eclipse.app4mc.amlt2systemc.m2t/src/org/eclipse/app4mc/amlt2systemc/m2t/transformers/hw/HwModelTransformer.xtend
index 72b840c..9a61f84 100644
--- a/simulation_generator/app4mc.sim/plugins/org.eclipse.app4mc.amlt2systemc.m2t/src/org/eclipse/app4mc/amlt2systemc/m2t/transformers/hw/HwModelTransformer.xtend
+++ b/simulation_generator/app4mc.sim/plugins/org.eclipse.app4mc.amlt2systemc.m2t/src/org/eclipse/app4mc/amlt2systemc/m2t/transformers/hw/HwModelTransformer.xtend
@@ -19,11 +19,11 @@
import com.google.inject.Singleton
import org.eclipse.app4mc.amalthea.model.HWModel
import org.eclipse.app4mc.amlt2systemc.m2t.module.BaseTransformer
+import org.eclipse.app4mc.amlt2systemc.m2t.module.PropertyKeys
import org.eclipse.app4mc.amlt2systemc.m2t.transformers.AmaltheaTransformer
import org.eclipse.app4mc.amlt2systemc.m2t.transformers.TranslationUnit
-import org.eclipse.app4mc.transformation.util.OutputBuffer
import org.eclipse.app4mc.amlt2systemc.m2t.utils.TuSort
-import org.eclipse.app4mc.amlt2systemc.m2t.module.PropertyKeys
+import org.eclipse.app4mc.transformation.util.OutputBuffer
@Singleton
class HwModelTransformer extends BaseTransformer {
@@ -54,36 +54,42 @@
def create new TranslationUnit(
getModuleName(),
getFunctionDef()
- ) transform(HWModel hwModel) {
+ ) transform(HWModel[] hwModels) {
+ hwModels.forEach[hwModel | {
+ hwModel.structures.forEach[structure |{
+ hwStructureTransformer.transform(structure)
+ }]
+ }]
// start transformation @ task level,
// Note: generate referenced object (e.g. runnables) when referenced (eg. in a runnable call within the call graph)
- outputBuffer.appendTo("INC", it.module, toH(hwModel))
- outputBuffer.appendTo("SRC", it.module, toCpp(hwModel))
+ outputBuffer.appendTo("INC", it.module, toH())
+ outputBuffer.appendTo("SRC", it.module, toCpp())
val buf = getCMake(it.module);
outputBuffer.appendTo("OTHER", getModulePath() + "/CMakeLists.txt", buf);
}
- private def String toH(HWModel hwModel) '''
+ private def String toH() '''
#include <systemc>
#include <memory>
#include "Common.h"
#include "HardwareModel.h"
//include model elements
- «FOR structure : hwModel.structures»
- #include "«hwStructureTransformer.transform(structure).module».h"
+ «FOR structure : TuSort.byModule(hwStructureTransformer.cache.values)»
+ #include "«structure.module».h"
«ENDFOR»
+
void «getFunctionDef()»;
'''
- private def String toCpp(HWModel hwModel) '''
+ private def String toCpp() '''
#include "«getModuleName».h"
/* Hardware */
void «getFunctionDef()»{
- «FOR structure : hwModel.structures»
- «hwStructureTransformer.transform(structure).call»();
+ «FOR structure : TuSort.byModule(hwStructureTransformer.cache.values)»
+ «structure.call»();
«ENDFOR»
}
'''
@@ -96,46 +102,51 @@
target_sources («getProperty(PropertyKeys.PROJECT_NAME)» PRIVATE
#features
- «FOR obj : TuSort.byModule(hwFeatureTransformer.cache.values)»
- "${PROJECT_SOURCE_DIR}/«(obj as TranslationUnit).module».cpp"
- «ENDFOR»
+ «FOR obj : TuSort.byModule(hwFeatureTransformer.cache.values)»
+ "${PROJECT_SOURCE_DIR}/«(obj as TranslationUnit).module».cpp"
+ «ENDFOR»
#definitions
- «FOR obj : TuSort.byModule(processingUnitDefinitionTransformer.cache.values)»
- "${PROJECT_SOURCE_DIR}/«(obj as TranslationUnit).module».cpp"
- «ENDFOR»
+ «FOR obj : TuSort.byModule(processingUnitDefinitionTransformer.cache.values)»
+ "${PROJECT_SOURCE_DIR}/«(obj as TranslationUnit).module».cpp"
+ «ENDFOR»
#domains
- «FOR obj : TuSort.byModule(frequencyDomainTransformer.cache.values)»
- "${PROJECT_SOURCE_DIR}/«(obj as TranslationUnit).module».cpp"
- «ENDFOR»
+ «FOR obj : TuSort.byModule(frequencyDomainTransformer.cache.values)»
+ "${PROJECT_SOURCE_DIR}/«(obj as TranslationUnit).module».cpp"
+ «ENDFOR»
+
#hw structure
- «FOR obj : TuSort.byModule(hwStructureTransformer.cache.values)»
- "${PROJECT_SOURCE_DIR}/«(obj as TranslationUnit).module».cpp"
- «ENDFOR»
-
- # modules
- «FOR obj : TuSort.byModule(memoryTransformer.cache.values)»
- "${PROJECT_SOURCE_DIR}/«(obj as TranslationUnit).module».cpp"
- «ENDFOR»
- «FOR obj : TuSort.byModule(processingUnitTransformer.cache.values)»
- "${PROJECT_SOURCE_DIR}/«(obj as TranslationUnit).module».cpp"
- «ENDFOR»
- «FOR obj : TuSort.byModule(connectionHandlerTransformer.cache.values)»
- "${PROJECT_SOURCE_DIR}/«(obj as TranslationUnit).module».cpp"
- «ENDFOR»
-
+ «FOR obj : TuSort.byModule(hwStructureTransformer.cache.values)»
+ "${PROJECT_SOURCE_DIR}/«(obj as TranslationUnit).module».cpp"
+ «ENDFOR»
+
+ # modules
+ «FOR obj : TuSort.byModule(memoryTransformer.cache.values)»
+ "${PROJECT_SOURCE_DIR}/«(obj as TranslationUnit).module».cpp"
+ «ENDFOR»
+ «FOR obj : TuSort.byModule(processingUnitTransformer.cache.values)»
+ "${PROJECT_SOURCE_DIR}/«(obj as TranslationUnit).module».cpp"
+ «ENDFOR»
+ «FOR obj : TuSort.byModule(connectionHandlerTransformer.cache.values)»
+ "${PROJECT_SOURCE_DIR}/«(obj as TranslationUnit).module».cpp"
+ «ENDFOR»
+
#connections
«FOR obj : TuSort.byModule(hwConnectionTransformer.cache.values)»
"${PROJECT_SOURCE_DIR}/«(obj as TranslationUnit).module».cpp"
«ENDFOR»
-
+
#HW access elements
«FOR obj : TuSort.byModule(hwAccessElementTransformer.cache.values)»
"${PROJECT_SOURCE_DIR}/«(obj as TranslationUnit).module».cpp"
«ENDFOR»
- "${PROJECT_SOURCE_DIR}/«thisModule».cpp")
-
+
+ "${PROJECT_SOURCE_DIR}/«thisModule».cpp")
+
'''
-
+
+ def getCache(){
+ return this._createCache_transform
+ }
}
diff --git a/simulation_generator/app4mc.sim/plugins/org.eclipse.app4mc.amlt2systemc.m2t/src/org/eclipse/app4mc/amlt2systemc/m2t/transformers/mapping/MappingModelTransformer.xtend b/simulation_generator/app4mc.sim/plugins/org.eclipse.app4mc.amlt2systemc.m2t/src/org/eclipse/app4mc/amlt2systemc/m2t/transformers/mapping/MappingModelTransformer.xtend
index aecf005..cc4a4d7 100644
--- a/simulation_generator/app4mc.sim/plugins/org.eclipse.app4mc.amlt2systemc.m2t/src/org/eclipse/app4mc/amlt2systemc/m2t/transformers/mapping/MappingModelTransformer.xtend
+++ b/simulation_generator/app4mc.sim/plugins/org.eclipse.app4mc.amlt2systemc.m2t/src/org/eclipse/app4mc/amlt2systemc/m2t/transformers/mapping/MappingModelTransformer.xtend
@@ -49,15 +49,16 @@
def create new TranslationUnit(
getModuleName(),
getFunctionDef()
- ) transform(MappingModel mappingModel) {
-
- // start transformation @ task level,
- // Note: generate referenced object (e.g. runnables) when referenced (eg. in a runnable call within the call graph)
- mappingModel.memoryMapping.forEach[memMapping|memoryMappingTransformer.transform(memMapping)]
- mappingModel.taskAllocation.forEach[taskAllocation|taskAllocationTransformer.transform(taskAllocation)]
- mappingModel.schedulerAllocation.forEach [ schedulerAllocation |
- schedulerAllocationTransformer.transform(schedulerAllocation)
- ]
+ ) transform(MappingModel[] mappingModels) {
+ mappingModels.forEach[mappingModel | {
+ // start transformation @ task level,
+ // Note: generate referenced object (e.g. runnables) when referenced (eg. in a runnable call within the call graph)
+ mappingModel.memoryMapping.forEach[memMapping|memoryMappingTransformer.transform(memMapping)]
+ mappingModel.taskAllocation.forEach[taskAllocation|taskAllocationTransformer.transform(taskAllocation)]
+ mappingModel.schedulerAllocation.forEach [ schedulerAllocation |
+ schedulerAllocationTransformer.transform(schedulerAllocation)
+ ]
+ }]
outputBuffer.appendTo("INC", it.module, toH())
outputBuffer.appendTo("SRC", it.module, toCpp())
@@ -82,8 +83,7 @@
«FOR obj : TuSort.byModule(schedulerAllocationTransformer.cache.values)»
#include "«(obj as TranslationUnit).module».h"
«ENDFOR»
- void «getFunctionDef()»;
-
+ void «getFunctionDef()»;
'''
private def String toCpp() '''
@@ -123,4 +123,8 @@
«ENDFOR»
"${PROJECT_SOURCE_DIR}/«thisModule».cpp")
'''
+
+ def getCache(){
+ return this._createCache_transform
+ }
}
diff --git a/simulation_generator/app4mc.sim/plugins/org.eclipse.app4mc.amlt2systemc.m2t/src/org/eclipse/app4mc/amlt2systemc/m2t/transformers/os/OsModelTransformer.xtend b/simulation_generator/app4mc.sim/plugins/org.eclipse.app4mc.amlt2systemc.m2t/src/org/eclipse/app4mc/amlt2systemc/m2t/transformers/os/OsModelTransformer.xtend
index d2666f0..6c718cf 100644
--- a/simulation_generator/app4mc.sim/plugins/org.eclipse.app4mc.amlt2systemc.m2t/src/org/eclipse/app4mc/amlt2systemc/m2t/transformers/os/OsModelTransformer.xtend
+++ b/simulation_generator/app4mc.sim/plugins/org.eclipse.app4mc.amlt2systemc.m2t/src/org/eclipse/app4mc/amlt2systemc/m2t/transformers/os/OsModelTransformer.xtend
@@ -51,15 +51,21 @@
return "osModel_lib"
}
- def create new TranslationUnit(getModuleName(), getFunctionDef()) transform(OSModel osModel) {
+ def create new TranslationUnit(getModuleName(), getFunctionDef())
+ transform(OSModel[] osModels) {
+ osModels.forEach[osModel |{
+ osModel.operatingSystems.forEach[os |
+ operatingSystemTransformer.transform(os)
+ ]
+ }]
// start transformation @ task level,
// Note: generate referenced object (e.g. runnables) when referenced (eg. in a runnable call within the call graph)
- outputBuffer.appendTo("INC", it.module, toH(osModel))
- outputBuffer.appendTo("SRC", it.module, toCpp(osModel))
+ outputBuffer.appendTo("INC", it.module, toH())
+ outputBuffer.appendTo("SRC", it.module, toCpp())
outputBuffer.appendTo("OTHER", modulePath + "/" + "CMakeLists.txt", getCMake())
}
- private def String toH(OSModel osModel) '''
+ private def String toH() '''
#include <systemc>
#include <memory>
#include "Common.h"
@@ -69,18 +75,18 @@
'''
- private def String toCpp(OSModel osModel) '''
+ private def String toCpp() '''
#include "«getModuleName».h"
- «FOR os : osModel.operatingSystems»
- #include "«operatingSystemTransformer.transform(os).module».h"
+ «FOR os : TuSort.byModule(operatingSystemTransformer.cache.values)»
+ #include "«os.module».h"
«ENDFOR»
/* OS */
void «getFunctionDef()»{
- «FOR os : osModel.operatingSystems»
- «operatingSystemTransformer.transform(os).call»();
+ «FOR os : TuSort.byModule(operatingSystemTransformer.cache.values)»
+ «os.call»();
«ENDFOR»
}
'''
@@ -99,5 +105,9 @@
«ENDFOR»
"${PROJECT_SOURCE_DIR}/«moduleName».cpp")
'''
+
+ def getCache(){
+ return this._createCache_transform
+ }
}
diff --git a/simulation_generator/app4mc.sim/plugins/org.eclipse.app4mc.amlt2systemc.m2t/src/org/eclipse/app4mc/amlt2systemc/m2t/transformers/stimuli/StimuliModelTransformer.xtend b/simulation_generator/app4mc.sim/plugins/org.eclipse.app4mc.amlt2systemc.m2t/src/org/eclipse/app4mc/amlt2systemc/m2t/transformers/stimuli/StimuliModelTransformer.xtend
index 8564e91..c89ea4f 100644
--- a/simulation_generator/app4mc.sim/plugins/org.eclipse.app4mc.amlt2systemc.m2t/src/org/eclipse/app4mc/amlt2systemc/m2t/transformers/stimuli/StimuliModelTransformer.xtend
+++ b/simulation_generator/app4mc.sim/plugins/org.eclipse.app4mc.amlt2systemc.m2t/src/org/eclipse/app4mc/amlt2systemc/m2t/transformers/stimuli/StimuliModelTransformer.xtend
@@ -35,18 +35,15 @@
def create new TranslationUnit(
getModuleName(),
getFunctionDef()
- ) transform(StimuliModel stimuliModel) {
-
-
- // start transformation @ task level,
- // Note: generate referenced object (e.g. runnables) when referenced (eg. in a runnable call within the call graph)
- stimuliModel.stimuli.forEach[stimulusDispatcher.transform(it)]
-
+ ) transform(StimuliModel[] stimuliModels) {
+ stimuliModels.forEach[stimuliModel|{
+ stimuliModel.stimuli.forEach[stimulusDispatcher.transform(it)]
+ }]
outputBuffer.appendTo("INC", it.module, toH())
outputBuffer.appendTo("SRC", it.module, toCpp())
outputBuffer.appendTo("OTHER", getModulePath() + "/CMakeLists.txt", getCMake());
}
-
+
private def String toH() '''
#include <systemc>
#include <memory>
@@ -111,4 +108,8 @@
"${PROJECT_SOURCE_DIR}/«getModuleName()».cpp")
'''
+
+ def getCache(){
+ return this._createCache_transform
+ }
}
diff --git a/simulation_generator/app4mc.sim/plugins/org.eclipse.app4mc.amlt2systemc.m2t/src/org/eclipse/app4mc/amlt2systemc/m2t/transformers/sw/SWModelTransformer.xtend b/simulation_generator/app4mc.sim/plugins/org.eclipse.app4mc.amlt2systemc.m2t/src/org/eclipse/app4mc/amlt2systemc/m2t/transformers/sw/SWModelTransformer.xtend
index 490e46f..7013dd8 100644
--- a/simulation_generator/app4mc.sim/plugins/org.eclipse.app4mc.amlt2systemc.m2t/src/org/eclipse/app4mc/amlt2systemc/m2t/transformers/sw/SWModelTransformer.xtend
+++ b/simulation_generator/app4mc.sim/plugins/org.eclipse.app4mc.amlt2systemc.m2t/src/org/eclipse/app4mc/amlt2systemc/m2t/transformers/sw/SWModelTransformer.xtend
@@ -51,11 +51,14 @@
def create new TranslationUnit(
getModuleName(),
getFunctionDef()
- ) transform(SWModel swModel) {
+ ) transform(SWModel[] swModels) {
+
+ swModels.forEach[swModel | {
// start transformation @ task level,
// Note: generate referenced object (e.g. runnables) when referenced (eg. in a runnable call within the call graph)
- swModel.tasks.forEach[taskTransformer.transform(it)]
-
+ swModel.tasks.forEach[taskTransformer.transform(it)]
+ }]
+
outputBuffer.appendTo("INC", it.module, toH())
outputBuffer.appendTo("SRC", it.module, toCpp())
outputBuffer.appendTo("OTHER", getModulePath() + "/CMakeLists.txt", getCMake(it.module));
@@ -112,5 +115,9 @@
"${PROJECT_SOURCE_DIR}/«thisModule».cpp")
'''
+
+ def getCache(){
+ return this._createCache_transform
+ }
}