#include <stdlib.h>
#include <stdio.h>
#include <math.h>

#define NS 0.000000001
#define CPUCLOCKS 4025000000
//#define CPUCLOCKS 3
//#define FOUR_GHZ_NS (double)(1/CPUCLOCKS)
//#define FOUR_GHZ_NS 0.33333333

void Usage(){
	printf("./mem-ns MHz CL\n");
	printf("output: ns read one byte, read eight bytes\n");
}

//0.00000000025
//0.000000001


int main(int argc, char **argv){
	int num1 = 0;
	double tmp1 = 0;
	double mhz = 0;
	double cl = 0;
	double read_one[2] = {0,0};
	double read_four[2] = {0,0};
	double read_eight[2] = {0,0};
	double complete_one[2] = {0,0};
	double complete_four[2] = {0,0};
	double complete_eight[2] = {0,0};
	double cycles_per_ns = CPUCLOCKS * NS;
	

	if(argc != 3){
		Usage();
		exit(1);
	}

	mhz = atof(argv[1]);
	cl = atof(argv[2]);


	// Time to read one word: CL * 2000/MHz
	// Time to read eight words: CL * 2000/MHz + (7*1000/MHz)
	for(num1=0; num1<2; num1++){
		read_one[num1] = cl;
		read_one[num1] *= 2000;
		read_one[num1] /= mhz;

		read_eight[num1] = read_one[num1];
		read_eight[num1] += 7000/mhz;

		//tmp1 = read_one[num1]

		read_one[num1] *= cycles_per_ns;
		read_eight[num1] *= cycles_per_ns;
		read_four[num1] = read_eight[num1];

	}
//	printf("one: %.02lf, eight: %.02lf\n", read_one, read_eight);


	printf("         Time to initiate transfer of X size (in ns):\n");
	printf("         1byte    4byte    8byte\n");
	printf("ddr3:    %lf      %lf      %lf\n", read_one[0], read_four[0], read_eight[0]);
	printf("ddr4:    %lf      %lf      %lf\n", read_one[1], read_four[1], read_eight[1]);
//	printf("         Time to complete transfer of X size (in 4GHz cpu clock cycles):\n");
//	printf("         1byte    4byte    8byte\n");
//	printf("ddr3:    %lf      %lf      %lf\n", );
//	printf("ddr4:    %lf      %lf      %lf\n", );


	return 0;
}
