Skip to content

Commit c4af46a

Browse files
committed
Rename "unrolled" -> "resource_unrolled"
1 parent eff80aa commit c4af46a

16 files changed

+86
-66
lines changed

hls4ml/backends/vitis/passes/feature_check.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,17 +35,17 @@ def transform(self, model, node):
3535
)
3636

3737

38-
class ValidateUnrolledStrategy(OptimizerPass):
38+
class ValidateResourceUnrolledStrategy(OptimizerPass):
3939
_unrolled_layer_cls = ['Conv1D', 'Conv2D', 'Dense', 'GRU', 'LSTM']
4040

4141
def match(self, node):
4242
is_unrolled_layer = len([layer_cls for layer_cls in self._unrolled_layer_cls if layer_cls in node.class_name]) > 0
43-
is_unrolled_strategy = node.get_attr('strategy', 'latency').lower() == 'unrolled'
43+
is_unrolled_strategy = node.get_attr('strategy', 'latency').lower() == 'resource_unrolled'
4444

4545
return is_unrolled_layer and is_unrolled_strategy
4646

4747
def transform(self, model, node):
4848
print(
49-
f'WARNING: "Unrolled" strategy in "{node.name}" ({node.class_name}) may have unexpected II in Vitis backend.\n'
50-
'Verify that the final design satisfies the latency/II constraints.'
49+
f'WARNING: "ResourceUnrolled" strategy in "{node.name}" ({node.class_name}) may have unexpected II in'
50+
'Vitis backend.\nVerify that the final design satisfies the latency/II constraints.'
5151
)

hls4ml/backends/vitis/vitis_backend.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ def _register_flows(self):
1616
validation_passes = [
1717
'vitis:validate_conv_implementation',
1818
'vitis:validate_resource_strategy',
19-
'vitis:validate_unrolled_strategy',
19+
'vitis:validate_resource_unrolled_strategy',
2020
]
2121
validation_flow = register_flow('validation', validation_passes, requires=['vivado:init_layers'], backend=self.name)
2222

hls4ml/backends/vivado/passes/convolution_templates.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -111,8 +111,8 @@ def format(self, node):
111111
else:
112112
mult_params['dense_function'] = 'DenseResource_rf_gt_nin_rem0'
113113
# The 3rd case is never used
114-
elif node.get_attr('strategy').lower() == 'unrolled':
115-
mult_params['dense_function'] = f'dense_unrolled_{node.index}'
114+
elif node.get_attr('strategy').lower() == 'resource_unrolled':
115+
mult_params['dense_function'] = f'dense_resource_unrolled_{node.index}'
116116

117117
mult_config = self.mult_template.format(**mult_params)
118118

@@ -236,8 +236,8 @@ def format(self, node):
236236
else:
237237
mult_params['dense_function'] = 'DenseResource_rf_gt_nin_rem0'
238238
# The 3rd case is never used
239-
elif node.get_attr('strategy').lower() == 'unrolled':
240-
mult_params['dense_function'] = f'dense_unrolled_{node.index}'
239+
elif node.get_attr('strategy').lower() == 'resource_unrolled':
240+
mult_params['dense_function'] = f'dense_resource_unrolled_{node.index}'
241241

242242
mult_config = self.mult_template.format(**mult_params)
243243

hls4ml/backends/vivado/passes/core_templates.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,8 @@ def format(self, node):
5151
else:
5252
params['dense_function'] = 'DenseResource_rf_gt_nin_rem0'
5353
# The 3rd case is never used
54-
elif node.get_attr('strategy').lower() == 'unrolled':
55-
params['dense_function'] = f'dense_unrolled_{node.index}'
54+
elif node.get_attr('strategy').lower() == 'resource_unrolled':
55+
params['dense_function'] = f'dense_resource_unrolled_{node.index}'
5656

5757
return self.template.format(**params)
5858

hls4ml/backends/vivado/passes/pipeline_style.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ def transform(self, model):
2525
if self._maybe_set_dataflow_resource_strategy(model):
2626
return True
2727

28-
if self._maybe_set_pipeline_unrolled_strategy(model):
28+
if self._maybe_set_pipeline_resource_unrolled_strategy(model):
2929
return True
3030

3131
if self._maybe_set_pipeline_io_parallel(model):
@@ -65,10 +65,10 @@ def _maybe_set_dataflow_resource_strategy(self, model):
6565

6666
return False
6767

68-
def _maybe_set_pipeline_unrolled_strategy(self, model):
68+
def _maybe_set_pipeline_resource_unrolled_strategy(self, model):
6969
have_unrolled = False
7070
for layer in model.get_layers():
71-
if model.config.get_strategy(layer).lower() == 'unrolled':
71+
if model.config.get_strategy(layer).lower() == 'resource_unrolled':
7272
self._set_pipeline_style(model, 'pipeline')
7373
have_unrolled = True
7474
break

hls4ml/backends/vivado/passes/recurrent_templates.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -149,8 +149,8 @@ def format(self, node):
149149
else:
150150
mult_params1['dense_function'] = 'DenseResource_rf_gt_nin_rem0'
151151
# The 3rd case is never used
152-
elif node.get_attr('strategy').lower() == 'unrolled':
153-
mult_params1['dense_function'] = f'dense_unrolled_{node.index}_1'
152+
elif node.get_attr('strategy').lower() == 'resource_unrolled':
153+
mult_params1['dense_function'] = f'dense_resource_unrolled_{node.index}_1'
154154

155155
if node.get_attr('return_sequences'):
156156
mult_params2['n_in'] = node.get_output_variable().shape[1]
@@ -174,8 +174,8 @@ def format(self, node):
174174
else:
175175
mult_params2['dense_function'] = 'DenseResource_rf_gt_nin_rem0'
176176
# The 3rd case is never used
177-
elif node.get_attr('strategy').lower() == 'unrolled':
178-
mult_params2['dense_function'] = f'dense_unrolled_{node.index}_2'
177+
elif node.get_attr('strategy').lower() == 'resource_unrolled':
178+
mult_params2['dense_function'] = f'dense_resource_unrolled_{node.index}_2'
179179

180180
mult_config1 = self.mult1_template.format(**mult_params1)
181181
mult_config2 = self.mult2_template.format(**mult_params2)

hls4ml/backends/vivado/passes/resource_strategy.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ class ApplyResourceStrategy(OptimizerPass):
99

1010
def match(self, node):
1111
node_matches = isinstance(node, (Dense, Conv1D, SeparableConv1D, Conv2D, SeparableConv2D, LSTM, GRU))
12-
is_resource_strategy = node.get_attr('strategy', '').lower() in ['resource', 'unrolled']
12+
is_resource_strategy = node.get_attr('strategy', '').lower() in ['resource', 'resource_unrolled']
1313
already_transformed = node.get_attr('_weights_transposed', False) is True
1414

1515
return node_matches and is_resource_strategy and not already_transformed

hls4ml/backends/vivado/passes/unrolled_codegen.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,14 @@ def match(self, node):
1515
# TODO - Extend (& test) for Separable Conv / Depthwise Conv / Recurrent layers
1616
layers_with_dense = (Dense, Conv1D, Conv2D, LSTM, GRU)
1717

18-
# Unrolled Dense mimicks the hardware implementation of Resource strategy -> apply after Resource optimizer
18+
# Unrolled Dense mimics the hardware implementation of Resource strategy -> apply after Resource optimizer
1919
weights_transposed = node.get_attr('_weights_transposed', False)
2020

2121
# RF = 1 will optimize DSPs anyway, so no need to unroll code
2222
rf_gt_one = node.get_attr('reuse_factor', 1) > 1
2323

2424
# User requested unrolled implementation of Dense
25-
is_unrolled = node.get_attr('strategy', 'latency') == 'unrolled'
25+
is_unrolled = node.get_attr('strategy', 'latency') == 'resource_unrolled'
2626

2727
return isinstance(node, layers_with_dense) and weights_transposed and rf_gt_one and is_unrolled
2828

@@ -34,15 +34,15 @@ def transform(self, model, node):
3434
weights = node.weights['weight']
3535
code_str = self._generate_unrolled_function(n_in, n_out, reuse_factor, weights, str(node.index) + '_1')
3636
code_str = self._add_backend_specific_pragmas_to_generated_code(code_str, model.config.backend)
37-
node.set_attr('unrolled_dense_resource_codegen_1', Source(code_str))
37+
node.set_attr('resource_unrolled_dense_codegen_1', Source(code_str))
3838

3939
recr_reuse_factor = node.get_attr('recurrent_reuse_factor')
4040
recr_weights = node.weights['recurrent_weight']
4141
code_str = self._generate_unrolled_function(
4242
n_in_recr, n_out_recr, recr_reuse_factor, recr_weights, str(node.index) + '_2'
4343
)
4444
code_str = self._add_backend_specific_pragmas_to_generated_code(code_str, model.config.backend)
45-
node.set_attr('unrolled_dense_resource_codegen_2', Source(code_str))
45+
node.set_attr('resource_unrolled_dense_codegen_2', Source(code_str))
4646

4747
else:
4848
n_in, n_out = node.model.config.backend.get_layer_mult_size(node)
@@ -51,7 +51,7 @@ def transform(self, model, node):
5151

5252
code_str = self._generate_unrolled_function(n_in, n_out, reuse_factor, weights, node.index)
5353
code_str = self._add_backend_specific_pragmas_to_generated_code(code_str, model.config.backend)
54-
node.set_attr('unrolled_dense_resource_codegen', Source(code_str))
54+
node.set_attr('resource_unrolled_dense_codegen', Source(code_str))
5555

5656
def _generate_unrolled_function(self, n_in, n_out, reuse_factor, weights, function_suffix):
5757
"""
@@ -72,7 +72,7 @@ def _generate_unrolled_function(self, n_in, n_out, reuse_factor, weights, functi
7272
# Variable instantiation and function pragmas
7373
generated_code = (
7474
'template<class data_T, class res_T, typename CONFIG_T>\n'
75-
'class dense_unrolled_{suffix} : public DenseKernel<data_T, res_T, CONFIG_T> {{{{\n'
75+
'class dense_resource_unrolled_{suffix} : public DenseKernel<data_T, res_T, CONFIG_T> {{{{\n'
7676
' public:\n'
7777
' static void dense(\n'
7878
' data_T data[CONFIG_T::n_in], res_T res[CONFIG_T::n_out],\n'

hls4ml/backends/vivado/vivado_backend.py

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -266,11 +266,11 @@ def init_dense(self, layer):
266266
index_t = layer.get_weights('weight').type.index_precision
267267
else:
268268
layer.set_attr('strategy', 'resource')
269-
elif layer.model.config.get_strategy(layer).lower() == 'unrolled':
269+
elif layer.model.config.get_strategy(layer).lower() == 'resource_unrolled':
270270
use_resource_instead = False
271271
if layer.get_attr('reuse_factor', 1) == 1:
272272
print(
273-
f'Unrolled strategy cannot be combined with reuse factor 1 in layer "{layer.name}". '
273+
f'Unrolled resource strategy cannot be combined with reuse factor 1 in layer "{layer.name}". '
274274
'Using "resource" strategy instead.'
275275
)
276276
use_resource_instead = True
@@ -281,7 +281,7 @@ def init_dense(self, layer):
281281
layer.set_attr('strategy', 'resource')
282282
else:
283283
self.set_closest_reuse_factor(layer, n_in, n_out, include_max_rf=False)
284-
layer.set_attr('strategy', 'unrolled')
284+
layer.set_attr('strategy', 'resource_unrolled')
285285
else:
286286
layer.set_attr('strategy', 'latency')
287287
layer.set_attr('index_t', NamedType(f'layer{layer.index}_index', index_t))
@@ -297,17 +297,17 @@ def init_conv1d(self, layer):
297297
n_in, n_out = self.get_layer_mult_size(layer)
298298
self.set_target_reuse_factor(layer)
299299
self.set_closest_reuse_factor(layer, n_in, n_out)
300-
elif layer.model.config.get_strategy(layer).lower() == 'unrolled':
300+
elif layer.model.config.get_strategy(layer).lower() == 'resource_unrolled':
301301
use_resource_instead = False
302302
if layer.get_attr('reuse_factor', 1) == 1:
303303
print(
304-
f'Unrolled strategy cannot be combined with reuse factor 1 in layer "{layer.name}".'
304+
f'Unrolled resource strategy cannot be combined with reuse factor 1 in layer "{layer.name}".'
305305
'Using "resource" strategy instead.'
306306
)
307307
use_resource_instead = True
308308
elif layer.model.config.get_config_value('IOType') == 'io_parallel':
309309
print(
310-
f'Unrolled strategy cannot be combined with io_parallel in layer "{layer.name}". '
310+
f'Unrolled resource strategy cannot be combined with io_parallel in layer "{layer.name}". '
311311
'Using "resource" strategy instead.'
312312
)
313313
use_resource_instead = True
@@ -318,7 +318,7 @@ def init_conv1d(self, layer):
318318
layer.set_attr('strategy', 'resource')
319319
else:
320320
self.set_closest_reuse_factor(layer, n_in, n_out, include_max_rf=False)
321-
layer.set_attr('strategy', 'unrolled')
321+
layer.set_attr('strategy', 'resource_unrolled')
322322
else:
323323
layer.set_attr('strategy', 'latency')
324324

@@ -418,17 +418,17 @@ def init_conv2d(self, layer):
418418
self.set_target_reuse_factor(layer)
419419
n_in, n_out = self.get_layer_mult_size(layer)
420420
self.set_closest_reuse_factor(layer, n_in, n_out)
421-
elif layer.model.config.get_strategy(layer).lower() == 'unrolled':
421+
elif layer.model.config.get_strategy(layer).lower() == 'resource_unrolled':
422422
use_resource_instead = False
423423
if layer.get_attr('reuse_factor', 1) == 1:
424424
print(
425-
f'Unrolled strategy cannot be combined with reuse factor 1 in layer "{layer.name}". '
425+
f'Unrolled resource strategy cannot be combined with reuse factor 1 in layer "{layer.name}". '
426426
'Using "resource" strategy instead.'
427427
)
428428
use_resource_instead = True
429429
elif layer.model.config.get_config_value('IOType') == 'io_parallel':
430430
print(
431-
f'Unrolled strategy cannot be combined with io_parallel in layer "{layer.name}". '
431+
f'Unrolled resource strategy cannot be combined with io_parallel in layer "{layer.name}". '
432432
'Using "resource" strategy instead.'
433433
)
434434
use_resource_instead = True
@@ -439,7 +439,7 @@ def init_conv2d(self, layer):
439439
layer.set_attr('strategy', 'resource')
440440
else:
441441
self.set_closest_reuse_factor(layer, n_in, n_out, include_max_rf=False)
442-
layer.set_attr('strategy', 'unrolled')
442+
layer.set_attr('strategy', 'resource_unrolled')
443443
else:
444444
layer.set_attr('strategy', 'latency')
445445

@@ -563,11 +563,11 @@ def init_lstm(self, layer):
563563
self.set_closest_reuse_factor(layer, n_in, n_out)
564564
self.set_closest_reuse_factor(layer, n_in_recr, n_out_recr, attribute='recurrent_reuse_factor')
565565
layer.set_attr('strategy', 'resource')
566-
elif layer.model.config.get_strategy(layer).lower() == 'unrolled':
566+
elif layer.model.config.get_strategy(layer).lower() == 'resource_unrolled':
567567
use_resource_instead = False
568568
if layer.get_attr('reuse_factor', 1) == 1:
569569
print(
570-
f'Unrolled strategy cannot be combined with reuse factor 1 in layer "{layer.name}". '
570+
f'Unrolled resource strategy cannot be combined with reuse factor 1 in layer "{layer.name}". '
571571
'Using "resource" strategy instead.'
572572
)
573573
use_resource_instead = True
@@ -581,7 +581,7 @@ def init_lstm(self, layer):
581581
self.set_closest_reuse_factor(
582582
layer, n_in_recr, n_out_recr, attribute='recurrent_reuse_factor', include_max_rf=False
583583
)
584-
layer.set_attr('strategy', 'unrolled')
584+
layer.set_attr('strategy', 'resource_unrolled')
585585
else:
586586
layer.set_attr('strategy', 'latency')
587587

@@ -597,11 +597,11 @@ def init_gru(self, layer):
597597
self.set_closest_reuse_factor(layer, n_in, n_out)
598598
self.set_closest_reuse_factor(layer, n_in_recr, n_out_recr, attribute='recurrent_reuse_factor')
599599
layer.set_attr('strategy', 'resource')
600-
elif layer.model.config.get_strategy(layer).lower() == 'unrolled':
600+
elif layer.model.config.get_strategy(layer).lower() == 'resource_unrolled':
601601
use_resource_instead = False
602602
if layer.get_attr('reuse_factor', 1) == 1:
603603
print(
604-
f'Unrolled strategy cannot be combined with reuse factor 1 in layer "{layer.name}". '
604+
f'Unrolled resource strategy cannot be combined with reuse factor 1 in layer "{layer.name}". '
605605
'Using "resource" strategy instead.'
606606
)
607607
use_resource_instead = True
@@ -615,7 +615,7 @@ def init_gru(self, layer):
615615
self.set_closest_reuse_factor(
616616
layer, n_in_recr, n_out_recr, attribute='recurrent_reuse_factor', include_max_rf=False
617617
)
618-
layer.set_attr('strategy', 'unrolled')
618+
layer.set_attr('strategy', 'resource_unrolled')
619619
else:
620620
layer.set_attr('strategy', 'latency')
621621

hls4ml/model/graph.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from hls4ml.model.flow import get_flow
1111
from hls4ml.model.layers import layer_map
1212
from hls4ml.model.optimizer import get_available_passes, optimize_model
13+
from hls4ml.utils.string_utils import convert_to_snake_case
1314

1415

1516
class HLSConfig:
@@ -35,7 +36,7 @@ def __init__(self, config):
3536
self.layer_type_targ_cycles = {}
3637
self.layer_name_targ_cycles = {}
3738

38-
self.model_strategy = 'Latency'
39+
self.model_strategy = convert_to_snake_case('Latency')
3940
self.layer_type_strategy = {}
4041
self.layer_name_strategy = {}
4142

@@ -217,7 +218,7 @@ def parse_name_config(self, layer_name, layer_cfg):
217218

218219
strategy = layer_cfg.get('Strategy')
219220
if strategy is not None:
220-
self.layer_name_strategy[layer_name.lower()] = strategy
221+
self.layer_name_strategy[layer_name.lower()] = convert_to_snake_case(strategy)
221222

222223
conv_implementation = layer_cfg.get('ConvImplementation')
223224
if conv_implementation is not None:
@@ -265,7 +266,7 @@ def _parse_hls_config(self):
265266
self.model_rf = model_cfg.get('ReuseFactor')
266267
self.model_targ_cycles = model_cfg.get('TargetCycles')
267268
self.model_conv_implementation = model_cfg.get('ConvImplementation', 'LineBuffer')
268-
self.model_strategy = model_cfg.get('Strategy', 'Latency')
269+
self.model_strategy = convert_to_snake_case(model_cfg.get('Strategy', 'Latency'))
269270
self.model_compression = bool(model_cfg.get('Compression', 0))
270271
self.pipeline_style = model_cfg.get('PipelineStyle', 'auto')
271272
self.pipeline_ii = model_cfg.get('PipelineInterval', None)
@@ -290,7 +291,7 @@ def _parse_hls_config(self):
290291

291292
strategy = layer_cfg.get('Strategy')
292293
if strategy is not None:
293-
self.layer_type_strategy[layer_type.lower()] = strategy
294+
self.layer_type_strategy[layer_type.lower()] = convert_to_snake_case(strategy)
294295

295296
conv_implementation = layer_cfg.get('ConvImplementation')
296297
if conv_implementation is not None:

0 commit comments

Comments
 (0)