B
    d                @   s<  d dl mZmZm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 d dlZd dlmZ ed	ZdddZdddZG dd deZdddZdd Zdd Zdd Zdd ZdddZG dd  d eZe Zed! Zd"d# Z d$d% Z!d&d' Z"d(d) Z#d*d+ Z$d,d- Z%d.d/ Z&G d0d1 d1eZ'G d2d3 d3eZ(G d4d5 d5eZ)G d6d7 d7e)Z*d8d9 Z+d:d; Z,d<d= Z-dd?d@Z.dAdB Z/dCdD Z0dEdF Z1dGdH Z2dIdJ Z3dKdL Z4ddMdNZ5ddPdQZ6dRdS Z7dTdU Z8G dVdW dWeZ9dXdY Z:dZd[ Z;d\d] Z<d^d_ Z=dd`daZ>dbdc Z?ddde Z@dfdg ZAdhdi ZBdjdk ZCdldm ZDdndo ZEdpdq ZFdrds ZGdtdu ZHddvdwZIddxdyZJdzd{ ZKd|d} ZLdd~dZMdd ZNdd ZOdd ZPdZQdd ZRdddZSdd ZTG dd deZUdd ZVdd ZWdZXddddddddd>deXd>e d>d>d>di di de e e e e dddd>fddZYdS )    )absolute_importdivisionprint_function)range)product)
group_args)mutable)AutoN)zip   P   F   c                s.  fddt |}|kr(| d S x"t|D ]}|| dkr2P q2W t|j}|d|rh| d S g |}xt||k r|| }d|dkr|}	|}
|d7 }x6||k r|}|| }|d7 }||	kr|dkrP qW tqt|d	kr |d7 }d|f qt|d
|r$|d7 }d|f qt|d|s<|d|rT|d7 }d|f qt|d|s|d|s|d|s|d|r|d7 }d|f qt|d|s|d|r|d7 }d|f qt|d|rP qt|d7 }qtW d|f || }ddlm}m} t	|||||| d   }d dfdd}|d|rZd}nd}d}d}xtt D ] \}} fdd}|   |kr  |kr |dks| s | | 
 }dkr| || n
||d | |}|}qtW  |k r*|| d  d d S )Nc                s    |  td d S )N,)replacefmt_comma_placeholder)line)callback i/mnt/filia/a/genomebrowser/www/genomebrowser/fleming/tools/molprobity/modules/cctbx_project/fable/cout.pycb_finalize   s    z,break_line_if_necessary.<locals>.cb_finalize z//z"'r      \(z,    z = z),    z + z - z * z / z && z ||    )iroundiceilc                s   xt |  kr| drd  }| td|}|dkrH|d }nDxBt|d ddD ]*}| | dkrZ|| d dkr|d8 }P qZW t d | d |  d  d| |d   } qW  d |   d S )	N"r   r   r   r   r   r   )len
startswithrfindr   r   AssertionError)sij)r   fmax_lenr   r   break_more_if_necessaryJ   s    
z8break_line_if_necessary.<locals>.break_more_if_necessaryzif (c                 sD   x>t tD ],} |  \}}|dkr|   krdS qW dS )Nr   TF)r   r!   )jppriop)br(   ipr)   potential_break_pointsr   r   following_point_is_bettera   s
    z:break_line_if_necessary.<locals>.following_point_is_better)r%   )r!   r   r$   r"   findappendlibtbx.math_utilsr   r   maxrstrip)r   r   r)   Zmin_lenncZi_startZlswiccqZic_qZprev_cnr   r   lr*   Zindent_widthZpprioppr,   r-   r1   r%   r   )r.   r   r   r(   r/   r)   r0   r   break_line_if_necessary   s    


" 





r>   c                s@    g g  fdd}x"d |  D ]}t||d q(W S )Nc                s<    d d ks&|  d ks&|   ds8|  |  d< d S )Nr   z//C)lstripr"   r3   )r   )	prev_lineresultr   r   r   y   s
    
zbreak_lines.<locals>.callback
)r   r   )join
splitlinesr>   )cpp_textr@   r   r   r   )r@   rA   r   break_linesv   s    rF   c               @   s   e Zd ZdddgZdd ZdS )dynamic_parameter_propsnamectypedefaultc             C   s   || _ || _|| _d S )N)rH   rI   rJ   )OrH   rI   rJ   r   r   r   __init__   s    z dynamic_parameter_props.__init__N)__name__
__module____qualname__	__slots__rL   r   r   r   r   rG      s   
rG   d   c             C   s  | t |krdd |D S dd |D }t|}t|||  }g }d}d}xxt|D ]l\}	}
||
 |kr|	|ksx||kr||||	d   d}|	d }q||||	  |
}|	}qT||
7 }qTW |t |k r|||d   tdd |D t |kst|S )Nc             S   s   g | ]
}|gqS r   r   ).0bufferr   r   r   
<listcomp>   s    z(create_buffer_blocks.<locals>.<listcomp>c             S   s   g | ]}t |qS r   )r!   )rR   linesr   r   r   rT      s    r   r   c             S   s   g | ]}t |qS r   )r!   )rR   blockr   r   r   rT      s    )r!   sumr5   	enumerater3   r$   )target_number_of_blocksbuffersZmin_lines_per_blockZnumbers_of_linesZ	sum_linesZlines_per_blockrA   Zblock_sum_linesr'   r&   r;   r   r   r   create_buffer_blocks   s0    

 r[   c              C   s   dd l } t| jd d d S )Nr   )limit)	tracebackprint
format_exc)r]   r   r   r   show_traceback   s    r`   c             C   sB   x,t t| D ]}| | dkr| |d  S qW t| dkr>dS dS )N0r    )r   r!   )stringr&   r   r   r   strip_leading_zeros   s    rd   c             C   s$   |  dd dd dd ddS )	Nr   z\\r   z\"	z\tz??z\?\?)r   )r%   r   r   r   escape_string_literal   s
    rf   c             C   s   t |jdkstg }xZ|jdd D ]H}g }|\}}|d k	rJ||j |t| d |d |d| q&W dd| S )Nr   r   r   )vmapleadingtokrb   zfem::cmplx(%s)z, )r!   valuer$   r3   convert_tokenrC   )rg   ri   ccpartr9   sign_tokZval_tokr   r   r   convert_complex_literal   s    ro   c             C   s6  |j }| r| ||S | rv|dkr0dS |dkr<dS |dkrHdS |dkrTdS |d	kr`d
S |dkr||rp|S d| d S |dkr|rdS d| d S |dkrd| d S |dkr|d kr|  d|_ dS |dkr|rdS dS |dks|dkrdS |dks
|dkrd
S |dks"|dkr&dS |dks:|dkr>dS |d ksR|d!krVd"S |d#ksj|d$krnd%S |  | rd&t|j  d& }|d ks|j s|S d'| S | r|d(krd)S d*S |	 r|S |
 rd+| S | r|d, S | r|d-d.S | r*t| |d/S |  d S )0Nz.not.!z.and.z && z.or.z || z.eqv.z == z.neqv.z != )+-r   *zstar /z//Tz + :z1, z, z.eq.z==z.ne.z/=z.lt.<z < z.le.z<=z <= z.gt.>z > z.ge.z>=z >= r   zstr_cref(%s)z.false.falsetrue0xr(   de)rg   ri   )rj   is_identifiergetis_opraise_internal_errorraise_not_supported	is_stringrf   
is_logical
is_integeris_hexadecimalis_realis_double_precisionr   
is_complexro   )rg   rh   ri   had_str_concattvr%   r   r   r   rk      s    
 







rk   c               @   s"   e Zd ZdgZdd Zdd ZdS )major_types_cacheidentifiersc             C   s
   d | _ d S )N)r   )rK   r   r   r   rL     s    zmajor_types_cache.__init__c          	   C   s   | j d krt | _ dd l}|jjddtjjd}d}t|}|	 
 }W d Q R X x<|D ]4}||rZ|dsvt| j |t|d  qZW || j kS )Nr   fablezfem/major_types.hpp)module_namepathtestz  using fem::;r    )r   setlibtbx.load_envenv
under_distosr   isfileopenreadrD   r"   endswithr$   addr!   )rK   rj   libtbxhppZ	using_femr(   rU   r   r   r   r   __contains__  s    



zmajor_types_cache.__contains__N)rM   rN   rO   rP   rL   r   r   r   r   r   r     s   r   a  and and_eq asm auto bitand bitor bool break case catch char class compl const
const_cast continue default delete do double dynamic_cast else enum explicit
export extern false float for friend goto if inline int long mutable namespace
new not not_eq operator or or_eq private protected public register
reinterpret_cast return short signed sizeof static static_cast struct switch
template this throw true try typedef typeid typename union unsigned using
virtual void volatile wchar_t while xor xor_eq argv argc
c             C   s   | t ks| tkrd|  S | S )NZidentifier_)major_typescpp_keywords)
identifierr   r   r   prepend_identifier_if_necessary/  s    r   c             C   s^   |j d kr|jdd  }n$|jd k	r:|j|jd d  }nd }|d k	rZ| d|    d S )Nr   z//C%s)	stmt_offstextindex_of_exclamation_markstmt
expandtabsr6   )r   sltr   r   r   produce_comment_given_sl4  s    

r   c             C   s,   |d krd S x|j D ]}t| |d qW d S )N)r   r   )source_line_clusterr   )r   sslr   r   r   r   produce_comment_given_ssl>  s
     r   c             C   s   x|D ]}t | |d qW d S )N)r   r   )r   )r   ssl_listr   r   r   r   produce_commentsD  s    
r   c             C   s4   x.|D ]&}|dkrx|D ]}| | qW d S qW d S )Nz//Cr   )r   rS   r   r   r   r   flush_comments_if_non_trivialH  s
    

r   c             C   s4   g }t |j|jd t|j|jd t| |d d S )N)r   r   )r   r   )r   rS   )r   r3   leading_commentsr   top_sslr   )r   fprocrS   r   r   r   produce_leading_commentsO  s
    r   c             C   s4   g }t |j|jd t|j|jd t| |d d S )N)r   r   )r   r   )r   rS   )r   r3   end_sslr   trailing_commentsr   )r   r   rS   r   r   r   produce_trailing_commentsV  s
    r   c               @   s4   e Zd ZddgZdd Zdd Zdd Zd	d
 ZdS )comment_managersl_listindexc             C   sV   g | _ x2|jD ](}|d k	rx|jD ]}| j | q"W qW | j jdd d d| _d S )Nc             S   s   | j S )N)global_line_index)source_liner   r   r   <lambda>g      z*comment_manager.__init__.<locals>.<lambda>)keyr   )r   
body_linesr   r3   sortr   )rK   r   r   r   r   r   r   rL   a  s    zcomment_manager.__init__c             C   s&   t || j| j d |  jd7  _d S )N)r   r   r   )r   r   r   )rK   r   r   r   r   producej  s    zcomment_manager.producec             C   sL   |j jd j}x8| jt| jkrF| j| j j}||kr8P | j|d qW d S )Nr    )r   )r   r   r   r   r!   r   r   )rK   executable_infor   r&   r'   r   r   r   insert_beforen  s    zcomment_manager.insert_beforec             C   s&   x | j t| jkr | j|d qW d S )N)r   )r   r!   r   r   )rK   r   r   r   r   flush_remainingv  s    zcomment_manager.flush_remainingN)rM   rN   rO   rP   rL   r   r   r   r   r   r   r   r   ]  s
   	r   c               @   s$   e Zd ZddddddgZdd Zd	S )
conv_hook_infoignore_common_and_saveneeds_sve_dynamic_parametersvariant_common_namesneeds_is_called_first_timeneeds_variant_binddata_init_after_variant_bindc             C   s(   d| _ d| _d | _d | _d | _d | _d S )NF)r   r   r   r   r   r   )rK   r   r   r   rL     s    zconv_hook_info.__init__N)rM   rN   rO   rP   rL   r   r   r   r   r   z  s   r   c               @   s6   e Zd Zddddddddd	d
dgZdd Zdd ZdS )global_conversion_infotopological_fprocsdynamic_parametersfortran_file_commentsfem_do_safearr_nd_size_max
inline_allfprocs_by_nameconverted_commons_infoseparate_namespacesdata_values_block_sizedata_specializationsc             C   sL   || _ || _|| _|| _|| _|| _|j | _|| _|| _	|	| _
|
| _d S )N)r   r   r   r   r   r   
all_fprocsr   r   r   r   r   )rK   r   r   r   r   r   r   r   r   r   r   r   r   r   rL     s    zglobal_conversion_info.__init__c             C   s   t | |dS )N)global_conv_infor   )conversion_info)rK   r   r   r   r   specialized  s    z"global_conversion_info.specializedN)rM   rN   rO   rP   rL   r   r   r   r   r   r     s   r   c               @   sN   e Zd Zejdddg ZdddZdd Zd	d
 Zdd Zdd Z	dd Z
dS )r   r   r   rg   Nc             C   sr   d }x,t jD ]"}|d k	r"t||}t| || qW || _| jd krJd | _nt| jd| _|d krhi | _n|| _d S )N)r   )r   rP   getattrsetattrr   r   rg   )rK   r   r   rg   valslotr   r   r   rL     s    

zconversion_info.__init__c             C   s   |j j}t|| j|< d S )N)id_tokrj   r   rg   )rK   fdeclr   r   r   r   set_vmap_force_local  s    z$conversion_info.set_vmap_force_localc             C   s~   | j d k	r8| j |}|d k	r8|d t| | j|< dS |dkrRd| | j|< dS ddlm} ||jkrzd| | j|< dS dS )	Nz::T)Zgetargciargczcmn.%sr   )
intrinsicszfem::F)r   r~   r   rg   r   r   extra_set_lower)rK   r   nsr   r   r   r   set_vmap_for_callable  s    

z%conversion_info.set_vmap_for_callablec             C   s   |j j}| r$dt| | j|< n| r@dt| | j|< nd| r|dkr`d| | j|< q|dkrtd| j|< qd| | j|< n | j|j jds| j|d	 d
S dS )Nzcmn.zsve.)floatintcharzfem::fr   z	cmn.iargczfem::)r   )r   FT)	r   rj   	is_commonr   rg   is_saveis_intrinsicr   r   )rK   r   r   r   r   r   set_vmap_from_fdecl  s    z#conversion_info.set_vmap_from_fdeclc             C   s6   |j j}| j|}|d kr2| j|d | j| }|S )N)r   )r   rj   rg   r~   r   )rK   r   r   rA   r   r   r   vmapped  s    
zconversion_info.vmappedc             C   s<   | j |}|d kr8| j|ds.t|| j |< | j | }|S )N)r   )rg   r~   r   r   )rK   r   rA   r   r   r   vmapped_callable  s    
z conversion_info.vmapped_callable)NNN)rM   rN   rO   r   rP   rL   r   r   r   r   r   r   r   r   r   r     s     
r   c             C   sT   | j j|}|d kr|g}x2|D ]*}| j|}|d k	r"|jr"|jjs"dS q"W dS )NTF)r   "externals_passed_by_arg_identifierr~   r   	needs_cmn	conv_hookr   )	conv_infocalled_nameZcalled_namesZ	sub_fprocr   r   r   called_fproc_needs_cmn  s    
r   c             C   sP   |d k	rL|  rL| jd k	rL| jd k	rL| jj|d}| rLt| |jdrLdS dS )N)r   )r   r   TF)r}   r   r   	get_fdeclis_user_defined_callabler   rj   )r   prev_tokr   r   r   r   cmn_needs_to_be_inserted  s    


r   c             C   sj   d}|d }|  rP|jdkr0d}|d d }n |jdkrPd|j }|d d }|d t| |dd	 d
 S )Nzfem::powr   1rb   )234z
fem::pow%sr   T)r   tokenscommas))r   rj   convert_tokens)r   r   funZpow_tokr   r   r   convert_power  s    


r  Fc       
   	   C   sz  g }|j }d }|d kr tdd}ddlm} x0||dD ] }| rt|jdkr|jd jddr|jd  r|d	|jd j  n|t	| |jd|d
 n|
 rt| |drt|jdkrt|jd jdkrd}	qd}	nd}	||	t	| |jd|d
 d  nL| rtn<| r:|t| |jd n|t| jt|dk||d |}q:W |rpd|S d|S )NF)rj   r   )group_power)r   r   rs   r   zstar /* %s UNHANDLED */)r   r   r  r   )r   r   z(cmn, z(cmnr   Tr  )r   r   )rg   rh   ri   r   z, rb   )r3   r   fable.tokenizationr  is_seqr!   rj   
is_op_withr   r  is_parenthesesr   is_implied_dor$   is_powerr  rk   rg   rC   )
r   r   r  r   rA   rappr   r  ri   opr   r   r   r  ,  sL    

"




r  c             C   sP   | d k	rt | dkstt | dks0| d  s<| d   tt| d jdS )Nr   r   )rc   )r!   r$   r   r   r   rd   rj   )r   r   r   r   convert_to_int_literal[  s    r  c                s*  |j d krH| jd k	st| jj|jjd |_ |j d krH|jjddt|j t	r\|j  n|j j |j
|j} dkrd krd}nt| d}d| }|d krd}nx fd	d
} dkr|dd}nT dkr|dd}n> dkr|dd}n( dkr"d k	rd   d}n  dkrHd k	rBd   d}nڈ dkrd krpd}|d krd}nptd}|dkrd}|d krd}nH|dkrd}|d krd}n*|dkrd}|d krd }nd   n@ d!krd k	rd   d}|d kr"d}ntd"  ||fS )#Nr   zMissing data type)msg	characterr   )r   r   zfem::str<%s>z
fem::char0c                s   d kr| S d t df S )Nzfem::%s_star_%d)r   )r  )rI   )data_type_codesize_tokensr   r   convert_to_ctype_with_sizev  s    z5convert_data_type.<locals>.convert_to_ctype_with_sizelogicalbool)rI   integerr   realr   Zdoubleprecisiondoublebyter   complexzstd::complex<float>zfem::float0)r         zstd::complex<double>zfem::double0    zstd::complex<long double>zfem::long_double0Zdoublecomplexz$Not implemented: data_type_code = %s)	data_typer   r$   implicitr~   r   rj   raise_semantic_error
isinstancestrr  
dim_tokensr  raise_syntax_errorr  r   RuntimeError)r   r   crhsr$  ZcsizerI   r  szr   )r  r  r   convert_data_typea  sx    



















r)  c       	      C   s   d}x.|D ]&}x |j D ]}|jddrd}P qW q
W g }xbt|D ]V\}}t| |j d}|dkrfd}n|dd	}|r|d
|d |f  qB|| qBW |rd|}ndd| d }|S )NFru   )rj   T)r   r   zstar starz,  * z, starz	dim%d(%s)r   .z
dimension(z, r  )rj   r	  rX   r  r   r3   rC   )	r   r$  Zneed_originr   ri   ZdimsZi_dimcdimrA   r   r   r   convert_dims  s&    

r-  c             C   sD   ddl m}m} || dt| ks4|| dt| kr8| S d|  d S )Nr   )unsigned_integer_scanidentifier_scan)coder   r  )r   r.  r/  r!   )exprr.  r/  r   r   r   parenthesize_if_necessary  s
    r2  c                s|    fdd}x`t |D ]T\}}|jddrt||d | dd}t|||d d  dd}d||f S qW d	||d S )
Nc                s   t  | dS )N)r   r   )r  )toks)r   r   r   conv  s    z(convert_dim_to_static_size.<locals>.convru   )rj   )r3  )r1  r   z%s-%s+1z%s)rX   r	  r2  )r   r   r4  r&   ri   r(   r<   r   )r   r   convert_dim_to_static_size  s    r5  c             C   sN   g }x |D ]}| t| |jd q
W t|dkr:|d S ddd |D S )N)r   r   r   z * c             S   s   g | ]}t |d qS ))r1  )r2  )rR   r1  r   r   r   rT     s    z/convert_dims_to_static_size.<locals>.<listcomp>)r3   r5  rj   r!   rC   )r   r$  Ztermsr   r   r   r   convert_dims_to_static_size  s    
r6  c             C   sp  t | ||d\}}|j}d }d}|d k	rdd }|s| jd k	rt|dkr| jj|dd}	|	d dkrt|	}
|
t| jkrddl	m
} ||drt}t| |d	d
}nddd |	D }d||f }|drd}nd}dt|||f }| jdk rd}|d krJt|dkr$d|t|f }n|}|dr:d}nd}d||f }|}|d krdt| |d}||||fS )N)r   r   r'  z
fem::fill0r   F)r$  allow_powerr   )dimensions_are_simple)r$  T)r   r   r  z, c             S   s   g | ]}d | qS )z%dr   )rR   vr   r   r   rT     s    z.convert_data_type_and_dims.<locals>.<listcomp>z%s, %srw   r   rb   zarr_%dd<%s%s>zfem::no_fill0r   z%s, %dz	arr<%s%s>)r   r$  )r)  r$  r   r!   r   eval_dimensions_simplecountr   abs
fable.readr8  r	   r  rC   r   r-  )r   r   r'  	force_arrrI   dtcdimscfill0Zatypevalsr(  r8  r   templsr   r   r   convert_data_type_and_dims  sL    




 

 
rD  rb   c             C   s   |  dd| dS )Nzarr<z
arr_%sref<r   )r   )rI   cconstr   r   r   ad_hoc_change_arr_to_arr_ref  s    rF  c             C   s2   |  dr*| drd}nd}d| |f S d|  S )Nzfem::rw   r   rb   zfem::zero<%s%s>()zfem::%s0)r"   r   )rI   r%   r   r   r   zero_shortcut_if_possible  s    

 rG  c       
         s   t |||d\}}}}|j|d}|d krb|d kr<t|d} fdd}	| d|	 |||f  dS |tkr~| d|||f  n| d	||||f  d
S )N)r   r   r'  )r   )rI   c                  s    rdS dS )Nzconst rb   r   r   )constr   r   const_qualifier  s     z,convert_declaration.<locals>.const_qualifierz%s%s %s = %s;Fz
%s %s(%s);z%s %s(%s, %s);T)rD  r   rG  r	   )
r  r   r   r'  rH  rI   r@  rA  vnamerI  r   )rH  r   convert_declaration  s     
rK  c               @   s   e Zd ZddddddddgZd(ddZdd Zdd Zdd Zdd Zdd Z	dd Z
dd Zdd Zd)ddZdd  Zd!d" Zd#d$ Zd*d&d'Zd	S )+scopeparentopening_textauto_close_parentclosing_textdatainsert_pointtrailing_statement_label_indextailNFc             C   s4   || _ || _|| _d | _g | _d | _d | _d | _d S )N)rM  rN  rO  rP  rQ  rR  rS  rT  )rK   rM  rN  rO  r   r   r   rL   )  s    zscope.__init__c             C   s
   t | jS )N)r!   rQ  )rK   r   r   r   current_point3  s    zscope.current_pointc             C   s   |t | jkS )N)r!   rQ  )rK   pointr   r   r   point_is_current6  s    zscope.point_is_currentc             C   s   t | j| _d S )N)r!   rQ  rR  )rK   r   r   r   remember_insert_point9  s    zscope.remember_insert_pointc             C   s   | j | jdS )N)rV  )rW  rR  )rK   r   r   r   insert_point_is_current<  s    zscope.insert_point_is_currentc             C   s0   | j d k	st| j| j | |  j d7  _ d S )Nr   )rR  r$   rQ  insert)rK   objr   r   r   
top_append?  s    zscope.top_appendc             C   s   | j | d | _d S )N)rQ  r3   rS  )rK   r[  r   r   r   r3   D  s    zscope.appendc             C   s    t | j| _| jd|  d S )Nzstatement_%s:)r!   rQ  rS  r3   )rK   labelr   r   r   append_statement_labelH  s    zscope.append_statement_labelc             C   s   | j | d S )N)rQ  r3   )rK   r   r   r   r   append_commentL  s    zscope.append_commentc             C   s   d | _ t| ||dS )N)rM  rN  rO  )rS  rL  )rK   rN  rO  r   r   r   open_nested_scopeO  s    zscope.open_nested_scopec             C   s"   | j d k	r| j| j   d7  < d S )Nr   )rS  rQ  )rK   r   r   r   finalizeT  s    
zscope.finalizec             C   sz   | j d k	st| jd kst| jd ks*t|   dg| _| }x|jj|krT|j}q@W |jj| |jrt|j	 S |jS )N})
rN  r$   rP  rT  ra  rM  rQ  r3   rO  close_nested_scope)rK   headr   r   r   rc  X  s    

zscope.close_nested_scopec             C   sN   | j d k	st| jd kst| jd ks*t|   dg| _t| |d| _| jS )Nrb  )rM  rN  )rN  r$   rP  rT  ra  rL  )rK   rN  r   r   r   attach_tailf  s    zscope.attach_tail  c             C   s   x| j D ]~}t|trz|}xj|d k	rvx|jD ]}|||  q,W |j||d d x|jD ]}|||  qZW |j}qW q|||  qW d S )Nz  )r   indent)rQ  r"  rL  rN  collect_textrP  rT  )rK   r   rg  r[  currr   r   r   r   rh  o  s    

zscope.collect_text)NF)F)rf  )rM   rN   rO   rP   rL   rU  rW  rX  rY  r\  r3   r^  r_  r`  ra  rc  re  rh  r   r   r   r   rL    s,   


	rL  c             C   s   |j d kr|}n|jdgd}|d|||f  x>|jD ]4}t||}|d k	r:t| |d}	|d||	f  q:W |jd  d7  < ||k	r|  |jdgd}
t| |j d}|
d	|  |
  d S )
Nztry {)rN  zcmn.io.%s%s(%s))r   r   z	  .%s(%s)r    r   zcatch (fem::io_err const&) {zgoto statement_%s;)errr`  r3   chainr   r  rQ  rc  )r   
curr_scopeio_functionio_function_specializationio_call_argsiolistio_scoper   r   Zcargcatch_scopeclabelr   r   r   convert_io_statement_with_err}  s$    


rt  c             C   sL   d}t | dkr | d  r d}|d t | krH| | }| pF| S dS )Nr   r   r   F)r!   is_unary_plus_or_minusr}   r   )r   r&   ri   r   r   r   is_simple_do_last  s    rv  c       	      C   s  dt |  krdksn tt| jd|d}t| |d jd}t| |d jd}t |dkrt| |d jd}|jd||||f gd	S | jr|jd
|||f gd	S t|d jdr|jd|||f gd	S |jdgd	}|	d|  |jd||f gddS )Nr   r   T)rg   rh   ri   r   )r   r   r   zFEM_DOSTEP(%s, %s, %s, %s) {)rN  zFEM_DO_SAFE(%s, %s, %s) {)r   zFEM_DO(%s, %s, %s) {{zint fem_do_last = %s;zFEM_DO(%s, %s, fem_do_last) {)rN  rO  )
r!   r$   rk   rg   r  rj   r`  r   rv  r3   )	r   parent_scopei_tok
fls_tokensr&   r(   r<   r%   Zscope_for_lastr   r   r   convert_to_fem_do  s&    r{  c             C   sR   t |tstx>t|D ]2\}}| r8t| |jd q| r| | qW d S )N)rA   r   )	r"  listr$   rX   is_seq_or_parenthesesfind_implied_dosrj   r  r3   )rA   r   r&   ri   r   r   r   r~    s    r~  c          	      s  G  fdddt }|d kr*| }d}nd}d }|d krDtdd}ddlm}	 x@|	|dD ]0}
|
 rt ||
j||d	 |   n|
 r|	  t
||d
r|d t|
jdkr|  t ||
j||d	 |  n|
 rR|  ddlm} ||
jd}t||j|jd}t| ||
jd |j |d |  d S |
 rr|t||
jd n|t|j|j|
|d |
}q^W |r|  d S )Nc                   sR   e Zd ZddgZdd Zdd Zdd Zd	d
 Zdd Zdd Z	 fddZ
dS )z convert_io_loop.<locals>.cbufferstringsrh   c             S   s   g | _ d| _d S )NT)r  rh   )rK   r   r   r   rL     s    z)convert_io_loop.<locals>.cbuffer.__init__c             S   s   | j | d| _d S )NF)r  r3   rh   )rK   rc   r   r   r   r3     s    z'convert_io_loop.<locals>.cbuffer.appendc             S   s2   t | jdkr(| jd dkr(| jd d| _d S )Nr   r    z, T)r!   r  r3   rh   )rK   r   r   r   append_comma  s    z-convert_io_loop.<locals>.cbuffer.append_commac             S   s>   t | jdkr:| jd dks t| j  | js4td| _d S )Nr   r    z, F)r!   r  r$   poprh   )rK   r   r   r   remove_trailing_comma  s
    

z6convert_io_loop.<locals>.cbuffer.remove_trailing_commac             S   s   | j d d| _d S )Nr   T)r  r3   rh   )rK   r   r   r   append_opening_parenthesis  s    z;convert_io_loop.<locals>.cbuffer.append_opening_parenthesisc             S   s8   t | jdkst| jd dkr(|   | jd d S )Nr   r    z, r  )r!   r  r$   r  r3   )rK   r   r   r   append_closing_parenthesis  s    z;convert_io_loop.<locals>.cbuffer.append_closing_parenthesisc                s:   |    t| jdkr6d d| jf  g | _d S )Nr   z%s, %s;rb   )r  r!   r  r3   rC   )rK   )io_oprq  r   r   flush  s    z&convert_io_loop.<locals>.cbuffer.flushN)rM   rN   rO   rP   rL   r3   r  r  r  r  r  r   )r  rq  r   r   cbuffer  s   r  TF)rj   r   )r  )r   )r   cbufr   )r   r   cmn)implied_do_info)r   rx  ry  rz  )rq  r  r   r   r   )r   r   )rg   rh   ri   r   )objectr   r  r  r  convert_io_looprj   r  r
  r  r   r3   r!   r  r  r  r  r{  r   rz  
dlist_sizerc  r  r  rk   rg   rh   )rq  r  r   r   r  r   r  Zowning_cbufr   r  ri   r  idido_scoper   )r  rq  r   r    sx    






r  c       	      C   s(  |  st|j}t|dks"tt|dkr2dS g }xftdt|D ]T}|| }|dksb| sj|  t| |||| jd |t	| || jdd qFW | j
j| }t|dkr|jd k	rd|d  S |jjd	kr|  d
|d  S t|dks|jjd	ks|jd kr|  dt| S )Nr   r   rb   r   )r   	top_scoperl  r   T)r   r   r  zarr_index(%s)r  zstr_index(%s)r   zarr_index(%s)(%s))r  r$   rj   r!   r   r
  r!  'declare_identifiers_parameter_recursionr3   r  r   fdecl_by_identifierr$  r  tuple)	r   r  r   tok_seqr   Zcindicesr&   ri   r   r   r   r   equivalence_align_with_arg  s:    
r  c             C   s   | j r
dS |rdS dS )Nrb   r9   z const)is_modified)r   shortr   r   r   rE  <  s
      rE  c             C   s  | j j| }t| |d dd }|jd kr.d}n,t| |||jd t| |jd}	d|	 d }|jj}|}
|
drx|
d	7 }
|	d
|
||f  | j
|d | j|d}|jdkrd}d}d}d}nd}d}d}d}|jd kr&|jjdkrd|t|dd|||f }nd||t|dd||||
f }n|jjdkrtdt|j }|dkrPd}d|t|dd||||||	|f	 }nBdt|j }|dkrd}d|t|dd||||||||	|f }|	| d S )N)r   r   r'  r   rb   )r   r  rl  r   )r   r$  r   r  rw   r   zmbr<%s> %s%s;)r   z/* z*/z */ z /* =r  z %sstr_%sref %s %s %s.bind_str();T)r   r  z%s%s%s& %s %s %s.bind<%s>();Fz%dr   z0%sstr_arr_%sref<%s> %s(%s%s.bind_str()%s, %s)%s;z, %dz, 1z.%sarr_%sref<%s%s> %s(%s%s.bind<%s>()%s, %s)%s;)r   r  r)  r$  r  r-  r   rj   r   r3   r   r   	use_countr  rE  r!   )r   r  variant_bind_chain
mbr_bufferbind_bufferr   r   rI   Zcdims_parensr@  Z
ctype_targrJ  preqZclmZprmbindingZref_dimr   r   r   convert_to_mbr_bindA  s`    




 
 r  c             C   s  |d dgkr|   |di}|g}	t|}
|d  x|D ]}d}x|jD ]}|jd j}||}|d krt|	 ||< }|	| |d k	rt| |||||d |d||d t| |||df g d	}qLW q<W d
d|	 g||
< |d d  d7  < |dg d S )Nr    r   r   z.align)r   r  r  r  r  r   z    %s<%d>(%s)r   )r   r  r   r  z .withz  equivalence(%s)z, r   )r  r!   r3   rj   r~   r  r  rC   )r   r  r  r  r  allocate_line_listsequiv_tok_clusterr   Zi_mbr_by_identiferZeq_identifiersi_block	equiv_tokZ
align_withr  Zeq_identifierZi_mbrr   r   r   assemble_allocate_line_lists|  sF    	



r  c             C   s   | d dgkr|    | d d d dkrF| d d d d | d d< t| dkrh| d d  d7  < n| dg x| D ]}|d| qzW d S )Nr    r   r   r   r   )r  r!   r3   rC   )r  r  Z	line_listr   r   r   add_allocate_lines_to_mbr_scope  s    
r  c             C   s  t g g g d}| j }|j}x| jj D ]\}}| jjj}|d ks,||krPq,|d|fd   g }|j	| d| gg}	xl|D ]d}
|
j
j}t| ||||j|d |j|}|d kr|	d |d  qt| ||||j|	||d qW t|	|d	 q,W | j }t|jjd
kr|d g }|j	| t }xn|jjD ]b}xZ|D ]R}xJ|jD ]@}|jd
 j}||krxqZ|| t| |d||j|d qZW qNW qDW dgg}	x<|jjD ]0}t| |d |d |	||d
 jd
 jd
 jd qW t|	|d	 t|jjd
krt }xp|jjD ]d}x\|D ]T}xL|jD ]B}|jd
 j}||krRq4|| t| |d|j|j|d q4W q(W qW dgg}	x>|jjD ]2}t| |d |jd |	||d
 jd
 jd
 jd qW t|	|jd	 |S )N)
first_timeloc_equivalencesbindingsz2common_variant %s(cmn.common_%s, sve.%s_bindings);r   z%s.allocate(),)r   r  r  r  r  r   r    r   )r   r  r  r  r  r  r  r   )r  r  r   z:save_equivalences sve_equivalences(sve.save_equivalences);sve_equivalenceszsve_equivalences.allocate(),r  zloc_equivalences.allocate(),)r   r   equivalence_infoequiv_tok_clusterscommonitemsr   r   r3   r  r   rj   r  r  equiv_tok_cluster_by_identifierr~   r  r  classified_equivalence_infor!   saver   r   localr  )r   r  Zresult_buffers
equiv_infor  common_namecommon_fdecl_listZvcnr  r  r   r   r  ceiZmbr_defined_alreadyr  r  r   r   r   %convert_variant_allocate_and_bindings  s    






 



 
r  c          	      sN  xFj jD ]8\}g  d}t }x~|D ]v\}}d}|d  rRt|dkrRd}|||   t|d}|d k	rd}t|gd}	d|	|f } | q*W d j	r|st|dkrdddd	d
dd d
t|d  fdd}
 fdd}fdd}g }t|d t|dkrj	rtt kr| rx8t D ]*\}}t|jd}|d||f  qZW qFtdd}d krt jkr|dd |f  n*|jdgd|
  d|    nt dkrxtj jdkr4tj jjdkr4|n|jdgd| }d|  d|  |k	r  n|d| d f  qtj jdkrtj jjdkrt jkr|n|jdgdd krt jkr
dd   n|
  n| }d|  tdd  |k	r  qW d S )!NFr   r   )r   r   Tz%s*datum(%s)r   r   r  r  zchar*)r  hexadecimalr  double_precisionr  rc   r  c           
      sL    d x<tdt jD ]&}  dd | | j    qW d S )Nzfem::data_values data;r   zdata.values, %s;z, )r3   r   r!   r   rC   )r  )ccsr   
data_scoper   r   data_values_blockedB  s
    
z)convert_data.<locals>.data_values_blockedc                 sF    d   dd    d dkr:d} nd } | S )Nzstatic const %s values[] = {z  %sz, z};zchar*_strz<%s>)r3   rC   )r%   )r  r  homogeneous_ctyper   r   values_for_data_of_typeH  s    
 z-convert_data.<locals>.values_for_data_of_typec                 sB   x<D ]4} t | jdkr jj| jd d}|jd k	rdS qW dS )Nr   r   )r   FT)r!   rj   r   r   r$  )r  r   )r   nlistr   r   have_no_array_targetsO  s    

z+convert_data.<locals>.have_no_array_targets)rA   r   z%s = %s;)r   r   r  zfem::data((values, %s)), %s;z, rw  )rN  z	data, %s;z)fem::data_of_type%s(FEM_VALUES_AND_SIZE),z  %s;z$fem::data_values data((values, %s));z.fem::data_of_type%s data(FEM_VALUES_AND_SIZE);rQ  )rq  r  r   r   )r   rQ  r   ru  r!   r   typer  r3   r   r~   r|  r~  r
   rj   r   rC   r`  rc  r   r   r  )r   data_init_scopeclistZhave_repetitionsZ	tok_typesrepetition_tokctoksr&   rl   crr  r  r  implied_dosr  cnr%   r   )r  r   r  r  r  r   convert_data%  s    




r  c             C   sp   ddl m} x^||dD ]P}|j| jkr*qd | j|j< | jj|d}t| ||| d t| |||d qW d S )Nr   )extract_identifiers)r   )r   )r   r  rl  r   )r   r  rl  r   )	r  r  rj   rg   r   r   r  $required_parameter_assignment_tokensdeclare_identifier)r   r  rl  r   r  r   r   r   r   r   r    s    r  c          	   C   s  x|j |jgD ]}|d krqddlm} ||d}x|D ]}|j|jjkrX|jdd |j| jkrfq:| jj	|d}|j
d krd }	n:t| |||j
d |j| jjkrd|j }	nt| |j
d	}	| j|d
s:t| j dk}
|
r|j}n|j}t|| ||	dd q:W qW d S )Nr   )r  )r   zRecursion in declaration)r  )r   )r   r  rl  r   zcmn.dynamic_params.)r   r   )r   T)r  r   r   r'  rH  )r  r$  r  r  rj   r   r!  rg   r   r   parameter_assignment_tokensr  r   r  r   r!   target_statement_labelsr\  r3   rK  )r   r  rl  r   Z	sd_tokensr  Zsd_id_tokensZ	sd_id_tokZsd_fdeclZsd_crhs	have_gotor  r   r   r   declare_size_dim_identifiers  s>    



r  c             C   s  t |dkstx|D ]}d }d }d }xp|jD ]f}	|	jd j}
|
|jjkr\|d ksVt|	}q.| jj|	jd d}|d k	r.| r.|d kst|	}|}q.W |d k	r|d k	rP qW t| j|d | j	|jjd krt
| |||jd t| |gd}d}|jjdkrrt| |jd}|jd kr<dt|d	d
|jj|||f S t| |jd}dt|d	d
t |j|jj||||f S t| |d d	dd d \}}|d krd|t|dd
|jj||f S dt|t|d	d
d|jj|||f S )Nr   )r   )r   )r   r  rl  r   )r   r   z// SIMPLE EQUIVALENCEr  zstr_%sref %s(%s, %s); %sT)r   r  )r   r$  z$str_arr_%sref<%d> %s(%s, %s, %s); %s)r   r   r'  r>  r   z%s%s& %s = %s; %sFz%s %s(%s, %s); %s)rI   rE  )r!   r$   rj   r   r   r   r   r   rg   r~   r  r  r  r  r$  rE  r-  rD  rF  )r   r  rl  target_fdeclr  r  Ztarget_tok_seqZsource_tok_seqZsource_fdeclr  r   r   r'  seZclenr@  rI   r   r   r   simple_equivalence  sf    




r  c                s   j j|d jd t j  dkfdd} s j  j|j	}|d k	r| }|t
 ||d |d k	S d k	rz s rzd}|d k	}	s|krd }|d krjd k	r4t |jd |j	 j jkrd	t|j	 }nt jd
}d}njd k	r4|jd|j	 d | }t |d t| ||d}
|	rvsr|krvd}
|
S |j	 fdd}| }|d k	rd|tf }n
 j }jd k	rt j< jj	dkr dtddtjf }n(t d ddd }t|tddd}t d t jd}|d k	r`d|tf }| }|d|t||f  nf|d k	sjdkr s rt j< t d dd }| }|d|t|f  |d k	rdS dS )N)r   )r   r   c                  s    r
j S jS )N)r\  r3   r   )r  r  r   r   get_rapp  s    z$declare_identifier.<locals>.get_rapp)r   r  rl  r  r  F)r   r  rl  r   zcmn.dynamic_params.)r   r   TzAssignment to PARAMETER %s)r  )r   r  rl  r   )r  r   r   r'  rH  c                 sT     sd S  jd krd S  jj} | d kr4d S t| dk rDd S  j S )Nr   )r   r   member_registryr~   r!   r   common_name_by_identifier)common_names)r   r   r   r   r   !get_common_name_if_cast_is_needed8  s     
   z=declare_identifier.<locals>.get_common_name_if_cast_is_neededzstatic_cast<common_%s&>(cmn).%sr  zstr_arr_%sref<%d>)r   r  )r   r   r'  r>  )rI   rE  )r   r$  z%s %s(%s, %s);r   )r   r   r'  z%s& %s = %s;)r   r   r   r!   r  r   r  r  r~   rj   r  is_localis_parameterr  r  r   r   r  r!  r  rK  rg   r$  r  rE  rD  rF  r-  r  r   r)  )r   r  rl  r   r'  r  r  r  rH  Z	have_crhsrA   r  r  Zsrc_varrI   r@  r   )r   r   r  r   r  r   r     s    








 
r  c       P   
      s  t d djjr@d}jjjr(|d7 }d|jjjf    |d k	rx@|D ]8}t	|d t
|jd}d|jj|f  qZW |d k	rx|D ]}| d|jj  qW jjrΈd jjrd	  }xjj D ]\}	}
|	jjjkrq  xN|
D ]F}jj|jj}|jd
kr|jjjkrt|jd qW  sd|	  qW j|dsd   fddd
dlm} td}  j }|jj }xdt!jj" D ]P}jj| }|# r|jdkr||kr|jkrt|jd qW  shd d jjj$rnj%dgd}t&|j'd
kr|d x@|j'D ]6}|j%dgd}x|D ]}|| qW |(  qW xfjj)D ]Z\}}||dd x>|D ]6\}}|d k	r*||gdd ||dd qW qW jjj*s^t+|d |(    t&|j,d
krĈd j%dgd}|d x|j,D ]}|| qW |(  x|j-D ]}| qW   jjj*rj%dgd}t+|d |(    d
dlm.
 
fdd j/ 	x@t!	" D ]0}	| dkrP|d!}d"||f  qPW fd#d$}d%}i }d
d&l0m1} d
d'l2m3}  xjj4D ]~j5j6j7d( j8j9}!|!d k	r
|!j: kr
|s
j;|!d) fd*d+}"yĈj<d,kr|j=d}#t&|#d
ksFt>|j?d}$x$|#dd  |$fD ]}%|%d qdW t@j?d-|#d
 }&|&jjk}'|'st|&d.}'t@j=d-|'rfd/d0}(fd1d2})|( s|) sd3f  
n|j<d4kr|"  jA}*|*jBd k	rZ|*jCd k	rNj8jDd5jEd6 d7}+|*jB},n*|*jCd k	rrd8}+|*jC},nj8jDd9jEd6 t@|,d-}-tFd4|+|-|*d: 	nj<d;kr|"  t@jGjBd-}-tFjHd<|-jGd: 	nj<d=krj|"  jI}.|.jBd krj8jDd>jEd6 t@|.jBd-}/|.jCd kr<d?}0nt@|.jCd-}0tFd=d<d@|/|0f |.d: 	nj<dAkr|"  jJ}1|1jBd krj8jDdBjEd6 t@|1jBd-}/tFdAd<|/|1d: nj<dCkr|"  jKj<dDkrdE}2dF}/n2j<}2jBd k	s
t>t@jBd-}/|/dGkr&dF}/	
fdHdI}3|3 }g }4d%}5xJdJD ]B}6tL|6}7|7d k	rP|4dK|6t@|7d-f  |6dLkrPdM}5qPW t&|4d
krd<}4ndNdNM|4 }4|jNd}8|8d |d krdO|/ }9nd@|/|f }9g }:tO|:jNdP t&|:d
k	rjPd k	r2jQd k	r2|5	s2};nj%dQgd};dR|2|9|4f }<t&jNd
k	rn|;|<dS  ntR|;|<jNdT nd%}=jBd k		r|jBd}>t&|>dk	r܈jjS|>d
 dU}?|?jTd k		r|?jTjdVk	rdM}=jPd k		sjQd k		s|5
r dQ}@nd}@j%|@gd};|=
rd<ndW|;dX|2|2d
 |9f  t&|4d
k
r`|;dY|2d
 |4f  tR|;|2d
 dZ jNdT |;k	
r|;(  x~d[D ]v\}6}AtL|6}7|7d k	
rj%d\|A gd}Bt@tU |7d-}C|Bd]|C  |B(  n |5
rj%d\|A gd}B|B(  
qW nxj<d^krjjjkr>tjd x"jVD ]}D||Djdd qFW tWjjVd_j9d k	r|Xj9g  nj<d`kr|jYdd t@jYd-}Ej%da|E gdj9d k	r|Xj9g  nj<dbkrdc nrj<ddkr0de nXj<dfkr\|j8j9d kr( n,j<dgkr|jYdd t@jYd-}Ej%dh|E gddM}wnj<dikr|jYdd t@jYd-}Ej%dh|E gdnj<djkr*|jYdd t@jYd-}EjZdk|E gdn^j<dlkrHjZdmgdn@j<dnkr`( n(j<dokr|jYdd t@jYd-}Ej%dp|E gdfdqdr}!ds|!d
  dt|!d  du|!dv  ( nj<dwkrjjSj[dU}|\ rbd
dxl2m]}F d<j[jdykr6dz}Gn*j[j|Fj^krTd{j[j }Gnd|j[j }Gn,t_j[jd}rzd~nd<j`j[jd}Gjad krd|Gf  nL|jajd}%|%d t@jajdMd  fdd}Hd|G|H f  nj<dkr@jjbdkr |  njj4d k	rd nHj<dkrPn8j<dkrrd]j9j  nj<dkr|"  t@jVd-}Ij%d|I gd}Jx0tcjdD ]"\}K}L|Jd|Kd |Ljf  qW |Jd |J(  nj<dkrDjad krd}Mn,jae r$tfjajd}Mntgi dMjad}Md|M  nDj<dkrndj8h dd    ndj<j8h f  |rd%}( j8j9d k	r|j8j9}N|Nd k	rxti|ND ]}O|O( qW W n\ || fk
r    Y nB tjk
r:   tkd tkj8jld dd tkd tk   Y nX qW jmd ksRt>jjbdkrt&jj4d
krjj4d j<dkr|  j5jnj7d o  jp| d d S )N)rM  ZFEM_CMN_SVEZ_DYNAMIC_PARAMETERSz%s(%s);)r   r  rl  r   )r   r$  z
  %s(cmn);zcommon_read read(cmn);zcommon_write write(cmn);r   )r   r  rl  r   z// COMMON %s)rV  z//c                s.   x(| D ] }|j  jkrt |d qW d S )N)r   r  rl  r   )rj   rg   r  )	id_tokensr   )r   rl  r  r   r   declare_identifiers  s    
z/convert_executable.<locals>.declare_identifiers)r  )r   r  r   z// SAVEzif (is_called_first_time) {)rN  z:using fem::mbr; // member of variant common or equivalencerw  )r   )r  )r   r  z$local_equivalences loc_equivalences;zusing fem::mbr; // member)fmt_tokens_as_stringc                s>    j j| }|d kr&tdtj  dt|td d S )Nz"Unknown FORMAT statement label: %sz"()r   commaz)")r   formatr~   ri   r!  rj   rf   r   )
stmt_label
fmt_tokens)r   r  r   r   get_cfmt_from_format  s
    z0convert_executable.<locals>.get_cfmt_from_format)r  z"static const char* format_%s = %s;c                  s    d j jjj   d S )Nz
return %s;)r3   rg   r   rH   rj   r   )r   rl  r   r   !curr_scope_append_return_function  s    z=convert_executable.<locals>.curr_scope_append_return_functionF)Error)SemanticError)r   r   )r]  c                 s*   g   fdd} j | d  d  S )Nc                s     |  d S )N)r3   )ri   next_tok)r  r   r   r     s    zZconvert_executable.<locals>.search_for_id_tokens_and_declare_identifiers.<locals>.callback)r   )r  )search_for_id_tokens)r   )r  ei)r  r   ,search_for_id_tokens_and_declare_identifiers  s
    
zHconvert_executable.<locals>.search_for_id_tokens_and_declare_identifiers
assignment)r   r   )r   r  rl  r   r'  c                 s     sdS t } | tkr&dS |  dkr6dS | d7 } | tkrNdS |  }|dkrbdS | d7 } | tkrzdS |  dkrdS | d7 } | tkrdS | d  dkrd   nd || d  f  dS )	NFr   r   rq   r   z%s++;z
%s %s= %s;T)r"   r!   r3   )r&   r  )clhsr'  rl  r   r   in_place_op_left  s2    
        z,convert_executable.<locals>.in_place_op_leftc                 s     sdS tt  } | dkr*dS | d8 } |  dkrBdS | dkrNdS | d8 } |  }|dkrjdS | dkrvdS | d8 } |  dkrdS | dkrdS d |  dkrd   nd |d |  f  d	S )
NFr   r   r   rq   r   z%s++;z
%s %s= %s;T)r   r!   r3   )r&   r  )r  r'  rl  r   r   in_place_op_right%  s2    
        z-convert_executable.<locals>.in_place_op_rightz%s = %s;inquirezFConflicting UNIT vs. FILE in INQUIRE statement (exactly one is needed))r&   Z_unit_filez)Missing UNIT or FILE in INQUIRE statement)r   rl  rm  rn  ro  rp  file_positioningrb   r   zMissing UNIT in OPEN statementzfem::file_not_specifiedz%s, %sclosezMissing UNIT in CLOSE statement)r   writer^   r^   r  6zstar c                 s   j d k	r$dtj td d S  j} | d kr6d S t| dkr| d }|jddrZdS | r|j}| dkr|d	| S |d
S t| dS )Nz"()r   r  z)"r   r   rs   )rj   r*  z	format_%s)r  )r   r   )	r  rf   r   fmtr!   r	  r   rj   r  )tlri   r  )cilistr   r  fmt_counts_by_statement_labelr  r  r   r   conv_fmt  s    

z$convert_executable.<locals>.conv_fmt)reciostatz%s(%s)r  Tr+  z%s, fem::unformatted)rA   r   ztry {z%s(%s)%sr   )rq  r  r   r   )r   r  zcmn, z%s_loop %sloop(%s%s);z	%sloop%s;loop))endZread_end)rj  Zio_errzcatch (fem::%s const&) {zgoto statement_%s;do)r   rx  ry  rz  dowhilez
while %s {cyclez	continue;exitzbreak;enddoifz	if (%s) {Zif_thenZelseif_thenzelse if (%s) {elsezelse {endifif_arithmeticz!switch (fem::if_arithmetic(%s)) {c                s   d j |  j S )NZ
statement_)labelsrj   )r&   )r  r   r   lbl'  r   zconvert_executable.<locals>.lblzcase -1: goto %s;zcase  0: goto %s;zdefault: goto %s;r   call)r   getargz
cmn.getargz	cmn.io.%szfem::%s)r   r   r  )r   )r   r   r  c                  s,   t dkr S t  dkr S d   S )Nr   z, )r!   r   )ar  r   r   cmn_aG  s
      z!convert_executable.<locals>.cmn_areturnfunctionr    zreturn;continuegotogoto_computedzswitch (%s) {zcase %d: goto statement_%s;zdefault: break;stopra   )rc   )rg   rh   ri   zFEM_STOP(%s);entryz// UNHANDLED: ENTRY %s   z)FEM_THROW_UNHANDLED("executable %s: %s");zP********************************************************************************zSorry: fable internal error)r&   r  )r   )qrL  r   	uses_saver   r   r3   rH   rj   rX  r  r-  r$  r   	uses_read
uses_writerU  r  r  r   r  r~   r  rg   r  rY  r\  rW  r  r  r  r  r  r  sortedkeysr   r   r`  r!   r  rc  rQ  r   r  r  r  r  r  r=  r  r   r  
executabler   r   r_  r   r]  r  r^  r   
lhs_tokensr$   
rhs_tokensr  iuflistunitfiler!  startrt  alistrm  olistcllistr  r   rC   rp  r~  r  rj  r  r   r  r   r   r{  
setdefaultcond_tokensre  subroutine_namer   r   io_set_lowerr   r   	arg_token
fproc_typerX   r  r   rd   rk   code_with_stringsreversed	Exceptionr^   format_errorrM  r   ra  rh  )Pr   r   args_fdecl_with_dim	blockdatamacror   r@  r   Ztop_scope_point_before_commonr  
fdecl_listcommon_fdeclr  Zvariant_buffersr  r  r   Zfirst_time_scoper  Z	mbr_scoper   r  r  r  r  r  r  Zcfmtr  Z!close_scope_after_next_executableZdos_to_close_by_labelr  r  r  r  Zlhs_id_tokensZrhs_id_tokensr  r   Zassign_herer  r  r  rn  Z	uf_tokensro  r"  ZcunitZcfiler#  Zwork_keyr  ZcchainZ
has_iostatr   r   Ziolist_id_tokenscargsr  rq  r  Zis_internal_fileZunit_id_tokensZ
unit_fdeclZopening_lineZ
cexceptionrr  rs  tokenr9   r   calledr  ZccondZswitch_scoper&   r]  ZcmsgZdos_to_closer  r   )r  r  r  r  r   r'  rl  r  r  r  r  r  r  r   convert_executableg  s   



























 







 














r6  c             C   sB   |j }|d k	r>|j|jjj}|d k	r>x|D ]}| | q.W d S )N)r   save_struct_buffersr~   r   rH   rj   )r   r   ZccirS   r   r   r   r   export_save_struct  s    
r8  c             C   s&   | j r"|d| jjd jd j  d S )Nz// Fortran file: %sr   )r   r   r   r   	file_name)r   r   r   r   r   produce_fortran_file_comment  s    r:  c                st  |st | |d g g   fdd}|jjrB|jjjsB|dd g }x|jjD ]}|jdkrn|dd qR|j|jks~t|jj	|d	}|j
|d
 |jd kst|jdkrdt|j }	n
t|j}	|jd k	rH|jjdkrH|jd kr|dt|dd |	 n>t|jdkrd}
ndt|j }
|dt|dd|
f |	 n| st||d dd }|jd kr|d|t|ddf t|	 nZt|jdkr|}nd|t|jf }|drd}nd}|dt|dd||f |	 nL|jj|jj}|d kst|dkrd}nt|d }||d |	d |jd k	rR|jdkrR|| qRW d}|jjd k	r|jj	|jjd	}|jd k	rt||d dd }d |j|jjj< |r| d | d! |jr| d" | d#|t|jjjd$f  d S |jjr@|d kr| }n|}|d |d%|t|jjjd$f  x|| gD ]}|d kr\qJ|d || krt||jd& t||d' |jr|d" || ||krd(}nd}t|jjj}t dkr||d) |  n||d* d+  d, |  qJW | d- |dkr<| d.||j|jjj t |d/f  |rL| d0 nt!| ||d1 | d2 t"||jd& d S )3N)r   r   c                s     |    | d |  d S )Nr   )r3   )rI   rH   )r3  fptrr   r   cargs_append  s    
z-convert_to_cpp_function.<locals>.cargs_appendzcommon&r  rs   zfem::star_type const&z/* UNHANDLED: star argument */)r   )r   r   z/* %s */r  z	str_%srefT)r   r  r   rb   z%dzstr_arr_%sref<%s>)r   r   r'  z%s%s&Fz%s, %drw   r   zarr_%sref<%s%s>Z	UNHANDLEDZ_function_pointer)rI   rH   voidreturn_valuez)// forward declaration (dependency cycle)inlinez
%s %s(%s);z, z&typedef %s (*%s_function_pointer)(%s);)r   r   )r   r   r   z()z(
  z,
  r  rw  z  %s %s = %s;)rI   z  throw TBXX_NOT_IMPLEMENTED();)r   r   r.  rb  )#r8  r   r   r   r   argsrj   rg   r$   r   r   r  r  r   r  r$  rE  r!   r   r)  r   r   r~   r   r  r3   rH   r   rC   is_passed_as_externalr   r:  rG  r6  r   )cpp_callbackhpp_callbackr   declaration_onlyforce_not_implementedr<  r.  r   r   arg_namer,  rI   r   rC  ZpassedZcdeclcbr   lastcnamer   )r3  r;  r   convert_to_cpp_function  s    






 


 
 

 $

rJ  c       "         s  |dkst d}t|d| d | d|  | d i }i }	d}
|dkrjjjrx&tjjjD ]}| d|  d	}
qdW j }|jj	}t
|d
kr| d d	}
|jj	}	d
dlm i g  g }x|D ]x}|j|krq|j|	krq|| jj|d}xB|j|jgD ]2}|d kr q fdd|d qW qW g }g }t
 d
krX|
rl| d d}x؈ D ]}jj|d}t|d dd
 }|j r d	}| d|t|jf  |jjjkrdt|j }nt|jd}||j|f nDt|jd}| d|t|j|f  |d||t|jf  d	}qvW |rX| d g }g }xn|D ]d}jj|d}|jjkrqht|d d	dd d \}}}|d kr| d|t|jf  |d krt|d}||j|f n|r|r*| d|t|jf  ||jd| f nt|d dd
 }t|jd}| d|t|j|f  |jjdkr|dt
|jt|jf  n|dt|dt|jf  ||jd t|j|f f qhW t
|d
kr
| d x|D ]}| | qW || t
|}|d
kr| d |s8| d!|  n| d"|  | d# | d$ xPt|D ]D}|| }|d% |kr~d}nd&}| d't|d
 |d% |f  q^W | d( | d) t
|d
kr| d |o|d*k} | r| d+ x|D ]}!| |! qW | r| d, t |d-S ).N)r  r  F)r   rb   z	struct %srw  r  z$  fem::variant_bindings %s_bindings;Tr   z3  fem::variant_core_and_bindings save_equivalences;)r  )r   c                sx   d}xn| dD ]`}|j kr qd |j < jj|d}| d}|sX|j jjkr\d}||j <  | qW |S )NF)r   )r   T)rj   r   r   r  r   r3   )r   Zhave_dynamic_dependencyr   r   Zhdp)const_id_toksconst_identifiersr   r  parameter_recursionr   r   rM  ?	  s    


z.convert_to_struct.<locals>.parameter_recursion)r   )r   r   r'  z  const %s %s;zdynamic_params.)r   r   z  static const %s %s = %s;zconst %s %s::%s;)r   r   r'  r>  r   z  %s %s;)rI   z%s, fem::fill0)r   r$  z  %s %s_memory[%s];r  z  str_arr_ref<%d> %s;z*%s_memory, %s, fem::fill0z  %s() :z  %s(z-    dynamic_parameters const& dynamic_params)z  :r   r   z    %s(%s)%sz  {}z};r  z%#ifdef FEM_TRANSLATION_UNIT_WITH_MAINz#endif)need_dynamic_parameters)!r$   r   r   r   r   r  r   r  r  r  r!   r  r  r  rj   r3   r   r  r$  r)  r   r   r  r  r   rD  rG  r6  r  rF  extendr   r   )"r   separate_cmn_hppr   struct_typestruct_nameequivalence_simpleid_tok_listrN  r  Zcmn_equivalencesZhave_variant_blockr  r  Zremaining_id_tok_listr   r   r   ZinitializersZconst_definitionsZappend_empty_linerI   r'  Zdeferred_arr_membersZdeferred_arr_initializersr@  Z
ctype_coreZcstatic_sizer   r;   r&   iir  Z
need_ifdefcdr   )rK  rL  r   r  rM  r   convert_to_struct	  s   
















  
rW  c       *         s
  ddl m} t }|d kr"|  n| xL| D ]>\}}	i }
x(|	D ] \}}|
d|g | qFW t|
dkr2|| t	|
 }dd }|j
|dd dd l}t|d	|j} fd
d}|d }td| d tdt| d tdtdd |D  d |d| x^|dd  D ]N}|d| tddd ||d d d|d d dD  d q W q2W d}xNt| D ]>}|| }t|dkrtd|dt|f  d d}qW |rt d t	|| }t|dkrtdt| d i x"|  D ]\}}t||< qW |j
fddd tdd  d x0|D ](}td|t| | | f  d qXW t d td  d t }x|D ]}td!|  d d"}g }d#}x|| D ]}| \}}|j|j|f} | |krP ||  |jd j}!tj|j\}"}#d$|#|j|"f  }$|$|krHd"}$n|$}||!|$f t|t|!}qW t|dkrd%| }%x|D ]}&t|%|&  d qW qW t  dkr|d krdd l}'d&}(dd'lm}) td(|)|(|'j d t!|(d)"   |S )*Nr   )StringIOrB   r   c             S   s   t | d S )Nr   )r!   )r  r   r   r   size_key	  s    z(generate_common_report.<locals>.size_keyT)r   reverseunified_diffc                s.   t d|  dtdd |d D  d d S )Nzprocedures %s:r   c             S   s   g | ]}|j jqS r   )rH   rj   )rR   r   r   r   r   rT   	  s    z?generate_common_report.<locals>.show_fprocs.<locals>.<listcomp>r   )r  )r^   rC   r  )r]  Z
cpp_fprocs)reportr   r   show_fprocs	  s    z+generate_common_report.<locals>.show_fprocszcommon name:)r  znumber of variants:z2total number of procedures using the common block:c             S   s   g | ]\}}t |qS r   )r!   )rR   cppfprocsr   r   r   rT   	  s    z*generate_common_report.<locals>.<listcomp>firstsecondr   c             S   s   g | ]}|qS r   r   )rR   r   r   r   r   rT   	  s    FzName clash: %s in COMMONs: %sz, z#common variants due to equivalence:c                s    |   | fS )Nr   )element)	size_sumsr   r   r   	  r   z(generate_common_report.<locals>.<lambda>)r   z&  %-20s   procedures    sum of memberszcommon namez  %-20s   %8d         %8dz$Locations of equivalence statements:z  %srb      z	%s(%s) %sz    %%-%ds %%sZfable_cout_common_report)show_stringzWriting file:w)#	six.movesrX  r   r  r$  rC   r3   r!   r   r|  r   difflibr   ndiffr^   rW   rD   r  r  stmt_locationr9  line_numberrj   r   r   splitr6   r5   getvaluesyslibtbx.str_utilsre  stderrr   r  )*common_fdecl_list_sizescommon_equiv_tok_seqsccode_registryr  'variant_due_to_equivalence_common_namesstringiorX  r   r  Zfproc_cpp_pairsZfprocs_by_cppr   r^  Zfprocs_by_cpp_itemsrY  rh  Zdiff_functionr]  Zmain_cpp_fprocsZother_cpp_fprocsneed_empty_liner   r  vvsizesZreported_alreadyZprev_loctabZmax_len_col1r  r   r&   tagZvndnbnlocr  rowrn  Zreport_file_namere  r   )r\  rc  r   generate_common_report	  s    


*







 
r  c       %      C   s  |d k	r| d | d | d x |D ]}| d|j |jf  q&W | d x@|D ]8}||d k	rfd}nd}| dt|jt|j|f  qPW | d	t|  x|D ]}| d
t|j  qW | d | d | d | d | d | d | d i }i }	i }
i }t }g }x$|jD ]}|jj	s|
| qW t }xR|D ]H}d|j_x6|j D ]&\}}||g 
t| g }x|D ]}|jd kst|
|j ||jjt | ||kr| j|jj}|d k	rd|j_|| x2|D ]*}x"|jD ]}|	|g 
| qW q W qW d| }g }t|j
||d|||k|d}|jrn|| |
|g 
||f q^W qBW |t||	|
|||d t }g }g }x|D ]}t |j_x|j D ]\}}||kr|jj| ||kr^|| |
| nF||kr|| |
d|  x"|
| d d D ]}| | qLW qW qW x|D ]z}|jjst|jjdkp|  |j_|jjpt|jdk|j_|jjot|jdk|j_ |jjrpd|_!qpW |"  |#  i }g }x|D ]}g }x*|j$% D ]} | & r |
| j q W t|dkr\|jjs\q|j'dd d d|jj }g }t|j
||d|d|d}|||jj< |jrd|j_(|
| qW t|dkrt|dkr|d kr| d | d d S | d | d d g}!|d k	r$|!
d! | d"d#)|!|   | d d}"x|D ]}| d$|  d}"qLW d%d& }#x"|D ]}| d'|#|  d}"qtW |"r| d d(g}$|d k	r|$
d) x&|D ]}||kr|$
d*|  qW | d+d,)|$  | d t*||d-S ).Nrb   zstruct dynamic_parametersrw  z  %s %s;zT
  dynamic_parameters(
    fem::command_line_arguments const& command_line_args)
  :r    r   z    %s(%s)%sz;  {
    fem::dynamic_parameters_from(command_line_args, %d)z      .reset_if_given(%s)z    ;z  }z};Ztypedefz5  fem::dynamic_parameters_capsule<dynamic_parameters>z    dynamic_parameters_capsule;FTZcommon_r  )r   rP  r   rQ  rR  rS  rT  )rq  rr  rs  r  rt  ru  r   r   c             S   s   | j S )N)rj   )r4  r   r   r   r   
  r   z!convert_commons.<locals>.<lambda>)r   z%s_saver  zusing fem::common;zstruct common :zfem::commonZdynamic_parameters_capsulez  z,
  z  fem::variant_core common_%s;c             S   s   | d d d S )Nver   )rR  r   r   r   save_as_sve
  r   z$convert_commons.<locals>.save_as_svez  fem::cmn_sve %s;zfem::common(argc, argv)z-dynamic_parameters_capsule(command_line_args)z%s(dynamic_params)z?  common(
    int argc,
    char const* argv[])
  :
    %s
  {}z,
    )r  r7  )+rI   rH   r   r#  rJ   r!   r   bottom_up_listr   r   r3   r   r  r  r$  r  r$   r   rj   r   r  r  r~   rW  rN  updater  r   r  has_saverQ  r   r   r  each_fproc_update_is_modifiedeach_fproc_update_needs_cmnr  valuesr   r   r   rC   r   )%r   rP  r   r   common_equivalence_simplecommon_report_stringiodp_propsr9   rq  rr  Zcommon_ccode_registryr  r   Zbottom_up_filteredr   Z&struct_commons_need_dynamic_parametersr  r  rT  r2  r  r  r  rR  rS   infoZcommons_defined_alreadyZstruct_commonsZvariant_commonsr   r7  Zsave_struct_namesr   Zleading_basesrv  r  Zinitializationsr   r   r   convert_commons 
  sT   

 




































r  z?#include <fem.hpp> // Fortran EMulation library of fable modulec             C   s8   |  dd| }| d|  | d|  | d d S )Nz::_z
#ifndef %sz
#define %srb   )upperr   )r   	namespacesuffixr%   r   r   r   include_guard
  s    r  Tc             C   s4   | d}x|D ]}| d|  qW |r0| d |S )Nz::znamespace %s {z"
using namespace fem::major_types;)rl  )r   r  using_namespace_major_typesr   Z	componentr   r   r   open_namespace
  s    

r  c             C   sB   | d | d}| ddt| |f  |r>| d | d |S )Nrb   z::z%s // namespace %srb  z#endif // GUARD)rl  r!   )r   r  	hpp_guardr   r   r   r   close_namespace
  s    
r  c               @   s   e Zd ZddgZdd ZdS )hpp_cpp_buffersr   r^  c             C   s   g | _ g | _d S )N)r   r^  )rK   r   r   r   rL      s    zhpp_cpp_buffers.__init__N)rM   rN   rO   rP   rL   r   r   r   r   r  
  s   r  c          	   C   sH  g }x|j jD ]}| sq|j|d}t| |d |jj}|| | d t| |d t	|| d | d|  |j
s| d g }	yt|	j||j jjd W n  tk
r   |s t  Y n6X |j
r|jjs| d	 x|	D ]}
| |
 qW | d
 t| |d qW t| ||d}t|dkrD| d | dd||d g   d S )N)r   )r   r   rb   )r   r   )r   r   z,void
%s(
  int argc,
  char const* argv[])
{zZ  if (argc != 1) {
    throw std::runtime_error("Unexpected command-line arguments.");
  })r   r   r/  z  common cmn(argc, argv);rb  )r   r  r  r   zgint
main(
  int argc,
  char const* argv[])
{
  return fem::main_with_catch(
    argc, argv,
    %s);
}z::)r   r  
is_programr   r8  rH   rj   r3   r   r:  r   r6  r   r/  r,  r`   r   r   r   r  r!   rC   )r   r   r  r  debugZ
main_callsr   r   rI  Zresult_bufferr   r   r   r   r   convert_program  sL     

 
	r  c             C   s0   x*| D ]"}|j d k	rtt |d dd S qW dS )N)r   r   r'  r   r=  )r  r)  r   )fdeclsr   r   r   r    get_missing_external_return_type;  s
    

r     please_specifyAllr  c       H         s  | |g d dkstd ks&dkr*ddd l}|d krH|jj| d}x&|jD ]}t |_|jj	|k|j_
qPW g  fdd} d}!t|dkrd	}!|d k	r|dkstd	}!|!rd	}|d k	rt| |d
 |r| d | d fddfddd}"|!r| d n |r$| d n| t d	}"| d |!sR| drR| d t| |"d |j|d}#|#j}$t|$dkrxDt|$ D ]4}%|%|krqt|$|% d}&| d|&|%|%f  qW |#j}'t|'dkr| d | dt|'  x |'D ]}(| dd|(  qW | d |d k	rt|dks8txF|#jD ]<}x4|D ],})|j|)j}*|*d k	rJ|j|)j qJW q@W |rg }+|+j},t|,dd
 |,t |,d t|,d n|rdd },n| },yt|,||#|||d }-W n( tk
r    s t  d }.Y nX |rTt|,d	d! t d"d#}/t!d$t"|+d%|/d& W d Q R X g }0i }1x|# D ]\}2}3t|3dkrt$d'|2 g }4|4d |4d |0|2|4f t|4jd x,|3D ]$}%|%|1krt$d(|% |4|1|%< qW qfW i }5i }6x҈# D ]\}2}3t|3dkr(t$d)|2 t% }7xdd*D ]\}8t&|7|8}4|8d+krht|4j|2d,d
 |4t n|4d-|2  |4d t|4j|2d q4W x4|3D ],}%|%|5krt$d.|% |2|5|%< |7|6|%< qW qW |!sd d }9ng g }9t'|#|||	|
||-|5||d/
}:x|#jD ]}|( r"q|jj	|kr4qd };d }<|jj	|k}=|6|jj	}7|7d kr|!sr|=s| }<n^g }>|> |>j};|=s|1|jj	}4|4d kr|d kr| }<ng }?|9|? |?j}<n|4j}<n|7j)j};|=s|7j*j}<|<d kr
g }@|@j}<|;d kr
| };|!s|#j+|jj	}A|Ad k	rx\|AD ]T}B|, |B }Cyt-d |<|:j.|Cd0d	d1 W n$ tk
r    sv t  Y nX q0W y$t-|;|<|:j.|d0|jj	|kd2 W n$ tk
r    sƂ t  Y nX qW xh|0D ]`\}2}4t|4jdd! |d3ks
|2|krt |2d4 d#}/t!d$t"|4d%|/d& W d Q R X qW x# D ]\}2}3|6|3d  }7xvd*D ]n}8t&|7|8}4t|4j|2|8d+kd! |d3ks|2|krft |2d5 |8 d#}/t!d$t"|4d%|/d& W d Q R X qfW qLW d k	rnd<fd6d7	}D|D |9d k	rnt|9dkrnt/||9d8}Et|EdkrF|D|Ed d9 n(d}Fx"|ED ]}7|Fd7 }F|D|7|Fd: qPW |d k	}G|rt| |Gd! n<yt0| |:|G d; W n$ tk
r    s t  Y nX |d k	rt |d#}/t!d$|/d& W d Q R X S )=Nr   r  Zplaceholder_please_replacer   )
file_namesc                sX   t dkrd }nd }t| d g|d}t |dkrT rJtd| | d S )Nr   r    rB   )rE   r@   )r!   rF   r^   rC   rO  )r   r@   rU   )r  rA   r   r   r   n  s     zprocess.<locals>.callbackFT)r   r  r  z&#define FEM_TRANSLATION_UNIT_WITH_MAINrb   c                s6   t  dkrdS x t  D ]}| d|  qW dS )Nr   Fz#include "%s.hpp"T)r!   r  r  )r   rH   )!separate_files_separate_namespacer   r   include_separate  s
    z!process.<locals>.include_separatec                s    d krd|  S d | f S )Nz#include "%s.hpp"z#include <%s/%s.hpp>r   )rH   )include_prefixr   r   include_with_prefix  s    z$process.<locals>.include_with_prefix	functionsr  )r   )r   r  r  )top_procedures)r  zW
%s
%s(...)
{
  throw std::runtime_error(
    "Missing function implementation: %s");
}z/* Dependency cycles: %dz     r   z */Z_CMN_HPP)r   r  c             S   s   d S )Nr   )r   r   r   r   cmn_callback  r   zprocess.<locals>.cmn_callback)r   rP  r   r   r  r  )r   r  r  zcmn.hpprf  rB   )rE   )r  z-separate_files_main_namespace: empty list: %sz7separate_files_main_namespace: ambiguous assignment: %sz1separate_files_separate_namespace: empty list: %s)r   r^  r   Z_HPPz#include "%s.hpp"z;separate_files_separate_namespace: ambiguous assignment: %s)
r   r   r   r   r   r   r   r   r   r   )r   )rC  rB  r   rD  )rC  rB  r   rE  r  z.cppr+  c                s   | kr|d kst d}n|d kr(d}nd| }t|d  fdd}| krtt|dd |d	 |d
 n|d |d t|dd x(| D ] }xt|dD ]}|| qW qW t|| kd    d S )Nzfunctions.hppzfunctions.cppzfunctions_%03d.cpprf  c                s   t |  d d S )N)r  )r^   )r   )r(   r   r   fcb|  r   z-process.<locals>.write_functions.<locals>.fcbZ_FUNCTIONS_HPP)r   r  r  r  )r   r  rb   F)r   r  r  )rE   )r   r  r  )r$   r   r  r  rF   r  r  )rZ   serialfnr  rU   r   )function_declarationsr  r  r  )r(   r   write_functionss  s2    

 z process.<locals>.write_functions)rY   rZ   )rZ   )rZ   r  )r   r   r  r  r  )N)1r;  r$   r=  r   processall_in_input_orderr   r   rH   rj   r   r!   r  include_fem_hppr  *build_bottom_up_fproc_list_following_calls%missing_external_fdecls_by_identifierr  r  r  dependency_cyclesrC   r  r  r~   r   r   r3   r  r,  r`   r  r   r^   rF   r  r&  r  r   r   r  r   r^  forward_uses_by_identifierr   rJ  r   r[   r  )Hr  r   r  r  r  Zinclude_guard_suffixZtop_cpp_file_namer   r   r   r   r   r  suppress_programsuppress_commonrP  Znumber_of_function_filesZseparate_files_main_namespaceZ#write_separate_files_main_namespacer  Z'write_separate_files_separate_namespacer   rE  Zignore_missingsuppress_functionssuppress_function_definitionsr  r   r   r  r   r   r   Zneed_function_hppZneed_using_major_typesr   missingr   return_typeZ
dep_cyclesr   r  r   Z
cmn_bufferr  r   Zcommon_commons_infor(   Zseparate_function_buffersZ)separate_function_buffer_by_function_namerH   r   rS   r   Zseparate_namespaces_buffersrZ   extZfunction_definitionsr   rC  rB  Zsuppress_cppZfunction_hpp_bufferZfunction_cpp_bufferZcpp_divertedZfwdsZfwd_identifierZ	fwd_fprocr  Zbuffer_blocksr  r  r   )r  r  r  r  r  r  rA   r  r   r  D  s   	





 
"























 
 

(



.

 
r  )r   r   )N)rQ   )N)FN)F)rb   )NN)N)NN)FF)T)Z
__future__r   r   r   rg  r   libtbx.utilsr   r   r   r   r	   os.pathr   r
   chrr   r>   rF   r  rG   r[   r`   rd   rf   ro   rk   r   r   r   rl  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r)  r-  r2  r5  r6  rD  rF  rG  rK  rL  rt  rv  r{  r~  r  r  rE  r  r  r  r  r  r  r  r  r  r6  r8  r:  rJ  rW  r  r  r  r  r  r  r  r  r  Zdefault_arr_nd_size_maxr  r   r   r   r   <module>   s   
j


C

)P
/H

(
`		
^;.oj$<
h
    &	 
w +c C
		7