#ifndef	_OSC_SEM_TB_CPP_
#define _OSC_SEM_TB_CPP_

//Počet generovaných hodnôt
#define NVZ 50

#include <systemc.h>
#include "Precision.h"
#include "sc_float.h"
#include "Osc_SEM_TB.h"
#include <cmath>


//Vstupné parametre obvodu
int R = 1;
int expR = 3;
int X = 5;
int expX = -6;
int T = 4;		
int expT = -4;
int U = 15;
int expUz = 0;

double komp_val(int U, int expU)
{
	double tmp_U = U*pow(10.0, expU);
	double tmp = (tmp_U / 2) - 0.24;
	return tmp;
}


//Funkcia zápisu vstupných testovacích hodnôt (enablovanie DUT)
void Osc_SEM_TB::test_write0(void)
{
//Vstupné konštanty do DUT
	sc_float<E, M> coef[2];
	sc_float<E, M> Uz;
	sc_float<E, M> komp;
coef[0] = coef_0_SEM(R, expR, X, expX, T, expT);
coef[1] = coef_1_SEM(R, expR, X, expX, T, expT);
Uz = U_val(U, expUz);
komp = komp_val(U, expUz);
	coef0_sc_fl.write(coef[0]);
	coef1_sc_fl.write(coef[1]);
	Uz_sc_fl.write(Uz);
	komp_value = komp;

//Vnútorné premenné
bool en_var;

//Výpis hodnoty koeficientov do konzoly - verifikácia hodnôt koeficientov
cout << coef[0] << "  \\  " << coef[1] << "  \\  " << Uz << "  \\  "  << komp << endl;

//Reset DUT
	en.write(false);
	inp_vld.write(false);
	rst.write(true);
wait();
	rst.write(false);
wait();	
//Ukončenie resetu DUT


//Generácia vstupných dát do DUT
	for(int i = 0; i<NVZ; i++)
	{
	en_var = true;
	
	//"Handshaking" výstupných dát z TB
		inp_vld.write(true);
	en.write(en_var);
		do {
			wait();
		} while (!inp_rdy.read());
		inp_vld.write(false);

	}//Ukončenie for cyklu
}



void Osc_SEM_TB::test_read0(void)
{
//Deklarácia externého súboru "output.txt" pre zápis výstupných dát z DUT
	char output_file[256];
	sprintf(output_file, "./output.txt");
	outpf = fopen(output_file, "w");
	if (outpf == NULL)
	{
		printf("Couldn't open output.txt file for writing .\n");
		exit(0);
	}
////////////////////////////////////////////////////////////


//Nastavenie počiatočnej hodnoty "handshakingu" s výstupom DUT
	outp_rdy.write(false);
////////////////////////////////////////////////////////////


//Vnútorné premenné
	sc_float<E, M> data_output_sc_fl;
	double data_output_fl;

//Čítanie dát z výstupu DUT
		for(int i = 0; i<NVZ; i++)
		{
		//"Handshaking" vstupných dát do TB (výstupných dát z DUT)
			outp_rdy.write(true);
			do {
				wait();
			} while (!outp_vld.read());
		data_output_sc_fl= outp.read();
			outp_rdy.write(false);

		//Zápis hodnôt do konzoly a externého súboru "output.txt"
		wait();
		data_output_fl = data_output_sc_fl.sc_float2double();
//		fprintf(outpf, "%d\t", i);
		fprintf(outpf, "%.4f\n ", data_output_fl);
		cout << i <<  " :\t    " << data_output_sc_fl << endl;
		} //Ukončenie for cyklu

	//Uzatvárenie externého súboru "output.txt"
	fclose(outpf);
	
	//Príkaz na Ukončenie simulácie
	sc_stop();
}

#endif
