Skip to content
Snippets Groups Projects
Commit 8a1853a6 authored by auphelia's avatar auphelia
Browse files

[Code gen] Added define, includes and part of read_npy_data functions to code generation

parent 430af8df
No related branches found
No related tags found
No related merge requests found
import finn.core.utils as utils
def global_includes(node, code_gen_dict):
code_gen_dict["$GLOBALS$"]=[]
if node.op_type == 'StreamingMaxPool':
code_gen_dict["$GLOBALS$"].append('#include "maxpool.h"')
def defines(node, code_gen_dict):
code_gen_dict["$DEFINES$"]=[]
if node.op_type == 'StreamingMaxPool':
ImgDim = utils.get_by_name(node.attribute, 'ImgDim').i
PoolDim = utils.get_by_name(node.attribute, 'PoolDim').i
NumChannels = utils.get_by_name(node.attribute, 'NumChannels').i
code_gen_dict["$DEFINES$"].append('#define ImgDim '+str(ImgDim)+'\n #define PoolDim ' +str(PoolDim)+'\n #define NumChannels ' +str(NumChannels))
def read_npy_data(node, code_gen_dict):
code_gen_dict["$READNPDATA$"]=[]
input_ind = 0
input_file_names = []
for inputs in node.input:
input_file_names.append("input_{}.npy".format(input_ind))
input_ind += 1
if node.op_type == 'StreamingMaxPool':
NumChannels = utils.get_by_name(node.attribute, 'NumChannels').i
input_ind = 0
for input_file in input_file_names:
code_gen_dict["$READNPDATA$"].append('cnpy::NpyArray arr = cnpy::npy_load("{}");\n float* loaded_data{} = arr.data<float>();'.format(input_file, input_ind))
code_gen_dict["$READNPDATA$"].append('int num_values = 1; \n for(int i = 0; i < arr.shape.size(); i++){\n num_values *= arr.shape[i]; \n }')
input_ind+=1
def execute(node, context, graph):
......@@ -22,12 +54,10 @@ def execute(node, context, graph):
output_interface k;
$READNPYDATA$
$STREAMDECLARATIONS$
$STREAMPRAGMAS$
$DATAINSTREAM$
$READNPYDATA$
$DOCOMPUTE$
......@@ -38,6 +68,11 @@ def execute(node, context, graph):
}
"""
code_gen_dict={}
global_includes(node, code_gen_dict)
defines(node, code_gen_dict)
read_npy_data(node, code_gen_dict)
print(code_gen_dict)
print("\n\n Set up for code generation of single not in progress! \n\n")
......@@ -21,10 +21,15 @@ def execute_custom_node(node, context, graph):
temp_files.append("input_{}.npy".format(in_ind))
in_ind += 1
output = np.load("output.npy")
print(output)
code_gen.execute(node, context, graph)
output = np.load("output.npy")
for i in range(output.shape[0]):
print(np.transpose(output[i]))
## deleting temporary files
#for temp_file in temp_files:
# os.remove(temp_file)
......
......@@ -15,25 +15,25 @@ int main(){
output_interface k;
cnpy::NpyArray arr = cnpy::npy_load("input_0.npy");
float* loaded_data = arr.data<float>();
int Nx = arr.shape[0];
int Ny = arr.shape[1];
int Nz = arr.shape[2];
int num_values = 1;
for(int i = 0; i < arr.shape.size(); i++){
num_values *= arr.shape[i];
}
hls::stream<ap_uint<2>> in ("in");
hls::stream<ap_uint<2>> out ("out");
ap_uint<2> in_data;
#pragma HLS DATAFLOW
#pragma HLS stream depth=1024 variable=in
#pragma HLS stream depth=1024 variable=out
for(int i=0;i < Nx*Ny*Nz;i++){
in << loaded_data[i];
ap_uint<2> dat;
for(int i=0;i < num_values; i+=2){
dat.range(0,0) = loaded_data[i];
dat.range(1,1) = loaded_data[i+1];
in << loaded_data[dat];
}
//while(in.read_nb(i.last_data)){
// i.data.push_back(i.last_data);
//}
//for(std::vector<ap_uint<2>>::iterator it = i.data.begin(); it!= i.data.end(); ++it){
// std::cout << "Next value: " << *it << std::endl;
//}
StreamingMaxPool<ImgDim, PoolDim, NumChannels>(in, out);
while(out.read_nb(k.last_data)){
k.data.push_back(k.last_data);
......@@ -43,9 +43,9 @@ int main(){
ap_uint<2> test = *it;
output_data.push_back(test.range(0,0));
output_data.push_back(test.range(1,1));
}
}
cnpy::npy_save("output.npy",&output_data[0],{2,2,2},"w");
......
No preview for this file type
......@@ -77,3 +77,4 @@ def test_layer_streaming_maxpool():
input_dict = {"in": input_tensor}
output_dict = oxe.execute_onnx(model, input_dict)
print(output_dict[outp])
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment