main.py 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import argparse
  2. import sys
  3. import time
  4. from pypdevs.minimal import CoupledDEVS
  5. from pypdevs.minimal import Simulator
  6. from devstone import LI, HI, HO, HOmod
  7. from generator import Generator
  8. sys.setrecursionlimit(10000)
  9. class DEVStoneEnvironment(CoupledDEVS):
  10. def __init__(self, name, devstone_model, num_gen_outputs=1, gen_period=None):
  11. super(DEVStoneEnvironment, self).__init__(name=name)
  12. generator = Generator("generator", num_gen_outputs, gen_period)
  13. self.addSubModel(generator)
  14. self.addSubModel(devstone_model)
  15. self.connectPorts(generator.o_out, devstone_model.i_in)
  16. if isinstance(devstone_model, HO) or isinstance(devstone_model, HOmod):
  17. self.connectPorts(generator.o_out, devstone_model.i_in2)
  18. MODEL_TYPES = ("LI", "HI", "HO", "HOmod")
  19. def parse_args():
  20. parser = argparse.ArgumentParser(description='Script to compare DEVStone implementations with different engines')
  21. parser.add_argument('-m', '--model-type', required=True, help='DEVStone model type (LI, HI, HO, HOmod)')
  22. parser.add_argument('-d', '--depth', type=int, required=True, help='Number of recursive levels of the model.')
  23. parser.add_argument('-w', '--width', type=int, required=True, help='Width of each coupled model.')
  24. parser.add_argument('-i', '--int-cycles', type=int, default=0, help='Dhrystone cycles executed in internal transitions')
  25. parser.add_argument('-e', '--ext-cycles', type=int, default=0, help='Dhrystone cycles executed in external transitions')
  26. parser.add_argument('-f', '--flatten', action="store_true", help='Activate flattening on model')
  27. parser.add_argument('-c', '--chained', action="store_true", help='Use chained coordinator')
  28. parser.add_argument('-D', '--dynamic', action="store_true", default=False, help='Enables Dynamic Structure DEVS')
  29. args = parser.parse_args()
  30. if args.model_type not in MODEL_TYPES:
  31. raise RuntimeError("Unrecognized model type.")
  32. return args
  33. if __name__ == '__main__':
  34. args = parse_args()
  35. devstone_model = None
  36. start_time = time.time()
  37. if args.model_type == "LI":
  38. devstone_model = LI("LI_root", args.depth, args.width, args.int_cycles, args.ext_cycles)
  39. elif args.model_type == "HI":
  40. devstone_model = HI("HI_root", args.depth, args.width, args.int_cycles, args.ext_cycles)
  41. elif args.model_type == "HO":
  42. devstone_model = HO("HO_root", args.depth, args.width, args.int_cycles, args.ext_cycles)
  43. elif args.model_type == "HOmod":
  44. devstone_model = HOmod("HOmod_root", args.depth, args.width, args.int_cycles, args.ext_cycles)
  45. env = DEVStoneEnvironment("DEVStoneEnvironment", devstone_model)
  46. model_created_time = time.time()
  47. sim = Simulator(env)
  48. # sim.setTerminationTime(10.0)
  49. # sim.setStateSaving("custom")
  50. engine_setup_time = time.time()
  51. sim.simulate()
  52. if args.dynamic:
  53. sim.setDSDEVS(True)
  54. sim_time = time.time()
  55. print("Model creation time: {}".format(model_created_time - start_time))
  56. print("Engine setup time: {}".format(engine_setup_time - model_created_time))
  57. print("Simulation time: {}".format(sim_time - engine_setup_time))