
    h4                         S SK r S SKJr  S SKrS SKJrJr  S r " S S5      rS rS r	S	 r
S
 rS rS r\S:X  a  \" 5         gg)    N)ArgumentParser)TensorProtohelperc                 v   S/[        U R                  5      -  n0 n/ n[        U R                  5       H}  u  pE[        S UR                   5       5      X'   X   S:X  a   UR                  U R                  U   5        MK  UR                   H"  nXb;  a  U/X&'   M  X&   R                  U5        M$     M     U R                   Vs/ s H  owR                  PM     nnU R                   V	s/ s H  oR                  PM     n
n	X-   nUR                  5         S nU HO  nX:X  a  M
  UnXb;   d  M  X&    H4  nX   S-
  X'   X   S:X  d  M  UR                  U R                  U   5        M6     MQ     Sn[        U5      nX:  ai  X=   R                   HK  nX;   d  M
  X/    H9  nX   S-
  X'   X   S:X  d  M  UR                  U R                  U   5        US-   nM;     MM     US-   nX:  a  Mi  U[        U R                  5      :X  d   S5       eU R                  S5        U R                  R                  U5        g s  snf s  sn	f )Nr   c              3   6   #    U  H  o(       d  M  S v   M     g7f)   N ).0_s     ^/var/www/fran/franai/venv/lib/python3.13/site-packages/onnxruntime/tools/qnn/add_trans_cast.py	<genexpr>)graph_topological_sort.<locals>.<genexpr>   s     ">jA11js   
	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(      s"   s5::&JML#EJJ/"">djj">>
1$

8 45**J.-5J))00:	 % 0 05/@/@A/@t/@A16==#7KO!
($&)5'1';a'?
$'1, ''

8(<= 6 " E
l
C
+")00F& - 5H+5+?!+CJ(!+q0$++EJJx,@A!Ag	 !6 1 	 + #ejj/!7#77!	V	JJl#? B=s   H1'H6c                       \ rS rSrS rSrg)QnnTensorStructA   c                 J    SU l         [        R                  U l        / U l        g )N )r   r   FLOATonnx_data_typedim)selfs    r   __init__QnnTensorStruct.__init__B   s    	)//    )r0   r   r/   N)__name__
__module____qualname____firstlineno__r2   __static_attributes__r	   r4   r   r*   r*   A   s    r4   r*   c                 N   U S:X  d  U S:X  a  [         R                  $ U S:X  d  U S:X  a  [         R                  $ U S:X  d  U S:X  a  [         R                  $ U S:X  a  [         R                  $ U S:X  d  U S	:X  a  [         R
                  $ U S
:X  d  U S:X  a  [         R                  $ U S:X  d  U S:X  a  [         R                  $ U S:X  a  [         R                  $ U S:X  a  [         R                  $ U S:X  a  [         R                  $ U S:X  a  [         R                  $ [         R                  $ )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_typerK   H   s   -6"9   	&	 MV$;!!!	&	 MV$;!!!	&	 !!!	&	 MV$;	&	 MV$;   	&	 MV$;   	&	    	&	 """	&	    	&	 $$$r4   c                    [        U 5       n[        R                  " U5      nSU;   d   S5       eSUS   ;   d   S5       eUS   S   R                  5        Hc  u  pESU;   a  SU;   a  SU;   d   S5       eUS   S	:X  d  US   S
:X  d  M2  [	        5       nXFl        [        US   5      Ul        US   Ul        XaU'   Me     S S S 5        [        U5      S
:  d   S5       eg ! , (       d  f       N%= f)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   rK   r/   r0   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_filer\   n   s   	 	!]99]+("Z$ZZ"HW--g/gg-5=g5Fy5Q5W5W5Y1O ..#7722V V	V3 $F+q04H4PTU4U,.
"1,KL`alLm,n
)!5f!=
?IO< 6Z	 
"$ *+a/ T/% 
"	!s   A8C5C
C*c                    ^ ^ [        T 5      [        T5      :X  d   S5       e[        U U4S j[        [        T 5      5       5       5      $ )Nz,Onnx shape and Qnn shape has different rank.c              3   N   >#    U  H  nTU   R                   TU   :H  v   M     g 7f)N)	dim_value)r
   i	onnx_dimsqnn_dimss     r   r   4compare_onnx_shape_with_qnn_shape.<locals>.<genexpr>   s&     T>Sy|%%!4>Ss   "%)r   allrange)ra   rb   s   ``r   !compare_onnx_shape_with_qnn_shaperf      s9    y>S]*Z,ZZ*TeC	N>STTTr4   c                     U S:  d   S5       e/ nUR                  S5        UR                  U S-
  5        [        SU S-
  5       H  nUR                  U5        M     U$ N   z,Shape rank should >2 for the Transpose node.r   r   r   re   rankpermr`   s      r   gen_to_channel_first_permrn      s[    !8CCC8DKKNKKq1dQhA   Kr4   c                     U S:  d   S5       e/ nUR                  S5        [        SU 5       H  nUR                  U5        M     UR                  S5        U$ rh   rj   rk   s      r   gen_to_channel_last_permrp      sO    !8CCC8DKKN1d^A KKNKr4   c            	      p   [        S5      n U R                  SSSS[        S9  U R                  SSS	S[        S9  U R                  5       n0 n[	        UR
                  U5        [        R                  " UR                  5      n/ n0 nUR                  R                   GHD  nUR                  U;   Ga  UR                  nX&R                     nUR                  R                  R                  UR                  :w  a  Un	U	S
-   n
[         R"                  " SU
U	/U
/UR                  R                  R                  S9nUR                  UR                  R                  l        UR%                  U/5        U
nXUR                  '   ['        UR                  R                  R(                  R*                  UR*                  5      (       Gd  [-        [/        UR                  R                  R(                  R*                  5      5      nUnUS-   n[         R"                  " SUU/U/US9nUR%                  U/5        XUR                  '   [1        [/        UR                  R                  R(                  R*                  5      5       HB  nUR*                  U   UR                  R                  R(                  R*                  U   l        MD     GM)  GM,  [5        SUR                  -   S-   5      e   UR                  R6                   GH>  nUR                  U;   Ga  UR                  nUUR                     nUR                  R                  R                  UR                  :w  ar  Un
U
S
-   n	[         R"                  " SU	U	/U
/UR                  S9nUR                  UR                  R                  l        UR%                  U/5        U	nXUR                  '   ['        UR                  R                  R(                  R*                  UR*                  5      (       Gd  [9        [/        UR                  R                  R(                  R*                  5      5      nUnUS-   n[         R"                  " SUU/U/US9nUR%                  U/5        XUR                  '   [1        [/        UR                  R                  R(                  R*                  5      5       HO  nUUR                     R*                  U   UR                  R                  R(                  R*                  U   l        MQ     GM#  GM&  [5        SUR                  -   S-   5      e   UR                  R:                   Hu  n[=        UR                  5       H   u  nnUU;   d  M  UU   UR                  U'   M"     [=        UR6                  5       H   u  nnUU;   d  M  UU   UR6                  U'   M"     Mw     UR                  R:                  R%                  U5        [?        UR                  5        [        R@                  " X1R                  RC                  SS5      5        g )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requiredrN   z-qz
--qnn_jsonz4Required. Path to Qnn converted model_net.json file.	_qnn_castCast)r   inputsoutputsto
_qnn_trans	Transpose)r   rv   rw   rm   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_argsr\   rX   onnxrS   
onnx_modelr   r   r   rN   tensor_type	elem_typer/   r   	make_noder   rf   shaper0   rn   r   re   r_   AssertionErrorr   rp   r   r   r(   savereplace)parserargsrV   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 n3Wbfmpq
l!Wbfmp   D #%'BCIIdoo&EL"${{((::+6+;+;(:;K;KL++559I9X9XX">#2[#@ "("2"2)+,-."''33==# :J9X9X  ,,6##_$56/?,@PK,<,<=4[5E5E5Q5Q5W5W5[5[]m]q]qrr!:3{?O?O?[?[?a?a?e?e;f!g'C$(<|(K%'-'7'7.0123'($ ##%9$:;@UK,<,<= s;#3#3#?#?#E#E#I#IJKAJZJ^J^_`JaK$$0066::1=G L! s& !!<{?O?O!ORt!tuuS )V ** ;;,8,=,=) ;L<M<M N  ,,66:K:Z:ZZ#@ "2["@#)#3#3(+,-.(77$  ;L:Z:Z!!--7##%5$670?-APL,=,=>4\5F5F5R5R5X5X5\5\^o^s^stt!9#l>O>O>[>[>a>a>e>e:f!g(E%'<|'K$(.(8(8-0123')% ##%:$;<AUL,=,=> s<#4#4#@#@#F#F#J#JKLAKf$))Lc!LL%%1177;;A>H M! u* !!=@Q@Q!QTw!wxxW +Z   ,5djj,A(j88/J:/V

+, -B
 /8.D*{991L[1Y-. /E ! 
KKL)5;;' 	IIe__,,W6GHIr4   __main__)rR   argparser   r~   r   r   r(   r*   rK   r\   rf   rn   rp   r   r5   r	   r4   r   <module>r      sZ     #  $1$h #%L0U
{J| zF r4   