blob: a2f4b3595c0ffe7a993367f4986362d14548fe18 [file] [log] [blame]
#include "custom.h"
int *fixLRBT ;
double *padspace ;
extern void makebins( int numc );
void parser( FILE *fp )
{
int i , space , cell , test , orient , norients ;
int xpos , ypos , pad ;
int code , class ;
int sequence , firstside , lastside , cellnum ;
int corner , ncorners , x , y , minx , miny , maxx , maxy ;
double aspub , asplb ;
char input[1024] ;
CELLBOXPTR ptr ;
maxterm = 0 ;
cell = 0 ;
pad = 0 ;
while( fscanf( fp , " %s " , input ) == 1 ) {
if( strcmp( input , "cell") == 0 ) {
test = fscanf( fp , "%d" , &cellnum ) ;
if( test != 1 ) {
fprintf(fpo,"Failed to input cell # in the .cel file\n");
fprintf(fpo,"cell:%d\n", cell );
exit(0);
}
test = fscanf( fp , "%s" , input ) ;
if( test != 1 ) {
fprintf(fpo,"Failed to input keyword name \n");
fprintf(fpo," in the .cel file; cell:%d\n", cell );
exit(0);
}
if( strcmp( input , "name" ) != 0 ) {
fprintf(fpo,"Failed to input keyword name \n");
fprintf(fpo,"in the .cel file; cell:%d\n", cell );
exit(0);
}
test = fscanf( fp , "%s" , input ) ;
if( test != 1 ) {
fprintf(fpo,"Failed to input cell name in the .cel file\n");
fprintf(fpo,"cell:%d\n", cell );
exit(0);
}
cell++ ;
code = 3 ;
test = fscanf( fp , " %d " , &ncorners ) ;
if( test != 1 ) {
fprintf(fpo,"Failed to input corners in the .cel file\n");
fprintf(fpo,"cell:%d\n", cell );
exit(0);
}
if( ncorners < 4 ) {
fprintf(fpo,"Failed to input at least 4 corners");
fprintf(fpo," in the .cel file; cell:%d\n", cell );
exit(0);
}
fscanf( fp , " %s " , input ) ;
if( strcmp( input , "corners") != 0 ) {
fprintf(fpo,"parser failed to find: corners ");
fprintf(fpo,"in the .cel file\n");
fprintf(fpo,"cell:%d\n", cell );
exit(0);
}
for( corner = 1 ; corner <= ncorners ; corner++ ) {
test = fscanf( fp , " %d %d " , &x , &y ) ;
if( test != 2 ) {
fprintf(fpo,"Failed to input corner coordinates\n");
fprintf(fpo,"in the .cel file; cell:%d\n", cell );
exit(0);
} else {
if( corner == 1 ) {
minx = x ;
miny = y ;
maxx = x ;
maxy = y ;
} else {
if( x < minx ) {
minx = x ;
}
if( x > maxx ) {
maxx = x ;
}
if( y < miny ) {
miny = y ;
}
if( y > maxy ) {
maxy = y ;
}
}
}
}
fscanf( fp , " %s " , input ) ;
if( strcmp( input , "class") != 0 ) {
fprintf(fpo,"parser failed to find: class ");
fprintf(fpo,"in the .cel file\n");
fprintf(fpo,"cell:%d\n", cell );
exit(0);
}
test = fscanf( fp , " %d " , &class ) ;
if( test != 1 ) {
fprintf(fpo,"Failed to input class in the .cel file\n");
fprintf(fpo,"cell:%d\n", cell );
exit(0);
}
test = fscanf( fp , " %d " , &norients ) ;
if( test != 1 ) {
fprintf(fpo,"Failed to input orientations in the .cel file\n");
fprintf(fpo,"cell:%d\n", cell );
exit(0);
}
if( norients < 1 || norients > 8 ) {
fprintf(fpo,"Failed to input orientations between 1 and ");
fprintf(fpo,"8 in the .cel file; cell:%d\n", cell );
exit(0);
}
fscanf( fp , " %s " , input ) ;
if( strcmp( input , "orientations") != 0 ) {
fprintf(fpo,"parser failed to find: orientations ");
fprintf(fpo,"in the .cel file\n");
fprintf(fpo,"cell:%d\n", cell );
exit(0);
}
for( orient = 1 ; orient <= norients ; orient++ ) {
test = fscanf( fp , " %d " , &x ) ;
if( test != 1 ) {
fprintf(fpo,"Failed to input expected orientations\n");
fprintf(fpo,"in the .cel file; cell:%d\n", cell );
exit(0);
}
}
code = 4 ;
} else if( strcmp( input , "pin") == 0 ) {
if( code != 4 && code != 2 ) {
fprintf(fpo,"parser unexpectedly found: pin ");
fprintf(fpo,"in the .cel file\n");
fprintf(fpo,"cell:%d\n", cell );
exit(0);
}
code = 4 ;
test = fscanf( fp , "%s" , input ) ;
if( test != 1 ) {
fprintf(fpo,"parser failed to find keyword: name ");
fprintf(fpo,"in the .cel file\n");
fprintf(fpo,"cell:%d\n", cell );
exit(0);
}
if( strcmp( input , "name" ) != 0 ) {
fprintf(fpo,"parser failed to find keyword: name ");
fprintf(fpo,"in the .cel file; instead found:%s\n", input);
fprintf(fpo,"cell:%d\n", cell );
exit(0);
}
test = fscanf( fp , "%s" , input ) ;
if( test != 1 ) {
fprintf(fpo,"parser failed to find pin name ");
fprintf(fpo,"in the .cel file\n");
fprintf(fpo,"cell:%d\n", cell );
exit(0);
}
test = fscanf( fp , "%s" , input ) ;
if( test != 1 ) {
fprintf(fpo,"parser failed to find keyword: signal ");
fprintf(fpo,"in the .cel file\n");
fprintf(fpo,"cell:%d\n", cell );
exit(0);
}
if( strcmp( input , "signal" ) != 0 ) {
fprintf(fpo,"parser failed to find keyword: signal ");
fprintf(fpo,"in the .cel file; instead found:%s\n", input);
fprintf(fpo,"cell:%d\n", cell );
exit(0);
}
test = fscanf( fp , "%s" , input ) ;
if( test != 1 ) {
fprintf(fpo,"parser failed to find signal name ");
fprintf(fpo,"in the .cel file\n");
fprintf(fpo,"cell:%d\n", cell );
exit(0);
}
test = fscanf( fp , " %d %d " , &xpos , &ypos );
if( test != 2 ) {
fprintf(fpo,"Failed to input coordinates for a pin\n");
fprintf(fpo,"cell:%d\n", cell );
exit(0);
}
} else if( strcmp( input , "equiv") == 0 ) {
test = fscanf( fp , "%s" , input ) ;
if( test != 1 ) {
fprintf(fpo,"parser failed to find keyword: name ");
fprintf(fpo,"in the .cel file\n");
fprintf(fpo,"cell:%d\n", cell );
exit(0);
}
if( strcmp( input , "name" ) != 0 ) {
fprintf(fpo,"parser failed to find keyword: name ");
fprintf(fpo,"in the .cel file; instead found:%s\n", input);
fprintf(fpo,"cell:%d\n", cell );
exit(0);
}
test = fscanf( fp , "%s" , input ) ;
if( test != 1 ) {
fprintf(fpo,"parser failed to find pin name ");
fprintf(fpo,"in the .cel file\n");
fprintf(fpo,"cell:%d\n", cell );
exit(0);
}
test = fscanf( fp , " %d %d " , &xpos , &ypos );
if( test != 2 ) {
fprintf(fpo,"Failed to input coordinates for a pin\n");
fprintf(fpo,"cell:%d\n", cell );
exit(0);
}
} else if( strcmp( input , "softcell") == 0 ) {
test = fscanf( fp , "%d" , &cellnum ) ;
if( test != 1 ) {
fprintf(fpo,"Failed to input cell number \n");
fprintf(fpo,"in the .cel file; cell:%d\n", cell );
exit(0);
}
test = fscanf( fp , "%s" , input ) ;
if( test != 1 ) {
fprintf(fpo,"Failed to input keyword name \n");
fprintf(fpo,"in the .cel file; cell:%d\n", cell );
exit(0);
}
if( strcmp( input , "name" ) != 0 ) {
fprintf(fpo,"Failed to input keyword name \n");
fprintf(fpo,"in the .cel file; cell:%d\n", cell );
exit(0);
}
test = fscanf( fp , "%s" , input ) ;
if( test != 1 ) {
fprintf(fpo,"Failed to input cell name in the .cel file\n");
fprintf(fpo,"cell:%d\n", cell );
exit(0);
}
cell++ ;
code = 1 ;
test = fscanf( fp , " %d " , &ncorners ) ;
if( test != 1 ) {
fprintf(fpo,"Failed to input corners in the .cel file\n");
fprintf(fpo,"cell:%d\n", cell );
exit(0);
}
if( ncorners < 4 ) {
fprintf(fpo,"Failed to input at least 4 corners");
fprintf(fpo," in the .cel file; cell:%d\n", cell );
exit(0);
}
fscanf( fp , " %s " , input ) ;
if( strcmp( input , "corners") != 0 ) {
fprintf(fpo,"parser failed to find: corners ");
fprintf(fpo,"in the .cel file\n");
fprintf(fpo,"cell:%d\n", cell );
exit(0);
}
for( corner = 1 ; corner <= ncorners ; corner++ ) {
test = fscanf( fp , " %d %d " , &x , &y ) ;
if( test != 2 ) {
fprintf(fpo,"Failed to input corner coordinates\n");
fprintf(fpo,"in the .cel file; cell:%d\n", cell );
exit(0);
} else {
if( corner == 1 ) {
minx = x ;
miny = y ;
maxx = x ;
maxy = y ;
} else {
if( x < minx ) {
minx = x ;
}
if( x > maxx ) {
maxx = x ;
}
if( y < miny ) {
miny = y ;
}
if( y > maxy ) {
maxy = y ;
}
}
}
}
fscanf( fp , " %s " , input ) ;
if( strcmp( input , "asplb") == 0 ) {
test = fscanf( fp , "%lf" , &asplb ) ;
if( test != 1 ) {
fprintf(fpo,"Failed to input asplb in the .cel file\n");
fprintf(fpo,"cell:%d\n", cell );
exit(0);
}
} else {
fprintf(fpo,"parser failed to find: asplb ");
fprintf(fpo,"in the .cel file\n");
fprintf(fpo,"cell:%d\n", cell );
exit(0);
}
fscanf( fp , " %s " , input ) ;
if( strcmp( input , "aspub") == 0 ) {
test = fscanf( fp , "%lf" , &aspub ) ;
if( test != 1 ) {
fprintf(fpo,"Failed to input aspub in the .cel file\n");
fprintf(fpo,"cell:%d\n", cell );
exit(0);
}
} else {
fprintf(fpo,"parser failed to find: aspub ");
fprintf(fpo,"in the .cel file\n");
fprintf(fpo,"cell:%d\n", cell );
exit(0);
}
fscanf( fp , " %s " , input ) ;
if( strcmp( input , "class") != 0 ) {
fprintf(fpo,"parser failed to find: class ");
fprintf(fpo,"in the .cel file\n");
fprintf(fpo,"cell:%d\n", cell );
exit(0);
}
test = fscanf( fp , " %d " , &class ) ;
if( test != 1 ) {
fprintf(fpo,"Failed to input class in the .cel file\n");
fprintf(fpo,"cell:%d\n", cell );
exit(0);
}
test = fscanf( fp , " %d " , &norients ) ;
if( test != 1 ) {
fprintf(fpo,"Failed to input orientations in the .cel file\n");
fprintf(fpo,"cell:%d\n", cell );
exit(0);
}
if( norients < 1 || norients > 8 ) {
fprintf(fpo,"Failed to input orientations between 1 and ");
fprintf(fpo,"8 in the .cel file; cell:%d\n", cell );
exit(0);
}
fscanf( fp , " %s " , input ) ;
if( strcmp( input , "orientations") != 0 ) {
fprintf(fpo,"parser failed to find: orientations ");
fprintf(fpo,"in the .cel file\n");
fprintf(fpo,"cell:%d\n", cell );
exit(0);
}
for( orient = 1 ; orient <= norients ; orient++ ) {
test = fscanf( fp , " %d " , &x ) ;
if( test != 1 ) {
fprintf(fpo,"Failed to input expected orientations\n");
fprintf(fpo,"in the .cel file; cell:%d\n", cell );
exit(0);
}
}
code = 2 ;
} else if( strcmp( input , "sequence") == 0 ||
strcmp( input , "group") == 0 ) {
if( code != 2 ) {
fprintf(fpo,"parser unexpectedly found: sequence/group ");
fprintf(fpo,"in the .cel file\n");
fprintf(fpo,"cell:%d\n", cell );
exit(0);
}
test = fscanf( fp , " %d " , &sequence ) ;
if( test != 1 ) {
fprintf(fpo,"Failed to input a seq/group in .cel file\n");
fprintf(fpo,"cell:%d\n", cell );
exit(0);
}
for( i = 1 ; i <= sequence ; i++ ) {
fscanf( fp , " %s " , input ) ;
if( strcmp( input , "pin") == 0 ) {
test = fscanf( fp , "%s" , input ) ;
if( test != 1 ) {
fprintf(fpo,"parser did not find keyword: ");
fprintf(fpo,"name in the .cel file\n");
fprintf(fpo,"cell:%d\n", cell );
exit(0);
}
if( strcmp( input , "name" ) != 0 ) {
fprintf(fpo,"parser failed to find keyword: ");
fprintf(fpo,"name in the .cel file:");
fprintf(fpo," instead found:%s\n", input);
fprintf(fpo,"cell:%d\n", cell );
exit(0);
}
test = fscanf( fp , "%s" , input ) ;
if( test != 1 ) {
fprintf(fpo,"parser failed to find pin name ");
fprintf(fpo,"in the .cel file\n");
fprintf(fpo,"cell:%d\n", cell );
exit(0);
}
test = fscanf( fp , "%s" , input ) ;
if( test != 1 ) {
fprintf(fpo,"parser failed to find keyword: ");
fprintf(fpo,"signal in the .cel file\n");
fprintf(fpo,"cell:%d\n", cell );
exit(0);
}
if( strcmp( input , "signal" ) != 0 ) {
fprintf(fpo,"parser failed to find keyword: ");
fprintf(fpo,"signal in the .cel file;\n");
fprintf(fpo," instead found:%s\n", input);
fprintf(fpo,"cell:%d\n", cell );
exit(0);
}
test = fscanf( fp , "%s" , input ) ;
if( test != 1 ) {
fprintf(fpo,"parser failed to find signal ");
fprintf(fpo,"name in the .cel file\n");
fprintf(fpo,"cell:%d\n", cell );
exit(0);
}
} else {
fprintf(fpo,"parser failed to find: pin ");
fprintf(fpo,"in the .cel file\n");
fprintf(fpo,"cell:%d\n", cell );
exit(0);
}
}
fscanf( fp , " %s " , input ) ;
if( strcmp( input , "side.restriction") != 0 ) {
fprintf(fpo,"parser failed to find: side.restriction ");
fprintf(fpo,"in the .cel file\n");
fprintf(fpo,"cell:%d\n", cell );
exit(0);
}
test = fscanf( fp , " %d %d " , &firstside , &lastside ) ;
if( test != 2 ) {
fprintf(fpo,"Failed to input the 2 side.restriction \n");
fprintf(fpo,"sides in the .cel file; cell:%d\n", cell );
exit(0);
}
} else if( strcmp( input , "pad") == 0 ) {
test = fscanf( fp , "%d" , &cellnum ) ;
if( test != 1 ) {
fprintf(fpo,"Failed to input pad # in the .cel file\n");
fprintf(fpo,"pad:%d\n", cell );
exit(0);
}
test = fscanf( fp , "%s" , input ) ;
if( test != 1 ) {
fprintf(fpo,"Failed to input keyword name \n");
fprintf(fpo," in the .cel file; cell:%d\n", cell );
exit(0);
}
if( strcmp( input , "name" ) != 0 ) {
fprintf(fpo,"Failed to input keyword name \n");
fprintf(fpo,"in the .cel file; cell:%d\n", cell );
exit(0);
}
test = fscanf( fp , "%s" , input ) ;
if( test != 1 ) {
fprintf(fpo,"Failed to input cell name in the .cel file\n");
fprintf(fpo,"cell:%d\n", cell );
exit(0);
}
pad++ ;
code = 3 ;
test = fscanf( fp , " %d " , &ncorners ) ;
if( test != 1 ) {
fprintf(fpo,"Failed to input corners in the .cel file\n");
fprintf(fpo,"cell:%d\n", cell );
exit(0);
}
if( ncorners < 4 ) {
fprintf(fpo,"Failed to input at least 4 corners");
fprintf(fpo," in the .cel file; cell:%d\n", cell );
exit(0);
}
fscanf( fp , " %s " , input ) ;
if( strcmp( input , "corners") != 0 ) {
fprintf(fpo,"parser failed to find: corners ");
fprintf(fpo,"in the .cel file\n");
fprintf(fpo,"cell:%d\n", cell );
exit(0);
}
for( corner = 1 ; corner <= ncorners ; corner++ ) {
test = fscanf( fp , " %d %d " , &x , &y ) ;
if( test != 2 ) {
fprintf(fpo,"Failed to input corner coordinates\n");
fprintf(fpo,"in the .cel file; cell:%d\n", cell );
exit(0);
} else {
if( corner == 1 ) {
minx = x ;
miny = y ;
maxx = x ;
maxy = y ;
} else {
if( x < minx ) {
minx = x ;
}
if( x > maxx ) {
maxx = x ;
}
if( y < miny ) {
miny = y ;
}
if( y > maxy ) {
maxy = y ;
}
}
}
}
fscanf( fp , " %s " , input ) ;
if( strcmp( input , "padside") == 0 ) {
test = fscanf( fp , " %s " , input ) ;
if( test != 1 ) {
fprintf( fpo, "Failed to input padside ");
fprintf( fpo, "in the .cel file\n");
fprintf( fpo, "Current pad: %d\n", pad ) ;
exit(0);
}
} else {
fprintf( fpo, "Failed to find keyword padside ");
fprintf( fpo, "for a pad\n") ;
fprintf( fpo, "Current pad: %d\n", pad ) ;
exit(0) ;
}
fscanf( fp , " %s " , input ) ;
if( strcmp( input , "class") != 0 ) {
fprintf(fpo,"parser failed to find: class ");
fprintf(fpo,"in the .cel file\n");
fprintf(fpo,"cell:%d\n", cell );
exit(0);
}
test = fscanf( fp , " %d " , &class ) ;
if( test != 1 ) {
fprintf(fpo,"Failed to input class in the .cel file\n");
fprintf(fpo,"cell:%d\n", cell );
exit(0);
}
test = fscanf( fp , " %d " , &norients ) ;
if( test != 1 ) {
fprintf(fpo,"Failed to input orientations in the .cel file\n");
fprintf(fpo,"cell:%d\n", cell );
exit(0);
}
if( norients < 1 || norients > 8 ) {
fprintf(fpo,"Failed to input orientations between 1 and ");
fprintf(fpo,"8 in the .cel file; cell:%d\n", cell );
exit(0);
}
fscanf( fp , " %s " , input ) ;
if( strcmp( input , "orientations") != 0 ) {
fprintf(fpo,"parser failed to find: orientations ");
fprintf(fpo,"in the .cel file\n");
fprintf(fpo,"cell:%d\n", cell );
exit(0);
}
for( orient = 1 ; orient <= norients ; orient++ ) {
test = fscanf( fp , " %d " , &x ) ;
if( test != 1 ) {
fprintf(fpo,"Failed to input expected orientations\n");
fprintf(fpo,"in the .cel file; cell:%d\n", cell );
exit(0);
}
}
code = 4 ;
} else if( strcmp( input , "sidespace") == 0 ) {
test = fscanf( fp , " %d " , &space ) ;
} else {
fprintf(fpo,"found unparsable keyword ");
fprintf(fpo," %s " , input );
fprintf(fpo,"in the .cel file\n");
fprintf(fpo,"cell:%d\n", cell );
exit(0);
}
}
numcells = cell ;
numpads = pad ;
rewind( fp ) ;
makebins( numcells ) ;
cellarray = (CELLBOXPTR *) malloc( (5 + numcells + numpads) *
sizeof( CELLBOXPTR ) ) ;
for( cell = 1 ; cell <= numcells + numpads + 4 ; cell++ ) {
ptr = cellarray[ cell ] = ALLOC( CELLBOX ) ;
ptr->xcenter = 0 ;
ptr->ycenter = 0 ;
ptr->orient = 0 ;
ptr->numtiles = 0 ;
ptr->numterms = 0 ;
ptr->numsites = 0 ;
ptr->numgroups = 0 ;
ptr->softflag = 0 ;
ptr->padside = 0 ;
ptr->numUnComTerms = 0 ;
ptr->aspect = 1.0 ;
ptr->aspUB = 1.0 ;
ptr->aspLB = 1.0 ;
for( i = 0 ; i < 8 ; i++ ) {
ptr->config[ i ] = TILENULL ;
ptr->orientList[i] = 0 ;
}
}
padspace = (double *) malloc( (numpads + 1) * sizeof(double) ) ;
for( i = 1 ; i <= numpads ; i++ ) {
padspace[i] = 0.0 ;
}
fixLRBT = (int *) malloc( 4 * sizeof( int ) ) ;
fixLRBT[0] = 0 ;
fixLRBT[1] = 0 ;
fixLRBT[2] = 0 ;
fixLRBT[3] = 0 ;
return ;
}