Skip to content

Commit 951a1f6

Browse files
committed
Restartable kernel for io_parallel.
1 parent 34f0d82 commit 951a1f6

File tree

1 file changed

+23
-6
lines changed

1 file changed

+23
-6
lines changed

hls4ml/writer/oneapi_writer.py

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -137,8 +137,15 @@ def write_project_cpp(self, model):
137137
elif '// hls-fpga-machine-learning read in' in line:
138138
newline = line
139139
if io_type == 'io_parallel':
140+
restartable_kernel_loop = (
141+
f"bool keep_going = true;\n\n"
142+
f"{indent}[[intel::initiation_interval(1)]]\n"
143+
f"{indent}while (keep_going) {{\n"
144+
)
145+
newline += indent + restartable_kernel_loop
140146
for inp in model_inputs:
141-
newline += indent + f'auto {inp.name} = {inp.pipe_name}::read();\n'
147+
newline += indent * 2 + f'auto {inp.name}_beat = {inp.pipe_name}::read();\n'
148+
newline += indent * 2 + f'auto {inp.name} = {inp.name}_beat.data;\n'
142149
# for streaming we don't need to read it in
143150

144151
# Insert weights
@@ -151,31 +158,36 @@ def write_project_cpp(self, model):
151158

152159
# Insert task sequences
153160
elif '// hls-fpga-machine-learning declare task sequences' in line:
154-
newline = line
155161
if io_type == 'io_stream': # only need this for io_stream
162+
newline = line
156163
for layer in model.get_layers():
157164
ts = layer.get_attr('tast_sequence_cpp')
158165
if ts:
159166
newline += ' ' + ts + '\n'
167+
else:
168+
newline = indent + line
160169

161170
# Neural net instantiation
162171
elif '// hls-fpga-machine-learning insert layers' in line:
163-
newline = line + '\n'
172+
if io_type == 'io_parallel':
173+
newline = indent + line + '\n'
174+
else:
175+
newline = line + '\n'
164176
for layer in model.get_layers():
165177
if io_type != 'io_stream':
166178
vars = layer.get_variables()
167179
for var in vars:
168180
if var not in model_inputs:
169181
def_cpp = var.definition_cpp()
170182
if def_cpp is not None:
171-
newline += ' ' + def_cpp + ';\n'
183+
newline += indent * 2 + def_cpp + ';\n'
172184
func = (
173185
layer.get_attr('function_cpp')
174186
if io_type == 'io_parallel'
175187
else layer.get_attr('stream_function_cpp')
176188
)
177189
if func:
178-
newline += ' ' + func + '\n'
190+
newline += (indent * 2 if io_type == 'io_parallel' else indent) + func + '\n'
179191
if model.config.trace_output and layer.get_attr('trace', False):
180192
newline += '#ifndef HLS_SYNTHESIS\n'
181193
for var in vars:
@@ -188,8 +200,13 @@ def write_project_cpp(self, model):
188200
elif '// hls-fpga-machine-learning return' in line:
189201
newline = line
190202
if io_type == 'io_parallel':
203+
newline = indent + newline
191204
for out in model_outputs:
192-
newline += indent + f'{out.pipe_name}::write({out.name});\n'
205+
out_beat = f"{out.name}_beat"
206+
newline += indent * 2 + f'typename nnet::ExtractPipeType<{out.pipe_name}>::value_type {out_beat};\n'
207+
newline += indent * 2 + f'{out_beat}.data = {out.name};\n'
208+
newline += indent * 2 + f'{out.pipe_name}::write({out_beat});\n'
209+
newline += f"{indent}}}\n"
193210
# don't need to add anything in io_stream
194211

195212
# Just copy line

0 commit comments

Comments
 (0)