#ifdef SYSTEMC
/*
 * $Id$
 *
 * [ Description ]
 * 
 */

#include "Behavioural/Generic/Select/Pseudo_LRU/include/Pseudo_LRU.h"

namespace morpheo {
namespace behavioural {
namespace generic {
namespace select {
namespace pseudo_lru {

  void Pseudo_LRU::allocation (void)
  {
    in_CLOCK  = new SC_CLOCK           ("in_CLOCK");

    // -----[ Interface access ]-------------------------------------------
     in_ACCESS_VAL     = new SC_IN (Tcontrol_t) * [_param._nb_access];
    out_ACCESS_ACK     = new SC_OUT(Tcontrol_t) * [_param._nb_access];
    if (_param._size_table>1)
      in_ACCESS_ADDRESS = new SC_IN (Taddress_t) * [_param._nb_access];
    out_ACCESS_ENTITY  = new SC_OUT(Tentity_t ) * [_param._nb_access];
    
    for (uint32_t i=0; i<_param._nb_access; i++)
      {
        string rename;

	rename = "in_ACCESS_VAL["     + toString(i) + "]";
	 in_ACCESS_VAL     [i] = new SC_IN (Tcontrol_t) (rename.c_str());

	rename = "out_ACCESS_ACK["    + toString(i) + "]";
	out_ACCESS_ACK     [i] = new SC_OUT(Tcontrol_t) (rename.c_str());

	if (_param._size_table>1)
	  {
	    rename = "in_ACCESS_ADDRESS[" + toString(i) + "]";
	    in_ACCESS_ADDRESS [i] = new SC_IN (Taddress_t) (rename.c_str());
	  }
	rename = "out_ACCESS_ENTITY[" + toString(i) + "]";
	out_ACCESS_ENTITY  [i] = new SC_OUT(Tentity_t ) (rename.c_str());
      }

    // -----[ Interface update ]-------------------------------------------
     in_UPDATE_VAL     = new SC_IN (Tcontrol_t) *  [_param._nb_update];
    out_UPDATE_ACK     = new SC_OUT(Tcontrol_t) *  [_param._nb_update];
    if (_param._size_table>1)
      in_UPDATE_ADDRESS = new SC_IN (Taddress_t) *  [_param._nb_update];
     in_UPDATE_ENTITY  = new SC_IN (Tentity_t ) *  [_param._nb_update];

    for (uint32_t i=0; i<_param._nb_update; i++)
      {
        string rename;

	rename = "in_UPDATE_VAL["     + toString(i) + "]";
 	 in_UPDATE_VAL     [i] = new SC_IN (Tcontrol_t) (rename.c_str());

	rename = "out_UPDATE_ACK["    + toString(i) + "]";;
	out_UPDATE_ACK     [i] = new SC_OUT(Tcontrol_t) (rename.c_str());

	if (_param._size_table>1)
	  {
	    rename = "in_UPDATE_ADDRESS[" + toString(i) + "]";
	    in_UPDATE_ADDRESS [i] = new SC_IN (Taddress_t) (rename.c_str());
	  }

	rename = "in_UPDATE_ENTITY["  + toString(i) + "]";
	 in_UPDATE_ENTITY  [i] = new SC_IN (Tentity_t ) (rename.c_str());
      }

    // -----[ Register ]---------------------------------------------------
    reg_TABLE = new entry_t *  [_param._size_table];

    for (uint32_t i=0; i<_param._size_table; i++)
      reg_TABLE [i] = new entry_t (_param._nb_entity);
    
    // -----[ Internal ]---------------------------------------------------
    internal_ACCESS_ENTITY = new Tentity_t [_param._nb_entity];
  };

}; // end namespace pseudo_lru
}; // end namespace select
}; // end namespace generic

}; // end namespace behavioural
}; // end namespace morpheo              
#endif
