/*
 * $Id: top.cpp 113 2009-04-14 18:39:12Z rosiere $
 *
 * [ Description ]
 * 
 */

#include "Behavioural/Core/Multi_Execute_loop/Execute_loop/Multi_Write_unit/Write_unit/SelfTest/include/top.h"
#include "Behavioural/include/Selftest.h"

#define NB_PARAMS 11

#ifdef MTI_SYSTEMC
SC_MODULE_EXPORT(top);
#endif

#ifdef MTI_SYSTEMC
SC_CTOR(top::top)
#else
top::top (sc_module_name module_name, int argc, char * argv[])
#endif
{
#ifdef MTI_SYSTEMC
  // accessing command-line arguments with modelsim
  int argc;
  const char * const * argv;

  argc = sc_argc ();
  argv = sc_argv ();
#endif

  if (argc != 2+NB_PARAMS)
    usage (argc, argv);

  uint32_t x=1;

  uint32_t size_write_queue    ;
  uint32_t size_execute_queue  ;
  uint32_t nb_context          ;
  uint32_t nb_front_end        ;
  uint32_t nb_ooo_engine       ;
  uint32_t nb_packet           ;
  uint32_t size_general_data   ;
  uint32_t nb_general_register ;
  uint32_t size_special_data   ;
  uint32_t nb_special_register ;
  uint32_t nb_bypass_write     ;

  SELFTEST0(name,string,argv,x);
  SELFTEST0(size_write_queue    ,uint32_t,argv,x);
  SELFTEST0(size_execute_queue  ,uint32_t,argv,x);
  SELFTEST0(nb_context          ,uint32_t,argv,x);
  SELFTEST0(nb_front_end        ,uint32_t,argv,x);
  SELFTEST0(nb_ooo_engine       ,uint32_t,argv,x);
  SELFTEST0(nb_packet           ,uint32_t,argv,x);
  SELFTEST0(size_general_data   ,uint32_t,argv,x);
  SELFTEST0(nb_general_register ,uint32_t,argv,x);
  SELFTEST0(size_special_data   ,uint32_t,argv,x);
  SELFTEST0(nb_special_register ,uint32_t,argv,x);
  SELFTEST0(nb_bypass_write     ,uint32_t,argv,x);

  _param = new morpheo::behavioural::core::multi_execute_loop::execute_loop::multi_write_unit::write_unit::Parameters
    (size_write_queue   ,
     size_execute_queue ,
     nb_context         ,
     nb_front_end       ,
     nb_ooo_engine      ,
     nb_packet          ,
     size_general_data  ,
     nb_general_register,
     size_special_data  ,
     nb_special_register,
     nb_bypass_write    ,
     true
     );
  
  // msg(_("%s"),_param.print(0).c_str());
  
  // Allocation component
  allocation ();
  
#ifdef MTI_SYSTEMC
  SC_THREAD(test);
#endif
}

top::~top (void)
{
  deallocation ();
  delete _param;
}
