blob: 51c4e3ac04cdf6772656670058c0cb08cfafeb66 [file] [log] [blame]
#include "custom.h"
extern int attpercell ;
extern int bigcell ;
extern int toobig ;
extern int attmax ;
extern int doChannelGraph ;
extern int doGlobalRoute ;
extern int doCompaction ;
extern int bbleft , bbright , bbbottom , bbtop ;
extern double Tsave ;
int finalShot ;
int redoFlag ;
int TWsignal ;
extern int checkpen(void);
extern void addpins(void);
extern void doborder(void);
extern void subpins(void);
extern void gpass2( FILE *fp );
extern void grdcell( FILE *fp );
extern void rebin(int flag);
extern int findcost(void);
extern void outgeo(void);
extern void outpin(void);
extern void fixpenal(void);
extern void gmain(void);
extern void rmain(void);
extern void scrappin(void);
extern void wirecosts( int *withPads , int *withOutPads );
extern void initbb(void);
extern void utemp(void);
extern void finalpin(void);
extern void prboard(void);
extern void outbig(void);
extern void outsmall(void);
extern void output(void);
extern void savewolf(void);
void prepOutput(void);
void finalout(void)
{
FILE *fp ;
int c , withPads , withOutPads ;
char filename[1024] ;
char command[128] ;
double Tscale , bound ;
TWsignal = 0 ;
Tscale = Tsave / 100000.0 ;
bound = log10( Tsave ) ;
if( bound > 6.0 ) {
bound = bound - 1.0 ;
} else {
bound = 5.0 ;
}
bound = pow( 4.0 , bound ) ;
redoFlag = 0 ;
prepOutput() ;
sprintf(filename, "%s.cel" , cktName ) ;
fp = fopen( filename , "r") ;
gpass2( fp ) ;
grdcell( fp ) ;
fclose( fp ) ;
overlap = goverlap ;
overlapf = goverlapf ;
overlapx = goverlapx ;
rebin(0) ;
lapFactor *= 2.0 ;
offset = (int)( 4.0 / lapFactor ) ;
fprintf(fpo,"\n\nNew Value for lapFactor: %f\n", lapFactor );
fprintf(fpo,"New Value for offset: %d\n\n", offset );
funccost = findcost() ;
outgeo() ;
outpin() ;
if( checkpen() > 0 ) {
fixpenal() ;
redoFlag = 1 ;
prepOutput() ;
rebin(0) ;
funccost = findcost() ;
outgeo() ;
outpin() ;
if( checkpen() > 0 ) {
fprintf(fpo,"TimberWolf failed to resolve overlap problem.\n\n");
fflush(fpo);
return;
} else {
fprintf(fpo,"\n\nPotential Overlap Problem Averted\n\n");
fflush(fpo);
}
}
if( doCompaction > 0 ) {
finalShot = 1 ;
gmain() ;
rmain() ;
redoFlag = 0 ;
addpins() ;
fprintf(stderr, "Cannot execute system calls!\n");
abort();
sprintf( command , "cp %s.cfs cfss1", cktName ) ;
// system( command ) ;
sprintf( command , "cp %s.cfb cfbb1", cktName ) ;
// system( command ) ;
for( c = 1 ; c <= doCompaction ; c++ ) {
finalShot = c ;
if( c == doCompaction ) {
lapFactor *= 2.0 ;
offset = (int)( 4.0 / lapFactor ) ;
fprintf(fpo,"\n\nNew Value for lapFactor: %f\n", lapFactor );
fprintf(fpo,"New Value for offset: %d\n\n", offset );
}
doborder() ;
rebin(1) ;
if( c == 1 ) {
scrappin() ;
attmax = 50 * numcells ;
bigcell = numcells * 11 ;
toobig = bigcell + 1 ;
}
/*
if( c == 1 ) {
reconfigSides( 0.02 ) ;
}
if( c == doCompaction ) {
reconfigSides( 0.05 ) ;
}
*/
funccost = findcost() ;
fprintf(fpo,"\n\nCompactor Pass Number: %d\n", c ) ;
fprintf(fpo," begins with: route cost: %d overlap: %d ",
funccost , penalty ) ;
fprintf(fpo," overfill: %d\n", overfill ) ;
wirecosts( &withPads , &withOutPads ) ;
fprintf(fpo,"\n\nCOMPACT #%d: TOTAL Wire Length:\n", c );
fprintf(fpo,"(before) WITH Pads: %d WITHOUT Pads: %d\n\n",
withPads , withOutPads ) ;
initbb() ;
if( c == 1 ) {
fprintf(fpo,"\n\nCORE Bounding Box: l:%d r:%d b:%d t:%d\n\n",
bbleft , bbright , bbbottom , bbtop ) ;
}
/* T = 600.0 * Tscale ; */
T = log10( 0.015 * bound ) / log10( 4.0 ) ;
T = pow( 10.0 , T ) ;
utemp() ;
fprintf(fpo," ends with: route cost: %d overlap: %d ",
funccost , penalty ) ;
fprintf(fpo," overfill: %d\n", overfill ) ;
fflush( fpo ) ;
/*
if( c == doCompaction ) {
config3() ;
funccost = findcost() ;
}
*/
prepOutput() ;
outgeo() ;
outpin() ;
rebin(0) ;
if( checkpen() > 0 ) {
fixpenal() ;
redoFlag = 1 ;
prepOutput() ;
rebin(0) ;
funccost = findcost() ;
outgeo() ;
outpin() ;
if( checkpen() > 0 ) {
fprintf(fpo,"TimberWolf failed to resolve overlap ");
fprintf(fpo,"problem. \n Will have to die\n\n");
fflush(fpo);
return;
}
}
wirecosts( &withPads , &withOutPads ) ;
fprintf(fpo,"\n\nCOMPACT #%d: TOTAL Wire Length:\n", c );
fprintf(fpo,"(after) WITH Pads: %d WITHOUT Pads: %d\n\n",
withPads , withOutPads ) ;
gmain() ;
rmain() ;
redoFlag = 0 ;
fprintf(stderr, "Cannot execute system calls!\n");
abort();
sprintf( command , "cp %s.cfs cfss%d", cktName , c + 1) ;
// system( command ) ;
sprintf( command , "cp %s.cfb cfbb%d", cktName , c + 1) ;
// system( command ) ;
}
subpins() ;
fprintf(fpo,"\n\nCORE Bounding Box: l:%d r:%d b:%d t:%d\n\n",
bbleft , bbright , bbbottom , bbtop ) ;
} else {
if( doChannelGraph ) {
gmain() ;
}
if( doGlobalRoute ) {
rmain() ;
}
}
return ;
}
void prepOutput(void)
{
finalpin() ;
prboard () ;
outbig() ;
outsmall() ;
output() ;
if( finalShot == 0 ) {
savewolf() ;
}
return ;
}