Skip to content

Commit

Permalink
Merge pull request #1410 from osate/1312_no_feedback_on_missing_in_sc…
Browse files Browse the repository at this point in the history
…hedule

Now checks and give warning if partition is not in processor 653
  • Loading branch information
lwrage committed Aug 1, 2018
2 parents 0f56f58 + 014776d commit c864f56
Show file tree
Hide file tree
Showing 3 changed files with 135 additions and 13 deletions.
@@ -0,0 +1,99 @@
package org.osate.analysis.flows.tests

import com.google.inject.Inject
import com.itemis.xtext.testing.XtextTest
import org.eclipse.core.runtime.NullProgressMonitor
import org.eclipse.xtext.testing.InjectWith
import org.eclipse.xtext.testing.XtextRunner
import org.junit.Test
import org.junit.runner.RunWith
import org.osate.aadl2.AadlPackage
import org.osate.aadl2.SystemImplementation
import org.osate.aadl2.instantiation.InstantiateModel
import org.osate.analysis.flows.FlowLatencyAnalysisSwitch
import org.osate.result.RealValue
import org.osate.testsupport.Aadl2InjectorProvider
import org.osate.testsupport.TestHelper

import static org.junit.Assert.*

import static extension org.junit.Assert.assertEquals
import org.osate.aadl2.instance.ComponentInstance
import org.osate.aadl2.NamedElement

@RunWith(typeof(XtextRunner))
@InjectWith(typeof(Aadl2InjectorProvider))
class ARINC653ScheduleTest extends XtextTest {

@Inject
TestHelper<AadlPackage> testHelper

@Test
def void VPLatencyContribution() {

val pkg = testHelper.parseString(vplatencyText)
val cls = pkg.ownedPublicSection.ownedClassifiers
assertTrue('', cls.exists[name == 's1.i1'])

// instantiate
val sysImpl = cls.findFirst[name == 's1.i1'] as SystemImplementation
val instance = InstantiateModel.instantiate(sysImpl)
assertEquals("s1_i1_Instance", instance.name)

// check flow latency
val som = instance.systemOperationModes.head
val checker = new FlowLatencyAnalysisSwitch(new NullProgressMonitor, instance)
val latencyresult = checker.invoke(instance, som, true, true, true, true)
val resab = latencyresult.results.get(0)
assertTrue((resab.values.get(1) as RealValue).value == (1.0))
assertTrue((resab.values.get(2) as RealValue).value == (1.0))
assertTrue((resab.values.get(3) as RealValue).value == (0.0))
assertTrue((resab.values.get(4) as RealValue).value == (0.0))
assertTrue((resab.values.get(5) as RealValue).value == (0.0))
assertTrue((resab.values.get(6) as RealValue).value == (0.0))
resab.subResults.size.assertEquals(5)
resab.diagnostics.size.assertEquals(1)
val subres = resab.subResults.get(3)
val partnoschedule = subres.sourceReference as NamedElement
assertTrue(partnoschedule instanceof ComponentInstance)
assertEquals(partnoschedule.name,"sub3")
assertEquals(subres.diagnostics.size, 4)
val warn = subres.diagnostics.get(0)
assertEquals(warn.message, "Partition not found in ARINC653 schedule of processor sub4")
}

val vplatencyText = '''
package partition2
public
with ARINC653;
system s1
end s1;
system implementation s1.i1
subcomponents
sub1: abstract a1;
sub2: abstract a1;
sub3: virtual processor {Period => 1 ms;};
sub4: processor;
sub5: virtual processor;
connections
conn1: feature sub1.f1 -> sub2.f1;
flows
etef1: end to end flow sub1 -> conn1 -> sub2;
properties
Actual_Processor_Binding => (reference (sub3)) applies to sub2;
Actual_Processor_Binding => (reference (sub4)) applies to sub3;
Actual_Processor_Binding => (reference (sub5)) applies to sub1;
Actual_Processor_Binding => (reference (sub4)) applies to sub5;
ARINC653::Module_Schedule => ([Partition => reference (sub5);]) applies to sub4;
end s1.i1;
abstract a1
features
f1: feature;
end a1;
end partition2;
'''

}
Expand Up @@ -223,9 +223,14 @@ public void mapComponentInstance(final EndToEndFlowInstance etef, final FlowElem
double partitionLatency = FlowLatencyUtil.getPartitionPeriod(firstPartition);
List<ARINC653ScheduleWindow> schedule = FlowLatencyUtil.getModuleSchedule(firstPartition);
double partitionDuration = FlowLatencyUtil.getPartitionDuration(firstPartition, schedule);
LatencyContributorComponent partitionLatencyContributor = new LatencyContributorComponent(
firstPartition, report.isMajorFrameDelay());
if (!FlowLatencyUtil.isInSchedule(firstPartition, schedule)) {
partitionLatencyContributor
.reportWarning("Partition not found in ARINC653 schedule of processor "
+ FlowLatencyUtil.getModule(firstPartition).getName());
}
if (partitionDuration > 0) {
LatencyContributorComponent partitionLatencyContributor = new LatencyContributorComponent(
firstPartition, report.isMajorFrameDelay());
if (partitionLatency == 0) {
partitionLatencyContributor.setSamplingPeriod(partitionDuration);
partitionLatencyContributor
Expand All @@ -240,8 +245,6 @@ public void mapComponentInstance(final EndToEndFlowInstance etef, final FlowElem
partitionLatencyContributor.setBestCaseMethod(LatencyContributorMethod.PARTITION_SCHEDULE);
entry.addContributor(partitionLatencyContributor);
} else {
LatencyContributorComponent partitionLatencyContributor = new LatencyContributorComponent(
firstPartition, report.isMajorFrameDelay());
if (partitionLatency == 0) {
partitionLatencyContributor.reportInfo("No partition period/rate. Using zero");
}
Expand All @@ -265,9 +268,13 @@ public void mapComponentInstance(final EndToEndFlowInstance etef, final FlowElem
double partitionLatency = FlowLatencyUtil.getPartitionPeriod(firstPartition);
List<ARINC653ScheduleWindow> schedule = FlowLatencyUtil.getModuleSchedule(firstPartition);
double partitionDuration = FlowLatencyUtil.getPartitionDuration(firstPartition, schedule);
LatencyContributorComponent platencyContributor = new LatencyContributorComponent(firstPartition,
report.isMajorFrameDelay());
if (!FlowLatencyUtil.isInSchedule(firstPartition, schedule)) {
platencyContributor.reportWarning("Partition not found in ARINC653 schedule of processor "
+ FlowLatencyUtil.getModule(firstPartition).getName());
}
if (partitionDuration > 0) {
LatencyContributorComponent platencyContributor = new LatencyContributorComponent(firstPartition,
report.isMajorFrameDelay());
platencyContributor.setSamplingPeriod(partitionLatency);
double frameOffset = FlowLatencyUtil.getPartitionFrameOffset(firstPartition, schedule);
platencyContributor.setPartitionOffset(frameOffset);
Expand All @@ -276,8 +283,6 @@ public void mapComponentInstance(final EndToEndFlowInstance etef, final FlowElem
platencyContributor.setBestCaseMethod(LatencyContributorMethod.PARTITION_SCHEDULE);
entry.addContributor(platencyContributor);
} else {
LatencyContributorComponent platencyContributor = new LatencyContributorComponent(firstPartition,
report.isMajorFrameDelay());
platencyContributor.setSamplingPeriod(partitionLatency);
platencyContributor.setWorstCaseMethod(LatencyContributorMethod.PARTITION_FRAME);
platencyContributor.setBestCaseMethod(LatencyContributorMethod.PARTITION_FRAME);
Expand Down Expand Up @@ -425,6 +430,10 @@ public void mapConnectionInstance(final EndToEndFlowInstance etef, final FlowEle
if (partitionDuration > 0) {
LatencyContributor ioLatencyContributor = new LatencyContributorComponent(srcPartition,
report.isMajorFrameDelay());
if (!FlowLatencyUtil.isInSchedule(srcPartition, schedule)) {
ioLatencyContributor.reportWarning("Partition not found in ARINC653 schedule of processor "
+ FlowLatencyUtil.getModule(srcPartition).getName());
}
ioLatencyContributor.setWorstCaseMethod(LatencyContributorMethod.PARTITION_OUTPUT);
ioLatencyContributor.setBestCaseMethod(LatencyContributorMethod.PARTITION_OUTPUT);
if (partitionLatency == 0) {
Expand Down Expand Up @@ -510,9 +519,13 @@ public void mapConnectionInstance(final EndToEndFlowInstance etef, final FlowEle
double partitionLatency = FlowLatencyUtil.getPartitionPeriod(dstPartition);
List<ARINC653ScheduleWindow> schedule = FlowLatencyUtil.getModuleSchedule(dstPartition);
double partitionDuration = FlowLatencyUtil.getPartitionDuration(dstPartition, schedule);
LatencyContributorComponent platencyContributor = new LatencyContributorComponent(dstPartition,
report.isMajorFrameDelay());
if (!FlowLatencyUtil.isInSchedule(dstPartition, schedule)) {
platencyContributor.reportWarning("Partition not found in ARINC653 schedule of processor "
+ FlowLatencyUtil.getModule(dstPartition).getName());
}
if (partitionDuration > 0) {
LatencyContributorComponent platencyContributor = new LatencyContributorComponent(dstPartition,
report.isMajorFrameDelay());
double frameOffset = FlowLatencyUtil.getPartitionFrameOffset(dstPartition, schedule);
platencyContributor.setPartitionOffset(frameOffset);
if (partitionLatency == 0) {
Expand All @@ -526,8 +539,6 @@ public void mapConnectionInstance(final EndToEndFlowInstance etef, final FlowEle
platencyContributor.setBestCaseMethod(LatencyContributorMethod.PARTITION_SCHEDULE);
entry.addContributor(platencyContributor);
} else {
LatencyContributorComponent platencyContributor = new LatencyContributorComponent(dstPartition,
report.isMajorFrameDelay());
platencyContributor.setSamplingPeriod(partitionLatency);
platencyContributor.setWorstCaseMethod(LatencyContributorMethod.PARTITION_FRAME);
platencyContributor.setBestCaseMethod(LatencyContributorMethod.PARTITION_FRAME);
Expand Down
Expand Up @@ -332,7 +332,7 @@ public static ComponentInstance getModule(ComponentInstance partition) {
* return the offset of the partition start time relative to the major frame
* utilizes the window schedule of the module for the partition
* @param partition This can be a virtual processor representing a partition or a component instance tagged with SEI properties
* @return offset or -1 if no schedule, no virtual processor as ARINC653 partition, or no processor.
* @return offset, no virtual processor as ARINC653 partition, or no processor.
*/
public static double getPartitionFrameOffset(ComponentInstance partition, List<ARINC653ScheduleWindow> schedule) {
double res = 0.0;
Expand All @@ -349,6 +349,18 @@ public static double getPartitionFrameOffset(ComponentInstance partition, List<A
return 0.0;
}

public static boolean isInSchedule(ComponentInstance partition, List<ARINC653ScheduleWindow> schedule) {
if (schedule == null) {
return true;
}
for (ARINC653ScheduleWindow window : schedule) {
if (window.getPartition() == partition) {
return true;
}
}
return false;
}

/**
* return the duration of the partition i.e., its window size.
* utilizes the window schedule of the module for the partition
Expand Down

0 comments on commit c864f56

Please sign in to comment.