cbd_semantics.alc 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. include "primitives.alh"
  2. include "modelling.alh"
  3. include "object_operations.alh"
  4. include "library.alh"
  5. include "conformance_scd.alh"
  6. Void function main():
  7. Element model
  8. String verify_result
  9. while (True):
  10. output("Which model do you want to execute with CBD semantics?")
  11. model = import_node(input())
  12. if (element_eq(model, read_root())):
  13. output("Could not find model; aborting")
  14. elif (element_neq(model["metamodel"], import_node("models/CausalBlockDiagrams_Design"))):
  15. output("Not a CBD design model; aborting")
  16. else:
  17. verify_result = conformance_scd(model)
  18. if (verify_result == "OK"):
  19. output("Model OK!")
  20. execute_cbd(model)
  21. else:
  22. output("Non-conforming model: " + verify_result)
  23. Void function translate_to_runtime(design_model : Element):
  24. Element runtime_model
  25. Element all_blocks
  26. Element all_links
  27. String mm_type_name
  28. String element_name
  29. String attr_name
  30. String attr_value
  31. String attribute
  32. String src
  33. String dst
  34. Element all_attributes
  35. output("Translating to runtime model!")
  36. output("Creating empty runtime model")
  37. runtime_model = instantiate_model("models/CausalBlockDiagrams_Runtime")
  38. output("Converting blocks")
  39. all_blocks = allInstances(design_model, "Block")
  40. while (list_len(all_blocks) > 0):
  41. element_name = set_pop(all_blocks)
  42. mm_type_name = reverseKeyLookup(design_model["metamodel"]["model"], dict_read_node(design_model["type_mapping"], design_model["model"][element_name]))
  43. instantiate_node(runtime_model, mm_type_name, element_name)
  44. all_attributes = getAttributeList(design_model, element_name)
  45. while (read_nr_out(all_attributes) > 0):
  46. attr_name = set_pop(all_attributes)
  47. if (bool_not(set_in(runtime_model["model"], read_attribute(design_model, element_name, attr_name)))):
  48. instantiate_attribute(runtime_model, element_name, attr_name, read_attribute(design_model, element_name, attr_name))
  49. output(" Converted block " + element_name)
  50. // Don't merge this together with the block conversion, as the destination block might not exist yet!
  51. output("Relinking blocks")
  52. all_links = allInstances(design_model, "Link")
  53. while (read_nr_out(all_links) > 0):
  54. element_name = set_pop(all_links)
  55. src = reverseKeyLookup(design_model["model"], read_edge_src(design_model["model"][element_name]))
  56. dst = reverseKeyLookup(design_model["model"], read_edge_dst(design_model["model"][element_name]))
  57. instantiate_link(runtime_model, "Link", element_name, src, dst)
  58. output(((" Relinked blocks " + src) + " and ") + dst)
  59. output("Resetting initial conditions")
  60. all_links = allInstances(design_model, "InitialCondition")
  61. while (read_nr_out(all_links) > 0):
  62. element_name = set_pop(all_links)
  63. src = reverseKeyLookup(design_model["model"], read_edge_src(design_model["model"][element_name]))
  64. dst = reverseKeyLookup(design_model["model"], read_edge_dst(design_model["model"][element_name]))
  65. instantiate_link(runtime_model, "InitialCondition", element_name, src, dst)
  66. output(" Reset IC of " + dst)
  67. output("Creating schedule at time = 0")
  68. create_schedule(runtime_model, True)
  69. output("Creating schedule at time > 0")
  70. create_schedule(runtime_model, False)
  71. output("Solving loops (TODO)")
  72. output("DONE!")
  73. return !
  74. Void function create_schedule(model : Element, is_time_zero : Boolean):
  75. Element all_blocks
  76. Element visited
  77. Element to_visit
  78. Element incoming_links
  79. String schedule
  80. String element_name
  81. String link
  82. String source
  83. String new_schedule
  84. Boolean ready
  85. all_blocks = allInstances(model, "Block")
  86. visited = create_node()
  87. to_visit = create_node()
  88. if (is_time_zero):
  89. schedule = instantiate_node(model, "Schedule", "schedule_init")
  90. else:
  91. schedule = instantiate_node(model, "Schedule", "schedule_run")
  92. while (read_nr_out(all_blocks) > 0):
  93. element_name = set_pop(all_blocks)
  94. if (bool_not(set_in(visited, element_name))):
  95. list_append(to_visit, element_name)
  96. while (list_len(to_visit) > 0):
  97. element_name = list_read(to_visit, list_len(to_visit) - 1)
  98. if (reverseKeyLookup(model["metamodel"]["model"], dict_read_node(model["type_mapping"], model["model"][element_name])) == "DelayBlock"):
  99. if (is_time_zero):
  100. incoming_links = allIncomingAssociationInstances(model, element_name, "InitialCondition")
  101. else:
  102. incoming_links = create_node()
  103. else:
  104. incoming_links = allIncomingAssociationInstances(model, element_name, "Link")
  105. ready = True
  106. while (list_len(incoming_links) > 0):
  107. link = set_pop(incoming_links)
  108. source = readAssociationSource(model, link)
  109. if (bool_not(set_in(visited, source))):
  110. list_append(to_visit, source)
  111. ready = False
  112. if (ready):
  113. new_schedule = instantiate_node(model, "Schedule", "")
  114. instantiate_attribute(model, reverseKeyLookup(model["model"], schedule), "block", model["model"][element_name])
  115. instantiate_attribute(model, reverseKeyLookup(model["model"], schedule), "next", model["model"][new_schedule])
  116. schedule = new_schedule
  117. list_delete(to_visit, list_len(to_visit) - 1)
  118. set_add(visited, element_name)
  119. return !
  120. Void function execute_cbd(model : Element):
  121. translate_to_runtime(model)
  122. String cmd
  123. while (True):
  124. output("Which operation do you want to execute?")
  125. cmd = input()
  126. if (cmd == "help"):
  127. output("Supported operations:")
  128. output(" start -- start simulation")
  129. output(" pause -- pause simulation")
  130. output(" modify -- live modelling: modify model structure")
  131. output(" list -- list blocks and connections")
  132. output(" help -- this information")
  133. output(" exit -- select another model")
  134. elif (cmd == "exit"):
  135. return!
  136. else:
  137. output("Did not understand command!")
  138. output("Use 'help' for a list of available options")