dtcbd_merge.alc 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. include "primitives.alh"
  2. include "modelling.alh"
  3. include "object_operations.alh"
  4. include "conformance_scd.alh"
  5. include "utils.alh"
  6. include "typing.alh"
  7. include "mini_modify.alh"
  8. String function map_P2F(model : Element, name : String):
  9. Element destinations
  10. String pick
  11. destinations = allAssociationDestinations(model, name, "P2F_block")
  12. pick = name
  13. while (pick == name):
  14. pick = set_pop(destinations)
  15. return pick!
  16. Boolean function main(model : Element):
  17. Element all_blocks
  18. String element_name
  19. Float current_time
  20. String time_block
  21. log("Merging!")
  22. all_blocks = allInstances(model, "PartialRuntime/Block")
  23. while (set_len(all_blocks) > 0):
  24. element_name = set_pop(all_blocks)
  25. if (set_len(allOutgoingAssociationInstances(model, element_name, "P2F_block")) > 0):
  26. // Element already exists in full, so copy existing attributes
  27. if (is_nominal_instance(model, element_name, "PartialRuntime/ICBlock")):
  28. instantiate_attribute(model, element_name, "last_in", read_attribute(model, map_P2F(model, element_name), "last_in"))
  29. // instantiate_attribute(model, element_name, "signal", read_attribute(model, map_P2F(model, element_name), "signal"))
  30. else:
  31. // Element doesn't exist, so initialize with 0.0
  32. instantiate_attribute(model, element_name, "signal", 0.0)
  33. instantiate_link(model, "P2F_block", "", element_name, element_name)
  34. if (set_len(allInstances(model, "FullRuntime/Time")) > 0):
  35. // Time already exists, so copy the value
  36. current_time = read_attribute(model, set_pop(allInstances(model, "FullRuntime/Time")), "current_time")
  37. else:
  38. // No time yet, so initialize
  39. current_time = 0.0
  40. time_block = instantiate_node(model, "PartialRuntime/Time", "")
  41. instantiate_attribute(model, time_block, "start_time", current_time)
  42. instantiate_attribute(model, time_block, "current_time", current_time)
  43. Element all_elements
  44. String elem
  45. all_elements = dict_keys(model["model"])
  46. while (set_len(all_elements) > 0):
  47. elem = set_pop(all_elements)
  48. if (string_startswith(read_type(model, elem), "PartialRuntime/")):
  49. retype(model, elem, "NewFullRuntime/" + cast_string(list_read(string_split_nr(read_type(model, elem), "/", 1), 1)))
  50. log("Merge OK")
  51. return True!