@@ -49,3 +49,41 @@ def transform(self, model, node):
49
49
f'WARNING: "ResourceUnrolled" strategy in "{ node .name } " ({ node .class_name } ) may have unexpected II in'
50
50
'Vitis backend.\n Verify that the final design satisfies the latency/II constraints.'
51
51
)
52
+
53
+
54
+ class ValidateBidirectionalMergeMode (OptimizerPass ):
55
+ _unrolled_layer_cls = ['Bidirectional' ]
56
+
57
+ def match (self , node ):
58
+ is_bidirectional_rnn_layer = (
59
+ len ([layer_cls for layer_cls in self ._unrolled_layer_cls if layer_cls in node .class_name ]) > 0
60
+ )
61
+ is_merge_mode_not_concat = node .get_attr ('merge_mode' , 'concat' ) != 'concat'
62
+
63
+ return is_bidirectional_rnn_layer and is_merge_mode_not_concat
64
+
65
+ def transform (self , model , node ):
66
+ merge_mode = node .get_attr ('merge_mode' , 'concat' )
67
+ print (
68
+ f'WARNING: "{ merge_mode } " merge mode in "{ node .name } " ({ node .class_name } ) is not supported in Vitis backend. '
69
+ 'Switching to "concat" merge mode.'
70
+ )
71
+ node .set_attr ('merge_mode' , 'concat' )
72
+
73
+
74
+ class ValidateBidirectionalLayerOrder (OptimizerPass ):
75
+ _unrolled_layer_cls = ['Bidirectional' ]
76
+
77
+ def match (self , node ):
78
+ is_bidirectional_rnn_layer = (
79
+ len ([layer_cls for layer_cls in self ._unrolled_layer_cls if layer_cls in node .class_name ]) > 0
80
+ )
81
+ is_layer_order_swapped = node .get_attr ('swapped_order' , False )
82
+
83
+ return is_bidirectional_rnn_layer and is_layer_order_swapped
84
+
85
+ def transform (self , model , node ):
86
+ print (
87
+ f'WARNING: The selected order for forward and backward layers in "{ node .name } " ({ node .class_name } ) is not '
88
+ 'supported in Vitis backend. Switching to forward layer first, backward layer last.'
89
+ )
0 commit comments