123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165 |
- package be.uantwerpen.ansymo.semanticadaptation.cg.cpp.generation
- import be.uantwerpen.ansymo.semanticadaptation.cg.cpp.data.GlobalInOutVariable
- import be.uantwerpen.ansymo.semanticadaptation.cg.cpp.data.ReturnInformation
- import be.uantwerpen.ansymo.semanticadaptation.cg.cpp.data.SAScalarVariable
- import be.uantwerpen.ansymo.semanticadaptation.cg.cpp.data.SVType
- import be.uantwerpen.ansymo.semanticadaptation.semanticAdaptation.ControlRuleBlock
- import be.uantwerpen.ansymo.semanticadaptation.semanticAdaptation.CurrentTime
- import be.uantwerpen.ansymo.semanticadaptation.semanticAdaptation.CustomControlRule
- import be.uantwerpen.ansymo.semanticadaptation.semanticAdaptation.DoStep
- import be.uantwerpen.ansymo.semanticadaptation.semanticAdaptation.DoStepFun
- import be.uantwerpen.ansymo.semanticadaptation.semanticAdaptation.StepSize
- import be.uantwerpen.ansymo.semanticadaptation.semanticAdaptation.Variable
- import java.util.LinkedHashMap
- import be.uantwerpen.ansymo.semanticadaptation.semanticAdaptation.Port
- import be.uantwerpen.ansymo.semanticadaptation.semanticAdaptation.Assignment
- import be.uantwerpen.ansymo.semanticadaptation.cg.cpp.data.MappedScalarVariable
- import be.uantwerpen.ansymo.semanticadaptation.semanticAdaptation.SaveState
- import be.uantwerpen.ansymo.semanticadaptation.semanticAdaptation.Close
- import be.uantwerpen.ansymo.semanticadaptation.semanticAdaptation.BreakStatement
- import be.uantwerpen.ansymo.semanticadaptation.semanticAdaptation.Rollback
- import java.util.List
- class ControlConditionSwitch extends RulesConditionSwitch {
- new(
- String adaptationClassName,
- String adaptationName,
- LinkedHashMap<String, LinkedHashMap<String, MappedScalarVariable>> mSVars,
- LinkedHashMap<String, SAScalarVariable> SASVs,
- LinkedHashMap<String, GlobalInOutVariable> params,
- LinkedHashMap<String, GlobalInOutVariable> inVars,
- LinkedHashMap<String, GlobalInOutVariable> outVars,
- LinkedHashMap<String, GlobalInOutVariable> crtlVars
- ) {
- super(adaptationClassName, adaptationName, "", mSVars, SASVs, params, inVars, outVars, crtlVars);
- }
- override ReturnInformation caseAssignment(Assignment object) {
- if (object.lvalue.owner !== null) {
- var retVal = new ReturnInformation();
- retVal.code = '''setValue(«object.lvalue.owner.name»,«mSVars.get(object.lvalue.owner.name).get(object.lvalue.ref.name).define»,«doSwitch(object.expr).code»)'''
- return retVal;
- } else {
- return super.caseAssignment(object);
- }
- }
- override ReturnInformation caseVariable(Variable object) {
- var retVal = new ReturnInformation();
- // H and t are protected variables and are handles by caseStepSize and caseCurrentTime respectively.
- // if ((object.owner === null || object.owner.name == this.adaptationName) &&
- // (object.ref.name == "H" || object.ref.name == "t")) {
- // retVal.type = SVType.Real;
- // retVal.forceType = true;
- // retVal.code = object.ref.name;
- // } else {
- retVal = super.caseVariable(object);
- // }
- return retVal;
- }
- public def LinkedHashMap<String, GlobalInOutVariable> getGlobalVars(ControlRuleBlock object) {
- if (object.globalCtrlVars !== null) {
- this.globalDeclaration = true;
- for (gVar : object.globalCtrlVars)
- doSwitch(gVar);
- this.globalDeclaration = false;
- }
- return this.gVars;
- }
- override ReturnInformation caseControlRuleBlock(ControlRuleBlock object) {
- var retVal = new ReturnInformation();
- //
- // // Get the global variables added to globalVars
- // this.globalDeclaration = true;
- // for (gVar : object.globalCtrlVars) {
- // constructorInitialization += doSwitch(gVar).code;
- // }
- // this.globalDeclaration = false;
- retVal.appendCode(doSwitch(object.rule).code);
- return retVal;
- }
- override ReturnInformation caseCustomControlRule(CustomControlRule object) {
- var retVal = new ReturnInformation();
- var String tempDoSwitchCode = "";
- for (ruleStm : object.controlRulestatements) {
- tempDoSwitchCode += doSwitch(ruleStm).code;
- }
- tempDoSwitchCode += System.lineSeparator() + '''return «doSwitch(object.returnstatement.expr).code»;
- ''';
- var functionPrefix = "double ";
- var functionNameArgs = "executeInternalControlFlow(double H, double t)"
- functionSignatures.add(functionPrefix + functionNameArgs);
- retVal.code = '''
- «functionPrefix+this.adaptationClassName»::«functionNameArgs»
- {
- «tempDoSwitchCode»
- }
- ''';
- return retVal;
- }
- override ReturnInformation caseDoStepFun(DoStepFun object) {
- var retVal = new ReturnInformation();
- retVal.code = '''this->do_step(«object.fmu.name»,«doSwitch(object.h).code»,«doSwitch(object.t).code»)''';
- retVal.type = SVType.Integer;
- return retVal;
- }
- override ReturnInformation caseDoStep(DoStep object) {
- var retVal = new ReturnInformation();
- retVal.code = '''this->do_step(«object.fmu.name»,«doSwitch(object.h).code»,«doSwitch(object.t).code»)''';
- return retVal;
- }
- override ReturnInformation caseStepSize(StepSize object) {
- var retVal = new ReturnInformation();
- retVal.code = '''H''';
- retVal.type = SVType.Real;
- retVal.forceType = true;
- return retVal;
- }
- override ReturnInformation caseCurrentTime(CurrentTime object) {
- var retVal = new ReturnInformation();
- retVal.code = '''t''';
- retVal.type = SVType.Real;
- retVal.forceType = true;
- return retVal;
- }
- override ReturnInformation caseSaveState(SaveState object) {
- var retVal = new ReturnInformation();
- retVal.appendCode('''
- saveState(«object.fmu.name»)''')
- return retVal;
- }
- override ReturnInformation caseClose(Close object) {
- var retVal = new ReturnInformation();
- retVal.code = '''is_close(«object.args.map[e | doSwitch(e).code].join(", ")»)''';
- return retVal;
- }
- override ReturnInformation caseBreakStatement(BreakStatement object) {
- var retVal = new ReturnInformation();
- retVal.appendCode('''break''')
- return retVal;
- }
- override ReturnInformation caseRollback(Rollback object) {
- var retVal = new ReturnInformation();
- retVal.appendCode('''rollback(«object.fmu.name»)''')
- return retVal;
- }
- }
|