o
    Y۷i&                     @  s   d Z ddlmZ ddlmZ ddlmZ ddlm	Z	 ddl
mZmZmZmZmZ 	d8d9ddZd:ddZd;ddZd<d d!Zd=d$d%Zd>d&d'Zd?d2d3Z	4d@dAd6d7ZdS )Bz5Code generation logic for the `tvm-ffi-stubgen` tool.    )annotations)Callable   )consts)	CodeBlock)FuncInfo
ImportItem
InitConfig
ObjectInfoOptionsNty_mapdict[str, str]importslist[ImportItem]
func_namesset[str] | NonereturnCallable[[str], str]c                   s   d fdd}|S )Nnamestrr   c                   s^    | | } | ddd }d| v r-d } r| v rd| }t| d|d |r-|S |S )N.r   _Ttype_checking_onlyalias)getrsplitappendr   )r   suffixr   r   r   r    J/home/ubuntu/vllm_env/lib/python3.10/site-packages/tvm_ffi/stub/codegen.py_run!   s   
z%_type_suffix_and_record.<locals>._run)r   r   r   r   r!   )r   r   r   r#   r!   r    r"   _type_suffix_and_record   s   r$   coder   global_funcslist[FuncInfo]optr   Nonec           	        s   t | jdks	J |sdS t| jtsJ | j\}}|sd}|t| ddddtddd	g d
d |D }t|||d dd| ddg fdd|D d}d| j | jd gfdd|D | jd | _dS )ztGenerate function signatures for global functions.

    It processes: global/${prefix}@${import_from="tvm_ffi")
       Ntvm_ffiz.init_ffi_apiF_FFI_INIT_FUNCr   typing.TYPE_CHECKINGr   c                 S      h | ]}|j jd dd qS r   r   r   schemar   r   .0fr!   r!   r"   	<setcomp>P        z(generate_global_funcs.<locals>.<setcomp>r   
# fmt: offz_FFI_INIT_FUNC("z", __name__)if TYPE_CHECKING:c                   s   g | ]
}|j  jd qS )indent)genr<   )r4   func)	fn_ty_mapr(   r!   r"   
<listcomp>V       z)generate_global_funcs.<locals>.<listcomp>	# fmt: on r   c                      g | ]} | qS r!   r!   r4   liner;   r!   r"   r@   \       r   )	lenlines
isinstanceparamtupleextendr   r$   r<   )	r%   r&   r   r   r(   prefiximport_fromr   resultsr!   )r?   r<   r(   r"   generate_global_funcs1   sH   



rQ   obj_infor
   c           	        s   t | jdks	J |}dd |jD }t|||d}|jr=|tddd dg|j|d	d
d|j||jd
d}ndg|j|d	d
d}d| j  | jd	 g fdd|D | jd | _dS )zZGenerate a class definition for an object type.

    It processes: object/${type_key}
    r*   c                 S  r/   r0   r1   )r4   mr!   r!   r"   r6   n   r7   z"generate_object.<locals>.<setcomp>r8   r-   Fr.   r9   r   r;   r:   rB   rC   c                   rD   r!   r!   rE   r;   r!   r"   r@      rG   z#generate_object.<locals>.<listcomp>r   N)	rH   rI   methodsr$   r   r   
gen_fieldsgen_methodsr<   )	r%   r   r   r(   rR   infomethod_namesr?   rP   r!   r;   r"   generate_objecta   sD   	

rY   c                   s   i i |D ]}|j r|jg | q|jg | qr0dg tddd ddd g }rH| fddtD  r_|d | fddtD  |rx| jd dddg|dd| jd | _dS dS )zaGenerate import statements for the types used in the stub.

    It processes: import-section
    typingr-   Tr.   modr   itemsr   r<   intr   c                 S  sZ   |j dd d dttdd |D }d| }| r&| d|  d	| S | d
| S )Nc                 S  s   | j S Nr   )itemr!   r!   r"   <lambda>   s    z=generate_import_section.<locals>._make_line.<locals>.<lambda>keyz, c                 s  s    | ]}|j V  qd S r^   )name_with_alias)r4   r`   r!   r!   r"   	<genexpr>   s    z>generate_import_section.<locals>._make_line.<locals>.<genexpr>rC   zfrom z import zimport )sortjoinsortedset)r[   r\   r<   names
indent_strr!   r!   r"   
_make_line   s   z+generate_import_section.<locals>._make_linec                 3  s"    | ]} || d dV  qdS )r   r;   Nr!   r4   r[   )rl   imports_concreter!   r"   re          
z*generate_import_section.<locals>.<genexpr>r:   c                 3  s"    | ]} || j V  qd S r^   r;   rm   )rl   imports_ty_checkr(   r!   r"   re      ro   r   r9   # isort: offz"from __future__ import annotations# isort: onrB   r   N)r[   r   r\   r   r<   r]   r   r   )r   
setdefaultr[   r   r   rM   rh   rI   )r%   r   r(   r`   rP   r!   )rl   rn   rp   r(   r"   generate_import_section   sH   	

	

rt   rj   set[str]c                   sr   t | jdks	J |sdS d| j  dd |D }dd
d}| jd g fddt||dD | jd | _dS )3Generate an `__all__` variable for the given names.r*   NrC   c                 S  s   h | ]
}| d dd qS r0   )r   r3   r!   r!   r"   r6      rA   zgenerate_all.<locals>.<setcomp>r   r   r   tuple[int, str]c                 S  s8   |   rd| fS | r| d   rd| vrd| fS d| fS )Nr   r   r   r*   )isupperr_   r!   r!   r"   	_sort_key   s
   zgenerate_all.<locals>._sort_keyr   c                   s   g | ]
}  d | dqS )"z",r!   )r4   r   r;   r!   r"   r@      rA   z generate_all.<locals>.<listcomp>rb   r   )r   r   r   rw   )rH   rI   r<   rh   )r%   rj   r(   ry   r!   r;   r"   generate_all   s   


r{   c                 C  sb   t | jdks	J | j}| jd ddd| dd| d| dd	d
d| ddd| jd g| _dS )rv   r*   r   r9   rq   zfrom .z import *  # noqa: F403z import __all__ as __all__zif "__all__" not in globals():z    __all__ = []z__all__.extend(z__all__)rr   rB   r   N)rH   rI   rK   )r%   r[   r!   r!   r"   generate_export   s   


r}   code_blockslist[CodeBlock]module_namer   object_infoslist[ObjectInfo]init_cfgr	   is_rootboolc                 C  sj  d}| s|d| d7 }t dd | D s|tj7 }|r1|tdd7 }|d|j d	|j d
7 }t dd | D sA|t|7 }|rK|tdd7 }dd |D }|D ]P}|j}	|j}
|	du raqT|	|	|	}	|	
ddd }|
rw|	|
|
n|
}
|
r|

ddd nd}|
r|
|vrd|
dd }|t|
|7 }|t||	|7 }qTt dd | D s|tj7 }|S )z:Generate the initial FFI API stub code for a given module. z"""FFI API bindings for ."""
c                 s      | ]}|j d kV  qdS )zimport-sectionNkindr4   r%   r!   r!   r"   re          z#generate_ffi_api.<locals>.<genexpr>ztvm_ffi.libinfo.load_lib_module_FFI_LOAD_LIBzLIB = _FFI_LOAD_LIB("z", "z")
c                 s  r   )globalNr   r   r!   r!   r"   re     r   ztvm_ffi.register_object_FFI_REG_OBJc                 S  s   h | ]}|j r|j qS r!   )type_key)r4   rW   r!   r!   r"   r6     s    z#generate_ffi_api.<locals>.<setcomp>Nr   r   r   Objectr   c                 s  r   )r|   Nr   r   r!   r!   r"   re   $  r   )anyCPROMPT_IMPORT_SECTION_prompt_import_objectpkgshared_target_prompt_globalsr   parent_type_keyr   r   replace_prompt_class_defPROMPT_ALL_SECTION)r~   r   r   r   r   r   r   defined_type_keysrW   r   r   	type_nameparent_type_namer!   r!   r"   generate_ffi_api   sD   

r   _ffi_api	submodulec                 C  sJ   dt j d| dt j d}| sd| d| S tdd | D s#|S dS )z:Generate the `__init__.py` file for the `tvm_ffi` package.
z export/z"""Package r   c                 s  r   )exportNr   r   r!   r!   r"   re   5  r   z generate_init.<locals>.<genexpr>r   )r   
STUB_BEGINSTUB_ENDr   )r~   r   r   r%   r!   r!   r"   generate_init)  s   r   r^   )r   r   r   r   r   r   r   r   )r%   r   r&   r'   r   r   r   r   r(   r   r   r)   )r%   r   r   r   r   r   r(   r   rR   r
   r   r)   )r%   r   r   r   r(   r   r   r)   )r%   r   rj   ru   r(   r   r   r)   )r%   r   r   r)   )r~   r   r   r   r   r   r   r   r   r	   r   r   r   r   )r   )r~   r   r   r   r   r   r   r   )__doc__
__future__r   rZ   r   r   r   r   
file_utilsr   utilsr   r   r	   r
   r   r$   rQ   rY   rt   r{   r}   r   r   r!   r!   r!   r"   <module>   s    

0
+
5

@