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 + ")")
+	}
+	
+}
+
+