@@ -2531,6 +2531,7 @@ void FlexDRWorker::route_queue_init_queue(queue<RouteQueueEntry>& rerouteQueue)
25312531
25322532 if (getRipupMode () == 0 ) {
25332533 for (auto & marker : markers_) {
2534+ // checks 中的元素为的本轮不布的网络
25342535 route_queue_update_from_marker (
25352536 &marker, uniqueVictims, uniqueAggressors, checks, routes);
25362537 }
@@ -2557,6 +2558,82 @@ void FlexDRWorker::route_queue_init_queue(queue<RouteQueueEntry>& rerouteQueue)
25572558 } else {
25582559 cout << " Error: unsupported ripup mode\n " ;
25592560 }
2561+
2562+ vector<unsigned int > customOrder; // 记录算法端给出的排序
2563+ vector<RouteQueueEntry> customOrderRoutes; // 记录即将替换掉初始排序的临时序列
2564+
2565+ // 当推断模式为「替换初始排序」时,使用算法排序好的序列
2566+ if (debugSettings_->apiHost != " "
2567+ && debugSettings_->netOrderingEvaluation == 2 ) {
2568+ std::string addr = " tcp://" + debugSettings_->apiHost ;
2569+ utl::MQ mq (addr, debugSettings_->apiTimeout );
2570+
2571+ // 先将不需要布线的网络放到队列
2572+ for (auto & entry : checks) {
2573+ customOrderRoutes.push_back (entry);
2574+ }
2575+
2576+ // 原顺序为 | routes | checks ,现在为 | checks | routes (#pin < 2) | routes (#pin >= 2)
2577+
2578+ // 待布网络下标
2579+ vector<unsigned int > outerNetIdxRemaining;
2580+ // 构建外部 net 的索引
2581+ map<unsigned int , drNet*> outerNetMap;
2582+ int outerNetIdx = 0 ;
2583+ for (auto & entry : routes) {
2584+ frBlockObject* obj = entry.block ;
2585+ bool doRoute = entry.doRoute ;
2586+
2587+ if (doRoute) {
2588+ auto net = static_cast <drNet*>(obj);
2589+ if (net->getPins ().size () > 1 ) {
2590+ outerNetIdxRemaining.push_back (outerNetIdx);
2591+ outerNetMap[outerNetIdx] = net;
2592+ outerNetIdx++;
2593+ } else {
2594+ customOrderRoutes.push_back (entry);
2595+ }
2596+ } else {
2597+ customOrderRoutes.push_back (entry);
2598+ }
2599+ }
2600+
2601+ // 仅处理有 1 个待布网络以上的情况
2602+ if (outerNetIdxRemaining.size () > 1 ) {
2603+ setOuterNetMap (outerNetMap);
2604+
2605+ openroad_api::net_ordering::Message msg;
2606+ openroad_api::net_ordering::Request* req = msg.mutable_request ();
2607+
2608+ // 获取 gridGraph 的数据
2609+ gridGraph_.dump (req);
2610+
2611+ req->mutable_nets ()->CopyFrom ({outerNetIdxRemaining.begin (),
2612+ outerNetIdxRemaining.end ()});
2613+
2614+ string reqStr = msg.SerializeAsString ();
2615+ logger_->info (DRT, 991 , " Requesting initial net order..." );
2616+ string res = mq.request (reqStr);
2617+ msg = openroad_api::net_ordering::Message ();
2618+ msg.ParseFromString (res);
2619+ auto netOrder = msg.response ().net_list ();
2620+
2621+ for (auto & netIdx : netOrder) {
2622+ customOrder.push_back (netIdx);
2623+ }
2624+ }
2625+ }
2626+
2627+ // 如果有排序结果,则替换为算法给出的排序
2628+ if (customOrder.size () > 0 ) {
2629+ for (auto & netIdx : customOrder) {
2630+ customOrderRoutes.push_back ({outerNetMap_[netIdx], 0 , true });
2631+ }
2632+
2633+ routes = customOrderRoutes;
2634+ }
2635+
2636+ // 依次将 route 和 check 中的元素压入队列
25602637 route_queue_update_queue (checks, routes, rerouteQueue);
25612638}
25622639
0 commit comments