Commit 8eaee571 authored by kazushi.kawamura's avatar kazushi.kawamura

Add pragma for Vivado-HLS

parent ec55c620
This diff is collapsed.
...@@ -51,7 +51,7 @@ bool pynqrouter(char boardstr[BOARDSTR_SIZE], ap_uint<32> seed, ap_int<32> *stat ...@@ -51,7 +51,7 @@ bool pynqrouter(char boardstr[BOARDSTR_SIZE], ap_uint<32> seed, ap_int<32> *stat
// For each line // For each line
// Note: Should not partition completely // Note: Should not partition completely
bool adjacents[MAX_LINES]; // Line has adjacent terminals? bool adjacents[MAX_LINES]; // Line has adjacent terminals?
ap_uint<CELL_BIT> starts[MAX_LINES]; // Start list ap_uint<CELL_BIT> starts[MAX_LINES]; // Start list
ap_uint<CELL_BIT> goals[MAX_LINES]; // Goal list ap_uint<CELL_BIT> goals[MAX_LINES]; // Goal list
ap_uint<BUFF_BIT> s_idx[MAX_LINES]; // Start point on line buffer ap_uint<BUFF_BIT> s_idx[MAX_LINES]; // Start point on line buffer
...@@ -151,6 +151,7 @@ bool pynqrouter(char boardstr[BOARDSTR_SIZE], ap_uint<32> seed, ap_int<32> *stat ...@@ -151,6 +151,7 @@ bool pynqrouter(char boardstr[BOARDSTR_SIZE], ap_uint<32> seed, ap_int<32> *stat
// Memories for Overlap Check // Memories for Overlap Check
ap_uint<1> overlap_checks[MAX_CELLS]; ap_uint<1> overlap_checks[MAX_CELLS];
#pragma HLS ARRAY_PARTITION variable=overlap_checks cyclic factor=32 dim=1
bool has_overlap = false; bool has_overlap = false;
// ================================ // ================================
...@@ -188,6 +189,7 @@ bool pynqrouter(char boardstr[BOARDSTR_SIZE], ap_uint<32> seed, ap_int<32> *stat ...@@ -188,6 +189,7 @@ bool pynqrouter(char boardstr[BOARDSTR_SIZE], ap_uint<32> seed, ap_int<32> *stat
// (Step.2-1) Reset weights of target line // (Step.2-1) Reset weights of target line
WEIGHT_RESET: WEIGHT_RESET:
for (ap_uint<BUFF_BIT> j = s_idx[target]; j != s_idx[next_target]; j++) { for (ap_uint<BUFF_BIT> j = s_idx[target]; j != s_idx[next_target]; j++) {
#pragma HLS UNROLL factor=2
#pragma HLS LOOP_TRIPCOUNT min=1 max=256 #pragma HLS LOOP_TRIPCOUNT min=1 max=256
weights[paths[j]] = 1; weights[paths[j]] = 1;
} }
...@@ -196,11 +198,13 @@ bool pynqrouter(char boardstr[BOARDSTR_SIZE], ap_uint<32> seed, ap_int<32> *stat ...@@ -196,11 +198,13 @@ bool pynqrouter(char boardstr[BOARDSTR_SIZE], ap_uint<32> seed, ap_int<32> *stat
ap_uint<8> current_round_weight = new_weight(round); ap_uint<8> current_round_weight = new_weight(round);
WEIGHT_PATH: WEIGHT_PATH:
for (ap_uint<BUFF_BIT> j = s_idx[next_target]; j != pointer; j++) { for (ap_uint<BUFF_BIT> j = s_idx[next_target]; j != pointer; j++) {
#pragma HLS UNROLL factor=2
#pragma HLS LOOP_TRIPCOUNT min=1 max=8192 #pragma HLS LOOP_TRIPCOUNT min=1 max=8192
weights[paths[j]] = current_round_weight; weights[paths[j]] = current_round_weight;
} }
WEIGHT_TERMINAL: WEIGHT_TERMINAL:
for (ap_uint<LINE_BIT> i = 0; i < (ap_uint<LINE_BIT>)(line_num); i++) { for (ap_uint<LINE_BIT> i = 0; i < (ap_uint<LINE_BIT>)(line_num); i++) {
#pragma HLS UNROLL factor=2
#pragma HLS LOOP_TRIPCOUNT min=2 max=999 #pragma HLS LOOP_TRIPCOUNT min=2 max=999
weights[starts[i]] = MAX_WEIGHT; weights[starts[i]] = MAX_WEIGHT;
weights[goals[i]] = MAX_WEIGHT; weights[goals[i]] = MAX_WEIGHT;
...@@ -230,16 +234,19 @@ bool pynqrouter(char boardstr[BOARDSTR_SIZE], ap_uint<32> seed, ap_int<32> *stat ...@@ -230,16 +234,19 @@ bool pynqrouter(char boardstr[BOARDSTR_SIZE], ap_uint<32> seed, ap_int<32> *stat
has_overlap = false; has_overlap = false;
OVERLAP_RESET: OVERLAP_RESET:
for (ap_uint<CELL_BIT> i = 0; i < (ap_uint<CELL_BIT>)(MAX_CELLS); i++) { for (ap_uint<CELL_BIT> i = 0; i < (ap_uint<CELL_BIT>)(MAX_CELLS); i++) {
#pragma HLS UNROLL factor=32
overlap_checks[i] = 0; overlap_checks[i] = 0;
} }
OVERLAP_CHECK_LINE: OVERLAP_CHECK_LINE:
for (ap_uint<LINE_BIT> i = 0; i < (ap_uint<LINE_BIT>)(line_num); i++) { for (ap_uint<LINE_BIT> i = 0; i < (ap_uint<LINE_BIT>)(line_num); i++) {
#pragma HLS UNROLL factor=2
#pragma HLS LOOP_TRIPCOUNT min=2 max=999 #pragma HLS LOOP_TRIPCOUNT min=2 max=999
overlap_checks[starts[i]] = 1; overlap_checks[starts[i]] = 1;
overlap_checks[goals[i]] = 1; overlap_checks[goals[i]] = 1;
} }
OVERLAP_CHECK_PATH: OVERLAP_CHECK_PATH:
for (ap_uint<BUFF_BIT> j = s_idx[next_target]; j != pointer; j++) { for (ap_uint<BUFF_BIT> j = s_idx[next_target]; j != pointer; j++) {
#pragma HLS UNROLL factor=2
#pragma HLS LOOP_TRIPCOUNT min=1 max=8192 #pragma HLS LOOP_TRIPCOUNT min=1 max=8192
ap_uint<CELL_BIT> cell_id = paths[j]; ap_uint<CELL_BIT> cell_id = paths[j];
if (overlap_checks[cell_id]) { if (overlap_checks[cell_id]) {
...@@ -340,10 +347,12 @@ ap_uint<3> abs_uint3(ap_uint<3> a, ap_uint<3> b) { ...@@ -340,10 +347,12 @@ ap_uint<3> abs_uint3(ap_uint<3> a, ap_uint<3> b) {
ap_uint<BUFF_BIT> search(ap_uint<BUFF_BIT> idx, ap_uint<CELL_BIT> paths[MAX_BUFFER], ap_uint<CELL_BIT> start, ap_uint<CELL_BIT> goal, ap_uint<8> w[MAX_CELLS]) { ap_uint<BUFF_BIT> search(ap_uint<BUFF_BIT> idx, ap_uint<CELL_BIT> paths[MAX_BUFFER], ap_uint<CELL_BIT> start, ap_uint<CELL_BIT> goal, ap_uint<8> w[MAX_CELLS]) {
ap_uint<CELL_BIT> dist[MAX_CELLS]; ap_uint<CELL_BIT> dist[MAX_CELLS];
#pragma HLS ARRAY_PARTITION variable=dist cyclic factor=64 dim=1
ap_uint<CELL_BIT> prev[MAX_CELLS]; ap_uint<CELL_BIT> prev[MAX_CELLS];
SEARCH_INIT_DIST: SEARCH_INIT_DIST:
for (ap_uint<CELL_BIT> i = 0; i < (ap_uint<CELL_BIT>)(MAX_CELLS); i++) { for (ap_uint<CELL_BIT> i = 0; i < (ap_uint<CELL_BIT>)(MAX_CELLS); i++) {
#pragma HLS UNROLL factor=64
dist[i] = 65535; // = (2^16 - 1) dist[i] = 65535; // = (2^16 - 1)
} }
...@@ -459,7 +468,7 @@ void pq_push(ap_uint<32> pq_nodes[MAX_PQ], ap_uint<16> priority, ap_uint<16> dat ...@@ -459,7 +468,7 @@ void pq_push(ap_uint<32> pq_nodes[MAX_PQ], ap_uint<16> priority, ap_uint<16> dat
ap_uint<PQ_BIT> p = (*pq_len) >> 1; // parent node ap_uint<PQ_BIT> p = (*pq_len) >> 1; // parent node
PQ_PUSH_LOOP: PQ_PUSH_LOOP:
while (i > 1 && (ap_uint<16>)(pq_nodes[p] & PQ_PRIORITY_MASK) >= priority) { while (i > 1 && (ap_uint<16>)(pq_nodes[p] & PQ_PRIORITY_MASK) >= priority) {
#pragma HLS LOOP_TRIPCOUNT min=0 max=15 #pragma HLS LOOP_TRIPCOUNT min=0 max=14
/** Set!: min=0 max=PQ_BIT **/ /** Set!: min=0 max=PQ_BIT **/
pq_nodes[i] = pq_nodes[p]; pq_nodes[i] = pq_nodes[p];
i = p; i = p;
...@@ -482,7 +491,7 @@ void pq_pop(ap_uint<32> pq_nodes[MAX_PQ], ap_uint<16> *ret_priority, ap_uint<16> ...@@ -482,7 +491,7 @@ void pq_pop(ap_uint<32> pq_nodes[MAX_PQ], ap_uint<16> *ret_priority, ap_uint<16>
PQ_POP_LOOP: PQ_POP_LOOP:
while (!(i >> (PQ_BIT-1))) { // (2018.08.24) Loop condition fixed while (!(i >> (PQ_BIT-1))) { // (2018.08.24) Loop condition fixed
#pragma HLS LOOP_TRIPCOUNT min=1 max=15 #pragma HLS LOOP_TRIPCOUNT min=1 max=14
/** Set!: min=0 max=PQ_BIT **/ /** Set!: min=0 max=PQ_BIT **/
ap_uint<PQ_BIT> c1 = i << 1; // child node(left) ap_uint<PQ_BIT> c1 = i << 1; // child node(left)
ap_uint<PQ_BIT> c2 = c1 + 1; // child node(right) ap_uint<PQ_BIT> c2 = c1 + 1; // child node(right)
......
...@@ -29,11 +29,11 @@ using namespace std; ...@@ -29,11 +29,11 @@ using namespace std;
#define MAX_CELLS 41472 // Max #cells (16bit) #define MAX_CELLS 41472 // Max #cells (16bit)
#define MAX_LINES 1024 // Max #lines (10bit) #define MAX_LINES 1024 // Max #lines (10bit)
#define MAX_PQ 32768 // Queue size (15bit) #define MAX_PQ 16384 // Queue size (14bit)
#define MAX_BUFFER 16384 // Line buffer size (14bit) #define MAX_BUFFER 16384 // Line buffer size (14bit)
#define CELL_BIT 16 #define CELL_BIT 16
#define LINE_BIT 10 #define LINE_BIT 10
#define PQ_BIT 15 #define PQ_BIT 14
#define BUFF_BIT 14 #define BUFF_BIT 14
#define PQ_PRIORITY_WIDTH 16 #define PQ_PRIORITY_WIDTH 16
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment