blob: eba53b9d4647b880c1b05893963c38669af25ee9 [file] [log] [blame]
#include "custom.h"
extern void move( int moveType );
extern void rect( int *l , int *b , int *r , int *t );
extern void point( int *x , int *y );
extern void loadbins(int new);
void savewolf(void)
{
FILE *fp ;
char filename[1024] ;
int cell , terminal ;
CELLBOXPTR cellptr ;
sprintf( filename , "%s.sav", cktName ) ;
fp = fopen( filename , "w" ) ;
for( cell = 1 ; cell <= numcells ; cell++ ) {
cellptr = cellarray[ cell ] ;
fprintf( fp , "%d %d %d %d\n", cell , cellptr->orient ,
cellptr->xcenter , cellptr->ycenter ) ;
for( terminal = 1 ; terminal <= cellptr->numUnComTerms ;
terminal++ ) {
fprintf( fp , " %d ", cellptr->unComTerms[ terminal ].
site );
if( terminal == cellptr->numUnComTerms ) {
fprintf( fp , " %lf\n" , cellptr->aspect );
}
}
}
fclose( fp ) ;
return ;
}
void TW_oldinput( FILE *fp )
{
int i , cell , orient , tm , site , terminal , height , length ;
int xcenter , ycenter , xpos , ypos , x , y ;
int oleft , oright , obottom , otop , Hdiv2 , Wdiv2 , aorient ;
double aspect , aspFactor , val ;
int tilenum , termnum ;
CELLBOXPTR ptr ;
LOCBOX *SLptr , *siteptr , *siteptr0 ;
TILEBOXPTR atileptr , tileptr1 , tptr , tptr0 ;
TERMBOXPTR term , atermptr , termptr , tmptr0 , tmptr1 ;
TERMNETSPTR teptr ;
while( fscanf( fp , " %d %d %d %d ", &cell , &orient ,
&xcenter , &ycenter ) == 4 ) {
ptr = cellarray[ cell ] ;
ptr->orient = orient ;
ptr->xcenter = xcenter ;
ptr->ycenter = ycenter ;
aorient = orient ;
for( terminal = 1; terminal <= ptr->numUnComTerms; terminal++ ){
if( terminal == 1 ) {
for( i = 1 ; i <= ptr->numsites ; i++ ) {
ptr->siteContent[ i ].contents = 0 ;
}
}
fscanf( fp , " %d ", &site ) ;
ptr->unComTerms[ terminal ].site = site ;
++ptr->siteContent[ site ].contents ;
if( terminal == ptr->numUnComTerms ) {
fscanf( fp , "%lf" , &aspect ) ;
ptr->aspect = aspect ;
}
}
if( ptr->softflag == 1 && ptr->aspUB > 0.01 + ptr->aspLB ) {
atileptr = ptr->config[ aorient ] ;
atermptr = atileptr->termptr ;
oleft = atileptr->oleft ;
oright = atileptr->oright ;
obottom = atileptr->obottom ;
otop = atileptr->otop ;
SLptr = atileptr->siteLocArray ;
if( aorient <= 3 ) {
aspFactor = sqrt( aspect / ptr->aspectO ) ;
} else {
aspFactor = sqrt( ptr->aspectO / aspect ) ;
}
val = (double)(otop - obottom) * aspFactor ;
Hdiv2 = ROUND( val ) / 2 ;
val = (double)(oright - oleft) / aspFactor ;
Wdiv2 = ROUND( val ) / 2 ;
/*
* Time to compute the new coordinates for the cell
* since its aspect ratio has changed. Do it for
* the orient 0 version and then use the routines
* from readcells() to transfer for other orients.
*/
for( tileptr1 = atileptr ; tileptr1 != TILENULL ;
tileptr1 = tileptr1->nexttile ){
val = (double)(tileptr1->oleft - oleft) / aspFactor ;
tileptr1->left = ROUND( val ) - Wdiv2 ;
val = (double)(tileptr1->oright - oleft) / aspFactor ;
tileptr1->right = ROUND( val ) - Wdiv2 ;
val = (double)(tileptr1->obottom - obottom) * aspFactor;
tileptr1->bottom = ROUND( val ) - Hdiv2 ;
val = (double)(tileptr1->otop - obottom) * aspFactor ;
tileptr1->top = ROUND( val ) - Hdiv2 ;
}
for( termptr = atermptr ; termptr != TERMNULL ; termptr =
termptr->nextterm ) {
val = (double)(termptr->oxpos - oleft) / aspFactor ;
termptr->xpos = ROUND( val ) - Wdiv2 ;
val = (double)(termptr->oypos - obottom) * aspFactor ;
termptr->ypos = ROUND( val ) - Hdiv2 ;
}
for( site = 1 ; site <= ptr->numsites ; site++ ) {
val = (double)(SLptr[ site ].oxpos - oleft) / aspFactor ;
SLptr[site].xpos = ROUND( val ) - Wdiv2 ;
val = (double)(SLptr[site].oypos - obottom) * aspFactor ;
SLptr[site].ypos = ROUND( val ) - Hdiv2 ;
}
/*
NOW WE HAVE TO LOAD IN THE OTHER CONFIGURATIONS
*/
if( aorient != 0 ) {
height = atileptr->top - atileptr->bottom ;
length = atileptr->right - atileptr->left ;
switch( aorient ) {
case 1 : orient = 1 ;
break ;
case 2 : orient = 2 ;
break ;
case 3 : orient = 3 ;
break ;
case 4 : orient = 4 ;
break ;
case 5 : orient = 5 ;
break ;
case 6 : orient = 7 ;
break ;
case 7 : orient = 6 ;
break ;
}
tptr0 = ptr->config[ 0 ] ;
tptr = atileptr ;
tptr0->left = tptr->left ;
tptr0->right = tptr->right ;
tptr0->bottom = tptr->bottom ;
tptr0->top = tptr->top ;
move( orient ) ;
rect( &tptr0->left, &tptr0->bottom, &tptr0->right ,
&tptr0->top ) ;
if( (height % 2 != 0 && (orient == 4 ||
orient == 6))||
(length % 2 != 0 && (orient == 2 ||
orient == 3))){
tptr0->left++ ;
tptr0->right++ ;
}
if( (height % 2 != 0 && (orient == 1 ||
orient == 3))||
(length % 2 != 0 && (orient == 4 ||
orient == 7))){
tptr0->bottom++ ;
tptr0->top++ ;
}
for( tilenum = 1 ; tilenum <= ptr->numtiles ;
tilenum++ ) {
tptr0 = tptr0->nexttile ;
tptr = tptr->nexttile ;
tptr0->left = tptr->left ;
tptr0->right = tptr->right ;
tptr0->bottom = tptr->bottom ;
tptr0->top = tptr->top ;
move( orient ) ;
rect( &tptr0->left,&tptr0->bottom,&tptr0->right,
&tptr0->top ) ;
if( (height % 2 != 0 && (orient == 4 ||
orient == 6))||
(length % 2 != 0 && (orient == 2 ||
orient == 3))){
tptr0->left++ ;
tptr0->right++ ;
}
if( (height % 2 != 0 && (orient == 1 ||
orient == 3))||
(length % 2 != 0 && (orient == 4 ||
orient == 7))){
tptr0->bottom++ ;
tptr0->top++ ;
}
}
/* And NOW for the fixed terminals */
if( ptr->numterms != 0 ) {
tmptr0 = ptr->config[ 0 ]->termptr ;
tmptr1 = atermptr ;
tmptr0->xpos = tmptr1->xpos ;
tmptr0->ypos = tmptr1->ypos ;
move( orient ) ;
point( &tmptr0->xpos , &tmptr0->ypos ) ;
if( (height % 2 != 0 && (orient == 4 ||
orient == 6))||
(length % 2 != 0 && (orient == 2 ||
orient == 3))){
tmptr0->xpos++ ;
}
if( (height % 2 != 0 && (orient == 1 ||
orient == 3))||
(length % 2 != 0 && (orient == 4 ||
orient == 7))){
tmptr0->ypos++ ;
}
for( termnum = 2 ; termnum <= ptr->numterms ;
termnum++ ) {
tmptr0 = tmptr0->nextterm ;
tmptr1 = tmptr1->nextterm ;
tmptr0->xpos = tmptr1->xpos ;
tmptr0->ypos = tmptr1->ypos ;
move( orient ) ;
point( &tmptr0->xpos , &tmptr0->ypos ) ;
if( (height % 2 != 0 && (orient == 4 ||
orient == 6))||
(length % 2 != 0 && (orient == 2 ||
orient == 3))){
tmptr0->xpos++ ;
}
if( (height % 2 != 0 && (orient == 1 ||
orient == 3))||
(length % 2 != 0 && (orient == 4 ||
orient == 7))){
tmptr0->ypos++ ;
}
}
}
/* Now the sites for the soft cells */
if( ptr->numsites != 0 ) {
siteptr0 = ptr->config[ 0 ]->siteLocArray ;
siteptr = SLptr ;
for( site = 1 ; site <= ptr->numsites; site++ ){
siteptr0[ site ].xpos = siteptr[site].xpos ;
siteptr0[ site ].ypos = siteptr[site].ypos ;
move( orient ) ;
point( &(siteptr0[ site ].xpos) ,
&(siteptr0[ site ].ypos) );
if( (height % 2 != 0 && (orient == 4 ||
orient == 6))||
(length % 2 != 0 && (orient == 2 ||
orient == 3))){
siteptr0[ site ].xpos++ ;
}
if( (height % 2 != 0 && (orient == 1 ||
orient == 3))||
(length % 2 != 0 && (orient == 4 ||
orient == 7))){
siteptr0[ site ].ypos++ ;
}
}
}
}
/* ************************************************** */
height = ptr->config[0]->top - ptr->config[0]->bottom ;
length = ptr->config[0]->right - ptr->config[0]->left ;
for( orient = 1 ; orient <= 7 ; orient++ ) {
if( orient == aorient ) {
continue ;
}
tptr0 = ptr->config[ 0 ] ;
tptr = ptr->config[ orient ] ;
tptr->left = tptr0->left ;
tptr->right = tptr0->right ;
tptr->bottom = tptr0->bottom ;
tptr->top = tptr0->top ;
move( orient ) ;
rect( &tptr->left , &tptr->bottom , &tptr->right ,
&tptr->top ) ;
if( (height % 2 != 0 && (orient == 4 ||
orient == 6))||
(length % 2 != 0 && (orient == 2 ||
orient == 3))){
tptr->left++ ;
tptr->right++ ;
}
if( (height % 2 != 0 && (orient == 1 ||
orient == 3))||
(length % 2 != 0 && (orient == 4 ||
orient == 7))){
tptr->bottom++ ;
tptr->top++ ;
}
for( tilenum = 1 ; tilenum <= ptr->numtiles ;
tilenum++ ) {
tptr0 = tptr0->nexttile ;
tptr = tptr->nexttile ;
tptr->left = tptr0->left ;
tptr->right = tptr0->right ;
tptr->bottom = tptr0->bottom ;
tptr->top = tptr0->top ;
move( orient ) ;
rect( &tptr->left, &tptr->bottom, &tptr->right ,
&tptr->top ) ;
if( (height % 2 != 0 && (orient == 4 ||
orient == 6))||
(length % 2 != 0 && (orient == 2 ||
orient == 3))){
tptr->left++ ;
tptr->right++ ;
}
if( (height % 2 != 0 && (orient == 1 ||
orient == 3))||
(length % 2 != 0 && (orient == 4 ||
orient == 7))){
tptr->bottom++ ;
tptr->top++ ;
}
}
}
/* And NOW for the fixed terminals */
if( ptr->numterms != 0 ) {
for( orient = 1 ; orient <= 7 ; orient++ ) {
if( orient == aorient ) {
continue ;
}
tmptr0 = ptr->config[ 0 ]->termptr ;
tmptr1 = ptr->config[ orient ]->termptr ;
tmptr1->xpos = tmptr0->xpos ;
tmptr1->ypos = tmptr0->ypos ;
move( orient ) ;
point( &tmptr1->xpos , &tmptr1->ypos ) ;
if( (height % 2 != 0 && (orient == 4 ||
orient == 6))||
(length % 2 != 0 && (orient == 2 ||
orient == 3))){
tmptr1->xpos++ ;
}
if( (height % 2 != 0 && (orient == 1 ||
orient == 3))||
(length % 2 != 0 && (orient == 4 ||
orient == 7))){
tmptr1->ypos++ ;
}
for( termnum = 2 ; termnum <= ptr->numterms ;
termnum++ ) {
tmptr0 = tmptr0->nextterm ;
tmptr1 = tmptr1->nextterm ;
tmptr1->xpos = tmptr0->xpos ;
tmptr1->ypos = tmptr0->ypos ;
move( orient ) ;
point( &tmptr1->xpos , &tmptr1->ypos ) ;
if( (height % 2 != 0 && (orient == 4 ||
orient == 6))||
(length % 2 != 0 && (orient == 2 ||
orient == 3))){
tmptr1->xpos++ ;
}
if( (height % 2 != 0 && (orient == 1 ||
orient == 3))||
(length % 2 != 0 && (orient == 4 ||
orient == 7))){
tmptr1->ypos++ ;
}
}
}
}
/* Now the sites for the soft cells */
if( ptr->numsites != 0 ) {
siteptr0 = ptr->config[ 0 ]->siteLocArray ;
for( orient = 1 ; orient <= 7 ; orient++ ) {
if( orient == aorient ) {
continue ;
}
siteptr = ptr->config[ orient ]->siteLocArray ;
for( site = 1; site <= ptr->numsites; site++ ) {
siteptr[ site ].xpos = siteptr0[site].xpos ;
siteptr[ site ].ypos = siteptr0[site].ypos ;
move( orient ) ;
point( &(siteptr[ site ].xpos) ,
&(siteptr[ site ].ypos) );
if( (height % 2 != 0 && (orient == 4 ||
orient == 6))||
(length % 2 != 0 && (orient == 2 ||
orient == 3))){
siteptr[ site ].xpos++ ;
}
if( (height % 2 != 0 && (orient == 1 ||
orient == 3))||
(length % 2 != 0 && (orient == 4 ||
orient == 7))){
siteptr[ site ].ypos++ ;
}
}
}
}
}
for( term = ptr->config[ aorient ]->termptr ;
term != TERMNULL ; term = term->nextterm ) {
xpos = term->xpos ;
ypos = term->ypos ;
teptr = termarray[ term->terminal ] ;
teptr->termptr->xpos = xpos + xcenter ;
teptr->termptr->ypos = ypos + ycenter ;
}
for( tm = 1 ; tm <= ptr->numUnComTerms ; tm++ ) {
terminal = ptr->unComTerms[ tm ].terminal ;
site = ptr->unComTerms[ tm ].site ;
x = ptr->config[ aorient ]->siteLocArray[ site ].xpos ;
y = ptr->config[ aorient ]->siteLocArray[ site ].ypos ;
teptr = termarray[ terminal ] ;
teptr->termptr->xpos = x + xcenter ;
teptr->termptr->ypos = y + ycenter ;
}
loadbins(0) ;
}
return ;
}