📄 area.c.svn-base
字号:
total_height = 2 * (inter_height) + fixed_tracks + predecode;
inter_height = total_height;
total_width = 2 * (inter_width) + fixed_tracks + predecode;
inter_width = total_width;
}
}
else
{
htree_half = htree - 1;
iter = htree_half / 2;
if (iter == 0)
{
total_height = base_height;
total_width = 2 * base_width + fixed_tracks + predecode;
}
else
{
for (i = 0; i <= iter; i++)
{
total_height = 2 * inter_height + fixed_tracks + predecode;
total_width = 2 * inter_width + fixed_tracks + predecode;
inter_height = total_height;
inter_width = total_width;
}
total_width = 2 * inter_width + fixed_tracks + predecode;
}
}
}
fa_area.height = total_height;
fa_area.width = total_width;
temp.height = fa_area.width;
temp.width = fa_area.height;
temp_aspect =
((temp.height / temp.width) >
1.0) ? (temp.height / temp.width) : 1.0 / (temp.height / temp.width);
aspect_ratio_data =
((fa_area.height / fa_area.width) >
1.0) ? (fa_area.height / fa_area.width) : 1.0 / (fa_area.height /
fa_area.width);
if (aspect_ratio_data > temp_aspect)
{
fa_area.height = temp.height;
fa_area.width = temp.width;
}
aspect_ratio_data =
((fa_area.height / fa_area.width) >
1.0) ? (fa_area.height / fa_area.width) : 1.0 / (fa_area.height /
fa_area.width);
return (fa_area);
}
void
fatotalarea (int baddr,int b0,int Ndbl,parameter_type *parameters,arearesult_type *faresult)
{
area_type null_area;
null_area.height = 0.0;
null_area.width = 0.0;
faresult->dataarray_area =
faarea (baddr, b0, parameters->cache_size, parameters->block_size, Ndbl,
parameters->num_readwrite_ports, parameters->num_read_ports,
parameters->num_write_ports,
parameters->num_single_ended_read_ports, parameters->fudgefactor);
faresult->datapredecode_area =
predecode_area (parameters->cache_size / parameters->block_size,
parameters->num_readwrite_ports,
parameters->num_read_ports, parameters->num_write_ports);
faresult->datacolmuxpredecode_area = null_area;
faresult->datacolmuxpostdecode_area = null_area;
faresult->datawritesig_area = null_area;
faresult->tagarray_area = null_area;
faresult->tagpredecode_area = null_area;
faresult->tagcolmuxpredecode_area = null_area;
faresult->tagcolmuxpostdecode_area = null_area;
faresult->tagoutdrvdecode_area =
muxdriverdecode (parameters->block_size, b0,
parameters->num_readwrite_ports,
parameters->num_read_ports, parameters->num_write_ports);
faresult->tagoutdrvsig_area = null_area;
/*faresult->totalarea =
(calculate_area (faresult->dataarray_area, parameters->fudgefactor) +
calculate_area (faresult->datapredecode_area,
parameters->fudgefactor) +
calculate_area (faresult->datacolmuxpredecode_area,
parameters->fudgefactor) +
calculate_area (faresult->datacolmuxpostdecode_area,
parameters->fudgefactor) +
calculate_area (faresult->tagarray_area,
parameters->fudgefactor) +
calculate_area (faresult->tagpredecode_area,
parameters->fudgefactor) +
calculate_area (faresult->tagcolmuxpredecode_area,
parameters->fudgefactor) +
calculate_area (faresult->tagcolmuxpostdecode_area,
parameters->fudgefactor) +
calculate_area (faresult->tagoutdrvdecode_area,
parameters->fudgefactor) +
calculate_area (faresult->tagoutdrvsig_area, parameters->fudgefactor));*/
faresult->totalarea = faresult->dataarray_area.height * faresult->dataarray_area.width +
faresult->datapredecode_area.height * faresult->datapredecode_area.width +
faresult->datacolmuxpredecode_area.height * faresult->datacolmuxpredecode_area.width +
faresult->datacolmuxpostdecode_area.height * faresult->datacolmuxpostdecode_area.width +
faresult->tagarray_area.height * faresult->tagarray_area.width +
faresult->tagpredecode_area.height * faresult->tagpredecode_area.width +
faresult->tagcolmuxpredecode_area.height * faresult->tagcolmuxpredecode_area.width +
faresult->tagcolmuxpostdecode_area.height * faresult->tagcolmuxpostdecode_area.width +
faresult->tagoutdrvdecode_area.height * faresult->tagoutdrvdecode_area.width +
faresult->tagoutdrvsig_area.height * faresult->tagoutdrvsig_area.width;
}
void
area_subbanked (int baddr,int b0,int RWP,int ERP,int EWP,int Ndbl,int Ndwl,double Nspd,int Ntbl,int Ntwl,int Ntspd,
double NSubbanks,parameter_type *parameters,area_type *result_subbanked,arearesult_type *result)
{
arearesult_type result_area;
area_type temp;
double temp_aspect;
int blocks, htree, htree_double;
double base_height, base_width, inter_width, inter_height, total_height,
total_width;
int base_subbanks, inter_subbanks;
int i, iter_height, iter_width, iter_width_double;
area_all_dataramcells = 0.0;
area_all_tagramcells = 0.0;
aspect_ratio_data = 1.0;
aspect_ratio_tag = 1.0;
aspect_ratio_subbank = 1.0;
aspect_ratio_total = 1.0;
if (parameters->fully_assoc == 0)
{
area (baddr, b0, Ndbl, Ndwl, Nspd, Ntbl, Ntwl, Ntspd, NSubbanks,
parameters, &result_area);
}
else
{
fatotalarea (baddr, b0, Ndbl, parameters, &result_area);
}
result->dataarray_area = result_area.dataarray_area;
result->datapredecode_area = result_area.datapredecode_area;
result->datacolmuxpredecode_area = result_area.datacolmuxpredecode_area;
result->datacolmuxpostdecode_area = result_area.datacolmuxpostdecode_area;
result->datawritesig_area = result_area.datawritesig_area;
result->tagarray_area = result_area.tagarray_area;
result->tagpredecode_area = result_area.tagpredecode_area;
result->tagcolmuxpredecode_area = result_area.tagcolmuxpredecode_area;
result->tagcolmuxpostdecode_area = result_area.tagcolmuxpostdecode_area;
result->tagoutdrvdecode_area = result_area.tagoutdrvdecode_area;
result->tagoutdrvsig_area = result_area.tagoutdrvsig_area;
result->totalarea = result_area.totalarea;
result->total_dataarea = result_area.total_dataarea;
result->total_tagarea = result_area.total_tagarea;
if (NSubbanks == 1)
{
total_height = result_area.dataarray_area.height;
total_width =
result_area.dataarray_area.width + result_area.tagarray_area.width;
}
if (NSubbanks == 2)
{
total_height =
result_area.dataarray_area.height + (RWP + ERP + EWP) * ADDRESS_BITS;
total_width =
(result_area.dataarray_area.width +
result_area.tagarray_area.width) * 2 + (ADDRESS_BITS +
BITOUT) * NSubbanks * (RWP +
ERP +
EWP);
}
if (NSubbanks == 4)
{
total_height =
2 * result_area.dataarray_area.height + 2 * (RWP + ERP +
EWP) * ADDRESS_BITS;
total_width =
(result_area.dataarray_area.width +
result_area.tagarray_area.width) * 2 + (ADDRESS_BITS +
BITOUT) * NSubbanks * (RWP +
ERP +
EWP);
}
if (NSubbanks == 8)
{
total_height =
(result_area.dataarray_area.width +
result_area.tagarray_area.width) * 2 + (ADDRESS_BITS +
BITOUT) * NSubbanks * (RWP +
ERP +
EWP) *
0.5;
total_width =
2 * (2 * result_area.dataarray_area.height +
2 * (RWP + ERP + EWP) * ADDRESS_BITS) + (ADDRESS_BITS +
BITOUT) * NSubbanks *
(RWP + ERP + EWP);
}
if (NSubbanks > 8)
{
//v4.1: Fixing double->int type conversion problems. EPSILON is added below to make sure
//the final int value is the correct one
//blocks = NSubbanks / 16 ;
blocks = (int) (NSubbanks / 16 + EPSILON) ;
//htree = (int) (logtwo_area ((double) (blocks)));
htree = (int) (logtwo_area ((double) (blocks)) + EPSILON);
base_height =
2 *
((result_area.
dataarray_area.width + result_area.tagarray_area.width) * 2 +
(ADDRESS_BITS + BITOUT) * 16 * (RWP + ERP + EWP) * 0.25) +
(ADDRESS_BITS + BITOUT) * 16 * (RWP + ERP + EWP) * 0.5;
base_width =
2 * (2 * result_area.dataarray_area.height +
2 * (RWP + ERP + EWP) * ADDRESS_BITS) + (ADDRESS_BITS +
BITOUT) * 16 * (RWP +
ERP +
EWP) *
0.25;
base_subbanks = 16;
if (htree % 2 == 0)
{
iter_height = htree / 2;
}
else
{
iter_height = (htree - 1) / 2;
}
inter_height = base_height;
inter_subbanks = base_subbanks;
if (iter_height == 0)
{
total_height = base_height;
}
else
{
for (i = 1; i <= iter_height; i++)
{
total_height =
2 * (inter_height) + (ADDRESS_BITS +
BITOUT) * 4 * inter_subbanks * (RWP +
ERP +
EWP) *
0.5;
inter_height = total_height;
inter_subbanks = inter_subbanks * 4;
}
}
inter_width = base_width;
inter_subbanks = base_subbanks;
iter_width = 10;
if (htree % 2 == 0)
{
iter_width = htree / 2;
}
if (iter_width == 0)
{
total_width = base_width;
}
else
{
if (htree % 2 == 0)
{
for (i = 1; i <= iter_width; i++)
{
total_width =
2 * (inter_width) + (ADDRESS_BITS +
BITOUT) * inter_subbanks * (RWP +
ERP +
EWP);
inter_width = total_height;
inter_subbanks = inter_subbanks * 4;
}
}
else
{
htree_double = htree + 1;
iter_width_double = htree_double / 2;
for (i = 1; i <= iter_width_double; i++)
{
total_width =
2 * (inter_width) + (ADDRESS_BITS +
BITOUT) * inter_subbanks * (RWP +
ERP +
EWP);
inter_width = total_height;
inter_subbanks = inter_subbanks * 4;
}
total_width +=
(ADDRESS_BITS + BITOUT) * (RWP + ERP + EWP) * NSubbanks / 2;
}
}
}
result_subbanked->height = total_height;
result_subbanked->width = total_width;
temp.width = result_subbanked->height;
temp.height = result_subbanked->width;
temp_aspect =
((temp.height / temp.width) >
1.0) ? (temp.height / temp.width) : 1.0 / (temp.height / temp.width);
aspect_ratio_total = (result_subbanked->height / result_subbanked->width);
aspect_ratio_total =
(aspect_ratio_total >
1.0) ? (aspect_ratio_total) : 1.0 / (aspect_ratio_total);
if (aspect_ratio_total > temp_aspect)
{
result_subbanked->height = temp.height;
result_subbanked->width = temp.width;
}
aspect_ratio_subbank =
(result_area.dataarray_area.height /
(result_area.dataarray_area.width + result_area.tagarray_area.width));
aspect_ratio_subbank =
(aspect_ratio_subbank >
1.0) ? (aspect_ratio_subbank) : 1.0 / (aspect_ratio_subbank);
aspect_ratio_total = (result_subbanked->height / result_subbanked->width);
aspect_ratio_total =
(aspect_ratio_total >
1.0) ? (aspect_ratio_total) : 1.0 / (aspect_ratio_total);
}
int
data_organizational_parameters_valid (int B,int A,int C,int Ndwl,int Ndbl,double Nspd,char assoc,double NSubbanks)
{
int temp = 0;
double before = 0.0;
int tagbits = 0;
int data_rows = 0, data_columns = 0, tag_rows = 0, tag_columns = 0;
/* don't want more than 8 subarrays for each of data/tag */
if (assoc == 0) {
if (Ndwl * Ndbl > MAXSUBARRAYS) {return (FALSE);}
/* add more constraints here as necessary */
//v4.1: Number of rows per subarray is (C / (B * A * Ndbl * Nspd),
//not (C / (8 * B * A * Ndbl * Nspd)
//if (C / (8 * B * A * Ndbl * Nspd) <= 0) {return (FALSE);}
if (C / (B * A * Ndbl * Nspd) <= 0) {return (FALSE);}
if ((8 * B * A * Nspd / Ndwl) <= 0) {return (FALSE);}
/*dt: Don't want ridicolously small arrays*/
/*dt: data side: number of rows should be greater than 8 */
//v4.1: Fixing double->int type conversion problems. EPSILON is added below to make sure
//the final int value is the correct one
//data_rows = C/(B*A*Ndbl*Nspd) ;
data_rows = (int) (C/(B*A*Ndbl*Nspd) + EPSILON);
if(8 > data_rows) {return (FALSE);}
//dt: data side: number of rows should be less than 4k
if(2048 < data_rows) {return (FALSE);}
//dt: data side: number of columns should be greater than 16
//v4.1: Fixing double->int type conversion problems. EPSILON is added below to make sure
//the final int value is the correct one
//data_columns = 8*B*A*Nspd/Ndwl;
data_columns =
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -