simple_dsdevs.py 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. from pypdevs.DEVS import AtomicDEVS, CoupledDEVS
  2. from pypdevs.simulator import Simulator
  3. class Root(CoupledDEVS):
  4. def __init__(self):
  5. CoupledDEVS.__init__(self, "Root")
  6. self.models = []
  7. # First model
  8. self.models.append(self.addSubModel(Generator()))
  9. # Second model
  10. self.models.append(self.addSubModel(Consumer(0)))
  11. # And connect them
  12. self.connectPorts(self.models[0].outport, self.models[1].inport)
  13. def modelTransition(self, state):
  14. # We are notified, so are required to add a new model and link it
  15. self.models.append(self.addSubModel(Consumer(1)))
  16. self.connectPorts(self.models[0].outport, self.models[-1].inport)
  17. ## Optionally, we could also remove the Consumer(0) instance as follows:
  18. # self.removeSubModel(self.models[1])
  19. # Always returns False, as this is top-level
  20. return False
  21. class Generator(AtomicDEVS):
  22. def __init__(self):
  23. AtomicDEVS.__init__(self, "Generator")
  24. # Keep a counter of how many events were sent
  25. self.outport = self.addOutPort("outport")
  26. self.state = 0
  27. def intTransition(self):
  28. # Increment counter
  29. return self.state + 1
  30. def outputFnc(self):
  31. # Send the amount of messages sent on the output port
  32. return {self.outport: [self.state]}
  33. def timeAdvance(self):
  34. # Fixed 1.0
  35. return 1.0
  36. def modelTransition(self, state):
  37. # Notify parent of structural change if state equals 3
  38. return self.state == 3
  39. class Consumer(AtomicDEVS):
  40. def __init__(self, count):
  41. AtomicDEVS.__init__(self, "Consumer_%i" % count)
  42. self.inport = self.addInPort("inport")
  43. def extTransition(self, inputs):
  44. for inp in inputs[self.inport]:
  45. print("Got input %i on model %s" % (inp, self.name))
  46. sim = Simulator(Root())
  47. sim.setTerminationTime(5)
  48. sim.setDSDEVS(True)
  49. sim.simulate()