blob: 42d432b81dd4494d13051c4878dd146d9ba49c34 [file] [log] [blame]
/**
********************************************************************************
* Copyright (c) 2015-2021 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;
import java.math.BigInteger;
import java.util.Collection;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.eclipse.app4mc.amalthea.model.AmaltheaFactory;
import org.eclipse.app4mc.amalthea.model.AmaltheaServices;
import org.eclipse.app4mc.amalthea.model.BigIntegerObject;
import org.eclipse.app4mc.amalthea.model.BooleanObject;
import org.eclipse.app4mc.amalthea.model.ClockStep;
import org.eclipse.app4mc.amalthea.model.Counter;
import org.eclipse.app4mc.amalthea.model.DataRate;
import org.eclipse.app4mc.amalthea.model.DataRateUnit;
import org.eclipse.app4mc.amalthea.model.DataSize;
import org.eclipse.app4mc.amalthea.model.DataSizeUnit;
import org.eclipse.app4mc.amalthea.model.DiscreteValueBoundaries;
import org.eclipse.app4mc.amalthea.model.DiscreteValueConstant;
import org.eclipse.app4mc.amalthea.model.DiscreteValueGaussDistribution;
import org.eclipse.app4mc.amalthea.model.DiscreteValueWeibullEstimatorsDistribution;
import org.eclipse.app4mc.amalthea.model.DoubleObject;
import org.eclipse.app4mc.amalthea.model.ExecutionNeed;
import org.eclipse.app4mc.amalthea.model.FloatObject;
import org.eclipse.app4mc.amalthea.model.Frequency;
import org.eclipse.app4mc.amalthea.model.FrequencyUnit;
import org.eclipse.app4mc.amalthea.model.HwFeature;
import org.eclipse.app4mc.amalthea.model.IDiscreteValueDeviation;
import org.eclipse.app4mc.amalthea.model.IReferable;
import org.eclipse.app4mc.amalthea.model.IntegerObject;
import org.eclipse.app4mc.amalthea.model.ListObject;
import org.eclipse.app4mc.amalthea.model.LongObject;
import org.eclipse.app4mc.amalthea.model.ReferenceObject;
import org.eclipse.app4mc.amalthea.model.StringObject;
import org.eclipse.app4mc.amalthea.model.Time;
import org.eclipse.app4mc.amalthea.model.TimeBoundaries;
import org.eclipse.app4mc.amalthea.model.TimeConstant;
import org.eclipse.app4mc.amalthea.model.TimeGaussDistribution;
import org.eclipse.app4mc.amalthea.model.TimeUnit;
import org.eclipse.app4mc.amalthea.model.TimeWeibullEstimatorsDistribution;
import org.eclipse.app4mc.amalthea.model.TypeDefinition;
import org.eclipse.app4mc.amalthea.model.TypeRef;
import org.eclipse.app4mc.amalthea.model.Value;
import org.eclipse.app4mc.amalthea.model.Voltage;
import org.eclipse.app4mc.amalthea.model.VoltageUnit;
public class FactoryUtil {
// Suppress default constructor
private FactoryUtil() {
throw new IllegalStateException("Utility class");
}
/**
* Creates a counter (with offset = 0)
*/
public static Counter createCounter(long prescaler) {
return createCounter(prescaler, 0);
}
/**
* Creates a counter
*/
public static Counter createCounter(long prescaler, long offset) {
Counter counter = AmaltheaFactory.eINSTANCE.createCounter();
counter.setPrescaler(prescaler);
counter.setOffset(offset);
return counter;
}
/**
* Creates a data size (initialized with zero value and base unit)
*/
public static DataSize createDataSize() {
DataSize size = AmaltheaFactory.eINSTANCE.createDataSize();
size.setValue(BigInteger.ZERO);
size.setUnit(DataSizeUnit.BIT);
return size;
}
/**
* Creates a data size out of a value and a unit
*/
public static DataSize createDataSize(long value, DataSizeUnit unit) {
DataSize size = AmaltheaFactory.eINSTANCE.createDataSize();
size.setValue(BigInteger.valueOf(value));
size.setUnit(unit);
return size;
}
/**
* Creates a data rate (initialized with zero value and base unit)
*/
public static DataRate createDataRate() {
DataRate rate = AmaltheaFactory.eINSTANCE.createDataRate();
rate.setValue(BigInteger.ZERO);
rate.setUnit(DataRateUnit.BIT_PER_SECOND);
return rate;
}
/**
* Creates a data rate out of a value and a unit
*/
public static DataRate createDataRate(long value, DataRateUnit unit) {
DataRate rate = AmaltheaFactory.eINSTANCE.createDataRate();
rate.setValue(BigInteger.valueOf(value));
rate.setUnit(unit);
return rate;
}
/**
* Creates a frequency (initialized with zero value and base unit)
*/
public static Frequency createFrequency() {
Frequency frequency = AmaltheaFactory.eINSTANCE.createFrequency();
frequency.setUnit(FrequencyUnit.HZ);
return frequency;
}
/**
* Creates a frequency out of a value and a unit
*/
public static Frequency createFrequency(double value, FrequencyUnit unit) {
Frequency frequency = AmaltheaFactory.eINSTANCE.createFrequency();
frequency.setValue(value);
frequency.setUnit(unit);
return frequency;
}
/**
* Creates a voltage (initialized with zero value and base unit)
*/
public static Voltage createVoltage() {
Voltage voltage = AmaltheaFactory.eINSTANCE.createVoltage();
voltage.setUnit(VoltageUnit.UV);
return voltage;
}
/**
* Creates a voltage out of a value and a unit
*/
public static Voltage createVoltage(double value, VoltageUnit unit) {
Voltage voltage = AmaltheaFactory.eINSTANCE.createVoltage();
voltage.setValue(value);
voltage.setUnit(unit);
return voltage;
}
/**
* Creates a time (initialized with zero value and base unit)
*/
public static Time createTime() {
Time time = AmaltheaFactory.eINSTANCE.createTime();
time.setValue(BigInteger.ZERO);
time.setUnit(TimeUnit.PS);
return time;
}
/**
* Creates a new time based on a time
* @param inputTime
* @return New time object
*/
public static Time createTime(Time inputTime) {
Time time = AmaltheaFactory.eINSTANCE.createTime();
time.setValue(inputTime.getValue());
time.setUnit(inputTime.getUnit());
return time;
}
/**
* Creates a time out of a value and a unit
*/
public static Time createTime(long value, TimeUnit unit) {
Time time = AmaltheaFactory.eINSTANCE.createTime();
time.setValue(BigInteger.valueOf(value));
time.setUnit(unit);
return time;
}
/**
* Creates a time out of a value and a unit (converted to pico seconds)
*/
public static Time createTime(double value, TimeUnit unit) {
if (unit == TimeUnit._UNDEFINED_) return null;
// convert to pico seconds
int power = AmaltheaServices.TIME_UNIT_LIST.indexOf(unit);
double factor = Math.pow(1000, power);
long newValue = Math.round(value * factor);
return createTime(newValue, TimeUnit.PS);
}
/**
* Creates a time out of a value and a unit
*/
public static Time createTime(BigInteger value, TimeUnit unit) {
Time time = AmaltheaFactory.eINSTANCE.createTime();
time.setValue(value);
time.setUnit(unit);
return time;
}
/**
* Creates a time out of a value and a unit given as String.
*/
public static Time createTime(long value, String unit) {
return createTime(value, parseTimeUnit(unit));
}
/**
* Creates a time out of a value and a unit given as String.
*/
public static Time createTime(double value, String unit) {
return createTime(value, parseTimeUnit(unit));
}
/**
* Creates a time out of a value and a unit given as String.
*/
public static Time createTime(BigInteger value, String unit) {
return createTime(value, parseTimeUnit(unit));
}
/**
* Creates a Time object parsed from a text representation.
* @param timeString string representation of a time (number followed by time unit s, ms, us, ns or ps)
* @return The new Time object
*
*/
public static Time createTime(String timeString) {
Pattern p = Pattern.compile("(-?\\d+)(\\.\\d+)?\\s?(s|ms|us|ns|ps)");
Matcher m = p.matcher(timeString);
if(m.matches()) {
String value = m.group(1);
String fraction = m.group(2);
String unit = m.group(3);
if (fraction == null) {
return createTime(Long.parseLong(value), parseTimeUnit(unit));
} else {
return createTime(Double.parseDouble(value + fraction), parseTimeUnit(unit));
}
}
return null;
}
private static TimeUnit parseTimeUnit(String input) {
if (input == null) return TimeUnit.MS; //default millisecond
String unit = input.trim().toLowerCase();
if(unit.equals("ps")) return TimeUnit.PS;
if(unit.equals("ns")) return TimeUnit.NS;
if(unit.equals("us")) return TimeUnit.US;
if(unit.equals("ms")) return TimeUnit.MS;
if(unit.equals("s")) return TimeUnit.S;
return null;
}
public static ClockStep createClockStep(double freqValue, FrequencyUnit freqUnit, long timeValue, String timeUnit) {
ClockStep clockStep = AmaltheaFactory.eINSTANCE.createClockStep();
clockStep.setFrequency(createFrequency(freqValue, freqUnit));
clockStep.setTime(createTime(timeValue, timeUnit));
return clockStep;
}
/**
* Creates a TypeRef object that refers to a type definition
*/
public static TypeRef createTypeRef(TypeDefinition typeDefinition) {
TypeRef refObj = AmaltheaFactory.eINSTANCE.createTypeRef();
refObj.setTypeDef(typeDefinition);
return refObj;
}
public static DiscreteValueConstant createDiscreteValueConstant(long value) {
DiscreteValueConstant result = AmaltheaFactory.eINSTANCE.createDiscreteValueConstant();
result.setValue(value);
return result;
}
public static DiscreteValueBoundaries createDiscreteValueBoundaries(long min, long max) {
DiscreteValueBoundaries boundaries = AmaltheaFactory.eINSTANCE.createDiscreteValueBoundaries();
boundaries.setLowerBound(min);
boundaries.setUpperBound(max);
return boundaries;
}
public static DiscreteValueGaussDistribution createDiscreteValueGaussDistribution(double mean, double sd) {
DiscreteValueGaussDistribution result = AmaltheaFactory.eINSTANCE.createDiscreteValueGaussDistribution();
result.setMean(mean);
result.setSd(sd);
return result;
}
public static DiscreteValueGaussDistribution createDiscreteValueGaussDistribution(double mean, double sd, Long min, Long max) {
DiscreteValueGaussDistribution result = createDiscreteValueGaussDistribution(mean, sd);
result.setLowerBound(min);
result.setUpperBound(max);
return result;
}
public static DiscreteValueWeibullEstimatorsDistribution createWeibullDistribution(long min, double avg, long max, double promille) {
DiscreteValueWeibullEstimatorsDistribution result = AmaltheaFactory.eINSTANCE.createDiscreteValueWeibullEstimatorsDistribution();
result.setLowerBound(min);
result.setAverage(avg);
result.setUpperBound(max);
result.setPRemainPromille(promille);
return result;
}
public static TimeConstant createTimeConstant(Time value) {
TimeConstant result = AmaltheaFactory.eINSTANCE.createTimeConstant();
result.setValue(value);
return result;
}
public static TimeBoundaries createTimeBoundaries(Time min, Time max) {
TimeBoundaries boundaries = AmaltheaFactory.eINSTANCE.createTimeBoundaries();
boundaries.setLowerBound(min);
boundaries.setUpperBound(max);
return boundaries;
}
public static TimeGaussDistribution createTimeGaussDistribution(Time mean, Time sd) {
TimeGaussDistribution result = AmaltheaFactory.eINSTANCE.createTimeGaussDistribution();
result.setMean(mean);
result.setSd(sd);
return result;
}
public static TimeGaussDistribution createTimeGaussDistribution(Time mean, Time sd, Time min, Time max) {
TimeGaussDistribution result = createTimeGaussDistribution(mean, sd);
result.setLowerBound(min);
result.setUpperBound(max);
return result;
}
public static TimeWeibullEstimatorsDistribution createWeibullDistribution(Time min, Time avg, Time max, double promille) {
TimeWeibullEstimatorsDistribution result = AmaltheaFactory.eINSTANCE.createTimeWeibullEstimatorsDistribution();
result.setLowerBound(min);
result.setAverage(avg);
result.setUpperBound(max);
result.setPRemainPromille(promille);
return result;
}
/**
* Creates ExecutionNeed for a featureCategoryName, need set.
*/
public static ExecutionNeed createExecutionNeed(String featureCategory, IDiscreteValueDeviation usages) {
ExecutionNeed exeNeed = AmaltheaFactory.eINSTANCE.createExecutionNeed();
exeNeed.getNeeds().put(featureCategory, usages);
return exeNeed;
}
/**
* Creates ExecutionNeed for a feature, need set.
*/
public static ExecutionNeed createExecutionNeed(HwFeature feature, IDiscreteValueDeviation usages) {
ExecutionNeed exeNeed = AmaltheaFactory.eINSTANCE.createExecutionNeed();
exeNeed.getNeeds().put(feature.getContainingCategory().getName(), usages);
return exeNeed;
}
public static DiscreteValueConstant createLatency(long value) {
return createDiscreteValueConstant(value);
}
public static StringObject createStringObject(String value) {
StringObject valueObject = AmaltheaFactory.eINSTANCE.createStringObject();
valueObject.setValue(value);
return valueObject;
}
public static ReferenceObject createReferenceObject(IReferable value) {
ReferenceObject valueObject = AmaltheaFactory.eINSTANCE.createReferenceObject();
valueObject.setValue(value);
return valueObject;
}
public static IntegerObject createIntegerObject(int value) {
IntegerObject valueObject = AmaltheaFactory.eINSTANCE.createIntegerObject();
valueObject.setValue(value);
return valueObject;
}
public static LongObject createLongObject(long value) {
LongObject valueObject = AmaltheaFactory.eINSTANCE.createLongObject();
valueObject.setValue(value);
return valueObject;
}
public static BigIntegerObject createBigIntegerObject(BigInteger value) {
BigIntegerObject valueObject = AmaltheaFactory.eINSTANCE.createBigIntegerObject();
valueObject.setValue(value);
return valueObject;
}
public static FloatObject createFloatObject(float value) {
FloatObject valueObject = AmaltheaFactory.eINSTANCE.createFloatObject();
valueObject.setValue(value);
return valueObject;
}
public static DoubleObject createDoubleObject(double value) {
DoubleObject valueObject = AmaltheaFactory.eINSTANCE.createDoubleObject();
valueObject.setValue(value);
return valueObject;
}
public static BooleanObject createBooleanObject(boolean value) {
BooleanObject valueObject = AmaltheaFactory.eINSTANCE.createBooleanObject();
valueObject.setValue(value);
return valueObject;
}
public static ListObject createListObject(Collection<? extends Value> values) {
ListObject valueObject = AmaltheaFactory.eINSTANCE.createListObject();
valueObject.getValues().addAll(values);
return valueObject;
}
}