bbvtrace.py 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. """
  2. bbvtrace.py
  3. Write a trace of BBV deltas for all cores.
  4. Argument is either a filename, or none to write to standard output.
  5. """
  6. import sys, os, sim
  7. class Bbv:
  8. def __init__(self, init = None):
  9. if init:
  10. self.ninstrs = init[0]
  11. self.bbv = list(init[1])
  12. else:
  13. self.ninstrs = 0
  14. self.bbv = [ 0 for i in range(sim.bbv.BBV_SIZE) ]
  15. def delta(self, bbv):
  16. delta = Bbv()
  17. delta.ninstrs = bbv.ninstrs - self.ninstrs;
  18. for i in range(sim.bbv.BBV_SIZE):
  19. delta.bbv[i] = bbv.bbv[i] - self.bbv[i]
  20. return delta
  21. def diff(self, bbv):
  22. diff = 0
  23. for i in range(sim.bbv.BBV_SIZE):
  24. diff += abs(bbv.bbv[i]/(bbv.ninstrs or 1) - self.bbv[i]/(self.ninstrs or 1))
  25. return diff
  26. class BbvTrace:
  27. def setup(self, args):
  28. sim.bbv.enable()
  29. args = dict(enumerate((args or '').split(':')))
  30. filename = args.get(0, None)
  31. interval_ns = long(args.get(1, 100000))
  32. if filename:
  33. self.fd = file(os.path.join(sim.config.output_dir, filename), 'w')
  34. self.isTerminal = False
  35. else:
  36. self.fd = sys.stdout
  37. self.isTerminal = True
  38. self.bbvprev = [ Bbv() for i in range(sim.config.ncores) ]
  39. self.deltaprev = [ Bbv() for i in range(sim.config.ncores) ]
  40. sim.util.Every(interval_ns * sim.util.Time.NS, self.periodic, roi_only = True)
  41. def periodic(self, time, time_delta):
  42. if self.isTerminal:
  43. self.fd.write('[BBV] ')
  44. self.fd.write('%u' % (time / 1e6)) # Time in ns
  45. for core in range(sim.config.ncores):
  46. bbv = Bbv(sim.bbv.get(core))
  47. delta = self.bbvprev[core].delta(bbv)
  48. diff = self.deltaprev[core].diff(delta)
  49. self.bbvprev[core] = bbv
  50. self.deltaprev[core] = delta
  51. self.fd.write(' %d' % diff)
  52. self.fd.write('\n')
  53. sim.util.register(BbvTrace())