blob: c89ea4fca2ef9beda98ce8fce06afeaccf8b283c [file] [log] [blame]
package org.eclipse.app4mc.amlt2systemc.m2t.transformers.stimuli
import com.google.inject.Inject
import com.google.inject.Singleton
import org.eclipse.app4mc.amalthea.model.EventStimulus
import org.eclipse.app4mc.amalthea.model.InterProcessStimulus
import org.eclipse.app4mc.amalthea.model.PeriodicStimulus
import org.eclipse.app4mc.amalthea.model.RelativePeriodicStimulus
import org.eclipse.app4mc.amalthea.model.StimuliModel
import org.eclipse.app4mc.amlt2systemc.m2t.module.BaseTransformer
import org.eclipse.app4mc.amlt2systemc.m2t.transformers.AmaltheaTransformer
import org.eclipse.app4mc.amlt2systemc.m2t.transformers.TranslationUnit
import org.eclipse.app4mc.amlt2systemc.m2t.utils.TuSort
import org.eclipse.app4mc.transformation.util.OutputBuffer
import org.eclipse.app4mc.amlt2systemc.m2t.module.PropertyKeys
@Singleton
class StimuliModelTransformer extends BaseTransformer {
@Inject OutputBuffer outputBuffer
@Inject StimulusTransformer stimulusDispatcher
protected static def getModulePath() {
return AmaltheaTransformer.getModulePath() + "/stimuliModel"
}
private def getModuleName() {
return getModulePath + "/stimuliModel"
}
private def getFunctionDef() {
return "init_stimuliModel()"
}
def create new TranslationUnit(
getModuleName(),
getFunctionDef()
) 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>
void «getFunctionDef()»;
'''
private def String toCpp() '''
#include "«getModuleName».h"
#include "APP4MCsim.h"
//include model elements»
«FOR obj : TuSort.byModule(stimulusDispatcher.getCache(typeof(PeriodicStimulus)).values)»
#include "«(obj as TranslationUnit).module».h"
«ENDFOR»
«FOR obj : TuSort.byModule(stimulusDispatcher.getCache(typeof(RelativePeriodicStimulus)).values)»
#include "«(obj as TranslationUnit).module».h"
«ENDFOR»
«FOR obj : TuSort.byModule(stimulusDispatcher.getCache(typeof(InterProcessStimulus)).values)»
#include "«(obj as TranslationUnit).module».h"
«ENDFOR»
«FOR obj : TuSort.byModule(stimulusDispatcher.getCache(typeof(EventStimulus)).values)»
#include "«(obj as TranslationUnit).module».h"
«ENDFOR»
/* Software */
void «getFunctionDef()»{
«FOR obj : TuSort.byCall(stimulusDispatcher.getCache(typeof(PeriodicStimulus)).values)»
«(obj as TranslationUnit).call»;
«ENDFOR»
«FOR obj : TuSort.byCall(stimulusDispatcher.getCache(typeof(RelativePeriodicStimulus)).values)»
«(obj as TranslationUnit).call»;
«ENDFOR»
«FOR obj : TuSort.byCall(stimulusDispatcher.getCache(typeof(InterProcessStimulus)).values)»
«(obj as TranslationUnit).call»;
«ENDFOR»
«FOR obj : TuSort.byCall(stimulusDispatcher.getCache(typeof(EventStimulus)).values)»
«(obj as TranslationUnit).call»;
«ENDFOR»
}
'''
def String getCMake() '''
# CMakeList.txt: CMake project for StimuliModel of "«getProperty(PropertyKeys.PROJECT_NAME)»".
# Add sources of Stimuli
target_sources («getProperty(PropertyKeys.PROJECT_NAME)» PRIVATE
«FOR obj : TuSort.byModule(stimulusDispatcher.getCache(typeof(PeriodicStimulus)).values)»
"${PROJECT_SOURCE_DIR}/«(obj as TranslationUnit).module».cpp"
«ENDFOR»
«FOR obj : TuSort.byModule(stimulusDispatcher.getCache(typeof(RelativePeriodicStimulus)).values)»
"${PROJECT_SOURCE_DIR}/«(obj as TranslationUnit).module».cpp"
«ENDFOR»
«FOR obj : TuSort.byModule(stimulusDispatcher.getCache(typeof(InterProcessStimulus)).values)»
"${PROJECT_SOURCE_DIR}/«(obj as TranslationUnit).module».cpp"
«ENDFOR»
«FOR obj : TuSort.byModule(stimulusDispatcher.getCache(typeof(EventStimulus)).values)»
"${PROJECT_SOURCE_DIR}/«(obj as TranslationUnit).module».cpp"
«ENDFOR»
"${PROJECT_SOURCE_DIR}/«getModuleName()».cpp")
'''
def getCache(){
return this._createCache_transform
}
}