/300.twolf/changrid.c

https://gitlab.com/vmakarov/ml-gcc · C · 171 lines · 159 code · 12 blank · 0 comment · 40 complexity · d203a212093668c663b7374a9b7d1352 MD5 · raw file

  1. #include "standard.h"
  2. #include "groute.h"
  3. changrid( )
  4. {
  5. CHANGRDPTR **gdptr , grdptr , cgdptr , ngdptr ;
  6. NBOXPTR netptr ;
  7. int row , net , channel , terminal ;
  8. int *numPins , *PinInChan ;
  9. int count , i ;
  10. numPins = (int *)safe_calloc( sizeof( int ) , numChans+1 ) ;
  11. PinInChan = (int *)safe_calloc( sizeof( int ) , numChans+1 ) ;
  12. for( net = 1 ; net <= numnets ; net++ ) {
  13. for( netptr = netarray[net]->netptr ; netptr != NETNULL ;
  14. netptr = netptr->nterm ) {
  15. if( (int) netptr->pinloc == -1 ) {
  16. numPins[ netptr->row ]++ ;
  17. } else if( netptr->pinloc == 1 ) {
  18. numPins[ netptr->row + 1 ]++ ;
  19. } else { /* pinloc == 0 pin on pads or macros */
  20. if( netptr->row > 0 ) {
  21. numPins[ netptr->row ]++ ;
  22. }
  23. if( netptr->row < numChans ) {
  24. numPins[ netptr->row + 1 ]++ ;
  25. }
  26. }
  27. }
  28. }
  29. gdptr = (CHANGRDPTR **)safe_malloc( (numChans+1) *
  30. sizeof( CHANGRDPTR *) ) ;
  31. for( channel = 1 ; channel <= numChans ; channel++ ) {
  32. gdptr[channel] = ( CHANGRDPTR * )safe_malloc(
  33. ( numPins[channel] + 1 ) * sizeof( CHANGRDPTR ) ) ;
  34. }
  35. Tgrid = ( TGRIDPTR * )safe_malloc( ( maxterm + 2*numChans + 1 )
  36. * sizeof( TGRIDPTR ) ) ;
  37. for( terminal = 1 ; terminal <= maxterm + 2*numChans ; terminal++ ) {
  38. Tgrid[ terminal ] = ( TGRIDPTR )safe_malloc( sizeof(TGRIDBOX) ) ;
  39. }
  40. for( net = 1 ; net <= numnets ; net++ ) {
  41. for( netptr = netarray[net]->netptr ; netptr != NETNULL ;
  42. netptr = netptr->nterm ) {
  43. row = netptr->row ;
  44. terminal = netptr->terminal ;
  45. grdptr = ( CHANGRDPTR )safe_malloc( sizeof( CHANGRDBOX ) ) ;
  46. if( (int) netptr->pinloc == -1 ) {
  47. channel = row ;
  48. count = ++(PinInChan[ channel ]) ;
  49. gdptr[ channel ][ count ] = grdptr ;
  50. Tgrid[ terminal ]->up = grdptr ;
  51. Tgrid[ terminal ]->down = grdptr ;
  52. grdptr->netptr = tearray[ terminal ] ;
  53. grdptr->tracks = 0 ;
  54. grdptr->SegType = 0 ;
  55. } else if( netptr->pinloc == 1 ) {
  56. channel = row + 1 ;
  57. count = ++(PinInChan[ channel ]) ;
  58. gdptr[ channel ][ count ] = grdptr ;
  59. Tgrid[ terminal ]->up = grdptr ;
  60. Tgrid[ terminal ]->down = grdptr ;
  61. grdptr->netptr = tearray[ terminal ] ;
  62. grdptr->tracks = 0 ;
  63. grdptr->SegType = 0 ;
  64. } else { /* pinloc == 0 pin on pads or macros */
  65. if( 1 <= row && row <= numChans - 1 ) {
  66. channel = row ;
  67. count = ++(PinInChan[ channel ]) ;
  68. gdptr[ channel ][ count ] = grdptr ;
  69. Tgrid[ terminal ]->down = grdptr ;
  70. grdptr->netptr = tearray[ terminal ] ;
  71. grdptr->tracks = 0 ;
  72. grdptr->SegType = 0 ;
  73. channel = row + 1 ;
  74. count = ++(PinInChan[ channel ]) ;
  75. grdptr = gdptr[ channel ][ count ] =
  76. ( CHANGRDPTR )safe_malloc( sizeof( CHANGRDBOX ) ) ;
  77. Tgrid[ terminal ]->up = grdptr ;
  78. grdptr->netptr = tearray[ terminal ] ;
  79. grdptr->tracks = 0 ;
  80. grdptr->SegType = 0 ;
  81. } else if( row == 0 ) {
  82. count = ++(PinInChan[ 1 ]) ;
  83. gdptr[ 1 ][ count ] = grdptr ;
  84. Tgrid[ terminal ]->up = grdptr ;
  85. Tgrid[ terminal ]->down = grdptr ;
  86. grdptr->netptr = tearray[ terminal ] ;
  87. grdptr->tracks = 0 ;
  88. grdptr->SegType = 0 ;
  89. } else { /* row == numChans */
  90. count = ++(PinInChan[ numChans ]) ;
  91. gdptr[ numChans ][ count ] = grdptr ;
  92. Tgrid[ terminal ]->up = grdptr ;
  93. Tgrid[ terminal ]->down = grdptr ;
  94. grdptr->netptr = tearray[ terminal ] ;
  95. grdptr->tracks = 0 ;
  96. grdptr->SegType = 0 ;
  97. }
  98. }
  99. }
  100. }
  101. for( channel = 1 ; channel <= numChans ; channel++ ) {
  102. qsortgdx( (char *) ( gdptr[channel] + 1 ) , numPins[channel] ,
  103. sizeof( CHANGRDPTR ) ) ;
  104. }
  105. Begin = ( CHANGRDPTR * )safe_malloc( (numChans+1)
  106. * sizeof( CHANGRDPTR ) ) ;
  107. End = ( CHANGRDPTR * )safe_malloc( (numChans+1)
  108. * sizeof( CHANGRDPTR ) ) ;
  109. for( channel = 1 ; channel <= numChans ; channel++ ) {
  110. Begin[channel] = ( CHANGRDPTR )safe_calloc( sizeof(CHANGRDBOX) ,1 );
  111. Begin[channel]->netptr = ( NBOXPTR )safe_calloc( sizeof(NBOX) , 1);
  112. Begin[channel]->netptr->xpos = gxstart - 1 ;
  113. Begin[channel]->netptr->terminal = maxterm + channel ;
  114. Begin[channel]->netptr->row = channel ;
  115. Begin[channel]->netptr->pinloc = -1 ;
  116. tearray[maxterm + channel] = Begin[channel]->netptr ;
  117. End[channel] = ( CHANGRDPTR )safe_calloc( sizeof(CHANGRDBOX) , 1 ) ;
  118. End[channel]->netptr = ( NBOXPTR )safe_calloc( sizeof(NBOX) , 1);
  119. End[channel]->netptr->xpos = gxstop + 1 ;
  120. End[channel]->netptr->terminal = maxterm + numChans + channel ;
  121. End[channel]->netptr->row = channel ;
  122. End[channel]->netptr->pinloc = -1 ;
  123. tearray[maxterm + numChans + channel] = End[channel]->netptr ;
  124. }
  125. for( channel = 1 ; channel <= numChans ; channel++ ) {
  126. Tgrid[ maxterm + channel ]->up = Begin[ channel ] ;
  127. Tgrid[ maxterm + channel ]->down = Begin[ channel ] ;
  128. Tgrid[ maxterm + numChans + channel ]->up = End[ channel ] ;
  129. Tgrid[ maxterm + numChans + channel ]->down = End[ channel ] ;
  130. }
  131. for( channel = 1 ; channel <= numChans ; channel++ ) {
  132. if( numPins[channel] == 0 ) {
  133. Begin[channel]->nextgrd = NULL ;
  134. End[channel]->prevgrd = NULL ;
  135. } else if( numPins[channel] == 1 ) {
  136. Begin[channel]->nextgrd = gdptr[channel][1] ;
  137. gdptr[channel][1]->prevgrd = Begin[channel] ;
  138. End[channel]->prevgrd = gdptr[channel][1] ;
  139. gdptr[channel][1]->nextgrd = End[channel] ;
  140. } else {
  141. Begin[channel]->nextgrd = gdptr[channel][1] ;
  142. gdptr[channel][1]->prevgrd = Begin[channel] ;
  143. for( i = 1 ; i <= numPins[channel]-1 ; i++ ) {
  144. cgdptr = gdptr[channel][i] ;
  145. ngdptr = gdptr[channel][i+1] ;
  146. cgdptr->nextgrd = ngdptr ;
  147. ngdptr->prevgrd = cgdptr ;
  148. }
  149. ngdptr->nextgrd = End[channel] ;
  150. End[channel]->prevgrd = ngdptr ;
  151. }
  152. }
  153. for( channel = 1 ; channel <= numChans ; channel++ ) {
  154. safe_free( gdptr[ channel ] ) ;
  155. }
  156. safe_free( gdptr ) ;
  157. safe_cfree( numPins ) ;
  158. safe_cfree( PinInChan ) ;
  159. }