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


void Usage(void){
	printf("./membw <actual MHz> <bus width> <prefetch buffer width>\n");
}


int main(int argc, char **argv){
	//(400 million hertz * (2 interfaces) * (64 lines/interface) * (2 bits/line-cycle)) = 102,400 Mbit/s, or 12,800 MB/s, or 12.8 GB/s.
	//Speed * Width * 2 / 8 = MB/s 
	if(argc != 4){
		Usage();
		exit(1);
	}
	double Speed = atof(argv[1]);
	double Width = atof(argv[2]);
	double Prefetch = atof(argv[3]);
	double Bandwidth = 0;
	double tmp = 0;
	//ddr  2-bit
	//ddr2 4-bit
	//ddr3 8-bit
	//DDR4 8-bit
	//GDDR5 also has 8-bit wide prefetch buffers

	printf("speed: %.03lfMHz bus-width:%.03lfbit prefetch: %.03lf\n", Speed, Width, Prefetch);

/*
	Bandwidth = Prefetch/2;
	Bandwidth *= Width;
	Bandwidth /= 8;
	Bandwidth *= Speed;


	printf("\t%.03lfMB/s\n", Bandwidth); 
	printf("\t%.03lfGB/s\n", Bandwidth/1000);
	//1,048,576 / 1,000,000	

	printf("%lf\n", log2(Bandwidth) );
	tmp = 1000000;
	tmp /= 1048576;
	//printf("%lf\n", tmp);
	Bandwidth *= tmp;
	printf("\t%lfMiB/s\n", Bandwidth);
	//tmp = 1024/1048576;
	printf("\t%lfGiB/s\n", Bandwidth/1024);

*/
	//DDR5
	Bandwidth = Prefetch/2;
	Bandwidth *= Width/2;
	Bandwidth /= 16;
	Bandwidth *= Speed;

	printf("DDR4\n");
	printf("\t%.03lfMB/s\n", Bandwidth);
	printf("\t%.03lfGB/s\n", Bandwidth/1000);
	printf("DDR5\n");
	printf("\t%.03lfMB/s\n", Bandwidth/2);
	printf("\t%.03lfGB/s\n", Bandwidth/2000);

	return 0;
}

