processor.py 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. from pypdevs.DEVS import AtomicDEVS
  2. # Define the state of the processor as a structured object
  3. class ProcessorState(object):
  4. def __init__(self):
  5. # State only contains the current event
  6. self.evt = None
  7. class Processor(AtomicDEVS):
  8. def __init__(self, nr, proc_param):
  9. AtomicDEVS.__init__(self, "Processor_%i" % nr)
  10. self.state = ProcessorState()
  11. self.in_proc = self.addInPort("in_proc")
  12. self.out_proc = self.addOutPort("out_proc")
  13. self.out_finished = self.addOutPort("out_finished")
  14. # Define the parameters of the model
  15. self.speed = proc_param
  16. self.nr = nr
  17. def intTransition(self):
  18. # Just clear processing event
  19. self.state.evt = None
  20. return self.state
  21. def extTransition(self, inputs):
  22. # Received a new event, so start processing it
  23. self.state.evt = inputs[self.in_proc]
  24. # Calculate how long it will be processed
  25. time = 20.0 + max(1.0, self.state.evt.size / self.speed)
  26. self.state.evt.processing_time = time
  27. return self.state
  28. def timeAdvance(self):
  29. if self.state.evt:
  30. # Currently processing, so wait for that
  31. return self.state.evt.processing_time
  32. else:
  33. # Idle, so don't do anything
  34. return float('inf')
  35. def outputFnc(self):
  36. # Output the processed event and signal as finished
  37. return {self.out_proc: self.state.evt,
  38. self.out_finished: self.nr}