#include "SSProc.h" #include "stdlib.h" #include void SSProcAndNF( hls::stream &inMatchPt, hls::stream &outLRPt, ap_uint<1> enable_SS_proc ) { #if !(VITIS_HLS) #pragma HLS DATA_PACK variable=inMatchPt #pragma HLS DATA_PACK variable=outLRPt #else #pragma HLS aggregate variable=inMatchPt compact=bit #pragma HLS aggregate variable=outLRPt compact=bit #endif #pragma HLS INTERFACE axis register both port=inMatchPt #pragma HLS INTERFACE axis register both port=outLRPt #pragma HLS INTERFACE mode=ap_none port=enable_SS_proc register static SRowData left_buf[ROW_COUNT]; //size = 4k * 72 = 288kbit, RAM36 * 8 #pragma HLS BIND_STORAGE variable=left_buf type=ram_2p impl=bram #pragma HLS RESET variable=left_buf off static SRowData right_buf[ROW_COUNT]; #pragma HLS BIND_STORAGE variable=right_buf type=ram_2p impl=bram #pragma HLS RESET variable=right_buf off static SLineMatchInfo matchInfo_buf[ROW_COUNT]; #pragma HLS BIND_STORAGE variable=matchInfo_buf type=ram_2p impl=bram #pragma HLS RESET variable=matchInfo_buf off // No per-frame clear: receive overwrites every row used by either pass. // Input protocol: dense rows, valid header bounds, matchNum/ptNum <= 2. SLRMatchOutput InData; ap_uint<2> VSync; while(1) //wait for vSync signal { #pragma HLS LOOP_TRIPCOUNT min=1 max=1 InData = inMatchPt.read(); VSync = InData.syncWord; if(0b10 == VSync) //wait for syncFirst break; } uint32_t frmNo, timeStamp, encInfo; uint16_t minY, maxY; UintFloat inTmp; inTmp.fdata = InData.left_pt1.x; frmNo = inTmp.unData; inTmp.fdata = InData.left_pt2.x; timeStamp = inTmp.unData; inTmp.fdata = InData.right_pt1.x; encInfo = inTmp.unData; inTmp.fdata = InData.right_pt2.x; minY = inTmp.unData & 0xffff; maxY = inTmp.unData >> 16; const uint16_t header_max_y = maxY; const bool valid_range = minY <= maxY && maxY < ROW_COUNT; bool received_rows = false; uint16_t total_match_size = 0; SS_RECEIVE: for(uint16_t n = minY; valid_range && n <= header_max_y; n ++) { #pragma HLS LOOP_TRIPCOUNT min=1 max=3072 #pragma HLS PIPELINE II=1 InData = inMatchPt.read(); SRowData left_line, right_line; left_line.ptNum = InData.left_ptNum; left_line.pt1 = InData.left_pt1; left_line.pt2 = InData.left_pt2; right_line.ptNum = InData.right_ptNum; right_line.pt1 = InData.right_pt1; right_line.pt2 = InData.right_pt2; SLineMatchInfo line_match; line_match = InData.matchInfo; left_buf[n] = left_line; right_buf[n] = right_line; matchInfo_buf[n] = line_match; total_match_size += line_match.matchNum; received_rows = true; maxY = n; // Only scan rows received in this invocation. if(0b11 == InData.syncWord) { break; } } //step 4: single side processing, target II = 2 (top-down + bottom-up) //single side processing if(enable_SS_proc == 1 && received_rows) { SPointMatchInfo null_match; null_match.match_flag = 0; null_match.match_seg_id = 0; null_match.pt_idx_L = 0; null_match.pt_idx_R = 0; null_match.rid_L = 0; null_match.rid_R = 0; //top - down SPointMatchInfo match1 = null_match; SPointMatchInfo match2 = null_match; SS_TOP_DOWN: for(uint16_t i = minY; i <= maxY; i ++) { #pragma HLS LOOP_TRIPCOUNT min=1 max=3072 #pragma HLS PIPELINE II=2 SRowData line_L = left_buf[i]; SRowData line_R = right_buf[i]; SLineMatchInfo a_lineMatch = matchInfo_buf[i]; SLineMatchInfo update_match = a_lineMatch; ap_uint<2> flag_L1 = line_L.pt1.matchFlag; ap_uint<2> flag_L2 = line_L.pt2.matchFlag; ap_uint<2> flag_R1 = line_R.pt1.matchFlag; ap_uint<2> flag_R2 = line_R.pt2.matchFlag; SPointMatchInfo pre_m1 = match1; SPointMatchInfo pre_m2 = match2; SPointMatchInfo curr_m1 = a_lineMatch.match1; SPointMatchInfo curr_m2 = a_lineMatch.match2; ap_uint<2> m1_newMatch = 0; ap_uint<2> m2_newMatch = 0; SPointMatchInfo new_m1 = null_match; SPointMatchInfo new_m2 = null_match; //single side match if(pre_m1.match_flag > 0) { if( (curr_m1.match_flag > 0) && (pre_m1.rid_L == curr_m1.rid_L) && (pre_m1.rid_R == curr_m1.rid_R)) //m1 <-> left_pt1 { new_m1 = curr_m1; m1_newMatch = 2; //inherit } else if ( (curr_m1.match_flag > 0) && (pre_m1.rid_L == curr_m1.rid_L) && (pre_m1.rid_R != curr_m1.rid_R)) { m1_newMatch = 0; } else if ( (curr_m1.match_flag > 0) && (pre_m1.rid_L != curr_m1.rid_L) && (pre_m1.rid_R == curr_m1.rid_R)) { m1_newMatch = 0; } else if( (curr_m2.match_flag > 0) && (pre_m1.rid_L == curr_m2.rid_L) && (pre_m1.rid_R == curr_m2.rid_R)) //m1 <-> left_pt1 { new_m1 = curr_m2; m1_newMatch = 2; //inherit } else if( (curr_m2.match_flag > 0) && (pre_m1.rid_L == curr_m2.rid_L) && (pre_m1.rid_R != curr_m2.rid_R)) //m1 <-> left_pt1 { m1_newMatch = 0; } else if( (curr_m2.match_flag > 0) && (pre_m1.rid_L != curr_m2.rid_L) && (pre_m1.rid_R == curr_m2.rid_R)) //m1 <-> left_pt1 { m1_newMatch = 0; } //start single side match check else if( (line_L.ptNum >= 1) && (pre_m1.rid_L != 0) && (pre_m1.rid_L == line_L.pt1.rid) && (line_L.pt1.matchFlag == 0)) { m1_newMatch = 1; //new single side new_m1.match_flag = 2; new_m1.match_seg_id = pre_m1.match_seg_id; new_m1.pt_idx_L = 1; new_m1.pt_idx_R = 0; new_m1.rid_L = pre_m1.rid_L; new_m1.rid_R = pre_m1.rid_R; } else if( (line_L.ptNum >= 2) && (pre_m1.rid_L != 0) && (pre_m1.rid_L == line_L.pt2.rid) && (line_L.pt2.matchFlag == 0)) { m1_newMatch = 1; //new single side new_m1.match_flag = 2; new_m1.match_seg_id = pre_m1.match_seg_id; new_m1.pt_idx_L = 2; new_m1.pt_idx_R = 0; new_m1.rid_L = pre_m1.rid_L; new_m1.rid_R = pre_m1.rid_R; } else if( (line_R.ptNum >= 1) && (pre_m1.rid_R != 0) && (pre_m1.rid_R == line_R.pt1.rid) && (line_R.pt1.matchFlag == 0)) { m1_newMatch = 1; //new single side new_m1.match_flag = 3; new_m1.match_seg_id = pre_m1.match_seg_id; new_m1.pt_idx_L = 0; new_m1.pt_idx_R = 1; new_m1.rid_L = pre_m1.rid_L; new_m1.rid_R = pre_m1.rid_R; } else if( (line_R.ptNum >= 2) && (pre_m1.rid_R != 0) && (pre_m1.rid_R == line_R.pt2.rid) && (line_R.pt2.matchFlag == 0)) { m1_newMatch = 1; //new single side new_m1.match_flag = 3; new_m1.match_seg_id = pre_m1.match_seg_id; new_m1.pt_idx_L = 0; new_m1.pt_idx_R = 2; new_m1.rid_L = pre_m1.rid_L; new_m1.rid_R = pre_m1.rid_R; } } //2nd if(pre_m2.match_flag > 0) { if( (curr_m1.match_flag > 0) && (pre_m2.rid_L == curr_m1.rid_L) && (pre_m2.rid_R == curr_m1.rid_R)) //m1 <-> left_pt1 { new_m2 = curr_m1; m2_newMatch = 2; //inherit } else if ( (curr_m1.match_flag > 0) && (pre_m2.rid_L == curr_m1.rid_L) && (pre_m2.rid_R != curr_m1.rid_R)) { m2_newMatch = 0; } else if ( (curr_m1.match_flag > 0) && (pre_m2.rid_L != curr_m1.rid_L) && (pre_m2.rid_R == curr_m1.rid_R)) { m2_newMatch = 0; } else if( (curr_m2.match_flag > 0) && (pre_m2.rid_L == curr_m2.rid_L) && (pre_m2.rid_R == curr_m2.rid_R)) //m1 <-> left_pt1 { new_m2 = curr_m2; m2_newMatch = 2; //inherit } else if((curr_m2.match_flag > 0) && (pre_m2.rid_L == curr_m2.rid_L) && (pre_m2.rid_R != curr_m2.rid_R)) //m1 <-> left_pt1 { m2_newMatch = 0; } else if((curr_m2.match_flag > 0) && (pre_m2.rid_L != curr_m2.rid_L) && (pre_m2.rid_R == curr_m2.rid_R)) //m1 <-> left_pt1 { m2_newMatch = 0; } //start single side match check else if( (line_L.ptNum >= 1) && (pre_m2.rid_L != 0) && (pre_m2.rid_L == line_L.pt1.rid) && (line_L.pt1.matchFlag == 0)) { m2_newMatch = 1; //new single side new_m2.match_flag = 2; new_m2.match_seg_id = pre_m2.match_seg_id; new_m2.pt_idx_L = 1; new_m2.pt_idx_R = 0; new_m2.rid_L = pre_m2.rid_L; new_m2.rid_R = pre_m2.rid_R; } else if( (line_L.ptNum >= 2) && (pre_m2.rid_L != 0) && (pre_m2.rid_L == line_L.pt2.rid) && (line_L.pt2.matchFlag == 0)) { m2_newMatch = 1; //new single side new_m2.match_flag = 2; new_m2.match_seg_id = pre_m2.match_seg_id; new_m2.pt_idx_L = 2; new_m2.pt_idx_R = 0; new_m2.rid_L = pre_m2.rid_L; new_m2.rid_R = pre_m2.rid_R; } else if( (line_R.ptNum >= 1) && (pre_m2.rid_R != 0) && (pre_m2.rid_R == line_R.pt1.rid) && (line_R.pt1.matchFlag == 0)) { m2_newMatch = 1; //new single side new_m2.match_flag = 3; new_m2.match_seg_id = pre_m2.match_seg_id; new_m2.pt_idx_L = 0; new_m2.pt_idx_R = 1; new_m2.rid_L = pre_m2.rid_L; new_m2.rid_R = pre_m2.rid_R; } else if( (line_R.ptNum >= 2) && (pre_m2.rid_R != 0) && (pre_m2.rid_R == line_R.pt2.rid) && (line_R.pt2.matchFlag == 0)) { m2_newMatch = 1; //new single side new_m2.match_flag = 3; new_m2.match_seg_id = pre_m2.match_seg_id; new_m2.pt_idx_L = 0; new_m2.pt_idx_R = 2; new_m2.rid_L = pre_m2.rid_L; new_m2.rid_R = pre_m2.rid_R; } } match1 = (m1_newMatch != 0) ? new_m1 : null_match; match2 = (m2_newMatch != 0) ? new_m2 : null_match; //update LR match for next using if( (m1_newMatch == 0) && (m2_newMatch == 0))//m1 and m2 have no match { if( (curr_m1.match_flag == 1) && (curr_m2.match_flag == 1)) { //a_lineMatch.match1 and a_lineMatch.match2 are new L-R match match1 = curr_m1; match2 = curr_m2; } else if (curr_m1.match_flag == 1) { //a_lineMatch.match1 is a new L-R match match1 = curr_m1; match2 = null_match; } else if(curr_m2.match_flag == 1) { //a_lineMatch.match2 is a new L-R match match1 = curr_m2; match2 = null_match; } else { match1 = null_match; match2 = null_match; } } else if((m1_newMatch == 0) && (m2_newMatch > 0)) //m1 has no match, but m2 is matched { if((curr_m1.match_flag == 1) && ((new_m2.rid_L != curr_m1.rid_L)||(new_m2.rid_R != curr_m1.rid_R))) { //a_lineMatch.match1 is a new L-R match match1 = curr_m1; } else if((curr_m2.match_flag == 1) && ((new_m2.rid_L != curr_m2.rid_L)||(new_m2.rid_R != curr_m2.rid_R))) { //a_lineMatch.match2 is a new L-R match match1 = curr_m2; } else { //only one L-R match, move m2 to m1 match1 = match2; match2 = null_match; } } else if((m1_newMatch > 0) && (m2_newMatch == 0))//m2 has no match, but m1 is matched { if((curr_m1.match_flag == 1) && ((new_m1.rid_L != curr_m1.rid_L)||(new_m1.rid_R != curr_m1.rid_R))) { //a_lineMatch.match1 is a new L-R match match2 = curr_m1; } else if((curr_m2.match_flag == 1) && ((new_m1.rid_L != curr_m2.rid_L)||(new_m1.rid_R != curr_m2.rid_R))) { //a_lineMatch.match2 is a new L-R match match2 = curr_m2; } else { match2 = null_match; } } //update current new match. Parallel compare if(a_lineMatch.matchNum == 0) { if( (m1_newMatch == 1) && (m2_newMatch == 1)) { update_match.matchNum = 2; update_match.match1 = new_m1; update_match.match2 = new_m2; if(new_m1.pt_idx_L == 1) flag_L1 = 2;//new_m1.match_flag; else if(new_m1.pt_idx_L == 2) flag_L2 = 2;//new_m1.match_flag; else if(new_m1.pt_idx_R == 1) flag_R1 = 3;//new_m1.match_flag; else if(new_m1.pt_idx_R == 2) flag_R2 = 3;//new_m1.match_flag; if(new_m2.pt_idx_L == 1) flag_L1 = 2;//new_m2.match_flag; else if(new_m2.pt_idx_L == 2) flag_L2 = 2;//new_m2.match_flag; else if(new_m2.pt_idx_R == 1) flag_R1 = 3;//new_m2.match_flag; else if(new_m2.pt_idx_R == 2) flag_R2 = 3;//new_m2.match_flag; } else if(m1_newMatch == 1) { update_match.matchNum = 1; update_match.match1 = new_m1; update_match.match2 = null_match; if(new_m1.pt_idx_L == 1) flag_L1 = 2;//new_m1.match_flag; else if(new_m1.pt_idx_L == 2) flag_L2 = 2;//new_m1.match_flag; else if(new_m1.pt_idx_R == 1) flag_R1 = 3;//new_m1.match_flag; else if(new_m1.pt_idx_R == 2) flag_R2 = 3;//new_m1.match_flag; } else if(m2_newMatch == 1) { update_match.matchNum = 1; update_match.match1 = new_m2; update_match.match2 = null_match; if(new_m2.pt_idx_L == 1) flag_L1 = 2;//new_m2.match_flag; else if(new_m2.pt_idx_L == 2) flag_L2 = 2;//new_m2.match_flag; else if(new_m2.pt_idx_R == 1) flag_R1 = 3;//new_m2.match_flag; else if(new_m2.pt_idx_R == 2) flag_R2 = 3;//new_m2.match_flag; } } else if(a_lineMatch.matchNum == 1) { if(m1_newMatch == 1) { update_match.matchNum = 2; update_match.match2 = new_m1; if(new_m1.pt_idx_L == 1) flag_L1 = 2;//new_m1.match_flag; else if(new_m1.pt_idx_L == 2) flag_L2 = 2;//new_m1.match_flag; else if(new_m1.pt_idx_R == 1) flag_R1 = 3;//new_m1.match_flag; else if(new_m1.pt_idx_R == 2) flag_R2 = 3;//new_m1.match_flag; } else if(m2_newMatch == 1) { update_match.matchNum = 2; update_match.match2 = new_m2; if(new_m2.pt_idx_L == 1) flag_L1 = 2;//new_m2.match_flag; else if(new_m2.pt_idx_L == 2) flag_L2 = 2;//new_m2.match_flag; else if(new_m2.pt_idx_R == 1) flag_R1 = 3;//new_m2.match_flag; else if(new_m2.pt_idx_R == 2) flag_R2 = 3;//new_m2.match_flag; } } // One write per flag field per row; all branch selection is local. left_buf[i].pt1.matchFlag = flag_L1; left_buf[i].pt2.matchFlag = flag_L2; right_buf[i].pt1.matchFlag = flag_R1; right_buf[i].pt2.matchFlag = flag_R2; total_match_size += (unsigned int)update_match.matchNum - (unsigned int)a_lineMatch.matchNum; matchInfo_buf[i] = update_match; //read - modify - write operation } // bottoom - up match1 = null_match; match2 = null_match; SS_BOTTOM_UP: for(int i = maxY; i >= (int)minY; i --) { #pragma HLS LOOP_TRIPCOUNT min=1 max=3072 #pragma HLS PIPELINE II=2 SRowData line_L = left_buf[i]; SRowData line_R = right_buf[i]; SLineMatchInfo a_lineMatch = matchInfo_buf[i]; SLineMatchInfo update_match = a_lineMatch; ap_uint<2> flag_L1 = line_L.pt1.matchFlag; ap_uint<2> flag_L2 = line_L.pt2.matchFlag; ap_uint<2> flag_R1 = line_R.pt1.matchFlag; ap_uint<2> flag_R2 = line_R.pt2.matchFlag; SPointMatchInfo pre_m1 = match1; SPointMatchInfo pre_m2 = match2; SPointMatchInfo curr_m1 = a_lineMatch.match1; SPointMatchInfo curr_m2 = a_lineMatch.match2; ap_uint<2> m1_newMatch = 0; ap_uint<2> m2_newMatch = 0; SPointMatchInfo new_m1 = null_match; SPointMatchInfo new_m2 = null_match; //single side match if(pre_m1.match_flag > 0) { if( (curr_m1.match_flag > 0) && (pre_m1.rid_L == curr_m1.rid_L) && (pre_m1.rid_R == curr_m1.rid_R)) //m1 <-> left_pt1 { new_m1 = curr_m1; m1_newMatch = 2; //inherit } else if ( (curr_m1.match_flag > 0) && (pre_m1.rid_L == curr_m1.rid_L) && (pre_m1.rid_R != curr_m1.rid_R)) { m1_newMatch = 0; } else if ( (curr_m1.match_flag > 0) && (pre_m1.rid_L != curr_m1.rid_L) && (pre_m1.rid_R == curr_m1.rid_R)) { m1_newMatch = 0; } else if( (curr_m2.match_flag > 0) && (pre_m1.rid_L == curr_m2.rid_L) && (pre_m1.rid_R == curr_m2.rid_R)) //m1 <-> left_pt1 { new_m1 = curr_m2; m1_newMatch = 2; //inherit } else if( (curr_m2.match_flag > 0) && (pre_m1.rid_L == curr_m2.rid_L) && (pre_m1.rid_R != curr_m2.rid_R)) //m1 <-> left_pt1 { m1_newMatch = 0; } else if( (curr_m2.match_flag > 0) && (pre_m1.rid_L != curr_m2.rid_L) && (pre_m1.rid_R == curr_m2.rid_R)) //m1 <-> left_pt1 { m1_newMatch = 0; } //start single side match check else if( (line_L.ptNum >= 1) && (pre_m1.rid_L != 0) && (pre_m1.rid_L == line_L.pt1.rid) && (line_L.pt1.matchFlag == 0)) { m1_newMatch = 1; //new single side new_m1.match_flag = 2; new_m1.match_seg_id = pre_m1.match_seg_id; new_m1.pt_idx_L = 1; new_m1.pt_idx_R = 0; new_m1.rid_L = pre_m1.rid_L; new_m1.rid_R = pre_m1.rid_R; } else if( (line_L.ptNum >= 2) && (pre_m1.rid_L != 0) && (pre_m1.rid_L == line_L.pt2.rid) && (line_L.pt2.matchFlag == 0)) { m1_newMatch = 1; //new single side new_m1.match_flag = 2; new_m1.match_seg_id = pre_m1.match_seg_id; new_m1.pt_idx_L = 2; new_m1.pt_idx_R = 0; new_m1.rid_L = pre_m1.rid_L; new_m1.rid_R = pre_m1.rid_R; } else if( (line_R.ptNum >= 1) && (pre_m1.rid_R != 0) && (pre_m1.rid_R == line_R.pt1.rid) && (line_R.pt1.matchFlag == 0)) { m1_newMatch = 1; //new single side new_m1.match_flag = 3; new_m1.match_seg_id = pre_m1.match_seg_id; new_m1.pt_idx_L = 0; new_m1.pt_idx_R = 1; new_m1.rid_L = pre_m1.rid_L; new_m1.rid_R = pre_m1.rid_R; } else if( (line_R.ptNum >= 2) && (pre_m1.rid_R != 0) && (pre_m1.rid_R == line_R.pt2.rid) && (line_R.pt2.matchFlag == 0)) { m1_newMatch = 1; //new single side new_m1.match_flag = 3; new_m1.match_seg_id = pre_m1.match_seg_id; new_m1.pt_idx_L = 0; new_m1.pt_idx_R = 2; new_m1.rid_L = pre_m1.rid_L; new_m1.rid_R = pre_m1.rid_R; } } //2nd if(pre_m2.match_flag > 0) { if( (curr_m1.match_flag > 0) && (pre_m2.rid_L == curr_m1.rid_L) && (pre_m2.rid_R == curr_m1.rid_R)) //m1 <-> left_pt1 { new_m2 = curr_m1; m2_newMatch = 2; //inherit } else if ( (curr_m1.match_flag > 0) && (pre_m2.rid_L == curr_m1.rid_L) && (pre_m2.rid_R != curr_m1.rid_R)) { m2_newMatch = 0; } else if ( (curr_m1.match_flag > 0) && (pre_m2.rid_L != curr_m1.rid_L) && (pre_m2.rid_R == curr_m1.rid_R)) { m2_newMatch = 0; } else if( (curr_m2.match_flag > 0) && (pre_m2.rid_L == curr_m2.rid_L) && (pre_m2.rid_R == curr_m2.rid_R)) //m1 <-> left_pt1 { new_m2 = curr_m2; m2_newMatch = 2; //inherit } else if((curr_m2.match_flag > 0) && (pre_m2.rid_L == curr_m2.rid_L) && (pre_m2.rid_R != curr_m2.rid_R)) //m1 <-> left_pt1 { m2_newMatch = 0; } else if((curr_m2.match_flag > 0) && (pre_m2.rid_L != curr_m2.rid_L) && (pre_m2.rid_R == curr_m2.rid_R)) //m1 <-> left_pt1 { m2_newMatch = 0; } //start single side match check else if( (line_L.ptNum >= 1) && (pre_m2.rid_L != 0) && (pre_m2.rid_L == line_L.pt1.rid) && (line_L.pt1.matchFlag == 0)) { m2_newMatch = 1; //new single side new_m2.match_flag = 2; new_m2.match_seg_id = pre_m2.match_seg_id; new_m2.pt_idx_L = 1; new_m2.pt_idx_R = 0; new_m2.rid_L = pre_m2.rid_L; new_m2.rid_R = pre_m2.rid_R; } else if( (line_L.ptNum >= 2) && (pre_m2.rid_L != 0) && (pre_m2.rid_L == line_L.pt2.rid) && (line_L.pt2.matchFlag == 0)) { m2_newMatch = 1; //new single side new_m2.match_flag = 2; new_m2.match_seg_id = pre_m2.match_seg_id; new_m2.pt_idx_L = 2; new_m2.pt_idx_R = 0; new_m2.rid_L = pre_m2.rid_L; new_m2.rid_R = pre_m2.rid_R; } else if( (line_R.ptNum >= 1) && (pre_m2.rid_R != 0) && (pre_m2.rid_R == line_R.pt1.rid) && (line_R.pt1.matchFlag == 0)) { m2_newMatch = 1; //new single side new_m2.match_flag = 3; new_m2.match_seg_id = pre_m2.match_seg_id; new_m2.pt_idx_L = 0; new_m2.pt_idx_R = 1; new_m2.rid_L = pre_m2.rid_L; new_m2.rid_R = pre_m2.rid_R; } else if( (line_R.ptNum >= 2) && (pre_m2.rid_R != 0) && (pre_m2.rid_R == line_R.pt2.rid) && (line_R.pt2.matchFlag == 0)) { m2_newMatch = 1; //new single side new_m2.match_flag = 3; new_m2.match_seg_id = pre_m2.match_seg_id; new_m2.pt_idx_L = 0; new_m2.pt_idx_R = 2; new_m2.rid_L = pre_m2.rid_L; new_m2.rid_R = pre_m2.rid_R; } } match1 = (m1_newMatch != 0) ? new_m1 : null_match; match2 = (m2_newMatch != 0) ? new_m2 : null_match; //update LR match for next using if( (m1_newMatch == 0) && (m2_newMatch == 0))//m1 and m2 have no match { if( (curr_m1.match_flag == 1) && (curr_m2.match_flag == 1)) { //a_lineMatch.match1 and a_lineMatch.match2 are new L-R match match1 = curr_m1; match2 = curr_m2; } else if (curr_m1.match_flag == 1) { //a_lineMatch.match1 is a new L-R match match1 = curr_m1; match2 = null_match; } else if(curr_m2.match_flag == 1) { //a_lineMatch.match2 is a new L-R match match1 = curr_m2; match2 = null_match; } else { match1 = null_match; match2 = null_match; } } else if((m1_newMatch == 0) && (m2_newMatch > 0)) //m1 has no match, but m2 is matched { if((curr_m1.match_flag == 1) && ((new_m2.rid_L != curr_m1.rid_L)||(new_m2.rid_R != curr_m1.rid_R))) { //a_lineMatch.match1 is a new L-R match match1 = curr_m1; } else if((curr_m2.match_flag == 1) && ((new_m2.rid_L != curr_m2.rid_L)||(new_m2.rid_R != curr_m2.rid_R))) { //a_lineMatch.match2 is a new L-R match match1 = curr_m2; } else { //only one L-R match, move m2 to m1 match1 = match2; match2 = null_match; } } else if((m1_newMatch > 0) && (m2_newMatch == 0))//m2 has no match, but m1 is matched { if((curr_m1.match_flag == 1) && ((new_m1.rid_L != curr_m1.rid_L)||(new_m1.rid_R != curr_m1.rid_R))) { //a_lineMatch.match1 is a new L-R match match2 = curr_m1; } else if((curr_m2.match_flag == 1) && ((new_m1.rid_L != curr_m2.rid_L)||(new_m1.rid_R != curr_m2.rid_R))) { //a_lineMatch.match2 is a new L-R match match2 = curr_m2; } else { match2 = null_match; } } //update current new match. Parallel compare if(a_lineMatch.matchNum == 0) { if( (m1_newMatch == 1) && (m2_newMatch == 1)) { update_match.matchNum = 2; update_match.match1 = new_m1; update_match.match2 = new_m2; if(new_m1.pt_idx_L == 1) flag_L1 = 2;//new_m1.match_flag; else if(new_m1.pt_idx_L == 2) flag_L2 = 2;//new_m1.match_flag; else if(new_m1.pt_idx_R == 1) flag_R1 = 3;//new_m1.match_flag; else if(new_m1.pt_idx_R == 2) flag_R2 = 3;//new_m1.match_flag; if(new_m2.pt_idx_L == 1) flag_L1 = 2;//new_m2.match_flag; else if(new_m2.pt_idx_L == 2) flag_L2 = 2;//new_m2.match_flag; else if(new_m2.pt_idx_R == 1) flag_R1 = 3;//new_m2.match_flag; else if(new_m2.pt_idx_R == 2) flag_R2 = 3;//new_m2.match_flag; } else if(m1_newMatch == 1) { update_match.matchNum = 1; update_match.match1 = new_m1; update_match.match2 = null_match; if(new_m1.pt_idx_L == 1) flag_L1 = 2;//new_m1.match_flag; else if(new_m1.pt_idx_L == 2) flag_L2 = 2;//new_m1.match_flag; else if(new_m1.pt_idx_R == 1) flag_R1 = 3;//new_m1.match_flag; else if(new_m1.pt_idx_R == 2) flag_R2 = 3;//new_m1.match_flag; } else if(m2_newMatch == 1) { update_match.matchNum = 1; update_match.match1 = new_m2; update_match.match2 = null_match; if(new_m2.pt_idx_L == 1) flag_L1 = 2;//new_m2.match_flag; else if(new_m2.pt_idx_L == 2) flag_L2 = 2;//new_m2.match_flag; else if(new_m2.pt_idx_R == 1) flag_R1 = 3;//new_m2.match_flag; else if(new_m2.pt_idx_R == 2) flag_R2 = 3;//new_m2.match_flag; } } else if(a_lineMatch.matchNum == 1) { if(m1_newMatch == 1) { update_match.matchNum = 2; update_match.match2 = new_m1; if(new_m1.pt_idx_L == 1) flag_L1 = 2;//new_m1.match_flag; else if(new_m1.pt_idx_L == 2) flag_L2 = 2;//new_m1.match_flag; else if(new_m1.pt_idx_R == 1) flag_R1 = 3;//new_m1.match_flag; else if(new_m1.pt_idx_R == 2) flag_R2 = 3;//new_m1.match_flag; } else if(m2_newMatch == 1) { update_match.matchNum = 2; update_match.match2 = new_m2; if(new_m2.pt_idx_L == 1) flag_L1 = 2;//new_m2.match_flag; else if(new_m2.pt_idx_L == 2) flag_L2 = 2;//new_m2.match_flag; else if(new_m2.pt_idx_R == 1) flag_R1 = 3;//new_m2.match_flag; else if(new_m2.pt_idx_R == 2) flag_R2 = 3;//new_m2.match_flag; } } // One write per flag field per row; all branch selection is local. left_buf[i].pt1.matchFlag = flag_L1; left_buf[i].pt2.matchFlag = flag_L2; right_buf[i].pt1.matchFlag = flag_R1; right_buf[i].pt2.matchFlag = flag_R2; total_match_size += (unsigned int)update_match.matchNum - (unsigned int)a_lineMatch.matchNum; matchInfo_buf[i] = update_match; //read - modify - write operation } } LRMatchedPoint outWord = { 0.0f, 0.0f, 0, 0, 0, 0, 0, 0 }; UintFloat outTmp; //first outTmp.unData = frmNo; outWord.xL = outTmp.fdata; outTmp.unData = timeStamp; outWord.xR = outTmp.fdata; outWord.Sync = 0b10; outLRPt.write(outWord); //second outTmp.unData = encInfo; outWord.xL = outTmp.fdata; outTmp.unData = (uint32_t)minY | ((uint32_t)maxY << 16); outWord.xR = outTmp.fdata; outWord.Sync = 0b00; outLRPt.write(outWord); //3rd outTmp.unData = total_match_size; outWord.xL = outTmp.fdata; outWord.xR = 0.0f; if(total_match_size == 0) outWord.Sync = 0b11; else outWord.Sync = 0b00; outLRPt.write(outWord); if(total_match_size > 0) { //output uint16_t counter = 0; SS_OUTPUT: for(uint16_t i = minY; i<= maxY; i ++) { #pragma HLS LOOP_TRIPCOUNT min=1 max=3072 #pragma HLS PIPELINE II=2 SLineMatchInfo a_lineMatch = matchInfo_buf[i]; SRowData line_L = left_buf[i]; SRowData line_R = right_buf[i]; if(a_lineMatch.matchNum > 0) { //first outWord.matchFlag = a_lineMatch.match1.match_flag; outWord.match_seg_id = a_lineMatch.match1.match_seg_id; outWord.y = i; if(a_lineMatch.match1.pt_idx_L == 1) { outWord.xL = line_L.pt1.x; outWord.valueL = line_L.pt1.value; } else if(a_lineMatch.match1.pt_idx_L == 2) { outWord.xL = line_L.pt2.x; outWord.valueL = line_L.pt2.value; } else { outWord.xL = 0.0f; outWord.valueL = 0; } //right if(a_lineMatch.match1.pt_idx_R == 1) { outWord.xR = line_R.pt1.x; outWord.valueR = line_R.pt1.value; } else if(a_lineMatch.match1.pt_idx_R == 2) { outWord.xR = line_R.pt2.x; outWord.valueR = line_R.pt2.value; } else { outWord.xR = 0.0f; outWord.valueR = 0; } counter ++; if(counter == total_match_size) outWord.Sync = 0b11; else outWord.Sync = 0b00; //output outLRPt.write(outWord); } if(a_lineMatch.matchNum == 2) { //second outWord.matchFlag = a_lineMatch.match2.match_flag; outWord.match_seg_id = a_lineMatch.match2.match_seg_id; outWord.y = i; if(a_lineMatch.match2.pt_idx_L == 1) { outWord.xL = line_L.pt1.x; outWord.valueL = line_L.pt1.value; } else if(a_lineMatch.match2.pt_idx_L == 2) { outWord.xL = line_L.pt2.x; outWord.valueL = line_L.pt2.value; } else { outWord.xL = 0.0f; outWord.valueL = 0; } //right if(a_lineMatch.match2.pt_idx_R == 1) { outWord.xR = line_R.pt1.x; outWord.valueR = line_R.pt1.value; } else if(a_lineMatch.match2.pt_idx_R == 2) { outWord.xR = line_R.pt2.x; outWord.valueR = line_R.pt2.value; } else { outWord.xR = 0.0f; outWord.valueR = 0; } counter ++; if(counter == total_match_size) outWord.Sync = 0b11; else outWord.Sync = 0b00; //output outLRPt.write(outWord); } } } }