AbstractReplacementPolicy.hh revision 6145
19888Sandreas@sandberg.pp.se
29888Sandreas@sandberg.pp.se#ifndef ABSTRACTREPLACEMENTPOLICY_H
39888Sandreas@sandberg.pp.se#define ABSTRACTREPLACEMENTPOLICY_H
49888Sandreas@sandberg.pp.se
59888Sandreas@sandberg.pp.se#include "Global.hh"
69888Sandreas@sandberg.pp.se
79888Sandreas@sandberg.pp.seclass AbstractReplacementPolicy {
89888Sandreas@sandberg.pp.se
99888Sandreas@sandberg.pp.sepublic:
109888Sandreas@sandberg.pp.se
119888Sandreas@sandberg.pp.se  AbstractReplacementPolicy(Index num_sets, Index assoc);
129888Sandreas@sandberg.pp.se  virtual ~AbstractReplacementPolicy();
139888Sandreas@sandberg.pp.se
149888Sandreas@sandberg.pp.se  /* touch a block. a.k.a. update timestamp */
159888Sandreas@sandberg.pp.se  virtual void touch(Index set, Index way, Time time) = 0;
169888Sandreas@sandberg.pp.se
179888Sandreas@sandberg.pp.se  /* returns the way to replace */
189888Sandreas@sandberg.pp.se  virtual Index getVictim(Index set) const = 0;
199888Sandreas@sandberg.pp.se
209888Sandreas@sandberg.pp.se  /* get the time of the last access */
219888Sandreas@sandberg.pp.se  Time getLastAccess(Index set, Index way);
229888Sandreas@sandberg.pp.se
239888Sandreas@sandberg.pp.se protected:
249888Sandreas@sandberg.pp.se  unsigned int m_num_sets;       /** total number of sets */
259888Sandreas@sandberg.pp.se  unsigned int m_assoc;          /** set associativity */
269888Sandreas@sandberg.pp.se  Time **m_last_ref_ptr;         /** timestamp of last reference */
279888Sandreas@sandberg.pp.se};
289888Sandreas@sandberg.pp.se
299888Sandreas@sandberg.pp.seinline
309888Sandreas@sandberg.pp.seAbstractReplacementPolicy::AbstractReplacementPolicy(Index num_sets, Index assoc)
319888Sandreas@sandberg.pp.se{
329888Sandreas@sandberg.pp.se  m_num_sets = num_sets;
339888Sandreas@sandberg.pp.se  m_assoc = assoc;
349888Sandreas@sandberg.pp.se  m_last_ref_ptr = new Time*[m_num_sets];
359888Sandreas@sandberg.pp.se  for(unsigned int i = 0; i < m_num_sets; i++){
369888Sandreas@sandberg.pp.se    m_last_ref_ptr[i] = new Time[m_assoc];
379888Sandreas@sandberg.pp.se    for(unsigned int j = 0; j < m_assoc; j++){
389888Sandreas@sandberg.pp.se      m_last_ref_ptr[i][j] = 0;
399888Sandreas@sandberg.pp.se    }
409888Sandreas@sandberg.pp.se  }
419888Sandreas@sandberg.pp.se}
429888Sandreas@sandberg.pp.se
439888Sandreas@sandberg.pp.seinline
449888Sandreas@sandberg.pp.seAbstractReplacementPolicy::~AbstractReplacementPolicy()
459888Sandreas@sandberg.pp.se{
469888Sandreas@sandberg.pp.se  if(m_last_ref_ptr != NULL){
479888Sandreas@sandberg.pp.se    for(unsigned int i = 0; i < m_num_sets; i++){
489888Sandreas@sandberg.pp.se      if(m_last_ref_ptr[i] != NULL){
499888Sandreas@sandberg.pp.se        delete[] m_last_ref_ptr[i];
509888Sandreas@sandberg.pp.se      }
519888Sandreas@sandberg.pp.se    }
529888Sandreas@sandberg.pp.se    delete[] m_last_ref_ptr;
539888Sandreas@sandberg.pp.se  }
549888Sandreas@sandberg.pp.se}
559888Sandreas@sandberg.pp.se
569888Sandreas@sandberg.pp.seinline
579888Sandreas@sandberg.pp.seTime AbstractReplacementPolicy::getLastAccess(Index set, Index way)
589888Sandreas@sandberg.pp.se{
599888Sandreas@sandberg.pp.se  return m_last_ref_ptr[set][way];
609888Sandreas@sandberg.pp.se}
619888Sandreas@sandberg.pp.se
629888Sandreas@sandberg.pp.se#endif // ABSTRACTREPLACEMENTPOLICY_H
639888Sandreas@sandberg.pp.se