regenerate_mm.py 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. from state.devstate import DevState
  2. from bootstrap.scd import bootstrap_scd
  3. from concrete_syntax.textual_od import renderer
  4. from concrete_syntax.plantuml.renderer import render_class_diagram
  5. from concrete_syntax.plantuml.make_url import make_url
  6. from api.od import ODAPI
  7. from transformation.topify.topify import Topifier
  8. from transformation.merger import merge_models
  9. from util import loader
  10. from examples.semantics.operational.port import models
  11. import os
  12. THIS_DIR = os.path.dirname(__file__)
  13. # get file contents as string
  14. def read_file(filename):
  15. with open(THIS_DIR+'/'+filename) as file:
  16. return file.read()
  17. if __name__ == "__main__":
  18. state = DevState()
  19. scd_mmm = bootstrap_scd(state)
  20. # Load Petri Net meta-models
  21. pn_mm_cs = read_file('../../petrinet/metamodels/mm_design.od')
  22. pn_mm_rt_cs = pn_mm_cs + read_file('../../petrinet/metamodels/mm_runtime.od')
  23. pn_mm = loader.parse_and_check(state, pn_mm_cs, scd_mmm, "Petri-Net Design meta-model")
  24. pn_mm_rt = loader.parse_and_check(state, pn_mm_rt_cs, scd_mmm, "Petri-Net Runtime meta-model")
  25. # Load Port meta-models
  26. port_mm = loader.parse_and_check(state, models.port_mm_cs, scd_mmm, "Port-MM")
  27. port_mm_rt = loader.parse_and_check(state, models.port_rt_mm_cs, scd_mmm, "Port-MM-RT")
  28. # Merge Petri Net and Port meta-models
  29. print("merging...")
  30. merged_mm_rt = merge_models(state, mm=scd_mmm, models=[pn_mm_rt, port_mm_rt])
  31. print("done merging")
  32. print()
  33. print("topifying... (may take a while)")
  34. topifier = Topifier(state)
  35. top_merged_mm_rt = topifier.topify_cd(merged_mm_rt)
  36. print("done topifying")
  37. plantuml_url = make_url(render_class_diagram(state, top_merged_mm_rt))
  38. print()
  39. print(plantuml_url)
  40. print()
  41. txt = renderer.render_od(state, top_merged_mm_rt, scd_mmm)
  42. filename = THIS_DIR+"/merged_mm.od"
  43. with open(filename, "w") as file:
  44. file.write(f"# Auto-generated by {__file__}.\n\n")
  45. file.write(f"# Merged run-time meta-models of 'Petri Net' and 'Port' formalisms.\n")
  46. file.write(f"# An abstract 'Top'-class (superclass of everything else), and a 'generic_link'-association (which can connect everything with everything) have also been added.\n\n")
  47. file.write(f"# PlantUML visualization: {plantuml_url}\n\n")
  48. file.write(txt)
  49. print("Wrote file", filename)