[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
+	}
 
 }