blob: 54232c9e2f86f6daf717d27387ff46e9b0eca34e [file] [log] [blame]
/**
********************************************************************************
* Copyright (c) 2019 Dortmund University of Applied Sciences and Arts 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:
* Dortmund University of Applied Sciences and Arts - initial API and implementation
********************************************************************************
*/
package org.eclipse.app4mc.multicore.execution.logic.systemproxy.multicoresystem;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.eclipse.app4mc.multicore.execution.logic.openmapping.MalformedModelException;
import org.eclipse.app4mc.multicore.execution.logic.openmapping.OMAllocation;
import org.eclipse.app4mc.multicore.execution.logic.openmapping.OMCore;
import org.eclipse.app4mc.multicore.execution.logic.openmapping.OMMapping;
import org.eclipse.app4mc.multicore.execution.logic.openmapping.OMTask;
import org.eclipse.app4mc.multicore.execution.logic.openmapping.OMUtil;
import org.eclipse.app4mc.multicore.execution.logic.systemproxy.SimException;
public class SimUtil {
private SimUtil() {
}
public static void validateModelForSimulation(final OMMapping mapping) throws SimException {
validateOnlyPeriodicTasks(mapping);
try {
validateUtilizationPerCore(mapping);
}
catch (final MalformedModelException e) {
throw new SimException(e.getMessage());
}
}
public static void validateOnlyPeriodicTasks(final OMMapping model) throws SimException {
for (final OMAllocation alloc : model.getAllocationList()) {
final long p = alloc.getTask().getPeriod();
if (p == 0) {
throw new SimException(
"Non-periodic or unset period at task: " + alloc.getTask().getTaskRef().getName());
}
}
}
/**
* Check if every core has a utilization less 100%.
*
* @param model
* @return
* @throws SimException
* @throws MalformedModelException
*/
public static void validateUtilizationPerCore(final OMMapping model) throws SimException, MalformedModelException {
final Map<OMCore, List<OMTask>> tasksPerCore = OMUtil.getCoreTaskMap(model.getAllocationList());
validateUtilizationPerCore(tasksPerCore);
}
/**
* Check if every core has a utilization less 100%.
*
* @param model
* @return
* @throws MalformedModelException
*/
public static void validateUtilizationPerCore(final Map<OMCore, List<OMTask>> model)
throws SimException, MalformedModelException {
for (final Entry<OMCore,List<OMTask>> c : model.entrySet()) {
final double utila = OMUtil.getUtilization(c.getKey(), c.getValue());
if (utila > 1) {
// "Mapping for simulation has at least one core with an
// utilization greater 1!"
// a simExecption should be thrown here
}
}
}
/**
* Scale the passed positive value with roundup. Example:
* <ul>
* <li>val = 141; scale = 10 => 15</li>
* <li>val = 2611; scale = 1000 => 3</li>
* </ul>
*
* @param val
* Value to scale down (rounding up).
* @param scale
* Divisor for scale down.
* @return Scaled down value (rounded up).
*/
public static long scaleRoundUp(final long val, final long scale) {
return val / scale + ((val % scale) != 0 ? 1 : 0);
}
}