models.py 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. # This module loads all the models (including the transformation rules) and performs a conformance-check on them.
  2. import os
  3. from framework.conformance import Conformance, render_conformance_check_result
  4. from concrete_syntax.textual_od import parser
  5. from transformation.ramify import ramify
  6. # get file contents as string
  7. def read_file(filename):
  8. dir = os.path.dirname(__file__)
  9. with open(dir+'/'+filename) as file:
  10. return file.read()
  11. def parse_and_check(state, m_cs, mm, descr: str):
  12. try:
  13. m = parser.parse_od(
  14. state,
  15. m_text=m_cs,
  16. mm=mm,
  17. )
  18. except Exception as e:
  19. e.add_note("While parsing model " + descr)
  20. raise
  21. try:
  22. conf = Conformance(state, m, mm)
  23. errors = conf.check_nominal()
  24. if len(errors) > 0:
  25. print(render_conformance_check_result(errors))
  26. except Exception as e:
  27. e.add_note("In model " + descr)
  28. raise
  29. return m
  30. def get_metamodels(state, scd_mmm):
  31. mm_cs = read_file('models/mm_design.od')
  32. mm_rt_cs = mm_cs + read_file('models/mm_runtime.od')
  33. mm = parse_and_check(state, mm_cs, scd_mmm, "Design meta-model")
  34. mm_rt = parse_and_check(state, mm_rt_cs, scd_mmm, "Runtime meta-model")
  35. return (mm, mm_rt)
  36. def get_fibonacci(state, scd_mmm):
  37. mm, mm_rt = get_metamodels(state, scd_mmm)
  38. m_cs = read_file('models/m_fibonacci.od')
  39. m_rt_initial_cs = m_cs + read_file('models/m_fibonacci_initial.od')
  40. m = parse_and_check(state, m_cs, mm, "Fibonacci model")
  41. m_rt_initial = parse_and_check(state, m_rt_initial_cs, mm_rt, "Fibonacci initial state")
  42. return (mm, mm_rt, m, m_rt_initial)
  43. RULE_NAMES = ["delay"]
  44. KINDS = ["nac", "lhs", "rhs"]
  45. def get_rules(state, rt_mm):
  46. rt_mm_ramified = ramify(state, rt_mm)
  47. rules = {} # e.g., { "delay": {"nac": <UUID>, "lhs": <UUID>, ...}, ...}
  48. for rule_name in RULE_NAMES:
  49. rule = {}
  50. for kind in KINDS:
  51. filename = f"models/r_{rule_name}_{kind}.od";
  52. cs = read_file(filename)
  53. rule_m = parse_and_check(state, cs, rt_mm_ramified, descr=f"'{filename}'")
  54. rule[kind] = rule_m
  55. rules[rule_name] = rule
  56. return (rt_mm_ramified, rules)