added transformation for while loops. Added an example model that uses nested while loops. Signed-off-by: Behnaz Pourmohseni <behnaz.pourmohseni@de.bosch.com> Signed-off-by: Reiser Sebastian <Sebastian.Reiser@de.bosch.com>
diff --git a/simulation_generator/app4mc.sim/examples/whileLoopExample/whileLoopExample.amxmi b/simulation_generator/app4mc.sim/examples/whileLoopExample/whileLoopExample.amxmi new file mode 100644 index 0000000..07f8977 --- /dev/null +++ b/simulation_generator/app4mc.sim/examples/whileLoopExample/whileLoopExample.amxmi
@@ -0,0 +1,95 @@ +<?xml version="1.0" encoding="UTF-8"?> +<am:Amalthea xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:am="http://app4mc.eclipse.org/amalthea/1.2.0"> + <swModel> + <tasks xmi:id="task_natSumCalculator?type=Task" name="task_natSumCalculator" stimuli="Timer_10MS?type=PeriodicStimulus" preemption="preemptive" multipleTaskActivationLimit="10"> + <activityGraph> + <items xsi:type="am:RunnableCall" runnable="runnable_loops?type=Runnable"/> + <items xsi:type="am:ModeLabelAccess" data="numericModeLabel_inputVar?type=ModeLabel" access="increment" value="" step="1"/> + </activityGraph> + </tasks> + <runnables xmi:id="runnable_loops?type=Runnable" name="runnable_loops" callback="false" service="false"> + <activityGraph> + <items xsi:type="am:ModeLabelAccess" data="numericModeLabel_outputNatSum?type=ModeLabel" access="set" value="0" step="1"/> + <items xsi:type="am:ModeLabelAccess" data="numericModeLabel_outerLoopParam?type=ModeLabel" access="set" value="0" step="1"/> + <items xsi:type="am:WhileLoop"> + <items xsi:type="am:ModeLabelAccess" data="numericModeLabel_innerLoopParam?type=ModeLabel" access="set" value="0" step="1"/> + <items xsi:type="am:WhileLoop"> + <items xsi:type="am:Ticks"> + <default xsi:type="am:DiscreteValueConstant" value="10"/> + </items> + <items xsi:type="am:ModeLabelAccess" data="numericModeLabel_innerLoopParam?type=ModeLabel" access="increment" step="1"/> + <items xsi:type="am:ModeLabelAccess" data="numericModeLabel_outputNatSum?type=ModeLabel" access="increment" step="1"/> + <condition> + <entries xsi:type="am:ModeLabelCondition" relation="LESS_THAN" label1="numericModeLabel_innerLoopParam?type=ModeLabel" label2="numericModeLabel_outerLoopParam?type=ModeLabel"/> + <entries xsi:type="am:ModeLabelCondition" relation="EQUAL" label1="numericModeLabel_innerLoopParam?type=ModeLabel" label2="numericModeLabel_outerLoopParam?type=ModeLabel"/> + </condition> + </items> + <items xsi:type="am:ModeLabelAccess" data="numericModeLabel_outerLoopParam?type=ModeLabel" access="increment" step="1"/> + <condition> + <entries xsi:type="am:ModeLabelCondition" relation="LESS_THAN" label1="numericModeLabel_outerLoopParam?type=ModeLabel" label2="numericModeLabel_inputVar?type=ModeLabel"/> + </condition> + </items> + </activityGraph> + <executionCondition> + <entries xsi:type="am:ModeConditionConjunction"> + <entries xsi:type="am:ModeValueCondition" label="numericModeLabel_inputVar?type=ModeLabel" value="80" relation="LESS_THAN"/> + <entries xsi:type="am:ModeValueCondition" label="numericModeLabel_inputVar?type=ModeLabel" value="0" relation="GREATER_THAN"/> + </entries> + </executionCondition> + </runnables> + <modes xsi:type="am:NumericMode" xmi:id="numericMode?type=NumericMode" name="numericMode"/> + <modeLabels xmi:id="numericModeLabel_inputVar?type=ModeLabel" name="numericModeLabel_inputVar" mode="numericMode?type=NumericMode" initialValue="0"/> + <modeLabels xmi:id="numericModeLabel_outputNatSum?type=ModeLabel" name="numericModeLabel_outputNatSum" mode="numericMode?type=NumericMode" initialValue="0"/> + <modeLabels xmi:id="numericModeLabel_innerLoopParam?type=ModeLabel" name="numericModeLabel_innerLoopParam" mode="numericMode?type=NumericMode" initialValue="0"/> + <modeLabels xmi:id="numericModeLabel_outerLoopParam?type=ModeLabel" name="numericModeLabel_outerLoopParam" mode="numericMode?type=NumericMode" initialValue="0"/> + </swModel> + <hwModel> + <definitions xsi:type="am:ProcessingUnitDefinition" xmi:id="DefaultCore?type=ProcessingUnitDefinition" name="DefaultCore" puType="CPU"/> + <definitions xsi:type="am:MemoryDefinition" xmi:id="DefaultMemory?type=MemoryDefinition" name="DefaultMemory"> + <size value="4" unit="MB"/> + <accessLatency xsi:type="am:DiscreteValueConstant" value="2"/> + <dataRate value="1" unit="GiBPerSecond"/> + </definitions> + <structures xmi:id="Democar?type=HwStructure" name="Democar" structureType="System"> + <structures xmi:id="ECU_1?type=HwStructure" name="ECU_1" structureType="ECU"> + <structures xmi:id="Microcontroller_1?type=HwStructure" name="Microcontroller_1" structureType="Microcontroller"> + <modules xsi:type="am:ProcessingUnit" xmi:id="Core_1?type=ProcessingUnit" name="Core_1" frequencyDomain="FrequencyDomain_1?type=FrequencyDomain" definition="DefaultCore?type=ProcessingUnitDefinition"> + <ports xmi:id="Core_1/portCore_1?type=HwPort" name="portCore_1" bitWidth="32" priority="0" portType="initiator" portInterface="custom"/> + <accessElements name="memAccess_core1" destination="Mem_1?type=Memory"> + <readLatency xsi:type="am:DiscreteValueConstant" value="2"/> + <writeLatency xsi:type="am:DiscreteValueWeibullEstimatorsDistribution" lowerBound="3" upperBound="23" average="5.0" pRemainPromille="1.0"/> + <dataRate value="1" unit="GiBPerSecond"/> + </accessElements> + </modules> + <modules xsi:type="am:Memory" xmi:id="Mem_1?type=Memory" name="Mem_1" frequencyDomain="FrequencyDomain_1?type=FrequencyDomain" definition="DefaultMemory?type=MemoryDefinition"/> + </structures> + </structures> + </structures> + <domains xsi:type="am:FrequencyDomain" xmi:id="FrequencyDomain_1?type=FrequencyDomain" name="FrequencyDomain_1" clockGating="false"> + <defaultValue value="100.0" unit="MHz"/> + </domains> + </hwModel> + <osModel> + <operatingSystems name="OperatingSystem"> + <taskSchedulers xmi:id="Task_Scheduler_Core_1?type=TaskScheduler" name="Task_Scheduler_Core_1"> + <schedulingAlgorithm xsi:type="am:FixedPriorityPreemptive"/> + </taskSchedulers> + </operatingSystems> + </osModel> + <stimuliModel> + <stimuli xsi:type="am:PeriodicStimulus" xmi:id="Timer_10MS?type=PeriodicStimulus" name="Timer_10MS"> + <recurrence value="10" unit="ms"/> + <offset value="0" unit="ms"/> + </stimuli> + </stimuliModel> + <mappingModel> + <schedulerAllocation scheduler="Task_Scheduler_Core_1?type=TaskScheduler" responsibility="Core_1?type=ProcessingUnit" executingPU="Core_1?type=ProcessingUnit"/> + <taskAllocation task="task_natSumCalculator?type=Task" scheduler="Task_Scheduler_Core_1?type=TaskScheduler"> + <schedulingParameters priority="3"/> + </taskAllocation> + <memoryMapping abstractElement="numericModeLabel_inputVar?type=ModeLabel" memory="Mem_1?type=Memory" memoryPositionAddress="0x0"/> + <memoryMapping abstractElement="numericModeLabel_outputNatSum?type=ModeLabel" memory="Mem_1?type=Memory" memoryPositionAddress="0x0"/> + <memoryMapping abstractElement="numericModeLabel_innerLoopParam?type=ModeLabel" memory="Mem_1?type=Memory" memoryPositionAddress="0x0"/> + <memoryMapping abstractElement="numericModeLabel_outerLoopParam?type=ModeLabel" memory="Mem_1?type=Memory" memoryPositionAddress="0x0"/> + </mappingModel> +</am:Amalthea>
diff --git a/simulation_generator/app4mc.sim/examples/whileLoopExample/whileLoopExample.properties b/simulation_generator/app4mc.sim/examples/whileLoopExample/whileLoopExample.properties new file mode 100644 index 0000000..6083a59 --- /dev/null +++ b/simulation_generator/app4mc.sim/examples/whileLoopExample/whileLoopExample.properties
@@ -0,0 +1,20 @@ +# ******************************************************************************* +# Copyright (c) 2019-2021 Robert Bosch GmbH and others. +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Eclipse Public License 2.0 +# which accompanies this distribution, and is available at +# https://www.eclipse.org/legal/epl-2.0/ +# +# Contributors: +# Robert Bosch GmbH - initial API and implementation +# +# ******************************************************************************* +input_models_folder=./whileLoopExample/ +m2m_output_folder=./output/whileLoopExample/ +m2t_output_folder=./output/whileLoopExample/ +log_file=./output/whileLoopExample/log.txt +app4mcsim_folder=$ENV{APP4MCSIM_LOC} +tracer=BtfTracer +simDurationInMS=2000 + +m2tTransformers=APP4MCSIM
diff --git a/simulation_generator/app4mc.sim/plugins/org.eclipse.app4mc.amlt2systemc.m2t/src/org/eclipse/app4mc/amlt2systemc/m2t/transformers/sw/ActivityGraphItemTransformer.xtend b/simulation_generator/app4mc.sim/plugins/org.eclipse.app4mc.amlt2systemc.m2t/src/org/eclipse/app4mc/amlt2systemc/m2t/transformers/sw/ActivityGraphItemTransformer.xtend index 57c59de..4e68790 100644 --- a/simulation_generator/app4mc.sim/plugins/org.eclipse.app4mc.amlt2systemc.m2t/src/org/eclipse/app4mc/amlt2systemc/m2t/transformers/sw/ActivityGraphItemTransformer.xtend +++ b/simulation_generator/app4mc.sim/plugins/org.eclipse.app4mc.amlt2systemc.m2t/src/org/eclipse/app4mc/amlt2systemc/m2t/transformers/sw/ActivityGraphItemTransformer.xtend
@@ -24,6 +24,7 @@ import org.eclipse.app4mc.amalthea.model.ModeSwitch import org.eclipse.app4mc.amalthea.model.RunnableCall import org.eclipse.app4mc.amalthea.model.Ticks +import org.eclipse.app4mc.amalthea.model.WhileLoop import org.eclipse.app4mc.amlt2systemc.m2t.module.BaseTransformer import org.eclipse.app4mc.amlt2systemc.m2t.transformers.sw.IActivityGraphItemContainerTransformer.ActivityGraphBuffer @@ -37,6 +38,7 @@ @Inject LabelAccessTransformer labelAccessTransformer @Inject ModeLabelAccessTransformer modeLabelAccessTransformer @Inject InterProcessTriggerTransformer interProcessTriggerTransformer + @Inject WhileLoopTransformer whileLoopTransformer dispatch def void transform(ActivityGraphItem activityGraphItem, ActivityGraphBuffer containerContent) { @@ -81,5 +83,10 @@ ActivityGraphBuffer containerContent) { modeSwitchTransformer.transform(modeSwitch, containerContent); } + + dispatch def void transform(WhileLoop whileLoop, + ActivityGraphBuffer containerContent) { + whileLoopTransformer.transform(whileLoop, containerContent); + } }
diff --git a/simulation_generator/app4mc.sim/plugins/org.eclipse.app4mc.amlt2systemc.m2t/src/org/eclipse/app4mc/amlt2systemc/m2t/transformers/sw/IActivityGraphItemContainerTransformer.xtend b/simulation_generator/app4mc.sim/plugins/org.eclipse.app4mc.amlt2systemc.m2t/src/org/eclipse/app4mc/amlt2systemc/m2t/transformers/sw/IActivityGraphItemContainerTransformer.xtend index 0fdc9bc..1ccdffb 100644 --- a/simulation_generator/app4mc.sim/plugins/org.eclipse.app4mc.amlt2systemc.m2t/src/org/eclipse/app4mc/amlt2systemc/m2t/transformers/sw/IActivityGraphItemContainerTransformer.xtend +++ b/simulation_generator/app4mc.sim/plugins/org.eclipse.app4mc.amlt2systemc.m2t/src/org/eclipse/app4mc/amlt2systemc/m2t/transformers/sw/IActivityGraphItemContainerTransformer.xtend
@@ -26,6 +26,8 @@ import org.eclipse.app4mc.amalthea.model.ModeSwitchDefault import org.eclipse.app4mc.amalthea.model.ActivityGraph import org.eclipse.app4mc.amlt2systemc.m2t.transformers.common.ModeConditionTransformer.ModeConditionBuffer +import org.eclipse.app4mc.amalthea.model.WhileLoop +import org.eclipse.app4mc.amalthea.model.ActivityGraphItem class IActivityGraphItemContainerTransformer extends BaseTransformer { @@ -100,7 +102,11 @@ } //run through items container.items.forEach [ item | { - if (item instanceof IActivityGraphItemContainer) { + if (item instanceof IActivityGraphItemContainer && item instanceof ActivityGraphItem) { + // BP: special case for WhileLoop which is a subclass of both IActivityGraphItemContainer and ActivityGraphItem. + containerContent.addBody((item as IActivityGraphItemContainer).addCommentForNestedContainer()) + activityGraphItemTransformer.transform((item as ActivityGraphItem), containerContent) + } else if (item instanceof IActivityGraphItemContainer) { //if the activity item is a activity item container contained in a activity item (e.g. Group within a Group) //run recursively containerContent.addBody(item.addCommentForNestedContainer()) @@ -128,6 +134,9 @@ if (item instanceof ActivityGraph){ return "/*---- ActivityGraph ----*/" } + if (item instanceof WhileLoop){ + return "/*---- WhileLoop ----*/" + } } }
diff --git a/simulation_generator/app4mc.sim/plugins/org.eclipse.app4mc.amlt2systemc.m2t/src/org/eclipse/app4mc/amlt2systemc/m2t/transformers/sw/WhileLoopTransformer.xtend b/simulation_generator/app4mc.sim/plugins/org.eclipse.app4mc.amlt2systemc.m2t/src/org/eclipse/app4mc/amlt2systemc/m2t/transformers/sw/WhileLoopTransformer.xtend new file mode 100644 index 0000000..9c69a23 --- /dev/null +++ b/simulation_generator/app4mc.sim/plugins/org.eclipse.app4mc.amlt2systemc.m2t/src/org/eclipse/app4mc/amlt2systemc/m2t/transformers/sw/WhileLoopTransformer.xtend
@@ -0,0 +1,51 @@ +/** + * ******************************************************************************* + * Copyright (c) 2019-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.amlt2systemc.m2t.transformers.sw + +import com.google.inject.Inject +import org.eclipse.app4mc.amlt2systemc.m2t.transformers.sw.IActivityGraphItemContainerTransformer.ActivityGraphBuffer +import org.eclipse.app4mc.amlt2systemc.m2t.transformers.common.ModeConditionTransformer +import org.eclipse.app4mc.amalthea.model.WhileLoop + +class WhileLoopTransformer extends IActivityGraphItemContainerTransformer { + + @Inject ModeConditionTransformer modeConditionTransformer + + static int cnt =0; + + static def getName(){ + return "whileLoop_" + cnt; + } + + def void transform(WhileLoop whileLoop, ActivityGraphBuffer parentContent) { + val name = getName() + cnt++; + parentContent.addBody("WhileLoop " + name + ";") + + val content = new ActivityGraphBuffer(name, parentContent.module, false) + + val conditionContent = modeConditionTransformer.transformCondition(whileLoop.condition, name, false) + val activityGraphContents = transformItems(whileLoop, name, content.module, content.parentIsPointer) + activityGraphContents.addAll(conditionContent) + + parentContent.getIncludes().addAll(activityGraphContents.getIncludes()) + parentContent.getSource().addAll(activityGraphContents.getSource()) + parentContent.addAsActivityGraphItem("<WhileLoop>(" + name + ")") + } + +} + +