blob: af14c0428cbef4845480195c9abd44e4116dc350 [file] [log] [blame]
#include "custom.h"
typedef struct kbox {
int cap ;
int HV ;
int sp ;
int x ;
int y ;
}
KBOX ,
*KBOXPTR ;
extern KBOXPTR kArray ;
double val1 , val2 ;
int Vside( int cell , int x , int yy1 , int yy2 , int flag )
{
double aspFactor , aspect , aspLB ;
int worstLen , pPinLocs , k , length , base ;
int TotSites ;
double siteSpace ;
length = ABS(yy2 - yy1) ;
aspect = cellarray[ cell ]->aspect ;
aspLB = cellarray[ cell ]->aspLB ;
if( aspLB + 0.01 > cellarray[ cell]->aspUB ) {
aspFactor = 1.0 ;
} else {
aspFactor = sqrt( aspLB / aspect ) ;
}
worstLen = (int) (aspFactor * (double) length) ;
if( (double)(worstLen + 1) / aspFactor - (double) length <
(double) length - (double) worstLen / aspFactor ) {
worstLen++ ;
}
pPinLocs = worstLen / pinSpacing - 1 ;
if( flag ) {
if( pPinLocs > MaxSites ) {
for( k = 1 ; k <= MaxSites ; k++ ) {
kArray[ k ].cap = 0 ;
kArray[ k ].HV = 0 ;
kArray[ k ].sp = 0 ;
kArray[ k ].x = 0 ;
kArray[ k ].y = 0 ;
}
base = pPinLocs / MaxSites ;
for( k = 1 ; k <= MaxSites ; k++ ) {
kArray[ k ].cap += base ;
}
for( k = 1 ; k <= pPinLocs % MaxSites ; k++ ) {
kArray[ k ].cap++ ;
}
} else { /* prepare pPinLocs sites */
for( k = 1 ; k <= pPinLocs ; k++ ) {
kArray[ k ].cap = 0 ;
kArray[ k ].HV = 0 ;
kArray[ k ].sp = 0 ;
kArray[ k ].x = 0 ;
kArray[ k ].y = 0 ;
}
for( k = 1 ; k <= pPinLocs ; k++ ) {
kArray[ k ].cap = 1 ;
}
}
}
/*
TotSites = minimum of ( MaxSites and pPinLocs )
*/
if( pPinLocs <= MaxSites ) {
TotSites = pPinLocs ;
} else {
TotSites = MaxSites ;
}
siteSpace = (double) length / (double) (TotSites + 1) ;
/*
Suppose we encountered coordinates yy1 and yy2 for a given
vertical side, and of course that the x-coordinate is simply x.
( yy1 < yy2 is required )
*/
if( flag ) {
if( yy2 > yy1 ) {
for( k = 1 ; k <= TotSites ; k++ ) {
kArray[ k ].x = x ;
val1 = (k + 1) * siteSpace ;
val2 = k * siteSpace ;
kArray[ k ].y = ROUND( val2 ) + yy1 ;
kArray[ k ].sp = ROUND( val1 ) - ROUND( val2 ) ;
kArray[ k ].HV = 1 ;
}
} else {
for( k = 1 ; k <= TotSites ; k++ ) {
kArray[ k ].x = x ;
val1 = (k + 1) * siteSpace ;
val2 = k * siteSpace ;
kArray[ k ].y = yy1 - ROUND( val2 ) ;
kArray[ k ].sp = ROUND( val1 ) - ROUND( val2 ) ;
kArray[ k ].HV = 1 ;
}
}
}
/*
*
* --- BIG NOTE ---
*
* Any fixed terminals intersecting a site cause the contents
* of that site to be incremented by one. This will inhibit
* sequences from passing on thru. ( try to remember to
* get the check pointer to reflect this fact )
*/
return( TotSites ) ;
}
int Hside( int cell , int xx1 , int xx2 , int y , int flag )
{
double aspFactor , aspect , aspUB ;
int worstLen , pPinLocs , k , length , base ;
int TotSites ;
double siteSpace ;
length = ABS(xx2 - xx1) ;
aspect = cellarray[ cell ]->aspect ;
aspUB = cellarray[ cell ]->aspUB ;
if( cellarray[ cell ]->aspLB + 0.01 > aspUB ) {
aspFactor = 1.0 ;
} else {
aspFactor = sqrt( aspect / aspUB ) ;
}
worstLen = (int) (aspFactor * (double) length) ;
if( (double)(worstLen + 1) / aspFactor - (double) length <
(double) length - (double) worstLen / aspFactor ) {
worstLen++ ;
}
pPinLocs = worstLen / pinSpacing - 1 ;
if( flag ) {
if( pPinLocs > MaxSites ) {
for( k = 1 ; k <= MaxSites ; k++ ) {
kArray[ k ].cap = 0 ;
kArray[ k ].HV = 0 ;
kArray[ k ].sp = 0 ;
kArray[ k ].x = 0 ;
kArray[ k ].y = 0 ;
}
base = pPinLocs / MaxSites ;
for( k = 1 ; k <= MaxSites ; k++ ) {
kArray[ k ].cap += base ;
}
for( k = 1 ; k <= pPinLocs % MaxSites ; k++ ) {
kArray[ k ].cap++ ;
}
} else { /* prepare pPinLocs sites */
for( k = 1 ; k <= pPinLocs ; k++ ) {
kArray[ k ].cap = 0 ;
kArray[ k ].HV = 0 ;
kArray[ k ].sp = 0 ;
kArray[ k ].x = 0 ;
kArray[ k ].y = 0 ;
}
for( k = 1 ; k <= pPinLocs ; k++ ) {
kArray[ k ].cap = 1 ;
}
}
}
/*
TotSites = minimum of ( MaxSites and pPinLocs )
*/
if( pPinLocs <= MaxSites ) {
TotSites = pPinLocs ;
} else {
TotSites = MaxSites ;
}
siteSpace = (double) length / (double) (TotSites + 1) ;
/*
Suppose we encountered coordinates xx1 and xx2 for a given
horizontal side, and of course that the y-coordinate is simply y.
*/
if( flag ) {
if( xx2 > xx1 ) {
for( k = 1 ; k <= TotSites ; k++ ) {
kArray[ k ].y = y ;
val1 = (k + 1) * siteSpace ;
val2 = k * siteSpace ;
kArray[ k ].x = ROUND( val2 ) + xx1 ;
kArray[ k ].sp = ROUND( val1 ) - ROUND( val2 ) ;
kArray[ k ].HV = 0 ;
}
} else {
for( k = 1 ; k <= TotSites ; k++ ) {
kArray[ k ].y = y ;
val1 = (k + 1) * siteSpace ;
val2 = k * siteSpace ;
kArray[ k ].x = xx1 - ROUND( val2 ) ;
kArray[ k ].sp = ROUND( val1 ) - ROUND( val2 ) ;
kArray[ k ].HV = 0 ;
}
}
}
/*
*
* --- BIG NOTE ---
*
* Any fixed terminals intersecting a site cause the contents
* of that site to be incremented by one. This will inhibit
* sequences from passing on thru. ( try to remember to
* get the check pointer to reflect this fact )
*/
return( TotSites ) ;
}