33from shutil import copy , copytree
44
55from hls4ml .writer .vitis_writer import VitisWriter
6- from hls4ml . backends import VitisAcceleratorConfig
6+
77
88class VitisAcceleratorWriter (VitisWriter ):
99 def __init__ (self ):
10+
1011 super ().__init__ ()
1112
1213 def create_accelerator_config (self , model ):
14+ from hls4ml .backends import VitisAcceleratorConfig
15+
1316 self .vitis_accelerator_config = VitisAcceleratorConfig (model .config )
1417
1518 def write_parameters_overrides (self , model ):
@@ -91,32 +94,35 @@ def write_kernel(self, model):
9194 Args:
9295 model (ModelGraph): the hls4ml model.
9396 """
97+ from hls4ml .backends import VitisAcceleratorConfig
9498
9599 filedir = os .path .dirname (os .path .abspath (__file__ ))
96100 io_type = model .config .get_config_value ("IOType" )
97101
98102 # 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' ))
100104 fout_header = open (f'{ model .config .get_output_dir ()} /kernel_wrapper.h' , 'w' )
101105 model_inputs = model .get_input_variables ()
102106 model_outputs = model .get_output_variables ()
103107 for line in f_header .readlines ():
104108 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 '
107112 newline += '#define NUM_CHANNEL '
108113 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 '
110115 elif self .vitis_accelerator_config .get_memory_type () == 'ddr' :
111116 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 '
113118 elif '// hls-fpga-machine-learning accelerator io' in line :
119+ newline = ''
114120 if io_type == 'io_parallel' :
115121 for inp in model_inputs :
116122 for out in model_outputs :
117123 newline += '#define DATA_SIZE_IN ' + format (inp .size_cpp ()) + '\n '
118124 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 '
120126 newline += '#define OUTSTREAMSIZE (BATCHSIZE * DATA_SIZE_OUT)' + '\n \n '
121127 newline += 'typedef ' + format (inp .type .name ) + ' in_buffer_t\n '
122128 newline += 'typedef ' + format (out .type .name ) + ' out_buffer_t\n '
@@ -128,7 +134,7 @@ def write_kernel(self, model):
128134 newline += '#define DATA_SIZE_IN ' + ' * ' .join (dims ) + '\n '
129135 newline += '#define NNET_ARRAY_DEPTH ' + format (nnet_array_depth ) + '\n '
130136 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 '
132138 newline += '#define OUTSTREAMSIZE (BATCHSIZE * DATA_SIZE_OUT)' + '\n \n '
133139 precision_str = model .config .backend .convert_precision_string (model .config .model_precision .get ('default' ))
134140 newline += 'typedef ' + precision_str + ' in_buffer_t\n '
@@ -137,11 +143,12 @@ def write_kernel(self, model):
137143 newline = line
138144 fout_header .write (newline )
139145 f_header .close ()
146+ fout_header .close ()
140147
141148 # 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' ) )
143150 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 ():
145152 if 'myproject' in line :
146153 newline = line .replace ('myproject' , format (model .config .get_project_name ()))
147154 else :
@@ -157,6 +164,8 @@ def write_host(self, model):
157164 Args:
158165 model (ModelGraph): the hls4ml model.
159166 """
167+ from hls4ml .backends import VitisAcceleratorConfig
168+
160169 # Write host code
161170 filedir = os .path .dirname (os .path .abspath (__file__ ))
162171 f = open (os .path .join (filedir , '../templates/vitis_accelerator/myproject_host_cl.cpp' ))
@@ -175,7 +184,7 @@ def write_host(self, model):
175184
176185 # Write libraries
177186 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'
179188 copytree (src , dst , copy_function = copy )
180189
181190 def write_makefile (self , model ):
@@ -204,7 +213,9 @@ def write_accelerator_card_cfg(self, model):
204213 Args:
205214 model (ModelGraph): the hls4ml model.
206215 """
216+ from hls4ml .backends import VitisAcceleratorConfig
207217
218+ # Write accelerator_card.cfg
208219 filedir = os .path .dirname (os .path .abspath (__file__ ))
209220 f = open (os .path .join (filedir , '../templates/vitis_accelerator/accelerator_card.cfg' ))
210221 fout = open (f'{ model .config .get_output_dir ()} /accelerator_card.cfg' , 'w' )
@@ -229,7 +240,7 @@ def write_accelerator_card_cfg(self, model):
229240 newline = line .replace ('MYPLATFORM' , format (self .vitis_accelerator_config .get_platform ()))
230241 elif '# hls-fpga-machine-learning kernel control' in line :
231242 newline = '[connectivity]\n '
232- newline += 'nk=kernel_wrapper:{} \n \n ' . format ( num_channels )
243+ newline += 'nk=kernel_wrapper:' + format ( num_kernels ) + ' \n \n '
233244 if memory_type == 'hbm' :
234245 for i in range (0 , num_kernels ):
235246 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):
247258 f .close ()
248259 fout .close ()
249260
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+
250268 def write_nnet_utils_overrides (self , model ):
251269 """Override nnet_types.h pointer comparison
252270
@@ -263,8 +281,8 @@ def write_hls(self, model):
263281 """
264282 Write the HLS project. Calls the steps from VivadoWriter, adapted for Vitis
265283 """
266- print ("[K] Vitis_accelerator_writer -> write_hls called\n \n \n \n " )
267284 super ().write_hls (model )
285+ print ("\n \n Writing Accelerator code" )
268286 self .create_accelerator_config (model )
269287 self .write_nnet_utils_overrides (model )
270288 self .write_build_script_backend_override (model )
@@ -273,3 +291,4 @@ def write_hls(self, model):
273291 self .write_host (model )
274292 self .write_makefile (model )
275293 self .write_accelerator_card_cfg (model )
294+ print ("Done" )
0 commit comments