/* ** gl.c -- area estimation generation for entire layout, GL algorithm ** Joseph B. Evans, 1/29/89 */ #include #include #include "estimate.h" estimate(area,time) double *area,*time; { struct pe dadd,cadd,ddmult,dcmult,ccmult; struct pe dlatch,clatch,elatch; struct pe ram1,ram2,row; struct pe mpe_glue; struct pe bs,div; /* main processing elements */ if (parallel == 1) { addp(q.data,&dadd); addp(q.coef,&cadd); multp(q.data,q.data,&ddmult); multp(q.data,q.coef,&dcmult); multp(q.coef,q.coef,&ccmult); divp(q.coef,q.coef,&div); vs_shftp(q.coef,q.coef,&bs); } else if (serial == 1) { adds(q.data,&dadd); adds(q.coef,&cadd); multsp(q.data,q.data,&ddmult); multsp(q.data,q.coef,&dcmult); multsp(q.coef,q.coef,&ccmult); divs(q.coef,q.coef,&div); vs_shfts(q.coef,q.coef,&bs); } *area = ccmult.area+2.*dcmult.area+3.*ddmult.area+4.*cadd.area+3.*dadd.area+4.*bs.area+2.*div.area; *time = max(ddmult.time,bs.time)+max(ccmult.time,bs.time)+max(ddmult.time,div.time)+ccmult.time+2.*cadd.time; /* multiple tap effects and memory */ if (dedicate == 1) { latch(q.coef,&clatch); latch(q.data,&dlatch); *area = (*area + 4.*clatch.area + 3.*dlatch.area)*(double)taps; *time += 2.*max(clatch.time,dlatch.time); } else if (multi == 1) { ramrow(taps,&row); sram(3*q.data+2*q.coef,taps,&ram1); ram1.y += row.y; ram1.area += row.area; sram(2*q.coef,taps,&ram2); ram2.y += row.y; ram2.area += row.area; latch(q.err,&elatch); latch(q.data,&dlatch); glue(taps,&mpe_glue); *area += ram1.area+ram2.area+2.*dlatch.area+elatch.area+mpe_glue.area; *time += (*time+ram1.time+ram2.time+2.*row.time+mpe_glue.time)*(double)taps+dlatch.time; } }