@@ -2531,6 +2531,7 @@ void FlexDRWorker::route_queue_init_queue(queue<RouteQueueEntry>& rerouteQueue)
2531
2531
2532
2532
if (getRipupMode () == 0 ) {
2533
2533
for (auto & marker : markers_) {
2534
+ // checks 中的元素为的本轮不布的网络
2534
2535
route_queue_update_from_marker (
2535
2536
&marker, uniqueVictims, uniqueAggressors, checks, routes);
2536
2537
}
@@ -2557,6 +2558,82 @@ void FlexDRWorker::route_queue_init_queue(queue<RouteQueueEntry>& rerouteQueue)
2557
2558
} else {
2558
2559
cout << " Error: unsupported ripup mode\n " ;
2559
2560
}
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 中的元素压入队列
2560
2637
route_queue_update_queue (checks, routes, rerouteQueue);
2561
2638
}
2562
2639
0 commit comments