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(µ_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; }
/* 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(µ_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; }