Place pad ring, leaving a core area to meet a desired utilization.
Sets the position of pads that aren't already fixed.
Computes g_place_coreBounds and g_place_padBounds. Determines g_place_rowHeight.
31 {
32 int i, c, h, numRows;
33 float coreArea = 0, totalArea = 0;
34 int padCount = 0;
35 float area;
39 float nextPos;
40 int remainingPads, northPads, southPads, eastPads, westPads;
41
42 printf("PLAC-00 : Placing IO pads\n");;
43
44
47
53 } else {
54 coreArea += area;
56 }
57
65 padCells[padCount++] = cell;
66 }
67 totalArea += area;
68 }
69 if (!padType) {
70 printf("ERROR: No pad cells\n");
72 }
75
76 coreArea /= utilization;
77
78
84
86 if (padCount) {
87 printf("PLAC-05 : \tpreplacing %d pad cells\n", padCount);
92 }
93
94 printf("PLAC-05 : \tplaceable rows : %d\n", numRows);
95 printf("PLAC-05 : \tcore dimensions : %.0fx%.0f\n",
97 printf("PLAC-05 : \tchip dimensions : %.0fx%.0f\n",
99
100 remainingPads = padCount;
101 c = 0;
102
103
104 northPads = remainingPads/4; remainingPads -= northPads;
105 nextPos = 0;
106 for(i=0; i<northPads; i++) {
107 cell = padCells[c++];
111 }
112
113
114 southPads = remainingPads/3; remainingPads -= southPads;
115 nextPos = 0;
116 for(i=0; i<southPads; i++) {
117 cell = padCells[c++];
121 }
122
123
124 eastPads = remainingPads/2; remainingPads -= eastPads;
125 nextPos = 0;
126 for(i=0; i<eastPads; i++) {
127 cell = padCells[c++];
131 }
132
133
134 westPads = remainingPads;
135 nextPos = 0;
136 for(i=0; i<westPads; i++) {
137 cell = padCells[c++];
141 }
142
143}
ConcreteCell ** g_place_concreteCells
float getCellArea(const ConcreteCell *cell)
ABC_NAMESPACE_IMPL_START int g_place_numCells