Untitled
unknown
plain_text
2 years ago
10 kB
12
Indexable
void legalize() //yu--modified(0824)
{
Cell_in_top.clear();
Cell_in_bottom.clear();
for (int i = 0; i < Instance_cnt; i++)
{
if (partition_map[i] == 0)
Cell_in_top.push_back(i);
else if (partition_map[i] == 1)
Cell_in_bottom.push_back(i);
}
//create size_array
struct s{
bool operator() (const pair<int,int> &a, const pair<int,int> &b)
{
return (a.second > b.second); //descending order
}
}sortbysize;
vector<pair<int, int>> top_size_array;// [inst_num][size]
vector<pair<int , int>> bot_size_array;
vector<pair<int, int>> top_size_array_macro;// [inst_num][size]
vector<pair<int, int>> bot_size_array_macro;
top_size_array.resize(Cell_in_top.size(), make_pair(-1, -1));
bot_size_array.resize(Cell_in_bottom.size(), make_pair(-1, -1));
for(int i=0; i<top_size_array.size(); i++){
top_size_array[i].first = Cell_in_top[i];
top_size_array[i].second = LibCellSize[top][Lib_for_Inst[Cell_in_top[i]]];
if(LibCell_isMacro[0][Lib_for_Inst[Cell_in_top[i]]]){ // is macro
top_size_array_macro.push_back(make_pair(top_size_array[i].first, top_size_array[i].second));
}
// cout << "be---C" << top_size_array[i].first+1 << ", size: " << top_size_array[i].second << endl;
}
for(int i=0; i<bot_size_array.size(); i++){
bot_size_array[i].first = Cell_in_bottom[i];
bot_size_array[i].second = LibCellSize[bot][Lib_for_Inst[Cell_in_bottom[i]]];
if(LibCell_isMacro[0][Lib_for_Inst[Cell_in_bottom[i]]]){ // is macro
bot_size_array_macro.push_back(make_pair(bot_size_array[i].first, bot_size_array[i].second));
}
// cout << "be---C" << bot_size_array[i].first+1 << ", size: " << bot_size_array[i].second << endl;
}
sort(top_size_array.begin(), top_size_array.end(), sortbysize);
sort(bot_size_array.begin(), bot_size_array.end(), sortbysize);
sort(top_size_array_macro.begin(), top_size_array_macro.end(), sortbysize);
sort(bot_size_array_macro.begin(), bot_size_array_macro.end(), sortbysize);
int stop = 0;
int flag = -1;
/*yu--modified(0826)*/
using namespace std::chrono;
const int timeoutMinutes = 1; //count down 1 min
const auto timeout = minutes(timeoutMinutes);
auto startTime = high_resolution_clock::now();
int counter = 0;
/*yu--modified end*/
while (1)
{
/*yu--modified(0826)*/
auto currentTime = high_resolution_clock::now();
auto elapsedTime = duration_cast<minutes>(currentTime - startTime);
if (elapsedTime >= timeout) {
//can change to another legalize
std::cout << "Timeout reached. Terminating." << std::endl;
std::cout << "Press Enter to terminate...";
std::cin.get(); // Wait for user to press Enter
break;
}
/*yu--modified end*/
cout << "------top_size: " << top_size_array.size() << ", bot_size: " << bot_size_array.size() << endl;
cout << "TopDieRealArea: " << TopDieRealArea << ", BottomDieRealArea: " << BottomDieRealArea << endl;
cout << "TopDieMaxArea: " << TopDieMaxArea << ", BottomDieMaxArea: " << BottomDieMaxArea << endl;
if ((TopDieRealArea < TopDieMaxArea) && (BottomDieRealArea < BottomDieMaxArea))
{
stop++;
}
if (stop == 1)
{
if (TopDieMaxArea < 50000 || BottomDieMaxArea < 50000)
break;
}
if (stop == 5)
{
if (TopDieMaxArea < 100000000 || BottomDieMaxArea < 1000000)
break;
}
if (stop == 10)
{
break;
}
if (TopDieRealArea >= TopDieMaxArea)
flag = 0;
else if (BottomDieRealArea >= BottomDieMaxArea)
flag = 1;
int swap_inst = -1;
if (NumofTech == 2)
{
if (flag == 0)
{
for (int i = 0; i < top_size_array.size(); i++)
{
int idx = top_size_array[i].first;
if ((BottomDieRealArea + LibCellSize[bot][Lib_for_Inst[idx]]) < BottomDieMaxArea)
{
if (!LibCell_isMacro[0][Lib_for_Inst[idx]]) //only swap std cell
{
swap_inst = idx;
// Remove the element from top_size_array
top_size_array.erase(top_size_array.begin() + i);
// Since we removed an element, adjust the index and size
i--;
break;
}
}
}
if (swap_inst != -1)
{
// swap instance
partition_map[swap_inst] = 1;
BottomDieRealArea += LibCellSize[bot][Lib_for_Inst[swap_inst]];
TopDieRealArea -= LibCellSize[top][Lib_for_Inst[swap_inst]];
}
else{
cout << "Can not find inst swap to bot!!!\n" << endl;
for (int i = 0; i < top_size_array_macro.size(); i++){
int idx = top_size_array_macro[i].first;
swap_inst = idx;
top_size_array_macro.erase(top_size_array_macro.begin() + i);
i--;
break;
}
// swap instance
partition_map[swap_inst] = 1;
BottomDieRealArea += LibCellSize[bot][Lib_for_Inst[swap_inst]];
TopDieRealArea -= LibCellSize[top][Lib_for_Inst[swap_inst]];
//swap another macro
for (int i = 0; i < top_size_array_macro.size(); i++){
int idx = top_size_array_macro[i].first;
swap_inst = idx;
top_size_array_macro.erase(top_size_array_macro.begin() + i);
i--;
break;
}
// swap instance
partition_map[swap_inst] = 1;
BottomDieRealArea += LibCellSize[bot][Lib_for_Inst[swap_inst]];
TopDieRealArea -= LibCellSize[top][Lib_for_Inst[swap_inst]];
}
}
else if (flag == 1)
{
for (int i = 0; i < bot_size_array.size(); i++)
{
int idx = bot_size_array[i].first;
if ((TopDieRealArea + LibCellSize[top][Lib_for_Inst[idx]]) < TopDieMaxArea)
{
if (!LibCell_isMacro[0][Lib_for_Inst[idx]]) //only swap std cell
{
swap_inst = idx;
// Remove the element from bot_size_array
bot_size_array.erase(bot_size_array.begin() + i);
// Since we removed an element, adjust the index and size
i--;
break;
}
}
}
if (swap_inst != -1)
{
// swap instance
partition_map[swap_inst] = 0;
BottomDieRealArea -= LibCellSize[bot][Lib_for_Inst[swap_inst]];
TopDieRealArea += LibCellSize[top][Lib_for_Inst[swap_inst]];
}
else{
cout << "Can not find inst swap to top!!!\n" << endl;
for (int i = 0; i < bot_size_array_macro.size(); i++){
int idx = bot_size_array_macro[i].first;
swap_inst = idx;
bot_size_array_macro.erase(bot_size_array_macro.begin() + i);
i--;
break;
}
// swap instance
partition_map[swap_inst] = 0;
BottomDieRealArea -= LibCellSize[bot][Lib_for_Inst[swap_inst]];
TopDieRealArea += LibCellSize[top][Lib_for_Inst[swap_inst]];
//swap another macro
for (int i = 0; i < bot_size_array_macro.size(); i++){
int idx = bot_size_array_macro[i].first;
swap_inst = idx;
bot_size_array_macro.erase(bot_size_array_macro.begin() + i);
i--;
break;
}
// swap instance
partition_map[swap_inst] = 0;
BottomDieRealArea -= LibCellSize[bot][Lib_for_Inst[swap_inst]];
TopDieRealArea += LibCellSize[top][Lib_for_Inst[swap_inst]];
}
}
}
else if (NumofTech == 1)
{
if (flag == 0)
{
for (int i = 0; i < top_size_array.size(); i++)
{
int idx = top_size_array[i].first;
if ((BottomDieRealArea + LibCellSize[bot][Lib_for_Inst[idx]]) < BottomDieMaxArea)
{
if (!LibCell_isMacro[0][Lib_for_Inst[idx]]) //only swap std cell
{
swap_inst = idx;
// Remove the element from top_size_array
top_size_array.erase(top_size_array.begin() + i);
// Since we removed an element, adjust the index and size
i--; Editor is loading...