/* ** dm.c -- area/speed estimation, extrapolates data from actual layouts ** - performs initializtation and overall control of estimation ** - area estimation generation for entire layout, DPCM/SA 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; v.m0 = 8; v.m1 = 9; v.ss = 3; targc = argc; targv = argv; while(--targc && (**++targv == '-')) getoptions(&targc, &targv); if (argc == 7) { taps = atoi(argv[3]); q.data = atoi(argv[4]); q.coef = atoi(argv[5]); q.err = atoi(argv[6]); } else if (argc == 8) { taps = atoi(argv[3]); q.data = atoi(argv[4]); q.coef = atoi(argv[5]); q.err = atoi(argv[6]); line = atof(argv[7]); } else if (argc == 10) { taps = atoi(argv[3]); q.data = atoi(argv[4]); q.coef = atoi(argv[5]); q.err = atoi(argv[6]); v.m0 = atoi(argv[7]); v.m1 = atoi(argv[8]); v.ss = atoi(argv[9]); } else if (argc == 11) { taps = atoi(argv[3]); q.data = atoi(argv[4]); q.coef = atoi(argv[5]); q.err = atoi(argv[6]); v.m0 = atoi(argv[7]); v.m1 = atoi(argv[8]); v.ss = atoi(argv[9]); line = atof(argv[10]); } else { printf("usage: %s -p|-s -m|-d taps data_bits coef_bits dpcm_levels [m0 m1 ss_bits] [line_width]\n",argv[0]); exit(1); } initialize(line); estimate(&area,&time); /* printf("\nArea/Speed Estimates\n"); printf("process: single level metal, poly, %g microns\n",line); if (dedicate == 1) printf("dedicated PE, %d taps\n",taps); else if (multi == 1) printf("multiplexed PE, %d taps\n",taps); printf("data bits = %d\tcoefficient bits = %d\tdpcm levels = %d\n",q.data,q.coef,q.err); 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 fadd,cadd,bs; struct pe m1add,m2add,dmadd,mlatch,dq; struct pe dlatch,clatch,elatch; struct pe dram,cram,row; struct pe mpe_glue; /* filter elements */ if (parallel == 1) { addp(q.data,&fadd); addp(q.coef,&cadd); vs_shftp(q.data,q.err,&bs); } else if (serial == 1) { adds(q.data,&fadd); adds(q.coef,&cadd); vs_shfts(q.data,q.err,&bs); } *area = bs.area+cadd.area+fadd.area; *time = bs.time+cadd.time+fadd.time; /* modulator */ if (parallel == 1) { addp(q.data,&m1add); addp(q.coef,&m2add); } else if (serial == 1) { adds(q.data,&m1add); adds(q.coef,&m2add); } latch(q.data,&mlatch); dq.area = X_PTQQ*Y_PTQQ*max(q.data,q.err); dq.time = T_PTQQ*max(q.data,q.err); *area += m1add.area+m2add.area+mlatch.area+dq.area; *time += max(m1add.time,dq.time)+max(m2add.time,dq.time)+mlatch.time; /* demodulator */ if (parallel == 1) { addp(q.data,&dmadd); } else if (serial == 1) { adds(q.data,&dmadd); } *area += dmadd.area+mlatch.area; *time += max(dmadd.time,mlatch.time); /* multiple tap effects and memory */ if (dedicate == 1) { latch(q.coef,&clatch); latch(q.data,&dlatch); *area = (*area + clatch.area + 2.*dlatch.area)*(double)taps; *time += clatch.time+2.*dlatch.time; } else if (multi == 1) { ramrow(taps,&row); sram(q.data,taps,&dram); dram.y += row.y; dram.area += row.area; sram(q.coef,taps,&cram); cram.y += row.y; cram.area += row.area; latch(q.err,&elatch); latch(q.data,&dlatch); glue(taps,&mpe_glue); *area += dram.area+cram.area+3.*dlatch.area+elatch.area+mpe_glue.area; *time += (*time+max(cram.time+row.time,dram.time+row.time)+dlatch.time+mpe_glue.time)*(double)taps+dlatch.time; } }