Exemplo n.º 1
0
Arquivo: io.c Projeto: dilawar/sesc
double 
estimate_switching_io(
	double padCeff,
	double lCeff,
	unsigned nbstages_opt, /* optimial number of io buffer stages */
	double strip_length /* length of microstrip */
	)
{
	int i;

	double btr_opt;
	double microCeff;
	double iCeff;
	microstrip_t micro_spec;
	micro_spec.dielectric = MICROSTRIP_ER;  
	micro_spec.width = MICROSTRIP_H;  
	micro_spec.thickness = MICROSTRIP_T;  
	micro_spec.height = MICROSTRIP_W;  
	micro_spec.length = strip_length;  
	microCeff = estimate_microstrip_capacitance(&micro_spec);
	fprintf(stderr, "strip_length =  %lf\n", strip_length);
	fprintf(stderr, "microCeff %3.4e\n", microCeff);
	btr_opt = estimate_btr_opt(nbstages_opt, padCeff + microCeff + lCeff);
	fprintf(stderr, "optimal buffer transistor ratio: %3.4e\n", btr_opt);
	iCeff = estimate_ibufchainiCeff(btr_opt, padCeff + microCeff + lCeff);
	iCeff += padCeff + microCeff + lCeff;
	fprintf(stderr, "iCeff: %3.4e\n", iCeff);
	return iCeff;
}
Exemplo n.º 2
0
/* create io panalyzer database
 * return an allocated location pointer.
 * caution: please deallocate the memory space  */
fu_io_pspec_t *
create_io_panalyzer(
	char *name, /* io name */
	fu_pmodel_mode_t pmodel, /* io power model mode */
	double opfreq, /* operating frequency */ 
	double iovolt,
	/* io specific parameters */
	fu_io_style_t style, /* io style */
	unsigned nbstages_opt, /* optimial number of io buffer stages */
	double strip_length, /* length of microstrip */
	unsigned buswidth, /* bus width */
	unsigned nacycles, unsigned nctcycles, /* io access/cycle time in cycles */
	
	unsigned bsize, /* bus size in bytes */
	/* switching/internal/lekage  effective capacitances */
	double sCeff, double iCeff, double lCeff)
{
	int i;
	fu_io_pspec_t *pspec;

	fprintf(stderr, "\n**********************************************\n");
	fprintf(stderr, "\t\tio panalyzer configuration\n");
	fprintf(stderr,   "**********************************************\n");

	if(!(pspec = (fu_io_pspec_t *)malloc(sizeof(fu_io_pspec_t))))
		fatal("lack of virtual memory");

	fprintf(stderr, "name: %s\n", name);
	/* default data structure */
	pspec->name = strdup(name);
	pspec->pmodel = pmodel; 
	pspec->opfreq = opfreq; 
	pspec->svolt = iovolt; /* io supply voltage */

	if(pmodel == Analytical)
	fprintf(stderr, "pmodel type: analytical power model\n");
	else
	fprintf(stderr, "pmodel type: empirical power model\n");
	
	/* io specific parameters */
	pspec->style = style; 
	pspec->nbstages_opt = nbstages_opt; 
	pspec->buswidth = buswidth; 
	pspec->nacycles = nacycles; 
	pspec->nctcycles = nctcycles; 
	pspec->bsize = bsize;

	/* address bus size in bytes */
	//fprintf(stderr, "bus size:%u\t", bsize);
	/* create bus buffer */
	if(!(pspec->bus = (buffer_t *)calloc(bsize,sizeof(buffer_t))))
	// if(!(pspec->bus = (buffer_t *)malloc(bsize * sizeof(buffer_t))))
		fatal("lack of virtual memory");

	/* create effective capacitance data structure */
	if(!(pspec->Ceffs = (fu_Ceffs_t *)malloc(sizeof(fu_Ceffs_t))))
		fatal("lack of virtual memory");

	/* analytical power model */
	if(pmodel == Analytical) 
	{
		double btr_opt;
		double microCeff;
		microstrip_t micro_spec;
		micro_spec.dielectric = MICROSTRIP_ER;  
		micro_spec.width = MICROSTRIP_H;  
		micro_spec.thickness = MICROSTRIP_T;  
		micro_spec.height = MICROSTRIP_W;  
		micro_spec.length = strip_length;  
		microCeff = estimate_microstrip_capacitance(&micro_spec);
	fprintf(stderr, "strip_length =  %lf\n", strip_length);
	fprintf(stderr, "microCeff %3.4e\n", microCeff);
//	getchar();
		btr_opt = estimate_btr_opt(nbstages_opt, sCeff + microCeff);
	fprintf(stderr, "optimal buffer transistor ratio: %3.4e\n", btr_opt);
		pspec->Ceffs->sCeff = sCeff + microCeff /* (packaging cap) */;
		pspec->Ceffs->iCeff = estimate_ibufchainiCeff(btr_opt, sCeff + microCeff);
		pspec->Ceffs->lCeff 
				= estimate_ibufchainlCeff(nbstages_opt, btr_opt, pspec->opfreq, pspec->svolt) * (double)(bsize * 8); 
	}
	/* empirical model */
	else 
		*(pspec->Ceffs) = assign_fu_Ceffs(sCeff, iCeff, lCeff * (double)(bsize * 8), 0.);

	fprintf(stderr, "external switching capacitance: %3.4e (pF)\n", pspec->Ceffs->sCeff * 1E12);
	fprintf(stderr, "internal switching capacitance: %3.4e (pF)\n", pspec->Ceffs->iCeff * 1E12);
	fprintf(stderr, "effective leakage capacitance: %3.4e (pF)\n", pspec->Ceffs->lCeff * 1E12);

	/* create a power statistics db */
	
//	if(!(pspec->pdissipation = (fu_pdissipation_t *)malloc(sizeof(fu_pdissipation_t))))
	if(!(pspec->pdissipation = (fu_pdissipation_t *)calloc(1,sizeof(fu_pdissipation_t))))
		fatal("lack of virtual memory");
	/* initialize a power statistics db structure */
	initialize_fu_pdissipation(pspec->pdissipation); 

	/* initialize a power monitor window */
	for(i = 0; i < MaxPMWindows; i++) 
	{
		initialize_fu_pmwindow(i, pspec->pmwindow); 
		/* put leakage power numbers in all the power window entry 
		 * b/c leakage is access independent and swithing independent */
		(pspec->pmwindow + i)->leakage = estimate_pdissipation(pspec->Ceffs->lCeff, pspec->opfreq, pspec->svolt);
		(pspec->pmwindow + i)->pdissipation = (pspec->pmwindow + i)->leakage;
	}
	
	return pspec;
}