blob: 0198f5a9eb57e160ecac0aeed2e8711157d1bab5 [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.commons.m2t.generators
import java.util.List
import org.eclipse.app4mc.amalthea.model.Label
import org.eclipse.app4mc.slg.commons.m2t.AmaltheaModelUtils
class LabelGenerator {
// Suppress default constructor
private new() {
throw new IllegalStateException("Utility class");
}
// ---------- names of generated 'C' functions ----------
static def String initCall(Label label) '''initialize_«label.name»()'''
static def String readCall(Label label, String param) '''read_«label.name»(«param»)'''
static def String writeCall(Label label, String param) '''write_«label.name»(«param»)'''
// ---------- generate file contents ----------
static def String toCMake(String libName, List<String> srcFiles)
'''
# «libName» ################################################################
####
add_library(«libName» STATIC
«FOR srcFile : srcFiles»
${CMAKE_CURRENT_LIST_DIR}/_src/«srcFile»
«ENDFOR»
)
target_include_directories(«libName»
PUBLIC ${CMAKE_CURRENT_LIST_DIR}/_inc
)
'''
static def String toH(Label label)
'''
void «initCall(label)»;
void «readCall(label, "int labelAccessStatistics")»;
void «writeCall(label, "int labelAccessStatistics")»;
'''
static def String toCpp(Label label)
'''
int «label.name»[«AmaltheaModelUtils.getLabelArraySize(label)»];
static bool isIinitialized_«label.name» = false;
void «initCall(label)» {
if (!isIinitialized_«label.name»){
for (int i=0; i < «AmaltheaModelUtils.getLabelArraySize(label)»; i++){
«label.name»[i] = i+1;
}
isIinitialized_«label.name» = true;
}
}
void «readCall(label, "int labelAccessStatistics")» {
int numberOfBytes = «label?.size?.numberBytes»;
for (int repeat = 0 ; repeat < labelAccessStatistics; repeat++){
if(numberOfBytes < 4){
numberOfBytes = 4;
}
int arraysize = sizeof(«label.name») / 4;
//printf("number of bytes:%d\n",arraysize);
int leftOverElements=arraysize%10;
int arraySizeWith10Multiples=arraysize-leftOverElements;
int i = 0;
int a = 0;
for (i = 0; i < arraySizeWith10Multiples; i = i + 10) { //iteration with 10 reads
a = «label.name»[i];
a = «label.name»[i+1];
a = «label.name»[i+2];
a = «label.name»[i+3];
a = «label.name»[i+4];
a = «label.name»[i+5];
a = «label.name»[i+6];
a = «label.name»[i+7];
a = «label.name»[i+8];
a = «label.name»[i+9];
}
for(;i<arraysize;i++){
a = «label.name»[i];
}
}
}
void «writeCall(label, "int labelAccessStatistics")» {
int numberOfBytes = «label?.size?.numberBytes»;
for (int repeat = 0 ; repeat < labelAccessStatistics; repeat++){
if(numberOfBytes < 4){
numberOfBytes = 4;
}
int arraysize = sizeof(«label.name») / 4;
int leftOverElements=arraysize%10;
int arraySizeWith10Multiples=arraysize-leftOverElements;
int i = 0;
for (i = 0; i < arraySizeWith10Multiples; i = i + 10) {
«label.name»[i] = 0xAFFE;
«label.name»[i+1] = 0xAFFE;
«label.name»[i+2] = 0xAFFE;
«label.name»[i+3] = 0xAFFE;
«label.name»[i+4] = 0xAFFE;
«label.name»[i+5] = 0xAFFE;
«label.name»[i+6] = 0xAFFE;
«label.name»[i+7] = 0xAFFE;
«label.name»[i+8] = 0xAFFE;
«label.name»[i+9] = 0xAFFE;
}
for(;i<arraysize;i++){
«label.name»[i]=0xAFFE;
}
}
}
'''
}