From 007e0ee99ff43f3a4207a1773a442bdd4b96c81c Mon Sep 17 00:00:00 2001 From: KazushiKawamura Date: Tue, 16 Jul 2019 11:34:13 +0900 Subject: [PATCH] close #1 and update functions --- router/router.cpp | 25 +++++++++++++++++++------ router/router.hpp | 2 +- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/router/router.cpp b/router/router.cpp index a1f4639..f98dae2 100644 --- a/router/router.cpp +++ b/router/router.cpp @@ -57,8 +57,12 @@ int router(short int size_x, short int size_y, short int line_num, short int boa for(i = 0; i < line_num; i++) { ap_uint t1 = terminals[i][0]; ap_uint t2 = terminals[i][1]; - short int dist = abs((short int)t2 - (short int)t1); - if(dist == 1 || dist == size_x) { + short int t1_x = t1 % size_x; + short int t1_y = t1 / size_x; + short int t2_x = t2 % size_x; + short int t2_y = t2 / size_x; + short int dist = abs(t1_x - t2_x) + abs(t1_y - t2_y); // Manhattan dist. + if(dist == 1) { adjacents[i] = true; #ifdef PRINT_BOARD cout << "Line #" << i + 1 << " needs no routing" << endl; @@ -79,7 +83,7 @@ int router(short int size_x, short int size_y, short int line_num, short int boa ap_uint t1 = terminals[i][0]; ap_uint t2 = terminals[i][1]; weights[t1] = 1; - search(size_x, size_y, &paths_size[i], paths[i], t1, t2, weights); + if(search(size_x, size_y, &paths_size[i], paths[i], t1, t2, weights) < 0) { return 0; } weights[t1] = PRIO_MAX; } @@ -147,7 +151,9 @@ int router(short int size_x, short int size_y, short int line_num, short int boa return 0; } + int total_wire_length = 0; for(i = 0; i < line_num; i++) { + total_wire_length += paths_size[i]; for(p = 0; p < paths_size[i]; p++) { ap_uint cell_id = paths[i][p]; board_str[cell_id] = i + 1; @@ -169,7 +175,7 @@ int router(short int size_x, short int size_y, short int line_num, short int boa } #endif - return 1; + return total_wire_length; } void lfsr_random_init(ap_uint<32> seed) { @@ -192,7 +198,7 @@ ap_uint new_weight(ap_uint<16> x) { return (ap_uint)(y); } -void search(short int size_x, short int size_y, short int *path_size, ap_uint path[MAX_PATH], ap_uint start, ap_uint goal, ap_uint w[MAX_CELLS]){ +int search(short int size_x, short int size_y, short int *path_size, ap_uint path[MAX_PATH], ap_uint start, ap_uint goal, ap_uint w[MAX_CELLS]){ ap_uint dist[MAX_CELLS]; ap_uint prev[MAX_CELLS]; @@ -212,6 +218,7 @@ void search(short int size_x, short int size_y, short int *path_size, ap_uint prev_cost; @@ -220,7 +227,10 @@ void search(short int size_x, short int size_y, short int *path_size, ap_uint dist_s = dist[s]; - if(s == goal) break; + if(s == goal) { + find_path = true; + break; + } ap_uint cost = w[s]; short int s_x = s % size_x; @@ -250,6 +260,7 @@ void search(short int size_x, short int size_y, short int *path_size, ap_uint t = prev[goal]; short int p = 0; @@ -268,6 +279,8 @@ void search(short int size_x, short int size_y, short int *path_size, ap_uint seed); ap_uint<32> lfsr_random(); ap_uint new_weight(ap_uint<16> x); -void search(short int size_x, short int size_y, short int *path_size, ap_uint path[MAX_PATH], ap_uint start, ap_uint goal, ap_uint w[MAX_CELLS]); +int search(short int size_x, short int size_y, short int *path_size, ap_uint path[MAX_PATH], ap_uint start, ap_uint goal, ap_uint w[MAX_CELLS]); void enqueue(ap_uint pq_nodes[MAX_PQ], ap_uint priority, ap_uint data, ap_uint *pq_len, bool *is_empty); void dequeue(ap_uint pq_nodes[MAX_PQ], ap_uint *ret_priority, ap_uint *ret_data, ap_uint *pq_len, bool *is_empty); -- 2.22.0