blob: 836ff83e5427eb973d93cf3d1375d7f9bef4937a [file] [log] [blame]
#include "custom.h"
extern double chipaspect ;
extern double spot_control ;
extern int cost_only ;
extern int attpercell ;
extern int doPlacement ;
extern int doChannelGraph ;
extern int doGlobalRoute ;
extern int doCompaction ;
extern int pitch ;
int core_expansion_given ;
int wire_est_factor ;
double core_expansion ;
int defaultTracks ;
int routerMaxPaths ;
int routerExtraS ;
int bareFlag ;
int wireEstimateOnly ;
void readpar(void)
{
FILE *fp;
int test ;
char input[1024] ;
char filename[1024] ;
wireEstimateOnly = 0 ;
attpercell = -1 ;
lapFactor = 1.0;
cost_only = 0 ;
maxWeight = 2 ;
baseWeight = 1 ;
chipaspect = -1.0 ;
pinSpacing = -1 ;
trackspacing = -1 ;
doPlacement = 0 ;
doChannelGraph = 0 ;
doGlobalRoute = 0 ;
doCompaction = 0 ;
coreGiven = 0 ;
gOffsetX = -1000000 ;
gOffsetY = -1000000 ;
gridX = -1000000 ;
gridY = -1000000 ;
defaultTracks = -1 ;
routerMaxPaths = -1 ;
routerExtraS = -1 ;
core_expansion_given = 0 ;
spot_control = -1.0 ;
sprintf( filename, "%s.par" , cktName ) ;
if( (fp = fopen( filename , "r")) == (FILE *) NULL ) {
fprintf(fpo,"can't open %s\n", filename ) ;
exit (0);
}
while( fscanf( fp , " %s " , input ) == 1 ) {
if( strcmp( input , "initialT") == 0 ) {
test = fscanf( fp , " %lf " , &T ) ;
if( test != 1 ) {
fprintf(fpo,"The value of initialT was not properly");
fprintf(fpo,"entered in the .par file\n");
exit(0);
}
} else if( strcmp( input , "spot.control") == 0 ) {
test = fscanf( fp , " %lf " , &spot_control ) ;
if( test != 1 ) {
fprintf(fpo,"The value of spot.control was not properly");
fprintf(fpo,"entered in the .par file\n");
exit(0);
}
} else if( strcmp( input , "core.expansion") == 0 ) {
test = fscanf( fp , " %lf " , &core_expansion ) ;
if( test != 1 ) {
fprintf(fpo,"The value of core.expansion was not properly");
fprintf(fpo,"entered in the .par file\n");
exit(0);
}
core_expansion_given = 1 ;
} else if( strcmp( input , "wire.estimation.factor") == 0 ) {
test = fscanf( fp , " %d " , &wire_est_factor ) ;
if( test != 1 ) {
fprintf(fpo,"The value of wire.estimation.factor was not ");
fprintf(fpo,"properly entered in the .par file\n");
exit(0);
}
} else if( strcmp( input , "cost_only") == 0 ) {
cost_only = 1 ;
} else if( strcmp( input , "random.seed") == 0 ) {
test = fscanf( fp , " %d " , &randVar ) ;
if( test != 1 ) {
fprintf(fpo,"The value of random.seed was not properly");
fprintf(fpo,"entered in the .par file\n");
exit(0);
}
} else if( strcmp( input , "att.per.cell") == 0 ) {
test = fscanf( fp , " %d " , &attpercell ) ;
if( test != 1 ) {
fprintf(fpo,"The value of att.per.cell was not properly");
fprintf(fpo,"entered in the .par file\n");
exit(0);
}
} else if( strcmp( input , "track.spacing") == 0 ) {
test = fscanf( fp , " %d " , &trackspacing ) ;
if( test != 1 ) {
fprintf(fpo,"The value for track.spacing was not properly");
fprintf(fpo,"entered in the .par file\n");
exit(0);
}
pitch = trackspacing ;
} else if( strcmp( input , "pin.spacing") == 0 ) {
test = fscanf( fp , " %d " , &pinSpacing ) ;
if( test != 1 ) {
fprintf(fpo,"The value for pin.spacing was not properly");
fprintf(fpo,"entered in the .par file\n");
exit(0);
}
} else if( strcmp( input , "chip.aspect.ratio") == 0 ) {
test = fscanf( fp , " %lf " , &chipaspect ) ;
if( test != 1 ) {
fprintf(fpo,"The value for chip.aspect.ratio was not");
fprintf(fpo," properly entered in the .par file\n");
exit(0);
}
} else if( strcmp( input , "router.max.paths") == 0 ) {
test = fscanf( fp , " %d " , &routerMaxPaths ) ;
if( test != 1 ) {
fprintf(fpo,"The value for router.max.paths was");
fprintf(fpo," not properly entered in the .par file\n");
exit(0);
}
} else if( strcmp( input , "router.extra.sources") == 0 ) {
test = fscanf( fp , " %d " , &routerExtraS ) ;
if( test != 1 ) {
fprintf(fpo,"The value for router.extra.sources was");
fprintf(fpo," not properly entered in the .par file\n");
exit(0);
}
} else if( strcmp( input , "default.tracks.per.channel") == 0 ) {
test = fscanf( fp , " %d " , &defaultTracks ) ;
if( test != 1 ) {
fprintf(fpo,"The value for default.tracks.per.channel was");
fprintf(fpo," not properly entered in the .par file\n");
exit(0);
}
} else if( strcmp( input , "wire.estimation.only") == 0 ) {
wireEstimateOnly = 1 ;
} else if( strcmp( input , "do.placement") == 0 ) {
doPlacement = 1 ;
} else if( strcmp( input , "do.channel.graph") == 0 ) {
doChannelGraph = 1 ;
} else if( strcmp( input , "do.global.route") == 0 ) {
doGlobalRoute = 1 ;
} else if( strcmp( input , "do.compaction") == 0 ) {
test = fscanf( fp , " %d " , &doCompaction ) ;
if( test != 1 ) {
fprintf(fpo,"The value for do.compaction was not properly");
fprintf(fpo,"entered in the .par file\n");
exit(0);
}
} else if( strcmp( input , "core") == 0 ) {
test = fscanf( fp , " %d %d %d %d " , &blockl , &blockr,
&blockb , &blockt ) ;
if( test != 4 ) {
fprintf(fpo,"The 4 values for core were not properly");
fprintf(fpo,"entered in the .par file\n");
exit(0);
}
coreGiven = 1 ;
} else if( strcmp( input , "gridOffsetX") == 0 ) {
test = fscanf( fp , " %d " , &gOffsetX ) ;
if( test != 1 ) {
fprintf(fpo,"The value for gridOffsetX was not properly");
fprintf(fpo,"entered in the .par file\n");
exit(0);
}
} else if( strcmp( input , "gridOffsetY") == 0 ) {
test = fscanf( fp , " %d " , &gOffsetY ) ;
if( test != 1 ) {
fprintf(fpo,"The value for gridOffsetY was not properly");
fprintf(fpo,"entered in the .par file\n");
exit(0);
}
} else if( strcmp( input , "gridX") == 0 ) {
test = fscanf( fp , " %d " , &gridX ) ;
if( test != 1 ) {
fprintf(fpo,"The value for gridX was not properly");
fprintf(fpo,"entered in the .par file\n");
exit(0);
}
} else if( strcmp( input , "gridY") == 0 ) {
test = fscanf( fp , " %d " , &gridY ) ;
if( test != 1 ) {
fprintf(fpo,"The value for gridY was not properly");
fprintf(fpo,"entered in the .par file\n");
exit(0);
}
} else {
fprintf(fpo,"Unexpected keyword in the .par file\n");
exit(0);
}
}
if( doPlacement ) {
if( gridX >= 0 || gridY >= 0 || gOffsetX >= 0 || gOffsetY >= 0 ) {
if( !(gridX >= 0 && gridY >= 0 &&
gOffsetX >= 0 && gOffsetY >= 0 ) ) {
fprintf(fpo,"Error: It appears as though the grid is\n");
fprintf(fpo,"not fully specified\n");
exit(0);
} else {
gridGiven = 1 ;
}
}
if( attpercell == -1 ) {
fprintf(fpo,"att.per.cell was not entered in the .par file\n");
exit(0);
} else {
fprintf(fpo,"att.per.cell: %d\n" , attpercell ) ;
}
if( trackspacing < 0 ) {
fprintf(fpo,"track.spacing was not entered in .par file\n");
exit(0);
} else {
fprintf(fpo,"track.spacing: %d\n" , trackspacing ) ;
}
if( pinSpacing < 0 ) {
fprintf(fpo,"pin.spacing was not entered in the .par file\n");
exit(0);
} else {
fprintf(fpo,"pin.spacing: %d\n" , pinSpacing ) ;
}
if( chipaspect < 0.0 ) {
fprintf(fpo,"chip.aspect.ratio was not entered ");
fprintf(fpo,"in the .par file\n");
exit(0);
} else {
fprintf(fpo,"chip.aspect.ratio: %g\n" , chipaspect ) ;
}
if( spot_control < 0.0 ) {
fprintf(fpo,"Using default value of spot.control: 1.0\n");
spot_control = 1.0 ;
} else {
fprintf(fpo,"spot.control set to: %f\n", spot_control );
}
}
if( doPlacement ) {
fprintf(fpo,"TimberWolf instructed to do ");
fprintf(fpo,"placement of circuit:<%s>\n", cktName ) ;
}
if( doChannelGraph ) {
fprintf(fpo,"TimberWolf instructed to generate ");
fprintf(fpo,"channel graph for circuit:<%s>\n", cktName ) ;
if( ! doPlacement ) {
fprintf(fpo,"TimberWolf assumes input files: ");
fprintf(fpo,"<%s.geo> and <%s.pin> are present in\n",
cktName, cktName );
}
}
if( doGlobalRoute ) {
if( routerMaxPaths < 0 ) {
fprintf(fpo,"router.max.paths was not entered in .par file\n");
exit(0);
} else {
fprintf(fpo,"router.max.paths: %d\n" , routerMaxPaths ) ;
}
if( routerMaxPaths == 0 ) {
fprintf(fpo,"router.max.paths set to BARE MINIMUM version\n");
routerMaxPaths = 1 ;
bareFlag = 1 ;
} else {
bareFlag = 0 ;
}
if( routerExtraS < 0 ) {
fprintf(fpo,"router.extra.sources was not entered in .par file\n");
exit(0);
} else {
fprintf(fpo,"router.extra.sources: %d\n" , routerExtraS ) ;
}
if( doChannelGraph ) {
if( trackspacing < 0 ) {
fprintf(fpo,"track.spacing was not entered in .par file\n");
exit(0);
} else {
fprintf(fpo,"track.spacing: %d\n" , trackspacing ) ;
}
if( defaultTracks < 0 ) {
fprintf(fpo,"default.tracks.per.channel \n");
fprintf(fpo,"was not entered in .par file\n");
exit(0);
} else {
fprintf(fpo,"default.tracks.per.channel: %d\n",defaultTracks);
}
}
fprintf(fpo,"TimberWolf instructed to do ");
fprintf(fpo,"global route for circuit:<%s>\n", cktName ) ;
if( ! doChannelGraph ) {
fprintf(fpo,"TimberWolf assumes input files: ");
fprintf(fpo,"<%s.gph> and <%s.twf> are present in ",
cktName, cktName );
fprintf(fpo,"the working directory\n") ;
}
}
if( doCompaction ) {
fprintf(fpo,"TimberWolf instructed to do ");
fprintf(fpo,"post-placement compaction for circuit:<%s>\n",cktName);
if( !(doPlacement && doChannelGraph && doGlobalRoute) ) {
fprintf(fpo,"Error: TimberWolf cannot do compaction\n");
fprintf(fpo,"without request to also do: doPlacement,\n");
fprintf(fpo,"doChannelGraph and doGlobalRoute\n");
fprintf(fpo,"Hence, request is cancelled\n");
doCompaction = 0 ;
}
}
fflush(fpo);
return ;
}