Skip to content

Commit fcb7507

Browse files
committed
feat: support custom initial reroute queue.
Signed-off-by: zarkin404 <[email protected]>
1 parent d536be7 commit fcb7507

File tree

7 files changed

+97
-12
lines changed

7 files changed

+97
-12
lines changed

src/drt/include/triton_route/TritonRoute.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -137,11 +137,11 @@ class TritonRoute
137137
void setBreakIter(int breakIter);
138138
void setParallelWorkers(int parallelWorkers);
139139
void setSkipReroute(bool on = true);
140-
void setRerouteNetsSortMode(int sortMode);
140+
void setRerouteNetsSortMode(int mode);
141141
void setApiHost(const std::string& apiHost);
142142
void setApiTimeout(int timeout);
143143
void setNetOrderingTraining(bool on = true);
144-
void setNetOrderingEvaluation(bool on = true);
144+
void setNetOrderingEvaluation(int mode);
145145
void setDebugPaMarkers(bool on = true);
146146
void setDebugWorkerParams(int mazeEndIter,
147147
int drcCost,

src/drt/src/TritonRoute.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -206,9 +206,9 @@ void TritonRoute::setNetOrderingTraining(bool on)
206206
debug_->netOrderingTraining = on;
207207
}
208208

209-
void TritonRoute::setNetOrderingEvaluation(bool on)
209+
void TritonRoute::setNetOrderingEvaluation(int mode)
210210
{
211-
debug_->netOrderingEvaluation = on;
211+
debug_->netOrderingEvaluation = mode;
212212
}
213213

214214
void TritonRoute::setDebugPaMarkers(bool on)

src/drt/src/TritonRoute.i

+1-1
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ set_detailed_route_debug_cmd(const char* net_name,
174174
const char* api_host,
175175
int api_timeout,
176176
bool net_ordering_training,
177-
bool net_ordering_evaluation)
177+
int net_ordering_evaluation)
178178
{
179179
auto* router = ord::OpenRoad::openRoad()->getTritonRoute();
180180
router->setDebugNetName(net_name);

src/drt/src/TritonRoute.tcl

+8-3
Original file line numberDiff line numberDiff line change
@@ -224,10 +224,10 @@ proc detailed_route_debug { args } {
224224
sta::parse_key_args "detailed_route_debug" args \
225225
keys {-net -worker -iter -pin -dump_dir -custom_size -custom_offset \
226226
-break_iter -parallel_workers -reroute_nets_sort_mode \
227-
-api_host -api_timeout} \
227+
-api_host -api_timeout -net_ordering_evaluation} \
228228
flags {-dr -maze -pa -pa_markers -pa_edge -pa_commit -dump_dr -ta \
229229
-custom_strategies -skip_reroute \
230-
-net_ordering_training -net_ordering_evaluation}
230+
-net_ordering_training}
231231

232232
sta::check_argc_eq0 "detailed_route_debug" $args
233233

@@ -243,7 +243,6 @@ proc detailed_route_debug { args } {
243243
set skip_reroute [info exists flags(-skip_reroute)]
244244
set skip_sort_reroute_nets [info exists flags(-skip_sort_reroute_nets)]
245245
set net_ordering_training [info exists flags(-net_ordering_training)]
246-
set net_ordering_evaluation [info exists flags(-net_ordering_evaluation)]
247246

248247
if { [info exists keys(-net)] } {
249248
set net_name $keys(-net)
@@ -303,6 +302,12 @@ proc detailed_route_debug { args } {
303302
set parallel_workers 0
304303
}
305304

305+
if { [info exists keys(-net_ordering_evaluation)] } {
306+
set net_ordering_evaluation $keys(-net_ordering_evaluation)
307+
} else {
308+
set net_ordering_evaluation 0
309+
}
310+
306311
if { [info exists keys(-reroute_nets_sort_mode)] } {
307312
set reroute_nets_sort_mode $keys(-reroute_nets_sort_mode)
308313
} else {

src/drt/src/dr/FlexDR_init.cpp

+77
Original file line numberDiff line numberDiff line change
@@ -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

src/drt/src/dr/FlexDR_maze.cpp

+4-1
Original file line numberDiff line numberDiff line change
@@ -1797,7 +1797,10 @@ void FlexDRWorker::route_queue_main(queue<RouteQueueEntry>& rerouteQueue)
17971797
{
17981798
auto& workerRegionQuery = getWorkerRegionQuery();
17991799

1800-
if (debugSettings_->apiHost != "") {
1800+
// 训练模式,或者单步的推断模式
1801+
if (debugSettings_->apiHost != ""
1802+
&& (debugSettings_->netOrderingTraining
1803+
|| debugSettings_->netOrderingEvaluation == 1)) {
18011804
std::string addr = "tcp://" + debugSettings_->apiHost;
18021805
utl::MQ mq(addr, debugSettings_->apiTimeout);
18031806

src/drt/src/frBaseTypes.h

+3-3
Original file line numberDiff line numberDiff line change
@@ -315,9 +315,9 @@ struct frDebugSettings
315315
parallelWorkers(0),
316316
skipReroute(false),
317317
rerouteNetsSortMode(0),
318-
apiTimeout(0),
318+
apiTimeout(30000),
319319
netOrderingTraining(false),
320-
netOrderingEvaluation(false),
320+
netOrderingEvaluation(0),
321321
paMarkers(false),
322322
paEdge(false),
323323
paCommit(false),
@@ -356,7 +356,7 @@ struct frDebugSettings
356356
std::string apiHost;
357357
int apiTimeout;
358358
bool netOrderingTraining;
359-
bool netOrderingEvaluation;
359+
int netOrderingEvaluation;
360360
bool paMarkers;
361361
bool paEdge;
362362
bool paCommit;

0 commit comments

Comments
 (0)