45a46,68
> class ProbeEvent(object):
> def __init__(self, pmu, _eventId, obj, *listOfNames):
> self.obj = obj
> self.names = listOfNames
> self.eventId = _eventId
> self.pmu = pmu
>
> def register(self):
> if self.obj:
> for name in self.names:
> self.pmu.getCCObject().addEventProbe(self.eventId,
> self.obj.getCCObject(), name)
>
> class SoftwareIncrement(object):
> def __init__(self,pmu, _eventId):
> self.eventId = _eventId
> self.pmu = pmu
>
> def register(self):
> self.pmu.getCCObject().addSoftwareIncrementEvent(self.eventId)
>
> ARCH_EVENT_CORE_CYCLES = 0x11
>
46a70
>
52a77
> PyBindMethod("addSoftwareIncrementEvent"),
55,60c80,92
< # To prevent cycles in the configuration hierarchy, we don't keep
< # a list of supported events as a configuration param. Instead, we
< # keep them in a local list and register them using the
< # addEventProbe interface when other SimObjects register their
< # probe listeners.
< _deferred_event_types = []
---
> _events = None
>
> def addEvent(self, newObject):
> if not (isinstance(newObject, ProbeEvent)
> or isinstance(newObject, SoftwareIncrement)):
> raise TypeError("argument must be of ProbeEvent or "
> "SoftwareIncrement type")
>
> if not self._events:
> self._events = []
>
> self._events.append(newObject)
>
64,65c96,97
< for event_id, obj, name in self._deferred_event_types:
< self.getCCObject().addEventProbe(event_id, obj.getCCObject(), name)
---
> for event in self._events:
> event.register()
69,77d100
< def addEventProbe(self, event_id, obj, *args):
< """Add a probe-based event to the PMU if obj is not None."""
<
< if obj is None:
< return
<
< for name in args:
< self._deferred_event_types.append((event_id, obj, name))
<
97a121
> self.addEvent(SoftwareIncrement(self,0x00))
99c123
< self.addEventProbe(0x02, itb, "Refills")
---
> self.addEvent(ProbeEvent(self,0x02, itb, "Refills"))
102,105c126,129
< self.addEventProbe(0x05, dtb, "Refills")
< self.addEventProbe(0x06, cpu, "RetiredLoads")
< self.addEventProbe(0x07, cpu, "RetiredStores")
< self.addEventProbe(0x08, cpu, "RetiredInsts")
---
> self.addEvent(ProbeEvent(self,0x05, dtb, "Refills"))
> self.addEvent(ProbeEvent(self,0x06, cpu, "RetiredLoads"))
> self.addEvent(ProbeEvent(self,0x07, cpu, "RetiredStores"))
> self.addEvent(ProbeEvent(self,0x08, cpu, "RetiredInsts"))
109c133
< self.addEventProbe(0x0C, cpu, "RetiredBranches")
---
> self.addEvent(ProbeEvent(self,0x0C, cpu, "RetiredBranches"))
113,116c137,142
< self.addEventProbe(0x10, bpred, "Misses")
< self.addEventProbe(0x11, cpu, "ActiveCycles")
< self.addEventProbe(0x12, bpred, "Branches")
< self.addEventProbe(0x13, cpu, "RetiredLoads", "RetiredStores")
---
> self.addEvent(ProbeEvent(self,0x10, bpred, "Misses"))
> self.addEvent(ProbeEvent(self, ARCH_EVENT_CORE_CYCLES, cpu,
> "ActiveCycles"))
> self.addEvent(ProbeEvent(self,0x12, bpred, "Branches"))
> self.addEvent(ProbeEvent(self,0x13, cpu, "RetiredLoads",
> "RetiredStores"))
146a173
> cycleEventId = Param.Int(ARCH_EVENT_CORE_CYCLES, "Cycle event id")