#ifdef SYSTEMC
/*
 * $Id: Free_List_unit_genMealy_pop.cpp 88 2008-12-10 18:31:39Z rosiere $
 *
 * [ Description ]
 * 
 */

#include "Behavioural/Core/Multi_OOO_Engine/OOO_Engine/Rename_unit/Register_translation_unit/Free_List_unit/include/Free_List_unit.h"

namespace morpheo                    {
namespace behavioural {
namespace core {
namespace multi_ooo_engine {
namespace ooo_engine {
namespace rename_unit {
namespace register_translation_unit {
namespace free_list_unit {


#undef  FUNCTION
#define FUNCTION "Free_List_unit::genMealy_pop"
  void Free_List_unit::genMealy_pop (void)
  {
    log_begin(Free_List_unit,FUNCTION);
    log_function(Free_List_unit,FUNCTION,_name.c_str());

    for (uint32_t i=0; i<_param->_nb_pop; i++)
      {
	uint32_t offset = i*_param->_nb_bank_by_pop;

	// GPR
	bool gpr_ack = not PORT_READ(in_POP_GPR_VAL[i]);

	if (not gpr_ack)
	  for (uint32_t j=0; j<_param->_nb_bank_by_pop; j++)
	    {
	      uint32_t bank = offset+((j+internal_BANK_PRIORITY)%_param->_nb_bank_by_pop);
	      
	      if (not _gpr_list[bank].empty())
		{
		  // find
		  gpr_ack = true;
		  internal_POP_GPR_BANK [i] = bank;
		  PORT_WRITE(out_POP_GPR_NUM_REG [i],
			     //(bank << _param->_shift) |
			     _gpr_list[bank].front());
		  
		  break;
		}
	    }

	// SPR
	bool spr_ack = not PORT_READ(in_POP_SPR_VAL[i]);

	if (not spr_ack)
	  for (uint32_t j=0; j<_param->_nb_bank_by_pop; j++)
	    {
	      uint32_t bank = offset+((j+internal_BANK_PRIORITY)%_param->_nb_bank_by_pop);
	      
	      if (not _spr_list[bank].empty())
		{
		  // find
		  spr_ack = true;
		  internal_POP_SPR_BANK [i] = bank;
		  PORT_WRITE(out_POP_SPR_NUM_REG [i],
			     //(bank << _param->_shift) |
			     _spr_list[bank].front());
		  
		  break;
		}
	    }

	internal_POP_ACK [i] = gpr_ack and spr_ack;
	
	PORT_WRITE(out_POP_ACK [i], internal_POP_ACK [i]);
      }
    

    log_end(Free_List_unit,FUNCTION);
  };

}; // end namespace free_list_unit
}; // end namespace register_translation_unit
}; // end namespace rename_unit
}; // end namespace ooo_engine
}; // end namespace multi_ooo_engine
}; // end namespace core

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