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


int main(int argc, char **argv){
	double bank_groups_per_dram = 4;
	double banks_per_bg = 4;
	double rows_per_bank = 131072;
	double col_per_row = 1024;
	double channels = 2;
	double ranks = 4;
	double clock_period = 0;
	double clock = 3400;
	double total_rows = 0;
	double refresh_count = 8192;
	double tREF = 13260;
	double rrd = 4;
	//double refresh_period = 0.064;
double refresh_period = 64000000;
	double tRC = 0.000000317647058823529;
	double tRFC = 532;
	double tmp1 = 0;
	double tmp2 = 0;
	double tmp3 = 0;
	double tmp4 = 0;
//1ns = .000000001s  1 billion
//1ms = 0.001  1 thousand
//*1000000000
	//single bank refresh time
	//tmp1 = tRC;

tREF = clock/2;
tREF *= refresh_period/rows_per_bank/100;

tREF = clock/2;
tREF *= 7.8;

	//total_rows = bank_groups_per_dram*banks_per_bg*rows_per_bank;

	clock_period = 2000;
	clock_period /= clock;

	tmp1 = tRC*tREF*1000000000;

//	printf("single bank refresh time: %lfns\n", tmp1);
tmp1 = tREF*clock_period;
tmp2 = tRFC*clock_period;

printf("%lfclk tREF\n", tREF);
printf("%lfns spent refreshing every %lfns\n", tmp2, tmp1);


//134217728 bytes / bank
//1024 bytes / row
//131072 rows / bank
//1024 banks in the system
//134217728 rows in the system

rrd *= clock_period;
tmp3 = tRC*100000000;

tmp4 = rows_per_bank*bank_groups_per_dram*banks_per_bg;

tmp3 *= tmp4;
//tmp3 *= 1000000000;
tmp4 *= channels*ranks;

//printf("%lfns per row\n", tmp3/rows_per_bank/tmp4);

printf("rows: %lf cols: %lf bank groups: %lf banks per bg: %lf channels: %lf ranks(total cs per channel): %lf\n", rows_per_bank, col_per_row, bank_groups_per_dram, banks_per_bg, channels, ranks);
printf("%lf total row addresses refreshed\n", tmp4);
printf("%lf row addresses refreshed per cs\n", rows_per_bank*bank_groups_per_dram*banks_per_bg);

printf("%lfns per row\n", tmp2/tmp4);

//printf("%lfns per row\n", tmp2/rows_per_bank);
//	clock_period = 0.58823529;
	tmp1 = clock_period*tRFC;
	tmp1 *= 2;
	tmp1 /= 1000;

	tmp2 = clock_period*tREF;
	tmp2 *= 2;
	tmp2 /= 1000;

	//tmp1 = (clock_period*tRFC)*2/1000;
	//tmp2 = (clock_period*tREF)*2/1000;
	printf("refresh overhead: %lf percent\n", tmp1/tmp2*100);


//tmp1 = tRFC/clock*1000000;




	return 0;
}
