ControlConditionSwitch.xtend 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. package be.uantwerpen.ansymo.semanticadaptation.cg.cpp.generation
  2. import be.uantwerpen.ansymo.semanticadaptation.cg.cpp.data.GlobalInOutVariable
  3. import be.uantwerpen.ansymo.semanticadaptation.cg.cpp.data.ReturnInformation
  4. import be.uantwerpen.ansymo.semanticadaptation.cg.cpp.data.SAScalarVariable
  5. import be.uantwerpen.ansymo.semanticadaptation.cg.cpp.data.SVType
  6. import be.uantwerpen.ansymo.semanticadaptation.semanticAdaptation.ControlRuleBlock
  7. import be.uantwerpen.ansymo.semanticadaptation.semanticAdaptation.CurrentTime
  8. import be.uantwerpen.ansymo.semanticadaptation.semanticAdaptation.CustomControlRule
  9. import be.uantwerpen.ansymo.semanticadaptation.semanticAdaptation.DoStep
  10. import be.uantwerpen.ansymo.semanticadaptation.semanticAdaptation.DoStepFun
  11. import be.uantwerpen.ansymo.semanticadaptation.semanticAdaptation.StepSize
  12. import be.uantwerpen.ansymo.semanticadaptation.semanticAdaptation.Variable
  13. import java.util.LinkedHashMap
  14. import be.uantwerpen.ansymo.semanticadaptation.semanticAdaptation.Port
  15. import be.uantwerpen.ansymo.semanticadaptation.semanticAdaptation.Assignment
  16. import be.uantwerpen.ansymo.semanticadaptation.cg.cpp.data.MappedScalarVariable
  17. import be.uantwerpen.ansymo.semanticadaptation.semanticAdaptation.SaveState
  18. import be.uantwerpen.ansymo.semanticadaptation.semanticAdaptation.Close
  19. import be.uantwerpen.ansymo.semanticadaptation.semanticAdaptation.BreakStatement
  20. import be.uantwerpen.ansymo.semanticadaptation.semanticAdaptation.Rollback
  21. import java.util.List
  22. class ControlConditionSwitch extends RulesConditionSwitch {
  23. new(
  24. String adaptationClassName,
  25. String adaptationName,
  26. LinkedHashMap<String, LinkedHashMap<String, MappedScalarVariable>> mSVars,
  27. LinkedHashMap<String, SAScalarVariable> SASVs,
  28. LinkedHashMap<String, GlobalInOutVariable> params,
  29. LinkedHashMap<String, GlobalInOutVariable> inVars,
  30. LinkedHashMap<String, GlobalInOutVariable> outVars,
  31. LinkedHashMap<String, GlobalInOutVariable> crtlVars
  32. ) {
  33. super(adaptationClassName, adaptationName, "", mSVars, SASVs, params, inVars, outVars, crtlVars);
  34. }
  35. override ReturnInformation caseAssignment(Assignment object) {
  36. if (object.lvalue.owner !== null) {
  37. var retVal = new ReturnInformation();
  38. retVal.code = '''setValue(«object.lvalue.owner.name»,«mSVars.get(object.lvalue.owner.name).get(object.lvalue.ref.name).define»,«doSwitch(object.expr).code»)'''
  39. return retVal;
  40. } else {
  41. return super.caseAssignment(object);
  42. }
  43. }
  44. override ReturnInformation caseVariable(Variable object) {
  45. var retVal = new ReturnInformation();
  46. // H and t are protected variables and are handles by caseStepSize and caseCurrentTime respectively.
  47. // if ((object.owner === null || object.owner.name == this.adaptationName) &&
  48. // (object.ref.name == "H" || object.ref.name == "t")) {
  49. // retVal.type = SVType.Real;
  50. // retVal.forceType = true;
  51. // retVal.code = object.ref.name;
  52. // } else {
  53. retVal = super.caseVariable(object);
  54. // }
  55. return retVal;
  56. }
  57. public def LinkedHashMap<String, GlobalInOutVariable> getGlobalVars(ControlRuleBlock object) {
  58. if (object.globalCtrlVars !== null) {
  59. this.globalDeclaration = true;
  60. for (gVar : object.globalCtrlVars)
  61. doSwitch(gVar);
  62. this.globalDeclaration = false;
  63. }
  64. return this.gVars;
  65. }
  66. override ReturnInformation caseControlRuleBlock(ControlRuleBlock object) {
  67. var retVal = new ReturnInformation();
  68. //
  69. // // Get the global variables added to globalVars
  70. // this.globalDeclaration = true;
  71. // for (gVar : object.globalCtrlVars) {
  72. // constructorInitialization += doSwitch(gVar).code;
  73. // }
  74. // this.globalDeclaration = false;
  75. retVal.appendCode(doSwitch(object.rule).code);
  76. return retVal;
  77. }
  78. override ReturnInformation caseCustomControlRule(CustomControlRule object) {
  79. var retVal = new ReturnInformation();
  80. var String tempDoSwitchCode = "";
  81. for (ruleStm : object.controlRulestatements) {
  82. tempDoSwitchCode += doSwitch(ruleStm).code;
  83. }
  84. tempDoSwitchCode += System.lineSeparator() + '''return «doSwitch(object.returnstatement.expr).code»;
  85. ''';
  86. var functionPrefix = "double ";
  87. var functionNameArgs = "executeInternalControlFlow(double H, double t)"
  88. functionSignatures.add(functionPrefix + functionNameArgs);
  89. retVal.code = '''
  90. «functionPrefix+this.adaptationClassName»::«functionNameArgs»
  91. {
  92. «tempDoSwitchCode»
  93. }
  94. ''';
  95. return retVal;
  96. }
  97. override ReturnInformation caseDoStepFun(DoStepFun object) {
  98. var retVal = new ReturnInformation();
  99. retVal.code = '''this->do_step(«object.fmu.name»,«doSwitch(object.h).code»,«doSwitch(object.t).code»)''';
  100. retVal.type = SVType.Integer;
  101. return retVal;
  102. }
  103. override ReturnInformation caseDoStep(DoStep object) {
  104. var retVal = new ReturnInformation();
  105. retVal.code = '''this->do_step(«object.fmu.name»,«doSwitch(object.h).code»,«doSwitch(object.t).code»)''';
  106. return retVal;
  107. }
  108. override ReturnInformation caseStepSize(StepSize object) {
  109. var retVal = new ReturnInformation();
  110. retVal.code = '''H''';
  111. retVal.type = SVType.Real;
  112. retVal.forceType = true;
  113. return retVal;
  114. }
  115. override ReturnInformation caseCurrentTime(CurrentTime object) {
  116. var retVal = new ReturnInformation();
  117. retVal.code = '''t''';
  118. retVal.type = SVType.Real;
  119. retVal.forceType = true;
  120. return retVal;
  121. }
  122. override ReturnInformation caseSaveState(SaveState object) {
  123. var retVal = new ReturnInformation();
  124. retVal.appendCode('''
  125. saveState(«object.fmu.name»)''')
  126. return retVal;
  127. }
  128. override ReturnInformation caseClose(Close object) {
  129. var retVal = new ReturnInformation();
  130. retVal.code = '''is_close(«object.args.map[e | doSwitch(e).code].join(", ")»)''';
  131. return retVal;
  132. }
  133. override ReturnInformation caseBreakStatement(BreakStatement object) {
  134. var retVal = new ReturnInformation();
  135. retVal.appendCode('''break''')
  136. return retVal;
  137. }
  138. override ReturnInformation caseRollback(Rollback object) {
  139. var retVal = new ReturnInformation();
  140. retVal.appendCode('''rollback(«object.fmu.name»)''')
  141. return retVal;
  142. }
  143. }