Ë
    cQêj�4  ã                   óˆ   — d dl Z d dlmZ d dlZd dlmZmZ d„ Z G d„ d«      Zd„ Zd„ Z	d	„ Z
d
„ Zd„ Zd„ Zedk(  r e«        yy)é    N)ÚArgumentParser)ÚTensorProtoÚhelperc                 óV  — dgt        | j                  «      z  }i }g }t        | j                  «      D ]{  \  }}t        d„ |j                  D «       «      ||<   ||   dk(  r|j                  | j                  |   «       ŒL|j                  D ]!  }||vr|g||<   Œ||   j                  |«       Œ# Œ} | j                  D �cg c]  }|j                  ‘Œ }}| j                  D �	cg c]  }	|	j                  ‘Œ }
}	||
z   }|j                  «        d }|D ]K  }||k(  rŒ	|}||v sŒ||   D ]4  }||   dz
  ||<   ||   dk(  sŒ|j                  | j                  |   «       Œ6 ŒM d}t        |«      }||k  re||   j                  D ]H  }||v sŒ||   D ]9  }||   dz
  ||<   ||   dk(  sŒ|j                  | j                  |   «       |dz   }Œ; ŒJ |dz   }||k  rŒe|t        | j                  «      k(  sJ d«       ‚| j                  d«       | j                  j                  |«       y c c}w c c}	w )Nr   c              3   ó&   K  — | ]	  }|sŒd –— Œ y­w)é   N© )Ú.0Ú_s     úi/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/onnxruntime/tools/qnn/add_trans_cast.pyú	<genexpr>z)graph_topological_sort.<locals>.<genexpr>   s   è ø€ Ò">¨ºA¤1Ñ">ùs   ‚Šr   zGraph is not a DAGÚnode)Úlenr   Ú	enumerateÚsumÚinputÚappendÚinitializerÚnameÚsortÚoutputÚ
ClearFieldÚextend)ÚgraphÚ
deps_countÚdeps_to_nodesÚsorted_nodesÚnode_idxr   Ú
input_nameÚinitÚinitializer_namesr   Úgraph_input_namesÚinput_namesÚprev_input_nameÚstartÚendr   s                   r   Úgraph_topological_sortr'      sk  € Ø�”s˜5Ÿ:™:“Ñ&€JØ€MØ€LÜ# E§J¡JÓ/ò ;‰ˆ�$ä"Ñ">¨d¯j©jÔ">Ó>ˆ
�8ÑØ�hÑ 1Ò$Ø×Ñ §
¡
¨8Ñ 4Ô5ØàŸ*™*ò 	;ˆJØ Ñ.Ø-5¨J�˜jÒ)à˜jÑ)×0Ñ0°Õ:ñ		;ð;ð 05×/@Ñ/@ÖA t˜Ÿ›ÐAÐÐAØ16·±Ö=¨˜Ÿ›Ð=ÐÐ=Ø#Ð&7Ñ7€KØ×ÑÔØ€OØ!ò 	>ˆ
Ø˜jÒ(Øà$ˆØ˜Ò&Ø)¨*Ñ5ò >�Ø'1°(Ñ';¸aÑ'?�
˜8Ñ$Ø˜hÑ'¨1Ó,Ø ×'Ñ'¨¯
©
°8Ñ(<Õ=ñ>ð	>ð €EÜ
ˆlÓ
€Cà
�#Š+Ø" 5Ñ)×0Ñ0ò 	&ˆFØ˜Ò&Ø -¨fÑ 5ò &�HØ+5°hÑ+?À!Ñ+C�J˜xÑ(Ø! (Ñ+¨qÓ0Ø$×+Ñ+¨E¯J©J°xÑ,@ÔAØ! A™g™ñ	&ð	&ð ˜‘	ˆð �#‹+ð ”#�e—j‘j“/Ò!Ð7Ð#7Ó7Ð!Ø	×Ñ�VÔØ	‡J�J×Ñ�lÕ#ùò? BùÚ=s   Â?H!Ã"H&c                   ó   — e Zd Zd„ Zy)ÚQnnTensorStructc                 óJ   — d| _         t        j                  | _        g | _        y )NÚ )r   r   ÚFLOATÚonnx_data_typeÚdim)Úselfs    r   Ú__init__zQnnTensorStruct.__init__B   s   € ØˆŒ	Ü)×/Ñ/ˆÔØˆ�ó    N)Ú__name__Ú
__module__Ú__qualname__r0   r	   r1   r   r)   r)   A   s   „ ór1   r)   c                 ó,  — | dk(  s| dk(  rt         j                  S | dk(  s| dk(  rt         j                  S | dk(  s| dk(  rt         j                  S | dk(  rt         j                  S | dk(  s| d	k(  rt         j
                  S | d
k(  s| dk(  rt         j                  S | dk(  s| dk(  rt         j                  S | dk(  rt         j                  S | dk(  rt         j                  S | dk(  rt         j                  S | dk(  rt         j                  S t         j                  S )Ni  i  i  i  i2  i2  id  i  é   i  é   i2  é2   éd   i  i2  i  )r   ÚUINT8ÚUINT16ÚUINT32ÚUINT64ÚINT8ÚINT16ÚINT32ÚINT64ÚFLOAT16r,   ÚBOOLÚ	UNDEFINED)Úqnn_data_types    r   Úqnn_data_type_to_onnx_data_typerF   H   s  € à˜Ò -°6Ò"9Ü× Ñ Ð à	˜&Ò	  M°VÒ$;Ü×!Ñ!Ð!à	˜&Ò	  M°VÒ$;Ü×!Ñ!Ð!à	˜&Ò	 Ü×!Ñ!Ð!à	˜&Ò	  M°VÒ$;Ü×ÑÐà	˜&Ò	  M°VÒ$;Ü× Ñ Ð à	˜&Ò	  M°VÒ$;Ü× Ñ Ð à	˜&Ò	 Ü× Ñ Ð à	˜&Ò	 Ü×"Ñ"Ð"à	˜&Ò	 Ü× Ñ Ð à	˜&Ò	 Ü×ÑÐä×$Ñ$Ð$r1   c                 ó¶  — t        | «      5 }t        j                  |«      }d|v sJ d«       ‚d|d   v sJ d«       ‚|d   d   j                  «       D ]\  \  }}d|v rd|v rd|v sJ d«       ‚|d   d	k(  s	|d   d
k(  sŒ*t	        «       }||_        t        |d   «      |_        |d   |_        |||<   Œ^ 	 d d d «       t        |«      d
kD  sJ d«       ‚y # 1 sw Y   ŒxY w)Nr   z4QNN converted json file not valid. Can't find graph.Útensorsz6QNN converted json file not valid. Can't find tensors.ÚtypeÚ	data_typeÚdimszDQNN converted json file not valid. Can't find some keys from tensorsr   r   zJConverted QNN model not valid. It should have at least 1 input & 1 output.)
ÚopenÚjsonÚloadÚitemsr)   r   rF   r-   r.   r   )Úqnn_json_file_pathÚqnn_input_output_tensor_dicÚqnn_json_fileÚqnn_jsonÚqnn_tensor_nameÚqnn_tensor_attributeÚ
qnn_tensors          r   Úparse_qnn_json_filerW   n   s6  € Ü	Ð Ó	!ð J ]Ü—9‘9˜]Ó+ˆØ˜(Ñ"ÐZÐ$ZÓZÐ"Ø˜H WÑ-Ñ-ÐgÐ/gÓgÐ-Ø5=¸gÑ5FÀyÑ5Q×5WÑ5WÓ5Yò 	JÑ1ˆOÐ1ð Ð.Ñ.ØÐ#7Ñ7ØÐ2Ñ2ðVð Vó	Vð3ð $ FÑ+¨qÒ0Ð4HÈÑ4PÐTUÓ4UÜ,Ó.�
Ø"1�
”Ü,KÐL`ÐalÑLmÓ,n�
Ô)Ø!5°fÑ!=�
”Ø?IÐ+¨OÒ<ñ	J÷	Jô$ Ð*Ó+¨aÒ/ð ØTóÑ/÷%Jð Jús   ŒA.CÁ;5CÃCc                 ó�   ‡ ‡— t        ‰ «      t        ‰«      k(  sJ d«       ‚t        ˆ ˆfd„t        t        ‰ «      «      D «       «      S )Nz,Onnx shape and Qnn shape has different rank.c              3   óH   •K  — | ]  }‰|   j                   ‰|   k(  –— Œ y ­w)N)Ú	dim_value)r
   ÚiÚ	onnx_dimsÚqnn_dimss     €€r   r   z4compare_onnx_shape_with_qnn_shape.<locals>.<genexpr>ˆ   s$   øè ø€ ÒT¸ˆy˜‰|×%Ñ%¨°!©Õ4ÑTùs   ƒ")r   ÚallÚrange)r\   r]   s   ``r   Ú!compare_onnx_shape_with_qnn_shaper`   †   s9   ù€ Üˆy‹>œS ›]Ò*ÐZÐ,ZÓZÐ*ÜÔT¼eÄCÈ	ÃNÓ>SÔTÓTÐTr1   c                 ó¶   — | dkD  sJ d«       ‚g }|j                  d«       |j                  | dz
  «       t        d| dz
  «      D ]  }|j                  |«       Œ |S ©Né   z,Shape rank should >2 for the Transpose node.r   r   ©r   r_   ©ÚrankÚpermr[   s      r   Úgen_to_channel_first_permrh   ‹   s`   € Ø�!Š8ÐCÐCÓCˆ8Ø€DØ‡K�K�„NØ‡K�K��q‘ÔÜ�1�d˜Q‘hÓò ˆØ�‰�A�ðð €Kr1   c                 óª   — | dkD  sJ d«       ‚g }|j                  d«       t        d| «      D ]  }|j                  |«       Œ |j                  d«       |S rb   rd   re   s      r   Úgen_to_channel_last_permrj   –   sT   € Ø�!Š8ÐCÐCÓCˆ8Ø€DØ‡K�K�„NÜ�1�d‹^ò ˆØ�‰�A�ðà‡K�K�„Nà€Kr1   c                  óD  — t        d«      } | j                  ddddt        ¬«       | j                  ddd	dt        ¬«       | j                  «       }i }t	        |j
                  |«       t        j                  |j                  «      }g }i }|j                  j                  D �]>  }|j                  |v �r|j                  }||j                     }|j                  j                  j                  |j                  k7  r‰|}	|	d
z   }
t!        j"                  d|
|	g|
g|j                  j                  j                  ¬«      }|j                  |j                  j                  _        |j%                  |g«       |
}|
||j                  <   t'        |j                  j                  j(                  j*                  |j*                  «      r�Œ$t-        t/        |j                  j                  j(                  j*                  «      «      }|}|dz   }t!        j"                  d||g|g|¬«      }|j%                  |g«       |||j                  <   t1        t/        |j                  j                  j(                  j*                  «      «      D ]A  }|j*                  |   |j                  j                  j(                  j*                  |   _        ŒC �Œ&t5        d|j                  z   dz   «      ‚ |j                  j6                  D �]7  }|j                  |v �r|j                  }||j                     }|j                  j                  j                  |j                  k7  ru|}
|
d
z   }	t!        j"                  d|	|	g|
g|j                  ¬«      }|j                  |j                  j                  _        |j%                  |g«       |	}|	||j                  <   t'        |j                  j                  j(                  j*                  |j*                  «      r�Œt9        t/        |j                  j                  j(                  j*                  «      «      }|}|dz   }t!        j"                  d||g|g|¬«      }|j%                  |g«       |||j                  <   t1        t/        |j                  j                  j(                  j*                  «      «      D ]N  }||j                     j*                  |   |j                  j                  j(                  j*                  |   _        ŒP �Œt5        d|j                  z   dz   «      ‚ |j                  j:                  D ]j  }t=        |j                  «      D ]  \  }}||v sŒ||   |j                  |<   Œ t=        |j6                  «      D ]  \  }}||v sŒ||   |j6                  |<   Œ Œl |j                  j:                  j%                  |«       t?        |j                  «       t        j@                  ||j                  jC                  dd«      «       y )NzbInsert Cast, Transpose nodes into Onnx model to make it aligned with QNN generated context binary.z-mz--onnx_modelz"Required. Path to Onnx model file.T)ÚhelpÚrequiredrI   z-qz
--qnn_jsonz4Required. Path to Qnn converted model_net.json file.Ú	_qnn_castÚCast)r   ÚinputsÚoutputsÚtoÚ
_qnn_transÚ	Transpose)r   rp   rq   rg   zError: Onnx model input: z  not exist from QNN model input.zError: Onnx model output: z! not exist from QNN model output.z.onnxz_add_trans.onnx)"r   Úadd_argumentÚstrÚ
parse_argsrW   rS   ÚonnxrN   Ú
onnx_modelr   r   r   rI   Útensor_typeÚ	elem_typer-   r   Ú	make_noder   r`   Úshaper.   rh   r   r_   rZ   ÚAssertionErrorr   rj   r   r   r'   ÚsaveÚreplace)ÚparserÚargsrQ   ÚmodelÚnodes_to_addÚgraph_input_output_name_dicÚgraph_inputÚinput_name_fater_node_insertÚqnn_input_tensorÚcast_input_nameÚcast_output_nameÚinput_cast_nodeÚtranspose_permÚtranspose_input_nameÚtranspose_output_nameÚinput_transpose_noder[   Úgraph_outputÚoutput_name_after_node_insertÚqnn_output_tensorÚoutput_cast_nodeÚoutput_transpose_noder   Únode_input_indexÚ
node_inputÚnode_output_indexÚnode_outputs                              r   Úmainr™   ¥   sÇ  € ÜØló€Fð ×Ñ˜˜nÐ3WÐbfÔmpÐÔqØ
×ÑØˆlÐ!WÐbfÔmpð ô ð ×ÑÓ€Dð #%ÐÜ˜Ÿ™Ð'BÔCä�I‰I�d—o‘oÓ&€Eà€Là"$ÐØ—{‘{×(Ñ(ó )vˆØ×ÑÐ:Ò:Ø+6×+;Ñ+;Ð(Ø:¸;×;KÑ;KÑLÐà×Ñ×+Ñ+×5Ñ5Ð9I×9XÑ9XÒXà">�Ø#2°[Ñ#@Ð Ü"(×"2Ñ"2ØØ)Ø+Ð,Ø-Ð.Ø"×'Ñ'×3Ñ3×=Ñ=ô#�ð :J×9XÑ9X�× Ñ ×,Ñ,Ô6Ø×#Ñ# _Ð$5Ô6Ø/?Ð,Ø@PÐ+¨K×,<Ñ,<Ñ=ä4°[×5EÑ5E×5QÑ5Q×5WÑ5W×5[Ñ5[Ð]m×]qÑ]qÖrä!:¼3¸{×?OÑ?O×?[Ñ?[×?aÑ?a×?eÑ?eÓ;fÓ!g�Ø'CÐ$Ø(<¸|Ñ(KÐ%Ü'-×'7Ñ'7ØØ.Ø0Ð1Ø2Ð3Ø'ô(Ð$ð ×#Ñ#Ð%9Ð$:Ô;Ø@UÐ+¨K×,<Ñ,<Ñ=ô œs ;×#3Ñ#3×#?Ñ#?×#EÑ#E×#IÑ#IÓJÓKò b�AØJZ×J^ÑJ^Ð_`ÑJa�K×$Ñ$×0Ñ0×6Ñ6×:Ñ:¸1Ñ=ÕGòbô !Ð!<¸{×?OÑ?OÑ!OÐRtÑ!tÓuÐuðS)vðV Ÿ™×*Ñ*ó +yˆØ×ÑÐ ;Ò;Ø,8×,=Ñ,=Ð)à ;¸L×<MÑ<MÑ NÐØ× Ñ ×,Ñ,×6Ñ6Ð:K×:ZÑ:ZÒZà#@Ð Ø"2°[Ñ"@�Ü#)×#3Ñ#3ØØ(Ø+Ð,Ø-Ð.Ø(×7Ñ7ô$Ð ð ;L×:ZÑ:Z�×!Ñ!×-Ñ-Ô7Ø×#Ñ#Ð%5Ð$6Ô7Ø0?Ð-ØAPÐ+¨L×,=Ñ,=Ñ>ä4°\×5FÑ5F×5RÑ5R×5XÑ5X×5\Ñ5\Ð^o×^sÑ^sÖtä!9¼#¸l×>OÑ>O×>[Ñ>[×>aÑ>a×>eÑ>eÓ:fÓ!g�Ø(EÐ%Ø'<¸|Ñ'KÐ$Ü(.×(8Ñ(8ØØ-Ø0Ð1Ø2Ð3Ø'ô)Ð%ð ×#Ñ#Ð%:Ð$;Ô<ØAUÐ+¨L×,=Ñ,=Ñ>ô œs <×#4Ñ#4×#@Ñ#@×#FÑ#F×#JÑ#JÓKÓLò �AØKfØ$×)Ñ)ñLç‘c˜!ñL�L×%Ñ%×1Ñ1×7Ñ7×;Ñ;¸AÑ>ÕHòô
 !Ð!=À×@QÑ@QÑ!QÐTwÑ!wÓxÐxðW+yðZ —‘× Ñ ò 	ZˆÜ,5°d·j±jÓ,Aò 	WÑ(Ð˜jàÐ8Ò8Ø/JÈ:Ñ/V�—
‘
Ð+Ò,ð	Wô
 /8¸¿¹Ó.Dò 	ZÑ*Ð˜{àÐ9Ò9Ø1LÈ[Ñ1Y�—‘Ð-Ò.ñ	Zð	Zð 
‡K�K×Ñ×Ñ˜LÔ)Ü˜5Ÿ;™;Ô'ô 	‡I�Iˆe�T—_‘_×,Ñ,¨WÐ6GÓHÕIr1   Ú__main__)rM   Úargparser   rx   r   r   r'   r)   rF   rW   r`   rh   rj   r™   r2   r	   r1   r   ú<module>rœ      sZ   ðó Ý #ã ß $ò1$÷hñ ò#%òLò0Uò
òò{Jð| ˆzÒÙ…Fð r1   