Skip to content
Snippets Groups Projects
wino_buffer.cpp 16.71 KiB


#ifndef _WINO_BUFFER_HPP_
#define _WINO_BUFFER_HPP_
#include "wino_macro.h"
#include "../software/param.h"
#include <ap_int.h>
#include <hls_stream.h>


void input_feed_underconstruction(
	ap_uint<16> input_buffer[INBUFFER_HEIGHT][INBUFFER_WIDTH][INPUT_BUFFER_DEPTH],
	// hls::stream< ap_uint<16*BATCH_SIZE*36> > &input_tile_stream1, 
	// hls::stream< ap_uint<16*BATCH_SIZE*36> > &input_tile_stream2,
	ap_uint<16> inheight,
	ap_uint<16> inwidth,
	ap_uint<16> pad_size,
	ap_uint<16> weightbuffer_load_indepth_number,
	ap_uint<16> weightbuffer_load_outdepth_number,
	ap_uint<16> wino_output_tile_size,
	ap_uint<32> input_buffer_feeding_loop_bound,
	ap_uint<16> loop_wino_tile_col_reset_cycle,
	ap_uint<16> loop_outdepth_minitile_baseidx_reset_cycle,
	ap_uint<10> buffer_address_mid_minitile_depth_step,
	ap_uint<16> wino_out_size_by_wino_width,
	ap_uint<16> start_row_idx,
	ap_int<16> start_row_idx_minus_pad_size
	#if DEBUG_FILE_PRINT
	,ConvDesc_t conv_desc
	#endif
)
{
	// row_selection preparation 
	ap_uint<1> row_legal_flag[WINO_DOMAIN_SIZE];
	#pragma HLS array_partition variable=row_legal_flag complete
	ap_uint<1> row_address_offset[INBUFFER_HEIGHT];
	#pragma HLS array_partition variable=row_address_offset complete
	ap_uint<INBUFFER_HEIGHT_BITWIDTH> row_bank_idx[WINO_DOMAIN_SIZE];
	#pragma HLS array_partition variable=row_bank_idx complete

	//  = wino_output_tile_size<<WINO_WIDTH_BITWIDTH;

	ap_uint<INBUFFER_HEIGHT_BITWIDTH> row_breakpoint = start_row_idx_minus_pad_size.range(INBUFFER_HEIGHT_BITWIDTH-1,0);

	for(int i=0;i<8;i++)
	{
	#pragma HLS unroll
		if(i< row_breakpoint)
			row_address_offset[i] = ~start_row_idx_minus_pad_size[INBUFFER_HEIGHT_BITWIDTH];
		else
			row_address_offset[i] = start_row_idx_minus_pad_size[INBUFFER_HEIGHT_BITWIDTH];
	}			
	for(int i=0;i<6;i++)
	{
	#pragma HLS unroll
		row_bank_idx[i] = start_row_idx_minus_pad_size+i;
		row_legal_flag[i] = ( start_row_idx_minus_pad_size+i >=0 && start_row_idx_minus_pad_size+i < inheight);
	}

	
	ap_int<10> input_col_idx[WINO_WIDTH][WINO_DOMAIN_SIZE];
	#pragma HLS array_partition variable=input_col_idx dim=1 complete
	#pragma HLS array_partition variable=input_col_idx dim=2 complete

	ap_uint<16> wino_col_offset_constant[WINO_WIDTH];
	#pragma HLS array_partition variable=wino_col_offset_constant complete

	for(int i=0;i<WINO_WIDTH;i++)
	{
		#pragma HLS unroll