@@ -2301,21 +2301,17 @@ int FlexPA::genPatterns_helper(
2301
2301
int num_edge = num_node * max_access_point_size;
2302
2302
int num_valid_pattern = 0 ;
2303
2303
2304
- std::vector<std::unique_ptr<FlexDPNode>> nodes (num_node);
2305
- for (int i = 0 ; i < num_node; ++i) {
2306
- nodes[i] = std::make_unique<FlexDPNode>();
2307
- }
2304
+ std::vector<std::vector<std::unique_ptr<FlexDPNode>>> nodes (pins.size () + 2 );
2308
2305
std::vector<int > vio_edge (num_edge, -1 );
2309
2306
2310
2307
genPatternsInit (nodes,
2311
2308
pins,
2312
2309
inst_access_patterns,
2313
2310
used_access_points,
2314
- viol_access_points,
2315
- max_access_point_size);
2311
+ viol_access_points);
2316
2312
2317
2313
for (int i = 0 ; i < router_cfg_->ACCESS_PATTERN_END_ITERATION_NUM ; i++) {
2318
- genPatterns_reset (nodes, pins, max_access_point_size );
2314
+ genPatterns_reset (nodes, pins);
2319
2315
genPatterns_perform (nodes,
2320
2316
pins,
2321
2317
vio_edge,
@@ -2345,61 +2341,70 @@ int FlexPA::genPatterns_helper(
2345
2341
2346
2342
// init dp node array for valid access points
2347
2343
void FlexPA::genPatternsInit (
2348
- std::vector<std::unique_ptr<FlexDPNode>>& nodes,
2344
+ std::vector<std::vector<std:: unique_ptr<FlexDPNode> >>& nodes,
2349
2345
const std::vector<std::pair<frMPin*, frInstTerm*>>& pins,
2350
2346
std::set<std::vector<int >>& inst_access_patterns,
2351
2347
std::set<std::pair<int , int >>& used_access_points,
2352
- std::set<std::pair<int , int >>& viol_access_points,
2353
- int max_access_point_size)
2348
+ std::set<std::pair<int , int >>& viol_access_points)
2354
2349
{
2355
2350
// clear temp storage and flag
2356
2351
inst_access_patterns.clear ();
2357
2352
used_access_points.clear ();
2358
2353
viol_access_points.clear ();
2359
2354
2360
2355
// init virtual nodes
2361
- int start_node_idx = getFlatIdx (-1 , 0 , max_access_point_size);
2362
- nodes[start_node_idx]->setNodeCost (0 );
2363
- nodes[start_node_idx]->setIdx ({-1 , 0 });
2364
- nodes[start_node_idx]->setPathCost (0 );
2365
- nodes[start_node_idx]->setAsSource ();
2366
-
2367
- int end_node_idx = getFlatIdx (pins.size (), 0 , max_access_point_size);
2368
- nodes[end_node_idx]->setNodeCost (0 );
2369
- nodes[end_node_idx]->setIdx ({pins.size (), 0 });
2370
- nodes[end_node_idx]->setAsSink ();
2356
+ const int source_node_idx = pins.size () + 1 ;
2357
+ nodes[source_node_idx] = std::vector<std::unique_ptr<FlexDPNode>>(1 );
2358
+ nodes[source_node_idx][0 ] = std::make_unique<FlexDPNode>();
2359
+ FlexDPNode* source_node = nodes[source_node_idx][0 ].get ();
2360
+ source_node->setNodeCost (0 );
2361
+ source_node->setIdx ({pins.size () + 1 , 0 });
2362
+ source_node->setPathCost (0 );
2363
+ source_node->setAsSource ();
2364
+
2365
+ const int sink_node_idx = pins.size ();
2366
+ nodes[sink_node_idx] = std::vector<std::unique_ptr<FlexDPNode>>(1 );
2367
+ nodes[sink_node_idx][0 ] = std::make_unique<FlexDPNode>();
2368
+ FlexDPNode* sink_node = nodes[sink_node_idx][0 ].get ();
2369
+ sink_node->setNodeCost (0 );
2370
+ sink_node->setIdx ({pins.size (), 0 });
2371
+ sink_node->setAsSink ();
2371
2372
// init pin nodes
2372
2373
int pin_idx = 0 ;
2373
2374
int ap_idx = 0 ;
2374
2375
int pin_access_idx = unique_insts_.getPAIndex (pins[0 ].second ->getInst ());
2375
2376
2376
2377
for (auto & [pin, inst_term] : pins) {
2377
2378
ap_idx = 0 ;
2379
+ auto size = pin->getPinAccess (pin_access_idx)->getAccessPoints ().size ();
2380
+ nodes[pin_idx] = std::vector<std::unique_ptr<FlexDPNode>>(size);
2378
2381
for (auto & ap : pin->getPinAccess (pin_access_idx)->getAccessPoints ()) {
2379
- int node_idx = getFlatIdx (pin_idx, ap_idx, max_access_point_size );
2380
- nodes[node_idx ]->setIdx ({pin_idx, ap_idx});
2381
- nodes[node_idx ]->setNodeCost (ap->getCost ());
2382
+ nodes[pin_idx][ap_idx] = std::make_unique<FlexDPNode>( );
2383
+ nodes[pin_idx][ap_idx ]->setIdx ({pin_idx, ap_idx});
2384
+ nodes[pin_idx][ap_idx ]->setNodeCost (ap->getCost ());
2382
2385
ap_idx++;
2383
2386
}
2384
2387
pin_idx++;
2385
2388
}
2386
2389
}
2387
2390
2388
2391
void FlexPA::genPatterns_reset (
2389
- std::vector<std::unique_ptr<FlexDPNode>>& nodes,
2390
- const std::vector<std::pair<frMPin*, frInstTerm*>>& pins,
2391
- int max_access_point_size)
2392
+ std::vector<std::vector<std::unique_ptr<FlexDPNode>>>& nodes,
2393
+ const std::vector<std::pair<frMPin*, frInstTerm*>>& pins)
2392
2394
{
2393
- for (auto & node : nodes) {
2394
- node->setPathCost (std::numeric_limits<int >::max ());
2395
- node->setPrevNode (nullptr );
2395
+ for (auto & pin_nodes : nodes) {
2396
+ for (auto & node : pin_nodes) {
2397
+ node->setPathCost (std::numeric_limits<int >::max ());
2398
+ node->setPrevNode (nullptr );
2399
+ }
2396
2400
}
2397
2401
2398
- int start_node_idx = getFlatIdx (-1 , 0 , max_access_point_size);
2399
- int end_node_idx = getFlatIdx (pins.size (), 0 , max_access_point_size);
2400
- nodes[start_node_idx]->setNodeCost (0 );
2401
- nodes[start_node_idx]->setPathCost (0 );
2402
- nodes[end_node_idx]->setNodeCost (0 );
2402
+ FlexDPNode* source_node = nodes[pins.size () + 1 ][0 ].get ();
2403
+ source_node->setNodeCost (0 );
2404
+ source_node->setPathCost (0 );
2405
+
2406
+ FlexDPNode* sink_node = nodes[pins.size ()][0 ].get ();
2407
+ sink_node->setNodeCost (0 );
2403
2408
}
2404
2409
2405
2410
bool FlexPA::genPatterns_gc (
@@ -2463,38 +2468,35 @@ bool FlexPA::genPatterns_gc(
2463
2468
}
2464
2469
2465
2470
void FlexPA::genPatterns_perform (
2466
- std::vector<std::unique_ptr<FlexDPNode>>& nodes,
2471
+ std::vector<std::vector<std:: unique_ptr<FlexDPNode> >>& nodes,
2467
2472
const std::vector<std::pair<frMPin*, frInstTerm*>>& pins,
2468
2473
std::vector<int >& vio_edges,
2469
2474
const std::set<std::pair<int , int >>& used_access_points,
2470
2475
const std::set<std::pair<int , int >>& viol_access_points,
2471
2476
const int curr_unique_inst_idx,
2472
2477
const int max_access_point_size)
2473
2478
{
2479
+ const int source_node_idx = pins.size () + 1 ;
2474
2480
for (int curr_pin_idx = 0 ; curr_pin_idx <= (int ) pins.size ();
2475
2481
curr_pin_idx++) {
2476
- for (int curr_acc_point_idx = 0 ; curr_acc_point_idx < max_access_point_size;
2482
+ for (int curr_acc_point_idx = 0 ;
2483
+ curr_acc_point_idx < (int ) nodes[curr_pin_idx].size ();
2477
2484
curr_acc_point_idx++) {
2478
- auto curr_node_idx
2479
- = getFlatIdx (curr_pin_idx, curr_acc_point_idx, max_access_point_size);
2480
- FlexDPNode* curr_node = nodes[curr_node_idx].get ();
2485
+ FlexDPNode* curr_node = nodes[curr_pin_idx][curr_acc_point_idx].get ();
2481
2486
if (curr_node->getNodeCost () == std::numeric_limits<int >::max ()) {
2482
2487
continue ;
2483
2488
}
2484
- int prev_pin_idx = curr_pin_idx - 1 ;
2489
+ int prev_pin_idx = curr_pin_idx > 0 ? curr_pin_idx - 1 : source_node_idx ;
2485
2490
for (int prev_acc_point_idx = 0 ;
2486
- prev_acc_point_idx < max_access_point_size ;
2491
+ prev_acc_point_idx < nodes[prev_pin_idx]. size () ;
2487
2492
prev_acc_point_idx++) {
2488
- const int prev_node_idx = getFlatIdx (
2489
- prev_pin_idx, prev_acc_point_idx, max_access_point_size);
2490
- FlexDPNode* prev_node = nodes[prev_node_idx].get ();
2493
+ FlexDPNode* prev_node = nodes[prev_pin_idx][prev_acc_point_idx].get ();
2491
2494
if (prev_node->getPathCost () == std::numeric_limits<int >::max ()) {
2492
2495
continue ;
2493
2496
}
2494
2497
2495
2498
const int edge_cost = getEdgeCost (prev_node,
2496
2499
curr_node,
2497
- nodes,
2498
2500
pins,
2499
2501
vio_edges,
2500
2502
used_access_points,
@@ -2505,7 +2507,6 @@ void FlexPA::genPatterns_perform(
2505
2507
|| curr_node->getPathCost ()
2506
2508
> prev_node->getPathCost () + edge_cost) {
2507
2509
curr_node->setPathCost (prev_node->getPathCost () + edge_cost);
2508
- prev_node = nodes[prev_node_idx].get ();
2509
2510
curr_node->setPrevNode (prev_node);
2510
2511
}
2511
2512
}
@@ -2516,7 +2517,6 @@ void FlexPA::genPatterns_perform(
2516
2517
int FlexPA::getEdgeCost (
2517
2518
FlexDPNode* prev_node,
2518
2519
FlexDPNode* curr_node,
2519
- const std::vector<std::unique_ptr<FlexDPNode>>& nodes,
2520
2520
const std::vector<std::pair<frMPin*, frInstTerm*>>& pins,
2521
2521
std::vector<int >& vio_edges,
2522
2522
const std::set<std::pair<int , int >>& used_access_points,
@@ -2583,13 +2583,13 @@ int FlexPA::getEdgeCost(
2583
2583
vio_edges[edge_idx] = has_vio;
2584
2584
2585
2585
// look back for GN14
2586
- if (!has_vio && prev_node != nullptr ) {
2586
+ if (!has_vio) {
2587
2587
// check one more back
2588
2588
if (prev_node->hasPrevNode ()) {
2589
2589
auto prev_prev_node = prev_node->getPrevNode ();
2590
2590
auto [prev_prev_pin_idx, prev_prev_acc_point_idx]
2591
2591
= prev_prev_node->getIdx ();
2592
- if (prev_prev_pin_idx != - 1 ) {
2592
+ if (!prev_prev_node-> isSource () ) {
2593
2593
const auto & [pin_3, inst_term_3] = pins[prev_prev_pin_idx];
2594
2594
auto pa_3 = pin_3->getPinAccess (pin_access_idx);
2595
2595
std::unique_ptr<frVia> via3;
@@ -2631,7 +2631,7 @@ int FlexPA::getEdgeCost(
2631
2631
std::make_pair (curr_pin_idx, curr_acc_point_idx))
2632
2632
!= viol_access_points.end ()) {
2633
2633
edge_cost = 1000 ;
2634
- } else if (prev_node != nullptr ) {
2634
+ } else {
2635
2635
const int prev_node_cost = prev_node->getNodeCost ();
2636
2636
const int curr_node_cost = curr_node->getNodeCost ();
2637
2637
edge_cost = (prev_node_cost + curr_node_cost) / 2 ;
@@ -2644,18 +2644,14 @@ int FlexPA::getEdgeCost(
2644
2644
}
2645
2645
2646
2646
std::vector<int > FlexPA::extractAccessPatternFromNodes (
2647
- const std::vector<std::unique_ptr<FlexDPNode>>& nodes,
2647
+ const std::vector<std::vector<std:: unique_ptr<FlexDPNode> >>& nodes,
2648
2648
const std::vector<std::pair<frMPin*, frInstTerm*>>& pins,
2649
- std::set<std::pair<int , int >>& used_access_points,
2650
- const int max_access_point_size)
2649
+ std::set<std::pair<int , int >>& used_access_points)
2651
2650
{
2652
2651
std::vector<int > access_pattern (pins.size (), -1 );
2653
2652
2654
- const int source_node_idx = getFlatIdx (-1 , 0 , max_access_point_size);
2655
- const FlexDPNode* source_node = nodes[source_node_idx].get ();
2656
-
2657
- const int sink_node_idx = getFlatIdx (pins.size (), 0 , max_access_point_size);
2658
- const FlexDPNode* sink_node = nodes[sink_node_idx].get ();
2653
+ const FlexDPNode* source_node = nodes[pins.size () + 1 ][0 ].get ();
2654
+ const FlexDPNode* sink_node = nodes[pins.size ()][0 ].get ();
2659
2655
2660
2656
FlexDPNode* curr_node = sink_node->getPrevNode ();
2661
2657
@@ -2674,7 +2670,7 @@ std::vector<int> FlexPA::extractAccessPatternFromNodes(
2674
2670
}
2675
2671
2676
2672
bool FlexPA::genPatterns_commit (
2677
- const std::vector<std::unique_ptr<FlexDPNode>>& nodes,
2673
+ const std::vector<std::vector<std:: unique_ptr<FlexDPNode> >>& nodes,
2678
2674
const std::vector<std::pair<frMPin*, frInstTerm*>>& pins,
2679
2675
bool & is_valid,
2680
2676
std::set<std::vector<int >>& inst_access_patterns,
@@ -2683,8 +2679,8 @@ bool FlexPA::genPatterns_commit(
2683
2679
const int curr_unique_inst_idx,
2684
2680
const int max_access_point_size)
2685
2681
{
2686
- std::vector<int > access_pattern = extractAccessPatternFromNodes (
2687
- nodes, pins, used_access_points, max_access_point_size );
2682
+ std::vector<int > access_pattern
2683
+ = extractAccessPatternFromNodes ( nodes, pins, used_access_points);
2688
2684
// not a new access pattern
2689
2685
if (inst_access_patterns.find (access_pattern) != inst_access_patterns.end ()) {
2690
2686
return false ;
@@ -2773,7 +2769,7 @@ bool FlexPA::genPatterns_commit(
2773
2769
pin_access_pattern->updateCost ();
2774
2770
unique_inst_patterns_[curr_unique_inst_idx].push_back (
2775
2771
std::move (pin_access_pattern));
2776
- // genPatterns_print(nodes, pins, max_access_point_size );
2772
+ // genPatterns_print(nodes, pins);
2777
2773
is_valid = true ;
2778
2774
} else {
2779
2775
for (int idx_1 = 0 ; idx_1 < (int ) pins.size (); idx_1++) {
@@ -2796,12 +2792,11 @@ bool FlexPA::genPatterns_commit(
2796
2792
}
2797
2793
2798
2794
void FlexPA::genPatternsPrintDebug (
2799
- std::vector<std::unique_ptr<FlexDPNode>>& nodes,
2800
- const std::vector<std::pair<frMPin*, frInstTerm*>>& pins,
2801
- int max_access_point_size)
2795
+ std::vector<std::vector<std::unique_ptr<FlexDPNode>>>& nodes,
2796
+ const std::vector<std::pair<frMPin*, frInstTerm*>>& pins)
2802
2797
{
2803
- int curr_node_idx = getFlatIdx ( pins.size (), 0 , max_access_point_size );
2804
- FlexDPNode* curr_node = nodes[curr_node_idx]. get () ;
2798
+ FlexDPNode* sink_node = nodes[ pins.size () + 1 ][ 0 ]. get ( );
2799
+ FlexDPNode* curr_node = sink_node ;
2805
2800
int pin_cnt = pins.size ();
2806
2801
2807
2802
dbTransform xform;
@@ -2838,12 +2833,11 @@ void FlexPA::genPatternsPrintDebug(
2838
2833
}
2839
2834
2840
2835
void FlexPA::genPatterns_print (
2841
- std::vector<std::unique_ptr<FlexDPNode>>& nodes,
2842
- const std::vector<std::pair<frMPin*, frInstTerm*>>& pins,
2843
- const int max_access_point_size)
2836
+ std::vector<std::vector<std::unique_ptr<FlexDPNode>>>& nodes,
2837
+ const std::vector<std::pair<frMPin*, frInstTerm*>>& pins)
2844
2838
{
2845
- int curr_node_idx = getFlatIdx ( pins.size (), 0 , max_access_point_size );
2846
- FlexDPNode* curr_node = nodes[curr_node_idx]. get () ;
2839
+ FlexDPNode* sink_node = nodes[ pins.size () + 1 ][ 0 ]. get ( );
2840
+ FlexDPNode* curr_node = sink_node ;
2847
2841
int pin_cnt = pins.size ();
2848
2842
2849
2843
std::cout << " new pattern\n " ;
0 commit comments