ControlConditionSwitch.xtend 5.6 KB

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