⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 area.c.svn-base

📁 模拟多核状态下龙芯处理器的功能
💻 SVN-BASE
📖 第 1 页 / 共 5 页
字号:
	      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 + -