Advertisement
Guest User

Untitled

a guest
Mar 11th, 2013
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.93 KB | None | 0 0
  1. diff --git a/migen/actorlib/sim.py b/migen/actorlib/sim.py
  2. index de11f1c..5b83d64 100644
  3. --- a/migen/actorlib/sim.py
  4. +++ b/migen/actorlib/sim.py
  5. @@ -22,27 +22,31 @@ class TokenExchanger(PureSimulable):
  6. for token in self.active:
  7. ep = self.actor.endpoints[token.endpoint]
  8. if isinstance(ep, Sink):
  9. - if s.rd(ep.ack):
  10. - if s.rd(ep.stb):
  11. - token.value = s.multiread(ep.token)
  12. - completed.add(token)
  13. - s.wr(ep.ack, 0)
  14. - else:
  15. - s.wr(ep.ack, 1)
  16. + if s.rd(ep.ack) and s.rd(ep.stb):
  17. + token.value = s.multiread(ep.token)
  18. + completed.add(token)
  19. + s.wr(ep.ack, 0)
  20. elif isinstance(ep, Source):
  21. - if s.rd(ep.stb):
  22. - if s.rd(ep.ack):
  23. - completed.add(token)
  24. - s.wr(ep.stb, 0)
  25. - else:
  26. - s.wr(ep.stb, 1)
  27. - s.multiwrite(ep.token, token.value)
  28. + if s.rd(ep.ack) and s.rd(ep.stb):
  29. + completed.add(token)
  30. + s.wr(ep.stb, 0)
  31. else:
  32. raise TypeError
  33. self.active -= completed
  34. if not self.active:
  35. self.busy = True
  36. -
  37. +
  38. + def _update_control_signals(self, s):
  39. + for token in self.active:
  40. + ep = self.actor.endpoints[token.endpoint]
  41. + if isinstance(ep, Sink):
  42. + s.wr(ep.ack, 1)
  43. + elif isinstance(ep, Source):
  44. + s.multiwrite(ep.token, token.value)
  45. + s.wr(ep.stb, 1)
  46. + else:
  47. + raise TypeError
  48. +
  49. def _next_transactions(self):
  50. try:
  51. transactions = next(self.generator)
  52. @@ -62,13 +66,14 @@ class TokenExchanger(PureSimulable):
  53. raise TypeError
  54. if self.active and all(transaction.idle_wait for transaction in self.active):
  55. self.busy = False
  56. -
  57. +
  58. def do_simulation(self, s):
  59. if not self.done:
  60. - if not self.active:
  61. - self._next_transactions()
  62. if self.active:
  63. self._process_transactions(s)
  64. + if not self.active:
  65. + self._next_transactions()
  66. + self._update_control_signals(s)
  67.  
  68. class SimActor(Actor):
  69. def __init__(self, generator, *endpoint_descriptions, **misc):
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement