AbstractReplacementPolicy.hh revision 6145
16691Stjones1@inf.ed.ac.uk
26691Stjones1@inf.ed.ac.uk#ifndef ABSTRACTREPLACEMENTPOLICY_H
36691Stjones1@inf.ed.ac.uk#define ABSTRACTREPLACEMENTPOLICY_H
46691Stjones1@inf.ed.ac.uk
56691Stjones1@inf.ed.ac.uk#include "Global.hh"
66691Stjones1@inf.ed.ac.uk
76691Stjones1@inf.ed.ac.ukclass AbstractReplacementPolicy {
86691Stjones1@inf.ed.ac.uk
96691Stjones1@inf.ed.ac.ukpublic:
106691Stjones1@inf.ed.ac.uk
116691Stjones1@inf.ed.ac.uk  AbstractReplacementPolicy(Index num_sets, Index assoc);
126691Stjones1@inf.ed.ac.uk  virtual ~AbstractReplacementPolicy();
136691Stjones1@inf.ed.ac.uk
146691Stjones1@inf.ed.ac.uk  /* touch a block. a.k.a. update timestamp */
156691Stjones1@inf.ed.ac.uk  virtual void touch(Index set, Index way, Time time) = 0;
166691Stjones1@inf.ed.ac.uk
176691Stjones1@inf.ed.ac.uk  /* returns the way to replace */
186691Stjones1@inf.ed.ac.uk  virtual Index getVictim(Index set) const = 0;
196691Stjones1@inf.ed.ac.uk
206691Stjones1@inf.ed.ac.uk  /* get the time of the last access */
216691Stjones1@inf.ed.ac.uk  Time getLastAccess(Index set, Index way);
226691Stjones1@inf.ed.ac.uk
236691Stjones1@inf.ed.ac.uk protected:
246691Stjones1@inf.ed.ac.uk  unsigned int m_num_sets;       /** total number of sets */
256691Stjones1@inf.ed.ac.uk  unsigned int m_assoc;          /** set associativity */
266691Stjones1@inf.ed.ac.uk  Time **m_last_ref_ptr;         /** timestamp of last reference */
276691Stjones1@inf.ed.ac.uk};
286691Stjones1@inf.ed.ac.uk
296691Stjones1@inf.ed.ac.ukinline
306691Stjones1@inf.ed.ac.ukAbstractReplacementPolicy::AbstractReplacementPolicy(Index num_sets, Index assoc)
316691Stjones1@inf.ed.ac.uk{
3211793Sbrandon.potter@amd.com  m_num_sets = num_sets;
336691Stjones1@inf.ed.ac.uk  m_assoc = assoc;
347680Sgblack@eecs.umich.edu  m_last_ref_ptr = new Time*[m_num_sets];
356691Stjones1@inf.ed.ac.uk  for(unsigned int i = 0; i < m_num_sets; i++){
366691Stjones1@inf.ed.ac.uk    m_last_ref_ptr[i] = new Time[m_assoc];
376691Stjones1@inf.ed.ac.uk    for(unsigned int j = 0; j < m_assoc; j++){
386691Stjones1@inf.ed.ac.uk      m_last_ref_ptr[i][j] = 0;
396691Stjones1@inf.ed.ac.uk    }
406691Stjones1@inf.ed.ac.uk  }
416691Stjones1@inf.ed.ac.uk}
426691Stjones1@inf.ed.ac.uk
436691Stjones1@inf.ed.ac.ukinline
446691Stjones1@inf.ed.ac.ukAbstractReplacementPolicy::~AbstractReplacementPolicy()
456691Stjones1@inf.ed.ac.uk{
466691Stjones1@inf.ed.ac.uk  if(m_last_ref_ptr != NULL){
476691Stjones1@inf.ed.ac.uk    for(unsigned int i = 0; i < m_num_sets; i++){
486691Stjones1@inf.ed.ac.uk      if(m_last_ref_ptr[i] != NULL){
496691Stjones1@inf.ed.ac.uk        delete[] m_last_ref_ptr[i];
506691Stjones1@inf.ed.ac.uk      }
516691Stjones1@inf.ed.ac.uk    }
526691Stjones1@inf.ed.ac.uk    delete[] m_last_ref_ptr;
536691Stjones1@inf.ed.ac.uk  }
546691Stjones1@inf.ed.ac.uk}
556691Stjones1@inf.ed.ac.uk
567720Sgblack@eecs.umich.eduinline
577720Sgblack@eecs.umich.eduTime AbstractReplacementPolicy::getLastAccess(Index set, Index way)
586691Stjones1@inf.ed.ac.uk{
597720Sgblack@eecs.umich.edu  return m_last_ref_ptr[set][way];
606691Stjones1@inf.ed.ac.uk}
616691Stjones1@inf.ed.ac.uk
626691Stjones1@inf.ed.ac.uk#endif // ABSTRACTREPLACEMENTPOLICY_H
636691Stjones1@inf.ed.ac.uk