blob: 469ecafb109a668736ff3c95e6b4f3d04088abd1 [file] [log] [blame]
/**
********************************************************************************
* Copyright (c) 2015-2019 Robert Bosch GmbH and others.
*
* 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.amalthea.model.util.tests;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import java.math.BigInteger;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.eclipse.app4mc.amalthea.model.Amalthea;
import org.eclipse.app4mc.amalthea.model.Cache;
import org.eclipse.app4mc.amalthea.model.ConnectionHandler;
import org.eclipse.app4mc.amalthea.model.DataRate;
import org.eclipse.app4mc.amalthea.model.HWModel;
import org.eclipse.app4mc.amalthea.model.HwAccessElement;
import org.eclipse.app4mc.amalthea.model.HwDefinition;
import org.eclipse.app4mc.amalthea.model.HwDestination;
import org.eclipse.app4mc.amalthea.model.Memory;
import org.eclipse.app4mc.amalthea.model.ProcessingUnit;
import org.eclipse.app4mc.amalthea.model.ProcessingUnitDefinition;
import org.eclipse.app4mc.amalthea.model.Time;
import org.eclipse.app4mc.amalthea.model.util.HardwareUtil;
import org.eclipse.app4mc.amalthea.model.util.RuntimeUtil.AccessDirection;
import org.eclipse.app4mc.amalthea.model.util.RuntimeUtil.TimeType;
import org.eclipse.app4mc.amalthea.models.HardwareModels;
import org.eclipse.emf.common.util.EList;
import org.junit.Before;
import org.junit.Test;
public class HardwareUtilsTest {
Amalthea amaltheaModel;
@Before
public void initalizeModel() {
amaltheaModel = HardwareModels.createModel1();
}
@Test
public void testHWModelExistance() {
HWModel hwModel = amaltheaModel.getHwModel();
assertNotNull("HW model is not loaded", hwModel);
}
@Test
public void testHWProcessingUnitDefintions() {
HWModel hwModel = amaltheaModel.getHwModel();
assertNotNull("HW model is not loaded", hwModel);
EList<HwDefinition> definitions = hwModel.getDefinitions();
List<HwDefinition> processingUnitDefinitions = definitions.stream()
.filter(obj -> obj instanceof ProcessingUnitDefinition).collect(Collectors.toList());
assertEquals("AMALTHEA model file contains 2 ProcessingUnitDefinition ", 2, processingUnitDefinitions.size());
}
@Test
public void testGetModulesFromHWModel() {
List<ProcessingUnit> processingUnits = HardwareUtil.getModulesFromHwModel(ProcessingUnit.class, amaltheaModel);
assertEquals("AMALTHEA model file contains 5 ProcessingUnits ", 5, processingUnits.size());
List<Memory> memories = HardwareUtil.getModulesFromHwModel(Memory.class, amaltheaModel);
assertEquals("AMALTHEA model file contains 3 Memories ", 3, memories.size());
List<Cache> caches = HardwareUtil.getModulesFromHwModel(Cache.class, amaltheaModel);
assertEquals("AMALTHEA model file contains 1 Cache ", 1, caches.size());
List<ConnectionHandler> connectionHandlers = HardwareUtil.getModulesFromHwModel(ConnectionHandler.class,
amaltheaModel);
assertEquals("AMALTHEA model file contains 3 ConnectionHandlers ", 3, connectionHandlers.size());
}
@Test
public void testGetModulesFromHWStructure() {
List<ProcessingUnit> processingUnits = HardwareUtil.getModulesFromHWStructure(ProcessingUnit.class,
amaltheaModel.getHwModel().getStructures().get(0).getStructures().get(0));
assertEquals("AMALTHEA structure 1 contains 3 ProcessingUnits ", 3, processingUnits.size());
List<Memory> memories = HardwareUtil.getModulesFromHWStructure(Memory.class,
amaltheaModel.getHwModel().getStructures().get(0).getStructures().get(0));
assertEquals("AMALTHEA structure contains 1 Memories ", 1, memories.size());
List<Cache> caches = HardwareUtil.getModulesFromHWStructure(Cache.class,
amaltheaModel.getHwModel().getStructures().get(0).getStructures().get(0));
assertEquals("AMALTHEA structure contains 0 Cache ", 0, caches.size());
List<ConnectionHandler> connectionHandlers = HardwareUtil.getModulesFromHWStructure(ConnectionHandler.class,
amaltheaModel.getHwModel().getStructures().get(0).getStructures().get(0));
assertEquals("AMALTHEA structure contains 0 ConnectionHandlers ", 0, connectionHandlers.size());
}
@Test
public void testGetAllProcessingUnitsForProcessingUnitDefinition() {
List<ProcessingUnit> processingUnits1 = HardwareUtil.getAllProcessingUnitsForProcessingUnitDefinition(
amaltheaModel, (ProcessingUnitDefinition) amaltheaModel.getHwModel().getDefinitions().get(0));
assertEquals("AMALTHEA model file contains 2 ProcessingUnit of the PuDef1 ", 2, processingUnits1.size());
List<ProcessingUnit> processingUnits2 = HardwareUtil.getAllProcessingUnitsForProcessingUnitDefinition(
amaltheaModel, (ProcessingUnitDefinition) amaltheaModel.getHwModel().getDefinitions().get(3));
assertEquals("AMALTHEA model file contains 3 ProcessingUnit of the PuDef2 ", 3, processingUnits2.size());
}
@Test
public void testGetMemoryAccessLatencies() {
List<Memory> memories = HardwareUtil.getModulesFromHwModel(Memory.class, amaltheaModel);
Map<Memory, Long> memoryLatencyMap = HardwareUtil.getMemoryAccessLatenciesCycles(amaltheaModel, TimeType.ACET);
assertEquals("Number of memories in map is 3", 3, memoryLatencyMap.size());
assertEquals("AccessLatency of Mem1_top1 is", 5, memoryLatencyMap.get(memories.get(0)).intValue());
assertEquals("AccessLatency of Mem1_Lev3 is", 5, memoryLatencyMap.get(memories.get(1)).intValue());
assertEquals("AccessLatency of Mem1_top2 is", 5, memoryLatencyMap.get(memories.get(2)).intValue());
}
@Test
public void testGetMemoryAccessTimes() {
List<Memory> memories = HardwareUtil.getModulesFromHwModel(Memory.class, amaltheaModel);
Map<Memory, Time> memoryLatencyMap = HardwareUtil.getMemoryAccessLatencyTime(amaltheaModel, TimeType.ACET);
assertEquals("Number of memories in map is 3", 3, memoryLatencyMap.size());
assertEquals("AccessLatency of Mem1_top1 is", BigInteger.valueOf(25),
memoryLatencyMap.get(memories.get(0)).getValue());
assertEquals("AccessLatency of Mem1_top1 is", "ns", memoryLatencyMap.get(memories.get(0)).getUnit().toString());
assertEquals("AccessLatency of Mem1_Lev3 is", BigInteger.valueOf(25),
memoryLatencyMap.get(memories.get(1)).getValue());
assertEquals("AccessLatency of Mem1_Lev3 is", "ns", memoryLatencyMap.get(memories.get(1)).getUnit().toString());
assertEquals("AccessLatency of Mem1_top2 is", BigInteger.valueOf(10),
memoryLatencyMap.get(memories.get(2)).getValue());
assertEquals("AccessLatency of Mem1_top2 is", "ns", memoryLatencyMap.get(memories.get(2)).getUnit().toString());
}
@Test
public void testGetAccessElementsToDestination() {
List<Memory> memories = HardwareUtil.getModulesFromHwModel(Memory.class, amaltheaModel);
List<HwAccessElement> accessElements1 = HardwareUtil.getAccessElementsToDestination(memories.get(0),
amaltheaModel);
assertEquals("AccessElements which refer to memory 1 are 4", 4, accessElements1.size());
List<HwAccessElement> accessElements2 = HardwareUtil.getAccessElementsToDestination(memories.get(1),
amaltheaModel);
assertEquals("AccessElements which refer to memory 1 are 4", 4, accessElements2.size());
List<HwAccessElement> accessElements3 = HardwareUtil.getAccessElementsToDestination(memories.get(2),
amaltheaModel);
assertEquals("AccessElements which refer to memory 1 are 3", 3, accessElements3.size());
}
@Test
public void testcalculateLatencyPathTime() {
List<ProcessingUnit> processingUnits = HardwareUtil.getModulesFromHwModel(ProcessingUnit.class, amaltheaModel);
// System.out.println("Pu name: " + processingUnits.get(3).getName());
// System.out.println("Destination name: " + processingUnits.get(3).getAccessElements().get(2).getDestination().getName());
Time latencyWriteACET = HardwareUtil.calculateLatencyPathTime(processingUnits.get(3).getAccessElements().get(1),
TimeType.ACET, AccessDirection.WRITE);
assertEquals("Write time ACET for PU_1_Lev2_2 equals 16", 16, latencyWriteACET.getValue().intValue());
assertEquals("time unit is", "ns", latencyWriteACET.getUnit().toString());
Time latencyWriteBCET = HardwareUtil.calculateLatencyPathTime(processingUnits.get(3).getAccessElements().get(1),
TimeType.BCET, AccessDirection.WRITE);
assertEquals("Write latency BCET for PU_1_Lev2_2 equals 16", 16, latencyWriteBCET.getValue().intValue());
assertEquals("time unit is", "ns", latencyWriteBCET.getUnit().toString());
Time latencyWriteWCET = HardwareUtil.calculateLatencyPathTime(processingUnits.get(3).getAccessElements().get(1),
TimeType.WCET, AccessDirection.WRITE);
assertEquals("Write latency WCET for PU_1_Lev2_2 equals 16", 16, latencyWriteWCET.getValue().intValue());
assertEquals("time unit is", "ns", latencyWriteWCET.getUnit().toString());
Time latencyReadACET = HardwareUtil.calculateLatencyPathTime(processingUnits.get(3).getAccessElements().get(1), TimeType.ACET, AccessDirection.READ);
assertEquals("Read latency ACET for PU_1_Lev2_2 equals 56",56,latencyReadACET.getValue().intValue());
assertEquals("time unit is", "ns",latencyReadACET.getUnit().toString());
Time latencyReadBCET = HardwareUtil.calculateLatencyPathTime(processingUnits.get(3).getAccessElements().get(1), TimeType.BCET, AccessDirection.READ);
assertEquals("Read latency BCET for PU_1_Lev2_2 equals 48",48,latencyReadBCET.getValue().intValue());
assertEquals("time unit is", "ns",latencyReadBCET.getUnit().toString());
Time latencyReadWCET = HardwareUtil.calculateLatencyPathTime(processingUnits.get(3).getAccessElements().get(1), TimeType.WCET, AccessDirection.READ);
assertEquals("Read latency WCET for PU_1_Lev2_2 equals 64",64,latencyReadWCET.getValue().intValue());
assertEquals("time unit is", "ns",latencyReadWCET.getUnit().toString());
}
@Test
public void testCalculateHwAccesPathTime() {
List<ProcessingUnit> processingUnits = HardwareUtil.getModulesFromHwModel(ProcessingUnit.class, amaltheaModel);
// System.out.println("Pu name: " + processingUnits.get(2).getName());
// System.out.println("Destination name: " + processingUnits.get(2).getAccessElements().get(1).getDestination().getName());
Time latencyWriteACET = HardwareUtil.calculateHwAccessPathTime(
processingUnits.get(2).getAccessElements().get(1), TimeType.ACET, AccessDirection.WRITE);
assertEquals("Hardware access path for write ACET from PU_1_Lev3 to Memory 1_top1 equals 21", 21,
latencyWriteACET.getValue().intValue());
assertEquals("time unit is", "ns", latencyWriteACET.getUnit().toString());
Time latencyWriteBCET = HardwareUtil.calculateHwAccessPathTime(
processingUnits.get(2).getAccessElements().get(1), TimeType.BCET, AccessDirection.WRITE);
assertEquals("Hardware access path for write BCET from PU_1_Lev3 to Memory 1_top1 equals 21", 21,
latencyWriteBCET.getValue().intValue());
assertEquals("time unit is", "ns", latencyWriteBCET.getUnit().toString());
Time latencyWriteWCET = HardwareUtil.calculateHwAccessPathTime(
processingUnits.get(2).getAccessElements().get(1), TimeType.WCET, AccessDirection.WRITE);
assertEquals("Hardware access path for write WCET from PU_1_Lev3 to Memory 1_top1 equals 21", 21,
latencyWriteWCET.getValue().intValue());
assertEquals("time unit is", "ns", latencyWriteWCET.getUnit().toString());
Time latencyReadACET = HardwareUtil.calculateHwAccessPathTime(processingUnits.get(2).getAccessElements().get(1),
TimeType.ACET, AccessDirection.READ);
assertEquals("Hardware access path for read ACET from PU_1_Lev3 to Memory 1_top1 equals 36", 36,
latencyReadACET.getValue().intValue());
assertEquals("time unit is", "ns", latencyWriteACET.getUnit().toString());
}
@Test
public void testGetMinDataRateOfHwAccessPath() {
List<ProcessingUnit> processingUnits = HardwareUtil.getModulesFromHwModel(ProcessingUnit.class, amaltheaModel);
DataRate dataRate = HardwareUtil
.getMinDataRateOfHwAccessPath(processingUnits.get(4).getAccessElements().get(0).getAccessPath());
assertEquals("Minimum data rate of path is 800 MiB/s ", 800, dataRate.getValue().intValue());
assertEquals("Minimum data rate of path is 800 MiB/s ", "MiBPerSecond", dataRate.getUnit().toString());
}
@Test
public void testGetAccessTimes() {
List<ProcessingUnit> processingUnits = HardwareUtil.getModulesFromHwModel(ProcessingUnit.class, amaltheaModel);
Map<ProcessingUnit, HashMap<HwDestination, Time>> readLatencyMapACET = HardwareUtil
.getAccessTimes(amaltheaModel, TimeType.ACET, AccessDirection.READ);
// Pu1_Lev2 --> Mem1_Lev3
assertEquals("Time to memory destination Mem1_lev3 is 8 ns", 8, readLatencyMapACET.get(processingUnits.get(0))
.get(processingUnits.get(0).getAccessElements().get(0).getDestination()).getValue().intValue());
assertEquals("time unit is", "ns", readLatencyMapACET.get(processingUnits.get(0))
.get(processingUnits.get(0).getAccessElements().get(0).getDestination()).getUnit().toString());
// Pu1_Lev2 -->Mem1_top1
assertEquals("Time to memory destination Mem1_top1 is 34 ns", 34, readLatencyMapACET.get(processingUnits.get(0))
.get(processingUnits.get(0).getAccessElements().get(1).getDestination()).getValue().intValue());
assertEquals("time unit is", "ns", readLatencyMapACET.get(processingUnits.get(0))
.get(processingUnits.get(0).getAccessElements().get(0).getDestination()).getUnit().toString());
// Pu2_Lev2 -->Mem1_Lev3
assertEquals("Time to memory destination Mem1_lev3 is 8 ns", 8, readLatencyMapACET.get(processingUnits.get(1))
.get(processingUnits.get(1).getAccessElements().get(0).getDestination()).getValue().intValue());
// Pu2_Lev2 -->Mem1_top1
assertEquals("Time to memory destination Mem1_top1 is 30 ns", 30, readLatencyMapACET.get(processingUnits.get(1))
.get(processingUnits.get(1).getAccessElements().get(1).getDestination()).getValue().intValue());
// Pu1_Lev3 --> Mem1_Lev3
assertEquals("Time to memory destination Mem1_lev3 is 8 ns", 8, readLatencyMapACET.get(processingUnits.get(2))
.get(processingUnits.get(2).getAccessElements().get(0).getDestination()).getValue().intValue());
// Pu1_Lev3 --> Mem1_top1
assertEquals("Time to memory destination Mem1_top1 is 36 ns", 36, readLatencyMapACET.get(processingUnits.get(2))
.get(processingUnits.get(2).getAccessElements().get(1).getDestination()).getValue().intValue());
// Pu1_Lev3 --> Mem1_top2
assertEquals("Time to memory destination Mem1_top2 is 60 ns", 60, readLatencyMapACET.get(processingUnits.get(2))
.get(processingUnits.get(2).getAccessElements().get(2).getDestination()).getValue().intValue());
// Pu1_Lev2_2 -->Mem1_Lev3
assertEquals("Time to memory destination Mem1_lev3 is 40 ns", 40, readLatencyMapACET.get(processingUnits.get(3))
.get(processingUnits.get(3).getAccessElements().get(0).getDestination()).getValue().intValue());
// Pu1_Lev2_2 -->Mem1_top1 (Distribution)
assertEquals("Time to memory destination Mem1_top1 is 56 ns ",56, readLatencyMapACET.get(processingUnits.get(3)).get(processingUnits.get(3).getAccessElements().get(1).getDestination()).getValue().intValue());
// Pu1_Lev2_2 -->Mem1_top2
assertEquals("Time to memory destination Mem1_top2 is 12 ns", 12, readLatencyMapACET.get(processingUnits.get(3))
.get(processingUnits.get(3).getAccessElements().get(2).getDestination()).getValue().intValue());
Map<ProcessingUnit, HashMap<HwDestination, Time>> writeLatencyMapACET = HardwareUtil
.getAccessTimes(amaltheaModel, TimeType.ACET, AccessDirection.WRITE);
// Pu1_Lev2 --> Mem1_Lev3
assertEquals("Time to memory destination Mem1_lev3 is 6 ns", 6, writeLatencyMapACET.get(processingUnits.get(0))
.get(processingUnits.get(0).getAccessElements().get(0).getDestination()).getValue().intValue());
assertEquals("time unit is", "ns", writeLatencyMapACET.get(processingUnits.get(0))
.get(processingUnits.get(0).getAccessElements().get(0).getDestination()).getUnit().toString());
// Pu1_Lev2 -->Mem1_top1
assertEquals("Time to memory destination Mem1_top1 is 17 ns", 17,
writeLatencyMapACET.get(processingUnits.get(0))
.get(processingUnits.get(0).getAccessElements().get(1).getDestination()).getValue().intValue());
assertEquals("time unit is", "ns", writeLatencyMapACET.get(processingUnits.get(0))
.get(processingUnits.get(0).getAccessElements().get(0).getDestination()).getUnit().toString());
// Pu2_Lev2 -->Mem1_Lev3
assertEquals("Time to memory destination Mem1_lev3 is 6 ns", 6, writeLatencyMapACET.get(processingUnits.get(1))
.get(processingUnits.get(1).getAccessElements().get(0).getDestination()).getValue().intValue());
// Pu2_Lev2 -->Mem1_top1
assertEquals("Time to memory destination Mem1_top1 is 15 ns", 15,
writeLatencyMapACET.get(processingUnits.get(1))
.get(processingUnits.get(1).getAccessElements().get(1).getDestination()).getValue().intValue());
// Pu1_Lev3 --> Mem1_Lev3
assertEquals("Time to memory destination Mem1_lev3 is 6 ns", 6, writeLatencyMapACET.get(processingUnits.get(2))
.get(processingUnits.get(2).getAccessElements().get(0).getDestination()).getValue().intValue());
// Pu1_Lev3 --> Mem1_top1
assertEquals("Time to memory destination Mem1_top1 is 21 ns", 21,
writeLatencyMapACET.get(processingUnits.get(2))
.get(processingUnits.get(2).getAccessElements().get(1).getDestination()).getValue().intValue());
// Pu1_Lev3 --> Mem1_top2
assertEquals("Time to memory destination Mem1_top2 is 30 ns", 30,
writeLatencyMapACET.get(processingUnits.get(2))
.get(processingUnits.get(2).getAccessElements().get(2).getDestination()).getValue().intValue());
// Pu1_Lev2_2 -->Mem1_Lev3
assertEquals("Time to memory destination Mem1_lev3 is 20 ns", 20,
writeLatencyMapACET.get(processingUnits.get(3))
.get(processingUnits.get(3).getAccessElements().get(0).getDestination()).getValue().intValue());
// Pu1_Lev2_2 -->Mem1_top1 (Distribution)
assertEquals("Time to memory destination Mem1_top1 is 16 ns ", 16,
writeLatencyMapACET.get(processingUnits.get(3))
.get(processingUnits.get(3).getAccessElements().get(1).getDestination()).getValue().intValue());
// Pu1_Lev2_2 -->Mem1_top2
assertEquals("Time to memory destination Mem1_top2 is 0 ns", 0, writeLatencyMapACET.get(processingUnits.get(3))
.get(processingUnits.get(3).getAccessElements().get(2).getDestination()).getValue().intValue());
// test -->Mem1_top2 (Distribution) NOTE: no Write Latency specified
assertEquals("Time to memory destination Mem1_top2 is 0 ns ", 0, writeLatencyMapACET.get(processingUnits.get(4))
.get(processingUnits.get(4).getAccessElements().get(0).getDestination()).getValue().intValue());
Map<ProcessingUnit, HashMap<HwDestination, Time>> writeLatencyMapBCET = HardwareUtil
.getAccessTimes(amaltheaModel, TimeType.BCET, AccessDirection.WRITE);
// test -->Mem1_top2 (Distribution) NOTE: no Write Latency specified works only
// for ACET
assertEquals("Time to memory destination Mem1_top2 is 0 ns ", 0, writeLatencyMapBCET.get(processingUnits.get(4))
.get(processingUnits.get(4).getAccessElements().get(0).getDestination()).getValue().intValue());
Map<ProcessingUnit, HashMap<HwDestination, Time>> readLatencyMapBCET = HardwareUtil
.getAccessTimes(amaltheaModel, TimeType.BCET, AccessDirection.READ);
// Pu1_Lev2_2 -->Mem1_top1 (Distribution)
assertEquals("Time to memory destination Mem1_top1 is 48 ns ",48, readLatencyMapBCET.get(processingUnits.get(3)).get(processingUnits.get(3).getAccessElements().get(1).getDestination()).getValue().intValue());
// test -->Mem1_top2 (Distribution)
assertEquals("Time to memory destination Mem1_top2 is 60 ns ",60, readLatencyMapBCET.get(processingUnits.get(4)).get(processingUnits.get(4).getAccessElements().get(0).getDestination()).getValue().intValue());
Map<ProcessingUnit, HashMap<HwDestination, Time>> readLatencyMapWCET = HardwareUtil
.getAccessTimes(amaltheaModel, TimeType.WCET, AccessDirection.READ);
// Pu1_Lev2_2 -->Mem1_top1 (Distribution)
assertEquals("Time to memory destination Mem1_top1 is 64 ns ",64, readLatencyMapWCET.get(processingUnits.get(3)).get(processingUnits.get(3).getAccessElements().get(1).getDestination()).getValue().intValue());
// test -->Mem1_top2 (Distribution)
assertEquals("Time to memory destination Mem1_top2 is 140 ns ",140, readLatencyMapWCET.get(processingUnits.get(4)).get(processingUnits.get(4).getAccessElements().get(0).getDestination()).getValue().intValue());
}
}