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