o
    Y۷i                     @  s   d Z ddlmZ ddlZddlZddlmZ ddlmZ ddl	m
Z
mZ ddlmZmZ dd	lmZ dd
lmZmZmZ ejddd!ddZd"ddZd#ddZd$ddZejddd%dd ZdS )&z7Stateful helpers for querying TVM FFI runtime metadata.    )annotationsN)defaultdict)GetRegisteredTypeKeys)
TypeSchema+_lookup_or_register_type_info_from_type_key)get_global_func_metadatalist_global_func_names   )consts)FuncInfoNamedTypeSchema
ObjectInfo)maxsizetype_keystrreturnr   c                 C  s$   t t| }|j| ksJ t|S )z2Construct an `ObjectInfo` from an object type key.)r   r   r   r   from_type_info)r   	type_info r   L/home/ubuntu/vllm_env/lib/python3.10/site-packages/tvm_ffi/stub/lib_state.pyobject_info_from_type_key!   s   
r   dict[str, list[FuncInfo]]c               	   C  s   i } t  D ]F}z
|dd\}}W n ty'   ttj d| tj  Y qw z| |g t	| W q t
yK   ttj d| tj  Y qw t|  D ]}| | jdd d qR| S )z8Collect global functions from TVM FFI's global registry..r	   z+[Skipped] Invalid name in global function: z'[Skipped] Function has no type schema: c                 S  s   | j jS )N)schemaname)xr   r   r   <lambda>7   s    z&collect_global_funcs.<locals>.<lambda>)key)r   rsplit
ValueErrorprintCTERM_YELLOW
TERM_RESET
setdefaultappend_func_info_from_global_name	Exceptionlistkeyssort)global_funcsr   prefix_kr   r   r   collect_global_funcs)   s   
r/   dict[str, list[str]]c               	   C  sl   i } t  D ]}z
|dd\}}W n	 ty   Y qw | |g | qt|  D ]}| |   q+| S )zCCollect registered object type keys from TVM FFI's global registry.r   r	   )r   r   r   r$   r%   r(   r)   r*   )global_objectsr   r,   r-   r.   r   r   r   collect_type_keys;   s   
r2   	type_keys	list[str]list[ObjectInfo]c                   s:  t t| }dd |D  tt }tt}  D ]+\}}|j}| v r=|| | ||  d7  < ||  d7  < q||  d7  < q| D ]}|	  qJdd | D }t
| g }	|rt
|}|	| || D ]}
||
  d8  < ||
 dkrt
||
 qq|sct|	t ksJ  fdd|	D S )zNCollect ObjectInfo objects for type keys, topologically sorted by inheritance.c                 S  s   i | ]}|t |qS r   )r   .0r   r   r   r   
<dictcomp>N   s    
z$toposort_objects.<locals>.<dictcomp>r	   r   c                 S  s   g | ]
\}}|d kr|qS )r   r   )r7   tydegr   r   r   
<listcomp>`   s    z$toposort_objects.<locals>.<listcomp>c                   s   g | ]} | qS r   r   r6   infosr   r   r;   l   s    )r(   dictfromkeysr   intitemsparent_type_keyr%   valuesr*   heapqheapifyheappopheappushlen)r3   unique_type_keyschild_types	in_degreer   inforB   childrenqueuesorted_keyschild_type_keyr   r<   r   toposort_objectsJ   s:   



rQ   r   r   c                 C  s"   t t| tt| d dddS )z3Construct a `FuncInfo` from a global function name.type_schema)r   r   F)r   	is_member)r   r   r   from_json_strr   )r   r   r   r   r&   o   s   r&   )r   r   r   r   )r   r   )r   r0   )r3   r4   r   r5   )r   r   r   r   )__doc__
__future__r   	functoolsrD   collectionsr   tvm_ffi._ffi_apir   tvm_ffi.corer   r   tvm_ffi.registryr   r    r
   r!   utilsr   r   r   	lru_cacher   r/   r2   rQ   r&   r   r   r   r   <module>   s"   




%