#include <plcompact.h>
Collaboration diagram for ShiftLegalizer:
Public Types | |
enum | AlgoType { NAIVE } |
Public Member Functions | |
ShiftLegalizer (const vector< double > &n_xloc, const vector< double > &n_yloc, const vector< double > &n_widths, const vector< double > &n_heights, double left_bound, double right_bound, double top_bound, double bottom_bound) | |
bool | legalizeAll (AlgoType algo, const vector< int > &checkBlks, vector< int > &badBlks) |
bool | naiveLegalize (const vector< int > &checkBlks, vector< int > &badBlks) |
bool | legalizeBlock (int currBlk) |
void | putBlockIntoCore (int currBlk) |
const vector< double > & | xloc () const |
const vector< double > & | yloc () const |
const vector< double > & | widths () const |
const vector< double > & | heights () const |
double | leftBound () const |
double | rightBound () const |
double | topBound () const |
double | bottomBound () const |
bool | shiftDecider (ShiftBlock::Directions currDir, const vector< ShiftBlock::ShiftInfo > &shiftinfo, ShiftRotateDecision &decision) const |
bool | rotateDecider (int currBlk, const vector< ShiftBlock::ShiftInfo > &shiftinfo, ShiftRotateDecision &decision) const |
Static Public Attributes | |
const double | INFTY = basepacking_h::Dimension::INFTY |
const int | UNDEFINED = basepacking_h::Dimension::UNDEFINED |
Private Member Functions | |
void | adjustBlock (int currBlk, const ShiftRotateDecision &decision) |
Private Attributes | |
int | _blocknum |
vector< double > | _xloc |
vector< double > | _yloc |
vector< double > | _widths |
vector< double > | _heights |
double | _epsilon |
const double | _leftBound |
const double | _rightBound |
const double | _topBound |
const double | _bottomBound |
|
Definition at line 98 of file plcompact.h.
00098 {NAIVE}; |
|
Definition at line 52 of file plcompact.cxx. References _blocknum, _epsilon, _heights, _widths, and basepacking_h::Dimension::EPSILON_ACCURACY.
00060 : _blocknum(n_xloc.size()), 00061 _xloc(n_xloc), 00062 _yloc(n_yloc), 00063 _widths(n_widths), 00064 _heights(n_heights), 00065 _epsilon(ShiftBlock::INFTY), 00066 _leftBound(left_bound), 00067 _rightBound(right_bound), 00068 _topBound(top_bound), 00069 _bottomBound(bottom_bound) 00070 { 00071 for (int i = 0; i < _blocknum; i++) 00072 _epsilon = min(_epsilon, min(_widths[i], _heights[i])); 00073 00074 _epsilon /= basepacking_h::Dimension::EPSILON_ACCURACY; 00075 } |
|
Definition at line 218 of file plcompact.cxx. References _heights, _widths, _xloc, _yloc, ShiftBlock::EAST, ShiftBlock::NORTH, ShiftLegalizer::ShiftRotateDecision::rotate, ShiftLegalizer::ShiftRotateDecision::shiftDir, ShiftLegalizer::ShiftRotateDecision::shiftExtent, ShiftBlock::SOUTH, and ShiftBlock::WEST. Referenced by legalizeBlock().
00220 { 00221 if (decision.rotate) 00222 swap(_widths[currBlk], _heights[currBlk]); 00223 00224 switch (decision.shiftDir) 00225 { 00226 case ShiftBlock::NORTH: 00227 _yloc[currBlk] += decision.shiftExtent; 00228 break; 00229 00230 case ShiftBlock::EAST: 00231 _xloc[currBlk] -= decision.shiftExtent; 00232 break; 00233 00234 case ShiftBlock::SOUTH: 00235 _yloc[currBlk] -= decision.shiftExtent; 00236 break; 00237 00238 case ShiftBlock::WEST: 00239 _xloc[currBlk] += decision.shiftExtent; 00240 break; 00241 00242 default: 00243 cout << "ERROR: invalid direction specified in moveblock()" 00244 << endl; 00245 exit(1); 00246 } 00247 } |
|
Definition at line 182 of file plcompact.h. References _bottomBound.
00183 { return _bottomBound; } |
|
Definition at line 170 of file plcompact.h. References _heights.
00171 { return _heights; } |
|
Definition at line 173 of file plcompact.h. References _leftBound.
00174 { return _leftBound; } |
|
Definition at line 77 of file plcompact.cxx. References NAIVE, and naiveLegalize().
00080 { 00081 switch (algo) 00082 { 00083 case NAIVE: 00084 return naiveLegalize(checkBlks, badBlks); 00085 00086 default: 00087 cout << "ERROR: invalid algo specified in ShiftLegalizer::legalizeAll()" 00088 << endl; 00089 exit(1); 00090 break; 00091 } 00092 } |
Here is the call graph for this function:
|
Definition at line 113 of file plcompact.cxx. References _bottomBound, _epsilon, _heights, _leftBound, _rightBound, _topBound, _widths, _xloc, _yloc, adjustBlock(), ShiftBlock::DIR_NUM, ShiftBlock::Directions, ShiftBlock::EAST, ShiftLegalizer::ShiftRotateDecision::rotate, shiftDecider(), ShiftLegalizer::ShiftRotateDecision::shiftDir, ShiftLegalizer::ShiftRotateDecision::shiftExtent, and UNDEFINED. Referenced by naiveLegalize().
00114 { 00115 printf("-----Block %d-----\n", currBlk); 00116 00117 // move only if it resolves ALL overlaps 00118 ShiftBlock shift_block(_xloc, _yloc, _widths, _heights, 00119 _leftBound, _rightBound, 00120 _topBound, _bottomBound); 00121 vector<ShiftBlock::ShiftInfo> shiftinfo; 00122 shift_block(currBlk, shiftinfo); 00123 00124 bool existsOverlaps = false; 00125 bool success = false; // only makes sense when "existsOverlaps" 00126 ShiftRotateDecision decision; // initialized 00127 for (int i = 0; i < ShiftBlock::DIR_NUM; i++) 00128 { 00129 // if overlap occurs 00130 if (fabs(shiftinfo[i].shiftRangeMin) > _epsilon) 00131 { 00132 bool tempSuccess = shiftDecider(ShiftBlock::Directions(i), 00133 shiftinfo, decision); 00134 00135 decision.rotate = false; 00136 success = success || tempSuccess; 00137 existsOverlaps = true; 00138 } 00139 } 00140 00141 // -----try rotating the block if no move works so far----- 00142 if (existsOverlaps && !success) 00143 { 00144 // temporarily change the info 00145 swap(_widths[currBlk], _heights[currBlk]); 00146 double orig_xloc = _xloc[currBlk]; 00147 double orig_yloc = _yloc[currBlk]; 00148 00149 // apply the same procedures to find moves 00150 ShiftBlock shift_block_rotated(_xloc, _yloc, _widths, _heights, 00151 _leftBound, _rightBound, 00152 _topBound, _bottomBound); 00153 vector<ShiftBlock::ShiftInfo> shiftinfo_rotated; 00154 shift_block_rotated(currBlk, shiftinfo_rotated); 00155 00156 existsOverlaps = false; 00157 for (int i = 0; i < ShiftBlock::DIR_NUM; i++) 00158 { 00159 // if overlap occurs 00160 if (fabs(shiftinfo_rotated[i].shiftRangeMin) > _epsilon) 00161 { 00162 bool tempSuccess = shiftDecider(ShiftBlock::Directions(i), 00163 shiftinfo_rotated, decision); 00164 00165 decision.rotate = true; 00166 success = success || tempSuccess; 00167 existsOverlaps = true; 00168 } 00169 } 00170 00171 // special case when "rotating" helps already 00172 if (!existsOverlaps) 00173 { 00174 decision.rotate = true; 00175 decision.shiftDir = ShiftBlock::EAST; 00176 decision.shiftExtent = 0; 00177 00178 success = true; 00179 } 00180 00181 // restore the global details even when succeed 00182 swap(_widths[currBlk], _heights[currBlk]); 00183 _xloc[currBlk] = orig_xloc; 00184 _yloc[currBlk] = orig_yloc; 00185 } 00186 00187 // move towards the direction that needs least fix 00188 if (decision.shiftDir != UNDEFINED) 00189 { 00190 adjustBlock(currBlk, decision); 00191 return true; 00192 } 00193 else if (!existsOverlaps) 00194 return true; 00195 else 00196 return false; 00197 } |
Here is the call graph for this function:
|
Definition at line 94 of file plcompact.cxx. References legalizeBlock(), and putBlockIntoCore(). Referenced by legalizeAll().
00096 { 00097 int checkBlkNum = checkBlks.size(); 00098 bool success = true; 00099 00100 for (int i = 0; i < checkBlkNum; i++) 00101 putBlockIntoCore(i); 00102 00103 for (int i = 0; i < checkBlkNum; i++) 00104 { 00105 bool thisSuccess = legalizeBlock(checkBlks[i]); 00106 if (!thisSuccess) 00107 badBlks.push_back(checkBlks[i]); 00108 success = success && thisSuccess; 00109 } 00110 return success; 00111 } |
Here is the call graph for this function:
|
Definition at line 249 of file plcompact.cxx. References _bottomBound, _heights, _leftBound, _rightBound, _topBound, _widths, _xloc, and _yloc. Referenced by naiveLegalize().
|
|
Definition at line 176 of file plcompact.h. References _rightBound.
00177 { return _rightBound; } |
|
|
|
Definition at line 199 of file plcompact.cxx. References _epsilon, ShiftLegalizer::ShiftRotateDecision::shiftDir, and ShiftLegalizer::ShiftRotateDecision::shiftExtent. Referenced by legalizeBlock().
00203 { 00204 if (shiftinfo[currDir].shiftRangeMin < 00205 shiftinfo[currDir].shiftRangeMax + _epsilon) 00206 { 00207 if (shiftinfo[currDir].shiftRangeMin < decision.shiftExtent) 00208 { 00209 decision.shiftDir = currDir; 00210 decision.shiftExtent = shiftinfo[currDir].shiftRangeMin; 00211 } 00212 return true; 00213 } 00214 else 00215 return false; // "f" ==> exists unresolvable overlap (not converse) 00216 } |
|
Definition at line 179 of file plcompact.h. References _topBound.
00180 { return _topBound; } |
|
Definition at line 167 of file plcompact.h. References _widths.
00168 { return _widths; } |
|
Definition at line 161 of file plcompact.h. References _xloc.
00162 { return _xloc; } |
|
Definition at line 164 of file plcompact.h. References _yloc.
00165 { return _yloc; } |
|
Definition at line 140 of file plcompact.h. Referenced by ShiftLegalizer(). |
|
Definition at line 150 of file plcompact.h. Referenced by bottomBound(), legalizeBlock(), and putBlockIntoCore(). |
|
Definition at line 145 of file plcompact.h. Referenced by legalizeBlock(), shiftDecider(), and ShiftLegalizer(). |
|
Definition at line 144 of file plcompact.h. Referenced by adjustBlock(), heights(), legalizeBlock(), putBlockIntoCore(), and ShiftLegalizer(). |
|
Definition at line 147 of file plcompact.h. Referenced by leftBound(), legalizeBlock(), and putBlockIntoCore(). |
|
Definition at line 148 of file plcompact.h. Referenced by legalizeBlock(), putBlockIntoCore(), and rightBound(). |
|
Definition at line 149 of file plcompact.h. Referenced by legalizeBlock(), putBlockIntoCore(), and topBound(). |
|
Definition at line 143 of file plcompact.h. Referenced by adjustBlock(), legalizeBlock(), putBlockIntoCore(), ShiftLegalizer(), and widths(). |
|
Definition at line 141 of file plcompact.h. Referenced by adjustBlock(), legalizeBlock(), putBlockIntoCore(), and xloc(). |
|
Definition at line 142 of file plcompact.h. Referenced by adjustBlock(), legalizeBlock(), putBlockIntoCore(), and yloc(). |
|
Definition at line 45 of file plcompact.cxx. |
|
Definition at line 46 of file plcompact.cxx. Referenced by legalizeBlock(). |