/* ** da.c -- area/speed estimation, extrapolates data from actual layouts ** - performs initializtation and overall control of estimation ** - area estimation generation for entire layout, DA algorithm ** Joseph B. Evans, 1/29/89 */ #include #include #include "estimate.h" #define CONV 1000000. /* convert from sq microns to sq mm */ main(argc,argv) char **argv; int argc; { double area,time; double line = DEF_PR; int minbits = MINBITS; int maxbits = MAXBITS; FILE *fp_a,*fp_t; char **targv; int targc; targc = argc; targv = argv; while(--targc && (**++targv == '-')) getoptions(&targc, &targv); if (argc == 4) { taps = atoi(argv[1]); q.data = atoi(argv[2]); q.coef = atoi(argv[3]); } else if (argc == 5) { taps = atoi(argv[1]); q.data = atoi(argv[2]); q.coef = atoi(argv[3]); line = atof(argv[4]); } else { printf("usage: %s taps data_bits partial_product_bits [line_width]\n",argv[0]); printf(" results are area in square mm and speed in ns\n"); exit(1); } initialize(line); estimate(&area,&time); /* printf("\nArea/Speed Estimates\n"); printf("process: single level metal, poly, %g microns\n",line); printf("special PE, %d taps\n",taps); printf("data bits = %d\tpartial product bits = %d\n",q.data,q.coef); printf("area = %g sq mm\tcycle time = %g ns\n\n",area/CONV,time); */ printf("%g\t%g\n",area/CONV,time); } getoptions(pargc, pargv) int *pargc; char **pargv[]; { register int argc; register char **argv; register char *c; argc = *pargc; argv = *pargv; c = *argv; while(*++c) { switch(*c) { case 'm': multi = 1; break; case 'd': dedicate = 1; break; case 'p': parallel = 1; break; case 's': serial = 1; break; default: fprintf(stderr, ".... Bad option \"%c\"\n", *c); exit(); } } *pargv = argv; *pargc = argc; } estimate(area,time) double *area,*time; { struct pe padd; struct pe platch,klatch,nlatch; struct pe mpe_glue; addp(q.coef,&padd); latch(q.coef,&platch); latch(q.data,&klatch); latch(taps,&nlatch); glue(taps,&mpe_glue); *area = (X_SRAM*Y_SRAM*pow(2.,(double)(taps-1)))+(X_RAMROW*Y_RAMROW*(double)(taps-2)*pow(2.,(double)(taps-2)))+2.*padd.area+(double)taps*klatch.area+4.*platch.area+2.*nlatch.area+mpe_glue.area; *time = (double)(2*T_SRAMR+T_SRAMW+(taps-2)*T_RAMROW)+2.*padd.time+4.*nlatch.time+(double)taps*mpe_glue.time; }