?? io.c.svn-base
字號:
if ((RWP+ERP+EWP) < 1) {
printf("Must have at least one port\n");
return endresult;
//exit(1);
}
if (NSubbanks < 1 ) {
printf("Number of subbanks should be greater than or equal to 1 and should be a power of 2\n");
return endresult;
//exit(1);
}
logbanks = logtwo((double)(NSubbanks));
logbanksfloor = floor(logbanks);
if(logbanks > logbanksfloor){
printf("Number of subbanks should be greater than or equal to 1 and should be a power of 2\n");
return endresult;
//exit(1);
}
}
else if (nr_args==10)
{
RWP = rw_ports;
ERP = excl_read_ports;
EWP = excl_write_ports;
NSER = single_ended_read_ports;
seq_access = 1;
if ((RWP < 0) || (EWP < 0) || (ERP < 0)) {
printf("Ports must >=0\n");
return endresult;
//exit(1);
}
if (RWP > 2) {
printf("Maximum of 2 read/write ports\n");
return endresult;
//exit(1);
}
if ((RWP+ERP+EWP) < 1) {
printf("Must have at least one port\n");
return endresult;
//exit(1);
}
if (NSubbanks < 1 ) {
printf("Number of subbanks should be greater than or equal to 1 and should be a power of 2\n");
return endresult;
//exit(1);
}
logbanks = logtwo((double)(NSubbanks));
logbanksfloor = floor(logbanks);
if(logbanks > logbanksfloor){
printf("Number of subbanks should be greater than or equal to 1 and should be a power of 2\n");
return endresult;
//exit(1);
}
}
else if(nr_args==6)
{
RWP=1;
ERP=0;
EWP=0;
NSER=0;
if (NSubbanks < 1 ) {
printf("Number of subbanks should be greater than or equal to 1 and should be a power of 2\n");
return endresult;
//exit(1);
}
logbanks = logtwo((double)(NSubbanks));
logbanksfloor = floor(logbanks);
if(logbanks > logbanksfloor){
printf("Number of subbanks should be greater than or equal to 1 and should be a power of 2\n");
return endresult;
//exit(1);
}
}
else if(nr_args==8)
{
RWP=1;
ERP=0;
EWP=0;
NSER=0;
bits_output = output_width;
seq_access = 1;
NSubbanks = banks;
if (NSubbanks < 1 ) {
printf("Number of subbanks should be greater than or equal to 1 and should be a power of 2\n");
return endresult;
//exit(1);
}
logbanks = logtwo((double)(NSubbanks));
logbanksfloor = floor(logbanks);
if(logbanks > logbanksfloor){
printf("Number of subbanks should be greater than or equal to 1 and should be a power of 2\n");
return endresult;
//exit(1);
}
}
C = cache_size/((int) (NSubbanks));
if ((C < 64)) {
printf("Cache size must >=64\n");
return endresult;
//exit(1);
}
if (associativity == 0)
{
A=C/B;
parameters.fully_assoc = 1;
}
else
{
if (associativity == 1)
{
A=1;
parameters.fully_assoc = 0;
}
else
{
parameters.fully_assoc = 0;
A = associativity;
if ((A < 1)) {
printf("Associativity must >= 1\n");
return endresult;
//exit(1);
}
assoc = logtwo((double)(A));
assocfloor = floor(assoc);
if(assoc > assocfloor){
printf("Associativity should be a power of 2\n");
return endresult;
//exit(1);
}
if ((A > 32)) {
printf("Associativity must <= 32\n or try FA (fully associative)\n");
return endresult;
//exit(1);
}
}
}
if (C/(B*A)<=1 && !parameters.fully_assoc) {
printf("Number of sets is too small:\n Need to either increase cache size, or decrease associativity or block size\n (or use fully associative cache)\n");
return endresult;
//exit(1);
}
parameters.cache_size = C;
parameters.block_size = B;
parameters.nr_bits_out = bits_output;
/*dt: testing sequential access mode*/
if(seq_access) {
parameters.tag_associativity = A;
parameters.data_associativity = 1;
parameters.sequential_access = 1;
}
else {
parameters.tag_associativity = parameters.data_associativity = A;
parameters.sequential_access = 0;
}
if(fast_access) {
parameters.fast_access = 1;
}
else {
parameters.fast_access = 0;
}
parameters.num_readwrite_ports = RWP;
parameters.num_read_ports = ERP;
parameters.num_write_ports = EWP;
parameters.num_single_ended_read_ports =NSER;
parameters.number_of_sets = C/(B*A);
parameters.fudgefactor = .8/tech;
parameters.tech_size=(double) tech;
parameters.pure_sram = pure_sram;
//If multiple banks and multiple ports are specified, then if number of banks/total number
//of ports > 1 then assume that the multiple ports are implemented via the multiple banks.
//Also assume that each bank has only 1 RWP port. There are some problems with this logic that
//will be fixed in v5.0
ratioofbankstoports = NSubbanks/(RWP + ERP + EWP);
if(ratioofbankstoports >= 1.0){
//We assume that each bank has 1 RWP port.
parameters.num_readwrite_ports = 1;
parameters.num_read_ports = 0;
parameters.num_write_ports = 0;
parameters.num_single_ended_read_ports = 0;
}
if (parameters.number_of_sets < 1) {
printf("Less than one set...\n");
return endresult;
//exit(1);
}
init_tech_params_default_process();//v4.1: First initialize all tech variables
//to 0.8 micron values. init_tech_params function below then reinitializes tech variables to
//given process values
init_tech_params(parameters.tech_size);
calculate_time(&result,&arearesult,&arearesult_subbanked,¶meters,&NSubbanks, Nspd_predef, Ndwl_predef, Ndbl_predef, optimize);
//v4.1: No longer using calculate_area function as area has already been
//computed for the given tech node
/*arearesult.dataarray_area.scaled_area = calculate_area(arearesult.dataarray_area,parameters.fudgefactor)*CONVERT_TO_MMSQUARE;
arearesult.datapredecode_area.scaled_area = calculate_area(arearesult.datapredecode_area,parameters.fudgefactor)*CONVERT_TO_MMSQUARE;
arearesult.datacolmuxpredecode_area.scaled_area = calculate_area(arearesult.datacolmuxpredecode_area,parameters.fudgefactor)*CONVERT_TO_MMSQUARE;
arearesult.datacolmuxpostdecode_area.scaled_area = calculate_area(arearesult.datacolmuxpostdecode_area,parameters.fudgefactor)*CONVERT_TO_MMSQUARE;
arearesult.datawritesig_area.scaled_area = (parameters.num_readwrite_ports+parameters.num_read_ports+parameters.num_write_ports)*calculate_area(arearesult.datawritesig_area,parameters.fudgefactor)*CONVERT_TO_MMSQUARE;
arearesult.tagarray_area.scaled_area = calculate_area(arearesult.tagarray_area,parameters.fudgefactor)*CONVERT_TO_MMSQUARE;
arearesult.tagpredecode_area.scaled_area = calculate_area(arearesult.tagpredecode_area,parameters.fudgefactor)*CONVERT_TO_MMSQUARE;
arearesult.tagcolmuxpredecode_area.scaled_area = calculate_area(arearesult.tagcolmuxpredecode_area,parameters.fudgefactor)*CONVERT_TO_MMSQUARE;
arearesult.tagcolmuxpostdecode_area.scaled_area = calculate_area(arearesult.tagcolmuxpostdecode_area,parameters.fudgefactor)*CONVERT_TO_MMSQUARE;
arearesult.tagoutdrvdecode_area.scaled_area = calculate_area(arearesult.tagoutdrvdecode_area,parameters.fudgefactor)*CONVERT_TO_MMSQUARE;
arearesult.tagoutdrvsig_area.scaled_area = (parameters.num_readwrite_ports+parameters.num_read_ports+parameters.num_write_ports)*
calculate_area(arearesult.tagoutdrvsig_area,parameters.fudgefactor)*CONVERT_TO_MMSQUARE;
arearesult.perc_data = 100*area_all_dataramcells/(arearesult.totalarea*CONVERT_TO_MMSQUARE);
arearesult.perc_tag = 100*area_all_tagramcells/(arearesult.totalarea*CONVERT_TO_MMSQUARE);
arearesult.perc_cont = 100*(arearesult.totalarea*CONVERT_TO_MMSQUARE-area_all_dataramcells-area_all_tagramcells)/(arearesult.totalarea*CONVERT_TO_MMSQUARE);
arearesult.sub_eff = (area_all_dataramcells+area_all_tagramcells)*100/(arearesult.totalarea/100000000.0);
arearesult.total_eff = (NSubbanks)*(area_all_dataramcells+area_all_tagramcells)*100/
(calculate_area(arearesult_subbanked,parameters.fudgefactor)*CONVERT_TO_MMSQUARE);
arearesult.totalarea *= CONVERT_TO_MMSQUARE;
arearesult.subbankarea = calculate_area(arearesult_subbanked,parameters.fudgefactor)*CONVERT_TO_MMSQUARE;*/
arearesult.dataarray_area.scaled_area = arearesult.dataarray_area.height * arearesult.dataarray_area.width * CONVERT_TO_MMSQUARE;
arearesult.datapredecode_area.scaled_area = arearesult.datapredecode_area.height * arearesult.datapredecode_area.width * CONVERT_TO_MMSQUARE;
arearesult.datacolmuxpredecode_area.scaled_area = arearesult.datacolmuxpredecode_area.height * arearesult.datacolmuxpredecode_area.width * CONVERT_TO_MMSQUARE;
arearesult.datacolmuxpostdecode_area.scaled_area = arearesult.datacolmuxpostdecode_area.height * arearesult.datacolmuxpostdecode_area.width * CONVERT_TO_MMSQUARE;
arearesult.datawritesig_area.scaled_area = (parameters.num_readwrite_ports+parameters.num_read_ports+parameters.num_write_ports)* arearesult.datawritesig_area.height * arearesult.datawritesig_area.width * CONVERT_TO_MMSQUARE;
arearesult.tagarray_area.scaled_area = arearesult.tagarray_area.height * arearesult.tagarray_area.width * CONVERT_TO_MMSQUARE;
arearesult.tagpredecode_area.scaled_area = arearesult.tagpredecode_area.height * arearesult.tagpredecode_area.width * CONVERT_TO_MMSQUARE;
arearesult.tagcolmuxpredecode_area.scaled_area = arearesult.tagcolmuxpredecode_area.height * arearesult.tagcolmuxpredecode_area.width * CONVERT_TO_MMSQUARE;
arearesult.tagcolmuxpostdecode_area.scaled_area = arearesult.tagcolmuxpostdecode_area.height* arearesult.tagcolmuxpostdecode_area.width * CONVERT_TO_MMSQUARE;
arearesult.tagoutdrvdecode_area.scaled_area = arearesult.tagoutdrvdecode_area.height * arearesult.tagoutdrvdecode_area.width * CONVERT_TO_MMSQUARE;
arearesult.tagoutdrvsig_area.scaled_area = (parameters.num_readwrite_ports+parameters.num_read_ports+parameters.num_write_ports)*
arearesult.tagoutdrvsig_area.height * arearesult.tagoutdrvsig_area.width * CONVERT_TO_MMSQUARE;
arearesult.perc_data = 100*area_all_dataramcells/(arearesult.totalarea*CONVERT_TO_MMSQUARE);
arearesult.perc_tag = 100*area_all_tagramcells/(arearesult.totalarea*CONVERT_TO_MMSQUARE);
arearesult.perc_cont = 100*(arearesult.totalarea*CONVERT_TO_MMSQUARE-area_all_dataramcells-area_all_tagramcells)/(arearesult.totalarea*CONVERT_TO_MMSQUARE);
arearesult.sub_eff = (area_all_dataramcells+area_all_tagramcells)*100/(arearesult.totalarea/100000000.0);
arearesult.total_eff = (NSubbanks)*(area_all_dataramcells+area_all_tagramcells)*100/
(arearesult_subbanked.height * arearesult_subbanked.width * CONVERT_TO_MMSQUARE);
arearesult.totalarea *= CONVERT_TO_MMSQUARE;
arearesult.subbankarea = arearesult_subbanked.height * arearesult_subbanked.width * CONVERT_TO_MMSQUARE;
if(result.bitline_delay_data < 0.0) {
result.bitline_delay_data = 10^-12;
}
if(result.bitline_delay_tag < 0.0) {
result.bitline_delay_tag = 10^-13;
}
endresult.result = result;
endresult.result.subbanks = banks;
endresult.area = arearesult;
endresult.params = parameters;
return endresult;
}
/*void output_data_csv(total_result_type* result)
{
FILE *fptr;
errno_t err;
err = fopen_s(&fptr, "out.csv", "a");
if(err != 0){
printf("File out.csv could not be opened successfully\n");
}
else{*/
//fprintf(fptr, "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s", "Tech node (nm),", "Capacity (bytes),", "Associativity,", "Access time (ns), ", "Cycle time (ns), ", "Dynamic read energy (nJ), ", "Dynamic read power (mW), ", "Leakage read power(mW), ", "Area (mm2), ", "Ndwl, ", "Ndbl, ", "Nspd, ", "Ntwl, ", "Ntbl, ", "Ntspd\n");
/*fprintf(fptr, "%f%s%d%s%d%s%f%s%f%s%f%s%f%s%f%s%f%s%d%s%d%s%f%s%d%s%d%s%d%s", result->params.tech_size*1000, ",", result->params.cache_size, "," , result->params.tag_associativity, ",", result->result.access_time*1e+9, ",", result->result.cycle_time*1e+9, ",", result->result.total_power.readOp.dynamic*1e+9, ",", result->result.total_power.readOp.dynamic*1000/result->result.cycle_time, ",", result->result.total_power.readOp.leakage*1000, ",", result->area.totalarea, ",", result->result.best_Ndwl, ",", result->result.best_Ndbl, ",", result->result.best_Nspd, ",", result->result.best_Ntwl, ",", result->result.best_Ntbl, ",", result->result.best_Ntspd, "\n");
fclose(fptr);
}
}*/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -