/*
 * $Id$
 *
 * [ Description ]
 * 
 * Test "RegisterFile"
 */

#ifdef SYSTEMC
#include "systemc.h"
#endif

#include <string>
#include <iostream>
#include <sys/time.h>

#include "Behavioural/Core/Multi_Execute_loop/Execute_loop/Register_unit/Register_unit_Glue/include/Register_unit_Glue.h"

using namespace std;
using namespace morpheo;
using namespace morpheo::behavioural;
using namespace morpheo::behavioural::core;
using namespace morpheo::behavioural::core::multi_execute_loop;
using namespace morpheo::behavioural::core::multi_execute_loop::execute_loop;
using namespace morpheo::behavioural::core::multi_execute_loop::execute_loop::register_unit;

using namespace morpheo::behavioural::core::multi_execute_loop::execute_loop::register_unit::register_unit_glue;

void test    (string name,
	      morpheo::behavioural::core::multi_execute_loop::execute_loop::register_unit::register_unit_glue::Parameters * param);

class Time 
{
private : timeval time_begin;
// private : timeval time_end;
  
public  : Time ()
  {
    gettimeofday(&time_begin     ,NULL);
  };

public  : ~Time ()
  {
    cout << *this;
  };

public  : friend ostream& operator<< (ostream& output_stream,
				      const Time & x)
  {
    timeval time_end;
    
    gettimeofday(&time_end       ,NULL);
    
    uint32_t nb_cycles = static_cast<uint32_t>(sc_simulation_time());

    double average = static_cast<double>(nb_cycles) / static_cast<double>(time_end.tv_sec-x.time_begin.tv_sec);
    
    output_stream << nb_cycles << "\t(" << average << " cycles / seconds )" << endl;

    return output_stream;
  }
};
