3
3
from shutil import copy , copytree
4
4
5
5
from hls4ml .writer .vitis_writer import VitisWriter
6
- from hls4ml . backends import VitisAcceleratorConfig
6
+
7
7
8
8
class VitisAcceleratorWriter (VitisWriter ):
9
9
def __init__ (self ):
10
+
10
11
super ().__init__ ()
11
12
12
13
def create_accelerator_config (self , model ):
14
+ from hls4ml .backends import VitisAcceleratorConfig
15
+
13
16
self .vitis_accelerator_config = VitisAcceleratorConfig (model .config )
14
17
15
18
def write_parameters_overrides (self , model ):
@@ -91,32 +94,35 @@ def write_kernel(self, model):
91
94
Args:
92
95
model (ModelGraph): the hls4ml model.
93
96
"""
97
+ from hls4ml .backends import VitisAcceleratorConfig
94
98
95
99
filedir = os .path .dirname (os .path .abspath (__file__ ))
96
100
io_type = model .config .get_config_value ("IOType" )
97
101
98
102
# Writing header file
99
- f_header = open (os .path .join (filedir , '../templates/vitis_accelerator/kernel_wrapper_parallel_template .h' ))
103
+ f_header = open (os .path .join (filedir , '../templates/vitis_accelerator/kernel_wrapper .h' ))
100
104
fout_header = open (f'{ model .config .get_output_dir ()} /kernel_wrapper.h' , 'w' )
101
105
model_inputs = model .get_input_variables ()
102
106
model_outputs = model .get_output_variables ()
103
107
for line in f_header .readlines ():
104
108
if '// hls-fpga-machine-learning accelerator parameters' in line :
105
- newline += '#define NUM_CU ' + format (self .vitis_accelerator_config .get_kernelcount ()) + '\n '
106
- newline += '#define NUM_THREAD ' + format (self .vitis_accelerator_config .get_threadcount ()) + '\n '
109
+ newline = ''
110
+ newline += '#define NUM_CU ' + format (self .vitis_accelerator_config .get_num_kernel ()) + '\n '
111
+ newline += '#define NUM_THREAD ' + format (self .vitis_accelerator_config .get_num_thread ()) + '\n '
107
112
newline += '#define NUM_CHANNEL '
108
113
if self .vitis_accelerator_config .get_memory_type () == 'hbm' :
109
- newline += format (self .vitis_accelerator_config .get_memory_channel_count // (2 * self .vitis_accelerator_config .get_num_kernel ())) + '\n '
114
+ newline += format (self .vitis_accelerator_config .get_memory_channel_count () // (2 * self .vitis_accelerator_config .get_num_kernel ())) + '\n '
110
115
elif self .vitis_accelerator_config .get_memory_type () == 'ddr' :
111
116
newline += '1\n '
112
- newline += '#define BATCHSIZE ' + format (self .vitis_accelerator_config .get_threadcount ()) + '\n '
117
+ newline += '#define BATCHSIZE ' + format (self .vitis_accelerator_config .get_batchsize ()) + '\n '
113
118
elif '// hls-fpga-machine-learning accelerator io' in line :
119
+ newline = ''
114
120
if io_type == 'io_parallel' :
115
121
for inp in model_inputs :
116
122
for out in model_outputs :
117
123
newline += '#define DATA_SIZE_IN ' + format (inp .size_cpp ()) + '\n '
118
124
newline += '#define INSTREAMSIZE (BATCHSIZE * DATA_SIZE_IN)' + '\n \n '
119
- newline += '#define DATA_SIZE_OUT' + format (out .size_cpp ()) + '\n '
125
+ newline += '#define DATA_SIZE_OUT ' + format (out .size_cpp ()) + '\n '
120
126
newline += '#define OUTSTREAMSIZE (BATCHSIZE * DATA_SIZE_OUT)' + '\n \n '
121
127
newline += 'typedef ' + format (inp .type .name ) + ' in_buffer_t\n '
122
128
newline += 'typedef ' + format (out .type .name ) + ' out_buffer_t\n '
@@ -128,7 +134,7 @@ def write_kernel(self, model):
128
134
newline += '#define DATA_SIZE_IN ' + ' * ' .join (dims ) + '\n '
129
135
newline += '#define NNET_ARRAY_DEPTH ' + format (nnet_array_depth ) + '\n '
130
136
newline += '#define INSTREAMSIZE (BATCHSIZE * DATA_SIZE_IN * NNET_ARRAY_DEPTH)' + '\n \n '
131
- newline += '#define DATA_SIZE_OUT' + format (out .size_cpp ()) + '\n '
137
+ newline += '#define DATA_SIZE_OUT ' + format (out .size_cpp ()) + '\n '
132
138
newline += '#define OUTSTREAMSIZE (BATCHSIZE * DATA_SIZE_OUT)' + '\n \n '
133
139
precision_str = model .config .backend .convert_precision_string (model .config .model_precision .get ('default' ))
134
140
newline += 'typedef ' + precision_str + ' in_buffer_t\n '
@@ -137,11 +143,12 @@ def write_kernel(self, model):
137
143
newline = line
138
144
fout_header .write (newline )
139
145
f_header .close ()
146
+ fout_header .close ()
140
147
141
148
# Writing source file
142
- f_source = os .path .join (filedir , '../templates/vitis_accelerator/kernel_wrapper_' + io_type + '.cpp' )
149
+ f_source = open ( os .path .join (filedir , '../templates/vitis_accelerator/kernel_wrapper_' + io_type + '.cpp' ) )
143
150
fout_source = open (f'{ model .config .get_output_dir ()} /kernel_wrapper.cpp' , 'w' )
144
- for line in f_header .readlines ():
151
+ for line in f_source .readlines ():
145
152
if 'myproject' in line :
146
153
newline = line .replace ('myproject' , format (model .config .get_project_name ()))
147
154
else :
@@ -157,6 +164,8 @@ def write_host(self, model):
157
164
Args:
158
165
model (ModelGraph): the hls4ml model.
159
166
"""
167
+ from hls4ml .backends import VitisAcceleratorConfig
168
+
160
169
# Write host code
161
170
filedir = os .path .dirname (os .path .abspath (__file__ ))
162
171
f = open (os .path .join (filedir , '../templates/vitis_accelerator/myproject_host_cl.cpp' ))
@@ -175,7 +184,7 @@ def write_host(self, model):
175
184
176
185
# Write libraries
177
186
src = os .path .join (filedir , '../templates/vitis_accelerator/libs' )
178
- dst = format ( model .config .get_output_dir ())
187
+ dst = f' { model .config .get_output_dir ()} /libs'
179
188
copytree (src , dst , copy_function = copy )
180
189
181
190
def write_makefile (self , model ):
@@ -204,7 +213,9 @@ def write_accelerator_card_cfg(self, model):
204
213
Args:
205
214
model (ModelGraph): the hls4ml model.
206
215
"""
216
+ from hls4ml .backends import VitisAcceleratorConfig
207
217
218
+ # Write accelerator_card.cfg
208
219
filedir = os .path .dirname (os .path .abspath (__file__ ))
209
220
f = open (os .path .join (filedir , '../templates/vitis_accelerator/accelerator_card.cfg' ))
210
221
fout = open (f'{ model .config .get_output_dir ()} /accelerator_card.cfg' , 'w' )
@@ -229,7 +240,7 @@ def write_accelerator_card_cfg(self, model):
229
240
newline = line .replace ('MYPLATFORM' , format (self .vitis_accelerator_config .get_platform ()))
230
241
elif '# hls-fpga-machine-learning kernel control' in line :
231
242
newline = '[connectivity]\n '
232
- newline += 'nk=kernel_wrapper:{} \n \n ' . format ( num_channels )
243
+ newline += 'nk=kernel_wrapper:' + format ( num_kernels ) + ' \n \n '
233
244
if memory_type == 'hbm' :
234
245
for i in range (0 , num_kernels ):
235
246
newline += 'sp=kernel_wrapper_{}.in:HBM[{}:{}]\n ' .format (i + 1 , (i * 2 )* num_channels_per_cu , ((i * 2 + 1 )* num_channels_per_cu ) - 1 )
@@ -247,6 +258,13 @@ def write_accelerator_card_cfg(self, model):
247
258
f .close ()
248
259
fout .close ()
249
260
261
+ # Copy hls_config.tcl
262
+ filedir = os .path .dirname (os .path .abspath (__file__ ))
263
+ srcpath = os .path .join (filedir , '../templates/vitis_accelerator/hls_config.tcl' )
264
+ dstpath = f'{ model .config .get_output_dir ()} /hls_config.tcl'
265
+ copy (srcpath , dstpath )
266
+
267
+
250
268
def write_nnet_utils_overrides (self , model ):
251
269
"""Override nnet_types.h pointer comparison
252
270
@@ -263,8 +281,8 @@ def write_hls(self, model):
263
281
"""
264
282
Write the HLS project. Calls the steps from VivadoWriter, adapted for Vitis
265
283
"""
266
- print ("[K] Vitis_accelerator_writer -> write_hls called\n \n \n \n " )
267
284
super ().write_hls (model )
285
+ print ("\n \n Writing Accelerator code" )
268
286
self .create_accelerator_config (model )
269
287
self .write_nnet_utils_overrides (model )
270
288
self .write_build_script_backend_override (model )
@@ -273,3 +291,4 @@ def write_hls(self, model):
273
291
self .write_host (model )
274
292
self .write_makefile (model )
275
293
self .write_accelerator_card_cfg (model )
294
+ print ("Done" )
0 commit comments