@@ -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