blob: 978246fa632f709c0e24348853122bb41e994548 [file] [log] [blame]
/**
********************************************************************************
* Copyright (c) 2020-2021 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.slg.linux.generators
import org.eclipse.app4mc.amalthea.model.impl.DiscreteValueConstantImpl
import org.eclipse.app4mc.amalthea.model.impl.DiscreteValueStatisticsImpl
import org.eclipse.app4mc.slg.config.ConfigModel
import org.eclipse.app4mc.slg.config.TickType
class LinuxTicksUtilsGenerator {
// Suppress default constructor
private new() {
throw new IllegalStateException("Utility class");
}
// ---------- names of generated 'C' functions ----------
static def String getExecCall(String params) '''burnTicks(«params»)'''
/*'''executeTicks_«valueClass.toString.split("\\.").last»(«params»)'''*/
//--------------------------------------------------------------------
static def String generateTicks(Object valueClass) {
switch valueClass {
case DiscreteValueConstantImpl: '''
void «getExecCall("int ticks")» {
burnTicks(ticks);
}
'''
case DiscreteValueStatisticsImpl: '''
void «getExecCall("double average, int lowerBound, int upperBound")» {
burnTicksStatistics(average, lowerBound, upperBound);
}
'''
default: ''''''
/*
'''
WARNING:VALUE_FORMAT_NOT_SUPPORTED: «valueClass»
''' */
}
}
// static def dispatch String generateTicks(IDiscreteValueDeviation value) '''
// WARNING:VALUE_FORMAT_NOT_SUPPORTED: IDiscreteValueDeviation
// '''
//
// static def dispatch String generateTicks(DiscreteValueBetaDistribution value) '''
// WARNING:VALUE_FORMAT_NOT_SUPPORTED: DiscreteValueBetaDistribution
// '''
//
// static def dispatch String generateTicks(DiscreteValueBoundaries value) '''
// WARNING:VALUE_FORMAT_NOT_SUPPORTED: DiscreteValueBoundaries
// '''
//
// static def dispatch String generateTicks(DiscreteValueConstant value) '''
// void «call»(int ticks) {
// burnTicks(ticks);
// }
//
// '''
//
// static def dispatch String generateTicks(DiscreteValueGaussDistribution value) '''
// WARNING:VALUE_FORMAT_NOT_SUPPORTED:DiscreteValueGaussDistribution
// '''
//
// static def dispatch String generateTicks(DiscreteValueHistogram value) '''
// WARNING:VALUE_FORMAT_NOT_SUPPORTED:DiscreteValueHistogram
// '''
//
//// TODO:what to do with boundaries, maybe better toggle between upper/lower or random selection from range
// static def dispatch String generateTicks(DiscreteValueStatistics value) '''
// void «call»(double average, int lowerBound, int upperBound) {
// burnTicksStatistics(average, lowerBound, upperBound);
// }
// '''
//
// static def dispatch String generateTicks(DiscreteValueUniformDistribution value) '''
// WARNING:VALUE_FORMAT_NOT_SUPPORTED:DiscreteValueUniformDistribution
// '''
//
// static def dispatch String generateTicks(DiscreteValueWeibullEstimatorsDistribution value) '''
// WARNING:VALUE_FORMAT_NOT_SUPPORTED:DiscreteValueWeibullEstimatorsDistribution
// '''
// ----- public interfaces -----
static def String burnTicks(String burnTicksBody) '''
void burnTicks(int ticks) {
«burnTicksBody»
}
'''
// select statistics parameter according to configuration model
// TODO: choose final names of configuration parameters
static def String chooseTicks(ConfigModel configModel) {
switch configModel.defaultTickType {
case TickType.MINIMUM: "lowerBound"
case TickType.MAXIMUM: "upperBound"
case TickType.AVERAGE : "(int)average"
default: "(int)average"
}
}
static def String burnTicksStatistics(ConfigModel configModel) '''
void burnTicksStatistics(double average, int lowerBound, int upperBound) {
burnTicks(«chooseTicks(configModel)»);
}
'''
// ----- default implementations -----
static def String burnTicksDefault() '''
// default implementation of tick burning
int numLoops = ticks / 400;
# if defined (__x86_64__)
int i;
for (i = 0; i < numLoops; i++) {
«FOR i : 1..400»
__asm volatile("nop");
«ENDFOR»
}
# elif defined (__x86_32__)
for (i = 0; i < numLoops; i++) {
«FOR i : 1..400»
__asm volatile("mov r0, r0");
«ENDFOR»
}
# elif defined (__aarch64__)
for (i = 0; i < numLoops; i++) {
«FOR i : 1..400»
__asm volatile("mov x0, x0");
«ENDFOR»
}
# endif
'''
//********************** API's to generate decleration **************************
static def String burnTicksDecleration() '''
void burnTicks(int ticks);
'''
static def String burnTicksStatisticsDecleration() '''
void burnTicksStatistics(double average, int lowerBound, int upperBound);
'''
static def String generateTicksDecleration(Object valueClass) {
switch valueClass {
case DiscreteValueConstantImpl: '''
void «getExecCall("int ticks")»;
'''
case DiscreteValueStatisticsImpl: '''
void «getExecCall("double average, int lowerBound, int upperBound")»;
'''
default: ''''''
/*
'''
WARNING:VALUE_FORMAT_NOT_SUPPORTED: «valueClass»
''' */
}
}
// static def dispatch String generateTicksDecleration(IDiscreteValueDeviation value) '''
// WARNING:VALUE_FORMAT_NOT_SUPPORTED: IDiscreteValueDeviation
// '''
//
// static def dispatch String generateTicksDecleration(DiscreteValueBetaDistribution value) '''
// WARNING:VALUE_FORMAT_NOT_SUPPORTED: DiscreteValueBetaDistribution
// '''
//
// static def dispatch String generateTicksDecleration(DiscreteValueBoundaries value) '''
// WARNING:VALUE_FORMAT_NOT_SUPPORTED: DiscreteValueBoundaries
// '''
//
// static def dispatch String generateTicksDecleration(DiscreteValueConstant value) '''
// void «call»(int ticks);
//
// '''
//
// static def dispatch String generateTicksDecleration(DiscreteValueGaussDistribution value) '''
// WARNING:VALUE_FORMAT_NOT_SUPPORTED:DiscreteValueGaussDistribution
// '''
//
// static def dispatch String generateTicksDecleration(DiscreteValueHistogram value) '''
// WARNING:VALUE_FORMAT_NOT_SUPPORTED:DiscreteValueHistogram
// '''
//
//// TODO:what to do with boundaries, maybe better toggle between upper/lower or random selection from range
// static def dispatch String generateTicksDecleration(DiscreteValueStatistics value) '''
// void «call»(double average, int lowerBound, int upperBound) ;
// '''
//
// static def dispatch String generateTicksDecleration(DiscreteValueUniformDistribution value) '''
// WARNING:VALUE_FORMAT_NOT_SUPPORTED:DiscreteValueUniformDistribution
// '''
//
// static def dispatch String generateTicksDecleration(DiscreteValueWeibullEstimatorsDistribution value) '''
// WARNING:VALUE_FORMAT_NOT_SUPPORTED:DiscreteValueWeibullEstimatorsDistribution
// '''
}