Something went wrong on our end
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