#ifndef ENVIRONMENT_CACHE_CACHE_MULTILEVEL_H
#define ENVIRONMENT_CACHE_CACHE_MULTILEVEL_H

#include "Cache_MultiLevel_Parameters.h"
#include "Cache_MultiLevel_Access.h"
#include "Cache_OneLevel.h"

namespace environment {
namespace cache {
namespace cache_multilevel {

  class Cache_MultiLevel
  {
  protected : std::string  name;
  public    : Parameters * param;
  protected : cache_onelevel::Cache_OneLevel ** hierarchy_cache;
    
  public    :  Cache_MultiLevel (std::string name, Parameters * param);
  public    : ~Cache_MultiLevel (void);

  public    : void             reset         (void);
  public    : void             transition    (void);
  public    : Access           access        (uint32_t num_port, uint32_t address, uint32_t trdid, type_req_cache_t type, direction_req_cache_t dir);
  public    : uint32_t         latence       (uint32_t num_port, uint32_t address, uint32_t trdid, type_req_cache_t type, direction_req_cache_t dir);
  public    : uint32_t         update_access (Access cur_access);

  public    : std::string      information   (uint32_t depth);
  public    : friend std::ostream& operator<< (std::ostream& output, Cache_MultiLevel & x);
  };

};
};
};
#endif
