diff options
author | Joel Hestness <hestness@cs.utexas.edu> | 2012-07-10 22:51:54 -0700 |
---|---|---|
committer | Joel Hestness <hestness@cs.utexas.edu> | 2012-07-10 22:51:54 -0700 |
commit | 467093ebf238a1954e00576daf14a9f246b51e79 (patch) | |
tree | 1e3a355e93a62174b112e97e81f5d7aa62299016 /src/mem/slicc/symbols/StateMachine.py | |
parent | c10f348120ae4a61c782815280673fba5ee71157 (diff) | |
download | gem5-467093ebf238a1954e00576daf14a9f246b51e79.tar.xz |
ruby: tag and data cache access support
Updates to Ruby to support statistics counting of cache accesses. This feature
serves multiple purposes beyond simple stats collection. It provides the
foundation for ruby to model the cache tag and data arrays as physical
resources, as well as provide the necessary input data for McPAT power
modeling.
Diffstat (limited to 'src/mem/slicc/symbols/StateMachine.py')
-rw-r--r-- | src/mem/slicc/symbols/StateMachine.py | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/src/mem/slicc/symbols/StateMachine.py b/src/mem/slicc/symbols/StateMachine.py index 8f4676c42..230eb1b22 100644 --- a/src/mem/slicc/symbols/StateMachine.py +++ b/src/mem/slicc/symbols/StateMachine.py @@ -61,6 +61,7 @@ class StateMachine(Symbol): self.states = orderdict() self.events = orderdict() self.actions = orderdict() + self.request_types = orderdict() self.transitions = [] self.in_ports = [] self.functions = [] @@ -97,6 +98,10 @@ class StateMachine(Symbol): self.actions[action.ident] = action + def addRequestType(self, request_type): + assert self.table is None + self.request_types[request_type.ident] = request_type + def addTransition(self, trans): assert self.table is None self.transitions.append(trans) @@ -989,6 +994,10 @@ $c_ident::${{action.ident}}(const Address& addr) code = self.symtab.codeFormatter() ident = self.ident + outputRequest_types = True + if len(self.request_types) == 0: + outputRequest_types = False + code(''' // Auto generated C++ code started by $__file__:$__line__ // ${ident}: ${{self.short}} @@ -1003,6 +1012,12 @@ $c_ident::${{action.ident}}(const Address& addr) #include "mem/protocol/${ident}_Controller.hh" #include "mem/protocol/${ident}_Event.hh" #include "mem/protocol/${ident}_State.hh" +''') + + if outputRequest_types: + code('''#include "mem/protocol/${ident}_RequestType.hh"''') + + code(''' #include "mem/protocol/Types.hh" #include "mem/ruby/common/Global.hh" #include "mem/ruby/slicc_interface/RubySlicc_includes.hh" @@ -1210,6 +1225,7 @@ ${ident}_Controller::doTransitionWorker(${ident}_Event event, case('next_state = ${ident}_State_${ns_ident};') actions = trans.actions + request_types = trans.request_types # Check for resources case_sorter = [] @@ -1229,6 +1245,10 @@ if (!%s.areNSlotsAvailable(%s)) for c in sorted(case_sorter): case("$c") + # Record access types for this transition + for request_type in request_types: + case('recordRequestType(${ident}_RequestType_${{request_type.ident}}, addr);') + # Figure out if we stall stall = False for action in actions: |