ControlConditionSwitch.xtend 5.6 KB

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