Skip to content

Commit

Permalink
Testing benchmark for streaming Quartus
Browse files Browse the repository at this point in the history
  • Loading branch information
bo3z committed May 31, 2022
1 parent 739cb4a commit 0fbf3c7
Show file tree
Hide file tree
Showing 2 changed files with 76 additions and 3 deletions.
2 changes: 2 additions & 0 deletions hls4ml/templates/quartus/myproject_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@
#include "firmware/parameters.h"
#include "firmware/myproject.h"

#include "firmware/nnet_utils/nnet_helpers.h"

#define CHECKPOINT 5000

// This function is written to avoid stringstream, which is
Expand Down
77 changes: 74 additions & 3 deletions hls4ml/writer/quartus_writer.py
Original file line number Diff line number Diff line change
Expand Up @@ -330,9 +330,80 @@ def write_test_bench(self, model):
else:
newline = line
fout.write(newline)
else:
# Temporary change, to allow compilation
pass
elif model.config.get_config_value('IOType') == 'io_stream':
for line in f.readlines():
indent = ' ' * (len(line) - len(line.lstrip(' ')))

# TODO - Works only with one input/output

# Insert numbers
if 'myproject' in line:
newline = line.replace('myproject', model.config.get_project_name())
elif '//hls-fpga-machine-learning insert data' in line:
newline = line
newline += ' int in_begin = 0; \n'
newline += ' int in_end; \n'
newline += ' inputs.emplace_back(); \n'
for inp in model.get_input_variables():
newline += f' in_end = in_begin + ({inp.size_cpp()}); \n'
newline += f' float vals[{inp.size_cpp()}]; \n'
newline += f' for (int j = in_begin ; j < in_end ; j++) {{'
newline += f' vals[j%{inp.size_cpp()}] = in[j]; \n'
newline += f' }}'
newline += f' nnet::convert_data<float, {inp.type.name}, {inp.size_cpp()}>(vals, inputs[0].{inp.member_name});\n'
newline += f' in_begin = in_end; \n'
newline += f' outputs.emplace_back(); \n'
elif '//hls-fpga-machine-learning insert zero' in line:
newline = line
newline += indent + 'for(int i = 0; i < num_iterations; i++) {\n'
for inp in model.get_input_variables():
newline += indent + f' inputs.emplace_back(); \n'
newline += indent + f' outputs.emplace_back(); \n'
newline += f' float vals[{inp.size_cpp()}]; \n'
newline += f' for (int j = 0 ; j < {inp.size_cpp()} ; j++) {{ \n'
newline += f' vals[j%{inp.size_cpp()}] = 0.0; \n'
newline += f' }}'
newline += f' nnet::convert_data<float, {inp.type.name}, {inp.size_cpp()}>(vals, inputs[0].{inp.member_name}); \n'
newline += indent + '} \n'

elif '//hls-fpga-machine-learning insert top-level-function' in line:
newline = line

newline += indent + 'for(int i = 0; i < num_iterations; i++) { \n'
newline += indent + f' ihc_hls_enqueue(&outputs[i], {model.config.get_project_name()}, inputs[i]); \n'
newline += indent + '} \n'
elif 'hls-fpga-machine-learning insert run' in line:
newline = line
newline += ' ' + 'ihc_hls_component_run_all({}); \n'.format(model.config.get_project_name())
elif '//hls-fpga-machine-learning insert predictions' in line:
newline = line
newline += indent + 'for(int i = 0; i < {}; i++) {{ \n'.format(outvar.size_cpp())
newline += indent + ' std::cout << predictions[j][i] << " "; \n'
newline += indent + '}\n'
newline += indent + 'std::cout << std::endl; \n'
elif '//hls-fpga-machine-learning insert tb-output' in line:
newline = line
newline += indent + 'float res_tb[{}]; \n'.format(outvar.size_cpp())
newline += indent + 'nnet::convert_data_back<{}, float, {}>(outputs[0].{}, res_tb); \n'.format(outvar.type.name,
outvar.size_cpp(),
outvar.member_name)
newline += indent + 'for(int i = 0; i < {}; i++) {{\n'.format(outvar.size_cpp())
newline += indent + ' fout << res_tb[i] << " "; \n'
newline += indent + '} \n'
newline += indent + 'fout << std::endl; \n'
elif '//hls-fpga-machine-learning insert output' in line or '//hls-fpga-machine-learning insert quantized' in line:
newline = line
newline += indent + 'float res[{}]; \n'.format(outvar.size_cpp())
newline += indent + 'nnet::convert_data_back<{}, float, {}>(outputs[0].{}, res); \n'.format(outvar.type.name,
outvar.size_cpp(),
outvar.member_name)
newline += indent + 'for(int i = 0; i < {}; i++) {{\n'.format(outvar.size_cpp())
newline += indent + ' std::cout << res[i] << " "; \n'
newline += indent + '} \n'
newline += indent + 'std::cout << std::endl; \n'
else:
newline = line
fout.write(newline)

f.close()
fout.close()
Expand Down

0 comments on commit 0fbf3c7

Please sign in to comment.