mirror of https://github.com/pyodide/pyodide.git
174 lines
12 KiB
Python
174 lines
12 KiB
Python
import re
|
|
|
|
|
|
def fix_f2c_clapack_calls(f2c_output_name: str):
|
|
"""Fix F2C CLAPACK calls
|
|
|
|
f2c compiles code with fortran linkage, which means that
|
|
strings are passed as char* plus extra length argument at
|
|
the end.
|
|
|
|
CLAPACK uses C null terminated strings.
|
|
|
|
In scipy, we build fortran linkage wrappers for all char* CLAPACK calls.
|
|
We just need to replace the calls and extern definitions in f2c generated code.
|
|
|
|
Annoyingly, we can't just patch the fortran code to use the wrapped names because f2c
|
|
has a limit of 6 character function names.
|
|
"""
|
|
# fmt: off
|
|
lapack_names = [
|
|
"lsame_", "cgbmv_", "cgemm_", "cgemv_", "chbmv_",
|
|
"chemm_", "chemv_", "cher_", "cher2_", "cher2k_", "cherk_",
|
|
"chpmv_", "chpr_", "chpr2_", "csymm_", "csyr2k_", "csyrk_",
|
|
"ctbmv_", "ctbsv_", "ctpmv_", "ctpsv_", "ctrmm_", "ctrmv_",
|
|
"ctrsm_", "ctrsv_", "dgbmv_", "dgemm_", "dgemv_", "dsbmv_",
|
|
"dspmv_", "dspr_", "dspr2_", "dsymm_", "dsymv_", "dsyr_", "dsyr2_",
|
|
"dsyr2k_", "dsyrk_", "dtbmv_", "dtbsv_", "dtpmv_", "dtpsv_",
|
|
"dtrmm_", "dtrmv_", "dtrsm_", "dtrsv_", "sgbmv_", "sgemm_",
|
|
"sgemv_", "ssbmv_", "sspmv_", "sspr_", "sspr2_", "ssymm_",
|
|
"ssymv_", "ssyr_", "ssyr2_", "ssyr2k_", "ssyrk_", "stbmv_",
|
|
"stbsv_", "stpmv_", "stpsv_", "strmm_", "strmv_", "strsm_",
|
|
"strsv_", "zgbmv_", "zgemm_", "zgemv_", "zhbmv_", "zhemm_",
|
|
"zhemv_", "zher_", "zher2_", "zher2k_", "zherk_", "zhpmv_",
|
|
"zhpr_", "zhpr2_", "zsymm_", "zsyr2k_", "zsyrk_", "ztbmv_",
|
|
"ztbsv_", "ztpmv_", "ztpsv_", "ztrmm_", "ztrmv_", "ztrsm_",
|
|
"ztrsv_", "clangb_", "clange_", "clangt_", "clanhb_", "clanhe_",
|
|
"clanhp_", "clanhs_", "clanht_", "clansb_", "clansp_", "clansy_",
|
|
"clantb_", "clantp_", "clantr_", "dlamch_", "dlangb_", "dlange_",
|
|
"dlangt_", "dlanhs_", "dlansb_", "dlansp_", "dlanst_", "dlansy_",
|
|
"dlantb_", "dlantp_", "dlantr_", "slamch_", "slangb_", "slange_",
|
|
"slangt_", "slanhs_", "slansb_", "slansp_", "slanst_", "slansy_",
|
|
"slantb_", "slantp_", "slantr_", "zlangb_", "zlange_", "zlangt_",
|
|
"zlanhb_", "zlanhe_", "zlanhp_", "zlanhs_", "zlanht_", "zlansb_",
|
|
"zlansp_", "zlansy_", "zlantb_", "zlantp_", "zlantr_", "cbdsqr_",
|
|
"cgbbrd_", "cgbcon_", "cgbrfs_", "cgbsvx_", "cgbtrs_", "cgebak_",
|
|
"cgebal_", "cgecon_", "cgees_", "cgeesx_", "cgeev_", "cgeevx_",
|
|
"cgels_", "cgerfs_", "cgesdd_", "cgesvd_", "cgesvx_", "cgetrs_",
|
|
"cggbak_", "cggbal_", "cgges_", "cggesx_", "cggev_", "cggevx_",
|
|
"cgghrd_", "cgtcon_", "cgtrfs_", "cgtsvx_", "cgttrs_", "chbev_",
|
|
"chbevd_", "chbevx_", "chbgst_", "chbgv_", "chbgvd_", "chbgvx_",
|
|
"chbtrd_", "checon_", "cheev_", "cheevd_", "cheevr_", "cheevx_",
|
|
"chegs2_", "chegst_", "chegv_", "chegvd_", "chegvx_", "cherfs_",
|
|
"chesv_", "chesvx_", "chetd2_", "chetf2_", "chetrd_", "chetrf_",
|
|
"chetri_", "chetrs_", "chgeqz_", "chpcon_", "chpev_", "chpevd_",
|
|
"chpevx_", "chpgst_", "chpgv_", "chpgvd_", "chpgvx_", "chprfs_",
|
|
"chpsv_", "chpsvx_", "chptrd_", "chptrf_", "chptri_", "chptrs_",
|
|
"chsein_", "chseqr_", "clacp2_", "clacpy_", "clagtm_", "clahef_",
|
|
"clalsd_", "claqgb_", "claqge_", "claqhb_", "claqhe_", "claqhp_",
|
|
"claqsb_", "claqsp_", "claqsy_", "clarf_", "clarfb_", "clarft_",
|
|
"clarfx_", "clarz_", "clarzb_", "clarzt_", "clascl_", "claset_",
|
|
"clasr_", "clasyf_", "clatbs_", "clatps_", "clatrd_", "clatrs_",
|
|
"clauu2_", "clauum_", "cpbcon_", "cpbequ_", "cpbrfs_", "cpbstf_",
|
|
"cpbsv_", "cpbsvx_", "cpbtf2_", "cpbtrf_", "cpbtrs_", "cpocon_",
|
|
"cporfs_", "cposv_", "cposvx_", "cpotf2_", "cpotrf_", "cpotri_",
|
|
"cpotrs_", "cppcon_", "cppequ_", "cpprfs_", "cppsv_", "cppsvx_",
|
|
"cpptrf_", "cpptri_", "cpptrs_", "cpteqr_", "cptrfs_", "cptsvx_",
|
|
"cpttrs_", "cspcon_", "cspmv_", "cspr_", "csprfs_", "cspsv_",
|
|
"cspsvx_", "csptrf_", "csptri_", "csptrs_", "cstedc_", "cstegr_",
|
|
"cstemr_", "csteqr_", "csycon_", "csymv_", "csyr_", "csyrfs_",
|
|
"csysv_", "csysvx_", "csytf2_", "csytrf_", "csytri_", "csytrs_",
|
|
"ctbcon_", "ctbrfs_", "ctbtrs_", "ctgevc_", "ctgsja_", "ctgsna_",
|
|
"ctgsy2_", "ctgsyl_", "ctpcon_", "ctprfs_", "ctptri_", "ctptrs_",
|
|
"ctrcon_", "ctrevc_", "ctrexc_", "ctrrfs_", "ctrsen_", "ctrsna_",
|
|
"ctrsyl_", "ctrti2_", "ctrtri_", "ctrtrs_", "cungbr_", "cungtr_",
|
|
"cunm2l_", "cunm2r_", "cunmbr_", "cunmhr_", "cunml2_", "cunmlq_",
|
|
"cunmql_", "cunmqr_", "cunmr2_", "cunmr3_", "cunmrq_", "cunmrz_",
|
|
"cunmtr_", "cupgtr_", "cupmtr_", "dbdsdc_", "dbdsqr_", "ddisna_",
|
|
"dgbbrd_", "dgbcon_", "dgbrfs_", "dgbsvx_", "dgbtrs_", "dgebak_",
|
|
"dgebal_", "dgecon_", "dgees_", "dgeesx_", "dgeev_", "dgeevx_", "dgels_",
|
|
"dgerfs_", "dgesdd_", "dgesvd_", "dgesvx_", "dgetrs_", "dggbak_",
|
|
"dggbal_", "dgges_", "dggesx_", "dggev_", "dggevx_", "dgghrd_", "dgtcon_",
|
|
"dgtrfs_", "dgtsvx_", "dgttrs_", "dhgeqz_", "dhsein_", "dhseqr_",
|
|
"dlacpy_", "dlagtm_", "dlalsd_", "dlaqgb_", "dlaqge_", "dlaqsb_",
|
|
"dlaqsp_", "dlaqsy_", "dlarf_", "dlarfb_", "dlarft_", "dlarfx_", "dlarrc_",
|
|
"dlarrd_", "dlarre_", "dlarz_", "dlarzb_", "dlarzt_", "dlascl_", "dlasdq_",
|
|
"dlaset_", "dlasr_", "dlasrt_", "dlasyf_", "dlatbs_", "dlatps_", "dlatrd_",
|
|
"dlatrs_", "dlauu2_", "dlauum_", "dopgtr_", "dopmtr_", "dorgbr_",
|
|
"dorgtr_", "dorm2l_", "dorm2r_", "dormbr_", "dormhr_", "dorml2_",
|
|
"dormlq_", "dormql_", "dormqr_", "dormr2_", "dormr3_", "dormrq_",
|
|
"dormrz_", "dormtr_", "dpbcon_", "dpbequ_", "dpbrfs_", "dpbstf_", "dpbsv_",
|
|
"dpbsvx_", "dpbtf2_", "dpbtrf_", "dpbtrs_", "dpocon_", "dporfs_", "dposv_",
|
|
"dposvx_", "dpotf2_", "dpotrf_", "dpotri_", "dpotrs_", "dppcon_",
|
|
"dppequ_", "dpprfs_", "dppsv_", "dppsvx_", "dpptrf_", "dpptri_", "dpptrs_",
|
|
"dpteqr_", "dptsvx_", "dsbev_", "dsbevd_", "dsbevx_", "dsbgst_", "dsbgv_",
|
|
"dsbgvd_", "dsbgvx_", "dsbtrd_", "dspcon_", "dspev_", "dspevd_", "dspevx_",
|
|
"dspgst_", "dspgv_", "dspgvd_", "dspgvx_", "dsprfs_", "dspsv_", "dspsvx_",
|
|
"dsptrd_", "dsptrf_", "dsptri_", "dsptrs_", "dstebz_", "dstedc_",
|
|
"dstegr_", "dstemr_", "dsteqr_", "dstev_", "dstevd_", "dstevr_", "dstevx_",
|
|
"dsycon_", "dsyev_", "dsyevd_", "dsyevr_", "dsyevx_", "dsygs2_", "dsygst_",
|
|
"dsygv_", "dsygvd_", "dsygvx_", "dsyrfs_", "dsysv_", "dsysvx_", "dsytd2_",
|
|
"dsytf2_", "dsytrd_", "dsytrf_", "dsytri_", "dsytrs_", "dtbcon_",
|
|
"dtbrfs_", "dtbtrs_", "dtgevc_", "dtgsja_", "dtgsna_", "dtgsy2_",
|
|
"dtgsyl_", "dtpcon_", "dtprfs_", "dtptri_", "dtptrs_", "dtrcon_",
|
|
"dtrevc_", "dtrexc_", "dtrrfs_", "dtrsen_", "dtrsna_", "dtrsyl_",
|
|
"dtrti2_", "dtrtri_", "dtrtrs_", "sbdsdc_", "sbdsqr_", "sdisna_",
|
|
"sgbbrd_", "sgbcon_", "sgbrfs_", "sgbsvx_", "sgbtrs_", "sgebak_",
|
|
"sgebal_", "sgecon_", "sgees_", "sgeesx_", "sgeev_", "sgeevx_", "sgels_",
|
|
"sgerfs_", "sgesdd_", "sgesvd_", "sgesvx_", "sgetrs_", "sggbak_",
|
|
"sggbal_", "sgges_", "sggesx_", "sggev_", "sggevx_", "sgghrd_", "sgtcon_",
|
|
"sgtrfs_", "sgtsvx_", "sgttrs_", "shgeqz_", "shsein_", "shseqr_",
|
|
"slacpy_", "slagtm_", "slalsd_", "slaqgb_", "slaqge_", "slaqsb_",
|
|
"slaqsp_", "slaqsy_", "slarf_", "slarfb_", "slarft_", "slarfx_", "slarrc_",
|
|
"slarrd_", "slarre_", "slarz_", "slarzb_", "slarzt_", "slascl_", "slasdq_",
|
|
"slaset_", "slasr_", "slasrt_", "slasyf_", "slatbs_", "slatps_", "slatrd_",
|
|
"slatrs_", "slauu2_", "slauum_", "sopgtr_", "sopmtr_", "sorgbr_",
|
|
"sorgtr_", "sorm2l_", "sorm2r_", "sormbr_", "sormhr_", "sorml2_",
|
|
"sormlq_", "sormql_", "sormqr_", "sormr2_", "sormr3_", "sormrq_",
|
|
"sormrz_", "sormtr_", "spbcon_", "spbequ_", "spbrfs_", "spbstf_", "spbsv_",
|
|
"spbsvx_", "spbtf2_", "spbtrf_", "spbtrs_", "spocon_", "sporfs_", "sposv_",
|
|
"sposvx_", "spotf2_", "spotrf_", "spotri_", "spotrs_", "sppcon_",
|
|
"sppequ_", "spprfs_", "sppsv_", "sppsvx_", "spptrf_", "spptri_", "spptrs_",
|
|
"spteqr_", "sptsvx_", "ssbev_", "ssbevd_", "ssbevx_", "ssbgst_", "ssbgv_",
|
|
"ssbgvd_", "ssbgvx_", "ssbtrd_", "sspcon_", "sspev_", "sspevd_", "sspevx_",
|
|
"sspgst_", "sspgv_", "sspgvd_", "sspgvx_", "ssprfs_", "sspsv_", "sspsvx_",
|
|
"ssptrd_", "ssptrf_", "ssptri_", "ssptrs_", "sstebz_", "sstedc_",
|
|
"sstegr_", "sstemr_", "ssteqr_", "sstev_", "sstevd_", "sstevr_", "sstevx_",
|
|
"ssycon_", "ssyev_", "ssyevd_", "ssyevr_", "ssyevx_", "ssygs2_", "ssygst_",
|
|
"ssygv_", "ssygvd_", "ssygvx_", "ssyrfs_", "ssysv_", "ssysvx_", "ssytd2_",
|
|
"ssytf2_", "ssytrd_", "ssytrf_", "ssytri_", "ssytrs_", "stbcon_",
|
|
"stbrfs_", "stbtrs_", "stgevc_", "stgsja_", "stgsna_", "stgsy2_",
|
|
"stgsyl_", "stpcon_", "stprfs_", "stptri_", "stptrs_", "strcon_",
|
|
"strevc_", "strexc_", "strrfs_", "strsen_", "strsna_", "strsyl_",
|
|
"strti2_", "strtri_", "strtrs_", "zbdsqr_", "zgbbrd_", "zgbcon_",
|
|
"zgbrfs_", "zgbsvx_", "zgbtrs_", "zgebak_", "zgebal_", "zgecon_", "zgees_",
|
|
"zgeesx_", "zgeev_", "zgeevx_", "zgels_", "zgerfs_", "zgesdd_", "zgesvd_",
|
|
"zgesvx_", "zgetrs_", "zggbak_", "zggbal_", "zgges_", "zggesx_", "zggev_",
|
|
"zggevx_", "zgghrd_", "zgtcon_", "zgtrfs_", "zgtsvx_", "zgttrs_", "zhbev_",
|
|
"zhbevd_", "zhbevx_", "zhbgst_", "zhbgv_", "zhbgvd_", "zhbgvx_", "zhbtrd_",
|
|
"zhecon_", "zheev_", "zheevd_", "zheevr_", "zheevx_", "zhegs2_", "zhegst_",
|
|
"zhegv_", "zhegvd_", "zhegvx_", "zherfs_", "zhesv_", "zhesvx_", "zhetd2_",
|
|
"zhetf2_", "zhetrd_", "zhetrf_", "zhetri_", "zhetrs_", "zhgeqz_",
|
|
"zhpcon_", "zhpev_", "zhpevd_", "zhpevx_", "zhpgst_", "zhpgv_", "zhpgvd_",
|
|
"zhpgvx_", "zhprfs_", "zhpsv_", "zhpsvx_", "zhptrd_", "zhptrf_", "zhptri_",
|
|
"zhptrs_", "zhsein_", "zhseqr_", "zlacp2_", "zlacpy_", "zlagtm_",
|
|
"zlahef_", "zlalsd_", "zlaqgb_", "zlaqge_", "zlaqhb_", "zlaqhe_",
|
|
"zlaqhp_", "zlaqsb_", "zlaqsp_", "zlaqsy_", "zlarf_", "zlarfb_", "zlarft_",
|
|
"zlarfx_", "zlarz_", "zlarzb_", "zlarzt_", "zlascl_", "zlaset_", "zlasr_",
|
|
"zlasyf_", "zlatbs_", "zlatps_", "zlatrd_", "zlatrs_", "zlauu2_",
|
|
"zlauum_", "zpbcon_", "zpbequ_", "zpbrfs_", "zpbstf_", "zpbsv_", "zpbsvx_",
|
|
"zpbtf2_", "zpbtrf_", "zpbtrs_", "zpocon_", "zporfs_", "zposv_", "zposvx_",
|
|
"zpotf2_", "zpotrf_", "zpotri_", "zpotrs_", "zppcon_", "zppequ_",
|
|
"zpprfs_", "zppsv_", "zppsvx_", "zpptrf_", "zpptri_", "zpptrs_", "zpteqr_",
|
|
"zptrfs_", "zptsvx_", "zpttrs_", "zspcon_", "zspmv_", "zspr_", "zsprfs_",
|
|
"zspsv_", "zspsvx_", "zsptrf_", "zsptri_", "zsptrs_", "zstedc_", "zstegr_",
|
|
"zstemr_", "zsteqr_", "zsycon_", "zsymv_", "zsyr_", "zsyrfs_", "zsysv_",
|
|
"zsysvx_", "zsytf2_", "zsytrf_", "zsytri_", "zsytrs_", "ztbcon_",
|
|
"ztbrfs_", "ztbtrs_", "ztgevc_", "ztgsja_", "ztgsna_", "ztgsy2_",
|
|
"ztgsyl_", "ztpcon_", "ztprfs_", "ztptri_", "ztptrs_", "ztrcon_",
|
|
"ztrevc_", "ztrexc_", "ztrrfs_", "ztrsen_", "ztrsna_", "ztrsyl_",
|
|
"ztrti2_", "ztrtri_", "ztrtrs_", "zungbr_", "zungtr_", "zunm2l_",
|
|
"zunm2r_", "zunmbr_", "zunmhr_", "zunml2_", "zunmlq_", "zunmql_",
|
|
"zunmqr_", "zunmr2_", "zunmr3_", "zunmrq_", "zunmrz_", "zunmtr_",
|
|
"zupgtr_", "zupmtr_", "ilaenv_",
|
|
]
|
|
# fmt: on
|
|
code = None
|
|
with open(f2c_output_name, "r") as f:
|
|
code = f.read()
|
|
for cur_name in lapack_names:
|
|
code = re.sub(rf"\b{cur_name}\b", "w" + cur_name, code)
|
|
if code:
|
|
with open(f2c_output_name, "w") as f:
|
|
f.write(code)
|