From 5b6cc51927397e64a2f7bc7188e6bd5ed1bc9342 Mon Sep 17 00:00:00 2001 From: 1uc Date: Wed, 13 Nov 2024 09:19:29 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20gh-pages=20from=20@=20BlueBrai?= =?UTF-8?q?n/nmodl@ea94748e9a36bafb805c2b9fe539e2ce4ca8c73c=20=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .doctrees/environment.pickle | Bin 159128 -> 159128 bytes .../notebooks/nmodl-kinetic-schemes.ipynb | 56 +- .../notebooks/nmodl-python-tutorial.ipynb | 160 +- .../notebooks/nmodl-sympy-conductance.ipynb | 72 +- .../notebooks/nmodl-sympy-solver-cnexp.ipynb | 64 +- .../nmodl-sympy-solver-derivimplicit.ipynb | 32 +- .../notebooks/nmodl-sympy-solver-sparse.ipynb | 32 +- ...degen_1_1_codegen_acc_visitor-members.html | 2 +- ...dl_1_1codegen_1_1_codegen_acc_visitor.html | 11 +- ...odegen_coreneuron_cpp_visitor-members.html | 4 +- ...en_1_1_codegen_coreneuron_cpp_visitor.html | 52 +- ...egen_1_1_codegen_coreneuron_cpp_visitor.js | 3 +- ...degen_1_1_codegen_cpp_visitor-members.html | 401 +- ...dl_1_1codegen_1_1_codegen_cpp_visitor.html | 109 +- ...modl_1_1codegen_1_1_codegen_cpp_visitor.js | 2 - ..._1_codegen_neuron_cpp_visitor-members.html | 499 +- ...odegen_1_1_codegen_neuron_cpp_visitor.html | 264 +- ...1codegen_1_1_codegen_neuron_cpp_visitor.js | 1 - ...assnmodl_1_1visitor_1_1_const_visitor.html | 2 +- ..._coreneuron__cpp__visitor_8hpp_source.html | 65 +- .../codegen__cpp__visitor_8cpp_source.html | 1347 ++-- .../codegen__cpp__visitor_8hpp_source.html | 1518 +++-- ...gen__neuron__cpp__visitor_8hpp_source.html | 1482 ++-- doxygen/functions_func_p.html | 12 +- doxygen/functions_func_v.html | 2 +- doxygen/functions_p.html | 10 +- doxygen/functions_u.html | 2 +- doxygen/functions_v.html | 2 +- doxygen/group__codegen__backends.html | 4 +- doxygen/group__codegen__backends.js | 6 +- doxygen/namespacenmodl_1_1codegen.html | 4 +- doxygen/navtreedata.js | 38 +- doxygen/navtreeindex15.js | 6 +- doxygen/navtreeindex16.js | 232 +- doxygen/navtreeindex17.js | 180 +- doxygen/navtreeindex18.js | 6 +- doxygen/navtreeindex19.js | 6 +- doxygen/navtreeindex20.js | 6 +- doxygen/navtreeindex21.js | 6 +- doxygen/navtreeindex22.js | 6 +- doxygen/navtreeindex23.js | 6 +- doxygen/navtreeindex24.js | 6 +- doxygen/navtreeindex25.js | 6 +- doxygen/navtreeindex26.js | 6 +- doxygen/navtreeindex27.js | 42 +- doxygen/navtreeindex28.js | 38 +- doxygen/navtreeindex29.js | 12 +- doxygen/navtreeindex30.js | 14 +- doxygen/navtreeindex31.js | 22 +- doxygen/navtreeindex32.js | 6 +- doxygen/navtreeindex33.js | 6 +- doxygen/navtreeindex34.js | 6 +- doxygen/navtreeindex35.js | 2 - doxygen/search/all_13.js | 2 +- doxygen/search/all_14.js | 2 +- doxygen/search/all_f.js | 2 +- doxygen/search/functions_14.js | 2 +- doxygen/search/functions_f.js | 2 +- ..._coreneuron__cpp__visitor_8cpp_source.html | 21 +- ...gen__neuron__cpp__visitor_8cpp_source.html | 5943 ++++++++--------- doxygen/src_2main_8cpp_source.html | 2 +- notebooks/nmodl-kinetic-schemes.ipynb | 56 +- notebooks/nmodl-python-tutorial.ipynb | 160 +- notebooks/nmodl-sympy-conductance.ipynb | 72 +- notebooks/nmodl-sympy-solver-cnexp.ipynb | 64 +- .../nmodl-sympy-solver-derivimplicit.ipynb | 32 +- notebooks/nmodl-sympy-solver-sparse.ipynb | 32 +- 67 files changed, 6581 insertions(+), 6689 deletions(-) diff --git a/.doctrees/environment.pickle b/.doctrees/environment.pickle index 90f8ed82de7e2d3e4de22e601814092d58568502..bb87f0313c73e337885b99fb24ccc9f1d3d691e4 100644 GIT binary patch delta 9558 zcmY+Kc|euL*T+4e5V<6%;0B_Xz!Cu$KokTO62)CJ%@k2kc?7PpsAzQ6TtIKX$hkRc z?rWhSa=`~=*F;UtrED`1+ZW9xm)C$*M0%+{Kz$E3l?_w18-L3 z@52AR0M9X_e=j%3WMh0rQUW$?BQ8u$oRg8Bm@=P@4KQFs19SHCY~Lyc8zouH&m_gA z%+H9M&;0$pJsjhWOEc#uq*%=DQ;g{ebBxA?Y5tRS69; zV|;?u7~pPisJpD_xQ%x%SqE@L?&m}dQuGFpZKWnA-rpDPB9^xFLWxigc;aR>-(`O zVG*omxPcY!?!?ZcKXQbD`49bhBZdcuYfvojGX6|=_FZ@cTO4Arz7+8~uyvub%UsDZ@}k7IF>2Ad@a5j%!`?+<7iwS+MkKRPywU2&ShoHp19OO) z&-R5ISZ)Oc%-{Y475*s|o{R8Ax@kRxCsIxG6`n{lEkt-C#k7}%C(=usEIg4~+HB#8 zw9=A=CsImVhF*rbWx8>0nkCE9TNArl>w>p8x1N)cl$2nNj&=s#5CYEJlms1E)~GuE z&O$I^7PzuAqoa9B5_nk$#&ibZIkWouXRHZhf=OBP$NmM(Ez^j(vYZ7ir#`GD6FdP` znAK&{7+?p-8!>(6v8xjs!>>%~3aDJzrTCWCbuUks!g_z|LUN4LLdmI|K98Kh8JXnN zyp}>v#H^pl37I{VoSeAd8=bj<Ip$CVB#R$w=?;AFIz_R+f&Eec!N8eaBebg<1TE)-e_L!YYX4nTM5M{3OV`s)28X}M3hJWS>*+dt zE8IMNg-svj#lARG2*uXyvxk6<7%gsF%G$?xS$)srsN2UlTgxw$lC%2aEpk>~z9${F z?y84%_or8huDiOxPFzs*)+(W-FhS)R`FL`uIGZYb?xsTQE0~9>lB)Cx2<*R zeG=Bl2QIQ>>-C=CtQ&I=rWE=gy9bj7EJoVI;aKnL3 zUm^2YV|UilhSSHjfo_1(MPJ?)H1Zy|1I&gyYdh*o+XE(%h_-ZrmE`dbqEEp(cY;{y z@%%;5UEl8t&yl>-4IKF0*P(-c!wm*CG2Ool#QaBY?Aj=Gykg>i0@K{#2Vjr)xU<=# zyYL7*2w}5_d-C%=Aex=o>%|9oLLKiPj=K^+0Frn>WMjtZ|MUbm5ZXoeHb8u%yUhzQ znFpK`-Axi76Gpb^a^nKD^MM0^(nYW94fu3~_sNTZNh7?=zVHWmpZkevSHEH8#Q~7P zHfMS1WBY+Cpy#Zo_lL#g{XGEi=?k_w5XO=BI7qClV5x%u-%`T67XprU(sROB8nOH^ zSOYw)2gpsoIyaGg2ctf!tn42Cu8nUlew|1um#HtM$%;00Za zgwRHPcoDekpGD!rq3a_SKv%upNPIA)SBwEij!&k8{(5wCh|i~k{@JMJ@L@NE!7(h7)06(|SbV5WJ?mq~M$WWBJ$IIvi0VoI zD^?_7!)YVd4E{W84(6WqjFdNrT4WJ>ROh8{OcH%Rs%z}KK3ViFq+E(vBQAxII^MvS0&)%PQ*jcq zUDFNbrHLENnry`4rYAp>funDj+L-eL7egnU*;E&O#uAuC-npf)fV`+>Vz-Fs>E*Dh zv0WA{C-3Js;WhH6uE2*T+kLVUut;l|+EJhUmhIZBt8pX9qACVtMHOQ&%c&SUSxd#V zm4#Hyv$BdpC`u?aqJD~Tki}C>J6Sp5<)UoDn5dZ$ih>EDD3;KO;x@)Zmhad^)a?jG z;e>Z69Yj*pOn7@yFvYZz)l!U;ER|x~$T}&ewJehGzM?`xQ@}f~gAq{8Ut0$&pqO7@ z2YpOp6uFu&7HU{b%Q59@e$CXFW@=nBHKCcB)J#ojrlvMi(`?ElZ~v-IN|n(}Eor7Q zo2li^R8})(YNl2;Q*S9XSMBgdK}hngct znj;6ABgdH|hnXWsnIi|8BgdE{hnOStI7g;&j?Cg5nZ((0sM&I)*>a%ST9F41CR>g( zTMjc@jxt*gG8@O}vzknm@_*>E7q-az#BRaQr!u~K z3w{`s@!MMSq8Uk%N&em;{2)2WKRE;wpqBSIj5Dd_FCWHq zs^vQm;|sl(`{u(^N3s9R?UH!aMR4OM@*xBRPx4_lnwbT#pq1E|X1=okp67Q8APh=) z-y@h?C4ANq?5l)-K<54t9CryHQ-~izCHzn!%tiCuQFsH5`6w)Nko~yv+ee`@_bP%R z$Y&SH{&p1M5KH)-B1olH-Pon=-T7NqoJR>iZN;_~+`bs|pn~@)25)?qyEj0ucF+3D zBQn3#v~+x9@Kwc_`PF)1G3;&y$N8k=Fa^!QnxFPv-pZi=<9%If%vlGcPnMycdx>a`7%C=%;GA!vkq6mK!i7|WN%%naXHHPE7e#j zl<}R_`25QFm(?%;O`95NB5EK4)yf)7r!s!M2G_id2iMA$i)!U~^U3^LD+a3jo`5<4 zo&RwX_nXcqeuU|*^Q|9Y?&`eNDJ)@io_-2Uj^b@oT`T|dJfuMp zPr4vY!v%aGMf~;^@Z!;*z!(Sd&d1}^rvt#iD?gEK`dx&z*rxO%RyRew$0aOiig@lN zSV@h2c$-k@&BHHaK~%)cFT=Z#&&OWDA?NdhS8$N|qWf8B`hJ1!(m%z;&*$(Z4CKFj zicc<|)@1N!_;SvtHCaV|@n`r9^Z64pkyoX{HF4#8uFA%r5$gUqE^QUh{2bT2ihut( zKAkFYvjjBk3tX5gal1q`a`o4J3H{NRtAB}n`>*6RW5~QmM&9YcSF*9s*Z8_BO#6p8Tk*s!DTqgCtt@Q9p$yx@xr6j z$$)x%U`MHwym|;iABQ>~4UST@T7CltIfyeVa|d2nfS)}VZs1NX;19{*P7XsgqXDN; z!1p!a;ur9z4WQ9AK0N#;F8!vP*jE8>xG5WZe2WjFfX99ducA5rt-Pk=caTj7e<}FB zUu)4`MQ(zN;EedQUuw8*21a>R1M*@?!Uy%dU>|0{qzmu>O9e8~1_B#`Y}31yOT2Z}q{;@YzW+A7eFfU^QF1Uf0; zN}!7X@(8#q0e2gaH|=3lnx_n#G=m~ul4w2(^d`_p0bc_C3Iq@spuj)^!3qo_Fhqe+ z0^tPk7Y!|f$OzRWlE6p>q6x$(FowW*1tt)fEPy=ro$D4Wt=qVOmMMiUq-fc)KQ9D#{8 zAUl|BQ`!^?zd}H~U8WJ4p_;r#AXb6d1m+4L>M|{!zb4yiJ2l6x_~RN znZWxBY$LE!fn5alDzJ~hK?Ob_a7cl}1de#)JA?*WNW`j|6cf-DC?!xXfcyoqfD^O41rUKs*_(6dm z3H%~}N&W=-E0NoR2q33&$ELKq6#hej2Lv7~@F#)46?j76Uj;x+u_0D%Dt3?vY&z#sxc6bK~{j>e0|6+vW#Y7$9cqy)V0J(%JsjskPd9oU4x zj(poaXpQG8AKZf;{P%nC44$K0x(6QKPqB?Sf)$l{uGz)*zbdimnTrzA{L&WBx8QW~ zCy4vd6YO}&x64p&j`8SBk*+)+urOW{u#*U89FL7_ZI(y(;JmYEpveSH=quP z#Oa~=1&P>mA3AXV>-hVa=VR~)5#OM*=sXgQxHlScOElsgh(_ECjo6K7MDJ*h>PsGj zmjixT-}Vo9wCW^^6my#-V_bY}!qT|pMM(+b%=4n1U7tk!vj6u&yYBKJ%-n-J=Ryyh z2%e@T*}3`1>spI{0h*s0m!8mnE=ELGt&`&xCd8&?CeJY@iN;w;cH)e0dy?H?>Zl(p z{IkCuMx2xF+z55#Pu~aEmg0JTSF`Jk?cA+n@fGBW1){XaCN BL3jWF delta 9640 zcmY+Kd0)cKLxodqtd!K#Q-e>J|);;&GzU;L6 zvQvdiAd3m|32isaoSBo7nUfuqnr@z%l%8E`X`@h@ITN*GhB-MmJq5iN(vvb%bCXh2 zm`|{qL#s?|NN3lAJYR53HZRCaP03_?gZu`%sN?6SWvAtsv+&4PX_?6>3ra1|+Ggcu zWr_2aTAW4ythAZAIcb@xrL0|GHeMdNoRc!sY@U-HG(L9F(9yA_7Kf~qq~weg z))3g0Z3^rP-u%Op;N79r(pH^v)_ikvN~xs>Z}=KK`JT(r#vNynmYJQCl%8H{aZ-bp zvb#IFvvb?KTIU9LwlCao-=f9vLEoMZEWe)@tQ}VBfoG<6>PF>Y!LKk?Lvdu-=WTIMA#sgB=L-W+TF<;yJg6Utp#f z6I&B8i7oAKVs7L5ve^DHY{f7WJ3GOPHTFNi?nIc_rvs8%(-0G{Zw-ztAaV-R2btK; z$VtpS+Qj~|qBolu74uP)iB)Xs$j(H?u*ktC7Buh{`#aXe`bTRl1MS$8o!R%%F>Lq{ zlXY0kJYdTs<$zt;lR+^oX{d=M4o+gFQ6`?z1$>#~kQnAX(8Tk*gCF~FNDS07i0aB7 z49Q^iIQn}-6IuQM6LW}7WpJCyjqFy4hV0(@I=mPJB26m zRnvtha#cIlvMqj!MAe!Ew6fj9JqtwwYOPw~N15M7?Y;Vm2Pj6{GGdDdw#Tpmq z0?c~Smlcd?WPMM2vKb>Q*xV);UYHK;t^ML(22`%>`ZY&u%BV0YtmUKs2WgX0YIyyoEHu2jsb<5Ao_@>l!e>MqUQyB=n>Q=e@XjayYIx_~8sW-58*9eo z^<_Kr;@G7GBWkyW81h6l?t3~y17(yU)FnbBaiY1Pd4uK1l-0RY|)lD z-oXbqFpI*!umL?geRgiAU0WHJw$Z7d`E`eX%ESc^{W0`A;hp8XK73$QJ6z?pYINLOq1 zS>5oKp8v1mEor(-9xJ-!Y2Eb2C4(1TO0}b-;F~6+$MtJ3SbzEUccaJs%Mpe*@ahMK zcm0|@9mNJ-eaUKnbA`b-e0SaON`7elT#xF1<7Jnzy?N_r!<+Q;pN2Q{7vo&4=1*s? zm*C@0~aIk*$;ad-qt@H4X@@;+i4Cz!F-peKK%3v zc?V8FC+er)w}VWAdUi{==D;Q|lDV$2JIg4=^)b%y3ZQh=^V@(%-lMjF8FOb@2Yo?1 zz(fNp*|YQnoT5#~sb%PB3Kgi{g?lxjb`E>ca%XA|<8j1fFzaz2aSY{uktewgwc^U#M+ zdrlgY**X1rrvI5JVz2v$8Ow|yUN945UtQp<|1?vCy}H1KPn!THJtP^gf{^GoM7YSHi6=x=4?=)6w?CRW+7F8pLJCRV%g;H&qW4;}Go zGznbwDR0Ac!#%wKW*ctoLYOPv4*IElSY+#40QrV{>m8VCxRVyaTZVgXG43`RH{o5# zGTck=;ogw7SUku=EZ$yLVexjd1dDGY>#z71W$}ejR9MVq!#zG^C<9IJw{$m$W_ahYb7M`IjoTMnV@bse2if<*0tav9`VZ}Sk@+!Wy ztgZ08qOd|!%U@m&L*Njfx*XS`f?r(@Jqtw?C0YR1cUX+em`b$3W@=P3HKv&w*G!FX zrY1I1lbWeFY)X7-D$(AwNvU$1skfV{yk;uDnJQ?e3Y)3L&D6U}O%SJFs-#fMo2kvs zR82Eg*Gy%(&>B|glZ)XA%o6qLv{IQRXhf}!MilC3M3s(4l;~(gmY@+?f<{#4Xhd0# zMqD2>B1_PSEI}i(1dUZcv=aQCVnkw~6jeAHkr!x0UZ4@hHyTlSqY-5{8c}nj5qW{8 zmiv4RqhwYW$#9Ehv_&%5Vi{|(47FHBS}X%CmT?x#FpFiB#WKiZ8Dp^wu~_DDu}tG) znZ?C2iHl^YMKaPN8EBDK?}fn>$vBH-m_;(mA{k^6#^|&PMu3%1SOvY&EL{a*XlhnL z2%7t=@K$2w!5jvnF_S6h&hZyoqy$EoWemiR{ERqOB$Xyr}o;8iq_ z*Fl)KoM3{fMT^;=&i=GGr*v_t_HR^Lm~V>~{+g91tOrl*YbNtPnO)N8r`E$|fc<>i z28cuR>jnsd!`y2lF2G?vk<5yX@EWQc8zCKz@X?#FI5@%&ZGr)4e%%TEdEjOYrkuaA z8HS=+PwK>GT()xFehW-NW8MN2&>Y=@kCJlkwiR#K<-Bk!R&3?`_EvdZpKUN1m1Udk zd1D)lLe*H3@=+D|NUG$!Dqt3x zm-fOx&{+1uLI*jHJHNdbUgp00aOEobjD2#vPxoPnmHf^=$f91aunX%u^LMQ{k4k>R zihU1o`~8><2YAo@&>e5+o;RRt+ZTi63%bCp>>Rvp@Fn{({SWCC`(aZn*vrRP!bCKm zRbuW{@GmNH`&97ORp94nBn#Vkx&t3w1??~~rdL5XH1Ac({dBZS?5Z>YoTXXW42L0>e^_0q)DLkz0L^_WpsezhLg z+{(imWY4(`GTt&WKR1X#^?)PL2++XqAH_}Az!Q#PjyLeN$1s5#c&p=B+BWc<<51`* zZmE_oV|mkY=)zxVl`h*Mc(catb3X<8w}7U0uy9Pr*zyo}XjSYCh|8NJ4Y`bKC)Syzgl&z3TXy(=Zs# zmD89;b$q}X%)>gq?hH=1j{k86vZ0=*pOxmuS-c?i{Psog<#Fd=l!LhOTe|Y6eZjL$^_PDGebASye}R1a zZ{;zg$b3vjp6S82va{d6@Sb&)m;MWupmD#9d+jLAr{pqj;G;C3wpTFsj?!6XU%{+C zN@qDt{(~#H42^ukRSc<-H(bR78)=Zf*YJWh(jYspK`8nd>R2=wrRbG^9l{;N`z=d* zUQvz@ptIL;C)e`d$>2_oLN(Sn#%9wF&(~#B6?|?Kf)vT>$yE_921)*?{c-*rv26)cm&q@||vrZt^1Aqme-N zZzWWrYST!A#8<5RqLa8DTw{wLJ$mV@ErCHI#=7S1oCJ7D;P$);3OQc$L$s2X)5l&rh zE3lTp9R=1CxF-P*`7b2Wk1#E}%b^_6$S+tj3!H39dy$&kDA1OGivq3$Ix65sz(avf z1Uwb+lAuuQqDWWj(oKQx1YT932Z3G+1QO`2Kpz4j3WO4f5J3LS)So~U0o>hkve81y zAD?2VeTWUn=2)B3hEekf1x6AWEr9sWtc@X%U;}c12{xroq~_NNh`Y-hM5d@NQwbz0 zFoVD>0YqJ$jGM`AE0t*QgDDVz}#R@DTuvCF% z1d0WaztycE@V*VmI6tr{t)x57A2%^mq?8We3alpZi2~~gY*1h$fh`JbCGeR7I|%Gj zU^jt1-SHkmfmRT)sxJEp=n5PnP$hu;^|6{joejvjHQ1DPgqn{l&`98v0-vK-C~jej zoTDyH3S1;`NrA5je5=5}2wYX*8iAV%d`I9%1^!LoCjkoO&!;~Vxh;qQaw>OhO1n$V z_Z4_R;E@7<5O}P>69RuL(85n%X?ryELv2e53N=R?ktcPsDeXnsuC-C1Eddt=TnThk zz>R>10-XqW3Lt+I_9D>524)wEV%B7nnlH8cDd10_rvd>4f)ofQ&{u(e1i};uCon*P zNCMGld?~INB12S{p#+9Yz$Z*EFH0pOv(L14$8{3P3_y*+*nE%+S*9K?OoVq$}WJo%a5;ROeApR{ymng7Heql6Z>J&TE_odJ_Q zzA@y15Ah(e|1Eyp@m0Ej-cF(s=SCw=iALNE(TH=Q5!(`t7#&Tc{`MpAb--`!>;3|-RvksPVsTD4 zCnYDQEJ(_jo1P-xfS$Lr>zRh%`XA4+>nvZ3S-iPR33%f~@ZDOvox7hru5}vzMJhEb zDJP}RENl@&wa!SIlaiR7mod|vE;<*a+le=R>(lM}(?Gph#UFj_u*D_A&Ye&P{`3=Y mYblQBcQw10v42vAosYW!x%kf{@o%a?@$aRa(%jscf&ULD`dc^v diff --git a/.doctrees/nbsphinx/notebooks/nmodl-kinetic-schemes.ipynb b/.doctrees/nbsphinx/notebooks/nmodl-kinetic-schemes.ipynb index ada33b383..f79cea2f6 100644 --- a/.doctrees/nbsphinx/notebooks/nmodl-kinetic-schemes.ipynb +++ b/.doctrees/nbsphinx/notebooks/nmodl-kinetic-schemes.ipynb @@ -152,10 +152,10 @@ "execution_count": 1, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:03:58.340648Z", - "iopub.status.busy": "2024-11-07T13:03:58.340464Z", - "iopub.status.idle": "2024-11-07T13:03:59.664964Z", - "shell.execute_reply": "2024-11-07T13:03:59.663048Z" + "iopub.execute_input": "2024-11-13T09:18:41.751865Z", + "iopub.status.busy": "2024-11-13T09:18:41.751669Z", + "iopub.status.idle": "2024-11-13T09:18:42.552471Z", + "shell.execute_reply": "2024-11-13T09:18:42.551594Z" } }, "outputs": [], @@ -169,10 +169,10 @@ "execution_count": 2, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:03:59.668932Z", - "iopub.status.busy": "2024-11-07T13:03:59.668516Z", - "iopub.status.idle": "2024-11-07T13:03:59.699983Z", - "shell.execute_reply": "2024-11-07T13:03:59.699089Z" + "iopub.execute_input": "2024-11-13T09:18:42.555059Z", + "iopub.status.busy": "2024-11-13T09:18:42.554826Z", + "iopub.status.idle": "2024-11-13T09:18:42.585239Z", + "shell.execute_reply": "2024-11-13T09:18:42.584620Z" } }, "outputs": [], @@ -277,10 +277,10 @@ "execution_count": 3, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:03:59.702600Z", - "iopub.status.busy": "2024-11-07T13:03:59.702313Z", - "iopub.status.idle": "2024-11-07T13:03:59.707081Z", - "shell.execute_reply": "2024-11-07T13:03:59.706443Z" + "iopub.execute_input": "2024-11-13T09:18:42.587474Z", + "iopub.status.busy": "2024-11-13T09:18:42.587081Z", + "iopub.status.idle": "2024-11-13T09:18:42.592054Z", + "shell.execute_reply": "2024-11-13T09:18:42.591383Z" } }, "outputs": [ @@ -323,10 +323,10 @@ "execution_count": 4, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:03:59.738644Z", - "iopub.status.busy": "2024-11-07T13:03:59.738014Z", - "iopub.status.idle": "2024-11-07T13:03:59.742337Z", - "shell.execute_reply": "2024-11-07T13:03:59.741698Z" + "iopub.execute_input": "2024-11-13T09:18:42.622326Z", + "iopub.status.busy": "2024-11-13T09:18:42.622107Z", + "iopub.status.idle": "2024-11-13T09:18:42.626206Z", + "shell.execute_reply": "2024-11-13T09:18:42.625636Z" } }, "outputs": [ @@ -367,10 +367,10 @@ "execution_count": 5, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:03:59.745157Z", - "iopub.status.busy": "2024-11-07T13:03:59.744599Z", - "iopub.status.idle": "2024-11-07T13:03:59.748742Z", - "shell.execute_reply": "2024-11-07T13:03:59.748072Z" + "iopub.execute_input": "2024-11-13T09:18:42.628010Z", + "iopub.status.busy": "2024-11-13T09:18:42.627818Z", + "iopub.status.idle": "2024-11-13T09:18:42.631599Z", + "shell.execute_reply": "2024-11-13T09:18:42.631040Z" }, "scrolled": true }, @@ -412,10 +412,10 @@ "execution_count": 6, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:03:59.750725Z", - "iopub.status.busy": "2024-11-07T13:03:59.750527Z", - "iopub.status.idle": "2024-11-07T13:03:59.754105Z", - "shell.execute_reply": "2024-11-07T13:03:59.753565Z" + "iopub.execute_input": "2024-11-13T09:18:42.633619Z", + "iopub.status.busy": "2024-11-13T09:18:42.633307Z", + "iopub.status.idle": "2024-11-13T09:18:42.637224Z", + "shell.execute_reply": "2024-11-13T09:18:42.636683Z" }, "scrolled": true }, @@ -459,10 +459,10 @@ "execution_count": 7, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:03:59.755951Z", - "iopub.status.busy": "2024-11-07T13:03:59.755756Z", - "iopub.status.idle": "2024-11-07T13:03:59.760308Z", - "shell.execute_reply": "2024-11-07T13:03:59.759747Z" + "iopub.execute_input": "2024-11-13T09:18:42.639023Z", + "iopub.status.busy": "2024-11-13T09:18:42.638832Z", + "iopub.status.idle": "2024-11-13T09:18:42.642960Z", + "shell.execute_reply": "2024-11-13T09:18:42.642422Z" } }, "outputs": [ diff --git a/.doctrees/nbsphinx/notebooks/nmodl-python-tutorial.ipynb b/.doctrees/nbsphinx/notebooks/nmodl-python-tutorial.ipynb index e997570ca..6a2a6b282 100644 --- a/.doctrees/nbsphinx/notebooks/nmodl-python-tutorial.ipynb +++ b/.doctrees/nbsphinx/notebooks/nmodl-python-tutorial.ipynb @@ -30,10 +30,10 @@ "execution_count": 1, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:05.041312Z", - "iopub.status.busy": "2024-11-07T13:04:05.040826Z", - "iopub.status.idle": "2024-11-07T13:04:06.334983Z", - "shell.execute_reply": "2024-11-07T13:04:06.334208Z" + "iopub.execute_input": "2024-11-13T09:18:51.442230Z", + "iopub.status.busy": "2024-11-13T09:18:51.442046Z", + "iopub.status.idle": "2024-11-13T09:18:52.242528Z", + "shell.execute_reply": "2024-11-13T09:18:52.241721Z" } }, "outputs": [], @@ -63,10 +63,10 @@ "execution_count": 2, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:06.337576Z", - "iopub.status.busy": "2024-11-07T13:04:06.337361Z", - "iopub.status.idle": "2024-11-07T13:04:06.366675Z", - "shell.execute_reply": "2024-11-07T13:04:06.366016Z" + "iopub.execute_input": "2024-11-13T09:18:52.245184Z", + "iopub.status.busy": "2024-11-13T09:18:52.244737Z", + "iopub.status.idle": "2024-11-13T09:18:52.273465Z", + "shell.execute_reply": "2024-11-13T09:18:52.272720Z" } }, "outputs": [], @@ -86,10 +86,10 @@ "execution_count": 3, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:06.369207Z", - "iopub.status.busy": "2024-11-07T13:04:06.368795Z", - "iopub.status.idle": "2024-11-07T13:04:06.372544Z", - "shell.execute_reply": "2024-11-07T13:04:06.371982Z" + "iopub.execute_input": "2024-11-13T09:18:52.276021Z", + "iopub.status.busy": "2024-11-13T09:18:52.275484Z", + "iopub.status.idle": "2024-11-13T09:18:52.279329Z", + "shell.execute_reply": "2024-11-13T09:18:52.278705Z" } }, "outputs": [], @@ -152,10 +152,10 @@ "execution_count": 4, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:06.374796Z", - "iopub.status.busy": "2024-11-07T13:04:06.374288Z", - "iopub.status.idle": "2024-11-07T13:04:06.378376Z", - "shell.execute_reply": "2024-11-07T13:04:06.377835Z" + "iopub.execute_input": "2024-11-13T09:18:52.281554Z", + "iopub.status.busy": "2024-11-13T09:18:52.281061Z", + "iopub.status.idle": "2024-11-13T09:18:52.284984Z", + "shell.execute_reply": "2024-11-13T09:18:52.284292Z" } }, "outputs": [], @@ -183,10 +183,10 @@ "execution_count": 5, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:06.380375Z", - "iopub.status.busy": "2024-11-07T13:04:06.379990Z", - "iopub.status.idle": "2024-11-07T13:04:06.383787Z", - "shell.execute_reply": "2024-11-07T13:04:06.383227Z" + "iopub.execute_input": "2024-11-13T09:18:52.287170Z", + "iopub.status.busy": "2024-11-13T09:18:52.286789Z", + "iopub.status.idle": "2024-11-13T09:18:52.290288Z", + "shell.execute_reply": "2024-11-13T09:18:52.289681Z" } }, "outputs": [ @@ -235,10 +235,10 @@ "execution_count": 6, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:06.385944Z", - "iopub.status.busy": "2024-11-07T13:04:06.385561Z", - "iopub.status.idle": "2024-11-07T13:04:06.389536Z", - "shell.execute_reply": "2024-11-07T13:04:06.389031Z" + "iopub.execute_input": "2024-11-13T09:18:52.292362Z", + "iopub.status.busy": "2024-11-13T09:18:52.291973Z", + "iopub.status.idle": "2024-11-13T09:18:52.295806Z", + "shell.execute_reply": "2024-11-13T09:18:52.295299Z" } }, "outputs": [], @@ -260,10 +260,10 @@ "execution_count": 7, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:06.391743Z", - "iopub.status.busy": "2024-11-07T13:04:06.391245Z", - "iopub.status.idle": "2024-11-07T13:04:06.395147Z", - "shell.execute_reply": "2024-11-07T13:04:06.394599Z" + "iopub.execute_input": "2024-11-13T09:18:52.297760Z", + "iopub.status.busy": "2024-11-13T09:18:52.297453Z", + "iopub.status.idle": "2024-11-13T09:18:52.301271Z", + "shell.execute_reply": "2024-11-13T09:18:52.300702Z" } }, "outputs": [ @@ -297,10 +297,10 @@ "execution_count": 8, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:06.397160Z", - "iopub.status.busy": "2024-11-07T13:04:06.396819Z", - "iopub.status.idle": "2024-11-07T13:04:06.403705Z", - "shell.execute_reply": "2024-11-07T13:04:06.403086Z" + "iopub.execute_input": "2024-11-13T09:18:52.303228Z", + "iopub.status.busy": "2024-11-13T09:18:52.302923Z", + "iopub.status.idle": "2024-11-13T09:18:52.310330Z", + "shell.execute_reply": "2024-11-13T09:18:52.309776Z" } }, "outputs": [ @@ -365,10 +365,10 @@ "execution_count": 9, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:06.405716Z", - "iopub.status.busy": "2024-11-07T13:04:06.405334Z", - "iopub.status.idle": "2024-11-07T13:04:06.409319Z", - "shell.execute_reply": "2024-11-07T13:04:06.408773Z" + "iopub.execute_input": "2024-11-13T09:18:52.312328Z", + "iopub.status.busy": "2024-11-13T09:18:52.311873Z", + "iopub.status.idle": "2024-11-13T09:18:52.316147Z", + "shell.execute_reply": "2024-11-13T09:18:52.315505Z" } }, "outputs": [ @@ -416,10 +416,10 @@ "execution_count": 10, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:06.411366Z", - "iopub.status.busy": "2024-11-07T13:04:06.411063Z", - "iopub.status.idle": "2024-11-07T13:04:06.414382Z", - "shell.execute_reply": "2024-11-07T13:04:06.413859Z" + "iopub.execute_input": "2024-11-13T09:18:52.318313Z", + "iopub.status.busy": "2024-11-13T09:18:52.317941Z", + "iopub.status.idle": "2024-11-13T09:18:52.321156Z", + "shell.execute_reply": "2024-11-13T09:18:52.320602Z" } }, "outputs": [], @@ -441,10 +441,10 @@ "execution_count": 11, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:06.416339Z", - "iopub.status.busy": "2024-11-07T13:04:06.416029Z", - "iopub.status.idle": "2024-11-07T13:04:06.419644Z", - "shell.execute_reply": "2024-11-07T13:04:06.419042Z" + "iopub.execute_input": "2024-11-13T09:18:52.323157Z", + "iopub.status.busy": "2024-11-13T09:18:52.322858Z", + "iopub.status.idle": "2024-11-13T09:18:52.326444Z", + "shell.execute_reply": "2024-11-13T09:18:52.325913Z" } }, "outputs": [ @@ -510,10 +510,10 @@ "execution_count": 12, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:06.421540Z", - "iopub.status.busy": "2024-11-07T13:04:06.421343Z", - "iopub.status.idle": "2024-11-07T13:04:06.425007Z", - "shell.execute_reply": "2024-11-07T13:04:06.424440Z" + "iopub.execute_input": "2024-11-13T09:18:52.328398Z", + "iopub.status.busy": "2024-11-13T09:18:52.328094Z", + "iopub.status.idle": "2024-11-13T09:18:52.331276Z", + "shell.execute_reply": "2024-11-13T09:18:52.330741Z" } }, "outputs": [ @@ -548,10 +548,10 @@ "execution_count": 13, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:06.426846Z", - "iopub.status.busy": "2024-11-07T13:04:06.426651Z", - "iopub.status.idle": "2024-11-07T13:04:06.430329Z", - "shell.execute_reply": "2024-11-07T13:04:06.429707Z" + "iopub.execute_input": "2024-11-13T09:18:52.333438Z", + "iopub.status.busy": "2024-11-13T09:18:52.333070Z", + "iopub.status.idle": "2024-11-13T09:18:52.336395Z", + "shell.execute_reply": "2024-11-13T09:18:52.335751Z" } }, "outputs": [ @@ -584,10 +584,10 @@ "execution_count": 14, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:06.432719Z", - "iopub.status.busy": "2024-11-07T13:04:06.432155Z", - "iopub.status.idle": "2024-11-07T13:04:06.435817Z", - "shell.execute_reply": "2024-11-07T13:04:06.435249Z" + "iopub.execute_input": "2024-11-13T09:18:52.338622Z", + "iopub.status.busy": "2024-11-13T09:18:52.338397Z", + "iopub.status.idle": "2024-11-13T09:18:52.342079Z", + "shell.execute_reply": "2024-11-13T09:18:52.341466Z" } }, "outputs": [ @@ -622,10 +622,10 @@ "execution_count": 15, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:06.437971Z", - "iopub.status.busy": "2024-11-07T13:04:06.437501Z", - "iopub.status.idle": "2024-11-07T13:04:06.441735Z", - "shell.execute_reply": "2024-11-07T13:04:06.441082Z" + "iopub.execute_input": "2024-11-13T09:18:52.344298Z", + "iopub.status.busy": "2024-11-13T09:18:52.343926Z", + "iopub.status.idle": "2024-11-13T09:18:52.347808Z", + "shell.execute_reply": "2024-11-13T09:18:52.347267Z" } }, "outputs": [ @@ -669,10 +669,10 @@ "execution_count": 16, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:06.443818Z", - "iopub.status.busy": "2024-11-07T13:04:06.443451Z", - "iopub.status.idle": "2024-11-07T13:04:06.448894Z", - "shell.execute_reply": "2024-11-07T13:04:06.448238Z" + "iopub.execute_input": "2024-11-13T09:18:52.349822Z", + "iopub.status.busy": "2024-11-13T09:18:52.349461Z", + "iopub.status.idle": "2024-11-13T09:18:52.354900Z", + "shell.execute_reply": "2024-11-13T09:18:52.354325Z" } }, "outputs": [ @@ -733,10 +733,10 @@ "execution_count": 17, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:06.451061Z", - "iopub.status.busy": "2024-11-07T13:04:06.450579Z", - "iopub.status.idle": "2024-11-07T13:04:06.454262Z", - "shell.execute_reply": "2024-11-07T13:04:06.453694Z" + "iopub.execute_input": "2024-11-13T09:18:52.357063Z", + "iopub.status.busy": "2024-11-13T09:18:52.356542Z", + "iopub.status.idle": "2024-11-13T09:18:52.360260Z", + "shell.execute_reply": "2024-11-13T09:18:52.359616Z" } }, "outputs": [], @@ -761,10 +761,10 @@ "execution_count": 18, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:06.456402Z", - "iopub.status.busy": "2024-11-07T13:04:06.455930Z", - "iopub.status.idle": "2024-11-07T13:04:06.465855Z", - "shell.execute_reply": "2024-11-07T13:04:06.465294Z" + "iopub.execute_input": "2024-11-13T09:18:52.362270Z", + "iopub.status.busy": "2024-11-13T09:18:52.361915Z", + "iopub.status.idle": "2024-11-13T09:18:52.371922Z", + "shell.execute_reply": "2024-11-13T09:18:52.371275Z" } }, "outputs": [], @@ -857,10 +857,10 @@ "execution_count": 19, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:06.467784Z", - "iopub.status.busy": "2024-11-07T13:04:06.467380Z", - "iopub.status.idle": "2024-11-07T13:04:06.470840Z", - "shell.execute_reply": "2024-11-07T13:04:06.470270Z" + "iopub.execute_input": "2024-11-13T09:18:52.374081Z", + "iopub.status.busy": "2024-11-13T09:18:52.373604Z", + "iopub.status.idle": "2024-11-13T09:18:52.377309Z", + "shell.execute_reply": "2024-11-13T09:18:52.376653Z" } }, "outputs": [ @@ -897,10 +897,10 @@ "execution_count": 20, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:06.473066Z", - "iopub.status.busy": "2024-11-07T13:04:06.472604Z", - "iopub.status.idle": "2024-11-07T13:04:06.477921Z", - "shell.execute_reply": "2024-11-07T13:04:06.477398Z" + "iopub.execute_input": "2024-11-13T09:18:52.379321Z", + "iopub.status.busy": "2024-11-13T09:18:52.378938Z", + "iopub.status.idle": "2024-11-13T09:18:52.384465Z", + "shell.execute_reply": "2024-11-13T09:18:52.383797Z" } }, "outputs": [ diff --git a/.doctrees/nbsphinx/notebooks/nmodl-sympy-conductance.ipynb b/.doctrees/nbsphinx/notebooks/nmodl-sympy-conductance.ipynb index 60e17a945..07256374c 100644 --- a/.doctrees/nbsphinx/notebooks/nmodl-sympy-conductance.ipynb +++ b/.doctrees/nbsphinx/notebooks/nmodl-sympy-conductance.ipynb @@ -86,10 +86,10 @@ "execution_count": 1, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:08.794503Z", - "iopub.status.busy": "2024-11-07T13:04:08.794295Z", - "iopub.status.idle": "2024-11-07T13:04:09.729693Z", - "shell.execute_reply": "2024-11-07T13:04:09.728870Z" + "iopub.execute_input": "2024-11-13T09:18:54.830257Z", + "iopub.status.busy": "2024-11-13T09:18:54.830079Z", + "iopub.status.idle": "2024-11-13T09:18:55.628357Z", + "shell.execute_reply": "2024-11-13T09:18:55.627591Z" } }, "outputs": [], @@ -103,10 +103,10 @@ "execution_count": 2, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:09.732544Z", - "iopub.status.busy": "2024-11-07T13:04:09.732014Z", - "iopub.status.idle": "2024-11-07T13:04:09.763831Z", - "shell.execute_reply": "2024-11-07T13:04:09.762997Z" + "iopub.execute_input": "2024-11-13T09:18:55.631061Z", + "iopub.status.busy": "2024-11-13T09:18:55.630560Z", + "iopub.status.idle": "2024-11-13T09:18:55.661290Z", + "shell.execute_reply": "2024-11-13T09:18:55.660609Z" } }, "outputs": [], @@ -149,10 +149,10 @@ "execution_count": 3, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:09.766430Z", - "iopub.status.busy": "2024-11-07T13:04:09.766023Z", - "iopub.status.idle": "2024-11-07T13:04:10.047470Z", - "shell.execute_reply": "2024-11-07T13:04:10.046736Z" + "iopub.execute_input": "2024-11-13T09:18:55.663719Z", + "iopub.status.busy": "2024-11-13T09:18:55.663466Z", + "iopub.status.idle": "2024-11-13T09:18:55.940088Z", + "shell.execute_reply": "2024-11-13T09:18:55.939359Z" } }, "outputs": [ @@ -196,10 +196,10 @@ "execution_count": 4, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:10.049687Z", - "iopub.status.busy": "2024-11-07T13:04:10.049412Z", - "iopub.status.idle": "2024-11-07T13:04:10.184267Z", - "shell.execute_reply": "2024-11-07T13:04:10.183547Z" + "iopub.execute_input": "2024-11-13T09:18:55.942348Z", + "iopub.status.busy": "2024-11-13T09:18:55.942090Z", + "iopub.status.idle": "2024-11-13T09:18:56.073925Z", + "shell.execute_reply": "2024-11-13T09:18:56.073233Z" } }, "outputs": [ @@ -243,10 +243,10 @@ "execution_count": 5, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:10.186852Z", - "iopub.status.busy": "2024-11-07T13:04:10.186421Z", - "iopub.status.idle": "2024-11-07T13:04:10.195282Z", - "shell.execute_reply": "2024-11-07T13:04:10.194720Z" + "iopub.execute_input": "2024-11-13T09:18:56.076360Z", + "iopub.status.busy": "2024-11-13T09:18:56.075881Z", + "iopub.status.idle": "2024-11-13T09:18:56.085091Z", + "shell.execute_reply": "2024-11-13T09:18:56.084492Z" } }, "outputs": [ @@ -290,10 +290,10 @@ "execution_count": 6, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:10.197237Z", - "iopub.status.busy": "2024-11-07T13:04:10.197029Z", - "iopub.status.idle": "2024-11-07T13:04:10.214904Z", - "shell.execute_reply": "2024-11-07T13:04:10.214315Z" + "iopub.execute_input": "2024-11-13T09:18:56.086958Z", + "iopub.status.busy": "2024-11-13T09:18:56.086757Z", + "iopub.status.idle": "2024-11-13T09:18:56.104279Z", + "shell.execute_reply": "2024-11-13T09:18:56.103621Z" } }, "outputs": [ @@ -337,10 +337,10 @@ "execution_count": 7, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:10.217239Z", - "iopub.status.busy": "2024-11-07T13:04:10.216713Z", - "iopub.status.idle": "2024-11-07T13:04:10.337794Z", - "shell.execute_reply": "2024-11-07T13:04:10.337147Z" + "iopub.execute_input": "2024-11-13T09:18:56.106601Z", + "iopub.status.busy": "2024-11-13T09:18:56.106088Z", + "iopub.status.idle": "2024-11-13T09:18:56.225379Z", + "shell.execute_reply": "2024-11-13T09:18:56.224714Z" } }, "outputs": [ @@ -400,10 +400,10 @@ "execution_count": 8, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:10.339926Z", - "iopub.status.busy": "2024-11-07T13:04:10.339703Z", - "iopub.status.idle": "2024-11-07T13:04:10.436570Z", - "shell.execute_reply": "2024-11-07T13:04:10.435913Z" + "iopub.execute_input": "2024-11-13T09:18:56.227581Z", + "iopub.status.busy": "2024-11-13T09:18:56.227373Z", + "iopub.status.idle": "2024-11-13T09:18:56.322291Z", + "shell.execute_reply": "2024-11-13T09:18:56.321674Z" } }, "outputs": [ @@ -456,10 +456,10 @@ "execution_count": 9, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:10.438662Z", - "iopub.status.busy": "2024-11-07T13:04:10.438427Z", - "iopub.status.idle": "2024-11-07T13:04:10.514688Z", - "shell.execute_reply": "2024-11-07T13:04:10.514032Z" + "iopub.execute_input": "2024-11-13T09:18:56.324286Z", + "iopub.status.busy": "2024-11-13T09:18:56.324070Z", + "iopub.status.idle": "2024-11-13T09:18:56.399063Z", + "shell.execute_reply": "2024-11-13T09:18:56.398448Z" } }, "outputs": [ diff --git a/.doctrees/nbsphinx/notebooks/nmodl-sympy-solver-cnexp.ipynb b/.doctrees/nbsphinx/notebooks/nmodl-sympy-solver-cnexp.ipynb index e599a3392..f3992f265 100644 --- a/.doctrees/nbsphinx/notebooks/nmodl-sympy-solver-cnexp.ipynb +++ b/.doctrees/nbsphinx/notebooks/nmodl-sympy-solver-cnexp.ipynb @@ -62,10 +62,10 @@ "execution_count": 1, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:12.501813Z", - "iopub.status.busy": "2024-11-07T13:04:12.501241Z", - "iopub.status.idle": "2024-11-07T13:04:13.313108Z", - "shell.execute_reply": "2024-11-07T13:04:13.312323Z" + "iopub.execute_input": "2024-11-13T09:18:58.155478Z", + "iopub.status.busy": "2024-11-13T09:18:58.154916Z", + "iopub.status.idle": "2024-11-13T09:18:58.957386Z", + "shell.execute_reply": "2024-11-13T09:18:58.956572Z" } }, "outputs": [], @@ -79,10 +79,10 @@ "execution_count": 2, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:13.315817Z", - "iopub.status.busy": "2024-11-07T13:04:13.315348Z", - "iopub.status.idle": "2024-11-07T13:04:13.347228Z", - "shell.execute_reply": "2024-11-07T13:04:13.346419Z" + "iopub.execute_input": "2024-11-13T09:18:58.959862Z", + "iopub.status.busy": "2024-11-13T09:18:58.959642Z", + "iopub.status.idle": "2024-11-13T09:18:58.990944Z", + "shell.execute_reply": "2024-11-13T09:18:58.990291Z" } }, "outputs": [], @@ -123,10 +123,10 @@ "execution_count": 3, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:13.350086Z", - "iopub.status.busy": "2024-11-07T13:04:13.349651Z", - "iopub.status.idle": "2024-11-07T13:04:13.770831Z", - "shell.execute_reply": "2024-11-07T13:04:13.770079Z" + "iopub.execute_input": "2024-11-13T09:18:58.993364Z", + "iopub.status.busy": "2024-11-13T09:18:58.993098Z", + "iopub.status.idle": "2024-11-13T09:18:59.437194Z", + "shell.execute_reply": "2024-11-13T09:18:59.436338Z" } }, "outputs": [ @@ -165,10 +165,10 @@ "execution_count": 4, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:13.773290Z", - "iopub.status.busy": "2024-11-07T13:04:13.772837Z", - "iopub.status.idle": "2024-11-07T13:04:13.885090Z", - "shell.execute_reply": "2024-11-07T13:04:13.884354Z" + "iopub.execute_input": "2024-11-13T09:18:59.440052Z", + "iopub.status.busy": "2024-11-13T09:18:59.439558Z", + "iopub.status.idle": "2024-11-13T09:18:59.562106Z", + "shell.execute_reply": "2024-11-13T09:18:59.561399Z" } }, "outputs": [ @@ -207,10 +207,10 @@ "execution_count": 5, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:13.887573Z", - "iopub.status.busy": "2024-11-07T13:04:13.887122Z", - "iopub.status.idle": "2024-11-07T13:04:14.091172Z", - "shell.execute_reply": "2024-11-07T13:04:14.090525Z" + "iopub.execute_input": "2024-11-13T09:18:59.564198Z", + "iopub.status.busy": "2024-11-13T09:18:59.563989Z", + "iopub.status.idle": "2024-11-13T09:18:59.767492Z", + "shell.execute_reply": "2024-11-13T09:18:59.766858Z" } }, "outputs": [ @@ -255,10 +255,10 @@ "execution_count": 6, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:14.093492Z", - "iopub.status.busy": "2024-11-07T13:04:14.093073Z", - "iopub.status.idle": "2024-11-07T13:04:14.254757Z", - "shell.execute_reply": "2024-11-07T13:04:14.254038Z" + "iopub.execute_input": "2024-11-13T09:18:59.769589Z", + "iopub.status.busy": "2024-11-13T09:18:59.769358Z", + "iopub.status.idle": "2024-11-13T09:18:59.930467Z", + "shell.execute_reply": "2024-11-13T09:18:59.929837Z" } }, "outputs": [ @@ -303,10 +303,10 @@ "execution_count": 7, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:14.257098Z", - "iopub.status.busy": "2024-11-07T13:04:14.256703Z", - "iopub.status.idle": "2024-11-07T13:04:16.055928Z", - "shell.execute_reply": "2024-11-07T13:04:16.055293Z" + "iopub.execute_input": "2024-11-13T09:18:59.932463Z", + "iopub.status.busy": "2024-11-13T09:18:59.932255Z", + "iopub.status.idle": "2024-11-13T09:19:01.698050Z", + "shell.execute_reply": "2024-11-13T09:19:01.697409Z" } }, "outputs": [ @@ -351,10 +351,10 @@ "execution_count": 8, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:16.058269Z", - "iopub.status.busy": "2024-11-07T13:04:16.057827Z", - "iopub.status.idle": "2024-11-07T13:04:18.274736Z", - "shell.execute_reply": "2024-11-07T13:04:18.274129Z" + "iopub.execute_input": "2024-11-13T09:19:01.700439Z", + "iopub.status.busy": "2024-11-13T09:19:01.699901Z", + "iopub.status.idle": "2024-11-13T09:19:03.934517Z", + "shell.execute_reply": "2024-11-13T09:19:03.933814Z" } }, "outputs": [ diff --git a/.doctrees/nbsphinx/notebooks/nmodl-sympy-solver-derivimplicit.ipynb b/.doctrees/nbsphinx/notebooks/nmodl-sympy-solver-derivimplicit.ipynb index f1e3909f2..45ad8cc3e 100644 --- a/.doctrees/nbsphinx/notebooks/nmodl-sympy-solver-derivimplicit.ipynb +++ b/.doctrees/nbsphinx/notebooks/nmodl-sympy-solver-derivimplicit.ipynb @@ -39,10 +39,10 @@ "execution_count": 1, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:19.973491Z", - "iopub.status.busy": "2024-11-07T13:04:19.972999Z", - "iopub.status.idle": "2024-11-07T13:04:20.781377Z", - "shell.execute_reply": "2024-11-07T13:04:20.780461Z" + "iopub.execute_input": "2024-11-13T09:19:05.643858Z", + "iopub.status.busy": "2024-11-13T09:19:05.643663Z", + "iopub.status.idle": "2024-11-13T09:19:06.455724Z", + "shell.execute_reply": "2024-11-13T09:19:06.454869Z" } }, "outputs": [], @@ -56,10 +56,10 @@ "execution_count": 2, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:20.784363Z", - "iopub.status.busy": "2024-11-07T13:04:20.783935Z", - "iopub.status.idle": "2024-11-07T13:04:20.815294Z", - "shell.execute_reply": "2024-11-07T13:04:20.814637Z" + "iopub.execute_input": "2024-11-13T09:19:06.458122Z", + "iopub.status.busy": "2024-11-13T09:19:06.457907Z", + "iopub.status.idle": "2024-11-13T09:19:06.488537Z", + "shell.execute_reply": "2024-11-13T09:19:06.487921Z" } }, "outputs": [], @@ -100,10 +100,10 @@ "execution_count": 3, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:20.817755Z", - "iopub.status.busy": "2024-11-07T13:04:20.817344Z", - "iopub.status.idle": "2024-11-07T13:04:21.324587Z", - "shell.execute_reply": "2024-11-07T13:04:21.323861Z" + "iopub.execute_input": "2024-11-13T09:19:06.490917Z", + "iopub.status.busy": "2024-11-13T09:19:06.490704Z", + "iopub.status.idle": "2024-11-13T09:19:06.978614Z", + "shell.execute_reply": "2024-11-13T09:19:06.978021Z" } }, "outputs": [ @@ -165,10 +165,10 @@ "execution_count": 4, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:21.326936Z", - "iopub.status.busy": "2024-11-07T13:04:21.326477Z", - "iopub.status.idle": "2024-11-07T13:04:21.628544Z", - "shell.execute_reply": "2024-11-07T13:04:21.627887Z" + "iopub.execute_input": "2024-11-13T09:19:06.981129Z", + "iopub.status.busy": "2024-11-13T09:19:06.980640Z", + "iopub.status.idle": "2024-11-13T09:19:07.277979Z", + "shell.execute_reply": "2024-11-13T09:19:07.277349Z" } }, "outputs": [ diff --git a/.doctrees/nbsphinx/notebooks/nmodl-sympy-solver-sparse.ipynb b/.doctrees/nbsphinx/notebooks/nmodl-sympy-solver-sparse.ipynb index ebfe3ccab..44a1a36dc 100644 --- a/.doctrees/nbsphinx/notebooks/nmodl-sympy-solver-sparse.ipynb +++ b/.doctrees/nbsphinx/notebooks/nmodl-sympy-solver-sparse.ipynb @@ -39,10 +39,10 @@ "execution_count": 1, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:23.117930Z", - "iopub.status.busy": "2024-11-07T13:04:23.117377Z", - "iopub.status.idle": "2024-11-07T13:04:23.932962Z", - "shell.execute_reply": "2024-11-07T13:04:23.932211Z" + "iopub.execute_input": "2024-11-13T09:19:08.562100Z", + "iopub.status.busy": "2024-11-13T09:19:08.561537Z", + "iopub.status.idle": "2024-11-13T09:19:09.359397Z", + "shell.execute_reply": "2024-11-13T09:19:09.358659Z" } }, "outputs": [], @@ -56,10 +56,10 @@ "execution_count": 2, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:23.935538Z", - "iopub.status.busy": "2024-11-07T13:04:23.935309Z", - "iopub.status.idle": "2024-11-07T13:04:23.967999Z", - "shell.execute_reply": "2024-11-07T13:04:23.967314Z" + "iopub.execute_input": "2024-11-13T09:19:09.362012Z", + "iopub.status.busy": "2024-11-13T09:19:09.361592Z", + "iopub.status.idle": "2024-11-13T09:19:09.392401Z", + "shell.execute_reply": "2024-11-13T09:19:09.391637Z" } }, "outputs": [], @@ -100,10 +100,10 @@ "execution_count": 3, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:23.970437Z", - "iopub.status.busy": "2024-11-07T13:04:23.970172Z", - "iopub.status.idle": "2024-11-07T13:04:24.466176Z", - "shell.execute_reply": "2024-11-07T13:04:24.465445Z" + "iopub.execute_input": "2024-11-13T09:19:09.395161Z", + "iopub.status.busy": "2024-11-13T09:19:09.394610Z", + "iopub.status.idle": "2024-11-13T09:19:09.887658Z", + "shell.execute_reply": "2024-11-13T09:19:09.887035Z" } }, "outputs": [ @@ -165,10 +165,10 @@ "execution_count": 4, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:24.468590Z", - "iopub.status.busy": "2024-11-07T13:04:24.468049Z", - "iopub.status.idle": "2024-11-07T13:04:24.766614Z", - "shell.execute_reply": "2024-11-07T13:04:24.765884Z" + "iopub.execute_input": "2024-11-13T09:19:09.889970Z", + "iopub.status.busy": "2024-11-13T09:19:09.889556Z", + "iopub.status.idle": "2024-11-13T09:19:10.188784Z", + "shell.execute_reply": "2024-11-13T09:19:10.188041Z" } }, "outputs": [ diff --git a/doxygen/classnmodl_1_1codegen_1_1_codegen_acc_visitor-members.html b/doxygen/classnmodl_1_1codegen_1_1_codegen_acc_visitor-members.html index 83c9d7fee..e7da51c49 100644 --- a/doxygen/classnmodl_1_1codegen_1_1_codegen_acc_visitor-members.html +++ b/doxygen/classnmodl_1_1codegen_1_1_codegen_acc_visitor-members.html @@ -414,7 +414,7 @@ visit_prime_name(const ast::PrimeName &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual visit_procedure_block(const ast::ProcedureBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual visit_program(const ast::Program &program) overridenmodl::codegen::CodegenCppVisitorvirtual - visit_protect_statement(const ast::ProtectStatement &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual + visit_protect_statement(const ast::ProtectStatement &node) overridenmodl::codegen::CodegenCoreneuronCppVisitorprotectedvirtual visit_random_var(const ast::RandomVar &node) overridenmodl::visitor::ConstAstVisitorvirtual visit_random_var_list(const ast::RandomVarList &node) overridenmodl::visitor::ConstAstVisitorvirtual visit_range(const ast::Range &node) overridenmodl::visitor::ConstAstVisitorvirtual diff --git a/doxygen/classnmodl_1_1codegen_1_1_codegen_acc_visitor.html b/doxygen/classnmodl_1_1codegen_1_1_codegen_acc_visitor.html index cdcc6243b..be60dc46b 100644 --- a/doxygen/classnmodl_1_1codegen_1_1_codegen_acc_visitor.html +++ b/doxygen/classnmodl_1_1codegen_1_1_codegen_acc_visitor.html @@ -235,9 +235,6 @@ virtual bool is_constant_variable (const std::string &name) const  Check if variable is qualified as constant. More...
  -void print_atomic_reduction_pragma () override - Print atomic update pragma for reduction statements. More...
-  virtual void print_global_method_annotation ()  Print backend specific global method annotation. More...
  @@ -495,6 +492,9 @@ void visit_watch_statement (const ast::WatchStatement &node) override  visit node of type ast::WatchStatement More...
  +void visit_protect_statement (const ast::ProtectStatement &node) override + visit node of type ast::ProtectStatement More...
ParamVector functor_params () override  The parameters of the Newton solver "functor". More...
  @@ -774,9 +774,6 @@ void visit_update_dt (const ast::UpdateDt &node) override  visit node of type ast::UpdateDt More...
  -void visit_protect_statement (const ast::ProtectStatement &node) override - visit node of type ast::ProtectStatement More...
-  void visit_mutex_lock (const ast::MutexLock &node) override  visit node of type ast::MutexLock More...
  @@ -1408,7 +1405,7 @@

nmodl::codegen::CodegenCppVisitor.

+

Reimplemented from nmodl::codegen::CodegenCoreneuronCppVisitor.

Definition at line 57 of file codegen_acc_visitor.cpp.

diff --git a/doxygen/classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor-members.html b/doxygen/classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor-members.html index 412aa869c..6b3edba90 100644 --- a/doxygen/classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor-members.html +++ b/doxygen/classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor-members.html @@ -190,7 +190,7 @@ position_of_float_var(const std::string &name) const overridenmodl::codegen::CodegenCoreneuronCppVisitorprotectedvirtual position_of_int_var(const std::string &name) const overridenmodl::codegen::CodegenCoreneuronCppVisitorprotectedvirtual print_abort_routine() constnmodl::codegen::CodegenCoreneuronCppVisitorprotectedvirtual - print_atomic_reduction_pragma() overridenmodl::codegen::CodegenCoreneuronCppVisitorprotectedvirtual + print_atomic_reduction_pragma()nmodl::codegen::CodegenCoreneuronCppVisitorprotectedvirtual print_backend_includes()nmodl::codegen::CodegenCoreneuronCppVisitorprotectedvirtual print_backend_info()nmodl::codegen::CodegenCppVisitorprotected print_before_after_block(const ast::Block *node, size_t block_id)nmodl::codegen::CodegenCoreneuronCppVisitorprotectedvirtual @@ -414,7 +414,7 @@ visit_prime_name(const ast::PrimeName &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual visit_procedure_block(const ast::ProcedureBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual visit_program(const ast::Program &program) overridenmodl::codegen::CodegenCppVisitorvirtual - visit_protect_statement(const ast::ProtectStatement &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual + visit_protect_statement(const ast::ProtectStatement &node) overridenmodl::codegen::CodegenCoreneuronCppVisitorprotectedvirtual visit_random_var(const ast::RandomVar &node) overridenmodl::visitor::ConstAstVisitorvirtual visit_random_var_list(const ast::RandomVarList &node) overridenmodl::visitor::ConstAstVisitorvirtual visit_range(const ast::Range &node) overridenmodl::visitor::ConstAstVisitorvirtual diff --git a/doxygen/classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html b/doxygen/classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html index eba63a465..e2daa5dd6 100644 --- a/doxygen/classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html +++ b/doxygen/classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html @@ -594,9 +594,9 @@ virtual void print_nrn_cur_matrix_shadow_reduction ()  Print the reduction to matrix elements from shadow vectors. More...
  -void print_atomic_reduction_pragma () override - Print atomic update pragma for reduction statements. More...
-  +virtual void print_atomic_reduction_pragma () + Print atomic update pragma for reduction statements. More...
+  virtual void print_global_method_annotation ()  Print backend specific global method annotation. More...
  @@ -887,6 +887,9 @@ void visit_watch_statement (const ast::WatchStatement &node) override  visit node of type ast::WatchStatement More...
  +void visit_protect_statement (const ast::ProtectStatement &node) override + visit node of type ast::ProtectStatement More...
ParamVector functor_params () override  The parameters of the Newton solver "functor". More...
  @@ -1169,9 +1172,6 @@ void visit_update_dt (const ast::UpdateDt &node) override  visit node of type ast::UpdateDt More...
  -void visit_protect_statement (const ast::ProtectStatement &node) override - visit node of type ast::ProtectStatement More...
-  void visit_mutex_lock (const ast::MutexLock &node) override  visit node of type ast::MutexLock More...
  @@ -2335,8 +2335,8 @@

-

◆ print_atomic_reduction_pragma()

+ +

◆ print_atomic_reduction_pragma()

+ +

◆ visit_protect_statement()

+ +
+
+ + + + + +
+ + + + + + + + +
void nmodl::codegen::CodegenCoreneuronCppVisitor::visit_protect_statement (const ast::ProtectStatementnode)
+
+overrideprotectedvirtual
+
+ +

visit node of type ast::ProtectStatement

+ +

Implements nmodl::visitor::ConstVisitor.

+ +

Definition at line 3042 of file codegen_coreneuron_cpp_visitor.cpp.

+
diff --git a/doxygen/classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.js b/doxygen/classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.js index 2b0b6d501..da1004cf2 100644 --- a/doxygen/classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.js +++ b/doxygen/classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.js @@ -29,7 +29,7 @@ var classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor = [ "position_of_float_var", "classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#a9494db3e1dfa2a390f133a9a8b5aa8e0", null ], [ "position_of_int_var", "classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#aeada2d6cff883f8cbd1924f1d9729250", null ], [ "print_abort_routine", "classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#ab87a69ec67fe4d42df3cb0084c99dc85", null ], - [ "print_atomic_reduction_pragma", "classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#a66833aede8ecc336b85129ca1e8b8b2e", null ], + [ "print_atomic_reduction_pragma", "classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#ab21de33c81f273ad3db2d5271221bcdc", null ], [ "print_backend_includes", "classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#abd6be1c541190358a512f0021ea82b16", null ], [ "print_before_after_block", "classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#a9d1748ca9db1665902c25c32a2b458d6", null ], [ "print_check_table_thread_function", "classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#a45b1dc5e371bf956e045d40f19b2470c", null ], @@ -124,6 +124,7 @@ var classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor = [ "simulator_name", "classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#ab13ca7a0bef674739095466ff66f9843", null ], [ "visit_derivimplicit_callback", "classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#a97acfbb75ee033066beb784570ad4a04", null ], [ "visit_for_netcon", "classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#a524be3f8fa4165f983647ed8ebbb9f01", null ], + [ "visit_protect_statement", "classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#affd885d93ced7c0bd58ad023444a4737", null ], [ "visit_verbatim", "classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#ac5b4b072e64caba7ea89e89f0ea0090a", null ], [ "visit_watch_statement", "classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#a8d05784b3300be188775cf2ec9958dc6", null ] ]; \ No newline at end of file diff --git a/doxygen/classnmodl_1_1codegen_1_1_codegen_cpp_visitor-members.html b/doxygen/classnmodl_1_1codegen_1_1_codegen_cpp_visitor-members.html index 3a5100874..61cc7a59d 100644 --- a/doxygen/classnmodl_1_1codegen_1_1_codegen_cpp_visitor-members.html +++ b/doxygen/classnmodl_1_1codegen_1_1_codegen_cpp_visitor-members.html @@ -182,207 +182,206 @@ ParamVector typedefnmodl::codegen::CodegenCppVisitorprotected position_of_float_var(const std::string &name) const =0nmodl::codegen::CodegenCppVisitorprotectedpure virtual position_of_int_var(const std::string &name) const =0nmodl::codegen::CodegenCppVisitorprotectedpure virtual - print_atomic_reduction_pragma()=0nmodl::codegen::CodegenCppVisitorprotectedpure virtual - print_backend_info()nmodl::codegen::CodegenCppVisitorprotected - print_codegen_routines()=0nmodl::codegen::CodegenCppVisitorprotectedpure virtual - print_compute_functions()=0nmodl::codegen::CodegenCppVisitorprotectedpure virtual - print_data_structures(bool print_initializers)=0nmodl::codegen::CodegenCppVisitorprotectedpure virtual - print_eigen_linear_solver(const std::string &float_type, int N)nmodl::codegen::CodegenCppVisitorprotected - print_fast_imem_calculation()=0nmodl::codegen::CodegenCppVisitorprotectedpure virtual - print_function(const ast::FunctionBlock &node)nmodl::codegen::CodegenCppVisitorprotected - print_function_call(const ast::FunctionCall &node)nmodl::codegen::CodegenCppVisitorprotectedvirtual - print_function_declaration(const T &node, const std::string &name, const std::unordered_set< CppObjectSpecifier > &={CppObjectSpecifier::Static, CppObjectSpecifier::Inline})nmodl::codegen::CodegenCppVisitorprotected - print_function_or_procedure(const ast::Block &node, const std::string &name, const std::unordered_set< CppObjectSpecifier > &specifiers)=0nmodl::codegen::CodegenCppVisitorprotectedpure virtual - print_function_procedure_helper(const ast::Block &node)=0nmodl::codegen::CodegenCppVisitorprotectedpure virtual - print_function_prototypes()=0nmodl::codegen::CodegenCppVisitorprotectedpure virtual - print_function_table_call(const ast::FunctionCall &node)=0nmodl::codegen::CodegenCppVisitorprotectedpure virtual - print_function_tables(const ast::FunctionTableBlock &node)nmodl::codegen::CodegenCppVisitorprotected - print_functor_definition(const ast::EigenNewtonSolverBlock &node)nmodl::codegen::CodegenCppVisitorprotected - print_functors_definitions()nmodl::codegen::CodegenCppVisitorprotected - print_g_unused() const =0nmodl::codegen::CodegenCppVisitorprotectedpure virtual - print_global_function_common_code(BlockType type, const std::string &function_name="")=0nmodl::codegen::CodegenCppVisitorprotectedpure virtual - print_global_struct_function_table_ptrs()nmodl::codegen::CodegenCppVisitorprotectedvirtual - print_global_var_struct_assertions() constnmodl::codegen::CodegenCppVisitorprotectedvirtual - print_global_var_struct_decl()nmodl::codegen::CodegenCppVisitorprotectedvirtual - print_global_variables_for_hoc()=0nmodl::codegen::CodegenCppVisitorprotectedpure virtual - print_headers_include()=0nmodl::codegen::CodegenCppVisitorprotectedpure virtual - print_ion_variable()=0nmodl::codegen::CodegenCppVisitorprotectedpure virtual - print_mechanism_global_var_structure(bool print_initializers)=0nmodl::codegen::CodegenCppVisitorprotectedpure virtual - print_mechanism_info()nmodl::codegen::CodegenCppVisitorprotected - print_mechanism_range_var_structure(bool print_initializers)=0nmodl::codegen::CodegenCppVisitorprotectedpure virtual - print_mechanism_register()=0nmodl::codegen::CodegenCppVisitorprotectedpure virtual - print_namespace_start()nmodl::codegen::CodegenCppVisitorprotected - print_namespace_stop()nmodl::codegen::CodegenCppVisitorprotected - print_net_event_call(const ast::FunctionCall &node)=0nmodl::codegen::CodegenCppVisitorprotectedpure virtual - print_net_move_call(const ast::FunctionCall &node)=0nmodl::codegen::CodegenCppVisitorprotectedpure virtual - print_net_send_call(const ast::FunctionCall &node)=0nmodl::codegen::CodegenCppVisitorprotectedpure virtual - print_nmodl_constants()nmodl::codegen::CodegenCppVisitorprotected - print_nrn_alloc()=0nmodl::codegen::CodegenCppVisitorprotectedpure virtual - print_nrn_constructor()=0nmodl::codegen::CodegenCppVisitorprotectedpure virtual - print_nrn_cur()=0nmodl::codegen::CodegenCppVisitorprotectedpure virtual - print_nrn_cur_conductance_kernel(const ast::BreakpointBlock &node)=0nmodl::codegen::CodegenCppVisitorprotectedpure virtual - print_nrn_cur_kernel(const ast::BreakpointBlock &node)=0nmodl::codegen::CodegenCppVisitorprotectedpure virtual - print_nrn_cur_non_conductance_kernel()=0nmodl::codegen::CodegenCppVisitorprotectedpure virtual - print_nrn_current(const ast::BreakpointBlock &node)=0nmodl::codegen::CodegenCppVisitorprotectedpure virtual - print_nrn_destructor()=0nmodl::codegen::CodegenCppVisitorprotectedpure virtual - print_nrn_pointing(const ast::FunctionCall &node)nmodl::codegen::CodegenCppVisitorprotectedvirtual - print_nrn_state()=0nmodl::codegen::CodegenCppVisitorprotectedpure virtual - print_parallel_iteration_hint(BlockType type, const ast::Block *block)nmodl::codegen::CodegenCppVisitorprotectedvirtual - print_prcellstate_macros() constnmodl::codegen::CodegenCppVisitorprotected - print_procedure(const ast::ProcedureBlock &node)nmodl::codegen::CodegenCppVisitorprotected - print_rename_state_vars() constnmodl::codegen::CodegenCppVisitorprotected - print_sdlists_init(bool print_initializers)=0nmodl::codegen::CodegenCppVisitorprotectedpure virtual - print_standard_includes()=0nmodl::codegen::CodegenCppVisitorprotectedpure virtual - print_statement_block(const ast::StatementBlock &node, bool open_brace=true, bool close_brace=true)nmodl::codegen::CodegenCppVisitorprotected - print_table_check_function(const ast::Block &)nmodl::codegen::CodegenCppVisitorprotected - print_table_replacement_function(const ast::Block &)nmodl::codegen::CodegenCppVisitorprotected - print_top_verbatim_blocks()nmodl::codegen::CodegenCppVisitorprotected - print_using_namespace()nmodl::codegen::CodegenCppVisitorprotected - print_v_unused() const =0nmodl::codegen::CodegenCppVisitorprotectedpure virtual - print_vector_elements(const std::vector< T > &elements, const std::string &separator, const std::string &prefix="")nmodl::codegen::CodegenCppVisitorprotected - printernmodl::codegen::CodegenCppVisitorprotected - printing_net_initnmodl::codegen::CodegenCppVisitorprotected - printing_net_receivenmodl::codegen::CodegenCppVisitorprotected - printing_top_verbatim_blocksnmodl::codegen::CodegenCppVisitorprotected - process_shadow_update_statement(const ShadowUseStatement &statement, BlockType type)nmodl::codegen::CodegenCppVisitorprotected - program_symtabnmodl::codegen::CodegenCppVisitorprotected - range_variable_setup_required() const noexceptnmodl::codegen::CodegenCppVisitorprotected - read_ion_variable_name(const std::string &name)nmodl::codegen::CodegenCppVisitorprotectedstatic - register_mechanism_arguments() const =0nmodl::codegen::CodegenCppVisitorprotectedpure virtual - setup(const ast::Program &node)nmodl::codegen::CodegenCppVisitorprotectedvirtual - simulator_name()=0nmodl::codegen::CodegenCppVisitorprotectedpure virtual - statement_to_skip(const ast::Statement &node)nmodl::codegen::CodegenCppVisitorprotectedstatic - SymbolType typedefnmodl::codegen::CodegenCppVisitorprotected - table_update_function_name(const std::string &block_name) constnmodl::codegen::CodegenCppVisitorprotected - thread_variables_struct() constnmodl::codegen::CodegenCppVisitorinlineprotected - update_if_ion_variable_name(const std::string &name) constnmodl::codegen::CodegenCppVisitorprotected - update_index_semantics()nmodl::codegen::CodegenCppVisitorprotected - visit_after_block(const ast::AfterBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_argument(const ast::Argument &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_assigned_block(const ast::AssignedBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_assigned_definition(const ast::AssignedDefinition &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_ba_block(const ast::BABlock &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_ba_block_type(const ast::BABlockType &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_bbcore_pointer(const ast::BbcorePointer &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_bbcore_pointer_var(const ast::BbcorePointerVar &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_before_block(const ast::BeforeBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_binary_expression(const ast::BinaryExpression &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual - visit_binary_operator(const ast::BinaryOperator &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual - visit_block(const ast::Block &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_block_comment(const ast::BlockComment &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_boolean(const ast::Boolean &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual - visit_breakpoint_block(const ast::BreakpointBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_compartment(const ast::Compartment &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_conductance_hint(const ast::ConductanceHint &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_conserve(const ast::Conserve &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_constant_block(const ast::ConstantBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_constant_statement(const ast::ConstantStatement &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_constant_var(const ast::ConstantVar &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_constructor_block(const ast::ConstructorBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_cvode_block(const ast::CvodeBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_define(const ast::Define &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_derivative_block(const ast::DerivativeBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_derivimplicit_callback(const ast::DerivimplicitCallback &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_destructor_block(const ast::DestructorBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_diff_eq_expression(const ast::DiffEqExpression &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_discrete_block(const ast::DiscreteBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_double(const ast::Double &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual - visit_double_unit(const ast::DoubleUnit &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_eigen_linear_solver_block(const ast::EigenLinearSolverBlock &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual - visit_eigen_newton_solver_block(const ast::EigenNewtonSolverBlock &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual - visit_electrode_cur_var(const ast::ElectrodeCurVar &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_electrode_current(const ast::ElectrodeCurrent &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_else_if_statement(const ast::ElseIfStatement &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual - visit_else_statement(const ast::ElseStatement &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual - visit_expression(const ast::Expression &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_expression_statement(const ast::ExpressionStatement &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_extern_var(const ast::ExternVar &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_external(const ast::External &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_factor_def(const ast::FactorDef &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_float(const ast::Float &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual - visit_for_netcon(const ast::ForNetcon &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_from_statement(const ast::FromStatement &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual - visit_function_block(const ast::FunctionBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_function_call(const ast::FunctionCall &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual - visit_function_table_block(const ast::FunctionTableBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_global(const ast::Global &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_global_var(const ast::GlobalVar &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_identifier(const ast::Identifier &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_if_statement(const ast::IfStatement &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual - visit_include(const ast::Include &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_independent_block(const ast::IndependentBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_indexed_name(const ast::IndexedName &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual - visit_initial_block(const ast::InitialBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_integer(const ast::Integer &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual - visit_kinetic_block(const ast::KineticBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_lag_statement(const ast::LagStatement &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_limits(const ast::Limits &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_lin_equation(const ast::LinEquation &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_line_comment(const ast::LineComment &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_linear_block(const ast::LinearBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_local_list_statement(const ast::LocalListStatement &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual - visit_local_var(const ast::LocalVar &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_lon_diffuse(const ast::LonDiffuse &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_longitudinal_diffusion_block(const ast::LongitudinalDiffusionBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_model(const ast::Model &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_mutex_lock(const ast::MutexLock &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual - visit_mutex_unlock(const ast::MutexUnlock &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual - visit_name(const ast::Name &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual - visit_net_receive_block(const ast::NetReceiveBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_neuron_block(const ast::NeuronBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_node(const ast::Node &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_non_lin_equation(const ast::NonLinEquation &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_non_linear_block(const ast::NonLinearBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_nonspecific(const ast::Nonspecific &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_nonspecific_cur_var(const ast::NonspecificCurVar &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_nrn_state_block(const ast::NrnStateBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_number(const ast::Number &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_number_range(const ast::NumberRange &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_ontology_statement(const ast::OntologyStatement &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_param_assign(const ast::ParamAssign &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_param_block(const ast::ParamBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_paren_expression(const ast::ParenExpression &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual - visit_pointer(const ast::Pointer &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_pointer_var(const ast::PointerVar &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_prime_name(const ast::PrimeName &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual - visit_procedure_block(const ast::ProcedureBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_program(const ast::Program &program) overridenmodl::codegen::CodegenCppVisitorvirtual - visit_protect_statement(const ast::ProtectStatement &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual - visit_random_var(const ast::RandomVar &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_random_var_list(const ast::RandomVarList &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_range(const ast::Range &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_range_var(const ast::RangeVar &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_react_var_name(const ast::ReactVarName &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_reaction_operator(const ast::ReactionOperator &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_reaction_statement(const ast::ReactionStatement &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_read_ion_var(const ast::ReadIonVar &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_solution_expression(const ast::SolutionExpression &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual - visit_solve_block(const ast::SolveBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_state_block(const ast::StateBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_statement(const ast::Statement &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_statement_block(const ast::StatementBlock &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual - visit_string(const ast::String &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual - visit_suffix(const ast::Suffix &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_table_statement(const ast::TableStatement &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_thread_safe(const ast::ThreadSafe &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_unary_expression(const ast::UnaryExpression &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_unary_operator(const ast::UnaryOperator &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual - visit_unit(const ast::Unit &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual - visit_unit_block(const ast::UnitBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_unit_def(const ast::UnitDef &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_unit_state(const ast::UnitState &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_update_dt(const ast::UpdateDt &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual - visit_useion(const ast::Useion &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_valence(const ast::Valence &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_var_name(const ast::VarName &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual - visit_verbatim(const ast::Verbatim &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_watch(const ast::Watch &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_watch_statement(const ast::WatchStatement &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_while_statement(const ast::WhileStatement &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual - visit_wrapped_expression(const ast::WrappedExpression &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_write_ion_var(const ast::WriteIonVar &node) overridenmodl::visitor::ConstAstVisitorvirtual - write_ion_variable_name(const std::string &name)nmodl::codegen::CodegenCppVisitorprotectedstatic - ~ConstVisitor()=defaultnmodl::visitor::ConstVisitorvirtual + print_backend_info()nmodl::codegen::CodegenCppVisitorprotected + print_codegen_routines()=0nmodl::codegen::CodegenCppVisitorprotectedpure virtual + print_compute_functions()=0nmodl::codegen::CodegenCppVisitorprotectedpure virtual + print_data_structures(bool print_initializers)=0nmodl::codegen::CodegenCppVisitorprotectedpure virtual + print_eigen_linear_solver(const std::string &float_type, int N)nmodl::codegen::CodegenCppVisitorprotected + print_fast_imem_calculation()=0nmodl::codegen::CodegenCppVisitorprotectedpure virtual + print_function(const ast::FunctionBlock &node)nmodl::codegen::CodegenCppVisitorprotected + print_function_call(const ast::FunctionCall &node)nmodl::codegen::CodegenCppVisitorprotectedvirtual + print_function_declaration(const T &node, const std::string &name, const std::unordered_set< CppObjectSpecifier > &={CppObjectSpecifier::Static, CppObjectSpecifier::Inline})nmodl::codegen::CodegenCppVisitorprotected + print_function_or_procedure(const ast::Block &node, const std::string &name, const std::unordered_set< CppObjectSpecifier > &specifiers)=0nmodl::codegen::CodegenCppVisitorprotectedpure virtual + print_function_procedure_helper(const ast::Block &node)=0nmodl::codegen::CodegenCppVisitorprotectedpure virtual + print_function_prototypes()=0nmodl::codegen::CodegenCppVisitorprotectedpure virtual + print_function_table_call(const ast::FunctionCall &node)=0nmodl::codegen::CodegenCppVisitorprotectedpure virtual + print_function_tables(const ast::FunctionTableBlock &node)nmodl::codegen::CodegenCppVisitorprotected + print_functor_definition(const ast::EigenNewtonSolverBlock &node)nmodl::codegen::CodegenCppVisitorprotected + print_functors_definitions()nmodl::codegen::CodegenCppVisitorprotected + print_g_unused() const =0nmodl::codegen::CodegenCppVisitorprotectedpure virtual + print_global_function_common_code(BlockType type, const std::string &function_name="")=0nmodl::codegen::CodegenCppVisitorprotectedpure virtual + print_global_struct_function_table_ptrs()nmodl::codegen::CodegenCppVisitorprotectedvirtual + print_global_var_struct_assertions() constnmodl::codegen::CodegenCppVisitorprotectedvirtual + print_global_var_struct_decl()nmodl::codegen::CodegenCppVisitorprotectedvirtual + print_global_variables_for_hoc()=0nmodl::codegen::CodegenCppVisitorprotectedpure virtual + print_headers_include()=0nmodl::codegen::CodegenCppVisitorprotectedpure virtual + print_ion_variable()=0nmodl::codegen::CodegenCppVisitorprotectedpure virtual + print_mechanism_global_var_structure(bool print_initializers)=0nmodl::codegen::CodegenCppVisitorprotectedpure virtual + print_mechanism_info()nmodl::codegen::CodegenCppVisitorprotected + print_mechanism_range_var_structure(bool print_initializers)=0nmodl::codegen::CodegenCppVisitorprotectedpure virtual + print_mechanism_register()=0nmodl::codegen::CodegenCppVisitorprotectedpure virtual + print_namespace_start()nmodl::codegen::CodegenCppVisitorprotected + print_namespace_stop()nmodl::codegen::CodegenCppVisitorprotected + print_net_event_call(const ast::FunctionCall &node)=0nmodl::codegen::CodegenCppVisitorprotectedpure virtual + print_net_move_call(const ast::FunctionCall &node)=0nmodl::codegen::CodegenCppVisitorprotectedpure virtual + print_net_send_call(const ast::FunctionCall &node)=0nmodl::codegen::CodegenCppVisitorprotectedpure virtual + print_nmodl_constants()nmodl::codegen::CodegenCppVisitorprotected + print_nrn_alloc()=0nmodl::codegen::CodegenCppVisitorprotectedpure virtual + print_nrn_constructor()=0nmodl::codegen::CodegenCppVisitorprotectedpure virtual + print_nrn_cur()=0nmodl::codegen::CodegenCppVisitorprotectedpure virtual + print_nrn_cur_conductance_kernel(const ast::BreakpointBlock &node)=0nmodl::codegen::CodegenCppVisitorprotectedpure virtual + print_nrn_cur_kernel(const ast::BreakpointBlock &node)=0nmodl::codegen::CodegenCppVisitorprotectedpure virtual + print_nrn_cur_non_conductance_kernel()=0nmodl::codegen::CodegenCppVisitorprotectedpure virtual + print_nrn_current(const ast::BreakpointBlock &node)=0nmodl::codegen::CodegenCppVisitorprotectedpure virtual + print_nrn_destructor()=0nmodl::codegen::CodegenCppVisitorprotectedpure virtual + print_nrn_pointing(const ast::FunctionCall &node)nmodl::codegen::CodegenCppVisitorprotectedvirtual + print_nrn_state()=0nmodl::codegen::CodegenCppVisitorprotectedpure virtual + print_parallel_iteration_hint(BlockType type, const ast::Block *block)nmodl::codegen::CodegenCppVisitorprotectedvirtual + print_prcellstate_macros() constnmodl::codegen::CodegenCppVisitorprotected + print_procedure(const ast::ProcedureBlock &node)nmodl::codegen::CodegenCppVisitorprotected + print_rename_state_vars() constnmodl::codegen::CodegenCppVisitorprotected + print_sdlists_init(bool print_initializers)=0nmodl::codegen::CodegenCppVisitorprotectedpure virtual + print_standard_includes()=0nmodl::codegen::CodegenCppVisitorprotectedpure virtual + print_statement_block(const ast::StatementBlock &node, bool open_brace=true, bool close_brace=true)nmodl::codegen::CodegenCppVisitorprotected + print_table_check_function(const ast::Block &)nmodl::codegen::CodegenCppVisitorprotected + print_table_replacement_function(const ast::Block &)nmodl::codegen::CodegenCppVisitorprotected + print_top_verbatim_blocks()nmodl::codegen::CodegenCppVisitorprotected + print_using_namespace()nmodl::codegen::CodegenCppVisitorprotected + print_v_unused() const =0nmodl::codegen::CodegenCppVisitorprotectedpure virtual + print_vector_elements(const std::vector< T > &elements, const std::string &separator, const std::string &prefix="")nmodl::codegen::CodegenCppVisitorprotected + printernmodl::codegen::CodegenCppVisitorprotected + printing_net_initnmodl::codegen::CodegenCppVisitorprotected + printing_net_receivenmodl::codegen::CodegenCppVisitorprotected + printing_top_verbatim_blocksnmodl::codegen::CodegenCppVisitorprotected + process_shadow_update_statement(const ShadowUseStatement &statement, BlockType type)nmodl::codegen::CodegenCppVisitorprotected + program_symtabnmodl::codegen::CodegenCppVisitorprotected + range_variable_setup_required() const noexceptnmodl::codegen::CodegenCppVisitorprotected + read_ion_variable_name(const std::string &name)nmodl::codegen::CodegenCppVisitorprotectedstatic + register_mechanism_arguments() const =0nmodl::codegen::CodegenCppVisitorprotectedpure virtual + setup(const ast::Program &node)nmodl::codegen::CodegenCppVisitorprotectedvirtual + simulator_name()=0nmodl::codegen::CodegenCppVisitorprotectedpure virtual + statement_to_skip(const ast::Statement &node)nmodl::codegen::CodegenCppVisitorprotectedstatic + SymbolType typedefnmodl::codegen::CodegenCppVisitorprotected + table_update_function_name(const std::string &block_name) constnmodl::codegen::CodegenCppVisitorprotected + thread_variables_struct() constnmodl::codegen::CodegenCppVisitorinlineprotected + update_if_ion_variable_name(const std::string &name) constnmodl::codegen::CodegenCppVisitorprotected + update_index_semantics()nmodl::codegen::CodegenCppVisitorprotected + visit_after_block(const ast::AfterBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_argument(const ast::Argument &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_assigned_block(const ast::AssignedBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_assigned_definition(const ast::AssignedDefinition &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_ba_block(const ast::BABlock &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_ba_block_type(const ast::BABlockType &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_bbcore_pointer(const ast::BbcorePointer &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_bbcore_pointer_var(const ast::BbcorePointerVar &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_before_block(const ast::BeforeBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_binary_expression(const ast::BinaryExpression &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual + visit_binary_operator(const ast::BinaryOperator &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual + visit_block(const ast::Block &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_block_comment(const ast::BlockComment &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_boolean(const ast::Boolean &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual + visit_breakpoint_block(const ast::BreakpointBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_compartment(const ast::Compartment &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_conductance_hint(const ast::ConductanceHint &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_conserve(const ast::Conserve &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_constant_block(const ast::ConstantBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_constant_statement(const ast::ConstantStatement &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_constant_var(const ast::ConstantVar &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_constructor_block(const ast::ConstructorBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_cvode_block(const ast::CvodeBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_define(const ast::Define &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_derivative_block(const ast::DerivativeBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_derivimplicit_callback(const ast::DerivimplicitCallback &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_destructor_block(const ast::DestructorBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_diff_eq_expression(const ast::DiffEqExpression &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_discrete_block(const ast::DiscreteBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_double(const ast::Double &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual + visit_double_unit(const ast::DoubleUnit &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_eigen_linear_solver_block(const ast::EigenLinearSolverBlock &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual + visit_eigen_newton_solver_block(const ast::EigenNewtonSolverBlock &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual + visit_electrode_cur_var(const ast::ElectrodeCurVar &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_electrode_current(const ast::ElectrodeCurrent &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_else_if_statement(const ast::ElseIfStatement &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual + visit_else_statement(const ast::ElseStatement &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual + visit_expression(const ast::Expression &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_expression_statement(const ast::ExpressionStatement &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_extern_var(const ast::ExternVar &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_external(const ast::External &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_factor_def(const ast::FactorDef &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_float(const ast::Float &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual + visit_for_netcon(const ast::ForNetcon &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_from_statement(const ast::FromStatement &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual + visit_function_block(const ast::FunctionBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_function_call(const ast::FunctionCall &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual + visit_function_table_block(const ast::FunctionTableBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_global(const ast::Global &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_global_var(const ast::GlobalVar &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_identifier(const ast::Identifier &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_if_statement(const ast::IfStatement &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual + visit_include(const ast::Include &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_independent_block(const ast::IndependentBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_indexed_name(const ast::IndexedName &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual + visit_initial_block(const ast::InitialBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_integer(const ast::Integer &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual + visit_kinetic_block(const ast::KineticBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_lag_statement(const ast::LagStatement &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_limits(const ast::Limits &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_lin_equation(const ast::LinEquation &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_line_comment(const ast::LineComment &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_linear_block(const ast::LinearBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_local_list_statement(const ast::LocalListStatement &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual + visit_local_var(const ast::LocalVar &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_lon_diffuse(const ast::LonDiffuse &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_longitudinal_diffusion_block(const ast::LongitudinalDiffusionBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_model(const ast::Model &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_mutex_lock(const ast::MutexLock &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual + visit_mutex_unlock(const ast::MutexUnlock &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual + visit_name(const ast::Name &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual + visit_net_receive_block(const ast::NetReceiveBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_neuron_block(const ast::NeuronBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_node(const ast::Node &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_non_lin_equation(const ast::NonLinEquation &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_non_linear_block(const ast::NonLinearBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_nonspecific(const ast::Nonspecific &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_nonspecific_cur_var(const ast::NonspecificCurVar &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_nrn_state_block(const ast::NrnStateBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_number(const ast::Number &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_number_range(const ast::NumberRange &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_ontology_statement(const ast::OntologyStatement &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_param_assign(const ast::ParamAssign &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_param_block(const ast::ParamBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_paren_expression(const ast::ParenExpression &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual + visit_pointer(const ast::Pointer &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_pointer_var(const ast::PointerVar &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_prime_name(const ast::PrimeName &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual + visit_procedure_block(const ast::ProcedureBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_program(const ast::Program &program) overridenmodl::codegen::CodegenCppVisitorvirtual + visit_protect_statement(const ast::ProtectStatement &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_random_var(const ast::RandomVar &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_random_var_list(const ast::RandomVarList &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_range(const ast::Range &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_range_var(const ast::RangeVar &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_react_var_name(const ast::ReactVarName &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_reaction_operator(const ast::ReactionOperator &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_reaction_statement(const ast::ReactionStatement &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_read_ion_var(const ast::ReadIonVar &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_solution_expression(const ast::SolutionExpression &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual + visit_solve_block(const ast::SolveBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_state_block(const ast::StateBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_statement(const ast::Statement &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_statement_block(const ast::StatementBlock &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual + visit_string(const ast::String &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual + visit_suffix(const ast::Suffix &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_table_statement(const ast::TableStatement &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_thread_safe(const ast::ThreadSafe &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_unary_expression(const ast::UnaryExpression &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_unary_operator(const ast::UnaryOperator &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual + visit_unit(const ast::Unit &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual + visit_unit_block(const ast::UnitBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_unit_def(const ast::UnitDef &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_unit_state(const ast::UnitState &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_update_dt(const ast::UpdateDt &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual + visit_useion(const ast::Useion &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_valence(const ast::Valence &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_var_name(const ast::VarName &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual + visit_verbatim(const ast::Verbatim &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_watch(const ast::Watch &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_watch_statement(const ast::WatchStatement &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_while_statement(const ast::WhileStatement &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual + visit_wrapped_expression(const ast::WrappedExpression &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_write_ion_var(const ast::WriteIonVar &node) overridenmodl::visitor::ConstAstVisitorvirtual + write_ion_variable_name(const std::string &name)nmodl::codegen::CodegenCppVisitorprotectedstatic + ~ConstVisitor()=defaultnmodl::visitor::ConstVisitorvirtual diff --git a/doxygen/classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html b/doxygen/classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html index 1196722c0..596362f14 100644 --- a/doxygen/classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html +++ b/doxygen/classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html @@ -665,9 +665,6 @@ virtual void print_parallel_iteration_hint (BlockType type, const ast::Block *block)  Print pragma annotations for channel iterations. More...
  -virtual void print_atomic_reduction_pragma ()=0 - Print atomic update pragma for reduction statements. More...
-  virtual void print_global_var_struct_decl ()  Instantiate global var instance. More...
  @@ -964,9 +961,6 @@ void visit_update_dt (const ast::UpdateDt &node) override  visit node of type ast::UpdateDt More...
  -void visit_protect_statement (const ast::ProtectStatement &node) override - visit node of type ast::ProtectStatement More...
-  void visit_mutex_lock (const ast::MutexLock &node) override  visit node of type ast::MutexLock More...
  @@ -1304,7 +1298,7 @@

Returns
The same string with double-quotes pre- and postfixed
-

Definition at line 1054 of file codegen_cpp_visitor.hpp.

+

Definition at line 1048 of file codegen_cpp_visitor.hpp.

@@ -1546,7 +1540,7 @@

Returns
return a tuple <true, array_length> if variable is an array otherwise <false, 0>
-

Definition at line 1753 of file codegen_cpp_visitor.cpp.

+

Definition at line 1745 of file codegen_cpp_visitor.cpp.

@@ -1574,7 +1568,7 @@

-

Definition at line 1493 of file codegen_cpp_visitor.cpp.

+

Definition at line 1485 of file codegen_cpp_visitor.cpp.

@@ -2074,7 +2068,7 @@

Returns
A vector of float variables
-

Definition at line 1275 of file codegen_cpp_visitor.cpp.

+

Definition at line 1267 of file codegen_cpp_visitor.cpp.

@@ -2148,7 +2142,7 @@

Note
Variables for watch statements : there is one extra variable used in coreneuron compared to actual watch statements for compatibility with neuron (which uses one extra Datum variable)
-

Definition at line 1351 of file codegen_cpp_visitor.cpp.

+

Definition at line 1343 of file codegen_cpp_visitor.cpp.

@@ -2176,7 +2170,7 @@

-

Definition at line 1727 of file codegen_cpp_visitor.cpp.

+

Definition at line 1719 of file codegen_cpp_visitor.cpp.

@@ -2242,7 +2236,7 @@

-

Definition at line 1740 of file codegen_cpp_visitor.cpp.

+

Definition at line 1732 of file codegen_cpp_visitor.cpp.

@@ -3050,7 +3044,7 @@

Returns
A symbol based on the given name
-

Definition at line 1081 of file codegen_cpp_visitor.hpp.

+

Definition at line 1075 of file codegen_cpp_visitor.hpp.

@@ -3087,7 +3081,7 @@

Returns
The name of the function or procedure postfixed with the model name
-

Definition at line 1064 of file codegen_cpp_visitor.hpp.

+

Definition at line 1058 of file codegen_cpp_visitor.hpp.

@@ -3635,35 +3629,6 @@

nmodl::codegen::CodegenNeuronCppVisitor, and nmodl::codegen::CodegenCoreneuronCppVisitor.

- - - -

◆ print_atomic_reduction_pragma()

- -
-
- - - - - -
- - - - - - - -
virtual void nmodl::codegen::CodegenCppVisitor::print_atomic_reduction_pragma ()
-
-protectedpure virtual
-
- -

Print atomic update pragma for reduction statements.

- -

Implemented in nmodl::codegen::CodegenCoreneuronCppVisitor, nmodl::codegen::CodegenNeuronCppVisitor, and nmodl::codegen::CodegenAccVisitor.

-
@@ -5213,7 +5178,7 @@

-

Definition at line 1767 of file codegen_cpp_visitor.cpp.

+

Definition at line 1759 of file codegen_cpp_visitor.cpp.

@@ -5362,7 +5327,7 @@

Definition at line 1631 of file codegen_cpp_visitor.cpp.

+

Definition at line 1623 of file codegen_cpp_visitor.cpp.

@@ -5398,7 +5363,7 @@

Definition at line 1522 of file codegen_cpp_visitor.cpp.

+

Definition at line 1514 of file codegen_cpp_visitor.cpp.

@@ -5662,7 +5627,7 @@

-

Definition at line 1465 of file codegen_cpp_visitor.cpp.

+

Definition at line 1457 of file codegen_cpp_visitor.cpp.

@@ -5860,7 +5825,7 @@

Definition at line 1199 of file codegen_cpp_visitor.cpp.

+

Definition at line 1191 of file codegen_cpp_visitor.cpp.

@@ -6020,7 +5985,7 @@

nmodl::visitor::ConstVisitor.

-

Definition at line 1169 of file codegen_cpp_visitor.cpp.

+

Definition at line 1161 of file codegen_cpp_visitor.cpp.

@@ -6052,7 +6017,7 @@

nmodl::visitor::ConstVisitor.

-

Definition at line 1140 of file codegen_cpp_visitor.cpp.

+

Definition at line 1132 of file codegen_cpp_visitor.cpp.

@@ -6372,7 +6337,7 @@

nmodl::visitor::ConstVisitor.

-

Definition at line 1117 of file codegen_cpp_visitor.cpp.

+

Definition at line 1109 of file codegen_cpp_visitor.cpp.

@@ -6404,7 +6369,7 @@

nmodl::visitor::ConstVisitor.

-

Definition at line 1124 of file codegen_cpp_visitor.cpp.

+

Definition at line 1116 of file codegen_cpp_visitor.cpp.

@@ -6538,39 +6503,7 @@

nmodl::visitor::ConstVisitor.

-

Definition at line 1516 of file codegen_cpp_visitor.cpp.

- - - - -

◆ visit_protect_statement()

- -
-
- - - - - -
- - - - - - - - -
void nmodl::codegen::CodegenCppVisitor::visit_protect_statement (const ast::ProtectStatementnode)
-
-overrideprotectedvirtual
-
- -

visit node of type ast::ProtectStatement

- -

Implements nmodl::visitor::ConstVisitor.

- -

Definition at line 1109 of file codegen_cpp_visitor.cpp.

+

Definition at line 1508 of file codegen_cpp_visitor.cpp.

@@ -6602,7 +6535,7 @@

nmodl::visitor::ConstVisitor.

-

Definition at line 1129 of file codegen_cpp_visitor.cpp.

+

Definition at line 1121 of file codegen_cpp_visitor.cpp.

@@ -7158,7 +7091,7 @@

{CppObjectSpecifier::ThreadLocal, "thread_local"}, -

Definition at line 1428 of file codegen_cpp_visitor.hpp.

+

Definition at line 1422 of file codegen_cpp_visitor.hpp.

diff --git a/doxygen/classnmodl_1_1codegen_1_1_codegen_cpp_visitor.js b/doxygen/classnmodl_1_1codegen_1_1_codegen_cpp_visitor.js index 895049d67..b4cfb38c3 100644 --- a/doxygen/classnmodl_1_1codegen_1_1_codegen_cpp_visitor.js +++ b/doxygen/classnmodl_1_1codegen_1_1_codegen_cpp_visitor.js @@ -74,7 +74,6 @@ var classnmodl_1_1codegen_1_1_codegen_cpp_visitor = [ "optimize_ion_variable_copies", "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a81cded985b616728b55976bf7eca4488", null ], [ "position_of_float_var", "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a3ef901c89d40124058a0df268b4f8101", null ], [ "position_of_int_var", "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#aaa6dae67e44cbd29e86e10b270249bed", null ], - [ "print_atomic_reduction_pragma", "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a92bfb8a4daec705014f8e871fb0feacb", null ], [ "print_backend_info", "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#afc26a2583e8b283deae9944939788f79", null ], [ "print_codegen_routines", "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a20666add7b3f75937954a038c51f5b55", null ], [ "print_compute_functions", "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a407af2b73f564d5db79381b5b2699c97", null ], @@ -164,7 +163,6 @@ var classnmodl_1_1codegen_1_1_codegen_cpp_visitor = [ "visit_paren_expression", "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a96932dfa1cc61d6eeb2d650e707ecf20", null ], [ "visit_prime_name", "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a0c937b0ca36a6489bbc6630db5df0cf5", null ], [ "visit_program", "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a491e418920668f8fce331c65e8b48a02", null ], - [ "visit_protect_statement", "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a946c6fc559c23573210285ed47e28570", null ], [ "visit_solution_expression", "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a40bc1308f847c66bc91d9c93368db6ec", null ], [ "visit_statement_block", "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a8eb67dab884cc678e541ff5cc77b5e03", null ], [ "visit_string", "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a502fd875dc95e68f905fe2070abaeff8", null ], diff --git a/doxygen/classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor-members.html b/doxygen/classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor-members.html index aec5e65b5..ac4012bb1 100644 --- a/doxygen/classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor-members.html +++ b/doxygen/classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor-members.html @@ -197,256 +197,255 @@ ParamVector typedefnmodl::codegen::CodegenCppVisitorprotected position_of_float_var(const std::string &name) const overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual position_of_int_var(const std::string &name) const overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual - print_atomic_reduction_pragma() overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual - print_backend_info()nmodl::codegen::CodegenCppVisitorprotected - print_check_table_entrypoint()nmodl::codegen::CodegenNeuronCppVisitorprotected - print_codegen_routines() overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual - print_codegen_routines_nothing()nmodl::codegen::CodegenNeuronCppVisitorprotected - print_codegen_routines_regular()nmodl::codegen::CodegenNeuronCppVisitorprotected - print_compute_functions() overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual - print_cvode_count()nmodl::codegen::CodegenNeuronCppVisitorprotected - print_cvode_definitions()nmodl::codegen::CodegenNeuronCppVisitorprotected - print_cvode_setup(const std::string &setup_name, const std::string &update_name)nmodl::codegen::CodegenNeuronCppVisitorprotected - print_cvode_tolerances()nmodl::codegen::CodegenNeuronCppVisitorprotected - print_cvode_update(const std::string &name, const ast::StatementBlock &block)nmodl::codegen::CodegenNeuronCppVisitorprotected - print_data_structures(bool print_initializers) overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual - print_eigen_linear_solver(const std::string &float_type, int N)nmodl::codegen::CodegenCppVisitorprotected - print_entrypoint_setup_code_from_memb_list()nmodl::codegen::CodegenNeuronCppVisitorprotected - print_entrypoint_setup_code_from_prop()nmodl::codegen::CodegenNeuronCppVisitorprotected - print_fast_imem_calculation() overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual - print_function(const ast::FunctionBlock &node)nmodl::codegen::CodegenCppVisitorprotected - print_function_call(const ast::FunctionCall &node)nmodl::codegen::CodegenCppVisitorprotectedvirtual - print_function_declaration(const T &node, const std::string &name, const std::unordered_set< CppObjectSpecifier > &={CppObjectSpecifier::Static, CppObjectSpecifier::Inline})nmodl::codegen::CodegenCppVisitorprotected - print_function_definitions()nmodl::codegen::CodegenNeuronCppVisitorprotected - print_function_or_procedure(const ast::Block &node, const std::string &name, const std::unordered_set< CppObjectSpecifier > &specifiers={ CppObjectSpecifier::Inline}) overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual - print_function_procedure_helper(const ast::Block &node) overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual - print_function_prototypes() overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual - print_function_table_call(const ast::FunctionCall &node) overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual - print_function_tables(const ast::FunctionTableBlock &node)nmodl::codegen::CodegenCppVisitorprotected - print_functor_definition(const ast::EigenNewtonSolverBlock &node)nmodl::codegen::CodegenCppVisitorprotected - print_functors_definitions()nmodl::codegen::CodegenCppVisitorprotected - print_g_unused() const overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual - print_global_function_common_code(BlockType type, const std::string &function_name="") overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual - print_global_macros()nmodl::codegen::CodegenNeuronCppVisitorprotected - print_global_param_default_values()nmodl::codegen::CodegenNeuronCppVisitorprotected - print_global_struct_function_table_ptrs()nmodl::codegen::CodegenCppVisitorprotectedvirtual - print_global_var_external_access()nmodl::codegen::CodegenNeuronCppVisitorprotected - print_global_var_struct_assertions() constnmodl::codegen::CodegenCppVisitorprotectedvirtual - print_global_var_struct_decl()nmodl::codegen::CodegenCppVisitorprotectedvirtual - print_global_variables_for_hoc() overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual - print_headers_include() overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual - print_hoc_py_wrapper(const ast::Block *function_or_procedure_block, InterpreterWrapper wrapper_type)nmodl::codegen::CodegenNeuronCppVisitorprotected - print_hoc_py_wrapper_call_impl(const ast::Block *function_or_procedure_block, InterpreterWrapper wrapper_type)nmodl::codegen::CodegenNeuronCppVisitorprotected - print_hoc_py_wrapper_function_definitions()nmodl::codegen::CodegenNeuronCppVisitorprotected - print_hoc_py_wrapper_setup(const ast::Block *function_or_procedure_block, InterpreterWrapper wrapper_type)nmodl::codegen::CodegenNeuronCppVisitorprotected - print_initial_block(const ast::InitialBlock *node)nmodl::codegen::CodegenNeuronCppVisitorprotected - print_ion_variable() overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual - print_longitudinal_diffusion_callbacks()nmodl::codegen::CodegenNeuronCppVisitorprotected - print_macro_definitions()nmodl::codegen::CodegenNeuronCppVisitorprotected - print_make_instance() constnmodl::codegen::CodegenNeuronCppVisitorprotected - print_make_node_data() constnmodl::codegen::CodegenNeuronCppVisitorprotected - print_mechanism_global_var_structure(bool print_initializers) overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual - print_mechanism_info()nmodl::codegen::CodegenCppVisitorprotected - print_mechanism_range_var_structure(bool print_initializers) overridenmodl::codegen::CodegenNeuronCppVisitorvirtual - print_mechanism_register() overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual - print_mechanism_register_nothing()nmodl::codegen::CodegenNeuronCppVisitorprotected - print_mechanism_register_regular()nmodl::codegen::CodegenNeuronCppVisitorprotected - print_mechanism_variables_macros()nmodl::codegen::CodegenNeuronCppVisitorprotected - print_namespace_start()nmodl::codegen::CodegenCppVisitorprotected - print_namespace_stop()nmodl::codegen::CodegenCppVisitorprotected - print_net_event_call(const ast::FunctionCall &node) overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual - print_net_init()nmodl::codegen::CodegenNeuronCppVisitorprotected - print_net_move_call(const ast::FunctionCall &node) overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual - print_net_receive()nmodl::codegen::CodegenNeuronCppVisitorprotected - print_net_receive_common_code()nmodl::codegen::CodegenNeuronCppVisitorprotected - print_net_receive_registration()nmodl::codegen::CodegenNeuronCppVisitorprotected - print_net_send_call(const ast::FunctionCall &node) overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual - print_neuron_global_variable_declarations()nmodl::codegen::CodegenNeuronCppVisitorprotected - print_neuron_includes()nmodl::codegen::CodegenNeuronCppVisitorprotected - print_nmodl_constants()nmodl::codegen::CodegenCppVisitorprotected - print_node_data_structure(bool print_initializers)nmodl::codegen::CodegenNeuronCppVisitor - print_nrn_alloc() overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual - print_nrn_constructor() overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual - print_nrn_constructor_declaration()nmodl::codegen::CodegenNeuronCppVisitorprotected - print_nrn_cur() overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual - print_nrn_cur_conductance_kernel(const ast::BreakpointBlock &node) overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual - print_nrn_cur_kernel(const ast::BreakpointBlock &node) overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual - print_nrn_cur_non_conductance_kernel() overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual - print_nrn_current(const ast::BreakpointBlock &node) overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual - print_nrn_destructor() overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual - print_nrn_destructor_declaration()nmodl::codegen::CodegenNeuronCppVisitorprotected - print_nrn_init(bool skip_init_check=true)nmodl::codegen::CodegenNeuronCppVisitorprotected - print_nrn_jacob()nmodl::codegen::CodegenNeuronCppVisitorprotected - print_nrn_pointing(const ast::FunctionCall &node)nmodl::codegen::CodegenCppVisitorprotectedvirtual - print_nrn_state() overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual - print_parallel_iteration_hint(BlockType type, const ast::Block *block)nmodl::codegen::CodegenCppVisitorprotectedvirtual - print_point_process_function_definitions()nmodl::codegen::CodegenNeuronCppVisitorprotected - print_prcellstate_macros() constnmodl::codegen::CodegenCppVisitorprotected - print_procedure(const ast::ProcedureBlock &node)nmodl::codegen::CodegenCppVisitorprotected - print_rename_state_vars() constnmodl::codegen::CodegenCppVisitorprotected - print_sdlists_init(bool print_initializers) overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual - print_setdata_functions()nmodl::codegen::CodegenNeuronCppVisitorprotected - print_standard_includes() overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual - print_statement_block(const ast::StatementBlock &node, bool open_brace=true, bool close_brace=true)nmodl::codegen::CodegenCppVisitorprotected - print_table_check_function(const ast::Block &)nmodl::codegen::CodegenCppVisitorprotected - print_table_replacement_function(const ast::Block &)nmodl::codegen::CodegenCppVisitorprotected - print_thread_memory_callbacks()nmodl::codegen::CodegenNeuronCppVisitorprotected - print_thread_variables_structure(bool print_initializers)nmodl::codegen::CodegenNeuronCppVisitor - print_top_verbatim_blocks()nmodl::codegen::CodegenCppVisitorprotected - print_using_namespace()nmodl::codegen::CodegenCppVisitorprotected - print_v_unused() const overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual - print_vector_elements(const std::vector< T > &elements, const std::string &separator, const std::string &prefix="")nmodl::codegen::CodegenCppVisitorprotected - print_verbatim_cleanup(const std::vector< std::string > &macros_defined)nmodl::codegen::CodegenNeuronCppVisitorprotected - print_verbatim_setup(const ast::Verbatim &node, const std::string &verbatim)nmodl::codegen::CodegenNeuronCppVisitorprotected - printernmodl::codegen::CodegenCppVisitorprotected - printing_net_initnmodl::codegen::CodegenCppVisitorprotected - printing_net_receivenmodl::codegen::CodegenCppVisitorprotected - printing_top_verbatim_blocksnmodl::codegen::CodegenCppVisitorprotected - process_shadow_update_statement(const ShadowUseStatement &statement, BlockType type)nmodl::codegen::CodegenCppVisitorprotected - process_verbatim_text(const std::string &verbatim)nmodl::codegen::CodegenNeuronCppVisitorprotected - program_symtabnmodl::codegen::CodegenCppVisitorprotected - py_function_name(const std::string &function_or_procedure_name) constnmodl::codegen::CodegenNeuronCppVisitorprotected - py_function_signature(const std::string &function_or_procedure_name) constnmodl::codegen::CodegenNeuronCppVisitorprotected - range_variable_setup_required() const noexceptnmodl::codegen::CodegenCppVisitorprotected - read_ion_variable_name(const std::string &name)nmodl::codegen::CodegenCppVisitorprotectedstatic - register_mechanism_arguments() const overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual - setup(const ast::Program &node)nmodl::codegen::CodegenCppVisitorprotectedvirtual - simulator_name() overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual - statement_to_skip(const ast::Statement &node)nmodl::codegen::CodegenCppVisitorprotectedstatic - SymbolType typedefnmodl::codegen::CodegenCppVisitorprotected - table_thread_function_name() constnmodl::codegen::CodegenNeuronCppVisitorprotected - table_update_function_name(const std::string &block_name) constnmodl::codegen::CodegenCppVisitorprotected - thread_variable_name(const ThreadVariableInfo &var_info, bool use_instance=true) constnmodl::codegen::CodegenNeuronCppVisitorprotected - thread_variables_struct() constnmodl::codegen::CodegenCppVisitorinlineprotected - threadargs_parameters()nmodl::codegen::CodegenNeuronCppVisitorprotected - update_if_ion_variable_name(const std::string &name) constnmodl::codegen::CodegenCppVisitorprotected - update_index_semantics()nmodl::codegen::CodegenCppVisitorprotected - visit_after_block(const ast::AfterBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_argument(const ast::Argument &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_assigned_block(const ast::AssignedBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_assigned_definition(const ast::AssignedDefinition &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_ba_block(const ast::BABlock &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_ba_block_type(const ast::BABlockType &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_bbcore_pointer(const ast::BbcorePointer &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_bbcore_pointer_var(const ast::BbcorePointerVar &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_before_block(const ast::BeforeBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_binary_expression(const ast::BinaryExpression &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual - visit_binary_operator(const ast::BinaryOperator &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual - visit_block(const ast::Block &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_block_comment(const ast::BlockComment &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_boolean(const ast::Boolean &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual - visit_breakpoint_block(const ast::BreakpointBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_compartment(const ast::Compartment &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_conductance_hint(const ast::ConductanceHint &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_conserve(const ast::Conserve &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_constant_block(const ast::ConstantBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_constant_statement(const ast::ConstantStatement &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_constant_var(const ast::ConstantVar &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_constructor_block(const ast::ConstructorBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_cvode_block(const ast::CvodeBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_define(const ast::Define &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_derivative_block(const ast::DerivativeBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_derivimplicit_callback(const ast::DerivimplicitCallback &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_destructor_block(const ast::DestructorBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_diff_eq_expression(const ast::DiffEqExpression &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_discrete_block(const ast::DiscreteBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_double(const ast::Double &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual - visit_double_unit(const ast::DoubleUnit &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_eigen_linear_solver_block(const ast::EigenLinearSolverBlock &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual - visit_eigen_newton_solver_block(const ast::EigenNewtonSolverBlock &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual - visit_electrode_cur_var(const ast::ElectrodeCurVar &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_electrode_current(const ast::ElectrodeCurrent &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_else_if_statement(const ast::ElseIfStatement &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual - visit_else_statement(const ast::ElseStatement &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual - visit_expression(const ast::Expression &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_expression_statement(const ast::ExpressionStatement &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_extern_var(const ast::ExternVar &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_external(const ast::External &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_factor_def(const ast::FactorDef &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_float(const ast::Float &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual - visit_for_netcon(const ast::ForNetcon &node) overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual - visit_from_statement(const ast::FromStatement &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual - visit_function_block(const ast::FunctionBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_function_call(const ast::FunctionCall &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual - visit_function_table_block(const ast::FunctionTableBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_global(const ast::Global &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_global_var(const ast::GlobalVar &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_identifier(const ast::Identifier &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_if_statement(const ast::IfStatement &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual - visit_include(const ast::Include &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_independent_block(const ast::IndependentBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_indexed_name(const ast::IndexedName &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual - visit_initial_block(const ast::InitialBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_integer(const ast::Integer &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual - visit_kinetic_block(const ast::KineticBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_lag_statement(const ast::LagStatement &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_limits(const ast::Limits &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_lin_equation(const ast::LinEquation &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_line_comment(const ast::LineComment &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_linear_block(const ast::LinearBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_local_list_statement(const ast::LocalListStatement &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual - visit_local_var(const ast::LocalVar &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_lon_diffuse(const ast::LonDiffuse &node) overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual - visit_longitudinal_diffusion_block(const ast::LongitudinalDiffusionBlock &node) overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual - visit_model(const ast::Model &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_mutex_lock(const ast::MutexLock &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual - visit_mutex_unlock(const ast::MutexUnlock &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual - visit_name(const ast::Name &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual - visit_net_receive_block(const ast::NetReceiveBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_neuron_block(const ast::NeuronBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_node(const ast::Node &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_non_lin_equation(const ast::NonLinEquation &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_non_linear_block(const ast::NonLinearBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_nonspecific(const ast::Nonspecific &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_nonspecific_cur_var(const ast::NonspecificCurVar &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_nrn_state_block(const ast::NrnStateBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_number(const ast::Number &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_number_range(const ast::NumberRange &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_ontology_statement(const ast::OntologyStatement &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_param_assign(const ast::ParamAssign &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_param_block(const ast::ParamBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_paren_expression(const ast::ParenExpression &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual - visit_pointer(const ast::Pointer &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_pointer_var(const ast::PointerVar &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_prime_name(const ast::PrimeName &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual - visit_procedure_block(const ast::ProcedureBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_program(const ast::Program &program) overridenmodl::codegen::CodegenCppVisitorvirtual - visit_protect_statement(const ast::ProtectStatement &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual - visit_random_var(const ast::RandomVar &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_random_var_list(const ast::RandomVarList &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_range(const ast::Range &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_range_var(const ast::RangeVar &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_react_var_name(const ast::ReactVarName &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_reaction_operator(const ast::ReactionOperator &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_reaction_statement(const ast::ReactionStatement &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_read_ion_var(const ast::ReadIonVar &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_solution_expression(const ast::SolutionExpression &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual - visit_solve_block(const ast::SolveBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_state_block(const ast::StateBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_statement(const ast::Statement &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_statement_block(const ast::StatementBlock &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual - visit_string(const ast::String &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual - visit_suffix(const ast::Suffix &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_table_statement(const ast::TableStatement &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_thread_safe(const ast::ThreadSafe &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_unary_expression(const ast::UnaryExpression &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_unary_operator(const ast::UnaryOperator &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual - visit_unit(const ast::Unit &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual - visit_unit_block(const ast::UnitBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_unit_def(const ast::UnitDef &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_unit_state(const ast::UnitState &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_update_dt(const ast::UpdateDt &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual - visit_useion(const ast::Useion &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_valence(const ast::Valence &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_var_name(const ast::VarName &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual - visit_verbatim(const ast::Verbatim &node) overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual - visit_watch(const ast::Watch &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_watch_statement(const ast::WatchStatement &node) overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual - visit_while_statement(const ast::WhileStatement &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual - visit_wrapped_expression(const ast::WrappedExpression &node) overridenmodl::visitor::ConstAstVisitorvirtual - visit_write_ion_var(const ast::WriteIonVar &node) overridenmodl::visitor::ConstAstVisitorvirtual - write_ion_variable_name(const std::string &name)nmodl::codegen::CodegenCppVisitorprotectedstatic - ~ConstVisitor()=defaultnmodl::visitor::ConstVisitorvirtual + print_backend_info()nmodl::codegen::CodegenCppVisitorprotected + print_check_table_entrypoint()nmodl::codegen::CodegenNeuronCppVisitorprotected + print_codegen_routines() overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual + print_codegen_routines_nothing()nmodl::codegen::CodegenNeuronCppVisitorprotected + print_codegen_routines_regular()nmodl::codegen::CodegenNeuronCppVisitorprotected + print_compute_functions() overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual + print_cvode_count()nmodl::codegen::CodegenNeuronCppVisitorprotected + print_cvode_definitions()nmodl::codegen::CodegenNeuronCppVisitorprotected + print_cvode_setup(const std::string &setup_name, const std::string &update_name)nmodl::codegen::CodegenNeuronCppVisitorprotected + print_cvode_tolerances()nmodl::codegen::CodegenNeuronCppVisitorprotected + print_cvode_update(const std::string &name, const ast::StatementBlock &block)nmodl::codegen::CodegenNeuronCppVisitorprotected + print_data_structures(bool print_initializers) overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual + print_eigen_linear_solver(const std::string &float_type, int N)nmodl::codegen::CodegenCppVisitorprotected + print_entrypoint_setup_code_from_memb_list()nmodl::codegen::CodegenNeuronCppVisitorprotected + print_entrypoint_setup_code_from_prop()nmodl::codegen::CodegenNeuronCppVisitorprotected + print_fast_imem_calculation() overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual + print_function(const ast::FunctionBlock &node)nmodl::codegen::CodegenCppVisitorprotected + print_function_call(const ast::FunctionCall &node)nmodl::codegen::CodegenCppVisitorprotectedvirtual + print_function_declaration(const T &node, const std::string &name, const std::unordered_set< CppObjectSpecifier > &={CppObjectSpecifier::Static, CppObjectSpecifier::Inline})nmodl::codegen::CodegenCppVisitorprotected + print_function_definitions()nmodl::codegen::CodegenNeuronCppVisitorprotected + print_function_or_procedure(const ast::Block &node, const std::string &name, const std::unordered_set< CppObjectSpecifier > &specifiers={ CppObjectSpecifier::Inline}) overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual + print_function_procedure_helper(const ast::Block &node) overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual + print_function_prototypes() overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual + print_function_table_call(const ast::FunctionCall &node) overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual + print_function_tables(const ast::FunctionTableBlock &node)nmodl::codegen::CodegenCppVisitorprotected + print_functor_definition(const ast::EigenNewtonSolverBlock &node)nmodl::codegen::CodegenCppVisitorprotected + print_functors_definitions()nmodl::codegen::CodegenCppVisitorprotected + print_g_unused() const overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual + print_global_function_common_code(BlockType type, const std::string &function_name="") overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual + print_global_macros()nmodl::codegen::CodegenNeuronCppVisitorprotected + print_global_param_default_values()nmodl::codegen::CodegenNeuronCppVisitorprotected + print_global_struct_function_table_ptrs()nmodl::codegen::CodegenCppVisitorprotectedvirtual + print_global_var_external_access()nmodl::codegen::CodegenNeuronCppVisitorprotected + print_global_var_struct_assertions() constnmodl::codegen::CodegenCppVisitorprotectedvirtual + print_global_var_struct_decl()nmodl::codegen::CodegenCppVisitorprotectedvirtual + print_global_variables_for_hoc() overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual + print_headers_include() overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual + print_hoc_py_wrapper(const ast::Block *function_or_procedure_block, InterpreterWrapper wrapper_type)nmodl::codegen::CodegenNeuronCppVisitorprotected + print_hoc_py_wrapper_call_impl(const ast::Block *function_or_procedure_block, InterpreterWrapper wrapper_type)nmodl::codegen::CodegenNeuronCppVisitorprotected + print_hoc_py_wrapper_function_definitions()nmodl::codegen::CodegenNeuronCppVisitorprotected + print_hoc_py_wrapper_setup(const ast::Block *function_or_procedure_block, InterpreterWrapper wrapper_type)nmodl::codegen::CodegenNeuronCppVisitorprotected + print_initial_block(const ast::InitialBlock *node)nmodl::codegen::CodegenNeuronCppVisitorprotected + print_ion_variable() overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual + print_longitudinal_diffusion_callbacks()nmodl::codegen::CodegenNeuronCppVisitorprotected + print_macro_definitions()nmodl::codegen::CodegenNeuronCppVisitorprotected + print_make_instance() constnmodl::codegen::CodegenNeuronCppVisitorprotected + print_make_node_data() constnmodl::codegen::CodegenNeuronCppVisitorprotected + print_mechanism_global_var_structure(bool print_initializers) overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual + print_mechanism_info()nmodl::codegen::CodegenCppVisitorprotected + print_mechanism_range_var_structure(bool print_initializers) overridenmodl::codegen::CodegenNeuronCppVisitorvirtual + print_mechanism_register() overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual + print_mechanism_register_nothing()nmodl::codegen::CodegenNeuronCppVisitorprotected + print_mechanism_register_regular()nmodl::codegen::CodegenNeuronCppVisitorprotected + print_mechanism_variables_macros()nmodl::codegen::CodegenNeuronCppVisitorprotected + print_namespace_start()nmodl::codegen::CodegenCppVisitorprotected + print_namespace_stop()nmodl::codegen::CodegenCppVisitorprotected + print_net_event_call(const ast::FunctionCall &node) overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual + print_net_init()nmodl::codegen::CodegenNeuronCppVisitorprotected + print_net_move_call(const ast::FunctionCall &node) overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual + print_net_receive()nmodl::codegen::CodegenNeuronCppVisitorprotected + print_net_receive_common_code()nmodl::codegen::CodegenNeuronCppVisitorprotected + print_net_receive_registration()nmodl::codegen::CodegenNeuronCppVisitorprotected + print_net_send_call(const ast::FunctionCall &node) overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual + print_neuron_global_variable_declarations()nmodl::codegen::CodegenNeuronCppVisitorprotected + print_neuron_includes()nmodl::codegen::CodegenNeuronCppVisitorprotected + print_nmodl_constants()nmodl::codegen::CodegenCppVisitorprotected + print_node_data_structure(bool print_initializers)nmodl::codegen::CodegenNeuronCppVisitor + print_nrn_alloc() overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual + print_nrn_constructor() overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual + print_nrn_constructor_declaration()nmodl::codegen::CodegenNeuronCppVisitorprotected + print_nrn_cur() overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual + print_nrn_cur_conductance_kernel(const ast::BreakpointBlock &node) overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual + print_nrn_cur_kernel(const ast::BreakpointBlock &node) overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual + print_nrn_cur_non_conductance_kernel() overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual + print_nrn_current(const ast::BreakpointBlock &node) overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual + print_nrn_destructor() overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual + print_nrn_destructor_declaration()nmodl::codegen::CodegenNeuronCppVisitorprotected + print_nrn_init(bool skip_init_check=true)nmodl::codegen::CodegenNeuronCppVisitorprotected + print_nrn_jacob()nmodl::codegen::CodegenNeuronCppVisitorprotected + print_nrn_pointing(const ast::FunctionCall &node)nmodl::codegen::CodegenCppVisitorprotectedvirtual + print_nrn_state() overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual + print_parallel_iteration_hint(BlockType type, const ast::Block *block)nmodl::codegen::CodegenCppVisitorprotectedvirtual + print_point_process_function_definitions()nmodl::codegen::CodegenNeuronCppVisitorprotected + print_prcellstate_macros() constnmodl::codegen::CodegenCppVisitorprotected + print_procedure(const ast::ProcedureBlock &node)nmodl::codegen::CodegenCppVisitorprotected + print_rename_state_vars() constnmodl::codegen::CodegenCppVisitorprotected + print_sdlists_init(bool print_initializers) overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual + print_setdata_functions()nmodl::codegen::CodegenNeuronCppVisitorprotected + print_standard_includes() overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual + print_statement_block(const ast::StatementBlock &node, bool open_brace=true, bool close_brace=true)nmodl::codegen::CodegenCppVisitorprotected + print_table_check_function(const ast::Block &)nmodl::codegen::CodegenCppVisitorprotected + print_table_replacement_function(const ast::Block &)nmodl::codegen::CodegenCppVisitorprotected + print_thread_memory_callbacks()nmodl::codegen::CodegenNeuronCppVisitorprotected + print_thread_variables_structure(bool print_initializers)nmodl::codegen::CodegenNeuronCppVisitor + print_top_verbatim_blocks()nmodl::codegen::CodegenCppVisitorprotected + print_using_namespace()nmodl::codegen::CodegenCppVisitorprotected + print_v_unused() const overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual + print_vector_elements(const std::vector< T > &elements, const std::string &separator, const std::string &prefix="")nmodl::codegen::CodegenCppVisitorprotected + print_verbatim_cleanup(const std::vector< std::string > &macros_defined)nmodl::codegen::CodegenNeuronCppVisitorprotected + print_verbatim_setup(const ast::Verbatim &node, const std::string &verbatim)nmodl::codegen::CodegenNeuronCppVisitorprotected + printernmodl::codegen::CodegenCppVisitorprotected + printing_net_initnmodl::codegen::CodegenCppVisitorprotected + printing_net_receivenmodl::codegen::CodegenCppVisitorprotected + printing_top_verbatim_blocksnmodl::codegen::CodegenCppVisitorprotected + process_shadow_update_statement(const ShadowUseStatement &statement, BlockType type)nmodl::codegen::CodegenCppVisitorprotected + process_verbatim_text(const std::string &verbatim)nmodl::codegen::CodegenNeuronCppVisitorprotected + program_symtabnmodl::codegen::CodegenCppVisitorprotected + py_function_name(const std::string &function_or_procedure_name) constnmodl::codegen::CodegenNeuronCppVisitorprotected + py_function_signature(const std::string &function_or_procedure_name) constnmodl::codegen::CodegenNeuronCppVisitorprotected + range_variable_setup_required() const noexceptnmodl::codegen::CodegenCppVisitorprotected + read_ion_variable_name(const std::string &name)nmodl::codegen::CodegenCppVisitorprotectedstatic + register_mechanism_arguments() const overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual + setup(const ast::Program &node)nmodl::codegen::CodegenCppVisitorprotectedvirtual + simulator_name() overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual + statement_to_skip(const ast::Statement &node)nmodl::codegen::CodegenCppVisitorprotectedstatic + SymbolType typedefnmodl::codegen::CodegenCppVisitorprotected + table_thread_function_name() constnmodl::codegen::CodegenNeuronCppVisitorprotected + table_update_function_name(const std::string &block_name) constnmodl::codegen::CodegenCppVisitorprotected + thread_variable_name(const ThreadVariableInfo &var_info, bool use_instance=true) constnmodl::codegen::CodegenNeuronCppVisitorprotected + thread_variables_struct() constnmodl::codegen::CodegenCppVisitorinlineprotected + threadargs_parameters()nmodl::codegen::CodegenNeuronCppVisitorprotected + update_if_ion_variable_name(const std::string &name) constnmodl::codegen::CodegenCppVisitorprotected + update_index_semantics()nmodl::codegen::CodegenCppVisitorprotected + visit_after_block(const ast::AfterBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_argument(const ast::Argument &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_assigned_block(const ast::AssignedBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_assigned_definition(const ast::AssignedDefinition &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_ba_block(const ast::BABlock &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_ba_block_type(const ast::BABlockType &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_bbcore_pointer(const ast::BbcorePointer &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_bbcore_pointer_var(const ast::BbcorePointerVar &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_before_block(const ast::BeforeBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_binary_expression(const ast::BinaryExpression &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual + visit_binary_operator(const ast::BinaryOperator &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual + visit_block(const ast::Block &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_block_comment(const ast::BlockComment &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_boolean(const ast::Boolean &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual + visit_breakpoint_block(const ast::BreakpointBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_compartment(const ast::Compartment &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_conductance_hint(const ast::ConductanceHint &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_conserve(const ast::Conserve &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_constant_block(const ast::ConstantBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_constant_statement(const ast::ConstantStatement &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_constant_var(const ast::ConstantVar &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_constructor_block(const ast::ConstructorBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_cvode_block(const ast::CvodeBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_define(const ast::Define &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_derivative_block(const ast::DerivativeBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_derivimplicit_callback(const ast::DerivimplicitCallback &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_destructor_block(const ast::DestructorBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_diff_eq_expression(const ast::DiffEqExpression &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_discrete_block(const ast::DiscreteBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_double(const ast::Double &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual + visit_double_unit(const ast::DoubleUnit &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_eigen_linear_solver_block(const ast::EigenLinearSolverBlock &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual + visit_eigen_newton_solver_block(const ast::EigenNewtonSolverBlock &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual + visit_electrode_cur_var(const ast::ElectrodeCurVar &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_electrode_current(const ast::ElectrodeCurrent &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_else_if_statement(const ast::ElseIfStatement &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual + visit_else_statement(const ast::ElseStatement &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual + visit_expression(const ast::Expression &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_expression_statement(const ast::ExpressionStatement &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_extern_var(const ast::ExternVar &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_external(const ast::External &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_factor_def(const ast::FactorDef &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_float(const ast::Float &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual + visit_for_netcon(const ast::ForNetcon &node) overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual + visit_from_statement(const ast::FromStatement &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual + visit_function_block(const ast::FunctionBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_function_call(const ast::FunctionCall &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual + visit_function_table_block(const ast::FunctionTableBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_global(const ast::Global &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_global_var(const ast::GlobalVar &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_identifier(const ast::Identifier &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_if_statement(const ast::IfStatement &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual + visit_include(const ast::Include &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_independent_block(const ast::IndependentBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_indexed_name(const ast::IndexedName &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual + visit_initial_block(const ast::InitialBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_integer(const ast::Integer &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual + visit_kinetic_block(const ast::KineticBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_lag_statement(const ast::LagStatement &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_limits(const ast::Limits &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_lin_equation(const ast::LinEquation &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_line_comment(const ast::LineComment &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_linear_block(const ast::LinearBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_local_list_statement(const ast::LocalListStatement &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual + visit_local_var(const ast::LocalVar &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_lon_diffuse(const ast::LonDiffuse &node) overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual + visit_longitudinal_diffusion_block(const ast::LongitudinalDiffusionBlock &node) overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual + visit_model(const ast::Model &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_mutex_lock(const ast::MutexLock &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual + visit_mutex_unlock(const ast::MutexUnlock &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual + visit_name(const ast::Name &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual + visit_net_receive_block(const ast::NetReceiveBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_neuron_block(const ast::NeuronBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_node(const ast::Node &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_non_lin_equation(const ast::NonLinEquation &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_non_linear_block(const ast::NonLinearBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_nonspecific(const ast::Nonspecific &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_nonspecific_cur_var(const ast::NonspecificCurVar &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_nrn_state_block(const ast::NrnStateBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_number(const ast::Number &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_number_range(const ast::NumberRange &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_ontology_statement(const ast::OntologyStatement &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_param_assign(const ast::ParamAssign &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_param_block(const ast::ParamBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_paren_expression(const ast::ParenExpression &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual + visit_pointer(const ast::Pointer &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_pointer_var(const ast::PointerVar &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_prime_name(const ast::PrimeName &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual + visit_procedure_block(const ast::ProcedureBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_program(const ast::Program &program) overridenmodl::codegen::CodegenCppVisitorvirtual + visit_protect_statement(const ast::ProtectStatement &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_random_var(const ast::RandomVar &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_random_var_list(const ast::RandomVarList &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_range(const ast::Range &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_range_var(const ast::RangeVar &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_react_var_name(const ast::ReactVarName &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_reaction_operator(const ast::ReactionOperator &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_reaction_statement(const ast::ReactionStatement &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_read_ion_var(const ast::ReadIonVar &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_solution_expression(const ast::SolutionExpression &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual + visit_solve_block(const ast::SolveBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_state_block(const ast::StateBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_statement(const ast::Statement &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_statement_block(const ast::StatementBlock &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual + visit_string(const ast::String &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual + visit_suffix(const ast::Suffix &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_table_statement(const ast::TableStatement &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_thread_safe(const ast::ThreadSafe &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_unary_expression(const ast::UnaryExpression &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_unary_operator(const ast::UnaryOperator &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual + visit_unit(const ast::Unit &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual + visit_unit_block(const ast::UnitBlock &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_unit_def(const ast::UnitDef &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_unit_state(const ast::UnitState &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_update_dt(const ast::UpdateDt &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual + visit_useion(const ast::Useion &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_valence(const ast::Valence &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_var_name(const ast::VarName &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual + visit_verbatim(const ast::Verbatim &node) overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual + visit_watch(const ast::Watch &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_watch_statement(const ast::WatchStatement &node) overridenmodl::codegen::CodegenNeuronCppVisitorprotectedvirtual + visit_while_statement(const ast::WhileStatement &node) overridenmodl::codegen::CodegenCppVisitorprotectedvirtual + visit_wrapped_expression(const ast::WrappedExpression &node) overridenmodl::visitor::ConstAstVisitorvirtual + visit_write_ion_var(const ast::WriteIonVar &node) overridenmodl::visitor::ConstAstVisitorvirtual + write_ion_variable_name(const std::string &name)nmodl::codegen::CodegenCppVisitorprotectedstatic + ~ConstVisitor()=defaultnmodl::visitor::ConstVisitorvirtual diff --git a/doxygen/classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html b/doxygen/classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html index 490e0e61d..52e8d62ff 100644 --- a/doxygen/classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html +++ b/doxygen/classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html @@ -549,9 +549,6 @@ int position_of_int_var (const std::string &name) const override  Determine the position in the data array for a given int variable. More...
  -void print_atomic_reduction_pragma () override - Print atomic update pragma for reduction statements. More...
-  bool optimize_ion_variable_copies () const override  Check if ion variable copies should be avoided. More...
  @@ -1151,9 +1148,6 @@ void visit_update_dt (const ast::UpdateDt &node) override  visit node of type ast::UpdateDt More...
  -void visit_protect_statement (const ast::ProtectStatement &node) override - visit node of type ast::ProtectStatement More...
-  void visit_mutex_lock (const ast::MutexLock &node) override  visit node of type ast::MutexLock More...
  @@ -1301,7 +1295,7 @@

nmodl::codegen::CodegenCppVisitor.

-

Definition at line 568 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 562 of file codegen_neuron_cpp_visitor.cpp.

@@ -1333,7 +1327,7 @@

nmodl::codegen::CodegenCppVisitor.

-

Definition at line 560 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 554 of file codegen_neuron_cpp_visitor.cpp.

@@ -1390,7 +1384,7 @@

nmodl::codegen::CodegenCppVisitor.

-

Definition at line 868 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 862 of file codegen_neuron_cpp_visitor.cpp.

@@ -1510,7 +1504,7 @@

Definition at line 2838 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 2832 of file codegen_neuron_cpp_visitor.cpp.

@@ -1539,7 +1533,7 @@

Definition at line 2845 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 2839 of file codegen_neuron_cpp_visitor.cpp.

@@ -1572,7 +1566,7 @@

nmodl::codegen::CodegenCppVisitor.

-

Definition at line 603 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 597 of file codegen_neuron_cpp_visitor.cpp.

@@ -1612,7 +1606,7 @@

nmodl::codegen::CodegenCppVisitor.

-

Definition at line 609 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 603 of file codegen_neuron_cpp_visitor.cpp.

@@ -1663,7 +1657,7 @@

nmodl::codegen::CodegenCppVisitor.

-

Definition at line 894 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 888 of file codegen_neuron_cpp_visitor.cpp.

@@ -1695,7 +1689,7 @@

nmodl::codegen::CodegenCppVisitor.

-

Definition at line 642 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 636 of file codegen_neuron_cpp_visitor.cpp.

@@ -1726,7 +1720,7 @@

nmodl::codegen::CodegenCppVisitor.

-

Definition at line 1159 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 1153 of file codegen_neuron_cpp_visitor.cpp.

@@ -1764,7 +1758,7 @@

Returns
The C++ string representing the variable. thread structure
-

Definition at line 981 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 975 of file codegen_neuron_cpp_visitor.cpp.

@@ -1815,7 +1809,7 @@

nmodl::codegen::CodegenCppVisitor.

-

Definition at line 995 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 989 of file codegen_neuron_cpp_visitor.cpp.

@@ -1865,7 +1859,7 @@

nmodl::codegen::CodegenCppVisitor.

-

Definition at line 971 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 965 of file codegen_neuron_cpp_visitor.cpp.

@@ -1895,7 +1889,7 @@

Definition at line 831 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 825 of file codegen_neuron_cpp_visitor.cpp.

@@ -1925,7 +1919,7 @@

Definition at line 837 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 831 of file codegen_neuron_cpp_visitor.cpp.

@@ -1967,7 +1961,7 @@

Definition at line 412 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 406 of file codegen_neuron_cpp_visitor.cpp.

@@ -2025,7 +2019,7 @@

nmodl::codegen::CodegenCppVisitor.

-

Definition at line 910 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 904 of file codegen_neuron_cpp_visitor.cpp.

@@ -2057,7 +2051,7 @@

nmodl::codegen::CodegenCppVisitor.

-

Definition at line 574 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 568 of file codegen_neuron_cpp_visitor.cpp.

@@ -2089,7 +2083,7 @@

nmodl::codegen::CodegenCppVisitor.

-

Definition at line 580 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 574 of file codegen_neuron_cpp_visitor.cpp.

@@ -2118,7 +2112,7 @@

Definition at line 615 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 609 of file codegen_neuron_cpp_visitor.cpp.

@@ -2147,7 +2141,7 @@

Definition at line 483 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 477 of file codegen_neuron_cpp_visitor.cpp.

@@ -2176,7 +2170,7 @@

Definition at line 490 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 484 of file codegen_neuron_cpp_visitor.cpp.

@@ -2207,7 +2201,7 @@

nmodl::codegen::CodegenCppVisitor.

-

Definition at line 863 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 857 of file codegen_neuron_cpp_visitor.cpp.

@@ -2263,7 +2257,7 @@

-

Definition at line 2813 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 2807 of file codegen_neuron_cpp_visitor.cpp.

@@ -2290,7 +2284,7 @@

-

Definition at line 2338 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 2332 of file codegen_neuron_cpp_visitor.cpp.

@@ -2317,7 +2311,7 @@

-

Definition at line 2343 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 2337 of file codegen_neuron_cpp_visitor.cpp.

@@ -2349,7 +2343,7 @@

nmodl::codegen::CodegenCppVisitor.

-

Definition at line 631 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 625 of file codegen_neuron_cpp_visitor.cpp.

@@ -2381,7 +2375,7 @@

nmodl::codegen::CodegenCppVisitor.

-

Definition at line 637 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 631 of file codegen_neuron_cpp_visitor.cpp.

@@ -2412,7 +2406,7 @@

nmodl::codegen::CodegenCppVisitor.

-

Definition at line 89 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 83 of file codegen_neuron_cpp_visitor.cpp.

@@ -2492,38 +2486,6 @@

Definition at line 74 of file codegen_neuron_cpp_visitor.cpp.

- - - -

◆ print_atomic_reduction_pragma()

- -
-
- - - - - -
- - - - - - - -
void nmodl::codegen::CodegenNeuronCppVisitor::print_atomic_reduction_pragma ()
-
-overrideprotectedvirtual
-
- -

Print atomic update pragma for reduction statements.

-

TODO: Edit for NEURON.

- -

Implements nmodl::codegen::CodegenCppVisitor.

- -

Definition at line 85 of file codegen_neuron_cpp_visitor.cpp.

-
@@ -2551,7 +2513,7 @@

Definition at line 145 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 139 of file codegen_neuron_cpp_visitor.cpp.

@@ -2582,7 +2544,7 @@

nmodl::codegen::CodegenCppVisitor.

-

Definition at line 2715 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 2709 of file codegen_neuron_cpp_visitor.cpp.

@@ -2611,7 +2573,7 @@

Definition at line 2703 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 2697 of file codegen_neuron_cpp_visitor.cpp.

@@ -2640,7 +2602,7 @@

Definition at line 2671 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 2665 of file codegen_neuron_cpp_visitor.cpp.

@@ -2671,7 +2633,7 @@

nmodl::codegen::CodegenCppVisitor.

-

Definition at line 2662 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 2656 of file codegen_neuron_cpp_visitor.cpp.

@@ -2700,7 +2662,7 @@

Definition at line 2862 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 2856 of file codegen_neuron_cpp_visitor.cpp.

@@ -2729,7 +2691,7 @@

Definition at line 2942 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 2936 of file codegen_neuron_cpp_visitor.cpp.

@@ -2769,7 +2731,7 @@

Definition at line 2922 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 2916 of file codegen_neuron_cpp_visitor.cpp.

@@ -2798,7 +2760,7 @@

Definition at line 2870 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 2864 of file codegen_neuron_cpp_visitor.cpp.

@@ -2838,7 +2800,7 @@

Definition at line 2906 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 2900 of file codegen_neuron_cpp_visitor.cpp.

@@ -2876,7 +2838,7 @@

nmodl::codegen::CodegenCppVisitor.

-

Definition at line 2619 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 2613 of file codegen_neuron_cpp_visitor.cpp.

@@ -2907,7 +2869,7 @@

Definition at line 1982 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 1976 of file codegen_neuron_cpp_visitor.cpp.

@@ -2937,7 +2899,7 @@

Definition at line 2002 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 1996 of file codegen_neuron_cpp_visitor.cpp.

@@ -2969,7 +2931,7 @@

nmodl::codegen::CodegenCppVisitor.

-

Definition at line 2489 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 2483 of file codegen_neuron_cpp_visitor.cpp.

@@ -2999,7 +2961,7 @@

Definition at line 2649 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 2643 of file codegen_neuron_cpp_visitor.cpp.

@@ -3055,7 +3017,7 @@

nmodl::codegen::CodegenCppVisitor.

-

Definition at line 250 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 244 of file codegen_neuron_cpp_visitor.cpp.

@@ -3093,7 +3055,7 @@

nmodl::codegen::CodegenCppVisitor.

-

Definition at line 279 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 273 of file codegen_neuron_cpp_visitor.cpp.

@@ -3124,7 +3086,7 @@

nmodl::codegen::CodegenCppVisitor.

-

Definition at line 223 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 217 of file codegen_neuron_cpp_visitor.cpp.

@@ -3156,7 +3118,7 @@

nmodl::codegen::CodegenCppVisitor.

-

Definition at line 2772 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 2766 of file codegen_neuron_cpp_visitor.cpp.

@@ -3187,7 +3149,7 @@

nmodl::codegen::CodegenCppVisitor.

-

Definition at line 2641 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 2635 of file codegen_neuron_cpp_visitor.cpp.

@@ -3235,7 +3197,7 @@

nmodl::codegen::CodegenCppVisitor.

-

Definition at line 2026 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 2020 of file codegen_neuron_cpp_visitor.cpp.

@@ -3264,7 +3226,7 @@

Definition at line 2559 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 2553 of file codegen_neuron_cpp_visitor.cpp.

@@ -3293,7 +3255,7 @@

Definition at line 1358 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 1352 of file codegen_neuron_cpp_visitor.cpp.

@@ -3322,7 +3284,7 @@

Definition at line 1334 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 1328 of file codegen_neuron_cpp_visitor.cpp.

@@ -3353,7 +3315,7 @@

nmodl::codegen::CodegenCppVisitor.

-

Definition at line 1371 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 1365 of file codegen_neuron_cpp_visitor.cpp.

@@ -3384,7 +3346,7 @@

nmodl::codegen::CodegenCppVisitor.

-

Definition at line 2541 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 2535 of file codegen_neuron_cpp_visitor.cpp.

@@ -3428,7 +3390,7 @@

Definition at line 423 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 417 of file codegen_neuron_cpp_visitor.cpp.

@@ -3468,7 +3430,7 @@

Definition at line 293 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 287 of file codegen_neuron_cpp_visitor.cpp.

@@ -3495,7 +3457,7 @@

-

Definition at line 438 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 432 of file codegen_neuron_cpp_visitor.cpp.

@@ -3535,7 +3497,7 @@

Definition at line 330 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 324 of file codegen_neuron_cpp_visitor.cpp.

@@ -3565,7 +3527,7 @@

Definition at line 1961 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 1955 of file codegen_neuron_cpp_visitor.cpp.

@@ -3594,7 +3556,7 @@

nmodl::codegen::CodegenCppVisitor.

-

Definition at line 2723 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 2717 of file codegen_neuron_cpp_visitor.cpp.

@@ -3623,7 +3585,7 @@

Definition at line 502 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 496 of file codegen_neuron_cpp_visitor.cpp.

@@ -3652,7 +3614,7 @@

Definition at line 2551 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 2545 of file codegen_neuron_cpp_visitor.cpp.

@@ -3681,7 +3643,7 @@

Definition at line 1812 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 1806 of file codegen_neuron_cpp_visitor.cpp.

@@ -3710,7 +3672,7 @@

Definition at line 1885 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 1879 of file codegen_neuron_cpp_visitor.cpp.

@@ -3749,7 +3711,7 @@

nmodl::codegen::CodegenCppVisitor.

-

Definition at line 1165 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 1159 of file codegen_neuron_cpp_visitor.cpp.

@@ -3787,7 +3749,7 @@

nmodl::codegen::CodegenCppVisitor.

-

Definition at line 1770 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 1764 of file codegen_neuron_cpp_visitor.cpp.

@@ -3818,7 +3780,7 @@

nmodl::codegen::CodegenCppVisitor.

-

Definition at line 1502 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 1496 of file codegen_neuron_cpp_visitor.cpp.

@@ -3847,7 +3809,7 @@

Definition at line 1724 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 1718 of file codegen_neuron_cpp_visitor.cpp.

@@ -3877,7 +3839,7 @@

Definition at line 1513 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 1507 of file codegen_neuron_cpp_visitor.cpp.

@@ -3906,7 +3868,7 @@

Definition at line 2576 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 2570 of file codegen_neuron_cpp_visitor.cpp.

@@ -3944,7 +3906,7 @@

nmodl::codegen::CodegenCppVisitor.

-

Definition at line 2766 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 2760 of file codegen_neuron_cpp_visitor.cpp.

@@ -3974,7 +3936,7 @@

Definition at line 2980 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 2974 of file codegen_neuron_cpp_visitor.cpp.

@@ -4012,7 +3974,7 @@

nmodl::codegen::CodegenCppVisitor.

-

Definition at line 2753 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 2747 of file codegen_neuron_cpp_visitor.cpp.

@@ -4041,7 +4003,7 @@

Definition at line 2958 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 2952 of file codegen_neuron_cpp_visitor.cpp.

@@ -4068,7 +4030,7 @@

-

Definition at line 2820 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 2814 of file codegen_neuron_cpp_visitor.cpp.

@@ -4133,7 +4095,7 @@

nmodl::codegen::CodegenCppVisitor.

-

Definition at line 2728 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 2722 of file codegen_neuron_cpp_visitor.cpp.

@@ -4163,7 +4125,7 @@

Definition at line 1763 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 1757 of file codegen_neuron_cpp_visitor.cpp.

@@ -4192,7 +4154,7 @@

Definition at line 1107 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 1101 of file codegen_neuron_cpp_visitor.cpp.

@@ -4220,7 +4182,7 @@

Definition at line 1871 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 1865 of file codegen_neuron_cpp_visitor.cpp.

@@ -4251,7 +4213,7 @@

nmodl::codegen::CodegenCppVisitor.

-

Definition at line 2148 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 2142 of file codegen_neuron_cpp_visitor.cpp.

@@ -4282,7 +4244,7 @@

nmodl::codegen::CodegenCppVisitor.

-

Definition at line 2109 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 2103 of file codegen_neuron_cpp_visitor.cpp.

@@ -4309,7 +4271,7 @@

-

Definition at line 2102 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 2096 of file codegen_neuron_cpp_visitor.cpp.

@@ -4341,7 +4303,7 @@

nmodl::codegen::CodegenCppVisitor.

-

Definition at line 2495 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 2489 of file codegen_neuron_cpp_visitor.cpp.

@@ -4380,7 +4342,7 @@

nmodl::codegen::CodegenCppVisitor.

-

Definition at line 2384 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 2378 of file codegen_neuron_cpp_visitor.cpp.

@@ -4418,7 +4380,7 @@

nmodl::codegen::CodegenCppVisitor.

-

Definition at line 2456 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 2450 of file codegen_neuron_cpp_visitor.cpp.

@@ -4450,7 +4412,7 @@

nmodl::codegen::CodegenCppVisitor.

-

Definition at line 2422 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 2416 of file codegen_neuron_cpp_visitor.cpp.

@@ -4489,7 +4451,7 @@

nmodl::codegen::CodegenCppVisitor.

-

Definition at line 2365 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 2359 of file codegen_neuron_cpp_visitor.cpp.

@@ -4520,7 +4482,7 @@

nmodl::codegen::CodegenCppVisitor.

-

Definition at line 2128 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 2122 of file codegen_neuron_cpp_visitor.cpp.

@@ -4547,7 +4509,7 @@

-

Definition at line 2124 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 2118 of file codegen_neuron_cpp_visitor.cpp.

@@ -4583,7 +4545,7 @@

Definition at line 2039 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 2033 of file codegen_neuron_cpp_visitor.cpp.

@@ -4612,7 +4574,7 @@

Definition at line 2072 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 2066 of file codegen_neuron_cpp_visitor.cpp.

@@ -4644,7 +4606,7 @@

nmodl::codegen::CodegenCppVisitor.

-

Definition at line 2286 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 2280 of file codegen_neuron_cpp_visitor.cpp.

@@ -4673,7 +4635,7 @@

Definition at line 102 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 96 of file codegen_neuron_cpp_visitor.cpp.

@@ -4708,7 +4670,7 @@

nmodl::codegen::CodegenCppVisitor.

-

Definition at line 1118 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 1112 of file codegen_neuron_cpp_visitor.cpp.

@@ -4737,7 +4699,7 @@

Definition at line 192 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 186 of file codegen_neuron_cpp_visitor.cpp.

@@ -4768,7 +4730,7 @@

nmodl::codegen::CodegenCppVisitor.

-

Definition at line 1091 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 1085 of file codegen_neuron_cpp_visitor.cpp.

@@ -4797,7 +4759,7 @@

Definition at line 1729 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 1723 of file codegen_neuron_cpp_visitor.cpp.

@@ -4819,7 +4781,7 @@

Definition at line 1929 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 1923 of file codegen_neuron_cpp_visitor.cpp.

@@ -4850,7 +4812,7 @@

nmodl::codegen::CodegenCppVisitor.

-

Definition at line 2629 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 2623 of file codegen_neuron_cpp_visitor.cpp.

@@ -4880,7 +4842,7 @@

Definition at line 772 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 766 of file codegen_neuron_cpp_visitor.cpp.

@@ -4921,7 +4883,7 @@

Definition at line 692 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 686 of file codegen_neuron_cpp_visitor.cpp.

@@ -4949,7 +4911,7 @@

-

Definition at line 781 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 775 of file codegen_neuron_cpp_visitor.cpp.

@@ -4979,7 +4941,7 @@

Definition at line 846 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 840 of file codegen_neuron_cpp_visitor.cpp.

@@ -5009,7 +4971,7 @@

Definition at line 852 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 846 of file codegen_neuron_cpp_visitor.cpp.

@@ -5041,7 +5003,7 @@

nmodl::codegen::CodegenCppVisitor.

-

Definition at line 826 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 820 of file codegen_neuron_cpp_visitor.cpp.

@@ -5148,7 +5110,7 @@

Definition at line 950 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 944 of file codegen_neuron_cpp_visitor.cpp.

@@ -5177,7 +5139,7 @@

Definition at line 620 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 614 of file codegen_neuron_cpp_visitor.cpp.

@@ -5209,7 +5171,7 @@

nmodl::visitor::ConstVisitor.

-

Definition at line 3021 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 3015 of file codegen_neuron_cpp_visitor.cpp.

@@ -5241,7 +5203,7 @@

nmodl::visitor::ConstVisitor.

-

Definition at line 3017 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 3011 of file codegen_neuron_cpp_visitor.cpp.

@@ -5273,7 +5235,7 @@

nmodl::visitor::ConstVisitor.

-

Definition at line 3012 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 3006 of file codegen_neuron_cpp_visitor.cpp.

@@ -5305,7 +5267,7 @@

nmodl::visitor::ConstVisitor.

-

Definition at line 810 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 804 of file codegen_neuron_cpp_visitor.cpp.

@@ -5337,7 +5299,7 @@

nmodl::visitor::ConstVisitor.

-

Definition at line 3008 of file codegen_neuron_cpp_visitor.cpp.

+

Definition at line 3002 of file codegen_neuron_cpp_visitor.cpp.

diff --git a/doxygen/classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.js b/doxygen/classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.js index a83288e43..42bc0f7b3 100644 --- a/doxygen/classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.js +++ b/doxygen/classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.js @@ -35,7 +35,6 @@ var classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor = [ "optimize_ion_variable_copies", "classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a70bd9cedc2fcae2e924ebcc59c7f728b", null ], [ "position_of_float_var", "classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#afdd6466ebac569ec670c3b6f4ca11d3e", null ], [ "position_of_int_var", "classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a8c348f1869653cec3dcc39b1866bab97", null ], - [ "print_atomic_reduction_pragma", "classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a910f9f22e6fbdae4eefae177eb8910f9", null ], [ "print_check_table_entrypoint", "classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a389587ac35ce1f02ced547e3c8698241", null ], [ "print_codegen_routines", "classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a9f9d3aebd2dc5bbc05e0cb7e9a707c7f", null ], [ "print_codegen_routines_nothing", "classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a63c12682de4f91faa14cc743ec4def84", null ], diff --git a/doxygen/classnmodl_1_1visitor_1_1_const_visitor.html b/doxygen/classnmodl_1_1visitor_1_1_const_visitor.html index 4c54f0b97..952188bb2 100644 --- a/doxygen/classnmodl_1_1visitor_1_1_const_visitor.html +++ b/doxygen/classnmodl_1_1visitor_1_1_const_visitor.html @@ -3261,7 +3261,7 @@

ast::ProtectStatement

-

Implemented in nmodl::codegen::CodegenCppVisitor, nmodl::visitor::test::CheckParentVisitor, nmodl::visitor::ConstAstVisitor, nmodl::visitor::JSONVisitor, nmodl::visitor::NmodlPrintVisitor, and nmodl::visitor::SemanticAnalysisVisitor.

+

Implemented in nmodl::codegen::CodegenCoreneuronCppVisitor, nmodl::visitor::test::CheckParentVisitor, nmodl::visitor::ConstAstVisitor, nmodl::visitor::JSONVisitor, nmodl::visitor::NmodlPrintVisitor, and nmodl::visitor::SemanticAnalysisVisitor.

diff --git a/doxygen/codegen__coreneuron__cpp__visitor_8hpp_source.html b/doxygen/codegen__coreneuron__cpp__visitor_8hpp_source.html index c656f35d9..e4e4a69c0 100644 --- a/doxygen/codegen__coreneuron__cpp__visitor_8hpp_source.html +++ b/doxygen/codegen__coreneuron__cpp__visitor_8hpp_source.html @@ -326,7 +326,7 @@
230  /**
231  * Print atomic update pragma for reduction statements
232  */
-
233  void print_atomic_reduction_pragma() override;
+
233  virtual void print_atomic_reduction_pragma();
234 
235 
236  /**
@@ -1038,35 +1038,36 @@
942  void visit_for_netcon(const ast::ForNetcon& node) override;
943  void visit_verbatim(const ast::Verbatim& node) override;
944  void visit_watch_statement(const ast::WatchStatement& node) override;
-
945 
-
946  ParamVector functor_params() override;
-
947 
-
948  public:
-
949  /****************************************************************************************/
-
950  /* Public printing routines for code generation for use in unit tests */
-
951  /****************************************************************************************/
-
952 
-
953 
-
954  /**
-
955  * Print the function that initialize instance structure
-
956  */
- -
958 
-
959 
-
960  /**
-
961  * Print the structure that wraps all range and int variables required for the NMODL
-
962  *
-
963  * \param print_initializers Whether or not default values for variables
-
964  * be included in the struct declaration.
-
965  */
-
966  void print_mechanism_range_var_structure(bool print_initializers) override;
-
967 };
-
968 
-
969 
-
970 /** \} */ // end of codegen_backends
-
971 
-
972 } // namespace codegen
-
973 } // namespace nmodl
+
945  void visit_protect_statement(const ast::ProtectStatement& node) override;
+
946 
+
947  ParamVector functor_params() override;
+
948 
+
949  public:
+
950  /****************************************************************************************/
+
951  /* Public printing routines for code generation for use in unit tests */
+
952  /****************************************************************************************/
+
953 
+
954 
+
955  /**
+
956  * Print the function that initialize instance structure
+
957  */
+ +
959 
+
960 
+
961  /**
+
962  * Print the structure that wraps all range and int variables required for the NMODL
+
963  *
+
964  * \param print_initializers Whether or not default values for variables
+
965  * be included in the struct declaration.
+
966  */
+
967  void print_mechanism_range_var_structure(bool print_initializers) override;
+
968 };
+
969 
+
970 
+
971 /** \} */ // end of codegen_backends
+
972 
+
973 } // namespace codegen
+
974 } // namespace nmodl
void print_coreneuron_includes()
Print includes from coreneuron.
@@ -1082,6 +1083,7 @@
std::string process_verbatim_text(std::string const &text)
Process a verbatim block for possible variable renaming.
void print_v_unused() const override
Set v_unused (voltage) for NRN_PRCELLSTATE feature.
void print_derivimplicit_kernel(const ast::Block &block)
Print derivative kernel when derivimplicit method is used.
+
void visit_protect_statement(const ast::ProtectStatement &node) override
visit node of type ast::ProtectStatement
virtual void print_device_stream_wait() const
Print the code to synchronise/wait on stream specific to NrnThread.
virtual void print_instance_struct_delete_from_device()
Delete the instance struct from the device.
virtual void print_net_send_buf_count_update_to_device() const
Print the code to update NetSendBuffer_t count from host to device.
@@ -1116,7 +1118,6 @@
void print_send_event_move()
Print send event move block used in net receive as well as watch.
void append_conc_write_statements(std::vector< ShadowUseStatement > &statements, const Ion &ion, const std::string &concentration) override
Generate Function call statement for nrn_wrote_conc.
-
void print_atomic_reduction_pragma() override
Print atomic update pragma for reduction statements.
virtual void print_instance_struct_copy_to_device()
Transfer the instance struct to the device.
void print_global_variables_for_hoc() override
Print byte arrays that register scalar and vector variables for hoc interface.
void print_net_receive_common_code(const ast::Block &node, bool need_mech_inst=true)
Print the common code section for net receive related methods.
@@ -1144,6 +1145,7 @@
virtual void print_before_after_block(const ast::Block *node, size_t block_id)
Print NMODL before / after block in target backend code.
Represents a BREAKPOINT block in NMODL.
+
void print_ion_variable() override
Print the ion variable struct.
Helper class for printing C/C++ code.
void print_ion_var_structure()
Print structure of ion variables used for local copies.
@@ -1212,6 +1214,7 @@
void add_variable_point_process(std::vector< IndexVariableInfo > &variables) override
Add the variable point_process during get_int_variables.
void print_codegen_routines() override
Print entry point to code generation.
+
virtual void print_atomic_reduction_pragma()
Print atomic update pragma for reduction statements.
virtual void print_net_send_buffering_grow()
Print statement that grows NetSendBuffering_t structure if needed.
virtual void print_net_send_buf_update_to_host() const
Print the code to update NetSendBuffer_t from device to host.
void print_data_structures(bool print_initializers) override
Print all classes.
diff --git a/doxygen/codegen__cpp__visitor_8cpp_source.html b/doxygen/codegen__cpp__visitor_8cpp_source.html index 28ac13d8e..682a2eab1 100644 --- a/doxygen/codegen__cpp__visitor_8cpp_source.html +++ b/doxygen/codegen__cpp__visitor_8cpp_source.html @@ -1202,693 +1202,685 @@
1106 }
1107 
1108 
- -
1110  print_atomic_reduction_pragma();
+ +
1110  printer->fmt_line("#pragma omp critical ({})", info.mod_suffix);
1111  printer->add_indent();
-
1112  node.get_expression()->accept(*this);
-
1113  printer->add_text(";");
-
1114 }
+
1112  printer->push_block();
+
1113 }
+
1114 
1115 
-
1116 
- -
1118  printer->fmt_line("#pragma omp critical ({})", info.mod_suffix);
-
1119  printer->add_indent();
-
1120  printer->push_block();
-
1121 }
-
1122 
-
1123 
- -
1125  printer->pop_block();
-
1126 }
-
1127 
-
1128 
- -
1130  auto block = node.get_node_to_solve().get();
-
1131  if (block->is_statement_block()) {
-
1132  auto statement_block = dynamic_cast<ast::StatementBlock*>(block);
-
1133  print_statement_block(*statement_block, false, false);
-
1134  } else {
-
1135  block->accept(*this);
-
1136  }
-
1137 }
-
1138 
-
1139 
- -
1141  // solution vector to store copy of state vars for Newton solver
-
1142  printer->add_newline();
-
1143 
-
1144  auto float_type = default_float_data_type();
-
1145  int N = node.get_n_state_vars()->get_value();
-
1146  printer->fmt_line("Eigen::Matrix<{}, {}, 1> nmodl_eigen_xm;", float_type, N);
-
1147  printer->fmt_line("{}* nmodl_eigen_x = nmodl_eigen_xm.data();", float_type);
-
1148 
-
1149  print_statement_block(*node.get_setup_x_block(), false, false);
-
1150 
-
1151  // call newton solver with functor and X matrix that contains state vars
-
1152  printer->add_line("// call newton solver");
-
1153  printer->fmt_line("{} newton_functor({});",
-
1154  info.functor_names[&node],
-
1155  get_arg_str(functor_params()));
-
1156  printer->add_line("newton_functor.initialize();");
-
1157  printer->add_line(
-
1158  "int newton_iterations = nmodl::newton::newton_solver(nmodl_eigen_xm, newton_functor);");
-
1159  printer->add_line(
-
1160  "if (newton_iterations < 0) assert(false && \"Newton solver did not converge!\");");
-
1161 
-
1162  // assign newton solver results in matrix X to state vars
-
1163  print_statement_block(*node.get_update_states_block(), false, false);
-
1164  printer->add_line("newton_functor.initialize(); // TODO mimic calling F again.");
-
1165  printer->add_line("newton_functor.finalize();");
-
1166 }
-
1167 
-
1168 
- -
1170  printer->add_newline();
-
1171 
-
1172  const std::string float_type = default_float_data_type();
-
1173  int N = node.get_n_state_vars()->get_value();
-
1174  printer->fmt_line("Eigen::Matrix<{0}, {1}, 1> nmodl_eigen_xm, nmodl_eigen_fm;", float_type, N);
-
1175  printer->fmt_line("Eigen::Matrix<{0}, {1}, {1}> nmodl_eigen_jm;", float_type, N);
-
1176  if (N <= 4) {
-
1177  printer->fmt_line("Eigen::Matrix<{0}, {1}, {1}> nmodl_eigen_jm_inv;", float_type, N);
-
1178  }
-
1179  printer->fmt_line("{}* nmodl_eigen_x = nmodl_eigen_xm.data();", float_type);
-
1180  printer->fmt_line("{}* nmodl_eigen_j = nmodl_eigen_jm.data();", float_type);
-
1181  printer->fmt_line("{}* nmodl_eigen_f = nmodl_eigen_fm.data();", float_type);
-
1182  print_statement_block(*node.get_variable_block(), false, false);
-
1183  print_statement_block(*node.get_initialize_block(), false, false);
-
1184  print_statement_block(*node.get_setup_x_block(), false, false);
+ +
1117  printer->pop_block();
+
1118 }
+
1119 
+
1120 
+ +
1122  auto block = node.get_node_to_solve().get();
+
1123  if (block->is_statement_block()) {
+
1124  auto statement_block = dynamic_cast<ast::StatementBlock*>(block);
+
1125  print_statement_block(*statement_block, false, false);
+
1126  } else {
+
1127  block->accept(*this);
+
1128  }
+
1129 }
+
1130 
+
1131 
+ +
1133  // solution vector to store copy of state vars for Newton solver
+
1134  printer->add_newline();
+
1135 
+
1136  auto float_type = default_float_data_type();
+
1137  int N = node.get_n_state_vars()->get_value();
+
1138  printer->fmt_line("Eigen::Matrix<{}, {}, 1> nmodl_eigen_xm;", float_type, N);
+
1139  printer->fmt_line("{}* nmodl_eigen_x = nmodl_eigen_xm.data();", float_type);
+
1140 
+
1141  print_statement_block(*node.get_setup_x_block(), false, false);
+
1142 
+
1143  // call newton solver with functor and X matrix that contains state vars
+
1144  printer->add_line("// call newton solver");
+
1145  printer->fmt_line("{} newton_functor({});",
+
1146  info.functor_names[&node],
+
1147  get_arg_str(functor_params()));
+
1148  printer->add_line("newton_functor.initialize();");
+
1149  printer->add_line(
+
1150  "int newton_iterations = nmodl::newton::newton_solver(nmodl_eigen_xm, newton_functor);");
+
1151  printer->add_line(
+
1152  "if (newton_iterations < 0) assert(false && \"Newton solver did not converge!\");");
+
1153 
+
1154  // assign newton solver results in matrix X to state vars
+
1155  print_statement_block(*node.get_update_states_block(), false, false);
+
1156  printer->add_line("newton_functor.initialize(); // TODO mimic calling F again.");
+
1157  printer->add_line("newton_functor.finalize();");
+
1158 }
+
1159 
+
1160 
+ +
1162  printer->add_newline();
+
1163 
+
1164  const std::string float_type = default_float_data_type();
+
1165  int N = node.get_n_state_vars()->get_value();
+
1166  printer->fmt_line("Eigen::Matrix<{0}, {1}, 1> nmodl_eigen_xm, nmodl_eigen_fm;", float_type, N);
+
1167  printer->fmt_line("Eigen::Matrix<{0}, {1}, {1}> nmodl_eigen_jm;", float_type, N);
+
1168  if (N <= 4) {
+
1169  printer->fmt_line("Eigen::Matrix<{0}, {1}, {1}> nmodl_eigen_jm_inv;", float_type, N);
+
1170  }
+
1171  printer->fmt_line("{}* nmodl_eigen_x = nmodl_eigen_xm.data();", float_type);
+
1172  printer->fmt_line("{}* nmodl_eigen_j = nmodl_eigen_jm.data();", float_type);
+
1173  printer->fmt_line("{}* nmodl_eigen_f = nmodl_eigen_fm.data();", float_type);
+
1174  print_statement_block(*node.get_variable_block(), false, false);
+
1175  print_statement_block(*node.get_initialize_block(), false, false);
+
1176  print_statement_block(*node.get_setup_x_block(), false, false);
+
1177 
+
1178  printer->add_newline();
+
1179  print_eigen_linear_solver(float_type, N);
+
1180  printer->add_newline();
+
1181 
+
1182  print_statement_block(*node.get_update_states_block(), false, false);
+
1183  print_statement_block(*node.get_finalize_block(), false, false);
+
1184 }
1185 
-
1186  printer->add_newline();
-
1187  print_eigen_linear_solver(float_type, N);
-
1188  printer->add_newline();
-
1189 
-
1190  print_statement_block(*node.get_update_states_block(), false, false);
-
1191  print_statement_block(*node.get_finalize_block(), false, false);
-
1192 }
-
1193 
-
1194 
-
1195 /**
-
1196  * \details Once variables are populated, update index semantics to register with coreneuron
-
1197  */
-
1198 // NOLINTNEXTLINE(readability-function-cognitive-complexity)
- -
1200  int index = 0;
-
1201  info.semantics.clear();
-
1202 
-
1203  if (info.point_process) {
-
1204  info.semantics.emplace_back(index++, naming::AREA_SEMANTIC, 1);
-
1205  info.semantics.emplace_back(index++, naming::POINT_PROCESS_SEMANTIC, 1);
-
1206  }
-
1207  for (const auto& ion: info.ions) {
-
1208  for (auto i = 0; i < ion.reads.size(); ++i) {
-
1209  info.semantics.emplace_back(index++, ion.name + "_ion", 1);
-
1210  }
-
1211  for (const auto& var: ion.writes) {
-
1212  /// add if variable is not present in the read list
-
1213  if (std::find(ion.reads.begin(), ion.reads.end(), var) == ion.reads.end()) {
-
1214  info.semantics.emplace_back(index++, ion.name + "_ion", 1);
-
1215  }
-
1216  if (ion.is_ionic_current(var)) {
-
1217  info.semantics.emplace_back(index++, ion.name + "_ion", 1);
-
1218  }
-
1219  }
-
1220  if (ion.need_style) {
-
1221  info.semantics.emplace_back(index++, fmt::format("{}_ion", ion.name), 1);
-
1222  info.semantics.emplace_back(index++, fmt::format("#{}_ion", ion.name), 1);
-
1223  }
-
1224  }
-
1225  for (auto& var: info.pointer_variables) {
-
1226  if (info.first_pointer_var_index == -1) {
-
1227  info.first_pointer_var_index = index;
-
1228  }
-
1229  int size = var->get_length();
-
1230  if (var->has_any_property(NmodlType::pointer_var)) {
-
1231  info.semantics.emplace_back(index, naming::POINTER_SEMANTIC, size);
-
1232  } else {
-
1233  info.semantics.emplace_back(index, naming::CORE_POINTER_SEMANTIC, size);
-
1234  }
-
1235  index += size;
-
1236  }
-
1237 
-
1238  for (auto& var: info.random_variables) {
-
1239  if (info.first_random_var_index == -1) {
-
1240  info.first_random_var_index = index;
-
1241  }
-
1242  int size = var->get_length();
-
1243  info.semantics.emplace_back(index, naming::RANDOM_SEMANTIC, size);
-
1244  index += size;
+
1186 
+
1187 /**
+
1188  * \details Once variables are populated, update index semantics to register with coreneuron
+
1189  */
+
1190 // NOLINTNEXTLINE(readability-function-cognitive-complexity)
+ +
1192  int index = 0;
+
1193  info.semantics.clear();
+
1194 
+
1195  if (info.point_process) {
+
1196  info.semantics.emplace_back(index++, naming::AREA_SEMANTIC, 1);
+
1197  info.semantics.emplace_back(index++, naming::POINT_PROCESS_SEMANTIC, 1);
+
1198  }
+
1199  for (const auto& ion: info.ions) {
+
1200  for (auto i = 0; i < ion.reads.size(); ++i) {
+
1201  info.semantics.emplace_back(index++, ion.name + "_ion", 1);
+
1202  }
+
1203  for (const auto& var: ion.writes) {
+
1204  /// add if variable is not present in the read list
+
1205  if (std::find(ion.reads.begin(), ion.reads.end(), var) == ion.reads.end()) {
+
1206  info.semantics.emplace_back(index++, ion.name + "_ion", 1);
+
1207  }
+
1208  if (ion.is_ionic_current(var)) {
+
1209  info.semantics.emplace_back(index++, ion.name + "_ion", 1);
+
1210  }
+
1211  }
+
1212  if (ion.need_style) {
+
1213  info.semantics.emplace_back(index++, fmt::format("{}_ion", ion.name), 1);
+
1214  info.semantics.emplace_back(index++, fmt::format("#{}_ion", ion.name), 1);
+
1215  }
+
1216  }
+
1217  for (auto& var: info.pointer_variables) {
+
1218  if (info.first_pointer_var_index == -1) {
+
1219  info.first_pointer_var_index = index;
+
1220  }
+
1221  int size = var->get_length();
+
1222  if (var->has_any_property(NmodlType::pointer_var)) {
+
1223  info.semantics.emplace_back(index, naming::POINTER_SEMANTIC, size);
+
1224  } else {
+
1225  info.semantics.emplace_back(index, naming::CORE_POINTER_SEMANTIC, size);
+
1226  }
+
1227  index += size;
+
1228  }
+
1229 
+
1230  for (auto& var: info.random_variables) {
+
1231  if (info.first_random_var_index == -1) {
+
1232  info.first_random_var_index = index;
+
1233  }
+
1234  int size = var->get_length();
+
1235  info.semantics.emplace_back(index, naming::RANDOM_SEMANTIC, size);
+
1236  index += size;
+
1237  }
+
1238 
+
1239  if (info.diam_used) {
+
1240  info.semantics.emplace_back(index++, naming::DIAM_VARIABLE, 1);
+
1241  }
+
1242 
+
1243  if (info.area_used) {
+
1244  info.semantics.emplace_back(index++, naming::AREA_VARIABLE, 1);
1245  }
1246 
-
1247  if (info.diam_used) {
-
1248  info.semantics.emplace_back(index++, naming::DIAM_VARIABLE, 1);
+
1247  if (info.net_send_used) {
+
1248  info.semantics.emplace_back(index++, naming::NET_SEND_SEMANTIC, 1);
1249  }
1250 
-
1251  if (info.area_used) {
-
1252  info.semantics.emplace_back(index++, naming::AREA_VARIABLE, 1);
-
1253  }
-
1254 
-
1255  if (info.net_send_used) {
-
1256  info.semantics.emplace_back(index++, naming::NET_SEND_SEMANTIC, 1);
-
1257  }
-
1258 
-
1259  /*
-
1260  * Number of semantics for watch is one greater than number of
-
1261  * actual watch statements in the mod file
-
1262  */
-
1263  if (!info.watch_statements.empty()) {
-
1264  for (int i = 0; i < info.watch_statements.size() + 1; i++) {
-
1265  info.semantics.emplace_back(index++, naming::WATCH_SEMANTIC, 1);
-
1266  }
-
1267  }
-
1268 
-
1269  if (info.for_netcon_used) {
-
1270  info.semantics.emplace_back(index++, naming::FOR_NETCON_SEMANTIC, 1);
-
1271  }
-
1272 }
-
1273 
-
1274 
-
1275 std::vector<CodegenCppVisitor::SymbolType> CodegenCppVisitor::get_float_variables() const {
-
1276  // sort with definition order
-
1277  auto comparator = [](const SymbolType& first, const SymbolType& second) -> bool {
-
1278  return first->get_definition_order() < second->get_definition_order();
-
1279  };
-
1280 
-
1281  auto assigned = info.assigned_vars;
-
1282  auto states = info.state_vars;
-
1283 
-
1284  // each state variable has corresponding Dstate variable
-
1285  for (const auto& state: states) {
-
1286  auto name = "D" + state->get_name();
-
1287  auto symbol = make_symbol(name);
-
1288  if (state->is_array()) {
-
1289  symbol->set_as_array(state->get_length());
-
1290  }
-
1291  symbol->set_definition_order(state->get_definition_order());
-
1292  assigned.push_back(symbol);
-
1293  }
-
1294  std::sort(assigned.begin(), assigned.end(), comparator);
-
1295 
-
1296  auto variables = info.range_parameter_vars;
-
1297  variables.insert(variables.end(),
-
1298  info.range_assigned_vars.begin(),
-
1299  info.range_assigned_vars.end());
-
1300  variables.insert(variables.end(), info.range_state_vars.begin(), info.range_state_vars.end());
-
1301 
-
1302  for (const auto& v: assigned) {
-
1303  auto it = std::find_if(info.external_variables.begin(),
-
1304  info.external_variables.end(),
-
1305  [&v](auto it) { return it->get_name() == get_name(v); });
-
1306 
-
1307  if (it == info.external_variables.end()) {
-
1308  variables.push_back(v);
-
1309  }
-
1310  }
+
1251  /*
+
1252  * Number of semantics for watch is one greater than number of
+
1253  * actual watch statements in the mod file
+
1254  */
+
1255  if (!info.watch_statements.empty()) {
+
1256  for (int i = 0; i < info.watch_statements.size() + 1; i++) {
+
1257  info.semantics.emplace_back(index++, naming::WATCH_SEMANTIC, 1);
+
1258  }
+
1259  }
+
1260 
+
1261  if (info.for_netcon_used) {
+
1262  info.semantics.emplace_back(index++, naming::FOR_NETCON_SEMANTIC, 1);
+
1263  }
+
1264 }
+
1265 
+
1266 
+
1267 std::vector<CodegenCppVisitor::SymbolType> CodegenCppVisitor::get_float_variables() const {
+
1268  // sort with definition order
+
1269  auto comparator = [](const SymbolType& first, const SymbolType& second) -> bool {
+
1270  return first->get_definition_order() < second->get_definition_order();
+
1271  };
+
1272 
+
1273  auto assigned = info.assigned_vars;
+
1274  auto states = info.state_vars;
+
1275 
+
1276  // each state variable has corresponding Dstate variable
+
1277  for (const auto& state: states) {
+
1278  auto name = "D" + state->get_name();
+
1279  auto symbol = make_symbol(name);
+
1280  if (state->is_array()) {
+
1281  symbol->set_as_array(state->get_length());
+
1282  }
+
1283  symbol->set_definition_order(state->get_definition_order());
+
1284  assigned.push_back(symbol);
+
1285  }
+
1286  std::sort(assigned.begin(), assigned.end(), comparator);
+
1287 
+
1288  auto variables = info.range_parameter_vars;
+
1289  variables.insert(variables.end(),
+
1290  info.range_assigned_vars.begin(),
+
1291  info.range_assigned_vars.end());
+
1292  variables.insert(variables.end(), info.range_state_vars.begin(), info.range_state_vars.end());
+
1293 
+
1294  for (const auto& v: assigned) {
+
1295  auto it = std::find_if(info.external_variables.begin(),
+
1296  info.external_variables.end(),
+
1297  [&v](auto it) { return it->get_name() == get_name(v); });
+
1298 
+
1299  if (it == info.external_variables.end()) {
+
1300  variables.push_back(v);
+
1301  }
+
1302  }
+
1303 
+
1304  if (needs_v_unused()) {
+
1305  variables.push_back(make_symbol(naming::VOLTAGE_UNUSED_VARIABLE));
+
1306  }
+
1307 
+
1308  if (breakpoint_exist()) {
+
1309  std::string name = info.vectorize ? naming::CONDUCTANCE_UNUSED_VARIABLE
+
1311 
-
1312  if (needs_v_unused()) {
-
1313  variables.push_back(make_symbol(naming::VOLTAGE_UNUSED_VARIABLE));
-
1314  }
-
1315 
-
1316  if (breakpoint_exist()) {
-
1317  std::string name = info.vectorize ? naming::CONDUCTANCE_UNUSED_VARIABLE
- -
1319 
-
1320  // make sure conductance variable like `g` is not already defined
-
1321  if (auto r = std::find_if(variables.cbegin(),
-
1322  variables.cend(),
-
1323  [&](const auto& s) { return name == s->get_name(); });
-
1324  r == variables.cend()) {
-
1325  variables.push_back(make_symbol(name));
-
1326  }
-
1327  }
-
1328 
-
1329  if (net_receive_exist()) {
-
1330  variables.push_back(make_symbol(naming::T_SAVE_VARIABLE));
-
1331  }
-
1332 
-
1333  return variables;
-
1334 }
-
1335 
-
1336 
-
1337 /**
-
1338  * IndexVariableInfo has following constructor arguments:
-
1339  * - symbol
-
1340  * - is_vdata (false)
-
1341  * - is_index (false
-
1342  * - is_integer (false)
-
1343  *
-
1344  * Which variables are constant qualified?
-
1345  *
-
1346  * - node area is read only
-
1347  * - read ion variables are read only
-
1348  * - style_ionname is index / offset
-
1349  */
-
1350 // NOLINTNEXTLINE(readability-function-cognitive-complexity)
-
1351 std::vector<IndexVariableInfo> CodegenCppVisitor::get_int_variables() {
-
1352  std::vector<IndexVariableInfo> variables;
-
1353  if (info.point_process) {
-
1354  variables.emplace_back(make_symbol(naming::NODE_AREA_VARIABLE));
-
1355  variables.back().is_constant = true;
-
1356 
-
1357  add_variable_point_process(variables);
-
1358  }
-
1359 
-
1360  for (auto& ion: info.ions) {
-
1361  bool need_style = false;
-
1362  std::unordered_map<std::string, int> ion_vars; // used to keep track of the variables to
-
1363  // not have doubles between read/write. Same
-
1364  // name variables are allowed
-
1365  // See if we need to add extra readion statements to match NEURON with SoA data
-
1366  auto const has_var = [&ion](const char* suffix) -> bool {
-
1367  auto const pred = [name = ion.name + suffix](auto const& x) { return x == name; };
-
1368  return std::any_of(ion.reads.begin(), ion.reads.end(), pred) ||
-
1369  std::any_of(ion.writes.begin(), ion.writes.end(), pred);
-
1370  };
-
1371  auto const add_implicit_read = [&ion](const char* suffix) {
-
1372  auto name = ion.name + suffix;
-
1373  ion.reads.push_back(name);
-
1374  ion.implicit_reads.push_back(std::move(name));
-
1375  };
-
1376  bool const have_ionin{has_var("i")}, have_ionout{has_var("o")};
-
1377  if (have_ionin && !have_ionout) {
-
1378  add_implicit_read("o");
-
1379  } else if (have_ionout && !have_ionin) {
-
1380  add_implicit_read("i");
-
1381  }
-
1382  for (const auto& var: ion.reads) {
-
1383  const std::string name = naming::ION_VARNAME_PREFIX + var;
-
1384  variables.emplace_back(make_symbol(name));
-
1385  variables.back().is_constant = true;
-
1386  ion_vars[name] = static_cast<int>(variables.size() - 1);
-
1387  }
-
1388 
-
1389  /// symbol for di_ion_dv var
-
1390  std::shared_ptr<symtab::Symbol> ion_di_dv_var = nullptr;
-
1391 
-
1392  for (const auto& var: ion.writes) {
-
1393  const std::string name = naming::ION_VARNAME_PREFIX + var;
-
1394 
-
1395  const auto ion_vars_it = ion_vars.find(name);
-
1396  if (ion_vars_it != ion_vars.end()) {
-
1397  variables[ion_vars_it->second].is_constant = false;
-
1398  } else {
-
1399  variables.emplace_back(make_symbol(naming::ION_VARNAME_PREFIX + var));
-
1400  }
-
1401  if (ion.is_ionic_current(var)) {
-
1402  ion_di_dv_var = make_symbol(std::string(naming::ION_VARNAME_PREFIX) + "di" +
-
1403  ion.name + "dv");
-
1404  }
-
1405  if (ion.is_intra_cell_conc(var) || ion.is_extra_cell_conc(var)) {
-
1406  need_style = true;
-
1407  }
-
1408  }
-
1409 
-
1410  /// insert after read/write variables but before style ion variable
-
1411  if (ion_di_dv_var != nullptr) {
-
1412  variables.emplace_back(ion_di_dv_var);
-
1413  }
-
1414 
-
1415  if (need_style) {
-
1416  variables.emplace_back(make_symbol(naming::ION_VARNAME_PREFIX + ion.name + "_erev"));
-
1417  variables.emplace_back(make_symbol("style_" + ion.name), false, true);
-
1418  variables.back().is_constant = true;
-
1419  }
-
1420  }
-
1421 
-
1422  for (const auto& var: info.pointer_variables) {
-
1423  auto name = var->get_name();
-
1424  if (var->has_any_property(NmodlType::pointer_var)) {
-
1425  variables.emplace_back(make_symbol(name));
-
1426  } else {
-
1427  variables.emplace_back(make_symbol(name), true);
-
1428  }
-
1429  }
-
1430 
-
1431  for (const auto& var: info.random_variables) {
-
1432  auto name = var->get_name();
-
1433  variables.emplace_back(make_symbol(name), true);
-
1434  variables.back().symbol->add_properties(NmodlType::random_var);
+
1312  // make sure conductance variable like `g` is not already defined
+
1313  if (auto r = std::find_if(variables.cbegin(),
+
1314  variables.cend(),
+
1315  [&](const auto& s) { return name == s->get_name(); });
+
1316  r == variables.cend()) {
+
1317  variables.push_back(make_symbol(name));
+
1318  }
+
1319  }
+
1320 
+
1321  if (net_receive_exist()) {
+
1322  variables.push_back(make_symbol(naming::T_SAVE_VARIABLE));
+
1323  }
+
1324 
+
1325  return variables;
+
1326 }
+
1327 
+
1328 
+
1329 /**
+
1330  * IndexVariableInfo has following constructor arguments:
+
1331  * - symbol
+
1332  * - is_vdata (false)
+
1333  * - is_index (false
+
1334  * - is_integer (false)
+
1335  *
+
1336  * Which variables are constant qualified?
+
1337  *
+
1338  * - node area is read only
+
1339  * - read ion variables are read only
+
1340  * - style_ionname is index / offset
+
1341  */
+
1342 // NOLINTNEXTLINE(readability-function-cognitive-complexity)
+
1343 std::vector<IndexVariableInfo> CodegenCppVisitor::get_int_variables() {
+
1344  std::vector<IndexVariableInfo> variables;
+
1345  if (info.point_process) {
+
1346  variables.emplace_back(make_symbol(naming::NODE_AREA_VARIABLE));
+
1347  variables.back().is_constant = true;
+
1348 
+
1349  add_variable_point_process(variables);
+
1350  }
+
1351 
+
1352  for (auto& ion: info.ions) {
+
1353  bool need_style = false;
+
1354  std::unordered_map<std::string, int> ion_vars; // used to keep track of the variables to
+
1355  // not have doubles between read/write. Same
+
1356  // name variables are allowed
+
1357  // See if we need to add extra readion statements to match NEURON with SoA data
+
1358  auto const has_var = [&ion](const char* suffix) -> bool {
+
1359  auto const pred = [name = ion.name + suffix](auto const& x) { return x == name; };
+
1360  return std::any_of(ion.reads.begin(), ion.reads.end(), pred) ||
+
1361  std::any_of(ion.writes.begin(), ion.writes.end(), pred);
+
1362  };
+
1363  auto const add_implicit_read = [&ion](const char* suffix) {
+
1364  auto name = ion.name + suffix;
+
1365  ion.reads.push_back(name);
+
1366  ion.implicit_reads.push_back(std::move(name));
+
1367  };
+
1368  bool const have_ionin{has_var("i")}, have_ionout{has_var("o")};
+
1369  if (have_ionin && !have_ionout) {
+
1370  add_implicit_read("o");
+
1371  } else if (have_ionout && !have_ionin) {
+
1372  add_implicit_read("i");
+
1373  }
+
1374  for (const auto& var: ion.reads) {
+
1375  const std::string name = naming::ION_VARNAME_PREFIX + var;
+
1376  variables.emplace_back(make_symbol(name));
+
1377  variables.back().is_constant = true;
+
1378  ion_vars[name] = static_cast<int>(variables.size() - 1);
+
1379  }
+
1380 
+
1381  /// symbol for di_ion_dv var
+
1382  std::shared_ptr<symtab::Symbol> ion_di_dv_var = nullptr;
+
1383 
+
1384  for (const auto& var: ion.writes) {
+
1385  const std::string name = naming::ION_VARNAME_PREFIX + var;
+
1386 
+
1387  const auto ion_vars_it = ion_vars.find(name);
+
1388  if (ion_vars_it != ion_vars.end()) {
+
1389  variables[ion_vars_it->second].is_constant = false;
+
1390  } else {
+
1391  variables.emplace_back(make_symbol(naming::ION_VARNAME_PREFIX + var));
+
1392  }
+
1393  if (ion.is_ionic_current(var)) {
+
1394  ion_di_dv_var = make_symbol(std::string(naming::ION_VARNAME_PREFIX) + "di" +
+
1395  ion.name + "dv");
+
1396  }
+
1397  if (ion.is_intra_cell_conc(var) || ion.is_extra_cell_conc(var)) {
+
1398  need_style = true;
+
1399  }
+
1400  }
+
1401 
+
1402  /// insert after read/write variables but before style ion variable
+
1403  if (ion_di_dv_var != nullptr) {
+
1404  variables.emplace_back(ion_di_dv_var);
+
1405  }
+
1406 
+
1407  if (need_style) {
+
1408  variables.emplace_back(make_symbol(naming::ION_VARNAME_PREFIX + ion.name + "_erev"));
+
1409  variables.emplace_back(make_symbol("style_" + ion.name), false, true);
+
1410  variables.back().is_constant = true;
+
1411  }
+
1412  }
+
1413 
+
1414  for (const auto& var: info.pointer_variables) {
+
1415  auto name = var->get_name();
+
1416  if (var->has_any_property(NmodlType::pointer_var)) {
+
1417  variables.emplace_back(make_symbol(name));
+
1418  } else {
+
1419  variables.emplace_back(make_symbol(name), true);
+
1420  }
+
1421  }
+
1422 
+
1423  for (const auto& var: info.random_variables) {
+
1424  auto name = var->get_name();
+
1425  variables.emplace_back(make_symbol(name), true);
+
1426  variables.back().symbol->add_properties(NmodlType::random_var);
+
1427  }
+
1428 
+
1429  if (info.diam_used) {
+
1430  variables.emplace_back(make_symbol(naming::DIAM_VARIABLE));
+
1431  }
+
1432 
+
1433  if (info.area_used) {
+
1434  variables.emplace_back(make_symbol(naming::AREA_VARIABLE));
1435  }
1436 
-
1437  if (info.diam_used) {
-
1438  variables.emplace_back(make_symbol(naming::DIAM_VARIABLE));
-
1439  }
-
1440 
-
1441  if (info.area_used) {
-
1442  variables.emplace_back(make_symbol(naming::AREA_VARIABLE));
-
1443  }
-
1444 
-
1445  add_variable_tqitem(variables);
-
1446 
-
1447  /**
-
1448  * \note Variables for watch statements : there is one extra variable
-
1449  * used in coreneuron compared to actual watch statements for compatibility
-
1450  * with neuron (which uses one extra Datum variable)
-
1451  */
-
1452  if (!info.watch_statements.empty()) {
-
1453  for (int i = 0; i < info.watch_statements.size() + 1; i++) {
-
1454  variables.emplace_back(make_symbol(fmt::format("watch{}", i)), false, false, true);
-
1455  }
-
1456  }
-
1457 
-
1458  if (info.for_netcon_used) {
-
1459  variables.emplace_back(make_symbol(naming::FOR_NETCON_VARIABLE), false, false, true);
-
1460  }
-
1461  return variables;
-
1462 }
+
1437  add_variable_tqitem(variables);
+
1438 
+
1439  /**
+
1440  * \note Variables for watch statements : there is one extra variable
+
1441  * used in coreneuron compared to actual watch statements for compatibility
+
1442  * with neuron (which uses one extra Datum variable)
+
1443  */
+
1444  if (!info.watch_statements.empty()) {
+
1445  for (int i = 0; i < info.watch_statements.size() + 1; i++) {
+
1446  variables.emplace_back(make_symbol(fmt::format("watch{}", i)), false, false, true);
+
1447  }
+
1448  }
+
1449 
+
1450  if (info.for_netcon_used) {
+
1451  variables.emplace_back(make_symbol(naming::FOR_NETCON_VARIABLE), false, false, true);
+
1452  }
+
1453  return variables;
+
1454 }
+
1455 
+
1456 
+ +
1458  program_symtab = node.get_symbol_table();
+
1459 
+
1460  CodegenHelperVisitor v(enable_cvode);
+
1461  info = v.analyze(node);
+
1462  info.mod_file = mod_filename;
1463 
-
1464 
- -
1466  program_symtab = node.get_symbol_table();
-
1467 
-
1468  CodegenHelperVisitor v(enable_cvode);
-
1469  info = v.analyze(node);
-
1470  info.mod_file = mod_filename;
+
1464  if (info.mod_suffix == "") {
+
1465  info.mod_suffix = std::filesystem::path(mod_filename).stem().string();
+
1466  }
+
1467  info.rsuffix = info.point_process ? "" : "_" + info.mod_suffix;
+
1468  if (info.mod_suffix == "nothing") {
+
1469  info.rsuffix = "";
+
1470  }
1471 
-
1472  if (info.mod_suffix == "") {
-
1473  info.mod_suffix = std::filesystem::path(mod_filename).stem().string();
+
1472  if (!info.vectorize) {
+
1473  logger->warn("CodegenCppVisitor : MOD file uses non-thread safe constructs of NMODL");
1474  }
-
1475  info.rsuffix = info.point_process ? "" : "_" + info.mod_suffix;
-
1476  if (info.mod_suffix == "nothing") {
-
1477  info.rsuffix = "";
-
1478  }
-
1479 
-
1480  if (!info.vectorize) {
-
1481  logger->warn("CodegenCppVisitor : MOD file uses non-thread safe constructs of NMODL");
-
1482  }
+
1475 
+
1476  codegen_float_variables = get_float_variables();
+
1477  codegen_int_variables = get_int_variables();
+
1478 
+
1479  update_index_semantics();
+
1480 
+
1481  info.semantic_variable_count = int_variables_size();
+
1482 }
1483 
-
1484  codegen_float_variables = get_float_variables();
-
1485  codegen_int_variables = get_int_variables();
-
1486 
-
1487  update_index_semantics();
-
1488 
-
1489  info.semantic_variable_count = int_variables_size();
-
1490 }
-
1491 
-
1492 
- -
1494  if (type == BlockType::Initial) {
-
1495  return method_name(naming::NRN_INIT_METHOD);
-
1496  }
-
1497  if (type == BlockType::Constructor) {
-
1498  return method_name(naming::NRN_CONSTRUCTOR_METHOD);
-
1499  }
-
1500  if (type == BlockType::Destructor) {
-
1501  return method_name(naming::NRN_DESTRUCTOR_METHOD);
-
1502  }
-
1503  if (type == BlockType::State) {
-
1504  return method_name(naming::NRN_STATE_METHOD);
-
1505  }
-
1506  if (type == BlockType::Equation) {
-
1507  return method_name(naming::NRN_CUR_METHOD);
-
1508  }
-
1509  if (type == BlockType::Watch) {
-
1510  return method_name(naming::NRN_WATCH_CHECK_METHOD);
-
1511  }
-
1512  throw std::logic_error("compute_method_name not implemented");
-
1513 }
-
1514 
-
1515 
- -
1517  setup(node);
-
1518  print_codegen_routines();
-
1519 }
-
1520 
-
1521 
- -
1523  auto name = node.get_node_name();
-
1524  auto statement = get_table_statement(node);
-
1525  auto table_variables = statement->get_table_vars();
-
1526  auto with = statement->get_with()->eval();
-
1527  auto use_table_var = get_variable_name(naming::USE_TABLE_VARIABLE);
-
1528  auto tmin_name = get_variable_name("tmin_" + name);
-
1529  auto mfac_name = get_variable_name("mfac_" + name);
-
1530  auto function_name = method_name("f_" + name);
-
1531 
-
1532  printer->add_newline(2);
-
1533  print_function_declaration(node, name);
-
1534  printer->push_block();
-
1535  {
-
1536  const auto& params = node.get_parameters();
-
1537  printer->fmt_push_block("if ({} == 0)", use_table_var);
-
1538  if (node.is_procedure_block()) {
-
1539  printer->fmt_line("{}({}, {});",
-
1540  function_name,
-
1541  internal_method_arguments(),
-
1542  params[0].get()->get_node_name());
-
1543  printer->add_line("return 0;");
-
1544  } else {
-
1545  printer->fmt_line("return {}({}, {});",
-
1546  function_name,
-
1547  internal_method_arguments(),
-
1548  params[0].get()->get_node_name());
-
1549  }
-
1550  printer->pop_block();
-
1551 
-
1552  printer->fmt_line("double xi = {} * ({} - {});",
-
1553  mfac_name,
-
1554  params[0].get()->get_node_name(),
-
1555  tmin_name);
-
1556  printer->push_block("if (isnan(xi))");
-
1557  if (node.is_procedure_block()) {
-
1558  for (const auto& var: table_variables) {
-
1559  auto var_name = get_variable_name(var->get_node_name());
-
1560  auto [is_array, array_length] = check_if_var_is_array(var->get_node_name());
-
1561  if (is_array) {
-
1562  for (int j = 0; j < array_length; j++) {
-
1563  printer->fmt_line("{}[{}] = xi;", var_name, j);
-
1564  }
-
1565  } else {
-
1566  printer->fmt_line("{} = xi;", var_name);
-
1567  }
-
1568  }
-
1569  printer->add_line("return 0;");
-
1570  } else {
-
1571  printer->add_line("return xi;");
-
1572  }
-
1573  printer->pop_block();
-
1574 
-
1575  printer->fmt_push_block("if (xi <= 0. || xi >= {}.)", with);
-
1576  printer->fmt_line("int index = (xi <= 0.) ? 0 : {};", with);
-
1577  if (node.is_procedure_block()) {
-
1578  for (const auto& variable: table_variables) {
-
1579  auto var_name = variable->get_node_name();
-
1580  auto instance_name = get_variable_name(var_name);
-
1581  auto table_name = get_variable_name("t_" + var_name);
-
1582  auto [is_array, array_length] = check_if_var_is_array(var_name);
-
1583  if (is_array) {
-
1584  for (int j = 0; j < array_length; j++) {
-
1585  printer->fmt_line(
-
1586  "{}[{}] = {}[{}][index];", instance_name, j, table_name, j);
-
1587  }
-
1588  } else {
-
1589  printer->fmt_line("{} = {}[index];", instance_name, table_name);
-
1590  }
-
1591  }
-
1592  printer->add_line("return 0;");
-
1593  } else {
-
1594  auto table_name = get_variable_name("t_" + name);
-
1595  printer->fmt_line("return {}[index];", table_name);
-
1596  }
-
1597  printer->pop_block();
-
1598 
-
1599  printer->add_line("int i = int(xi);");
-
1600  printer->add_line("double theta = xi - double(i);");
-
1601  if (node.is_procedure_block()) {
-
1602  for (const auto& var: table_variables) {
-
1603  auto var_name = var->get_node_name();
-
1604  auto instance_name = get_variable_name(var_name);
-
1605  auto table_name = get_variable_name("t_" + var_name);
-
1606  auto [is_array, array_length] = check_if_var_is_array(var->get_node_name());
-
1607  if (is_array) {
-
1608  for (size_t j = 0; j < array_length; j++) {
-
1609  printer->fmt_line(
-
1610  "{0}[{1}] = {2}[{1}][i] + theta*({2}[{1}][i+1]-{2}[{1}][i]);",
-
1611  instance_name,
-
1612  j,
-
1613  table_name);
-
1614  }
-
1615  } else {
-
1616  printer->fmt_line("{0} = {1}[i] + theta*({1}[i+1]-{1}[i]);",
-
1617  instance_name,
-
1618  table_name);
-
1619  }
-
1620  }
-
1621  printer->add_line("return 0;");
-
1622  } else {
-
1623  auto table_name = get_variable_name("t_" + name);
-
1624  printer->fmt_line("return {0}[i] + theta * ({0}[i+1] - {0}[i]);", table_name);
-
1625  }
-
1626  }
-
1627  printer->pop_block();
-
1628 }
-
1629 
-
1630 
- -
1632  auto statement = get_table_statement(node);
-
1633  auto table_variables = statement->get_table_vars();
-
1634  auto depend_variables = statement->get_depend_vars();
-
1635  const auto& from = statement->get_from();
-
1636  const auto& to = statement->get_to();
-
1637  auto name = node.get_node_name();
-
1638  auto internal_params = internal_method_parameters();
-
1639  auto with = statement->get_with()->eval();
-
1640  auto use_table_var = get_variable_name(naming::USE_TABLE_VARIABLE);
-
1641  auto tmin_name = get_variable_name("tmin_" + name);
-
1642  auto mfac_name = get_variable_name("mfac_" + name);
-
1643  auto float_type = default_float_data_type();
-
1644 
-
1645  printer->add_newline(2);
-
1646  printer->fmt_push_block("void {}({})",
-
1647  table_update_function_name(name),
-
1648  get_parameter_str(internal_params));
-
1649  {
-
1650  printer->fmt_push_block("if ({} == 0)", use_table_var);
-
1651  printer->add_line("return;");
-
1652  printer->pop_block();
-
1653 
-
1654  printer->add_line("static bool make_table = true;");
-
1655  for (const auto& variable: depend_variables) {
-
1656  printer->fmt_line("static {} save_{};", float_type, variable->get_node_name());
+
1484 
+ +
1486  if (type == BlockType::Initial) {
+
1487  return method_name(naming::NRN_INIT_METHOD);
+
1488  }
+
1489  if (type == BlockType::Constructor) {
+
1490  return method_name(naming::NRN_CONSTRUCTOR_METHOD);
+
1491  }
+
1492  if (type == BlockType::Destructor) {
+
1493  return method_name(naming::NRN_DESTRUCTOR_METHOD);
+
1494  }
+
1495  if (type == BlockType::State) {
+
1496  return method_name(naming::NRN_STATE_METHOD);
+
1497  }
+
1498  if (type == BlockType::Equation) {
+
1499  return method_name(naming::NRN_CUR_METHOD);
+
1500  }
+
1501  if (type == BlockType::Watch) {
+
1502  return method_name(naming::NRN_WATCH_CHECK_METHOD);
+
1503  }
+
1504  throw std::logic_error("compute_method_name not implemented");
+
1505 }
+
1506 
+
1507 
+ +
1509  setup(node);
+
1510  print_codegen_routines();
+
1511 }
+
1512 
+
1513 
+ +
1515  auto name = node.get_node_name();
+
1516  auto statement = get_table_statement(node);
+
1517  auto table_variables = statement->get_table_vars();
+
1518  auto with = statement->get_with()->eval();
+
1519  auto use_table_var = get_variable_name(naming::USE_TABLE_VARIABLE);
+
1520  auto tmin_name = get_variable_name("tmin_" + name);
+
1521  auto mfac_name = get_variable_name("mfac_" + name);
+
1522  auto function_name = method_name("f_" + name);
+
1523 
+
1524  printer->add_newline(2);
+
1525  print_function_declaration(node, name);
+
1526  printer->push_block();
+
1527  {
+
1528  const auto& params = node.get_parameters();
+
1529  printer->fmt_push_block("if ({} == 0)", use_table_var);
+
1530  if (node.is_procedure_block()) {
+
1531  printer->fmt_line("{}({}, {});",
+
1532  function_name,
+
1533  internal_method_arguments(),
+
1534  params[0].get()->get_node_name());
+
1535  printer->add_line("return 0;");
+
1536  } else {
+
1537  printer->fmt_line("return {}({}, {});",
+
1538  function_name,
+
1539  internal_method_arguments(),
+
1540  params[0].get()->get_node_name());
+
1541  }
+
1542  printer->pop_block();
+
1543 
+
1544  printer->fmt_line("double xi = {} * ({} - {});",
+
1545  mfac_name,
+
1546  params[0].get()->get_node_name(),
+
1547  tmin_name);
+
1548  printer->push_block("if (isnan(xi))");
+
1549  if (node.is_procedure_block()) {
+
1550  for (const auto& var: table_variables) {
+
1551  auto var_name = get_variable_name(var->get_node_name());
+
1552  auto [is_array, array_length] = check_if_var_is_array(var->get_node_name());
+
1553  if (is_array) {
+
1554  for (int j = 0; j < array_length; j++) {
+
1555  printer->fmt_line("{}[{}] = xi;", var_name, j);
+
1556  }
+
1557  } else {
+
1558  printer->fmt_line("{} = xi;", var_name);
+
1559  }
+
1560  }
+
1561  printer->add_line("return 0;");
+
1562  } else {
+
1563  printer->add_line("return xi;");
+
1564  }
+
1565  printer->pop_block();
+
1566 
+
1567  printer->fmt_push_block("if (xi <= 0. || xi >= {}.)", with);
+
1568  printer->fmt_line("int index = (xi <= 0.) ? 0 : {};", with);
+
1569  if (node.is_procedure_block()) {
+
1570  for (const auto& variable: table_variables) {
+
1571  auto var_name = variable->get_node_name();
+
1572  auto instance_name = get_variable_name(var_name);
+
1573  auto table_name = get_variable_name("t_" + var_name);
+
1574  auto [is_array, array_length] = check_if_var_is_array(var_name);
+
1575  if (is_array) {
+
1576  for (int j = 0; j < array_length; j++) {
+
1577  printer->fmt_line(
+
1578  "{}[{}] = {}[{}][index];", instance_name, j, table_name, j);
+
1579  }
+
1580  } else {
+
1581  printer->fmt_line("{} = {}[index];", instance_name, table_name);
+
1582  }
+
1583  }
+
1584  printer->add_line("return 0;");
+
1585  } else {
+
1586  auto table_name = get_variable_name("t_" + name);
+
1587  printer->fmt_line("return {}[index];", table_name);
+
1588  }
+
1589  printer->pop_block();
+
1590 
+
1591  printer->add_line("int i = int(xi);");
+
1592  printer->add_line("double theta = xi - double(i);");
+
1593  if (node.is_procedure_block()) {
+
1594  for (const auto& var: table_variables) {
+
1595  auto var_name = var->get_node_name();
+
1596  auto instance_name = get_variable_name(var_name);
+
1597  auto table_name = get_variable_name("t_" + var_name);
+
1598  auto [is_array, array_length] = check_if_var_is_array(var->get_node_name());
+
1599  if (is_array) {
+
1600  for (size_t j = 0; j < array_length; j++) {
+
1601  printer->fmt_line(
+
1602  "{0}[{1}] = {2}[{1}][i] + theta*({2}[{1}][i+1]-{2}[{1}][i]);",
+
1603  instance_name,
+
1604  j,
+
1605  table_name);
+
1606  }
+
1607  } else {
+
1608  printer->fmt_line("{0} = {1}[i] + theta*({1}[i+1]-{1}[i]);",
+
1609  instance_name,
+
1610  table_name);
+
1611  }
+
1612  }
+
1613  printer->add_line("return 0;");
+
1614  } else {
+
1615  auto table_name = get_variable_name("t_" + name);
+
1616  printer->fmt_line("return {0}[i] + theta * ({0}[i+1] - {0}[i]);", table_name);
+
1617  }
+
1618  }
+
1619  printer->pop_block();
+
1620 }
+
1621 
+
1622 
+ +
1624  auto statement = get_table_statement(node);
+
1625  auto table_variables = statement->get_table_vars();
+
1626  auto depend_variables = statement->get_depend_vars();
+
1627  const auto& from = statement->get_from();
+
1628  const auto& to = statement->get_to();
+
1629  auto name = node.get_node_name();
+
1630  auto internal_params = internal_method_parameters();
+
1631  auto with = statement->get_with()->eval();
+
1632  auto use_table_var = get_variable_name(naming::USE_TABLE_VARIABLE);
+
1633  auto tmin_name = get_variable_name("tmin_" + name);
+
1634  auto mfac_name = get_variable_name("mfac_" + name);
+
1635  auto float_type = default_float_data_type();
+
1636 
+
1637  printer->add_newline(2);
+
1638  printer->fmt_push_block("void {}({})",
+
1639  table_update_function_name(name),
+
1640  get_parameter_str(internal_params));
+
1641  {
+
1642  printer->fmt_push_block("if ({} == 0)", use_table_var);
+
1643  printer->add_line("return;");
+
1644  printer->pop_block();
+
1645 
+
1646  printer->add_line("static bool make_table = true;");
+
1647  for (const auto& variable: depend_variables) {
+
1648  printer->fmt_line("static {} save_{};", float_type, variable->get_node_name());
+
1649  }
+
1650 
+
1651  for (const auto& variable: depend_variables) {
+
1652  const auto& var_name = variable->get_node_name();
+
1653  const auto& instance_name = get_variable_name(var_name);
+
1654  printer->fmt_push_block("if (save_{} != {})", var_name, instance_name);
+
1655  printer->add_line("make_table = true;");
+
1656  printer->pop_block();
1657  }
1658 
-
1659  for (const auto& variable: depend_variables) {
-
1660  const auto& var_name = variable->get_node_name();
-
1661  const auto& instance_name = get_variable_name(var_name);
-
1662  printer->fmt_push_block("if (save_{} != {})", var_name, instance_name);
-
1663  printer->add_line("make_table = true;");
-
1664  printer->pop_block();
-
1665  }
-
1666 
-
1667  printer->push_block("if (make_table)");
-
1668  {
-
1669  printer->add_line("make_table = false;");
-
1670 
-
1671  printer->add_indent();
-
1672  printer->add_text(tmin_name, " = ");
-
1673  from->accept(*this);
-
1674  printer->add_text(';');
-
1675  printer->add_newline();
-
1676 
-
1677  printer->add_indent();
-
1678  printer->add_text("double tmax = ");
-
1679  to->accept(*this);
-
1680  printer->add_text(';');
-
1681  printer->add_newline();
-
1682 
-
1683 
-
1684  printer->fmt_line("double dx = (tmax-{}) / {}.;", tmin_name, with);
-
1685  printer->fmt_line("{} = 1./dx;", mfac_name);
-
1686 
-
1687  printer->fmt_line("double x = {};", tmin_name);
-
1688  printer->fmt_push_block("for (std::size_t i = 0; i < {}; x += dx, i++)", with + 1);
-
1689  auto function = method_name("f_" + name);
-
1690  if (node.is_procedure_block()) {
-
1691  printer->fmt_line("{}({}, x);", function, internal_method_arguments());
-
1692  for (const auto& variable: table_variables) {
-
1693  auto var_name = variable->get_node_name();
-
1694  auto instance_name = get_variable_name(var_name);
-
1695  auto table_name = get_variable_name("t_" + var_name);
-
1696  auto [is_array, array_length] = check_if_var_is_array(var_name);
-
1697  if (is_array) {
-
1698  for (int j = 0; j < array_length; j++) {
-
1699  printer->fmt_line(
-
1700  "{}[{}][i] = {}[{}];", table_name, j, instance_name, j);
-
1701  }
-
1702  } else {
-
1703  printer->fmt_line("{}[i] = {};", table_name, instance_name);
-
1704  }
-
1705  }
-
1706  } else {
-
1707  auto table_name = get_variable_name("t_" + name);
-
1708  printer->fmt_line("{}[i] = {}({}, x);",
-
1709  table_name,
-
1710  function,
-
1711  internal_method_arguments());
-
1712  }
-
1713  printer->pop_block();
-
1714 
-
1715  for (const auto& variable: depend_variables) {
-
1716  auto var_name = variable->get_node_name();
-
1717  auto instance_name = get_variable_name(var_name);
-
1718  printer->fmt_line("save_{} = {};", var_name, instance_name);
-
1719  }
-
1720  }
-
1721  printer->pop_block();
-
1722  }
-
1723  printer->pop_block();
-
1724 }
-
1725 
-
1726 
- -
1728  const std::unordered_set<CppObjectSpecifier>& specifiers) {
-
1729  std::string result;
-
1730  for (const auto& specifier: specifiers) {
-
1731  if (!result.empty()) {
-
1732  result += " ";
-
1733  }
-
1734  result += object_specifier_map[specifier];
-
1735  }
-
1736  return result;
-
1737 }
-
1738 
-
1739 
- -
1741  const auto& table_statements = collect_nodes(node, {AstNodeType::TABLE_STATEMENT});
-
1742 
-
1743  if (table_statements.size() != 1) {
-
1744  auto message = fmt::format("One table statement expected in {} found {}",
-
1745  node.get_node_name(),
-
1746  table_statements.size());
-
1747  throw std::runtime_error(message);
-
1748  }
-
1749  return dynamic_cast<const ast::TableStatement*>(table_statements.front().get());
-
1750 }
-
1751 
-
1752 
-
1753 std::tuple<bool, int> CodegenCppVisitor::check_if_var_is_array(const std::string& name) {
-
1754  auto symbol = program_symtab->lookup_in_scope(name);
-
1755  if (!symbol) {
-
1756  throw std::runtime_error(
-
1757  fmt::format("CodegenCppVisitor:: {} not found in symbol table!", name));
-
1758  }
-
1759  if (symbol->is_array()) {
-
1760  return {true, symbol->get_length()};
-
1761  } else {
-
1762  return {false, 0};
-
1763  }
-
1764 }
-
1765 
-
1766 
- -
1768  for (const auto& state: info.state_vars) {
-
1769  auto state_name = state->get_name();
-
1770  auto lhs = get_variable_name(state_name);
-
1771  auto rhs = get_variable_name(state_name + "0");
-
1772 
-
1773  if (state->is_array()) {
-
1774  for (int i = 0; i < state->get_length(); ++i) {
-
1775  printer->fmt_line("{}[{}] = {};", lhs, i, rhs);
-
1776  }
-
1777  } else {
-
1778  printer->fmt_line("{} = {};", lhs, rhs);
-
1779  }
-
1780  }
-
1781 }
-
1782 } // namespace codegen
-
1783 } // namespace nmodl
+
1659  printer->push_block("if (make_table)");
+
1660  {
+
1661  printer->add_line("make_table = false;");
+
1662 
+
1663  printer->add_indent();
+
1664  printer->add_text(tmin_name, " = ");
+
1665  from->accept(*this);
+
1666  printer->add_text(';');
+
1667  printer->add_newline();
+
1668 
+
1669  printer->add_indent();
+
1670  printer->add_text("double tmax = ");
+
1671  to->accept(*this);
+
1672  printer->add_text(';');
+
1673  printer->add_newline();
+
1674 
+
1675 
+
1676  printer->fmt_line("double dx = (tmax-{}) / {}.;", tmin_name, with);
+
1677  printer->fmt_line("{} = 1./dx;", mfac_name);
+
1678 
+
1679  printer->fmt_line("double x = {};", tmin_name);
+
1680  printer->fmt_push_block("for (std::size_t i = 0; i < {}; x += dx, i++)", with + 1);
+
1681  auto function = method_name("f_" + name);
+
1682  if (node.is_procedure_block()) {
+
1683  printer->fmt_line("{}({}, x);", function, internal_method_arguments());
+
1684  for (const auto& variable: table_variables) {
+
1685  auto var_name = variable->get_node_name();
+
1686  auto instance_name = get_variable_name(var_name);
+
1687  auto table_name = get_variable_name("t_" + var_name);
+
1688  auto [is_array, array_length] = check_if_var_is_array(var_name);
+
1689  if (is_array) {
+
1690  for (int j = 0; j < array_length; j++) {
+
1691  printer->fmt_line(
+
1692  "{}[{}][i] = {}[{}];", table_name, j, instance_name, j);
+
1693  }
+
1694  } else {
+
1695  printer->fmt_line("{}[i] = {};", table_name, instance_name);
+
1696  }
+
1697  }
+
1698  } else {
+
1699  auto table_name = get_variable_name("t_" + name);
+
1700  printer->fmt_line("{}[i] = {}({}, x);",
+
1701  table_name,
+
1702  function,
+
1703  internal_method_arguments());
+
1704  }
+
1705  printer->pop_block();
+
1706 
+
1707  for (const auto& variable: depend_variables) {
+
1708  auto var_name = variable->get_node_name();
+
1709  auto instance_name = get_variable_name(var_name);
+
1710  printer->fmt_line("save_{} = {};", var_name, instance_name);
+
1711  }
+
1712  }
+
1713  printer->pop_block();
+
1714  }
+
1715  printer->pop_block();
+
1716 }
+
1717 
+
1718 
+ +
1720  const std::unordered_set<CppObjectSpecifier>& specifiers) {
+
1721  std::string result;
+
1722  for (const auto& specifier: specifiers) {
+
1723  if (!result.empty()) {
+
1724  result += " ";
+
1725  }
+
1726  result += object_specifier_map[specifier];
+
1727  }
+
1728  return result;
+
1729 }
+
1730 
+
1731 
+ +
1733  const auto& table_statements = collect_nodes(node, {AstNodeType::TABLE_STATEMENT});
+
1734 
+
1735  if (table_statements.size() != 1) {
+
1736  auto message = fmt::format("One table statement expected in {} found {}",
+
1737  node.get_node_name(),
+
1738  table_statements.size());
+
1739  throw std::runtime_error(message);
+
1740  }
+
1741  return dynamic_cast<const ast::TableStatement*>(table_statements.front().get());
+
1742 }
+
1743 
+
1744 
+
1745 std::tuple<bool, int> CodegenCppVisitor::check_if_var_is_array(const std::string& name) {
+
1746  auto symbol = program_symtab->lookup_in_scope(name);
+
1747  if (!symbol) {
+
1748  throw std::runtime_error(
+
1749  fmt::format("CodegenCppVisitor:: {} not found in symbol table!", name));
+
1750  }
+
1751  if (symbol->is_array()) {
+
1752  return {true, symbol->get_length()};
+
1753  } else {
+
1754  return {false, 0};
+
1755  }
+
1756 }
+
1757 
+
1758 
+ +
1760  for (const auto& state: info.state_vars) {
+
1761  auto state_name = state->get_name();
+
1762  auto lhs = get_variable_name(state_name);
+
1763  auto rhs = get_variable_name(state_name + "0");
+
1764 
+
1765  if (state->is_array()) {
+
1766  for (int i = 0; i < state->get_length(); ++i) {
+
1767  printer->fmt_line("{}[{}] = {};", lhs, i, rhs);
+
1768  }
+
1769  } else {
+
1770  printer->fmt_line("{} = {};", lhs, rhs);
+
1771  }
+
1772  }
+
1773 }
+
1774 } // namespace codegen
+
1775 } // namespace nmodl
std::string get_node_name() const override
Return name of the node.
Definition: ast.cpp:7065
std::shared_ptr< Expression > get_length() const noexcept
Getter for member variable IndexedName::length.
std::string table_update_function_name(const std::string &block_name) const
The name of the function that updates the table value if the parameters changed.
-
void visit_eigen_linear_solver_block(const ast::EigenLinearSolverBlock &node) override
visit node of type ast::EigenLinearSolverBlock
+
void visit_eigen_linear_solver_block(const ast::EigenLinearSolverBlock &node) override
visit node of type ast::EigenLinearSolverBlock
bool ion_variable_struct_required() const
Check if a structure for ion variables is required.
static bool need_semicolon(const ast::Statement &node)
Check if a semicolon is required at the end of given statement.
-
void update_index_semantics()
populate all index semantics needed for registration with coreneuron
+
void update_index_semantics()
populate all index semantics needed for registration with coreneuron
const LocalVarVector & get_variables() const noexcept
Getter for member variable LocalListStatement::variables.
-
void print_table_replacement_function(const ast::Block &)
Print replacement function for function or procedure using table.
+
void print_table_replacement_function(const ast::Block &)
Print replacement function for function or procedure using table.
static constexpr char RANDOM_SEMANTIC[]
semantic type for RANDOM variable
static constexpr char NET_SEND_SEMANTIC[]
semantic type for net send call
@@ -1925,7 +1917,7 @@
void print_functor_definition(const ast::EigenNewtonSolverBlock &node)
Based on the EigenNewtonSolverBlock passed print the definition needed for its functor.
virtual void print_global_var_struct_assertions() const
Print static assertions about the global variable struct.
void print_mechanism_info()
Print backend code for byte array that has mechanism information (to be registered with NEURON/CoreNE...
-
void visit_eigen_newton_solver_block(const ast::EigenNewtonSolverBlock &node) override
visit node of type ast::EigenNewtonSolverBlock
+
void visit_eigen_newton_solver_block(const ast::EigenNewtonSolverBlock &node) override
visit node of type ast::EigenNewtonSolverBlock
void visit_prime_name(const ast::PrimeName &node) override
visit node of type ast::PrimeName
std::shared_ptr< StatementBlock > get_initialize_block() const noexcept
Getter for member variable EigenNewtonSolverBlock::initialize_block.
@@ -1951,8 +1943,8 @@
Represents a variable.
Definition: var_name.hpp:43
Represents an integer variable.
Definition: integer.hpp:49
Implement string manipulation functions.
-
std::string get_object_specifiers(const std::unordered_set< CppObjectSpecifier > &)
-
std::vector< SymbolType > get_float_variables() const
Determine all float variables required during code generation.
+
std::string get_object_specifiers(const std::unordered_set< CppObjectSpecifier > &)
+
std::vector< SymbolType > get_float_variables() const
Determine all float variables required during code generation.
virtual bool is_expression_statement() const noexcept
Check if the ast node is an instance of ast::ExpressionStatement.
Definition: ast.cpp:226
static constexpr char NODE_AREA_VARIABLE[]
inbuilt neuron variable for area of the compartment
@@ -1970,7 +1962,7 @@
static const std::string GIT_REVISION
git revision id
Definition: config.h:33
logger_type logger
Definition: logger.cpp:34
-
void visit_mutex_unlock(const ast::MutexUnlock &node) override
visit node of type ast::MutexUnlock
+
void visit_mutex_unlock(const ast::MutexUnlock &node) override
visit node of type ast::MutexUnlock
Visitor to return Def-Use chain for a given variable in the block/node
std::string format_float_string(const std::string &s_value)
Handles the float constants format being printed in the generated code.
void visit_unit(const ast::Unit &node) override
visit node of type ast::Unit
@@ -1988,7 +1980,7 @@
static constexpr char DEFAULT_FLOAT_TYPE[]
default float variable type
std::string get_node_name() const override
Return name of the node.
Definition: ast.cpp:3804
std::shared_ptr< StatementBlock > get_update_states_block() const noexcept
Getter for member variable EigenLinearSolverBlock::update_states_block.
-
std::vector< IndexVariableInfo > get_int_variables()
Determine all int variables required during code generation.
+
std::vector< IndexVariableInfo > get_int_variables()
Determine all int variables required during code generation.
Visitor for printing C++ code compatible with legacy api of CoreNEURON
const StatementVector & get_statements() const noexcept
Getter for member variable StatementBlock::statements.
@@ -2014,15 +2006,14 @@
const std::regex regex_special_chars
std::shared_ptr< Expression > get_from() const noexcept
Getter for member variable FromStatement::from.
-
virtual void setup(const ast::Program &node)
+
virtual void setup(const ast::Program &node)
void visit_unary_operator(const ast::UnaryOperator &node) override
visit node of type ast::UnaryOperator
static constexpr char POINT_PROCESS_SEMANTIC[]
semantic type for point process variable
-
void visit_mutex_lock(const ast::MutexLock &node) override
visit node of type ast::MutexLock
+
void visit_mutex_lock(const ast::MutexLock &node) override
visit node of type ast::MutexLock
void visit_boolean(const ast::Boolean &node) override
visit node of type ast::Boolean
virtual bool is_else_if_statement() const noexcept
Check if the ast node is an instance of ast::ElseIfStatement.
Definition: ast.cpp:236
bool nrn_cur_required() const noexcept
Check if nrn_cur function is required.
virtual bool is_table_statement() const noexcept
Check if the ast node is an instance of ast::TableStatement.
Definition: ast.cpp:258
-
std::vector< std::string > ion_read_statements_optimized(BlockType type) const
For a given output block type, return minimal statements for all read ion variables.
@ Constructor
constructor block
Represent MUTEXUNLOCK statement in NMODL.
@@ -2037,7 +2028,7 @@
std::string to_string(const T &obj)
virtual bool is_block_comment() const noexcept
Check if the ast node is an instance of ast::BlockComment.
Definition: ast.cpp:286
-
void visit_solution_expression(const ast::SolutionExpression &node) override
visit node of type ast::SolutionExpression
+
void visit_solution_expression(const ast::SolutionExpression &node) override
visit node of type ast::SolutionExpression
static constexpr char NRN_INIT_METHOD[]
nrn_init method in generated code
virtual void print_nrn_pointing(const ast::FunctionCall &node)
Print nrn_pointing.
const ExpressionVector & get_arguments() const noexcept
Getter for member variable FunctionCall::arguments.
@@ -2049,7 +2040,7 @@
void print_nmodl_constants()
Print the nmodl constants used in backend code.
std::shared_ptr< Expression > get_expression() const noexcept
Getter for member variable ParenExpression::expression.
const BinaryOperator & get_op() const noexcept
Getter for member variable BinaryExpression::op.
-
void print_table_check_function(const ast::Block &)
Print check_function() for functions or procedure using table.
+
void print_table_check_function(const ast::Block &)
Print check_function() for functions or procedure using table.
virtual bool is_from_statement() const noexcept
Check if the ast node is an instance of ast::FromStatement.
Definition: ast.cpp:230
Represents a prime variable (for ODE)
Definition: prime_name.hpp:48
static std::pair< std::string, std::string > read_ion_variable_name(const std::string &name)
Return ion variable name and corresponding ion read variable name.
@@ -2075,10 +2066,10 @@
std::string get_node_name() const override
Return name of the node.
Definition: ast.cpp:3967
Statement to indicate a change in timestep in a given block.
Definition: update_dt.hpp:38
std::shared_ptr< StatementBlock > get_functor_block() const noexcept
Getter for member variable EigenNewtonSolverBlock::functor_block.
-
const ast::TableStatement * get_table_statement(const ast::Block &)
+
const ast::TableStatement * get_table_statement(const ast::Block &)
std::string format_float_string(const std::string &value)
Convert a given float value to its string representation.
-
std::tuple< bool, int > check_if_var_is_array(const std::string &name)
Check if the given name exist in the symbol.
+
std::tuple< bool, int > check_if_var_is_array(const std::string &name)
Check if the given name exist in the symbol.
bool is_functor_const(const ast::StatementBlock &variable_block, const ast::StatementBlock &functor_block)
Checks whether the functor_block generated by sympy solver modifies any variable outside its scope.
std::shared_ptr< Expression > get_node_to_solve() const noexcept
Getter for member variable SolutionExpression::node_to_solve.
static std::string get_parameter_str(const ParamVector &params)
Generate the string representing the procedure parameter declaration.
@@ -2093,7 +2084,6 @@
std::shared_ptr< StatementBlock > get_variable_block() const noexcept
Getter for member variable EigenNewtonSolverBlock::variable_block.
void visit_local_list_statement(const ast::LocalListStatement &node) override
visit node of type ast::LocalListStatement
-
void visit_protect_statement(const ast::ProtectStatement &node) override
visit node of type ast::ProtectStatement
Represents ion write statement during code generation.
static constexpr char WATCH_SEMANTIC[]
semantic type for watch statement
@@ -2118,11 +2108,11 @@
std::shared_ptr< ElseStatement > get_elses() const noexcept
Getter for member variable IfStatement::elses.
std::shared_ptr< Expression > get_lhs() const noexcept
Getter for member variable BinaryExpression::lhs.
virtual bool is_line_comment() const noexcept
Check if the ast node is an instance of ast::LineComment.
Definition: ast.cpp:284
-
std::string compute_method_name(BlockType type) const
+
std::string compute_method_name(BlockType type) const
static constexpr char AREA_VARIABLE[]
similar to node_area but user can explicitly declare it as area
Represents a name.
Definition: name.hpp:44
virtual bool is_while_statement() const noexcept
Check if the ast node is an instance of ast::WhileStatement.
Definition: ast.cpp:232
-
void visit_program(const ast::Program &program) override
Main and only member function to call after creating an instance of this class.
+
void visit_program(const ast::Program &program) override
Main and only member function to call after creating an instance of this class.
virtual bool is_else_statement() const noexcept
Check if the ast node is an instance of ast::ElseStatement.
Definition: ast.cpp:238
std::shared_ptr< StatementBlock > get_statement_block() const noexcept override
Getter for member variable FromStatement::statement_block.
Represents top level AST node for whole NMODL input.
Definition: program.hpp:39
@@ -2132,7 +2122,7 @@
void print_prcellstate_macros() const
Print declaration of macro NRN_PRCELLSTATE for debugging.
static constexpr char FOR_NETCON_SEMANTIC[]
semantic type for for_netcon statement
std::shared_ptr< StatementBlock > get_update_states_block() const noexcept
Getter for member variable EigenNewtonSolverBlock::update_states_block.
- +
Blindly rename given variable to new name
@ State
derivative block
bool nrn_state_required() const noexcept
Check if nrn_state function is required.
@@ -2152,7 +2142,6 @@
int get_index_from_name(const std::vector< T > &variables, const std::string &name)
void print_namespace_stop()
Prints the end of the simulator namespace.
virtual std::string get_node_name() const
Return name of of the node.
Definition: ast.cpp:28
-
std::shared_ptr< Expression > get_expression() const noexcept
Getter for member variable ProtectStatement::expression.
Represents a string.
Definition: string.hpp:52
Auto generated AST classes declaration.
diff --git a/doxygen/codegen__cpp__visitor_8hpp_source.html b/doxygen/codegen__cpp__visitor_8hpp_source.html index 8d125d170..2ab0ebac8 100644 --- a/doxygen/codegen__cpp__visitor_8hpp_source.html +++ b/doxygen/codegen__cpp__visitor_8hpp_source.html @@ -899,820 +899,813 @@
803 
804 
805  /**
-
806  * Print atomic update pragma for reduction statements
-
807  */
-
808  virtual void print_atomic_reduction_pragma() = 0;
-
809 
-
810 
-
811  /**
-
812  * Instantiate global var instance
-
813  *
-
814  * For C++ code generation this is empty
-
815  * \return ""
-
816  */
-
817  virtual void print_global_var_struct_decl();
-
818 
-
819  /**
-
820  * Check if ion variable copies should be avoided
-
821  */
-
822  virtual bool optimize_ion_variable_copies() const = 0;
-
823 
-
824  /****************************************************************************************/
-
825  /* Printing routines for code generation */
-
826  /****************************************************************************************/
-
827 
-
828 
-
829  /**
-
830  * Print any statement block in nmodl with option to (not) print braces
-
831  *
-
832  * The individual statements (of type nmodl::ast::Statement) in the StatementBlock are printed
-
833  * by accepting \c this visistor.
-
834  *
-
835  * \param node A (possibly empty) statement block AST node
-
836  * \param open_brace Print an opening brace if \c false
-
837  * \param close_brace Print a closing brace if \c true
-
838  */
- -
840  bool open_brace = true,
-
841  bool close_brace = true);
-
842 
+
806  * Instantiate global var instance
+
807  *
+
808  * For C++ code generation this is empty
+
809  * \return ""
+
810  */
+
811  virtual void print_global_var_struct_decl();
+
812 
+
813  /**
+
814  * Check if ion variable copies should be avoided
+
815  */
+
816  virtual bool optimize_ion_variable_copies() const = 0;
+
817 
+
818  /****************************************************************************************/
+
819  /* Printing routines for code generation */
+
820  /****************************************************************************************/
+
821 
+
822 
+
823  /**
+
824  * Print any statement block in nmodl with option to (not) print braces
+
825  *
+
826  * The individual statements (of type nmodl::ast::Statement) in the StatementBlock are printed
+
827  * by accepting \c this visistor.
+
828  *
+
829  * \param node A (possibly empty) statement block AST node
+
830  * \param open_brace Print an opening brace if \c false
+
831  * \param close_brace Print a closing brace if \c true
+
832  */
+ +
834  bool open_brace = true,
+
835  bool close_brace = true);
+
836 
+
837 
+
838  /**
+
839  * Print call to internal or external function
+
840  * \param node The AST node representing a function call
+
841  */
+
842  virtual void print_function_call(const ast::FunctionCall& node);
843 
844  /**
-
845  * Print call to internal or external function
-
846  * \param node The AST node representing a function call
+
845  * Print call to \c net\_send
+
846  * \param node The AST node representing the function call
847  */
-
848  virtual void print_function_call(const ast::FunctionCall& node);
+
848  virtual void print_net_send_call(const ast::FunctionCall& node) = 0;
849 
850  /**
-
851  * Print call to \c net\_send
-
852  * \param node The AST node representing the function call
-
853  */
-
854  virtual void print_net_send_call(const ast::FunctionCall& node) = 0;
+
851  * Print \c nrn\_pointing.
+
852  */
+
853  virtual void print_nrn_pointing(const ast::FunctionCall& node);
+
854 
855 
856  /**
-
857  * Print \c nrn\_pointing.
-
858  */
-
859  virtual void print_nrn_pointing(const ast::FunctionCall& node);
-
860 
-
861 
-
862  /**
-
863  * Print call to net\_move
-
864  * \param node The AST node representing the function call
-
865  */
-
866  virtual void print_net_move_call(const ast::FunctionCall& node) = 0;
-
867 
+
857  * Print call to net\_move
+
858  * \param node The AST node representing the function call
+
859  */
+
860  virtual void print_net_move_call(const ast::FunctionCall& node) = 0;
+
861 
+
862 
+
863  /**
+
864  * Print call to net\_event
+
865  * \param node The AST node representing the function call
+
866  */
+
867  virtual void print_net_event_call(const ast::FunctionCall& node) = 0;
868 
-
869  /**
-
870  * Print call to net\_event
-
871  * \param node The AST node representing the function call
-
872  */
-
873  virtual void print_net_event_call(const ast::FunctionCall& node) = 0;
-
874 
-
875  /** Print special code when calling FUNCTION_TABLEs.
-
876  */
-
877  virtual void print_function_table_call(const ast::FunctionCall& node) = 0;
+
869  /** Print special code when calling FUNCTION_TABLEs.
+
870  */
+
871  virtual void print_function_table_call(const ast::FunctionCall& node) = 0;
+
872 
+
873  /**
+
874  * Print function and procedures prototype declaration
+
875  */
+
876  virtual void print_function_prototypes() = 0;
+
877 
878 
879  /**
-
880  * Print function and procedures prototype declaration
-
881  */
-
882  virtual void print_function_prototypes() = 0;
-
883 
-
884 
-
885  /**
-
886  * Print nmodl function or procedure (common code)
-
887  * \param node the AST node representing the function or procedure in NMODL
-
888  * \param name the name of the function or procedure
-
889  * \param specifiers the set of C++ specifiers to apply to the function signature
-
890  */
-
891  virtual void print_function_or_procedure(
-
892  const ast::Block& node,
-
893  const std::string& name,
-
894  const std::unordered_set<CppObjectSpecifier>& specifiers) = 0;
-
895 
-
896 
-
897  /**
-
898  * Common helper function to help printing function or procedure blocks
-
899  * \param node the AST node representing the function or procedure in NMODL
-
900  */
-
901  virtual void print_function_procedure_helper(const ast::Block& node) = 0;
-
902 
-
903 
-
904  /**
-
905  * Print NMODL procedure in target backend code
-
906  * \param node
-
907  */
-
908  void print_procedure(const ast::ProcedureBlock& node);
-
909 
+
880  * Print nmodl function or procedure (common code)
+
881  * \param node the AST node representing the function or procedure in NMODL
+
882  * \param name the name of the function or procedure
+
883  * \param specifiers the set of C++ specifiers to apply to the function signature
+
884  */
+
885  virtual void print_function_or_procedure(
+
886  const ast::Block& node,
+
887  const std::string& name,
+
888  const std::unordered_set<CppObjectSpecifier>& specifiers) = 0;
+
889 
+
890 
+
891  /**
+
892  * Common helper function to help printing function or procedure blocks
+
893  * \param node the AST node representing the function or procedure in NMODL
+
894  */
+
895  virtual void print_function_procedure_helper(const ast::Block& node) = 0;
+
896 
+
897 
+
898  /**
+
899  * Print NMODL procedure in target backend code
+
900  * \param node
+
901  */
+
902  void print_procedure(const ast::ProcedureBlock& node);
+
903 
+
904 
+
905  /**
+
906  * Print NMODL function in target backend code
+
907  * \param node
+
908  */
+
909  void print_function(const ast::FunctionBlock& node);
910 
911  /**
-
912  * Print NMODL function in target backend code
-
913  * \param node
-
914  */
-
915  void print_function(const ast::FunctionBlock& node);
-
916 
-
917  /**
-
918  * Print the internal function for FUNCTION_TABLES.
-
919  *
-
920  * Here internal refers to the function called from BREAKPOINT, INITIAL and
-
921  * other FUNCTIONs. Therefore this function doesn't print the functions required
-
922  * to call function tables from HOC/Python.
-
923  */
- +
912  * Print the internal function for FUNCTION_TABLES.
+
913  *
+
914  * Here internal refers to the function called from BREAKPOINT, INITIAL and
+
915  * other FUNCTIONs. Therefore this function doesn't print the functions required
+
916  * to call function tables from HOC/Python.
+
917  */
+ +
919 
+
920  /**
+
921  * Parameters of the function itself `"{}"` and `"table_{}"`.
+
922  */
+
923  virtual std::pair<ParamVector, ParamVector> function_table_parameters(
+
924  const ast::FunctionTableBlock& node) = 0;
925 
926  /**
-
927  * Parameters of the function itself `"{}"` and `"table_{}"`.
-
928  */
-
929  virtual std::pair<ParamVector, ParamVector> function_table_parameters(
-
930  const ast::FunctionTableBlock& node) = 0;
-
931 
-
932  /**
-
933  * @brief Checks whether the functor_block generated by sympy solver modifies any variable
-
934  * outside its scope. If it does then return false, so that the operator() of the struct functor
-
935  * of the Eigen Newton solver doesn't have const qualifier.
-
936  *
-
937  * @param variable_block Statement Block of the variables declarations used in the functor
-
938  * struct of the solver
-
939  * @param functor_block Actual code being printed in the operator() of the functor struct of the
-
940  * solver
-
941  * @return True if operator() is const else False
-
942  */
-
943  bool is_functor_const(const ast::StatementBlock& variable_block,
-
944  const ast::StatementBlock& functor_block);
-
945 
-
946 
-
947  /** The parameters of the Newton solver "functor". */
-
948  virtual ParamVector functor_params() = 0;
-
949 
-
950  /**
-
951  * \brief Based on the \c EigenNewtonSolverBlock passed print the definition needed for its
-
952  * functor
-
953  *
-
954  * \param node \c EigenNewtonSolverBlock for which to print the functor
-
955  */
- -
957 
-
958  /** \brief Print all Newton functor structs. */
- -
960 
-
961  /** Print linear solver using Eigen.
-
962  */
-
963  void print_eigen_linear_solver(const std::string& float_type, int N);
-
964 
-
965  /**
-
966  * Print the items in a vector as a list
-
967  *
-
968  * This function prints a given vector of elements as a list with given separator onto the
-
969  * current printer. Elements are expected to be of type nmodl::ast::Ast and are printed by being
-
970  * visited. Care is taken to omit the separator after the the last element.
-
971  *
-
972  * \tparam T The element type in the vector, which must be of type nmodl::ast::Ast
-
973  * \param elements The vector of elements to be printed
-
974  * \param separator The separator string to print between all elements
-
975  * \param prefix A prefix string to print before each element
-
976  */
-
977  template <typename T>
-
978  void print_vector_elements(const std::vector<T>& elements,
-
979  const std::string& separator,
-
980  const std::string& prefix = "");
-
981 
-
982  virtual void print_ion_variable() = 0;
-
983 
-
984  /****************************************************************************************/
-
985  /* Code-specific helper routines */
-
986  /****************************************************************************************/
-
987 
-
988  /**
-
989  * Add the variable tqitem during `get_int_variables`.
-
990  */
-
991  virtual void add_variable_tqitem(std::vector<IndexVariableInfo>& variables) = 0;
-
992 
-
993  /**
-
994  * Add the variable point_process during `get_int_variables`.
+
927  * @brief Checks whether the functor_block generated by sympy solver modifies any variable
+
928  * outside its scope. If it does then return false, so that the operator() of the struct functor
+
929  * of the Eigen Newton solver doesn't have const qualifier.
+
930  *
+
931  * @param variable_block Statement Block of the variables declarations used in the functor
+
932  * struct of the solver
+
933  * @param functor_block Actual code being printed in the operator() of the functor struct of the
+
934  * solver
+
935  * @return True if operator() is const else False
+
936  */
+
937  bool is_functor_const(const ast::StatementBlock& variable_block,
+
938  const ast::StatementBlock& functor_block);
+
939 
+
940 
+
941  /** The parameters of the Newton solver "functor". */
+
942  virtual ParamVector functor_params() = 0;
+
943 
+
944  /**
+
945  * \brief Based on the \c EigenNewtonSolverBlock passed print the definition needed for its
+
946  * functor
+
947  *
+
948  * \param node \c EigenNewtonSolverBlock for which to print the functor
+
949  */
+ +
951 
+
952  /** \brief Print all Newton functor structs. */
+ +
954 
+
955  /** Print linear solver using Eigen.
+
956  */
+
957  void print_eigen_linear_solver(const std::string& float_type, int N);
+
958 
+
959  /**
+
960  * Print the items in a vector as a list
+
961  *
+
962  * This function prints a given vector of elements as a list with given separator onto the
+
963  * current printer. Elements are expected to be of type nmodl::ast::Ast and are printed by being
+
964  * visited. Care is taken to omit the separator after the the last element.
+
965  *
+
966  * \tparam T The element type in the vector, which must be of type nmodl::ast::Ast
+
967  * \param elements The vector of elements to be printed
+
968  * \param separator The separator string to print between all elements
+
969  * \param prefix A prefix string to print before each element
+
970  */
+
971  template <typename T>
+
972  void print_vector_elements(const std::vector<T>& elements,
+
973  const std::string& separator,
+
974  const std::string& prefix = "");
+
975 
+
976  virtual void print_ion_variable() = 0;
+
977 
+
978  /****************************************************************************************/
+
979  /* Code-specific helper routines */
+
980  /****************************************************************************************/
+
981 
+
982  /**
+
983  * Add the variable tqitem during `get_int_variables`.
+
984  */
+
985  virtual void add_variable_tqitem(std::vector<IndexVariableInfo>& variables) = 0;
+
986 
+
987  /**
+
988  * Add the variable point_process during `get_int_variables`.
+
989  */
+
990  virtual void add_variable_point_process(std::vector<IndexVariableInfo>& variables) = 0;
+
991 
+
992  /**
+
993  * Arguments for functions that are defined and used internally.
+
994  * \return the method arguments
995  */
-
996  virtual void add_variable_point_process(std::vector<IndexVariableInfo>& variables) = 0;
-
997 
-
998  /**
-
999  * Arguments for functions that are defined and used internally.
-
1000  * \return the method arguments
-
1001  */
-
1002  virtual std::string internal_method_arguments() = 0;
-
1003 
-
1004 
-
1005  /**
-
1006  * Parameters for internally defined functions
-
1007  * \return the method parameters
-
1008  */
- -
1010 
-
1011 
-
1012  /**
-
1013  * Arguments for external functions called from generated code
-
1014  * \return A string representing the arguments passed to an external function
-
1015  */
-
1016  virtual const std::string external_method_arguments() noexcept = 0;
-
1017 
-
1018 
-
1019  /**
-
1020  * Parameters for functions in generated code that are called back from external code
-
1021  *
-
1022  * Functions registered in NEURON during initialization for callback must adhere to a prescribed
-
1023  * calling convention. This method generates the string representing the function parameters for
-
1024  * these externally called functions.
-
1025  * \param table
-
1026  * \return A string representing the parameters of the function
+
996  virtual std::string internal_method_arguments() = 0;
+
997 
+
998 
+
999  /**
+
1000  * Parameters for internally defined functions
+
1001  * \return the method parameters
+
1002  */
+ +
1004 
+
1005 
+
1006  /**
+
1007  * Arguments for external functions called from generated code
+
1008  * \return A string representing the arguments passed to an external function
+
1009  */
+
1010  virtual const std::string external_method_arguments() noexcept = 0;
+
1011 
+
1012 
+
1013  /**
+
1014  * Parameters for functions in generated code that are called back from external code
+
1015  *
+
1016  * Functions registered in NEURON during initialization for callback must adhere to a prescribed
+
1017  * calling convention. This method generates the string representing the function parameters for
+
1018  * these externally called functions.
+
1019  * \param table
+
1020  * \return A string representing the parameters of the function
+
1021  */
+
1022  virtual const ParamVector external_method_parameters(bool table = false) noexcept = 0;
+
1023 
+
1024 
+
1025  /**
+
1026  * Arguments for "_threadargs_" macro in neuron implementation
1027  */
-
1028  virtual const ParamVector external_method_parameters(bool table = false) noexcept = 0;
+
1028  virtual std::string nrn_thread_arguments() const = 0;
1029 
1030 
1031  /**
1032  * Arguments for "_threadargs_" macro in neuron implementation
1033  */
-
1034  virtual std::string nrn_thread_arguments() const = 0;
-
1035 
-
1036 
-
1037  /**
-
1038  * Arguments for "_threadargs_" macro in neuron implementation
-
1039  */
-
1040  virtual std::string nrn_thread_internal_arguments() = 0;
+
1034  virtual std::string nrn_thread_internal_arguments() = 0;
+
1035 
+
1036  /**
+
1037  * Arguments for register_mech or point_register_mech function
+
1038  */
+
1039  virtual std::string register_mechanism_arguments() const = 0;
+
1040 
1041 
1042  /**
-
1043  * Arguments for register_mech or point_register_mech function
-
1044  */
-
1045  virtual std::string register_mechanism_arguments() const = 0;
-
1046 
-
1047 
-
1048  /**
-
1049  * Add quotes to string to be output
-
1050  *
-
1051  * \param text The string to be quoted
-
1052  * \return The same string with double-quotes pre- and postfixed
-
1053  */
-
1054  std::string add_escape_quote(const std::string& text) const {
-
1055  return "\"" + text + "\"";
-
1056  }
-
1057 
-
1058 
-
1059  /**
-
1060  * Constructs the name of a function or procedure
-
1061  * \param name The name of the function or procedure
-
1062  * \return The name of the function or procedure postfixed with the model name
-
1063  */
-
1064  std::string method_name(const std::string& name) const {
-
1065  return name + "_" + info.mod_suffix;
-
1066  }
-
1067 
-
1068  /**
-
1069  * Check if the given name exist in the symbol
-
1070  * \return \c return a tuple <true, array_length> if variable
-
1071  * is an array otherwise <false, 0>
-
1072  */
-
1073  std::tuple<bool, int> check_if_var_is_array(const std::string& name);
-
1074 
-
1075 
-
1076  /**
-
1077  * Creates a temporary symbol
-
1078  * \param name The name of the symbol
-
1079  * \return A symbol based on the given name
-
1080  */
-
1081  SymbolType make_symbol(const std::string& name) const {
-
1082  return std::make_shared<symtab::Symbol>(name, ModToken());
-
1083  }
-
1084 
-
1085  /**
-
1086  * Generate Function call statement for nrn_wrote_conc
-
1087  * \param statements Statements are appended to this vector.
-
1088  * \param ion The ion variable.
-
1089  * \param concentration The name of the concentration variable
-
1090  * \return The string representing the function call
-
1091  */
-
1092  virtual void append_conc_write_statements(std::vector<ShadowUseStatement>& statements,
-
1093  const Ion& ion,
-
1094  const std::string& concentration) = 0;
-
1095 
-
1096  /****************************************************************************************/
-
1097  /* Code-specific printing routines for code generations */
-
1098  /****************************************************************************************/
-
1099 
-
1100  /** Name of "our" namespace.
-
1101  */
-
1102  virtual std::string namespace_name() = 0;
+
1043  * Add quotes to string to be output
+
1044  *
+
1045  * \param text The string to be quoted
+
1046  * \return The same string with double-quotes pre- and postfixed
+
1047  */
+
1048  std::string add_escape_quote(const std::string& text) const {
+
1049  return "\"" + text + "\"";
+
1050  }
+
1051 
+
1052 
+
1053  /**
+
1054  * Constructs the name of a function or procedure
+
1055  * \param name The name of the function or procedure
+
1056  * \return The name of the function or procedure postfixed with the model name
+
1057  */
+
1058  std::string method_name(const std::string& name) const {
+
1059  return name + "_" + info.mod_suffix;
+
1060  }
+
1061 
+
1062  /**
+
1063  * Check if the given name exist in the symbol
+
1064  * \return \c return a tuple <true, array_length> if variable
+
1065  * is an array otherwise <false, 0>
+
1066  */
+
1067  std::tuple<bool, int> check_if_var_is_array(const std::string& name);
+
1068 
+
1069 
+
1070  /**
+
1071  * Creates a temporary symbol
+
1072  * \param name The name of the symbol
+
1073  * \return A symbol based on the given name
+
1074  */
+
1075  SymbolType make_symbol(const std::string& name) const {
+
1076  return std::make_shared<symtab::Symbol>(name, ModToken());
+
1077  }
+
1078 
+
1079  /**
+
1080  * Generate Function call statement for nrn_wrote_conc
+
1081  * \param statements Statements are appended to this vector.
+
1082  * \param ion The ion variable.
+
1083  * \param concentration The name of the concentration variable
+
1084  * \return The string representing the function call
+
1085  */
+
1086  virtual void append_conc_write_statements(std::vector<ShadowUseStatement>& statements,
+
1087  const Ion& ion,
+
1088  const std::string& concentration) = 0;
+
1089 
+
1090  /****************************************************************************************/
+
1091  /* Code-specific printing routines for code generations */
+
1092  /****************************************************************************************/
+
1093 
+
1094  /** Name of "our" namespace.
+
1095  */
+
1096  virtual std::string namespace_name() = 0;
+
1097 
+
1098  /**
+
1099  * Prints the start of the simulator namespace
+
1100  */
+
1101  void print_namespace_start();
+
1102 
1103 
1104  /**
-
1105  * Prints the start of the simulator namespace
+
1105  * Prints the end of the simulator namespace
1106  */
-
1107  void print_namespace_start();
-
1108 
-
1109 
-
1110  /**
-
1111  * Prints the end of the simulator namespace
-
1112  */
-
1113  void print_namespace_stop();
-
1114 
-
1115  /**
-
1116  * Prints f"using namespace {namespace_name()}".
-
1117  */
-
1118  void print_using_namespace();
-
1119 
-
1120  /****************************************************************************************/
-
1121  /* Routines for returning variable name */
-
1122  /****************************************************************************************/
-
1123 
-
1124  /**
-
1125  * Determine the updated name if the ion variable has been optimized
-
1126  * \param name The ion variable name
-
1127  * \return The updated name of the variable has been optimized (e.g. \c ena --> \c ion_ena)
-
1128  */
-
1129  std::string update_if_ion_variable_name(const std::string& name) const;
-
1130 
-
1131 
-
1132  /**
-
1133  * Determine the name of a \c float variable given its symbol
-
1134  *
-
1135  * This function typically returns the accessor expression in backend code for the given symbol.
-
1136  * Since the model variables are stored in data arrays and accessed by offset, this function
-
1137  * will return the C++ string representing the array access at the correct offset
-
1138  *
-
1139  * \param symbol The symbol of a variable for which we want to obtain its name
-
1140  * \param use_instance Should the variable be accessed via instance or data array
-
1141  * \return The backend code string representing the access to the given variable
-
1142  * symbol
-
1143  */
-
1144  virtual std::string float_variable_name(const SymbolType& symbol, bool use_instance) const = 0;
-
1145 
-
1146 
-
1147  /**
-
1148  * Determine the name of an \c int variable given its symbol
-
1149  *
-
1150  * This function typically returns the accessor expression in backend code for the given symbol.
-
1151  * Since the model variables are stored in data arrays and accessed by offset, this function
-
1152  * will return the C++ string representing the array access at the correct offset
-
1153  *
-
1154  * \param symbol The symbol of a variable for which we want to obtain its name
-
1155  * \param name The name of the index variable
-
1156  * \param use_instance Should the variable be accessed via instance or data array
-
1157  * \return The backend code string representing the access to the given variable
-
1158  * symbol
-
1159  */
-
1160  virtual std::string int_variable_name(const IndexVariableInfo& symbol,
-
1161  const std::string& name,
-
1162  bool use_instance) const = 0;
-
1163 
-
1164 
-
1165  /**
-
1166  * Determine the variable name for a global variable given its symbol
-
1167  * \param symbol The symbol of a variable for which we want to obtain its name
-
1168  * \param use_instance Should the variable be accessed via the (host-only)
-
1169  * global variable or the instance-specific copy (also available on GPU).
-
1170  * \return The C++ string representing the access to the global variable
-
1171  */
-
1172  virtual std::string global_variable_name(const SymbolType& symbol,
-
1173  bool use_instance = true) const = 0;
-
1174 
-
1175 
-
1176  /**
-
1177  * Determine variable name in the structure of mechanism properties
-
1178  *
-
1179  * \param name Variable name that is being printed
-
1180  * \param use_instance Should the variable be accessed via instance or data array
-
1181  * \return The C++ string representing the access to the variable in the neuron
-
1182  * thread structure
-
1183  */
-
1184  virtual std::string get_variable_name(const std::string& name,
-
1185  bool use_instance = true) const = 0;
-
1186 
-
1187  /**
-
1188  * The name of the function that updates the table value if the parameters
-
1189  * changed.
-
1190  *
-
1191  * \param block_name The name of the block that contains the TABLE.
-
1192  */
-
1193  std::string table_update_function_name(const std::string& block_name) const;
-
1194 
-
1195  /**
-
1196  * Return ion variable name and corresponding ion read variable name.
-
1197  *
-
1198  * Example:
-
1199  * {"ena", "ion_ena"} = read_ion_variable_name("ena");
-
1200  *
-
1201  * \param name The ion variable name
-
1202  * \return The ion read variable name
-
1203  */
-
1204  static std::pair<std::string, std::string> read_ion_variable_name(const std::string& name);
-
1205 
-
1206 
-
1207  /**
-
1208  * Return ion variable name and corresponding ion write variable name
-
1209  *
-
1210  * Example:
-
1211  * {"ion_ena", "ena"} = write_ion_variable_name("ena");
-
1212  *
-
1213  * \param name The ion variable name
-
1214  * \return The ion write variable name
-
1215  */
-
1216  static std::pair<std::string, std::string> write_ion_variable_name(const std::string& name);
-
1217 
+
1107  void print_namespace_stop();
+
1108 
+
1109  /**
+
1110  * Prints f"using namespace {namespace_name()}".
+
1111  */
+
1112  void print_using_namespace();
+
1113 
+
1114  /****************************************************************************************/
+
1115  /* Routines for returning variable name */
+
1116  /****************************************************************************************/
+
1117 
+
1118  /**
+
1119  * Determine the updated name if the ion variable has been optimized
+
1120  * \param name The ion variable name
+
1121  * \return The updated name of the variable has been optimized (e.g. \c ena --> \c ion_ena)
+
1122  */
+
1123  std::string update_if_ion_variable_name(const std::string& name) const;
+
1124 
+
1125 
+
1126  /**
+
1127  * Determine the name of a \c float variable given its symbol
+
1128  *
+
1129  * This function typically returns the accessor expression in backend code for the given symbol.
+
1130  * Since the model variables are stored in data arrays and accessed by offset, this function
+
1131  * will return the C++ string representing the array access at the correct offset
+
1132  *
+
1133  * \param symbol The symbol of a variable for which we want to obtain its name
+
1134  * \param use_instance Should the variable be accessed via instance or data array
+
1135  * \return The backend code string representing the access to the given variable
+
1136  * symbol
+
1137  */
+
1138  virtual std::string float_variable_name(const SymbolType& symbol, bool use_instance) const = 0;
+
1139 
+
1140 
+
1141  /**
+
1142  * Determine the name of an \c int variable given its symbol
+
1143  *
+
1144  * This function typically returns the accessor expression in backend code for the given symbol.
+
1145  * Since the model variables are stored in data arrays and accessed by offset, this function
+
1146  * will return the C++ string representing the array access at the correct offset
+
1147  *
+
1148  * \param symbol The symbol of a variable for which we want to obtain its name
+
1149  * \param name The name of the index variable
+
1150  * \param use_instance Should the variable be accessed via instance or data array
+
1151  * \return The backend code string representing the access to the given variable
+
1152  * symbol
+
1153  */
+
1154  virtual std::string int_variable_name(const IndexVariableInfo& symbol,
+
1155  const std::string& name,
+
1156  bool use_instance) const = 0;
+
1157 
+
1158 
+
1159  /**
+
1160  * Determine the variable name for a global variable given its symbol
+
1161  * \param symbol The symbol of a variable for which we want to obtain its name
+
1162  * \param use_instance Should the variable be accessed via the (host-only)
+
1163  * global variable or the instance-specific copy (also available on GPU).
+
1164  * \return The C++ string representing the access to the global variable
+
1165  */
+
1166  virtual std::string global_variable_name(const SymbolType& symbol,
+
1167  bool use_instance = true) const = 0;
+
1168 
+
1169 
+
1170  /**
+
1171  * Determine variable name in the structure of mechanism properties
+
1172  *
+
1173  * \param name Variable name that is being printed
+
1174  * \param use_instance Should the variable be accessed via instance or data array
+
1175  * \return The C++ string representing the access to the variable in the neuron
+
1176  * thread structure
+
1177  */
+
1178  virtual std::string get_variable_name(const std::string& name,
+
1179  bool use_instance = true) const = 0;
+
1180 
+
1181  /**
+
1182  * The name of the function that updates the table value if the parameters
+
1183  * changed.
+
1184  *
+
1185  * \param block_name The name of the block that contains the TABLE.
+
1186  */
+
1187  std::string table_update_function_name(const std::string& block_name) const;
+
1188 
+
1189  /**
+
1190  * Return ion variable name and corresponding ion read variable name.
+
1191  *
+
1192  * Example:
+
1193  * {"ena", "ion_ena"} = read_ion_variable_name("ena");
+
1194  *
+
1195  * \param name The ion variable name
+
1196  * \return The ion read variable name
+
1197  */
+
1198  static std::pair<std::string, std::string> read_ion_variable_name(const std::string& name);
+
1199 
+
1200 
+
1201  /**
+
1202  * Return ion variable name and corresponding ion write variable name
+
1203  *
+
1204  * Example:
+
1205  * {"ion_ena", "ena"} = write_ion_variable_name("ena");
+
1206  *
+
1207  * \param name The ion variable name
+
1208  * \return The ion write variable name
+
1209  */
+
1210  static std::pair<std::string, std::string> write_ion_variable_name(const std::string& name);
+
1211 
+
1212 
+
1213  int get_int_variable_index(const std::string& var_name);
+
1214 
+
1215  /****************************************************************************************/
+
1216  /* Main printing routines for code generation */
+
1217  /****************************************************************************************/
1218 
-
1219  int get_int_variable_index(const std::string& var_name);
-
1220 
-
1221  /****************************************************************************************/
-
1222  /* Main printing routines for code generation */
-
1223  /****************************************************************************************/
+
1219 
+
1220  /**
+
1221  * Print top file header printed in generated code
+
1222  */
+
1223  void print_backend_info();
1224 
1225 
1226  /**
-
1227  * Print top file header printed in generated code
+
1227  * Print standard C/C++ includes
1228  */
-
1229  void print_backend_info();
+
1229  virtual void print_standard_includes() = 0;
1230 
-
1231 
-
1232  /**
-
1233  * Print standard C/C++ includes
-
1234  */
-
1235  virtual void print_standard_includes() = 0;
-
1236 
-
1237 
-
1238  virtual void print_sdlists_init(bool print_initializers) = 0;
-
1239 
-
1240 
-
1241  /**
-
1242  * Print the structure that wraps all global variables used in the NMODL
-
1243  *
-
1244  * \param print_initializers Whether to include default values in the struct
-
1245  * definition (true: int foo{42}; false: int foo;)
+
1231 
+
1232  virtual void print_sdlists_init(bool print_initializers) = 0;
+
1233 
+
1234 
+
1235  /**
+
1236  * Print the structure that wraps all global variables used in the NMODL
+
1237  *
+
1238  * \param print_initializers Whether to include default values in the struct
+
1239  * definition (true: int foo{42}; false: int foo;)
+
1240  */
+
1241  virtual void print_mechanism_global_var_structure(bool print_initializers) = 0;
+
1242 
+
1243 
+
1244  /**
+
1245  * Print static assertions about the global variable struct.
1246  */
-
1247  virtual void print_mechanism_global_var_structure(bool print_initializers) = 0;
+
1247  virtual void print_global_var_struct_assertions() const;
1248 
1249 
1250  /**
-
1251  * Print static assertions about the global variable struct.
-
1252  */
-
1253  virtual void print_global_var_struct_assertions() const;
-
1254 
-
1255 
-
1256  /**
-
1257  * Print the entries of for FUNCTION_TABLEs in the global struct.
-
1258  *
-
1259  * And creates the required GLOBAL variables.
+
1251  * Print the entries of for FUNCTION_TABLEs in the global struct.
+
1252  *
+
1253  * And creates the required GLOBAL variables.
+
1254  */
+ +
1256 
+
1257 
+
1258  /**
+
1259  * Print declaration of macro NRN_PRCELLSTATE for debugging
1260  */
- +
1261  void print_prcellstate_macros() const;
1262 
1263 
1264  /**
-
1265  * Print declaration of macro NRN_PRCELLSTATE for debugging
-
1266  */
-
1267  void print_prcellstate_macros() const;
-
1268 
-
1269 
-
1270  /**
-
1271  * Print backend code for byte array that has mechanism information (to be registered
-
1272  * with NEURON/CoreNEURON)
-
1273  */
-
1274  void print_mechanism_info();
-
1275 
-
1276 
-
1277  /**
-
1278  * Print byte arrays that register scalar and vector variables for hoc interface
-
1279  *
-
1280  */
-
1281  virtual void print_global_variables_for_hoc() = 0;
-
1282 
-
1283 
-
1284  /**
-
1285  * Print the mechanism registration function
-
1286  *
-
1287  */
-
1288  virtual void print_mechanism_register() = 0;
-
1289 
-
1290 
-
1291  /**
-
1292  * Print common code for global functions like nrn_init, nrn_cur and nrn_state
-
1293  * \param type The target backend code block type
-
1294  */
-
1295  virtual void print_global_function_common_code(BlockType type,
-
1296  const std::string& function_name = "") = 0;
-
1297 
-
1298 
-
1299  /**
-
1300  * Print nrn_constructor function definition
-
1301  *
-
1302  */
-
1303  virtual void print_nrn_constructor() = 0;
-
1304 
-
1305 
-
1306  /**
-
1307  * Print nrn_destructor function definition
-
1308  *
-
1309  */
-
1310  virtual void print_nrn_destructor() = 0;
-
1311 
-
1312 
-
1313  /**
-
1314  * Print nrn_alloc function definition
-
1315  *
-
1316  */
-
1317  virtual void print_nrn_alloc() = 0;
-
1318 
-
1319 
-
1320  /****************************************************************************************/
-
1321  /* Print nrn_state routine */
-
1322  /****************************************************************************************/
+
1265  * Print backend code for byte array that has mechanism information (to be registered
+
1266  * with NEURON/CoreNEURON)
+
1267  */
+
1268  void print_mechanism_info();
+
1269 
+
1270 
+
1271  /**
+
1272  * Print byte arrays that register scalar and vector variables for hoc interface
+
1273  *
+
1274  */
+
1275  virtual void print_global_variables_for_hoc() = 0;
+
1276 
+
1277 
+
1278  /**
+
1279  * Print the mechanism registration function
+
1280  *
+
1281  */
+
1282  virtual void print_mechanism_register() = 0;
+
1283 
+
1284 
+
1285  /**
+
1286  * Print common code for global functions like nrn_init, nrn_cur and nrn_state
+
1287  * \param type The target backend code block type
+
1288  */
+
1289  virtual void print_global_function_common_code(BlockType type,
+
1290  const std::string& function_name = "") = 0;
+
1291 
+
1292 
+
1293  /**
+
1294  * Print nrn_constructor function definition
+
1295  *
+
1296  */
+
1297  virtual void print_nrn_constructor() = 0;
+
1298 
+
1299 
+
1300  /**
+
1301  * Print nrn_destructor function definition
+
1302  *
+
1303  */
+
1304  virtual void print_nrn_destructor() = 0;
+
1305 
+
1306 
+
1307  /**
+
1308  * Print nrn_alloc function definition
+
1309  *
+
1310  */
+
1311  virtual void print_nrn_alloc() = 0;
+
1312 
+
1313 
+
1314  /****************************************************************************************/
+
1315  /* Print nrn_state routine */
+
1316  /****************************************************************************************/
+
1317 
+
1318 
+
1319  /**
+
1320  * Print nrn_state / state update function definition
+
1321  */
+
1322  virtual void print_nrn_state() = 0;
1323 
-
1324 
-
1325  /**
-
1326  * Print nrn_state / state update function definition
-
1327  */
-
1328  virtual void print_nrn_state() = 0;
-
1329 
-
1330 
-
1331  /****************************************************************************************/
-
1332  /* Print nrn_cur related routines */
-
1333  /****************************************************************************************/
-
1334 
-
1335 
-
1336  /**
-
1337  * Print the \c nrn_current kernel
-
1338  *
-
1339  * \note nrn_cur_kernel will have two calls to nrn_current if no conductance keywords specified
-
1340  * \param node the AST node representing the NMODL breakpoint block
-
1341  */
-
1342  virtual void print_nrn_current(const ast::BreakpointBlock& node) = 0;
-
1343 
-
1344 
-
1345  /**
-
1346  * Print the \c nrn\_cur kernel with NMODL \c conductance keyword provisions
-
1347  *
-
1348  * If the NMODL \c conductance keyword is used in the \c breakpoint block, then
-
1349  * CodegenCoreneuronCppVisitor::print_nrn_cur_kernel will use this printer
-
1350  *
-
1351  * \param node the AST node representing the NMODL breakpoint block
-
1352  */
-
1353  virtual void print_nrn_cur_conductance_kernel(const ast::BreakpointBlock& node) = 0;
-
1354 
-
1355 
-
1356  /**
-
1357  * Print the \c nrn\_cur kernel without NMODL \c conductance keyword provisions
-
1358  *
-
1359  * If the NMODL \c conductance keyword is \b not used in the \c breakpoint block, then
-
1360  * CodegenCoreneuronCppVisitor::print_nrn_cur_kernel will use this printer
-
1361  */
-
1362  virtual void print_nrn_cur_non_conductance_kernel() = 0;
-
1363 
-
1364 
-
1365  /**
-
1366  * Print main body of nrn_cur function
-
1367  * \param node the AST node representing the NMODL breakpoint block
+
1324 
+
1325  /****************************************************************************************/
+
1326  /* Print nrn_cur related routines */
+
1327  /****************************************************************************************/
+
1328 
+
1329 
+
1330  /**
+
1331  * Print the \c nrn_current kernel
+
1332  *
+
1333  * \note nrn_cur_kernel will have two calls to nrn_current if no conductance keywords specified
+
1334  * \param node the AST node representing the NMODL breakpoint block
+
1335  */
+
1336  virtual void print_nrn_current(const ast::BreakpointBlock& node) = 0;
+
1337 
+
1338 
+
1339  /**
+
1340  * Print the \c nrn\_cur kernel with NMODL \c conductance keyword provisions
+
1341  *
+
1342  * If the NMODL \c conductance keyword is used in the \c breakpoint block, then
+
1343  * CodegenCoreneuronCppVisitor::print_nrn_cur_kernel will use this printer
+
1344  *
+
1345  * \param node the AST node representing the NMODL breakpoint block
+
1346  */
+
1347  virtual void print_nrn_cur_conductance_kernel(const ast::BreakpointBlock& node) = 0;
+
1348 
+
1349 
+
1350  /**
+
1351  * Print the \c nrn\_cur kernel without NMODL \c conductance keyword provisions
+
1352  *
+
1353  * If the NMODL \c conductance keyword is \b not used in the \c breakpoint block, then
+
1354  * CodegenCoreneuronCppVisitor::print_nrn_cur_kernel will use this printer
+
1355  */
+
1356  virtual void print_nrn_cur_non_conductance_kernel() = 0;
+
1357 
+
1358 
+
1359  /**
+
1360  * Print main body of nrn_cur function
+
1361  * \param node the AST node representing the NMODL breakpoint block
+
1362  */
+
1363  virtual void print_nrn_cur_kernel(const ast::BreakpointBlock& node) = 0;
+
1364 
+
1365 
+
1366  /**
+
1367  * Print fast membrane current calculation code
1368  */
-
1369  virtual void print_nrn_cur_kernel(const ast::BreakpointBlock& node) = 0;
+
1369  virtual void print_fast_imem_calculation() = 0;
1370 
1371 
1372  /**
-
1373  * Print fast membrane current calculation code
+
1373  * Print nrn_cur / current update function definition
1374  */
-
1375  virtual void print_fast_imem_calculation() = 0;
+
1375  virtual void print_nrn_cur() = 0;
1376 
-
1377 
-
1378  /**
-
1379  * Print nrn_cur / current update function definition
-
1380  */
-
1381  virtual void print_nrn_cur() = 0;
-
1382 
-
1383 
-
1384  /****************************************************************************************/
-
1385  /* Main code printing entry points */
-
1386  /****************************************************************************************/
-
1387 
-
1388 
-
1389  /**
-
1390  * Print all includes
-
1391  *
-
1392  */
-
1393  virtual void print_headers_include() = 0;
-
1394 
-
1395 
-
1396  /**
-
1397  * Print all classes
-
1398  * \param print_initializers Whether to include default values.
+
1377 
+
1378  /****************************************************************************************/
+
1379  /* Main code printing entry points */
+
1380  /****************************************************************************************/
+
1381 
+
1382 
+
1383  /**
+
1384  * Print all includes
+
1385  *
+
1386  */
+
1387  virtual void print_headers_include() = 0;
+
1388 
+
1389 
+
1390  /**
+
1391  * Print all classes
+
1392  * \param print_initializers Whether to include default values.
+
1393  */
+
1394  virtual void print_data_structures(bool print_initializers) = 0;
+
1395 
+
1396 
+
1397  /**
+
1398  * Set v_unused (voltage) for NRN_PRCELLSTATE feature
1399  */
-
1400  virtual void print_data_structures(bool print_initializers) = 0;
+
1400  virtual void print_v_unused() const = 0;
1401 
1402 
1403  /**
-
1404  * Set v_unused (voltage) for NRN_PRCELLSTATE feature
+
1404  * Set g_unused (conductance) for NRN_PRCELLSTATE feature
1405  */
-
1406  virtual void print_v_unused() const = 0;
+
1406  virtual void print_g_unused() const = 0;
1407 
1408 
1409  /**
-
1410  * Set g_unused (conductance) for NRN_PRCELLSTATE feature
-
1411  */
-
1412  virtual void print_g_unused() const = 0;
-
1413 
-
1414 
-
1415  /**
-
1416  * Print all compute functions for every backend
-
1417  *
-
1418  */
-
1419  virtual void print_compute_functions() = 0;
-
1420 
-
1421 
-
1422  /**
-
1423  * Print entry point to code generation
-
1424  *
-
1425  */
-
1426  virtual void print_codegen_routines() = 0;
-
1427 
-
1428  std::unordered_map<CppObjectSpecifier, std::string> object_specifier_map = {
-
1429  {CppObjectSpecifier::Inline, "inline"},
-
1430  {CppObjectSpecifier::Static, "static"},
-
1431  {CppObjectSpecifier::Constexpr, "constexpr"},
-
1432  {CppObjectSpecifier::Volatile, "volatile"},
-
1433  {CppObjectSpecifier::Virtual, "virtual"},
-
1434  {CppObjectSpecifier::Explicit, "explicit"},
-
1435  {CppObjectSpecifier::Friend, "friend"},
-
1436  {CppObjectSpecifier::Extern, "extern"},
-
1437  {CppObjectSpecifier::ExternC, "extern \"C\""},
-
1438  {CppObjectSpecifier::ThreadLocal, "thread_local"},
-
1439  {CppObjectSpecifier::Const, "const"}};
-
1440 
-
1441 
-
1442  /**
-
1443  * Print the nmodl constants used in backend code
-
1444  *
-
1445  * Currently we define three basic constants, which are assumed to be present in NMODL, directly
-
1446  * in the backend code:
-
1447  *
-
1448  * \code
-
1449  * static const double FARADAY = 96485.3;
-
1450  * static const double PI = 3.14159;
-
1451  * static const double R = 8.3145;
-
1452  * \endcode
-
1453  */
-
1454  void print_nmodl_constants();
-
1455 
-
1456  /**
-
1457  * Print top level (global scope) verbatim blocks
-
1458  */
- -
1460 
-
1461 
-
1462  /****************************************************************************************/
-
1463  /* Overloaded visitor routines */
-
1464  /****************************************************************************************/
-
1465  void visit_binary_expression(const ast::BinaryExpression& node) override;
-
1466  void visit_binary_operator(const ast::BinaryOperator& node) override;
-
1467  void visit_boolean(const ast::Boolean& node) override;
-
1468  void visit_double(const ast::Double& node) override;
-
1469  void visit_else_if_statement(const ast::ElseIfStatement& node) override;
-
1470  void visit_else_statement(const ast::ElseStatement& node) override;
-
1471  void visit_float(const ast::Float& node) override;
-
1472  void visit_from_statement(const ast::FromStatement& node) override;
-
1473  void visit_function_call(const ast::FunctionCall& node) override;
-
1474  void visit_if_statement(const ast::IfStatement& node) override;
-
1475  void visit_indexed_name(const ast::IndexedName& node) override;
-
1476  void visit_integer(const ast::Integer& node) override;
-
1477  void visit_local_list_statement(const ast::LocalListStatement& node) override;
-
1478  void visit_name(const ast::Name& node) override;
-
1479  void visit_paren_expression(const ast::ParenExpression& node) override;
-
1480  void visit_prime_name(const ast::PrimeName& node) override;
-
1481  void visit_statement_block(const ast::StatementBlock& node) override;
-
1482  void visit_string(const ast::String& node) override;
-
1483  void visit_unary_operator(const ast::UnaryOperator& node) override;
-
1484  void visit_unit(const ast::Unit& node) override;
-
1485  void visit_var_name(const ast::VarName& node) override;
-
1486  void visit_while_statement(const ast::WhileStatement& node) override;
-
1487  void visit_update_dt(const ast::UpdateDt& node) override;
-
1488  void visit_protect_statement(const ast::ProtectStatement& node) override;
-
1489  void visit_mutex_lock(const ast::MutexLock& node) override;
-
1490  void visit_mutex_unlock(const ast::MutexUnlock& node) override;
-
1491  void visit_solution_expression(const ast::SolutionExpression& node) override;
- - -
1494 
-
1495  std::string compute_method_name(BlockType type) const;
-
1496 
-
1497  // Automatically called as part of `visit_program`.
-
1498  virtual void setup(const ast::Program& node);
-
1499 
-
1500  public:
-
1501 
-
1502  /**
-
1503  * Main and only member function to call after creating an instance of this class.
-
1504  * \param program the AST to translate to C++ code
-
1505  */
-
1506  void visit_program(const ast::Program& program) override;
-
1507 
-
1508 
-
1509  protected:
-
1510 
-
1511  /**
-
1512  * Print the structure that wraps all range and int variables required for the NMODL
-
1513  *
-
1514  * \param print_initializers Whether or not default values for variables
-
1515  * be included in the struct declaration.
+
1410  * Print all compute functions for every backend
+
1411  *
+
1412  */
+
1413  virtual void print_compute_functions() = 0;
+
1414 
+
1415 
+
1416  /**
+
1417  * Print entry point to code generation
+
1418  *
+
1419  */
+
1420  virtual void print_codegen_routines() = 0;
+
1421 
+
1422  std::unordered_map<CppObjectSpecifier, std::string> object_specifier_map = {
+
1423  {CppObjectSpecifier::Inline, "inline"},
+
1424  {CppObjectSpecifier::Static, "static"},
+
1425  {CppObjectSpecifier::Constexpr, "constexpr"},
+
1426  {CppObjectSpecifier::Volatile, "volatile"},
+
1427  {CppObjectSpecifier::Virtual, "virtual"},
+
1428  {CppObjectSpecifier::Explicit, "explicit"},
+
1429  {CppObjectSpecifier::Friend, "friend"},
+
1430  {CppObjectSpecifier::Extern, "extern"},
+
1431  {CppObjectSpecifier::ExternC, "extern \"C\""},
+
1432  {CppObjectSpecifier::ThreadLocal, "thread_local"},
+
1433  {CppObjectSpecifier::Const, "const"}};
+
1434 
+
1435 
+
1436  /**
+
1437  * Print the nmodl constants used in backend code
+
1438  *
+
1439  * Currently we define three basic constants, which are assumed to be present in NMODL, directly
+
1440  * in the backend code:
+
1441  *
+
1442  * \code
+
1443  * static const double FARADAY = 96485.3;
+
1444  * static const double PI = 3.14159;
+
1445  * static const double R = 8.3145;
+
1446  * \endcode
+
1447  */
+
1448  void print_nmodl_constants();
+
1449 
+
1450  /**
+
1451  * Print top level (global scope) verbatim blocks
+
1452  */
+ +
1454 
+
1455 
+
1456  /****************************************************************************************/
+
1457  /* Overloaded visitor routines */
+
1458  /****************************************************************************************/
+
1459  void visit_binary_expression(const ast::BinaryExpression& node) override;
+
1460  void visit_binary_operator(const ast::BinaryOperator& node) override;
+
1461  void visit_boolean(const ast::Boolean& node) override;
+
1462  void visit_double(const ast::Double& node) override;
+
1463  void visit_else_if_statement(const ast::ElseIfStatement& node) override;
+
1464  void visit_else_statement(const ast::ElseStatement& node) override;
+
1465  void visit_float(const ast::Float& node) override;
+
1466  void visit_from_statement(const ast::FromStatement& node) override;
+
1467  void visit_function_call(const ast::FunctionCall& node) override;
+
1468  void visit_if_statement(const ast::IfStatement& node) override;
+
1469  void visit_indexed_name(const ast::IndexedName& node) override;
+
1470  void visit_integer(const ast::Integer& node) override;
+
1471  void visit_local_list_statement(const ast::LocalListStatement& node) override;
+
1472  void visit_name(const ast::Name& node) override;
+
1473  void visit_paren_expression(const ast::ParenExpression& node) override;
+
1474  void visit_prime_name(const ast::PrimeName& node) override;
+
1475  void visit_statement_block(const ast::StatementBlock& node) override;
+
1476  void visit_string(const ast::String& node) override;
+
1477  void visit_unary_operator(const ast::UnaryOperator& node) override;
+
1478  void visit_unit(const ast::Unit& node) override;
+
1479  void visit_var_name(const ast::VarName& node) override;
+
1480  void visit_while_statement(const ast::WhileStatement& node) override;
+
1481  void visit_update_dt(const ast::UpdateDt& node) override;
+
1482  void visit_mutex_lock(const ast::MutexLock& node) override;
+
1483  void visit_mutex_unlock(const ast::MutexUnlock& node) override;
+
1484  void visit_solution_expression(const ast::SolutionExpression& node) override;
+ + +
1487 
+
1488  std::string compute_method_name(BlockType type) const;
+
1489 
+
1490  // Automatically called as part of `visit_program`.
+
1491  virtual void setup(const ast::Program& node);
+
1492 
+
1493  public:
+
1494 
+
1495  /**
+
1496  * Main and only member function to call after creating an instance of this class.
+
1497  * \param program the AST to translate to C++ code
+
1498  */
+
1499  void visit_program(const ast::Program& program) override;
+
1500 
+
1501 
+
1502  protected:
+
1503 
+
1504  /**
+
1505  * Print the structure that wraps all range and int variables required for the NMODL
+
1506  *
+
1507  * \param print_initializers Whether or not default values for variables
+
1508  * be included in the struct declaration.
+
1509  */
+
1510  virtual void print_mechanism_range_var_structure(bool print_initializers) = 0;
+
1511 
+
1512 
+
1513  /**
+
1514  * Print replacement function for function or procedure using table
+
1515  * \param node The AST node representing a function or procedure block
1516  */
-
1517  virtual void print_mechanism_range_var_structure(bool print_initializers) = 0;
+
1518 
1519 
1520  /**
-
1521  * Print replacement function for function or procedure using table
+
1521  * Print \c check\_function() for functions or procedure using table
1522  * \param node The AST node representing a function or procedure block
1523  */
- +
1525 
-
1526 
-
1527  /**
-
1528  * Print \c check\_function() for functions or procedure using table
-
1529  * \param node The AST node representing a function or procedure block
-
1530  */
- -
1532 
-
1533 
- -
1535 
-
1536  std::string get_object_specifiers(const std::unordered_set<CppObjectSpecifier>&);
-
1537 
-
1538  /**
-
1539  * Print prototype declarations of functions or procedures
-
1540  * \tparam T The AST node type of the node (must be of nmodl::ast::Ast or subclass)
-
1541  * \param node The AST node representing the function or procedure block
-
1542  * \param name A user defined name for the function
-
1543  */
-
1544  template <typename T>
-
1545  void print_function_declaration(const T& node,
-
1546  const std::string& name,
-
1547  const std::unordered_set<CppObjectSpecifier>& =
- -
1549 
-
1550  void print_rename_state_vars() const;
-
1551 };
-
1552 
-
1553 template <typename T>
-
1554 void CodegenCppVisitor::print_vector_elements(const std::vector<T>& elements,
-
1555  const std::string& separator,
-
1556  const std::string& prefix) {
-
1557  for (auto iter = elements.begin(); iter != elements.end(); iter++) {
-
1558  printer->add_text(prefix);
-
1559  (*iter)->accept(*this);
-
1560  if (!separator.empty() && !nmodl::utils::is_last(iter, elements)) {
-
1561  printer->add_text(separator);
-
1562  }
-
1563  }
-
1564 }
-
1565 
-
1566 
-
1567 /**
-
1568  * \details If there is an argument with name (say alpha) same as range variable (say alpha),
-
1569  * we want to avoid it being printed as instance->alpha. And hence we disable variable
-
1570  * name lookup during prototype declaration. Note that the name of procedure can be
-
1571  * different in case of table statement.
-
1572  */
-
1573 template <typename T>
- -
1575  const T& node,
-
1576  const std::string& name,
-
1577  const std::unordered_set<CppObjectSpecifier>& specifiers) {
- -
1579  auto type = default_float_data_type();
+
1526 
+ +
1528 
+
1529  std::string get_object_specifiers(const std::unordered_set<CppObjectSpecifier>&);
+
1530 
+
1531  /**
+
1532  * Print prototype declarations of functions or procedures
+
1533  * \tparam T The AST node type of the node (must be of nmodl::ast::Ast or subclass)
+
1534  * \param node The AST node representing the function or procedure block
+
1535  * \param name A user defined name for the function
+
1536  */
+
1537  template <typename T>
+
1538  void print_function_declaration(const T& node,
+
1539  const std::string& name,
+
1540  const std::unordered_set<CppObjectSpecifier>& =
+ +
1542 
+
1543  void print_rename_state_vars() const;
+
1544 };
+
1545 
+
1546 template <typename T>
+
1547 void CodegenCppVisitor::print_vector_elements(const std::vector<T>& elements,
+
1548  const std::string& separator,
+
1549  const std::string& prefix) {
+
1550  for (auto iter = elements.begin(); iter != elements.end(); iter++) {
+
1551  printer->add_text(prefix);
+
1552  (*iter)->accept(*this);
+
1553  if (!separator.empty() && !nmodl::utils::is_last(iter, elements)) {
+
1554  printer->add_text(separator);
+
1555  }
+
1556  }
+
1557 }
+
1558 
+
1559 
+
1560 /**
+
1561  * \details If there is an argument with name (say alpha) same as range variable (say alpha),
+
1562  * we want to avoid it being printed as instance->alpha. And hence we disable variable
+
1563  * name lookup during prototype declaration. Note that the name of procedure can be
+
1564  * different in case of table statement.
+
1565  */
+
1566 template <typename T>
+ +
1568  const T& node,
+
1569  const std::string& name,
+
1570  const std::unordered_set<CppObjectSpecifier>& specifiers) {
+ +
1572  auto type = default_float_data_type();
+
1573 
+
1574  // internal and user provided arguments
+
1575  auto internal_params = internal_method_parameters();
+
1576  const auto& params = node.get_parameters();
+
1577  for (const auto& param: params) {
+
1578  internal_params.emplace_back("", type, "", param.get()->get_node_name());
+
1579  }
1580 
-
1581  // internal and user provided arguments
-
1582  auto internal_params = internal_method_parameters();
-
1583  const auto& params = node.get_parameters();
-
1584  for (const auto& param: params) {
-
1585  internal_params.emplace_back("", type, "", param.get()->get_node_name());
-
1586  }
-
1587 
-
1588  // procedures have "int" return type by default
-
1589  const char* return_type = "int";
-
1590  if (node.is_function_block()) {
-
1591  return_type = default_float_data_type();
-
1592  }
+
1581  // procedures have "int" return type by default
+
1582  const char* return_type = "int";
+
1583  if (node.is_function_block()) {
+
1584  return_type = default_float_data_type();
+
1585  }
+
1586 
+
1587  printer->add_indent();
+
1588  printer->fmt_text("{} {} {}({})",
+
1589  get_object_specifiers(specifiers),
+
1590  return_type,
+
1591  method_name(name),
+
1592  get_parameter_str(internal_params));
1593 
-
1594  printer->add_indent();
-
1595  printer->fmt_text("{} {} {}({})",
-
1596  get_object_specifiers(specifiers),
-
1597  return_type,
-
1598  method_name(name),
-
1599  get_parameter_str(internal_params));
-
1600 
- -
1602 }
-
1603 
-
1604 /** \} */ // end of codegen_backends
-
1605 
-
1606 } // namespace codegen
-
1607 } // namespace nmodl
+ +
1595 }
+
1596 
+
1597 /** \} */ // end of codegen_backends
+
1598 
+
1599 } // namespace codegen
+
1600 } // namespace nmodl
virtual void print_nrn_constructor()=0
Print nrn_constructor function definition.
std::string table_update_function_name(const std::string &block_name) const
The name of the function that updates the table value if the parameters changed.
-
void visit_eigen_linear_solver_block(const ast::EigenLinearSolverBlock &node) override
visit node of type ast::EigenLinearSolverBlock
+
void visit_eigen_linear_solver_block(const ast::EigenLinearSolverBlock &node) override
visit node of type ast::EigenLinearSolverBlock
bool ion_variable_struct_required() const
Check if a structure for ion variables is required.
bool is_last(Iter iter, const Cont &cont)
Check if the iterator is pointing to last element in the container.
int get_length(const std::shared_ptr< symtab::Symbol > &sym)
static bool need_semicolon(const ast::Statement &node)
Check if a semicolon is required at the end of given statement.
-
void update_index_semantics()
populate all index semantics needed for registration with coreneuron
-
void print_table_replacement_function(const ast::Block &)
Print replacement function for function or procedure using table.
+
void update_index_semantics()
populate all index semantics needed for registration with coreneuron
+
void print_table_replacement_function(const ast::Block &)
Print replacement function for function or procedure using table.
virtual std::string register_mechanism_arguments() const =0
Arguments for register_mech or point_register_mech function.
virtual std::pair< ParamVector, ParamVector > function_table_parameters(const ast::FunctionTableBlock &node)=0
Parameters of the function itself "{}" and "table_{}".
@@ -1739,7 +1732,6 @@
void print_eigen_linear_solver(const std::string &float_type, int N)
Print linear solver using Eigen.
const std::shared_ptr< symtab::Symbol > symbol
symbol for the variable
codegen::CodegenInfo info
All ast information for code generation.
-
virtual void print_atomic_reduction_pragma()=0
Print atomic update pragma for reduction statements.
std::string global_struct_instance() const
Name of the (host-only) global instance of global_struct
Represents a double variable.
Definition: double.hpp:53
@@ -1766,7 +1758,7 @@
virtual void print_global_var_struct_assertions() const
Print static assertions about the global variable struct.
bool printing_net_init
true if currently initial block of net_receive being printed
void print_mechanism_info()
Print backend code for byte array that has mechanism information (to be registered with NEURON/CoreNE...
-
void visit_eigen_newton_solver_block(const ast::EigenNewtonSolverBlock &node) override
visit node of type ast::EigenNewtonSolverBlock
+
void visit_eigen_newton_solver_block(const ast::EigenNewtonSolverBlock &node) override
visit node of type ast::EigenNewtonSolverBlock
virtual void print_global_function_common_code(BlockType type, const std::string &function_name="")=0
Print common code for global functions like nrn_init, nrn_cur and nrn_state.
virtual void print_standard_includes()=0
Print standard C/C++ includes.
void visit_prime_name(const ast::PrimeName &node) override
visit node of type ast::PrimeName
@@ -1786,7 +1778,7 @@
Represent MUTEXLOCK statement in NMODL.
Definition: mutex_lock.hpp:38
void print_statement_block(const ast::StatementBlock &node, bool open_brace=true, bool close_brace=true)
Print any statement block in nmodl with option to (not) print braces.
int get_prefixsum_from_name(const std::vector< T > &variables, const std::string &name)
-
void print_function_declaration(const T &node, const std::string &name, const std::unordered_set< CppObjectSpecifier > &={CppObjectSpecifier::Static, CppObjectSpecifier::Inline})
Print prototype declarations of functions or procedures.
+
void print_function_declaration(const T &node, const std::string &name, const std::unordered_set< CppObjectSpecifier > &={CppObjectSpecifier::Static, CppObjectSpecifier::Inline})
Print prototype declarations of functions or procedures.
virtual std::string global_variable_name(const SymbolType &symbol, bool use_instance=true) const =0
Determine the variable name for a global variable given its symbol.
Represents TABLE statement in NMODL.
@@ -1794,8 +1786,8 @@
Represents a variable.
Definition: var_name.hpp:43
Represents an integer variable.
Definition: integer.hpp:49
@ BlockTypeEnd
fake ending block type for loops on the enums. Keep it at the end
-
std::string get_object_specifiers(const std::unordered_set< CppObjectSpecifier > &)
-
std::vector< SymbolType > get_float_variables() const
Determine all float variables required during code generation.
+
std::string get_object_specifiers(const std::unordered_set< CppObjectSpecifier > &)
+
std::vector< SymbolType > get_float_variables() const
Determine all float variables required during code generation.
virtual void print_net_move_call(const ast::FunctionCall &node)=0
Print call to net_move.
const char * default_int_data_type() const noexcept
Default data type for integer (offset) elements.
@@ -1811,19 +1803,19 @@
void print_function(const ast::FunctionBlock &node)
Print NMODL function in target backend code.
virtual void print_nrn_cur_conductance_kernel(const ast::BreakpointBlock &node)=0
Print the nrn_cur kernel with NMODL conductance keyword provisions.
-
void visit_mutex_unlock(const ast::MutexUnlock &node) override
visit node of type ast::MutexUnlock
+
void visit_mutex_unlock(const ast::MutexUnlock &node) override
visit node of type ast::MutexUnlock
bool is_integer
if this is an integer (e.g.
virtual std::string int_variable_name(const IndexVariableInfo &symbol, const std::string &name, bool use_instance) const =0
Determine the name of an int variable given its symbol.
void visit_unit(const ast::Unit &node) override
visit node of type ast::Unit
-
std::unordered_map< CppObjectSpecifier, std::string > object_specifier_map
+
std::unordered_map< CppObjectSpecifier, std::string > object_specifier_map
Represent newton solver solution block based on Eigen.
void visit_update_dt(const ast::UpdateDt &node) override
visit node of type ast::UpdateDt
-
void print_vector_elements(const std::vector< T > &elements, const std::string &separator, const std::string &prefix="")
Print the items in a vector as a list.
+
void print_vector_elements(const std::vector< T > &elements, const std::string &separator, const std::string &prefix="")
Print the items in a vector as a list.
bool is_function_table_call(const std::string &name) const
IndexVariableInfo(std::shared_ptr< symtab::Symbol > symbol, bool is_vdata=false, bool is_index=false, bool is_integer=false)
virtual void add_variable_point_process(std::vector< IndexVariableInfo > &variables)=0
Add the variable point_process during get_int_variables.
static constexpr char DEFAULT_FLOAT_TYPE[]
default float variable type
-
std::vector< IndexVariableInfo > get_int_variables()
Determine all int variables required during code generation.
+
std::vector< IndexVariableInfo > get_int_variables()
Determine all int variables required during code generation.
virtual std::string nrn_thread_internal_arguments()=0
Arguments for "_threadargs_" macro in neuron implementation.
void visit_function_call(const ast::FunctionCall &node) override
visit node of type ast::FunctionCall
@@ -1846,13 +1838,12 @@
virtual void add_variable_tqitem(std::vector< IndexVariableInfo > &variables)=0
Add the variable tqitem during get_int_variables.
virtual std::string simulator_name()=0
Name of the simulator the code was generated for.
-
virtual void setup(const ast::Program &node)
+
virtual void setup(const ast::Program &node)
void visit_unary_operator(const ast::UnaryOperator &node) override
visit node of type ast::UnaryOperator
-
void visit_mutex_lock(const ast::MutexLock &node) override
visit node of type ast::MutexLock
+
void visit_mutex_lock(const ast::MutexLock &node) override
visit node of type ast::MutexLock
virtual void print_net_event_call(const ast::FunctionCall &node)=0
Print call to net_event.
void visit_boolean(const ast::Boolean &node) override
visit node of type ast::Boolean
bool nrn_cur_required() const noexcept
Check if nrn_cur function is required.
-
std::vector< std::string > ion_read_statements_optimized(BlockType type) const
For a given output block type, return minimal statements for all read ion variables.
virtual void print_net_send_call(const ast::FunctionCall &node)=0
Print call to net_send.
@@ -1870,7 +1861,7 @@
void visit_string(const ast::String &node) override
visit node of type ast::String
@ NetReceive
net_receive block
-
void visit_solution_expression(const ast::SolutionExpression &node) override
visit node of type ast::SolutionExpression
+
void visit_solution_expression(const ast::SolutionExpression &node) override
visit node of type ast::SolutionExpression
virtual void print_nrn_pointing(const ast::FunctionCall &node)
Print nrn_pointing.
const char * local_var_type() const noexcept
Data type for the local variables.
@@ -1880,7 +1871,7 @@
virtual void print_function_table_call(const ast::FunctionCall &node)=0
Print special code when calling FUNCTION_TABLEs.
void print_nmodl_constants()
Print the nmodl constants used in backend code.
-
void print_table_check_function(const ast::Block &)
Print check_function() for functions or procedure using table.
+
void print_table_check_function(const ast::Block &)
Print check_function() for functions or procedure using table.
Represents a prime variable (for ODE)
Definition: prime_name.hpp:48
static std::pair< std::string, std::string > read_ion_variable_name(const std::string &name)
Return ion variable name and corresponding ion read variable name.
static std::string get_arg_str(const ParamVector &params)
Generate the string representing the parameters in a function call.
@@ -1896,12 +1887,12 @@
Represent linear solver solution block based on Eigen.
bool printing_net_receive
true if currently net_receive block being printed
Statement to indicate a change in timestep in a given block.
Definition: update_dt.hpp:38
-
const ast::TableStatement * get_table_statement(const ast::Block &)
+
const ast::TableStatement * get_table_statement(const ast::Block &)
virtual void print_global_variables_for_hoc()=0
Print byte arrays that register scalar and vector variables for hoc interface.
std::string format_float_string(const std::string &value)
Convert a given float value to its string representation.
-
std::tuple< bool, int > check_if_var_is_array(const std::string &name)
Check if the given name exist in the symbol.
+
std::tuple< bool, int > check_if_var_is_array(const std::string &name)
Check if the given name exist in the symbol.
bool is_functor_const(const ast::StatementBlock &variable_block, const ast::StatementBlock &functor_block)
Checks whether the functor_block generated by sympy solver modifies any variable outside its scope.
static std::string get_parameter_str(const ParamVector &params)
Generate the string representing the procedure parameter declaration.
@@ -1919,11 +1910,10 @@
virtual ParamVector internal_method_parameters()=0
Parameters for internally defined functions.
virtual void print_nrn_destructor()=0
Print nrn_destructor function definition.
void visit_local_list_statement(const ast::LocalListStatement &node) override
visit node of type ast::LocalListStatement
-
void visit_protect_statement(const ast::ProtectStatement &node) override
visit node of type ast::ProtectStatement
Represents ion write statement during code generation.
virtual void print_mechanism_range_var_structure(bool print_initializers)=0
Print the structure that wraps all range and int variables required for the NMODL.
-
SymbolType make_symbol(const std::string &name) const
Creates a temporary symbol.
+
SymbolType make_symbol(const std::string &name) const
Creates a temporary symbol.
std::string float_type
Data type of floating point variables.
Operator used in ast::BinaryExpression.
bool defined_method(const std::string &name) const
Check if given method is defined in this model.
@@ -1950,9 +1940,9 @@
Visitor for printing C++ code compatible with legacy api of CoreNEURON
CodegenCppVisitor(std::string mod_filename, std::ostream &stream, std::string float_type, const bool optimize_ionvar_copies, std::unique_ptr< nmodl::utils::Blame > blame=nullptr)
Constructs the C++ code generator visitor.
std::string instance_struct() const
Name of structure that wraps range variables.
-
std::string compute_method_name(BlockType type) const
+
std::string compute_method_name(BlockType type) const
Represents a name.
Definition: name.hpp:44
-
void visit_program(const ast::Program &program) override
Main and only member function to call after creating an instance of this class.
+
void visit_program(const ast::Program &program) override
Main and only member function to call after creating an instance of this class.
std::string mod_filename
Name of mod file (without .mod suffix)
virtual std::string get_variable_name(const std::string &name, bool use_instance=true) const =0
Determine variable name in the structure of mechanism properties.
Represents top level AST node for whole NMODL input.
Definition: program.hpp:39
@@ -1961,14 +1951,14 @@
void print_prcellstate_macros() const
Print declaration of macro NRN_PRCELLSTATE for debugging.
std::unique_ptr< CodePrinter > printer
Code printer object for target (C++)
- +
bool nrn_state_required() const noexcept
Check if nrn_state function is required.
@ State
derivative block
-
std::string add_escape_quote(const std::string &text) const
Add quotes to string to be output.
+
std::string add_escape_quote(const std::string &text) const
Add quotes to string to be output.
bool internal_method_call_encountered
true if internal method call was encountered while processing verbatim block
virtual void print_v_unused() const =0
Set v_unused (voltage) for NRN_PRCELLSTATE feature.
-
std::string method_name(const std::string &name) const
Constructs the name of a function or procedure.
+
std::string method_name(const std::string &name) const
Constructs the name of a function or procedure.
bool is_net_event(const std::string &name) const noexcept
Checks if given function name is net_event.
Represents binary expression in the NMODL.
diff --git a/doxygen/codegen__neuron__cpp__visitor_8hpp_source.html b/doxygen/codegen__neuron__cpp__visitor_8hpp_source.html index 8ae823a7e..86cd7c5db 100644 --- a/doxygen/codegen__neuron__cpp__visitor_8hpp_source.html +++ b/doxygen/codegen__neuron__cpp__visitor_8hpp_source.html @@ -248,895 +248,887 @@
152  /****************************************************************************************/
153  /* Backend specific routines */
154  /****************************************************************************************/
-
155 
-
156 
-
157  /**
-
158  * Print atomic update pragma for reduction statements
-
159  */
-
160  void print_atomic_reduction_pragma() override;
-
161 
-
162 
-
163  /**
-
164  * Check if ion variable copies should be avoided
-
165  */
-
166  bool optimize_ion_variable_copies() const override;
-
167 
-
168  /****************************************************************************************/
-
169  /* Printing routines for code generation */
-
170  /****************************************************************************************/
-
171 
-
172  /**
-
173  * Print NET_RECEIVE{ INITIAL{ ... }} block.
-
174  */
-
175  void print_net_init();
+
155 
+
156  /**
+
157  * Check if ion variable copies should be avoided
+
158  */
+
159  bool optimize_ion_variable_copies() const override;
+
160 
+
161  /****************************************************************************************/
+
162  /* Printing routines for code generation */
+
163  /****************************************************************************************/
+
164 
+
165  /**
+
166  * Print NET_RECEIVE{ INITIAL{ ... }} block.
+
167  */
+
168  void print_net_init();
+
169 
+
170  /**
+
171  * Print call to \c net\_send
+
172  * \param node The AST node representing the function call
+
173  */
+
174  void print_net_send_call(const ast::FunctionCall& node) override;
+
175 
176 
177  /**
-
178  * Print call to \c net\_send
+
178  * Print call to net\_move
179  * \param node The AST node representing the function call
180  */
-
181  void print_net_send_call(const ast::FunctionCall& node) override;
+
181  void print_net_move_call(const ast::FunctionCall& node) override;
182 
183 
184  /**
-
185  * Print call to net\_move
+
185  * Print call to net\_event
186  * \param node The AST node representing the function call
187  */
-
188  void print_net_move_call(const ast::FunctionCall& node) override;
+
188  void print_net_event_call(const ast::FunctionCall& node) override;
189 
-
190 
-
191  /**
-
192  * Print call to net\_event
-
193  * \param node The AST node representing the function call
+
190  void print_function_table_call(const ast::FunctionCall& node) override;
+
191 
+
192  /**
+
193  * Print `net_receive` call-back.
194  */
-
195  void print_net_event_call(const ast::FunctionCall& node) override;
-
196 
-
197  void print_function_table_call(const ast::FunctionCall& node) override;
+
195  void print_net_receive();
+ +
198 
199  /**
-
200  * Print `net_receive` call-back.
+
200  * Print code to register the call-back for the NET_RECEIVE block.
201  */
-
202  void print_net_receive();
- - -
205 
-
206  /**
-
207  * Print code to register the call-back for the NET_RECEIVE block.
+ +
203 
+
204  /**
+
205  * Print POINT_PROCESS related functions
+
206  * Wrap external NEURON functions related to POINT_PROCESS mechanisms
+
207  *
208  */
- +
210 
211  /**
-
212  * Print POINT_PROCESS related functions
-
213  * Wrap external NEURON functions related to POINT_PROCESS mechanisms
-
214  *
-
215  */
- +
212  * Print NEURON functions related to setting global variables of the mechanism
+
213  *
+
214  */
+ +
216 
217 
218  /**
-
219  * Print NEURON functions related to setting global variables of the mechanism
-
220  *
-
221  */
- -
223 
-
224 
-
225  /**
-
226  * Print function and procedures prototype declaration
-
227  */
-
228  void print_function_prototypes() override;
-
229 
-
230 
-
231  /**
-
232  * Print function and procedures prototype definitions.
-
233  *
-
234  * This includes the HOC/Python wrappers.
-
235  */
- +
219  * Print function and procedures prototype declaration
+
220  */
+
221  void print_function_prototypes() override;
+
222 
+
223 
+
224  /**
+
225  * Print function and procedures prototype definitions.
+
226  *
+
227  * This includes the HOC/Python wrappers.
+
228  */
+ +
230 
+
231 
+
232  /**
+
233  * Print all `check_*` function declarations
+
234  */
+ +
236 
237 
-
238 
-
239  /**
-
240  * Print all `check_*` function declarations
-
241  */
- -
243 
-
244 
-
245  void print_function_or_procedure(const ast::Block& node,
-
246  const std::string& name,
-
247  const std::unordered_set<CppObjectSpecifier>& specifiers = {
-
248  CppObjectSpecifier::Inline}) override;
+
238  void print_function_or_procedure(const ast::Block& node,
+
239  const std::string& name,
+
240  const std::unordered_set<CppObjectSpecifier>& specifiers = {
+
241  CppObjectSpecifier::Inline}) override;
+
242 
+
243 
+
244  /**
+
245  * Common helper function to help printing function or procedure blocks
+
246  * \param node the AST node representing the function or procedure in NMODL
+
247  */
+
248  void print_function_procedure_helper(const ast::Block& node) override;
249 
250 
-
251  /**
-
252  * Common helper function to help printing function or procedure blocks
-
253  * \param node the AST node representing the function or procedure in NMODL
-
254  */
-
255  void print_function_procedure_helper(const ast::Block& node) override;
-
256 
-
257 
-
258  /** Print the wrapper for calling FUNCION/PROCEDURES from HOC/Py.
-
259  *
-
260  * Usually the function is made up of the following parts:
-
261  * * Print setup code `inst`, etc.
-
262  * * Print code to call the function and return.
-
263  */
-
264  void print_hoc_py_wrapper(const ast::Block* function_or_procedure_block,
-
265  InterpreterWrapper wrapper_type);
-
266 
-
267  /** Print the setup code for HOC/Py wrapper.
-
268  */
-
269  void print_hoc_py_wrapper_setup(const ast::Block* function_or_procedure_block,
-
270  InterpreterWrapper wrapper_type);
-
271 
-
272 
-
273  /** Print the code that calls the impl from the HOC/Py wrapper.
-
274  */
-
275  void print_hoc_py_wrapper_call_impl(const ast::Block* function_or_procedure_block,
-
276  InterpreterWrapper wrapper_type);
-
277 
-
278  /** Return the wrapper signature.
-
279  *
-
280  * Everything without the `{` or `;`. Roughly, as an example:
-
281  * <return_type> <function_name>(<internal_args>, <args>)
-
282  *
-
283  * were `<internal_args> is the list of arguments required by the
-
284  * codegen to be passed along, while <args> are the arguments of
-
285  * of the function as they appear in the MOD file.
-
286  */
-
287  std::string hoc_py_wrapper_signature(const ast::Block* function_or_procedure_block,
-
288  InterpreterWrapper wrapper_type);
-
289 
- -
291 
-
292  /**
-
293  * Prints the callbacks required for LONGITUDINAL_DIFFUSION.
-
294  */
- -
296 
-
297  /**
-
298  * Parameters for what NEURON calls `ldifusfunc1_t`.
-
299  */
- -
301 
-
302  /**
-
303  * Parameters for what NEURON calls `ldifusfunc3_t`.
-
304  */
- -
306 
-
307 
-
308  /****************************************************************************************/
-
309  /* Code-specific helper routines */
-
310  /****************************************************************************************/
-
311 
-
312  void add_variable_tqitem(std::vector<IndexVariableInfo>& variables) override;
-
313  void add_variable_point_process(std::vector<IndexVariableInfo>& variables) override;
+
251  /** Print the wrapper for calling FUNCION/PROCEDURES from HOC/Py.
+
252  *
+
253  * Usually the function is made up of the following parts:
+
254  * * Print setup code `inst`, etc.
+
255  * * Print code to call the function and return.
+
256  */
+
257  void print_hoc_py_wrapper(const ast::Block* function_or_procedure_block,
+
258  InterpreterWrapper wrapper_type);
+
259 
+
260  /** Print the setup code for HOC/Py wrapper.
+
261  */
+
262  void print_hoc_py_wrapper_setup(const ast::Block* function_or_procedure_block,
+
263  InterpreterWrapper wrapper_type);
+
264 
+
265 
+
266  /** Print the code that calls the impl from the HOC/Py wrapper.
+
267  */
+
268  void print_hoc_py_wrapper_call_impl(const ast::Block* function_or_procedure_block,
+
269  InterpreterWrapper wrapper_type);
+
270 
+
271  /** Return the wrapper signature.
+
272  *
+
273  * Everything without the `{` or `;`. Roughly, as an example:
+
274  * <return_type> <function_name>(<internal_args>, <args>)
+
275  *
+
276  * were `<internal_args> is the list of arguments required by the
+
277  * codegen to be passed along, while <args> are the arguments of
+
278  * of the function as they appear in the MOD file.
+
279  */
+
280  std::string hoc_py_wrapper_signature(const ast::Block* function_or_procedure_block,
+
281  InterpreterWrapper wrapper_type);
+
282 
+ +
284 
+
285  /**
+
286  * Prints the callbacks required for LONGITUDINAL_DIFFUSION.
+
287  */
+ +
289 
+
290  /**
+
291  * Parameters for what NEURON calls `ldifusfunc1_t`.
+
292  */
+ +
294 
+
295  /**
+
296  * Parameters for what NEURON calls `ldifusfunc3_t`.
+
297  */
+ +
299 
+
300 
+
301  /****************************************************************************************/
+
302  /* Code-specific helper routines */
+
303  /****************************************************************************************/
+
304 
+
305  void add_variable_tqitem(std::vector<IndexVariableInfo>& variables) override;
+
306  void add_variable_point_process(std::vector<IndexVariableInfo>& variables) override;
+
307 
+
308  /**
+
309  * Arguments for functions that are defined and used internally.
+
310  * \return the method arguments
+
311  */
+
312  std::string internal_method_arguments() override;
+
313 
314 
315  /**
-
316  * Arguments for functions that are defined and used internally.
-
317  * \return the method arguments
+
316  * Parameters for internally defined functions
+
317  * \return the method parameters
318  */
-
319  std::string internal_method_arguments() override;
+
320 
321 
322  /**
-
323  * Parameters for internally defined functions
-
324  * \return the method parameters
+
323  * Arguments for external functions called from generated code
+
324  * \return A string representing the arguments passed to an external function
325  */
- +
326  const std::string external_method_arguments() noexcept override;
327 
328 
329  /**
-
330  * Arguments for external functions called from generated code
-
331  * \return A string representing the arguments passed to an external function
-
332  */
-
333  const std::string external_method_arguments() noexcept override;
-
334 
-
335 
-
336  /**
-
337  * Parameters for functions in generated code that are called back from external code
-
338  *
-
339  * Functions registered in NEURON during initialization for callback must adhere to a prescribed
-
340  * calling convention. This method generates the string representing the function parameters for
-
341  * these externally called functions.
-
342  * \param table
-
343  * \return A string representing the parameters of the function
-
344  */
-
345  const ParamVector external_method_parameters(bool table = false) noexcept override;
-
346 
-
347 
-
348  /** The parameters for the four macros `_internalthreadargs*_`. */
- -
350 
-
351 
-
352  /** The parameters for the four macros `_threadargs*_`. */
- -
354 
-
355 
-
356  /**
-
357  * Arguments for "_threadargs_" macro in neuron implementation
-
358  */
-
359  std::string nrn_thread_arguments() const override;
-
360 
-
361 
-
362  /**
-
363  * Arguments for "_threadargs_" macro in neuron implementation
-
364  */
-
365  std::string nrn_thread_internal_arguments() override;
-
366 
- -
368  const ast::FunctionTableBlock& /* node */) override;
-
369 
-
370 
-
371  /** Print compatibility macros required for VERBATIM blocks.
-
372  *
-
373  * Returns the names of all macros introduced.
-
374  */
-
375  std::vector<std::string> print_verbatim_setup(const ast::Verbatim& node,
-
376  const std::string& verbatim);
-
377 
-
378 
-
379  /** Print `#undef`s to erase all compatibility macros.
-
380  */
-
381  void print_verbatim_cleanup(const std::vector<std::string>& macros_defined);
+
330  * Parameters for functions in generated code that are called back from external code
+
331  *
+
332  * Functions registered in NEURON during initialization for callback must adhere to a prescribed
+
333  * calling convention. This method generates the string representing the function parameters for
+
334  * these externally called functions.
+
335  * \param table
+
336  * \return A string representing the parameters of the function
+
337  */
+
338  const ParamVector external_method_parameters(bool table = false) noexcept override;
+
339 
+
340 
+
341  /** The parameters for the four macros `_internalthreadargs*_`. */
+ +
343 
+
344 
+
345  /** The parameters for the four macros `_threadargs*_`. */
+ +
347 
+
348 
+
349  /**
+
350  * Arguments for "_threadargs_" macro in neuron implementation
+
351  */
+
352  std::string nrn_thread_arguments() const override;
+
353 
+
354 
+
355  /**
+
356  * Arguments for "_threadargs_" macro in neuron implementation
+
357  */
+
358  std::string nrn_thread_internal_arguments() override;
+
359 
+ +
361  const ast::FunctionTableBlock& /* node */) override;
+
362 
+
363 
+
364  /** Print compatibility macros required for VERBATIM blocks.
+
365  *
+
366  * Returns the names of all macros introduced.
+
367  */
+
368  std::vector<std::string> print_verbatim_setup(const ast::Verbatim& node,
+
369  const std::string& verbatim);
+
370 
+
371 
+
372  /** Print `#undef`s to erase all compatibility macros.
+
373  */
+
374  void print_verbatim_cleanup(const std::vector<std::string>& macros_defined);
+
375 
+
376 
+
377  /**
+
378  * Arguments for register_mech or point_register_mech function
+
379  */
+
380  std::string register_mechanism_arguments() const override;
+
381 
382 
-
383 
-
384  /**
-
385  * Arguments for register_mech or point_register_mech function
-
386  */
-
387  std::string register_mechanism_arguments() const override;
-
388 
-
389 
-
390  void append_conc_write_statements(std::vector<ShadowUseStatement>& statements,
-
391  const Ion& ion,
-
392  const std::string& concentration) override;
+
383  void append_conc_write_statements(std::vector<ShadowUseStatement>& statements,
+
384  const Ion& ion,
+
385  const std::string& concentration) override;
+
386 
+
387  /**
+
388  * All functions and procedures need a \c _hoc_<func_or_proc_name> to be available to the HOC
+
389  * interpreter
+
390  */
+
391  std::string hoc_function_name(const std::string& function_or_procedure_name) const;
+
392 
393 
394  /**
-
395  * All functions and procedures need a \c _hoc_<func_or_proc_name> to be available to the HOC
-
396  * interpreter
-
397  */
-
398  std::string hoc_function_name(const std::string& function_or_procedure_name) const;
-
399 
-
400 
-
401  /**
-
402  * Get the signature of the \c _hoc_<func_or_proc_name> function
+
395  * Get the signature of the \c _hoc_<func_or_proc_name> function
+
396  */
+
397  std::string hoc_function_signature(const std::string& function_or_procedure_name) const;
+
398 
+
399 
+
400  /**
+
401  * In non POINT_PROCESS mechanisms all functions and procedures need a \c
+
402  * _py_<func_or_proc_name> to be available to the HOC interpreter
403  */
-
404  std::string hoc_function_signature(const std::string& function_or_procedure_name) const;
-
405 
-
406 
-
407  /**
-
408  * In non POINT_PROCESS mechanisms all functions and procedures need a \c
-
409  * _py_<func_or_proc_name> to be available to the HOC interpreter
-
410  */
-
411  std::string py_function_name(const std::string& function_or_procedure_name) const;
-
412 
-
413  /**
-
414  * Get the signature of the \c _npy_<func_or_proc_name> function
-
415  */
-
416  std::string py_function_signature(const std::string& function_or_procedure_name) const;
-
417 
+
404  std::string py_function_name(const std::string& function_or_procedure_name) const;
+
405 
+
406  /**
+
407  * Get the signature of the \c _npy_<func_or_proc_name> function
+
408  */
+
409  std::string py_function_signature(const std::string& function_or_procedure_name) const;
+
410 
+
411 
+
412  /****************************************************************************************/
+
413  /* Code-specific printing routines for code generations */
+
414  /****************************************************************************************/
+
415 
+
416 
+
417  std::string namespace_name() override;
418 
-
419  /****************************************************************************************/
-
420  /* Code-specific printing routines for code generations */
-
421  /****************************************************************************************/
-
422 
+
419 
+
420  /****************************************************************************************/
+
421  /* Routines for returning variable name */
+
422  /****************************************************************************************/
423 
-
424  std::string namespace_name() override;
-
425 
-
426 
-
427  /****************************************************************************************/
-
428  /* Routines for returning variable name */
-
429  /****************************************************************************************/
-
430 
-
431 
-
432  /**
-
433  * Determine the name of a \c float variable given its symbol
-
434  *
-
435  * This function typically returns the accessor expression in backend code for the given symbol.
-
436  * Since the model variables are stored in data arrays and accessed by offset, this function
-
437  * will return the C++ string representing the array access at the correct offset
-
438  *
-
439  * \param symbol The symbol of a variable for which we want to obtain its name
-
440  * \param use_instance Should the variable be accessed via instance or data array
-
441  * \return The backend code string representing the access to the given variable
-
442  * symbol
-
443  */
-
444  std::string float_variable_name(const SymbolType& symbol, bool use_instance) const override;
-
445 
-
446 
-
447  /**
-
448  * Determine the name of an \c int variable given its symbol
-
449  *
-
450  * This function typically returns the accessor expression in backend code for the given symbol.
-
451  * Since the model variables are stored in data arrays and accessed by offset, this function
-
452  * will return the C++ string representing the array access at the correct offset
-
453  *
-
454  * \param symbol The symbol of a variable for which we want to obtain its name
-
455  * \param name The name of the index variable
-
456  * \param use_instance Should the variable be accessed via instance or data array
-
457  * \return The backend code string representing the access to the given variable
-
458  * symbol
-
459  */
-
460  std::string int_variable_name(const IndexVariableInfo& symbol,
-
461  const std::string& name,
-
462  bool use_instance) const override;
-
463 
-
464 
-
465  /**
-
466  * Determine the variable name for a global variable given its symbol
-
467  * \param symbol The symbol of a variable for which we want to obtain its name
-
468  * \param use_instance Should the variable be accessed via the (host-only)
-
469  * global variable or the instance-specific copy (also available on GPU).
-
470  * \return The C++ string representing the access to the global variable
-
471  */
-
472  std::string global_variable_name(const SymbolType& symbol,
-
473  bool use_instance = true) const override;
-
474 
-
475 
-
476  /**
-
477  * Determine the C++ string to print for thread variables.
-
478  *
-
479  * \param var_info Identifies the thread variable, typically an instance of
-
480  * `codegen_thread_variables`.
-
481  * \param use_instance Should the variable be accessed via instance or data array
-
482  */
-
483  std::string thread_variable_name(const ThreadVariableInfo& var_info,
-
484  bool use_instance = true) const;
-
485 
-
486 
-
487  /**
-
488  * Determine the C++ string to replace variable names with.
-
489  *
-
490  * Given a variable name such as `ion_cai` or `v`, return the C++ code
-
491  * required to get the value.
-
492  *
-
493  * \param name Variable name that is being printed
-
494  * \param use_instance Should the variable be accessed via instance or data array
-
495  * \return The C++ string representing the variable.
-
496  * thread structure
-
497  */
-
498  std::string get_variable_name(const std::string& name, bool use_instance = true) const override;
-
499 
-
500  /**
-
501  * Determine the C++ string to replace pointer names with.
-
502  *
-
503  * Given a variable name such as `_p_ptr` or `_p_rng`, return the C++ code
-
504  * required to get a pointer to `ptr` (or `rng`).
-
505  *
-
506  * \param name Variable name that is being printed
-
507  * \return The C++ string representing the variable.
-
508  * thread structure
-
509  */
-
510  std::string get_pointer_name(const std::string& name) const;
-
511 
-
512 
-
513  /****************************************************************************************/
-
514  /* Main printing routines for code generation */
-
515  /****************************************************************************************/
-
516 
-
517 
-
518  /**
-
519  * Print standard C/C++ includes
-
520  */
-
521  void print_standard_includes() override;
+
424 
+
425  /**
+
426  * Determine the name of a \c float variable given its symbol
+
427  *
+
428  * This function typically returns the accessor expression in backend code for the given symbol.
+
429  * Since the model variables are stored in data arrays and accessed by offset, this function
+
430  * will return the C++ string representing the array access at the correct offset
+
431  *
+
432  * \param symbol The symbol of a variable for which we want to obtain its name
+
433  * \param use_instance Should the variable be accessed via instance or data array
+
434  * \return The backend code string representing the access to the given variable
+
435  * symbol
+
436  */
+
437  std::string float_variable_name(const SymbolType& symbol, bool use_instance) const override;
+
438 
+
439 
+
440  /**
+
441  * Determine the name of an \c int variable given its symbol
+
442  *
+
443  * This function typically returns the accessor expression in backend code for the given symbol.
+
444  * Since the model variables are stored in data arrays and accessed by offset, this function
+
445  * will return the C++ string representing the array access at the correct offset
+
446  *
+
447  * \param symbol The symbol of a variable for which we want to obtain its name
+
448  * \param name The name of the index variable
+
449  * \param use_instance Should the variable be accessed via instance or data array
+
450  * \return The backend code string representing the access to the given variable
+
451  * symbol
+
452  */
+
453  std::string int_variable_name(const IndexVariableInfo& symbol,
+
454  const std::string& name,
+
455  bool use_instance) const override;
+
456 
+
457 
+
458  /**
+
459  * Determine the variable name for a global variable given its symbol
+
460  * \param symbol The symbol of a variable for which we want to obtain its name
+
461  * \param use_instance Should the variable be accessed via the (host-only)
+
462  * global variable or the instance-specific copy (also available on GPU).
+
463  * \return The C++ string representing the access to the global variable
+
464  */
+
465  std::string global_variable_name(const SymbolType& symbol,
+
466  bool use_instance = true) const override;
+
467 
+
468 
+
469  /**
+
470  * Determine the C++ string to print for thread variables.
+
471  *
+
472  * \param var_info Identifies the thread variable, typically an instance of
+
473  * `codegen_thread_variables`.
+
474  * \param use_instance Should the variable be accessed via instance or data array
+
475  */
+
476  std::string thread_variable_name(const ThreadVariableInfo& var_info,
+
477  bool use_instance = true) const;
+
478 
+
479 
+
480  /**
+
481  * Determine the C++ string to replace variable names with.
+
482  *
+
483  * Given a variable name such as `ion_cai` or `v`, return the C++ code
+
484  * required to get the value.
+
485  *
+
486  * \param name Variable name that is being printed
+
487  * \param use_instance Should the variable be accessed via instance or data array
+
488  * \return The C++ string representing the variable.
+
489  * thread structure
+
490  */
+
491  std::string get_variable_name(const std::string& name, bool use_instance = true) const override;
+
492 
+
493  /**
+
494  * Determine the C++ string to replace pointer names with.
+
495  *
+
496  * Given a variable name such as `_p_ptr` or `_p_rng`, return the C++ code
+
497  * required to get a pointer to `ptr` (or `rng`).
+
498  *
+
499  * \param name Variable name that is being printed
+
500  * \return The C++ string representing the variable.
+
501  * thread structure
+
502  */
+
503  std::string get_pointer_name(const std::string& name) const;
+
504 
+
505 
+
506  /****************************************************************************************/
+
507  /* Main printing routines for code generation */
+
508  /****************************************************************************************/
+
509 
+
510 
+
511  /**
+
512  * Print standard C/C++ includes
+
513  */
+
514  void print_standard_includes() override;
+
515 
+
516 
+
517  /**
+
518  * Print includes from NEURON
+
519  */
+
520  void print_neuron_includes();
+
521 
522 
-
523 
-
524  /**
-
525  * Print includes from NEURON
-
526  */
-
527  void print_neuron_includes();
-
528 
-
529 
-
530  void print_sdlists_init(bool print_initializers) override;
-
531 
-
532 
-
533  /**
-
534  * Print the structure that wraps all global variables used in the NMODL
-
535  *
-
536  * \param print_initializers Whether to include default values in the struct
-
537  * definition (true: int foo{42}; false: int foo;)
+
523  void print_sdlists_init(bool print_initializers) override;
+
524 
+
525 
+
526  /**
+
527  * Print the structure that wraps all global variables used in the NMODL
+
528  *
+
529  * \param print_initializers Whether to include default values in the struct
+
530  * definition (true: int foo{42}; false: int foo;)
+
531  */
+
532  void print_mechanism_global_var_structure(bool print_initializers) override;
+
533 
+
534 
+
535  /**
+
536  * Print byte arrays that register scalar and vector variables for hoc interface
+
537  *
538  */
-
539  void print_mechanism_global_var_structure(bool print_initializers) override;
-
540 
-
541 
-
542  /**
-
543  * Print byte arrays that register scalar and vector variables for hoc interface
-
544  *
-
545  */
-
546  void print_global_variables_for_hoc() override;
-
547 
-
548  /**
-
549  * Print functions for EXTERNAL use.
-
550  *
-
551  */
- -
553 
-
554  /** Print global struct with default value of RANGE PARAMETERs.
-
555  */
- -
557 
-
558  /**
-
559  * Print the mechanism registration function
-
560  *
-
561  */
-
562  void print_mechanism_register() override;
-
563 
-
564  /** Function body for anything not SUFFIX nothing. */
- -
566 
-
567  /** Function body for SUFFIX nothing. */
- -
569 
-
570  /**
-
571  * Print thread variable (de-)initialization functions.
-
572  */
- +
539  void print_global_variables_for_hoc() override;
+
540 
+
541  /**
+
542  * Print functions for EXTERNAL use.
+
543  *
+
544  */
+ +
546 
+
547  /** Print global struct with default value of RANGE PARAMETERs.
+
548  */
+ +
550 
+
551  /**
+
552  * Print the mechanism registration function
+
553  *
+
554  */
+
555  void print_mechanism_register() override;
+
556 
+
557  /** Function body for anything not SUFFIX nothing. */
+ +
559 
+
560  /** Function body for SUFFIX nothing. */
+ +
562 
+
563  /**
+
564  * Print thread variable (de-)initialization functions.
+
565  */
+ +
567 
+
568  /**
+
569  * Print common code for global functions like nrn_init, nrn_cur and nrn_state
+
570  * \param type The target backend code block type
+
571  */
+ +
573  const std::string& function_name = "") override;
574 
575  /**
-
576  * Print common code for global functions like nrn_init, nrn_cur and nrn_state
-
577  * \param type The target backend code block type
-
578  */
- -
580  const std::string& function_name = "") override;
-
581 
-
582  /**
-
583  * Prints setup code for entrypoints from NEURON.
-
584  *
-
585  * The entrypoints typically receive a `sorted_token` and a bunch of other things, which then
-
586  * need to be converted into the default arguments for functions called (recursively) from the
-
587  * entrypoint.
-
588  *
-
589  * This variation prints the fast entrypoint, where NEURON is fully initialized and setup.
-
590  */
- -
592 
-
593 
-
594  /**
-
595  * Prints setup code for entrypoints NEURON.
-
596  *
-
597  * See `print_entrypoint_setup_code_from_memb_list`. This variation should be used when one only
-
598  * has access to a `Prop`, but not the full `Memb_list`.
+
576  * Prints setup code for entrypoints from NEURON.
+
577  *
+
578  * The entrypoints typically receive a `sorted_token` and a bunch of other things, which then
+
579  * need to be converted into the default arguments for functions called (recursively) from the
+
580  * entrypoint.
+
581  *
+
582  * This variation prints the fast entrypoint, where NEURON is fully initialized and setup.
+
583  */
+ +
585 
+
586 
+
587  /**
+
588  * Prints setup code for entrypoints NEURON.
+
589  *
+
590  * See `print_entrypoint_setup_code_from_memb_list`. This variation should be used when one only
+
591  * has access to a `Prop`, but not the full `Memb_list`.
+
592  */
+ +
594 
+
595 
+
596  /**
+
597  * Print the \c nrn\_init function definition
+
598  * \param skip_init_check \c true to generate code executing the initialization conditionally
599  */
- -
601 
-
602 
-
603  /**
-
604  * Print the \c nrn\_init function definition
-
605  * \param skip_init_check \c true to generate code executing the initialization conditionally
-
606  */
-
607  void print_nrn_init(bool skip_init_check = true);
-
608 
-
609  /** Print the initial block. */
-
610  void print_initial_block(const ast::InitialBlock* node);
+
600  void print_nrn_init(bool skip_init_check = true);
+
601 
+
602  /** Print the initial block. */
+
603  void print_initial_block(const ast::InitialBlock* node);
+
604 
+
605  /**
+
606  * Print nrn_constructor function definition
+
607  *
+
608  */
+
609  void print_nrn_constructor() override;
+
611 
612  /**
-
613  * Print nrn_constructor function definition
+
613  * Print nrn_destructor function definition
614  *
615  */
-
616  void print_nrn_constructor() override;
- -
618 
-
619  /**
-
620  * Print nrn_destructor function definition
-
621  *
-
622  */
-
623  void print_nrn_destructor() override;
- +
616  void print_nrn_destructor() override;
+ +
618 
+
619 
+
620  /**
+
621  * Print nrn_alloc function definition
+
622  *
+
623  */
+
624  void print_nrn_alloc() override;
625 
626 
627  /**
-
628  * Print nrn_alloc function definition
+
628  * Print nrn_jacob function definition
629  *
630  */
-
631  void print_nrn_alloc() override;
+
631  void print_nrn_jacob();
632 
-
633 
-
634  /**
-
635  * Print nrn_jacob function definition
-
636  *
-
637  */
-
638  void print_nrn_jacob();
-
639 
-
640 
-
641  /****************************************************************************************/
-
642  /* Print nrn_state routine */
-
643  /****************************************************************************************/
+
633 
+
634  /****************************************************************************************/
+
635  /* Print nrn_state routine */
+
636  /****************************************************************************************/
+
637 
+
638 
+
639  /**
+
640  * Print nrn_state / state update function definition
+
641  */
+
642  void print_nrn_state() override;
+
643 
644 
-
645 
-
646  /**
-
647  * Print nrn_state / state update function definition
-
648  */
-
649  void print_nrn_state() override;
-
650 
-
651 
-
652  /****************************************************************************************/
-
653  /* Print nrn_cur related routines */
-
654  /****************************************************************************************/
-
655 
-
656  std::string nrn_current_arguments();
- -
658 
-
659  /**
-
660  * Print the \c nrn_current kernel
-
661  *
-
662  * \note nrn_cur_kernel will have two calls to nrn_current if no conductance keywords specified
-
663  * \param node the AST node representing the NMODL breakpoint block
-
664  */
-
665  void print_nrn_current(const ast::BreakpointBlock& node) override;
-
666 
-
667 
-
668  /**
-
669  * Print the \c nrn\_cur kernel with NMODL \c conductance keyword provisions
-
670  *
-
671  * If the NMODL \c conductance keyword is used in the \c breakpoint block, then
-
672  * CodegenCoreneuronCppVisitor::print_nrn_cur_kernel will use this printer
-
673  *
-
674  * \param node the AST node representing the NMODL breakpoint block
-
675  */
-
676  void print_nrn_cur_conductance_kernel(const ast::BreakpointBlock& node) override;
-
677 
-
678 
-
679  /**
-
680  * Print the \c nrn\_cur kernel without NMODL \c conductance keyword provisions
-
681  *
-
682  * If the NMODL \c conductance keyword is \b not used in the \c breakpoint block, then
-
683  * CodegenCoreneuronCppVisitor::print_nrn_cur_kernel will use this printer
+
645  /****************************************************************************************/
+
646  /* Print nrn_cur related routines */
+
647  /****************************************************************************************/
+
648 
+
649  std::string nrn_current_arguments();
+ +
651 
+
652  /**
+
653  * Print the \c nrn_current kernel
+
654  *
+
655  * \note nrn_cur_kernel will have two calls to nrn_current if no conductance keywords specified
+
656  * \param node the AST node representing the NMODL breakpoint block
+
657  */
+
658  void print_nrn_current(const ast::BreakpointBlock& node) override;
+
659 
+
660 
+
661  /**
+
662  * Print the \c nrn\_cur kernel with NMODL \c conductance keyword provisions
+
663  *
+
664  * If the NMODL \c conductance keyword is used in the \c breakpoint block, then
+
665  * CodegenCoreneuronCppVisitor::print_nrn_cur_kernel will use this printer
+
666  *
+
667  * \param node the AST node representing the NMODL breakpoint block
+
668  */
+
669  void print_nrn_cur_conductance_kernel(const ast::BreakpointBlock& node) override;
+
670 
+
671 
+
672  /**
+
673  * Print the \c nrn\_cur kernel without NMODL \c conductance keyword provisions
+
674  *
+
675  * If the NMODL \c conductance keyword is \b not used in the \c breakpoint block, then
+
676  * CodegenCoreneuronCppVisitor::print_nrn_cur_kernel will use this printer
+
677  */
+
678  void print_nrn_cur_non_conductance_kernel() override;
+
679 
+
680 
+
681  /**
+
682  * Print main body of nrn_cur function
+
683  * \param node the AST node representing the NMODL breakpoint block
684  */
-
685  void print_nrn_cur_non_conductance_kernel() override;
+
685  void print_nrn_cur_kernel(const ast::BreakpointBlock& node) override;
686 
687 
688  /**
-
689  * Print main body of nrn_cur function
-
690  * \param node the AST node representing the NMODL breakpoint block
-
691  */
-
692  void print_nrn_cur_kernel(const ast::BreakpointBlock& node) override;
-
693 
-
694 
-
695  /**
-
696  * Print fast membrane current calculation code
-
697  */
-
698  void print_fast_imem_calculation() override;
+
689  * Print fast membrane current calculation code
+
690  */
+
691  void print_fast_imem_calculation() override;
+
692 
+
693 
+
694  /**
+
695  * Print nrn_cur / current update function definition
+
696  */
+
697  void print_nrn_cur() override;
+
698 
699 
-
700 
-
701  /**
-
702  * Print nrn_cur / current update function definition
-
703  */
-
704  void print_nrn_cur() override;
-
705 
-
706 
-
707  /****************************************************************************************/
-
708  /* Main code printing entry points */
-
709  /****************************************************************************************/
+
700  /****************************************************************************************/
+
701  /* Main code printing entry points */
+
702  /****************************************************************************************/
+
703 
+
704 
+
705  /**
+
706  * Print all includes
+
707  *
+
708  */
+
709  void print_headers_include() override;
710 
711 
712  /**
-
713  * Print all includes
+
713  * Print all NEURON macros
714  *
715  */
-
716  void print_headers_include() override;
+
717 
718 
719  /**
-
720  * Print all NEURON macros
+
720  * Print extern declarations for neuron global variables.
721  *
-
722  */
- -
724 
-
725 
-
726  /**
-
727  * Print extern declarations for neuron global variables.
-
728  *
-
729  * Examples include `celsius`.
+
722  * Examples include `celsius`.
+
723  */
+ +
725 
+
726 
+
727  /**
+
728  * Print NEURON global variable macros
+
729  *
730  */
- +
731  void print_global_macros();
732 
733 
734  /**
-
735  * Print NEURON global variable macros
+
735  * Print mechanism variables' related macros
736  *
737  */
-
738  void print_global_macros();
+
739 
740 
741  /**
-
742  * Print mechanism variables' related macros
-
743  *
+
742  * Print all classes
+
743  * \param print_initializers Whether to include default values.
744  */
- -
746 
-
747 
-
748  /**
-
749  * Print all classes
-
750  * \param print_initializers Whether to include default values.
-
751  */
-
752  void print_data_structures(bool print_initializers) override;
-
753 
-
754  /** Print `make_*_instance`.
-
755  */
-
756  void print_make_instance() const;
-
757 
-
758  /** Print `make_*_node_data`.
-
759  */
-
760  void print_make_node_data() const;
-
761 
-
762  /**
-
763  * Set v_unused (voltage) for NRN_PRCELLSTATE feature
-
764  */
-
765  void print_v_unused() const override;
-
766 
-
767 
-
768  /**
-
769  * Set g_unused (conductance) for NRN_PRCELLSTATE feature
+
745  void print_data_structures(bool print_initializers) override;
+
746 
+
747  /** Print `make_*_instance`.
+
748  */
+
749  void print_make_instance() const;
+
750 
+
751  /** Print `make_*_node_data`.
+
752  */
+
753  void print_make_node_data() const;
+
754 
+
755  /**
+
756  * Set v_unused (voltage) for NRN_PRCELLSTATE feature
+
757  */
+
758  void print_v_unused() const override;
+
759 
+
760 
+
761  /**
+
762  * Set g_unused (conductance) for NRN_PRCELLSTATE feature
+
763  */
+
764  void print_g_unused() const override;
+
765 
+
766 
+
767  /**
+
768  * Print all compute functions for every backend
+
769  *
770  */
-
771  void print_g_unused() const override;
+
771  void print_compute_functions() override;
772 
773 
774  /**
-
775  * Print all compute functions for every backend
+
775  * Print entry point to code generation
776  *
777  */
-
778  void print_compute_functions() override;
-
779 
-
780 
-
781  /**
-
782  * Print entry point to code generation
-
783  *
-
784  */
-
785  void print_codegen_routines() override;
-
786 
-
787  /** Anything not SUFFIX nothing. */
- +
778  void print_codegen_routines() override;
+
779 
+
780  /** Anything not SUFFIX nothing. */
+ +
782 
+
783  /** SUFFIX nothing is special. */
+ +
785 
+
786 
+
787  void print_ion_variable() override;
+
788 
789 
-
790  /** SUFFIX nothing is special. */
- -
792 
-
793 
-
794  void print_ion_variable() override;
+
790  /**
+
791  * Get the parameters for functions that setup (initialize) CVODE
+
792  *
+
793  */
+
795 
796 
797  /**
-
798  * Get the parameters for functions that setup (initialize) CVODE
+
798  * Get the parameters for functions that update state at given timestep in CVODE
799  *
800  */
- +
802 
803 
804  /**
-
805  * Get the parameters for functions that update state at given timestep in CVODE
+
805  * Print all callbacks for CVODE
806  *
807  */
- -
809 
-
810 
-
811  /**
-
812  * Print all callbacks for CVODE
-
813  *
-
814  */
- -
816 
-
817  /**
-
818  * Print the CVODE function returning the number of ODEs to solve
-
819  */
-
820  void print_cvode_count();
-
821 
-
822  /**
-
823  * Print the CVODE function for setup of tolerances
-
824  */
-
825  void print_cvode_tolerances();
-
826 
-
827  /**
-
828  * Print the CVODE update function \c name contained in \c block
-
829  */
-
830  void print_cvode_update(const std::string& name, const ast::StatementBlock& block);
-
831 
-
832  /**
-
833  * Print the CVODE setup function \c setup_name that calls the CVODE update function
-
834  * \c update_name
-
835  */
-
836  void print_cvode_setup(const std::string& setup_name, const std::string& update_name);
-
837 
-
838 
-
839  /****************************************************************************************/
-
840  /* Overloaded visitor routines */
-
841  /****************************************************************************************/
+ +
809 
+
810  /**
+
811  * Print the CVODE function returning the number of ODEs to solve
+
812  */
+
813  void print_cvode_count();
+
814 
+
815  /**
+
816  * Print the CVODE function for setup of tolerances
+
817  */
+
818  void print_cvode_tolerances();
+
819 
+
820  /**
+
821  * Print the CVODE update function \c name contained in \c block
+
822  */
+
823  void print_cvode_update(const std::string& name, const ast::StatementBlock& block);
+
824 
+
825  /**
+
826  * Print the CVODE setup function \c setup_name that calls the CVODE update function
+
827  * \c update_name
+
828  */
+
829  void print_cvode_setup(const std::string& setup_name, const std::string& update_name);
+
830 
+
831 
+
832  /****************************************************************************************/
+
833  /* Overloaded visitor routines */
+
834  /****************************************************************************************/
+
835 
+
836  std::string process_verbatim_text(const std::string& verbatim);
+
837  void visit_verbatim(const ast::Verbatim& node) override;
+
838  void visit_watch_statement(const ast::WatchStatement& node) override;
+
839  void visit_for_netcon(const ast::ForNetcon& node) override;
+
840  void visit_longitudinal_diffusion_block(const ast::LongitudinalDiffusionBlock& node) override;
+
841  void visit_lon_diffuse(const ast::LonDiffuse& node) override;
842 
-
843  std::string process_verbatim_text(const std::string& verbatim);
-
844  void visit_verbatim(const ast::Verbatim& node) override;
-
845  void visit_watch_statement(const ast::WatchStatement& node) override;
-
846  void visit_for_netcon(const ast::ForNetcon& node) override;
-
847  void visit_longitudinal_diffusion_block(const ast::LongitudinalDiffusionBlock& node) override;
-
848  void visit_lon_diffuse(const ast::LonDiffuse& node) override;
-
849 
-
850  public:
-
851  /****************************************************************************************/
-
852  /* Public printing routines for code generation for use in unit tests */
-
853  /****************************************************************************************/
-
854  ParamVector functor_params() override;
-
855 
-
856  /**
-
857  * Print the structure that wraps all range and int variables required for the NMODL
-
858  *
-
859  * \param print_initializers Whether or not default values for variables
-
860  * be included in the struct declaration.
-
861  */
-
862  void print_mechanism_range_var_structure(bool print_initializers) override;
-
863 
-
864  /**
-
865  * Print the structure that wraps all node variables required for the NMODL.
-
866  *
-
867  * \param print_initializers Whether or not default values for variables
-
868  * be included in the struct declaration.
-
869  */
-
870  void print_node_data_structure(bool print_initializers);
+
843  public:
+
844  /****************************************************************************************/
+
845  /* Public printing routines for code generation for use in unit tests */
+
846  /****************************************************************************************/
+
847  ParamVector functor_params() override;
+
848 
+
849  /**
+
850  * Print the structure that wraps all range and int variables required for the NMODL
+
851  *
+
852  * \param print_initializers Whether or not default values for variables
+
853  * be included in the struct declaration.
+
854  */
+
855  void print_mechanism_range_var_structure(bool print_initializers) override;
+
856 
+
857  /**
+
858  * Print the structure that wraps all node variables required for the NMODL.
+
859  *
+
860  * \param print_initializers Whether or not default values for variables
+
861  * be included in the struct declaration.
+
862  */
+
863  void print_node_data_structure(bool print_initializers);
+
864 
+
865  /**
+
866  * Print the data structure used to access thread variables.
+
867  */
+
868  void print_thread_variables_structure(bool print_initializers);
+
869 };
+
870 
871 
-
872  /**
-
873  * Print the data structure used to access thread variables.
-
874  */
-
875  void print_thread_variables_structure(bool print_initializers);
-
876 };
-
877 
-
878 
-
879 /** \} */ // end of codegen_backends
-
880 
-
881 } // namespace codegen
-
882 } // namespace nmodl
+
872 /** \} */ // end of codegen_backends
+
873 
+
874 } // namespace codegen
+
875 } // namespace nmodl
-
void print_verbatim_cleanup(const std::vector< std::string > &macros_defined)
Print #undefs to erase all compatibility macros.
-
void print_nrn_destructor() override
Print nrn_destructor function definition.
-
void print_global_var_external_access()
Print functions for EXTERNAL use.
+
void print_verbatim_cleanup(const std::vector< std::string > &macros_defined)
Print #undefs to erase all compatibility macros.
+
void print_nrn_destructor() override
Print nrn_destructor function definition.
+
void print_global_var_external_access()
Print functions for EXTERNAL use.
Represents a C code block.
Definition: verbatim.hpp:38
-
void print_nrn_cur_non_conductance_kernel() override
Print the nrn_cur kernel without NMODL conductance keyword provisions.
-
std::string py_function_signature(const std::string &function_or_procedure_name) const
Get the signature of the npy <func_or_proc_name> function.
+
void print_nrn_cur_non_conductance_kernel() override
Print the nrn_cur kernel without NMODL conductance keyword provisions.
+
std::string py_function_signature(const std::string &function_or_procedure_name) const
Get the signature of the npy <func_or_proc_name> function.
Helper to represent information about index/int variables.
-
void print_nrn_cur() override
Print nrn_cur / current update function definition.
-
void print_macro_definitions()
Print all NEURON macros.
-
void print_function_definitions()
Print function and procedures prototype definitions.
-
void print_net_event_call(const ast::FunctionCall &node) override
Print call to net_event.
-
std::string hoc_py_wrapper_signature(const ast::Block *function_or_procedure_block, InterpreterWrapper wrapper_type)
Return the wrapper signature.
- -
void print_neuron_includes()
Print includes from NEURON.
-
void print_codegen_routines_regular()
Anything not SUFFIX nothing.
-
void print_nrn_init(bool skip_init_check=true)
Print the nrn_init function definition.
-
std::string internal_method_arguments() override
Arguments for functions that are defined and used internally.
-
void print_nrn_alloc() override
Print nrn_alloc function definition.
+
void print_nrn_cur() override
Print nrn_cur / current update function definition.
+
void print_macro_definitions()
Print all NEURON macros.
+
void print_function_definitions()
Print function and procedures prototype definitions.
+
void print_net_event_call(const ast::FunctionCall &node) override
Print call to net_event.
+
std::string hoc_py_wrapper_signature(const ast::Block *function_or_procedure_block, InterpreterWrapper wrapper_type)
Return the wrapper signature.
+ +
void print_neuron_includes()
Print includes from NEURON.
+
void print_codegen_routines_regular()
Anything not SUFFIX nothing.
+
void print_nrn_init(bool skip_init_check=true)
Print the nrn_init function definition.
+
std::string internal_method_arguments() override
Arguments for functions that are defined and used internally.
+
void print_nrn_alloc() override
Print nrn_alloc function definition.
-
std::string register_mechanism_arguments() const override
Arguments for register_mech or point_register_mech function.
+
std::string register_mechanism_arguments() const override
Arguments for register_mech or point_register_mech function.
std::string get_name(ast::Ast const *sym)
int position_of_int_var(const std::string &name) const override
Determine the position in the data array for a given int variable.
-
void visit_lon_diffuse(const ast::LonDiffuse &node) override
visit node of type ast::LonDiffuse
- +
void visit_lon_diffuse(const ast::LonDiffuse &node) override
visit node of type ast::LonDiffuse
+
std::string table_thread_function_name() const
Name of the threaded table checking function.
-
bool optimize_ion_variable_copies() const override
Check if ion variable copies should be avoided.
-
void print_cvode_tolerances()
Print the CVODE function for setup of tolerances.
-
std::string hoc_function_name(const std::string &function_or_procedure_name) const
All functions and procedures need a hoc <func_or_proc_name> to be available to the HOC interpreter.
+
bool optimize_ion_variable_copies() const override
Check if ion variable copies should be avoided.
+
void print_cvode_tolerances()
Print the CVODE function for setup of tolerances.
+
std::string hoc_function_name(const std::string &function_or_procedure_name) const
All functions and procedures need a hoc <func_or_proc_name> to be available to the HOC interpreter.
encapsulates code generation backend implementations
Definition: ast_common.hpp:26
-
std::string global_variable_name(const SymbolType &symbol, bool use_instance=true) const override
Determine the variable name for a global variable given its symbol.
+
std::string global_variable_name(const SymbolType &symbol, bool use_instance=true) const override
Determine the variable name for a global variable given its symbol.
Represent ions used in mod file.
-
std::string nrn_thread_internal_arguments() override
Arguments for "_threadargs_" macro in neuron implementation.
+
std::string nrn_thread_internal_arguments() override
Arguments for "_threadargs_" macro in neuron implementation.
Implement classes for representing symbol table at block and file scope.
std::string backend_name() const override
Name of the code generation backend.
- -
void print_entrypoint_setup_code_from_prop()
Prints setup code for entrypoints NEURON.
-
void print_global_param_default_values()
Print global struct with default value of RANGE PARAMETERs.
-
ParamVector ldifusfunc1_parameters() const
Parameters for what NEURON calls ldifusfunc1_t.
-
void print_g_unused() const override
Set g_unused (conductance) for NRN_PRCELLSTATE feature.
-
void visit_watch_statement(const ast::WatchStatement &node) override
TODO: Edit for NEURON.
-
void print_net_send_call(const ast::FunctionCall &node) override
Print call to net_send.
-
void print_net_move_call(const ast::FunctionCall &node) override
Print call to net_move.
-
std::string thread_variable_name(const ThreadVariableInfo &var_info, bool use_instance=true) const
Determine the C++ string to print for thread variables.
-
void print_cvode_setup(const std::string &setup_name, const std::string &update_name)
Print the CVODE setup function setup_name that calls the CVODE update function update_name.
-
void print_nrn_state() override
Print nrn_state / state update function definition.
-
void print_initial_block(const ast::InitialBlock *node)
Print the initial block.
+ +
void print_entrypoint_setup_code_from_prop()
Prints setup code for entrypoints NEURON.
+
void print_global_param_default_values()
Print global struct with default value of RANGE PARAMETERs.
+
ParamVector ldifusfunc1_parameters() const
Parameters for what NEURON calls ldifusfunc1_t.
+
void print_g_unused() const override
Set g_unused (conductance) for NRN_PRCELLSTATE feature.
+
void visit_watch_statement(const ast::WatchStatement &node) override
TODO: Edit for NEURON.
+
void print_net_send_call(const ast::FunctionCall &node) override
Print call to net_send.
+
void print_net_move_call(const ast::FunctionCall &node) override
Print call to net_move.
+
std::string thread_variable_name(const ThreadVariableInfo &var_info, bool use_instance=true) const
Determine the C++ string to print for thread variables.
+
void print_cvode_setup(const std::string &setup_name, const std::string &update_name)
Print the CVODE setup function setup_name that calls the CVODE update function update_name.
+
void print_nrn_state() override
Print nrn_state / state update function definition.
+
void print_initial_block(const ast::InitialBlock *node)
Print the initial block.
-
void print_global_function_common_code(BlockType type, const std::string &function_name="") override
Print common code for global functions like nrn_init, nrn_cur and nrn_state.
-
std::string float_variable_name(const SymbolType &symbol, bool use_instance) const override
Determine the name of a float variable given its symbol.
+
void print_global_function_common_code(BlockType type, const std::string &function_name="") override
Print common code for global functions like nrn_init, nrn_cur and nrn_state.
+
std::string float_variable_name(const SymbolType &symbol, bool use_instance) const override
Determine the name of a float variable given its symbol.
Auto generated AST classes declaration.
- -
void print_cvode_definitions()
Print all callbacks for CVODE.
-
void print_v_unused() const override
Set v_unused (voltage) for NRN_PRCELLSTATE feature.
- -
ParamVector functor_params() override
The parameters of the Newton solver "functor".
-
void print_mechanism_register_regular()
Function body for anything not SUFFIX nothing.
-
void print_mechanism_register_nothing()
Function body for SUFFIX nothing.
+ +
void print_cvode_definitions()
Print all callbacks for CVODE.
+
void print_v_unused() const override
Set v_unused (voltage) for NRN_PRCELLSTATE feature.
+ +
ParamVector functor_params() override
The parameters of the Newton solver "functor".
+
void print_mechanism_register_regular()
Function body for anything not SUFFIX nothing.
+
void print_mechanism_register_nothing()
Function body for SUFFIX nothing.
Visitor for printing C++ code compatible with legacy api of CoreNEURON
Base class for all block scoped nodes.
Definition: block.hpp:41
Represents a INITIAL block in the NMODL.
-
void print_point_process_function_definitions()
Print POINT_PROCESS related functions Wrap external NEURON functions related to POINT_PROCESS mechani...
- -
void print_net_init()
Print NET_RECEIVE{ INITIAL{ ...
+
void print_point_process_function_definitions()
Print POINT_PROCESS related functions Wrap external NEURON functions related to POINT_PROCESS mechani...
+ +
void print_net_init()
Print NET_RECEIVE{ INITIAL{ ...
Represent WATCH statement in NMODL.
-
void print_neuron_global_variable_declarations()
Print extern declarations for neuron global variables.
+
void print_neuron_global_variable_declarations()
Print extern declarations for neuron global variables.
Represents a BREAKPOINT block in NMODL.
-
void print_nrn_cur_conductance_kernel(const ast::BreakpointBlock &node) override
Print the nrn_cur kernel with NMODL conductance keyword provisions.
-
std::string int_variable_name(const IndexVariableInfo &symbol, const std::string &name, bool use_instance) const override
Determine the name of an int variable given its symbol.
+
void print_nrn_cur_conductance_kernel(const ast::BreakpointBlock &node) override
Print the nrn_cur kernel with NMODL conductance keyword provisions.
+
std::string int_variable_name(const IndexVariableInfo &symbol, const std::string &name, bool use_instance) const override
Determine the name of an int variable given its symbol.
InterpreterWrapper
Enum to switch between HOC and Python wrappers for functions and procedures defined in mechanisms.
-
void print_global_variables_for_hoc() override
Print byte arrays that register scalar and vector variables for hoc interface.
-
ParamVector cvode_setup_parameters()
Get the parameters for functions that setup (initialize) CVODE.
-
ParamVector internalthreadargs_parameters()
The parameters for the four macros _internalthreadargs*_.
-
std::string get_pointer_name(const std::string &name) const
Determine the C++ string to replace pointer names with.
-
void print_standard_includes() override
Print standard C/C++ includes.
+
void print_global_variables_for_hoc() override
Print byte arrays that register scalar and vector variables for hoc interface.
+
ParamVector cvode_setup_parameters()
Get the parameters for functions that setup (initialize) CVODE.
+
ParamVector internalthreadargs_parameters()
The parameters for the four macros _internalthreadargs*_.
+
std::string get_pointer_name(const std::string &name) const
Determine the C++ string to replace pointer names with.
+
void print_standard_includes() override
Print standard C/C++ includes.
std::vector< ThreadVariableInfo > codegen_thread_variables
GLOBAL variables in THREADSAFE MOD files that are not read-only are converted to thread variables.
-
void print_mechanism_range_var_structure(bool print_initializers) override
Print the structure that wraps all range and int variables required for the NMODL.
+
void print_mechanism_range_var_structure(bool print_initializers) override
Print the structure that wraps all range and int variables required for the NMODL.
Extracts information required for LONGITUDINAL_DIFFUSION for each KINETIC block.
-
void add_variable_tqitem(std::vector< IndexVariableInfo > &variables) override
Add the variable tqitem during get_int_variables.
+
void add_variable_tqitem(std::vector< IndexVariableInfo > &variables) override
Add the variable tqitem during get_int_variables.
Helper class for printing C/C++ code.
-
std::string hoc_function_signature(const std::string &function_or_procedure_name) const
Get the signature of the hoc <func_or_proc_name> function.
-
std::pair< ParamVector, ParamVector > function_table_parameters(const ast::FunctionTableBlock &) override
Parameters of the function itself "{}" and "table_{}".
-
void print_thread_variables_structure(bool print_initializers)
Print the data structure used to access thread variables.
-
void visit_longitudinal_diffusion_block(const ast::LongitudinalDiffusionBlock &node) override
visit node of type ast::LongitudinalDiffusionBlock
-
void print_function_table_call(const ast::FunctionCall &node) override
Print special code when calling FUNCTION_TABLEs.
-
void print_compute_functions() override
Print all compute functions for every backend.
-
void print_thread_memory_callbacks()
Print thread variable (de-)initialization functions.
-
void print_entrypoint_setup_code_from_memb_list()
Prints setup code for entrypoints from NEURON.
-
void visit_verbatim(const ast::Verbatim &node) override
visit node of type ast::Verbatim
-
void print_nrn_cur_kernel(const ast::BreakpointBlock &node) override
Print main body of nrn_cur function.
-
void print_mechanism_register() override
Print the mechanism registration function.
-
void print_nrn_jacob()
Print nrn_jacob function definition.
- +
std::string hoc_function_signature(const std::string &function_or_procedure_name) const
Get the signature of the hoc <func_or_proc_name> function.
+
std::pair< ParamVector, ParamVector > function_table_parameters(const ast::FunctionTableBlock &) override
Parameters of the function itself "{}" and "table_{}".
+
void print_thread_variables_structure(bool print_initializers)
Print the data structure used to access thread variables.
+
void visit_longitudinal_diffusion_block(const ast::LongitudinalDiffusionBlock &node) override
visit node of type ast::LongitudinalDiffusionBlock
+
void print_function_table_call(const ast::FunctionCall &node) override
Print special code when calling FUNCTION_TABLEs.
+
void print_compute_functions() override
Print all compute functions for every backend.
+
void print_thread_memory_callbacks()
Print thread variable (de-)initialization functions.
+
void print_entrypoint_setup_code_from_memb_list()
Prints setup code for entrypoints from NEURON.
+
void visit_verbatim(const ast::Verbatim &node) override
visit node of type ast::Verbatim
+
void print_nrn_cur_kernel(const ast::BreakpointBlock &node) override
Print main body of nrn_cur function.
+
void print_mechanism_register() override
Print the mechanism registration function.
+
void print_nrn_jacob()
Print nrn_jacob function definition.
+
Various types to store code generation specific information.
-
void print_fast_imem_calculation() override
Print fast membrane current calculation code.
-
std::vector< std::string > print_verbatim_setup(const ast::Verbatim &node, const std::string &verbatim)
Print compatibility macros required for VERBATIM blocks.
-
void print_data_structures(bool print_initializers) override
Print all classes.
+
void print_fast_imem_calculation() override
Print fast membrane current calculation code.
+
std::vector< std::string > print_verbatim_setup(const ast::Verbatim &node, const std::string &verbatim)
Print compatibility macros required for VERBATIM blocks.
+
void print_data_structures(bool print_initializers) override
Print all classes.
Auto generated AST classes declaration.
-
void print_sdlists_init(bool print_initializers) override
-
const std::string external_method_arguments() noexcept override
Arguments for external functions called from generated code.
+
void print_sdlists_init(bool print_initializers) override
+
const std::string external_method_arguments() noexcept override
Arguments for external functions called from generated code.
Represent LONGITUDINAL_DIFFUSION statement in NMODL.
Definition: lon_diffuse.hpp:39
-
std::string py_function_name(const std::string &function_or_procedure_name) const
In non POINT_PROCESS mechanisms all functions and procedures need a py <func_or_proc_name> to be avai...
+
std::string py_function_name(const std::string &function_or_procedure_name) const
In non POINT_PROCESS mechanisms all functions and procedures need a py <func_or_proc_name> to be avai...
size_t offset
The global variables ahead of this one require offset doubles to store.
-
void print_node_data_structure(bool print_initializers)
Print the structure that wraps all node variables required for the NMODL.
+
void print_node_data_structure(bool print_initializers)
Print the structure that wraps all node variables required for the NMODL.
-
void print_cvode_update(const std::string &name, const ast::StatementBlock &block)
Print the CVODE update function name contained in block.
-
void print_make_instance() const
Print make_*_instance.
-
void print_atomic_reduction_pragma() override
Print atomic update pragma for reduction statements.
+
void print_cvode_update(const std::string &name, const ast::StatementBlock &block)
Print the CVODE update function name contained in block.
+
void print_make_instance() const
Print make_*_instance.
Represents block encapsulating list of statements.
-
void print_setdata_functions()
Print NEURON functions related to setting global variables of the mechanism.
+
void print_setdata_functions()
Print NEURON functions related to setting global variables of the mechanism.
Represents ion write statement during code generation.
-
void print_mechanism_variables_macros()
Print mechanism variables' related macros.
+
void print_mechanism_variables_macros()
Print mechanism variables' related macros.
Visitor for printing C++ code compatible with legacy api of NEURON
-
ParamVector threadargs_parameters()
The parameters for the four macros _threadargs*_.
-
void print_nrn_constructor() override
Print nrn_constructor function definition.
+
ParamVector threadargs_parameters()
The parameters for the four macros _threadargs*_.
+
void print_nrn_constructor() override
Print nrn_constructor function definition.
Implement logger based on spdlog library.
parser::NmodlParser::symbol_type SymbolType
Definition: main_nmodl.cpp:33
BlockType
Helper to represent various block types.
size_t index
There index global variables ahead of this one.
-
void print_headers_include() override
Print all includes.
-
void print_check_table_entrypoint()
Print all check_* function declarations.
-
const ParamVector external_method_parameters(bool table=false) noexcept override
Parameters for functions in generated code that are called back from external code.
-
void visit_for_netcon(const ast::ForNetcon &node) override
visit node of type ast::ForNetcon
-
void print_function_or_procedure(const ast::Block &node, const std::string &name, const std::unordered_set< CppObjectSpecifier > &specifiers={ CppObjectSpecifier::Inline}) override
Print nmodl function or procedure (common code)
+
void print_headers_include() override
Print all includes.
+
void print_check_table_entrypoint()
Print all check_* function declarations.
+
const ParamVector external_method_parameters(bool table=false) noexcept override
Parameters for functions in generated code that are called back from external code.
+
void visit_for_netcon(const ast::ForNetcon &node) override
visit node of type ast::ForNetcon
+
void print_function_or_procedure(const ast::Block &node, const std::string &name, const std::unordered_set< CppObjectSpecifier > &specifiers={ CppObjectSpecifier::Inline}) override
Print nmodl function or procedure (common code)
const std::shared_ptr< symtab::Symbol > symbol
-
void print_nrn_current(const ast::BreakpointBlock &node) override
Print the nrn_current kernel.
+
void print_nrn_current(const ast::BreakpointBlock &node) override
Print the nrn_current kernel.
int position_of_float_var(const std::string &name) const override
Determine the position in the data array for a given float variable.
-
std::string get_variable_name(const std::string &name, bool use_instance=true) const override
Determine the C++ string to replace variable names with.
-
void print_hoc_py_wrapper_call_impl(const ast::Block *function_or_procedure_block, InterpreterWrapper wrapper_type)
Print the code that calls the impl from the HOC/Py wrapper.
-
void print_codegen_routines_nothing()
SUFFIX nothing is special.
+
std::string get_variable_name(const std::string &name, bool use_instance=true) const override
Determine the C++ string to replace variable names with.
+
void print_hoc_py_wrapper_call_impl(const ast::Block *function_or_procedure_block, InterpreterWrapper wrapper_type)
Print the code that calls the impl from the HOC/Py wrapper.
+
void print_codegen_routines_nothing()
SUFFIX nothing is special.
Visitor for printing C++ code compatible with legacy api of CoreNEURON
CodegenCppVisitor(std::string mod_filename, std::ostream &stream, std::string float_type, const bool optimize_ionvar_copies, std::unique_ptr< nmodl::utils::Blame > blame=nullptr)
Constructs the C++ code generator visitor.
-
void print_make_node_data() const
Print make_*_node_data.
+
void print_make_node_data() const
Print make_*_node_data.
std::string simulator_name() override
Name of the simulator the code was generated for.
-
void print_function_procedure_helper(const ast::Block &node) override
Common helper function to help printing function or procedure blocks.
-
std::string process_verbatim_text(const std::string &verbatim)
-
void add_variable_point_process(std::vector< IndexVariableInfo > &variables) override
Add the variable point_process during get_int_variables.
-
std::string nrn_thread_arguments() const override
Arguments for "_threadargs_" macro in neuron implementation.
-
ParamVector ldifusfunc3_parameters() const
Parameters for what NEURON calls ldifusfunc3_t.
-
ParamVector cvode_update_parameters()
Get the parameters for functions that update state at given timestep in CVODE.
+
void print_function_procedure_helper(const ast::Block &node) override
Common helper function to help printing function or procedure blocks.
+
std::string process_verbatim_text(const std::string &verbatim)
+
void add_variable_point_process(std::vector< IndexVariableInfo > &variables) override
Add the variable point_process during get_int_variables.
+
std::string nrn_thread_arguments() const override
Arguments for "_threadargs_" macro in neuron implementation.
+
ParamVector ldifusfunc3_parameters() const
Parameters for what NEURON calls ldifusfunc3_t.
+
ParamVector cvode_update_parameters()
Get the parameters for functions that update state at given timestep in CVODE.
void print_net_receive_registration()
Print code to register the call-back for the NET_RECEIVE block.
-
void print_codegen_routines() override
Print entry point to code generation.
-
void append_conc_write_statements(std::vector< ShadowUseStatement > &statements, const Ion &ion, const std::string &concentration) override
Generate Function call statement for nrn_wrote_conc.
-
void print_longitudinal_diffusion_callbacks()
Prints the callbacks required for LONGITUDINAL_DIFFUSION.
-
ParamVector internal_method_parameters() override
Parameters for internally defined functions.
-
void print_hoc_py_wrapper(const ast::Block *function_or_procedure_block, InterpreterWrapper wrapper_type)
Print the wrapper for calling FUNCION/PROCEDURES from HOC/Py.
-
void print_cvode_count()
Print the CVODE function returning the number of ODEs to solve.
- -
void print_net_receive()
Print net_receive call-back.
-
void print_function_prototypes() override
Print function and procedures prototype declaration.
-
void print_mechanism_global_var_structure(bool print_initializers) override
Print the structure that wraps all global variables used in the NMODL.
-
void print_hoc_py_wrapper_setup(const ast::Block *function_or_procedure_block, InterpreterWrapper wrapper_type)
Print the setup code for HOC/Py wrapper.
-
std::string namespace_name() override
Name of "our" namespace.
-
void print_global_macros()
Print NEURON global variable macros.
+
void print_codegen_routines() override
Print entry point to code generation.
+
void append_conc_write_statements(std::vector< ShadowUseStatement > &statements, const Ion &ion, const std::string &concentration) override
Generate Function call statement for nrn_wrote_conc.
+
void print_longitudinal_diffusion_callbacks()
Prints the callbacks required for LONGITUDINAL_DIFFUSION.
+
ParamVector internal_method_parameters() override
Parameters for internally defined functions.
+
void print_hoc_py_wrapper(const ast::Block *function_or_procedure_block, InterpreterWrapper wrapper_type)
Print the wrapper for calling FUNCION/PROCEDURES from HOC/Py.
+
void print_cvode_count()
Print the CVODE function returning the number of ODEs to solve.
+ +
void print_net_receive()
Print net_receive call-back.
+
void print_function_prototypes() override
Print function and procedures prototype declaration.
+
void print_mechanism_global_var_structure(bool print_initializers) override
Print the structure that wraps all global variables used in the NMODL.
+
void print_hoc_py_wrapper_setup(const ast::Block *function_or_procedure_block, InterpreterWrapper wrapper_type)
Print the setup code for HOC/Py wrapper.
+
std::string namespace_name() override
Name of "our" namespace.
+
void print_global_macros()
Print NEURON global variable macros.
std::vector< std::tuple< std::string, std::string, std::string, std::string > > ParamVector
A vector of parameters represented by a 4-tuple of strings:
Concrete visitor for all AST classes.
diff --git a/doxygen/functions_func_p.html b/doxygen/functions_func_p.html index 1a29297a8..d9e089897 100644 --- a/doxygen/functions_func_p.html +++ b/doxygen/functions_func_p.html @@ -192,9 +192,7 @@

- p -

  • print_atomic_reduction_pragma() : nmodl::codegen::CodegenAccVisitor -, nmodl::codegen::CodegenCoreneuronCppVisitor -, nmodl::codegen::CodegenCppVisitor -, nmodl::codegen::CodegenNeuronCppVisitor +, nmodl::codegen::CodegenCoreneuronCppVisitor
  • print_backend_includes() : nmodl::codegen::CodegenAccVisitor @@ -762,7 +760,7 @@

    - p -

      : nmodl::codegen::CodegenCppVisitor
    • process_variable() -: nmodl::visitor::DefUseAnalyzeVisitor +: nmodl::visitor::DefUseAnalyzeVisitor
    • process_verbatim_text() : nmodl::codegen::CodegenCoreneuronCppVisitor @@ -772,13 +770,13 @@

      - p -

        : nmodl::codegen::CodegenCoreneuronCppVisitor
      • Program() -: nmodl::ast::Program +: nmodl::ast::Program
      • ProtectStatement() -: nmodl::ast::ProtectStatement +: nmodl::ast::ProtectStatement
      • push_block() -: nmodl::printer::CodePrinter +: nmodl::printer::CodePrinter , nmodl::printer::JSONPrinter
      • push_current_directory() diff --git a/doxygen/functions_func_v.html b/doxygen/functions_func_v.html index 58e1c7352..4fa549757 100644 --- a/doxygen/functions_func_v.html +++ b/doxygen/functions_func_v.html @@ -1364,7 +1364,7 @@

        - v -

          , nmodl::visitor::Visitor
        • visit_protect_statement() -: nmodl::codegen::CodegenCppVisitor +: nmodl::codegen::CodegenCoreneuronCppVisitor , nmodl::visitor::AstVisitor , nmodl::visitor::ConstAstVisitor , nmodl::visitor::ConstVisitor diff --git a/doxygen/functions_p.html b/doxygen/functions_p.html index fcc2eb85b..6aaafa77e 100644 --- a/doxygen/functions_p.html +++ b/doxygen/functions_p.html @@ -247,9 +247,7 @@

          - p -

          • print_atomic_reduction_pragma() : nmodl::codegen::CodegenAccVisitor -, nmodl::codegen::CodegenCoreneuronCppVisitor -, nmodl::codegen::CodegenCppVisitor -, nmodl::codegen::CodegenNeuronCppVisitor +, nmodl::codegen::CodegenCoreneuronCppVisitor
          • print_backend_includes() : nmodl::codegen::CodegenAccVisitor @@ -821,7 +819,7 @@

            - p -

              : nmodl::codegen::CodegenCppVisitor
            • ProcedureBlock() -: nmodl::ast::ProcedureBlock +: nmodl::ast::ProcedureBlock
            • procedures : nmodl::codegen::CodegenInfo @@ -846,7 +844,7 @@

              - p -

                : nmodl::codegen::CodegenCoreneuronCppVisitor
              • Program() -: nmodl::ast::Program +: nmodl::ast::Program
              • program_symtab : nmodl::codegen::CodegenCppVisitor @@ -867,7 +865,7 @@

                - p -

                  , nmodl::visitor::FunctionCallpathVisitor
                • push_block() -: nmodl::printer::CodePrinter +: nmodl::printer::CodePrinter , nmodl::printer::JSONPrinter
                • push_current_directory() diff --git a/doxygen/functions_u.html b/doxygen/functions_u.html index 73eb4d588..24d8ef8a3 100644 --- a/doxygen/functions_u.html +++ b/doxygen/functions_u.html @@ -242,7 +242,7 @@

                  - u -

                  diff --git a/doxygen/functions_v.html b/doxygen/functions_v.html index 921d155fa..48c3576ef 100644 --- a/doxygen/functions_v.html +++ b/doxygen/functions_v.html @@ -1458,7 +1458,7 @@

                  - v -

                    , nmodl::visitor::Visitor
                  • visit_protect_statement() -: nmodl::codegen::CodegenCppVisitor +: nmodl::codegen::CodegenCoreneuronCppVisitor , nmodl::visitor::AstVisitor , nmodl::visitor::ConstAstVisitor , nmodl::visitor::ConstVisitor diff --git a/doxygen/group__codegen__backends.html b/doxygen/group__codegen__backends.html index 54a7704bb..6cab3b795 100644 --- a/doxygen/group__codegen__backends.html +++ b/doxygen/group__codegen__backends.html @@ -224,7 +224,7 @@

                    Definition at line 1574 of file codegen_cpp_visitor.hpp.

                    +

                    Definition at line 1567 of file codegen_cpp_visitor.hpp.

                    @@ -287,7 +287,7 @@

                    Definition at line 1554 of file codegen_cpp_visitor.hpp.

                    +

                    Definition at line 1547 of file codegen_cpp_visitor.hpp.

                    diff --git a/doxygen/group__codegen__backends.js b/doxygen/group__codegen__backends.js index baf8de34f..c450323b9 100644 --- a/doxygen/group__codegen__backends.js +++ b/doxygen/group__codegen__backends.js @@ -77,7 +77,7 @@ var group__codegen__backends = [ "position_of_float_var", "classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#a9494db3e1dfa2a390f133a9a8b5aa8e0", null ], [ "position_of_int_var", "classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#aeada2d6cff883f8cbd1924f1d9729250", null ], [ "print_abort_routine", "classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#ab87a69ec67fe4d42df3cb0084c99dc85", null ], - [ "print_atomic_reduction_pragma", "classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#a66833aede8ecc336b85129ca1e8b8b2e", null ], + [ "print_atomic_reduction_pragma", "classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#ab21de33c81f273ad3db2d5271221bcdc", null ], [ "print_backend_includes", "classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#abd6be1c541190358a512f0021ea82b16", null ], [ "print_before_after_block", "classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#a9d1748ca9db1665902c25c32a2b458d6", null ], [ "print_check_table_thread_function", "classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#a45b1dc5e371bf956e045d40f19b2470c", null ], @@ -172,6 +172,7 @@ var group__codegen__backends = [ "simulator_name", "classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#ab13ca7a0bef674739095466ff66f9843", null ], [ "visit_derivimplicit_callback", "classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#a97acfbb75ee033066beb784570ad4a04", null ], [ "visit_for_netcon", "classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#a524be3f8fa4165f983647ed8ebbb9f01", null ], + [ "visit_protect_statement", "classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#affd885d93ced7c0bd58ad023444a4737", null ], [ "visit_verbatim", "classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#ac5b4b072e64caba7ea89e89f0ea0090a", null ], [ "visit_watch_statement", "classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#a8d05784b3300be188775cf2ec9958dc6", null ] ] ], @@ -250,7 +251,6 @@ var group__codegen__backends = [ "optimize_ion_variable_copies", "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a81cded985b616728b55976bf7eca4488", null ], [ "position_of_float_var", "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a3ef901c89d40124058a0df268b4f8101", null ], [ "position_of_int_var", "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#aaa6dae67e44cbd29e86e10b270249bed", null ], - [ "print_atomic_reduction_pragma", "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a92bfb8a4daec705014f8e871fb0feacb", null ], [ "print_backend_info", "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#afc26a2583e8b283deae9944939788f79", null ], [ "print_codegen_routines", "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a20666add7b3f75937954a038c51f5b55", null ], [ "print_compute_functions", "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a407af2b73f564d5db79381b5b2699c97", null ], @@ -340,7 +340,6 @@ var group__codegen__backends = [ "visit_paren_expression", "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a96932dfa1cc61d6eeb2d650e707ecf20", null ], [ "visit_prime_name", "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a0c937b0ca36a6489bbc6630db5df0cf5", null ], [ "visit_program", "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a491e418920668f8fce331c65e8b48a02", null ], - [ "visit_protect_statement", "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a946c6fc559c23573210285ed47e28570", null ], [ "visit_solution_expression", "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a40bc1308f847c66bc91d9c93368db6ec", null ], [ "visit_statement_block", "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a8eb67dab884cc678e541ff5cc77b5e03", null ], [ "visit_string", "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a502fd875dc95e68f905fe2070abaeff8", null ], @@ -409,7 +408,6 @@ var group__codegen__backends = [ "optimize_ion_variable_copies", "classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a70bd9cedc2fcae2e924ebcc59c7f728b", null ], [ "position_of_float_var", "classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#afdd6466ebac569ec670c3b6f4ca11d3e", null ], [ "position_of_int_var", "classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a8c348f1869653cec3dcc39b1866bab97", null ], - [ "print_atomic_reduction_pragma", "classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a910f9f22e6fbdae4eefae177eb8910f9", null ], [ "print_check_table_entrypoint", "classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a389587ac35ce1f02ced547e3c8698241", null ], [ "print_codegen_routines", "classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a9f9d3aebd2dc5bbc05e0cb7e9a707c7f", null ], [ "print_codegen_routines_nothing", "classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a63c12682de4f91faa14cc743ec4def84", null ], diff --git a/doxygen/namespacenmodl_1_1codegen.html b/doxygen/namespacenmodl_1_1codegen.html index cf1e28dd9..263e3955c 100644 --- a/doxygen/namespacenmodl_1_1codegen.html +++ b/doxygen/namespacenmodl_1_1codegen.html @@ -368,7 +368,7 @@

                    The two names can differ, because an early pass makes all names unique by renaming local variables.

                    -

                    Definition at line 663 of file codegen_neuron_cpp_visitor.cpp.

                    +

                    Definition at line 657 of file codegen_neuron_cpp_visitor.cpp.

                    @@ -497,7 +497,7 @@

                    x[id] = _args[1];

                    So, the R in AST needs to be renamed with _args[1].

                    -

                    Definition at line 2797 of file codegen_neuron_cpp_visitor.cpp.

                    +

                    Definition at line 2791 of file codegen_neuron_cpp_visitor.cpp.

                    diff --git a/doxygen/navtreedata.js b/doxygen/navtreedata.js index 8bcd67ace..6208d4527 100644 --- a/doxygen/navtreedata.js +++ b/doxygen/navtreedata.js @@ -80,25 +80,25 @@ var NAVTREEINDEX = "classnmodl_1_1ast_1_1_unit_def.html#a004617c70f19f97af01f5b730ca773f8", "classnmodl_1_1ast_1_1_watch_statement.html#acb06bd330ecd46878dfd986ce7b78749", "classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#afae0368728a114f8b4ce82148e4489dd", -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a000f92fb0976845c64c6eda08255e8bd", -"classnmodl_1_1printer_1_1_code_printer.html#a072c94bdf396471dc878e9b648c941b9", -"classnmodl_1_1utils_1_1_singleton_random_string.html", -"classnmodl_1_1visitor_1_1_const_ast_visitor.html#aea62f733b34b537b7b1e5761dd5dbd2e", -"classnmodl_1_1visitor_1_1_inline_visitor.html#ad8364b22d75e2c80ae6f81da015ad9de", -"classnmodl_1_1visitor_1_1_meta_ast_lookup_visitor.html#a2b780cb504f51c876c523689a04e8fe8", -"classnmodl_1_1visitor_1_1_nmodl_print_visitor.html#aea8da2c2b8209e79dccf2c31b2a39673", -"classnmodl_1_1visitor_1_1_symtab_visitor.html#a0309f454717bfd5481e7cf848ac072d9", -"classnmodl_1_1visitor_1_1test_1_1_check_parent_visitor.html#a3335d25a1c678904e2a57105eaaaeb2b", -"codegen__neuron__cpp__visitor_8hpp.html#ga9dc150643b36d2a9087f4ab7c94325c7", -"functions_enum.html", -"group__ast__class.html#ga9313a4af4b7e130f1ff85aa1e11882ab", -"group__ast__type.html#ggac392e49849e60c05e42ea02c7b445033a826c8a2fe513ff58c32444a201b329c3", -"group__token__test.html#ga9cd6cc464d230725aacf2bf9d41d364e", -"modl_8h.html#af41b52becd124ffeffcafeddbdc1041c", -"pynmodl_8cpp.html#ad7464779774fc6cb7bb6fbad60a4285e", -"structnmodl_1_1codegen_1_1_codegen_info.html#af61629cf3b042744e0ae3655e807e52a", -"symbol__properties_8hpp.html#ad9b6b8559b36d0a500ef5110badcc4dbab42b3dbb719197d22c748fc74ac64ba4", -"verbatim__var__rename__visitor_8hpp.html" +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a0195ec229853e6a5568228b868829942", +"classnmodl_1_1printer_1_1_code_printer.html#a0d6960442321cbd19c3e8cead6453508", +"classnmodl_1_1utils_1_1_singleton_random_string.html#a8636f8bfba5add1a513d1ce337986a6f", +"classnmodl_1_1visitor_1_1_const_ast_visitor.html#aed32e0d996ccf43cb8e936698810922b", +"classnmodl_1_1visitor_1_1_inline_visitor.html#af3a3ff4e27c999ca83715ded49a37229", +"classnmodl_1_1visitor_1_1_meta_ast_lookup_visitor.html#a32d7496908b1535aa94324f3fcd3d593", +"classnmodl_1_1visitor_1_1_nmodl_print_visitor.html#aed40e6b59c06924a3fd8a95a9f25c640", +"classnmodl_1_1visitor_1_1_symtab_visitor.html#a072518e9ec13c2743cabc1b9e8db876e", +"classnmodl_1_1visitor_1_1test_1_1_check_parent_visitor.html#a392fa77ff451c512dbfe1af268de5c31", +"codegen__transform__visitor_8cpp.html", +"functions_func.html", +"group__ast__class.html#ga933f5f45973d115b0a274d0ff628cb56", +"group__ast__type.html#ggac392e49849e60c05e42ea02c7b445033a9143f3113407701188b8f7d6cc051124", +"group__units.html#ga08e9b606cb5ea92658765b82a886f2f8", +"modtoken_8hpp.html", +"pynmodl_8cpp_source.html", +"structnmodl_1_1codegen_1_1_codegen_info.html#afbd7bbb54c12a07fce90d62325799810", +"symbol__properties_8hpp.html#ad9b6b8559b36d0a500ef5110badcc4dbac89e419cdec37c6436386d0ccee1096a", +"verbatim__visitor_8cpp.html" ]; var SYNCONMSG = 'click to disable panel synchronisation'; diff --git a/doxygen/navtreeindex15.js b/doxygen/navtreeindex15.js index ecee31ddf..b2b27f590 100644 --- a/doxygen/navtreeindex15.js +++ b/doxygen/navtreeindex15.js @@ -182,7 +182,6 @@ var NAVTREEINDEX15 = "classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#a6228949e87b0a9e14fe6886fc346e28c":[0,1,0,2,43], "classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#a6498ebb631852d55d7585ef179b3008e":[0,1,0,2,44], "classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#a656859e8b2ce968ed39db6e966c2338f":[0,1,0,2,76], -"classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#a66833aede8ecc336b85129ca1e8b8b2e":[0,1,0,2,29], "classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#a6aacd1083b5929ad28f227d20a412b4e":[0,1,0,2,85], "classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#a6f5682b33a0230cf3a068290df144831":[0,1,0,2,56], "classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#a6ffa9eb4970b25948f6e971d8af7208e":[0,1,0,2,106], @@ -196,7 +195,7 @@ var NAVTREEINDEX15 = "classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#a8baaf5567ede31aa84237b45e9a2ec5f":[0,1,0,2,69], "classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#a8c25ecae06f5de662111c25a57501ad8":[0,1,0,2,101], "classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#a8ced8ed7909fe1536bdef83de1922d42":[0,1,0,2,108], -"classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#a8d05784b3300be188775cf2ec9958dc6":[0,1,0,2,125], +"classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#a8d05784b3300be188775cf2ec9958dc6":[0,1,0,2,126], "classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#a9206c89aa6ac5f56a2d462df9659ded2":[0,1,0,2,82], "classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#a92f46b65366a865118933f37c589d34e":[0,1,0,2,33], "classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#a93aa5868249076c8b0766369cbbba993":[0,1,0,2,39], @@ -212,6 +211,7 @@ var NAVTREEINDEX15 = "classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#aa00bfb7065e72ad3b287eb78c414bd8d":[0,1,0,2,114], "classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#aaf42cb87b55f8b75effc9a052bb58dc1":[0,1,0,2,84], "classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#ab13ca7a0bef674739095466ff66f9843":[0,1,0,2,121], +"classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#ab21de33c81f273ad3db2d5271221bcdc":[0,1,0,2,29], "classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#ab530015ada1f6f6299b526a32e277a0c":[0,1,0,2,46], "classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#ab58b5680bc2f8e2e0fb8f693c5c1d8e4":[0,1,0,2,5], "classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#ab7016831f7a1331681cd712690d64bc7":[0,1,0,2,71], @@ -221,7 +221,7 @@ var NAVTREEINDEX15 = "classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#abd6be1c541190358a512f0021ea82b16":[0,1,0,2,30], "classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#abe7b5a4015101375080492cc8e691d1d":[0,1,0,2,110], "classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#ac1fd31d8615b5b189349471a7ca23cee":[0,1,0,2,80], -"classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#ac5b4b072e64caba7ea89e89f0ea0090a":[0,1,0,2,124], +"classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#ac5b4b072e64caba7ea89e89f0ea0090a":[0,1,0,2,125], "classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#ac6eb4038a1823315b2aa509f7c05c132":[0,1,0,2,94], "classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#ac9ba65a2697010e37db0eadc024e8635":[0,1,0,2,86], "classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#acad81499ea14286cb3f598ee56a7930e":[0,1,0,2,54], diff --git a/doxygen/navtreeindex16.js b/doxygen/navtreeindex16.js index 56f9c785e..10edc26cd 100644 --- a/doxygen/navtreeindex16.js +++ b/doxygen/navtreeindex16.js @@ -3,194 +3,193 @@ var NAVTREEINDEX16 = "classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#afae0368728a114f8b4ce82148e4489dd":[0,1,0,2,37], "classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#afdb445887173a3e006e72772cfffffbc":[0,1,0,2,12], "classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#afeaeb2e47f164b9ffd545c3dee232ab4":[0,1,0,2,62], +"classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#affd885d93ced7c0bd58ad023444a4737":[0,1,0,2,124], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html":[0,1,0,3], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a01b7bb925a48bbca6dbdfca8e1e6afd2":[0,1,0,3,16], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a022e94245068b1c395e13272d8bc4984":[0,1,0,3,102], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a022e94245068b1c395e13272d8bc4984":[0,1,0,3,101], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a035e8d807028affb949365cac3c000c1":[0,1,0,3,27], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a09d3b482c400b93d31010c2f33f794f4":[0,1,0,3,65], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a0c937b0ca36a6489bbc6630db5df0cf5":[0,1,0,3,162], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a0c937b0ca36a6489bbc6630db5df0cf5":[0,1,0,3,161], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a1383d59c91539e205ef2ade35d1dafcb":[0,1,0,3,26], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a1618d24f8fc2ae9e22e3d65e6651ba07":[0,1,0,3,56], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a179ec184fad5533dd35859beea905e37":[0,1,0,3,117], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a1875fbbecca3538023fc45900a91d9a9":[0,1,0,3,90], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a190bf9a0838f05780f727a5a90883813":[0,1,0,3,97], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a179ec184fad5533dd35859beea905e37":[0,1,0,3,116], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a1875fbbecca3538023fc45900a91d9a9":[0,1,0,3,89], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a190bf9a0838f05780f727a5a90883813":[0,1,0,3,96], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a199a281ca182a40a40331fa29e45828a":[0,1,0,3,14], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a1c3e5aa67b1f486463340b8102b95e81":[0,1,0,3,140], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a1e105e4b89ba5652f46bb91e49c817eb":[0,1,0,3,133], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a1eb66c309a71c8e942f8bc0b518c84ed":[0,1,0,3,152], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a2048f207d5eafad3f1bf21d33424fc8b":[0,1,0,3,128], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a20666add7b3f75937954a038c51f5b55":[0,1,0,3,76], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a20a5b2ac403015cf48bc09b6f1f26408":[0,1,0,3,169], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a22b033ac5c8d3f09e96b814355fea17a":[0,1,0,3,144], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a2453a1be52f39c3fa9bab2603f1f4773":[0,1,0,3,118], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a1c3e5aa67b1f486463340b8102b95e81":[0,1,0,3,139], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a1e105e4b89ba5652f46bb91e49c817eb":[0,1,0,3,132], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a1eb66c309a71c8e942f8bc0b518c84ed":[0,1,0,3,151], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a2048f207d5eafad3f1bf21d33424fc8b":[0,1,0,3,127], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a20666add7b3f75937954a038c51f5b55":[0,1,0,3,75], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a20a5b2ac403015cf48bc09b6f1f26408":[0,1,0,3,167], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a22b033ac5c8d3f09e96b814355fea17a":[0,1,0,3,143], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a2453a1be52f39c3fa9bab2603f1f4773":[0,1,0,3,117], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a264f87fb7bb6d8954640417ba8b26643":[0,1,0,3,5], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a26ad42be1c7c9a127b2d806d08e426a6":[0,1,0,3,44], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a294f3c4467883beffdc0d6bea67e1741":[0,1,0,3,49], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a29c095f39a79b5fe0782a6ee22d597ff":[0,1,0,3,59], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a2a1e5337a20e3f1dad1d1dfbb89fbb1b":[0,1,0,3,175], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a2a1e5337a20e3f1dad1d1dfbb89fbb1b":[0,1,0,3,173], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a2b38e0698ce09dbe7d07baa3afc26035":[0,1,0,3,47], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a2b676207cf17711c6957d74b5b2fc5dc":[0,1,0,3,22], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a2c2cc98773567aab72050567fcbf4062":[0,1,0,3,103], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a2c2cc98773567aab72050567fcbf4062":[0,1,0,3,102], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a2d7cffd628c745f2e7614ffab48f4346":[0,1,0,3,69], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a2e2dd82a055dd830e8efc7f1dce03924":[0,1,0,3,46], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a2ecbf452d80ce4914271469183e2e31c":[0,1,0,3,51], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a2f6825fbb587362e1ed38f03e3b97d86":[0,1,0,3,15], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a30af017ff0f7101ed71d9b43e56031ca":[0,1,0,3,8], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a314e2615fb2851cf695a7b3adacef3e8":[0,1,0,3,189], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a314e2615fb2851cf695a7b3adacef3e8":[0,1,0,3,187], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a32f908e88bbb1c5070b5e011f2955c07":[0,1,0,3,42], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a34453683f5cc03bd4169ea004cd7e725":[0,1,0,3,156], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a34492b32e18b9fbfd3ba01ba8ad85eb5":[0,1,0,3,80], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a34ae139e68f31b69fa73c9a84c2197e8":[0,1,0,3,123], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a34453683f5cc03bd4169ea004cd7e725":[0,1,0,3,155], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a34492b32e18b9fbfd3ba01ba8ad85eb5":[0,1,0,3,79], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a34ae139e68f31b69fa73c9a84c2197e8":[0,1,0,3,122], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a355831ff4f413b3804e637b55b5cab2c":[0,1,0,3,6], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a36470f1359566ee071015a630deb89cd":[0,1,0,3,106], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a36470f1359566ee071015a630deb89cd":[0,1,0,3,105], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a37c30fea3191a0275918448626e043c4":[0,1,0,3,66], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a380ec35a9c68ed3384489d17a385551a":[0,1,0,3,190], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a39f53b61e542c912e8f6366bad9cf5d4":[0,1,0,3,119], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a380ec35a9c68ed3384489d17a385551a":[0,1,0,3,188], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a39f53b61e542c912e8f6366bad9cf5d4":[0,1,0,3,118], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a3a441ca48ae4cff29a4f715314fcb0c9":[0,1,0,3,60], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a3c5c3eba48b2417a66663739a128e05a":[0,1,0,3,153], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a3d57488493a7ddc5273e1bb4799f7d62":[0,1,0,3,147], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a3e46711f25455021caa5de67ef374f55":[0,1,0,3,154], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a3ee489972d8827f03490337c96a74b43":[0,1,0,3,134], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a3c5c3eba48b2417a66663739a128e05a":[0,1,0,3,152], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a3d57488493a7ddc5273e1bb4799f7d62":[0,1,0,3,146], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a3e46711f25455021caa5de67ef374f55":[0,1,0,3,153], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a3ee489972d8827f03490337c96a74b43":[0,1,0,3,133], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a3ef901c89d40124058a0df268b4f8101":[0,1,0,3,72], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a407af2b73f564d5db79381b5b2699c97":[0,1,0,3,77], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a40bc1308f847c66bc91d9c93368db6ec":[0,1,0,3,165], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a430f1ba9b0f5fe9f3b74678f63025384":[0,1,0,3,91], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a431541d09a66c744e0df775d2ccd3acd":[0,1,0,3,150], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a43f0f0e7a34f447cfc24f81a079e31ed":[0,1,0,3,184], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a407af2b73f564d5db79381b5b2699c97":[0,1,0,3,76], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a40bc1308f847c66bc91d9c93368db6ec":[0,1,0,3,163], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a430f1ba9b0f5fe9f3b74678f63025384":[0,1,0,3,90], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a431541d09a66c744e0df775d2ccd3acd":[0,1,0,3,149], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a43f0f0e7a34f447cfc24f81a079e31ed":[0,1,0,3,182], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a45588d5fdae43244430cbd474f8772b1":[0,1,0,3,30], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a47ec42bac98d050f0db949aefb0a88b1":[0,1,0,3,178], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a481001b393776c233ccdc069916d2d7c":[0,1,0,3,116], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a47ec42bac98d050f0db949aefb0a88b1":[0,1,0,3,176], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a481001b393776c233ccdc069916d2d7c":[0,1,0,3,115], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a48dcfcf9da8eabf3e2fd787c510f1ed5":[0,1,0,3,11], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a491e418920668f8fce331c65e8b48a02":[0,1,0,3,163], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a49519f5b846f396cd1a4bf0b8775ac65":[0,1,0,3,94], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a4aae89718f398e9342badae038f5e27e":[0,1,0,3,104], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a4bf65c93bea904102b63553f3e5dd1b3":[0,1,0,3,115], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a4f2304d508e3d9645581004c676d94ca":[0,1,0,3,171], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a502fd875dc95e68f905fe2070abaeff8":[0,1,0,3,167], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a491e418920668f8fce331c65e8b48a02":[0,1,0,3,162], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a49519f5b846f396cd1a4bf0b8775ac65":[0,1,0,3,93], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a4aae89718f398e9342badae038f5e27e":[0,1,0,3,103], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a4bf65c93bea904102b63553f3e5dd1b3":[0,1,0,3,114], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a4f2304d508e3d9645581004c676d94ca":[0,1,0,3,169], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a502fd875dc95e68f905fe2070abaeff8":[0,1,0,3,165], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a50cbee5029c7f2bc22d697b7cd09f0cf":[0,1,0,3,31], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a50ccadf68055ea9e26439ccaed0d68f7":[0,1,0,3,86], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a522261006f1cc94869ef15cd26b739da":[0,1,0,3,120], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a52c4e7589ecefee4dbbff1286344499e":[0,1,0,3,179], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a52cb50316afdcb5899663c98aa47c0de":[0,1,0,3,183], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a5711fc465136219d98b57fc2c2822f24":[0,1,0,3,151], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a50ccadf68055ea9e26439ccaed0d68f7":[0,1,0,3,85], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a522261006f1cc94869ef15cd26b739da":[0,1,0,3,119], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a52c4e7589ecefee4dbbff1286344499e":[0,1,0,3,177], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a52cb50316afdcb5899663c98aa47c0de":[0,1,0,3,181], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a5711fc465136219d98b57fc2c2822f24":[0,1,0,3,150], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a578f6c60b4ca495b24e5b7ae2db448cc":[0,1,0,3,10], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a5c01e5384054600f152132b47f8af550":[0,1,0,3,87], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a5c01e5384054600f152132b47f8af550":[0,1,0,3,86], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a5c6520580009a4608d6ea4e221ef3d29":[0,1,0,3,61], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a5d27122b2e313dea42df01616a246b1c":[0,1,0,3,3], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a5d7d3326aaa9849977f0c203078f39e4":[0,1,0,3,130], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a60bf374a3063ccd280e46b7af0e48645":[0,1,0,3,121], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a6131bec61397f01d9739e694c57afdbf":[0,1,0,3,124], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a6145c59148d531ca06c5d6f218e21b02":[0,1,0,3,110], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a61cbd5c5b750491ce0de5bc72694ef03":[0,1,0,3,129], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a629e1fff799f15735376832d9ed176a2":[0,1,0,3,187], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a62b9784473e79ee257fc3b0307ca6699":[0,1,0,3,93], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a5d7d3326aaa9849977f0c203078f39e4":[0,1,0,3,129], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a60bf374a3063ccd280e46b7af0e48645":[0,1,0,3,120], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a6131bec61397f01d9739e694c57afdbf":[0,1,0,3,123], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a6145c59148d531ca06c5d6f218e21b02":[0,1,0,3,109], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a61cbd5c5b750491ce0de5bc72694ef03":[0,1,0,3,128], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a629e1fff799f15735376832d9ed176a2":[0,1,0,3,185], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a62b9784473e79ee257fc3b0307ca6699":[0,1,0,3,92], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a6355225bc6f8a723100111beb2af4b7f":[0,1,0,3,19], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a64ea6b995f5bdba987b466da3d374b51":[0,1,0,3,25], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a661794563709a984308164abcdd543ee":[0,1,0,3,176], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a661794563709a984308164abcdd543ee":[0,1,0,3,174], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a679b657463892cddf8e20d553f2ca682":[0,1,0,3,34], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a6aa1a4d529cb3159d3a4534dd673e861":[0,1,0,3,58], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a6b6f336bd93b1a3053428a92cf0fc909":[0,1,0,3,170], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a6b6f336bd93b1a3053428a92cf0fc909":[0,1,0,3,168], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a6c0ac0823d48779ad3c84ee0bedf1e23":[0,1,0,3,63], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a6d260fcee2ad4a83b36fc26adad5934d":[0,1,0,3,70], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a6d73d64a97cc8f024e1ee3367bfd119d":[0,1,0,3,92], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a6d73d64a97cc8f024e1ee3367bfd119d":[0,1,0,3,91], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a6d8c0140086b0f5284e1cf7c23632463":[0,1,0,3,43], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a6e25890e173635c92d41465a2ee4d3a2":[0,1,0,3,45], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a6e7b32701d8bf69f1ba8995e4bf50ad3":[0,1,0,3,168], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a6e7b32701d8bf69f1ba8995e4bf50ad3":[0,1,0,3,166], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a735169db411f02702d9931aa32634ae2":[0,1,0,3,32], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a73d001ad3c271c56d89e09e2cebfceb3":[0,1,0,3,0], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a74fd9098a04a59ba0f11c17d0e51a876":[0,1,0,3,79], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a74fd9098a04a59ba0f11c17d0e51a876":[0,1,0,3,78], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a7559257a5ad55a48d1221522838c5daf":[0,1,0,3,50], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a776d0fe24a9e8bc50598d6353fee3dfa":[0,1,0,3,7], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a78481115d7590930ac4d58d0bdaa2acc":[0,1,0,3,107], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a789dae2310c3496443a8a51c26cc8b71":[0,1,0,3,138], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a7b4903b21fc0872bcb8e68fe0a2efb1a":[0,1,0,3,109], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a78481115d7590930ac4d58d0bdaa2acc":[0,1,0,3,106], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a789dae2310c3496443a8a51c26cc8b71":[0,1,0,3,137], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a7b4903b21fc0872bcb8e68fe0a2efb1a":[0,1,0,3,108], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a7c72df642a0d00144470a946f65eb5bc":[0,1,0,3,39], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a7cb14cb8ebe04982bb17999fa1a2c479":[0,1,0,3,55], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a7dad6de0caa4a6f50a54db2a87edda5e":[0,1,0,3,113], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a7dad6de0caa4a6f50a54db2a87edda5e":[0,1,0,3,112], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a81cded985b616728b55976bf7eca4488":[0,1,0,3,71], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a821839be74f3cc975dff8a9c76ed54ad":[0,1,0,3,149], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a8229d44e2e83410c2e28319a64e24f75":[0,1,0,3,160], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a821839be74f3cc975dff8a9c76ed54ad":[0,1,0,3,148], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a8229d44e2e83410c2e28319a64e24f75":[0,1,0,3,159], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a84d8220dfbff2afda5d207b6d29f61f8":[0,1,0,3,1], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a8b8b75dcd53ae8e3a641f18cb00bee1d":[0,1,0,3,137], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a8b912ad6d9a4f6d8e4c1bb16f2c95fbf":[0,1,0,3,125], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a8c28e874826634125ad9b5f59511f445":[0,1,0,3,173], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a8cefcce52cd721b3869701367f456a71":[0,1,0,3,108], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a8eb67dab884cc678e541ff5cc77b5e03":[0,1,0,3,166], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a8ed7dc66684dd077c0aa2260e0e0afb4":[0,1,0,3,158], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a8b8b75dcd53ae8e3a641f18cb00bee1d":[0,1,0,3,136], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a8b912ad6d9a4f6d8e4c1bb16f2c95fbf":[0,1,0,3,124], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a8c28e874826634125ad9b5f59511f445":[0,1,0,3,171], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a8cefcce52cd721b3869701367f456a71":[0,1,0,3,107], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a8eb67dab884cc678e541ff5cc77b5e03":[0,1,0,3,164], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a8ed7dc66684dd077c0aa2260e0e0afb4":[0,1,0,3,157], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a913c33933a32feca0f0389cee637a293":[0,1,0,3,20], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a91fdec443327720111f0b8ecad783c87":[0,1,0,3,112], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a92bfb8a4daec705014f8e871fb0feacb":[0,1,0,3,74], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a93358fcb6712a4ac8c1565529821b340":[0,1,0,3,139], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a93592e117e3283a0b2e0a5aa647bc155":[0,1,0,3,111], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a936ed1973fb19388fd20fa09f0f9d8bb":[0,1,0,3,145], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a946c6fc559c23573210285ed47e28570":[0,1,0,3,164], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a96932dfa1cc61d6eeb2d650e707ecf20":[0,1,0,3,161], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a96ee5727c24f572b7b25cd2c39b9b776":[0,1,0,3,99], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a987d2e01b76d37c69fd6e589b4d69473":[0,1,0,3,181], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a9a425d43bf21b8dddc7971e25c9e09fb":[0,1,0,3,146], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a9d510c84d63d2b62f54ae44ef2ff75dd":[0,1,0,3,127], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a91fdec443327720111f0b8ecad783c87":[0,1,0,3,111], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a93358fcb6712a4ac8c1565529821b340":[0,1,0,3,138], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a93592e117e3283a0b2e0a5aa647bc155":[0,1,0,3,110], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a936ed1973fb19388fd20fa09f0f9d8bb":[0,1,0,3,144], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a96932dfa1cc61d6eeb2d650e707ecf20":[0,1,0,3,160], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a96ee5727c24f572b7b25cd2c39b9b776":[0,1,0,3,98], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a987d2e01b76d37c69fd6e589b4d69473":[0,1,0,3,179], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a9a425d43bf21b8dddc7971e25c9e09fb":[0,1,0,3,145], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a9d510c84d63d2b62f54ae44ef2ff75dd":[0,1,0,3,126], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a9e8cf78aab17a6acf070dc49ab0581aa":[0,1,0,3,64], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a9ec8d64ef0941d98af29b31060155c0b":[0,1,0,3,84], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a9ec8d64ef0941d98af29b31060155c0b":[0,1,0,3,83], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a9fd66cb8986ef84feaa63fdd0f072e45":[0,1,0,3,29], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#aa017bbe95ad7539e72d182dac59f2454":[0,1,0,3,85], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#aa178905346b46254fd1a5101176820ef":[0,1,0,3,126], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#aa2be06a920e2103ba838c308a2dcc57e":[0,1,0,3,186], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#aa017bbe95ad7539e72d182dac59f2454":[0,1,0,3,84], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#aa178905346b46254fd1a5101176820ef":[0,1,0,3,125], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#aa2be06a920e2103ba838c308a2dcc57e":[0,1,0,3,184], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#aa526479a9b7e3f096291cebbb0806df9":[0,1,0,3,21], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#aa539bb6033a8bcd87fc4eb279bad887a":[0,1,0,3,132], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#aa539bb6033a8bcd87fc4eb279bad887a":[0,1,0,3,131], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#aaa6dae67e44cbd29e86e10b270249bed":[0,1,0,3,73], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#aac1df493cd346d7faccb17ae5440ddc4":[0,1,0,3,40], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#aada5b6eeb7fd6f21a4ce2c68da1e2994":[0,1,0,3,9], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#aadbceff0e1e871a3b7fb3730faf07f3e":[0,1,0,3,95], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#aaf72cbf7288677fa045647df13322804":[0,1,0,3,114], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#aadbceff0e1e871a3b7fb3730faf07f3e":[0,1,0,3,94], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#aaf72cbf7288677fa045647df13322804":[0,1,0,3,113], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#ab17aa507fc9629eb122bd46c839e0261":[0,1,0,3,52], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#ab58b5680bc2f8e2e0fb8f693c5c1d8e4":[0,1,0,3,2], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#ab6dee6fac7e1fe99df8101f225c06cda":[0,1,0,3,48], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#ab73bd08773b0f697346e99f3ab501b43":[0,1,0,3,23], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#ab89f79a9fc8322d65051575bfb102904":[0,1,0,3,17], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#aba3a9521ace5f09f4d2263e4401b33ee":[0,1,0,3,141], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#aba3a9521ace5f09f4d2263e4401b33ee":[0,1,0,3,140], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#abb107f782ba7985c00ac77dc77acd35c":[0,1,0,3,54], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#abcf0d5623d10f929b40dd3fc0e8ad00a":[0,1,0,3,68], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#abe4fe9f14753f16e3b1014cdb4e9f846":[0,1,0,3,36], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#ac03f9380fcd4421f95e56f37f0cd00c7":[0,1,0,3,53], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#ac1af60c6e410db30d87cecefd7cc7160":[0,1,0,3,155], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#ac2029b16365753e1e337f82cda0e3350":[0,1,0,3,185], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#ac22dee1d346345a9c9583029c5c1f285":[0,1,0,3,159], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#ac5bd9ecbc1c392116871b5adaeb815a8":[0,1,0,3,177], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#ac1af60c6e410db30d87cecefd7cc7160":[0,1,0,3,154], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#ac2029b16365753e1e337f82cda0e3350":[0,1,0,3,183], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#ac22dee1d346345a9c9583029c5c1f285":[0,1,0,3,158], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#ac5bd9ecbc1c392116871b5adaeb815a8":[0,1,0,3,175], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#ac87b0baf7ca05124b07a2cb0c405a165":[0,1,0,3,33], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#ac9afb2932937099ff2a72314c9027a07":[0,1,0,3,18], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#acbb83079b063cd6b48e07030b1f5df84":[0,1,0,3,78], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#acd5e0d9dafe7c14f8946e980b77410ae":[0,1,0,3,96], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#acec9a90ac60967aeee0466003256855a":[0,1,0,3,180], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#acbb83079b063cd6b48e07030b1f5df84":[0,1,0,3,77], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#acd5e0d9dafe7c14f8946e980b77410ae":[0,1,0,3,95], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#acec9a90ac60967aeee0466003256855a":[0,1,0,3,178], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#acf8e00aaf5cd53b7be12cfeeee66c5b7":[0,1,0,3,37], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#ad3fa1a15788de5405f64304fcae242f9":[0,1,0,3,35], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#ad4462dbd2b4f56b33b7cc875150ca77c":[0,1,0,3,157], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#ad488bc63dac24ac7e5c29a1138172ed7":[0,1,0,3,172], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#ad4462dbd2b4f56b33b7cc875150ca77c":[0,1,0,3,156], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#ad488bc63dac24ac7e5c29a1138172ed7":[0,1,0,3,170], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#ad4e248ac19ce527c6e64304c42364388":[0,1,0,3,62], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#ad52157be3346d8ee276103a8e42d2226":[0,1,0,3,122], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#ad63b4318b5abd6b8c224fab70fe61081":[0,1,0,3,82], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#ad8f1d584c9b5ba8326275cacbdb2e5a2":[0,1,0,3,148], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#adbd9c05210e44bd265cde6462ccd43c2":[0,1,0,3,98], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#ae02024096ab4490b8a6215b3e59e6de0":[0,1,0,3,143], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#ad52157be3346d8ee276103a8e42d2226":[0,1,0,3,121], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#ad63b4318b5abd6b8c224fab70fe61081":[0,1,0,3,81], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#ad8f1d584c9b5ba8326275cacbdb2e5a2":[0,1,0,3,147], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#adbd9c05210e44bd265cde6462ccd43c2":[0,1,0,3,97], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#ae02024096ab4490b8a6215b3e59e6de0":[0,1,0,3,142], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#ae022e99573f663fc0db935c5c1bb7199":[0,1,0,3,12], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#ae058bdc14f4813c5e0a9ad9ff364c0d4":[0,1,0,3,28], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#ae0d8d4e346e244c764911c0c64c2ac1c":[0,1,0,3,142], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#ae0e48a2461354feaaa2a3077da1d02f6":[0,1,0,3,100], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#ae2fa3994b15579d0752d740c279c2073":[0,1,0,3,182], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#ae333398890c61148ec60cb52c3d28c10":[0,1,0,3,136], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#ae350ed7effbbcf8dbea050231599c8e6":[0,1,0,3,105], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#ae0d8d4e346e244c764911c0c64c2ac1c":[0,1,0,3,141], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#ae0e48a2461354feaaa2a3077da1d02f6":[0,1,0,3,99], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#ae2fa3994b15579d0752d740c279c2073":[0,1,0,3,180], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#ae333398890c61148ec60cb52c3d28c10":[0,1,0,3,135], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#ae350ed7effbbcf8dbea050231599c8e6":[0,1,0,3,104], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#ae380b1cd2026a4330518944637c56a79":[0,1,0,3,38], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#ae63ddf806884e983a264346f21794168":[0,1,0,3,174], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#ae63ddf806884e983a264346f21794168":[0,1,0,3,172], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#aeacff81944f23540968aa617d25e3d22":[0,1,0,3,41], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#aec3cef47cc3c1e5901b4ff401ce8e725":[0,1,0,3,135], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#aec5684647e34e9f3381635ab50ce4ed0":[0,1,0,3,81], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#aedbc4853fc3389e41da25ddc1d6852ee":[0,1,0,3,88], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#aee824eb01f6cf6f9187af509245ffc3a":[0,1,0,3,101], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#aec3cef47cc3c1e5901b4ff401ce8e725":[0,1,0,3,134], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#aec5684647e34e9f3381635ab50ce4ed0":[0,1,0,3,80], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#aedbc4853fc3389e41da25ddc1d6852ee":[0,1,0,3,87], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#aee824eb01f6cf6f9187af509245ffc3a":[0,1,0,3,100], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#aeeacd28215827d6b0cd23cf59e5fc0c2":[0,1,0,3,4], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#aef9a70a351e1280377e85b254029a6b8":[0,1,0,3,89], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#aef9a70a351e1280377e85b254029a6b8":[0,1,0,3,88], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#aeffdcf8ae1e82f59eb45c53c196c258a":[0,1,0,3,24], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#af55b2f46300b89a8458f17ab405eaa29":[0,1,0,3,188], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#af55b2f46300b89a8458f17ab405eaa29":[0,1,0,3,186], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#afba5ac1d4636d7ba57ac3fd7c7b5e2ba":[0,1,0,3,13], -"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#afc26a2583e8b283deae9944939788f79":[0,1,0,3,75], +"classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#afc26a2583e8b283deae9944939788f79":[0,1,0,3,74], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#afdf8d3232526bf1978bb298755f42958":[0,1,0,3,57], "classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#aff92b4a2fed92577dbd5294d54def2e8":[0,1,0,3,67], "classnmodl_1_1codegen_1_1_codegen_helper_visitor.html":[0,1,1,2], @@ -249,5 +248,6 @@ var NAVTREEINDEX16 = "classnmodl_1_1codegen_1_1_codegen_helper_visitor.html#af20451367756d95c85cd561cde6fe755":[0,1,1,2,31], "classnmodl_1_1codegen_1_1_codegen_helper_visitor.html#af27eb43d5a4f76227692de56333b6c08":[0,1,1,2,21], "classnmodl_1_1codegen_1_1_codegen_helper_visitor.html#afade7f98dc6e604097cca537fb45b9b7":[0,1,1,2,18], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html":[0,1,0,5] +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html":[0,1,0,5], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a000f92fb0976845c64c6eda08255e8bd":[0,1,0,5,114] }; diff --git a/doxygen/navtreeindex17.js b/doxygen/navtreeindex17.js index e1b150c66..20cbf40fa 100644 --- a/doxygen/navtreeindex17.js +++ b/doxygen/navtreeindex17.js @@ -1,127 +1,125 @@ var NAVTREEINDEX17 = { -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a000f92fb0976845c64c6eda08255e8bd":[0,1,0,5,115], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a0195ec229853e6a5568228b868829942":[0,1,0,5,91], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a0576184abf30e0d410bcd3abd320224a":[0,1,0,5,81], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a05f014fb5be8b7dd4b747bcc5d861ae3":[0,1,0,5,72], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a085966219db2e0b51d168738421df098":[0,1,0,5,96], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a0195ec229853e6a5568228b868829942":[0,1,0,5,90], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a0576184abf30e0d410bcd3abd320224a":[0,1,0,5,80], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a05f014fb5be8b7dd4b747bcc5d861ae3":[0,1,0,5,71], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a085966219db2e0b51d168738421df098":[0,1,0,5,95], "classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a0d2e3ea31dfc23e9bb67c3418b3ef09c":[0,1,0,5,11], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a0e20117b03f0840cc7686eb849e5ea74":[0,1,0,5,67], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a0e20117b03f0840cc7686eb849e5ea74":[0,1,0,5,66], "classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a10991a152a1da86120836c2f3a95408e":[0,1,0,5,26], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a111784a1f5c4ef8a2c04edb714cca60f":[0,1,0,5,95], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a13627a7a087155693424a846c1dca773":[0,1,0,5,63], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a1894716c8beb467b2cd8b0a785e86d9f":[0,1,0,5,44], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a190061ee034a8a342f484452f2c4de4f":[0,1,0,5,87], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a1d7cd0325d3658024daba8fe2d2cb804":[0,1,0,5,73], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a2142740635a801ade67d99228fd71ce2":[0,1,0,5,123], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a24c55a8420d179cbbd7bc6968f3c12e3":[0,1,0,5,100], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a2e35d75bdda2d2d46e097fc217e4ce9d":[0,1,0,5,106], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a389587ac35ce1f02ced547e3c8698241":[0,1,0,5,36], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a111784a1f5c4ef8a2c04edb714cca60f":[0,1,0,5,94], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a13627a7a087155693424a846c1dca773":[0,1,0,5,62], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a1894716c8beb467b2cd8b0a785e86d9f":[0,1,0,5,43], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a190061ee034a8a342f484452f2c4de4f":[0,1,0,5,86], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a1d7cd0325d3658024daba8fe2d2cb804":[0,1,0,5,72], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a2142740635a801ade67d99228fd71ce2":[0,1,0,5,122], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a24c55a8420d179cbbd7bc6968f3c12e3":[0,1,0,5,99], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a2e35d75bdda2d2d46e097fc217e4ce9d":[0,1,0,5,105], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a389587ac35ce1f02ced547e3c8698241":[0,1,0,5,35], "classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a3af0b90beeeec4a0e17e84a11a76ecbc":[0,1,0,5,15], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a3b8dd67ff60f10c2fee17f55d3eea366":[0,1,0,5,68], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a3b8dd67ff60f10c2fee17f55d3eea366":[0,1,0,5,67], "classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a3be37e0f3134950c8353fa7a89d62a29":[0,1,0,5,24], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a3c5c869470655815c71464f45fc82560":[0,1,0,5,105], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a3c5c869470655815c71464f45fc82560":[0,1,0,5,104], "classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a3e4bdc70a4d2eb6169d656c1ec9c9fe1":[0,1,0,5,14], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a403636272eebe18cf3f25759c06ec00a":[0,1,0,5,122], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a403636272eebe18cf3f25759c06ec00a":[0,1,0,5,121], "classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a425dc1af0daa5b3349d17035a7ef2eaf":[0,1,0,5,27], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a46dadeb4b5354222f493742dba649924":[0,1,0,5,97], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a46dadeb4b5354222f493742dba649924":[0,1,0,5,96], "classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a47ec475151d85f556126ab808d2896fe":[0,1,0,5,6], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a480879d1374101ede3c9542951433543":[0,1,0,5,93], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a480879d1374101ede3c9542951433543":[0,1,0,5,92], "classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a4fb4ca054d85c8bc2c0bd0445633710e":[0,1,0,5,9], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a50026c205b223b41ffe682526735873c":[0,1,0,5,113], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a5429cb9990f7cbe91dc33522da5ad76d":[0,1,0,5,94], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a578c9591148d60689bab835a02638034":[0,1,0,5,62], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a5997fef556aa7bad8fa4d6bfcf7427ef":[0,1,0,5,71], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a50026c205b223b41ffe682526735873c":[0,1,0,5,112], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a5429cb9990f7cbe91dc33522da5ad76d":[0,1,0,5,93], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a578c9591148d60689bab835a02638034":[0,1,0,5,61], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a5997fef556aa7bad8fa4d6bfcf7427ef":[0,1,0,5,70], "classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a5d27122b2e313dea42df01616a246b1c":[0,1,0,5,4], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a5d37ab79b25ee60e7f79962006b28b84":[0,1,0,5,118], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a5e99f3edec8e7e1f852cac39b1b7314e":[0,1,0,5,60], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a5d37ab79b25ee60e7f79962006b28b84":[0,1,0,5,117], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a5e99f3edec8e7e1f852cac39b1b7314e":[0,1,0,5,59], "classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a5eabd60e4b1c6ca3fddab4ec5838e4c7":[0,1,0,5,28], "classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a606e755398e68eb19f67a321a75170e3":[0,1,0,5,29], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a62669c86daa6bdd6c1e67e93461ad747":[0,1,0,5,86], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a631cd066f97558e6dc5a491cfa4d3adb":[0,1,0,5,47], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a63c12682de4f91faa14cc743ec4def84":[0,1,0,5,38], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a69af0a26621e7c16f798a451cbb7ab4a":[0,1,0,5,90], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a62669c86daa6bdd6c1e67e93461ad747":[0,1,0,5,85], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a631cd066f97558e6dc5a491cfa4d3adb":[0,1,0,5,46], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a63c12682de4f91faa14cc743ec4def84":[0,1,0,5,37], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a69af0a26621e7c16f798a451cbb7ab4a":[0,1,0,5,89], "classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a6dd3012e7064a1ec13ed321b28fb5d9f":[0,1,0,5,7], "classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a70bd9cedc2fcae2e924ebcc59c7f728b":[0,1,0,5,32], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a73657c5681f2d69ee6d1220a6c864097":[0,1,0,5,116], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a7383bfc53e24c3bfa1dc573fd588b5ac":[0,1,0,5,58], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a75551174c0c66124b0096de40ca20cbf":[0,1,0,5,104], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a76894f40f5ef1531c1b3c884f93eda42":[0,1,0,5,56], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a76d0048da834533ae00be73978240f27":[0,1,0,5,76], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a76f144fae532604ab1a1065d9c645211":[0,1,0,5,88], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a77ac6349ba709a4ef7ecd6a4c34b9e0c":[0,1,0,5,114], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a7ae1c75d72e23157093c66cc7bd6125d":[0,1,0,5,120], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a7d5cd8376a4014af5c5022e5c9045e6e":[0,1,0,5,41], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a7f4ad5f6ea50f654514526f32d35c1ed":[0,1,0,5,117], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a7f941bd8151d12ef887be3670dec264e":[0,1,0,5,53], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a86768e3cdb9274090352da827243bb06":[0,1,0,5,83], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a89c15974d73972df388dc1133fdfa406":[0,1,0,5,103], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a73657c5681f2d69ee6d1220a6c864097":[0,1,0,5,115], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a7383bfc53e24c3bfa1dc573fd588b5ac":[0,1,0,5,57], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a75551174c0c66124b0096de40ca20cbf":[0,1,0,5,103], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a76894f40f5ef1531c1b3c884f93eda42":[0,1,0,5,55], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a76d0048da834533ae00be73978240f27":[0,1,0,5,75], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a76f144fae532604ab1a1065d9c645211":[0,1,0,5,87], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a77ac6349ba709a4ef7ecd6a4c34b9e0c":[0,1,0,5,113], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a7ae1c75d72e23157093c66cc7bd6125d":[0,1,0,5,119], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a7d5cd8376a4014af5c5022e5c9045e6e":[0,1,0,5,40], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a7f4ad5f6ea50f654514526f32d35c1ed":[0,1,0,5,116], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a7f941bd8151d12ef887be3670dec264e":[0,1,0,5,52], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a86768e3cdb9274090352da827243bb06":[0,1,0,5,82], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a89c15974d73972df388dc1133fdfa406":[0,1,0,5,102], "classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a89c5a0f046f8752579636a3db97d669a":[0,1,0,5,3], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a8c240b7ccb8aa19ad0cfca2e57fd8496":[0,1,0,5,51], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a8c240b7ccb8aa19ad0cfca2e57fd8496":[0,1,0,5,50], "classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a8c348f1869653cec3dcc39b1866bab97":[0,1,0,5,34], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a8ec964e3dc55a132277d9273a3de33fe":[0,1,0,5,50], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a8f2937bc2fc0b00f9a83f128704924d6":[0,1,0,5,48], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a910f9f22e6fbdae4eefae177eb8910f9":[0,1,0,5,35], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a94f4993226aa53f6095ad4a44fe47420":[0,1,0,5,40], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a96edb3ade58fc8c569ac0c73a54fd091":[0,1,0,5,89], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a98255f56fe801ead43b5db6d47a5ee71":[0,1,0,5,42], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a9881596f3baf0d5f4fb57a5a4d3c5ff7":[0,1,0,5,75], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a9b04c504442be8eaffd17f52376b265a":[0,1,0,5,102], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a9ba4dfd6531cc6d70302de93d06a52e4":[0,1,0,5,108], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a8ec964e3dc55a132277d9273a3de33fe":[0,1,0,5,49], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a8f2937bc2fc0b00f9a83f128704924d6":[0,1,0,5,47], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a94f4993226aa53f6095ad4a44fe47420":[0,1,0,5,39], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a96edb3ade58fc8c569ac0c73a54fd091":[0,1,0,5,88], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a98255f56fe801ead43b5db6d47a5ee71":[0,1,0,5,41], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a9881596f3baf0d5f4fb57a5a4d3c5ff7":[0,1,0,5,74], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a9b04c504442be8eaffd17f52376b265a":[0,1,0,5,101], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a9ba4dfd6531cc6d70302de93d06a52e4":[0,1,0,5,107], "classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a9d5e1798a346c521650a976138b761b2":[0,1,0,5,21], "classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a9d7d44ba7e947d52387b0219ee0e69f9":[0,1,0,5,13], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a9f9d3aebd2dc5bbc05e0cb7e9a707c7f":[0,1,0,5,37], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#aa02a628bedfd1b7cbd65b32e8f2042e5":[0,1,0,5,57], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a9f9d3aebd2dc5bbc05e0cb7e9a707c7f":[0,1,0,5,36], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#aa02a628bedfd1b7cbd65b32e8f2042e5":[0,1,0,5,56], "classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#aa08a55bc62e18a9c545e8903dd3b1530":[0,1,0,5,31], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#aa29d902812736665c4efb78abee0814a":[0,1,0,5,112], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#aa7665c8b7c92f51b6fbccfa74b97a706":[0,1,0,5,61], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#aac802efa00966f667ff0554bc1e9af1d":[0,1,0,5,69], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#aaea5e3201bfb4a18f919f8e60db23d49":[0,1,0,5,107], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#aaf1649ae221f6ee5dd2bbc4d0e160b18":[0,1,0,5,121], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#aa29d902812736665c4efb78abee0814a":[0,1,0,5,111], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#aa7665c8b7c92f51b6fbccfa74b97a706":[0,1,0,5,60], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#aac802efa00966f667ff0554bc1e9af1d":[0,1,0,5,68], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#aaea5e3201bfb4a18f919f8e60db23d49":[0,1,0,5,106], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#aaf1649ae221f6ee5dd2bbc4d0e160b18":[0,1,0,5,120], "classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#ab30a8b2e8c4fb56f8e082a9735e3f093":[0,1,0,5,12], "classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#ab4825994a75303b29f77f0913275258c":[0,1,0,5,25], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#ab501ff577dc0c959112378c70a9bb125":[0,1,0,5,77], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#ab501ff577dc0c959112378c70a9bb125":[0,1,0,5,76], "classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#ab58b5680bc2f8e2e0fb8f693c5c1d8e4":[0,1,0,5,5], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#ab6d3ef0a7aaee1cbdb59070b6982f6f3":[0,1,0,5,70], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#ab6d3ef0a7aaee1cbdb59070b6982f6f3":[0,1,0,5,69], "classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#ab88a7d20486baa43e3e217b6deacead7":[0,1,0,5,1], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#aba63d80e4b1b15280a92ea120bc6160c":[0,1,0,5,101], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#abce8ff7e8bd0754c8d61066779b4e72f":[0,1,0,5,49], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#abd73fe57cf5edd770a7e775f130fc723":[0,1,0,5,74], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#ac5eaa12b912040d6564bd2d1908a44e0":[0,1,0,5,66], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#acaa8d4797838b7efc6b4d6d031c2a231":[0,1,0,5,55], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#acaac1c205538693499bc4a62f7d3ab17":[0,1,0,5,111], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#acc60913cbeb34f75a125224f6a3a79bd":[0,1,0,5,99], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#aba63d80e4b1b15280a92ea120bc6160c":[0,1,0,5,100], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#abce8ff7e8bd0754c8d61066779b4e72f":[0,1,0,5,48], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#abd73fe57cf5edd770a7e775f130fc723":[0,1,0,5,73], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#ac5eaa12b912040d6564bd2d1908a44e0":[0,1,0,5,65], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#acaa8d4797838b7efc6b4d6d031c2a231":[0,1,0,5,54], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#acaac1c205538693499bc4a62f7d3ab17":[0,1,0,5,110], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#acc60913cbeb34f75a125224f6a3a79bd":[0,1,0,5,98], "classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#ace966e9c828bcdc9053886ba274883d6":[0,1,0,5,0], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#acedc1d1337a478648f220e455e89b57f":[0,1,0,5,85], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#acfc295514bbbad19e24432655c8eb3e8":[0,1,0,5,45], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#acedc1d1337a478648f220e455e89b57f":[0,1,0,5,84], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#acfc295514bbbad19e24432655c8eb3e8":[0,1,0,5,44], "classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#acfd3c1256b1d34de5fef97cff079cb8a":[0,1,0,5,10], "classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#ad2fd467cd42a02e358169e3ada7301d8":[0,1,0,5,16], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#ad4ac4cce1ce357ab264dde505128f5e5":[0,1,0,5,98], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#ad4ac4cce1ce357ab264dde505128f5e5":[0,1,0,5,97], "classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#ad5b66ea20129a4cf098f744a8d449893":[0,1,0,5,19], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#ad5b735ac38ebd0076e796d64ad4051a2":[0,1,0,5,79], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#ad62d2137b6b826555013a1443138408f":[0,1,0,5,119], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#ada860e95fef9e15fdeddad307ace4eca":[0,1,0,5,109], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#adbf8216b0f67ec9e714bee6aa52e1e3f":[0,1,0,5,84], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#ad5b735ac38ebd0076e796d64ad4051a2":[0,1,0,5,78], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#ad62d2137b6b826555013a1443138408f":[0,1,0,5,118], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#ada860e95fef9e15fdeddad307ace4eca":[0,1,0,5,108], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#adbf8216b0f67ec9e714bee6aa52e1e3f":[0,1,0,5,83], "classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#adcef8fd2dd003856988a6e592b6421ed":[0,1,0,5,8], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#adf3ecfb21886bca7be8a882e2166a919":[0,1,0,5,78], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#ae03bd2171756e341a6781b83ced6c925":[0,1,0,5,64], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#adf3ecfb21886bca7be8a882e2166a919":[0,1,0,5,77], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#ae03bd2171756e341a6781b83ced6c925":[0,1,0,5,63], "classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#ae1cdaf5cdc1a33ab20f247fb90ca662b":[0,1,0,5,22], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#ae27ed2c381936341cca0b55e3475c386":[0,1,0,5,59], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#ae27ed2c381936341cca0b55e3475c386":[0,1,0,5,58], "classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#ae3101bee2798c98c0b2235b6921c3900":[0,1,0,5,18], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#ae83017cf6a18476687b1bf2d0957f4ed":[0,1,0,5,39], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#ae8c6eae53160557133e32fb9cef1f153":[0,1,0,5,92], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#ae9eec881c2eeb87df7bdad440da4fbaf":[0,1,0,5,65], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#ae83017cf6a18476687b1bf2d0957f4ed":[0,1,0,5,38], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#ae8c6eae53160557133e32fb9cef1f153":[0,1,0,5,91], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#ae9eec881c2eeb87df7bdad440da4fbaf":[0,1,0,5,64], "classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#aea611e83959c5e3f6faa50d47ee69c0f":[0,1,0,5,2], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#aeaa2a93a5ca61466470c27d5333bbbe4":[0,1,0,5,82], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#aeb0635e7e6e488519882d930401b5c2b":[0,1,0,5,46], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#aed16dda3020b148acc1e8574c80bb5bc":[0,1,0,5,110], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#aeaa2a93a5ca61466470c27d5333bbbe4":[0,1,0,5,81], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#aeb0635e7e6e488519882d930401b5c2b":[0,1,0,5,45], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#aed16dda3020b148acc1e8574c80bb5bc":[0,1,0,5,109], "classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#aee579fd91abcded93b1728f2c0f2ff43":[0,1,0,5,23], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#af121865db64ec89edc1fad516bdf2939":[0,1,0,5,54], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#af2f331ce244ac6fa94bbc94de9163fba":[0,1,0,5,80], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#af121865db64ec89edc1fad516bdf2939":[0,1,0,5,53], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#af2f331ce244ac6fa94bbc94de9163fba":[0,1,0,5,79], "classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#af6676bc4b255a87e484bc2641d64b713":[0,1,0,5,30], "classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#af66d9e0ce20ea0c75375aa354f9446bc":[0,1,0,5,20], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#af6a5224b66dde062241120381b3cb8df":[0,1,0,5,52], -"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#af9a3ae5dbbac61a409a7693cf2fb497c":[0,1,0,5,43], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#af6a5224b66dde062241120381b3cb8df":[0,1,0,5,51], +"classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#af9a3ae5dbbac61a409a7693cf2fb497c":[0,1,0,5,42], "classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#afb9bb4944afddadd2b154bf48a65cffe":[0,1,0,5,17], "classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#afdd6466ebac569ec670c3b6f4ca11d3e":[0,1,0,5,33], "classnmodl_1_1codegen_1_1_longitudinal_diffusion_info.html":[0,1,1,6], @@ -249,5 +247,7 @@ var NAVTREEINDEX17 = "classnmodl_1_1parser_1_1diffeq_1_1_diff_eq_context.html#ab8b24b7a7cc1c4775723b7c4f67dc650":[2,0,0,3,0,0,3], "classnmodl_1_1parser_1_1diffeq_1_1_diff_eq_context.html#ad3bb5bd06ff94e697110d7305c153bc9":[2,0,0,3,0,0,4], "classnmodl_1_1parser_1_1diffeq_1_1_diff_eq_context.html#ae54e71ef0da95411bf97f69e456da2d7":[2,0,0,3,0,0,2], -"classnmodl_1_1printer_1_1_code_printer.html":[0,3,0] +"classnmodl_1_1printer_1_1_code_printer.html":[0,3,0], +"classnmodl_1_1printer_1_1_code_printer.html#a072c94bdf396471dc878e9b648c941b9":[0,3,0,10], +"classnmodl_1_1printer_1_1_code_printer.html#a08a2646348b14fe8376f1873a0d2bca9":[0,3,0,9] }; diff --git a/doxygen/navtreeindex18.js b/doxygen/navtreeindex18.js index 09a1cb54d..4141fd6f4 100644 --- a/doxygen/navtreeindex18.js +++ b/doxygen/navtreeindex18.js @@ -1,7 +1,5 @@ var NAVTREEINDEX18 = { -"classnmodl_1_1printer_1_1_code_printer.html#a072c94bdf396471dc878e9b648c941b9":[0,3,0,10], -"classnmodl_1_1printer_1_1_code_printer.html#a08a2646348b14fe8376f1873a0d2bca9":[0,3,0,9], "classnmodl_1_1printer_1_1_code_printer.html#a0d6960442321cbd19c3e8cead6453508":[0,3,0,3], "classnmodl_1_1printer_1_1_code_printer.html#a0e3098616004bd7316e6f51e1fbe9752":[0,3,0,17], "classnmodl_1_1printer_1_1_code_printer.html#a0fbad892f46d1f3438012a522e00cd21":[0,3,0,22], @@ -249,5 +247,7 @@ var NAVTREEINDEX18 = "classnmodl_1_1utils_1_1_blame.html#ac626468a092bb0a06dabb99dab124c1a":[2,0,0,9,0,4], "classnmodl_1_1utils_1_1_no_blame.html":[2,0,0,9,1], "classnmodl_1_1utils_1_1_no_blame.html#a77c6edc8947ca1cf53ba4bd57cd9b3d4":[2,0,0,9,1,0], -"classnmodl_1_1utils_1_1_no_blame.html#ae7331dd0c1063fea2d7ce15372018398":[2,0,0,9,1,1] +"classnmodl_1_1utils_1_1_no_blame.html#ae7331dd0c1063fea2d7ce15372018398":[2,0,0,9,1,1], +"classnmodl_1_1utils_1_1_singleton_random_string.html":[0,7,0], +"classnmodl_1_1utils_1_1_singleton_random_string.html#a424fe2374fe1b396075fb389e3c156ce":[0,7,0,7] }; diff --git a/doxygen/navtreeindex19.js b/doxygen/navtreeindex19.js index d6abd867d..fee46fb88 100644 --- a/doxygen/navtreeindex19.js +++ b/doxygen/navtreeindex19.js @@ -1,7 +1,5 @@ var NAVTREEINDEX19 = { -"classnmodl_1_1utils_1_1_singleton_random_string.html":[0,7,0], -"classnmodl_1_1utils_1_1_singleton_random_string.html#a424fe2374fe1b396075fb389e3c156ce":[0,7,0,7], "classnmodl_1_1utils_1_1_singleton_random_string.html#a8636f8bfba5add1a513d1ce337986a6f":[0,7,0,1], "classnmodl_1_1utils_1_1_singleton_random_string.html#a9cf52e0f2bbcc64343ca012621c89698":[0,7,0,6], "classnmodl_1_1utils_1_1_singleton_random_string.html#aa10cbee41a847a009bcfbb2055744aad":[0,7,0,4], @@ -249,5 +247,7 @@ var NAVTREEINDEX19 = "classnmodl_1_1visitor_1_1_const_ast_visitor.html#ae11ee3e154c482bf684ddf1b25b87757":[2,0,0,10,4,4], "classnmodl_1_1visitor_1_1_const_ast_visitor.html#ae439ab60871ff25f66ec54c6f8c9451e":[2,0,0,10,4,5], "classnmodl_1_1visitor_1_1_const_ast_visitor.html#ae621a5a12af605a2f7d71a2fef363a03":[2,0,0,10,4,76], -"classnmodl_1_1visitor_1_1_const_ast_visitor.html#ae6c4e147d80942a87a8b84df22feed6a":[2,0,0,10,4,36] +"classnmodl_1_1visitor_1_1_const_ast_visitor.html#ae6c4e147d80942a87a8b84df22feed6a":[2,0,0,10,4,36], +"classnmodl_1_1visitor_1_1_const_ast_visitor.html#aea62f733b34b537b7b1e5761dd5dbd2e":[2,0,0,10,4,65], +"classnmodl_1_1visitor_1_1_const_ast_visitor.html#aece9c7c1f7c67c024e7c30f12ce0c768":[2,0,0,10,4,10] }; diff --git a/doxygen/navtreeindex20.js b/doxygen/navtreeindex20.js index 7f5a29997..390bbf65d 100644 --- a/doxygen/navtreeindex20.js +++ b/doxygen/navtreeindex20.js @@ -1,7 +1,5 @@ var NAVTREEINDEX20 = { -"classnmodl_1_1visitor_1_1_const_ast_visitor.html#aea62f733b34b537b7b1e5761dd5dbd2e":[2,0,0,10,4,65], -"classnmodl_1_1visitor_1_1_const_ast_visitor.html#aece9c7c1f7c67c024e7c30f12ce0c768":[2,0,0,10,4,10], "classnmodl_1_1visitor_1_1_const_ast_visitor.html#aed32e0d996ccf43cb8e936698810922b":[2,0,0,10,4,8], "classnmodl_1_1visitor_1_1_const_ast_visitor.html#aee881c4d2fcf52c0c22be12a641810f7":[2,0,0,10,4,70], "classnmodl_1_1visitor_1_1_const_ast_visitor.html#af1a8041a81ff4b870bd80c349ada294c":[2,0,0,10,4,18], @@ -249,5 +247,7 @@ var NAVTREEINDEX20 = "classnmodl_1_1visitor_1_1_inline_visitor.html#a9883e6dd815cc907140562f2bb574e5b":[0,8,0,8,17], "classnmodl_1_1visitor_1_1_inline_visitor.html#abc282598b1ffcf4b9581f64143476fa5":[0,8,0,8,18], "classnmodl_1_1visitor_1_1_inline_visitor.html#ac277f2dbeb82075f8f7abaf1cdd227fe":[0,8,0,8,8], -"classnmodl_1_1visitor_1_1_inline_visitor.html#ad5221292ed92a4624f93db350cba06d9":[0,8,0,8,6] +"classnmodl_1_1visitor_1_1_inline_visitor.html#ad5221292ed92a4624f93db350cba06d9":[0,8,0,8,6], +"classnmodl_1_1visitor_1_1_inline_visitor.html#ad8364b22d75e2c80ae6f81da015ad9de":[0,8,0,8,10], +"classnmodl_1_1visitor_1_1_inline_visitor.html#aec884c3dd17991a7fb6a4ae7e2d19eb4":[0,8,0,8,3] }; diff --git a/doxygen/navtreeindex21.js b/doxygen/navtreeindex21.js index df823fe4f..265e22c44 100644 --- a/doxygen/navtreeindex21.js +++ b/doxygen/navtreeindex21.js @@ -1,7 +1,5 @@ var NAVTREEINDEX21 = { -"classnmodl_1_1visitor_1_1_inline_visitor.html#ad8364b22d75e2c80ae6f81da015ad9de":[0,8,0,8,10], -"classnmodl_1_1visitor_1_1_inline_visitor.html#aec884c3dd17991a7fb6a4ae7e2d19eb4":[0,8,0,8,3], "classnmodl_1_1visitor_1_1_inline_visitor.html#af3a3ff4e27c999ca83715ded49a37229":[0,8,0,8,9], "classnmodl_1_1visitor_1_1_inline_visitor.html#afddeeb1fc4133c5893c91a3dd5ac85e8":[0,8,0,8,4], "classnmodl_1_1visitor_1_1_j_s_o_n_visitor.html":[0,8,0,28], @@ -249,5 +247,7 @@ var NAVTREEINDEX21 = "classnmodl_1_1visitor_1_1_meta_ast_lookup_visitor.html#a2137eab4e4fcbce592e43dac054e00c9":[0,8,0,29,84], "classnmodl_1_1visitor_1_1_meta_ast_lookup_visitor.html#a2365bb5125090a551193167b5b75a3fb":[0,8,0,29,67], "classnmodl_1_1visitor_1_1_meta_ast_lookup_visitor.html#a24c183f78bb123d831712725847f5237":[0,8,0,29,74], -"classnmodl_1_1visitor_1_1_meta_ast_lookup_visitor.html#a2870ad9b2a8d13903e81b4ecded10848":[0,8,0,29,87] +"classnmodl_1_1visitor_1_1_meta_ast_lookup_visitor.html#a2870ad9b2a8d13903e81b4ecded10848":[0,8,0,29,87], +"classnmodl_1_1visitor_1_1_meta_ast_lookup_visitor.html#a2b780cb504f51c876c523689a04e8fe8":[0,8,0,29,3], +"classnmodl_1_1visitor_1_1_meta_ast_lookup_visitor.html#a2f5fe6fb77c551e69ce82b290fc3a93d":[0,8,0,29,114] }; diff --git a/doxygen/navtreeindex22.js b/doxygen/navtreeindex22.js index ca6b65615..87f457ec2 100644 --- a/doxygen/navtreeindex22.js +++ b/doxygen/navtreeindex22.js @@ -1,7 +1,5 @@ var NAVTREEINDEX22 = { -"classnmodl_1_1visitor_1_1_meta_ast_lookup_visitor.html#a2b780cb504f51c876c523689a04e8fe8":[0,8,0,29,3], -"classnmodl_1_1visitor_1_1_meta_ast_lookup_visitor.html#a2f5fe6fb77c551e69ce82b290fc3a93d":[0,8,0,29,114], "classnmodl_1_1visitor_1_1_meta_ast_lookup_visitor.html#a32d7496908b1535aa94324f3fcd3d593":[0,8,0,29,107], "classnmodl_1_1visitor_1_1_meta_ast_lookup_visitor.html#a33179e5e2569eea246e9191f17c5d2d5":[0,8,0,29,70], "classnmodl_1_1visitor_1_1_meta_ast_lookup_visitor.html#a35048a89b070915f481f4f8d950255b3":[0,8,0,29,76], @@ -249,5 +247,7 @@ var NAVTREEINDEX22 = "classnmodl_1_1visitor_1_1_nmodl_print_visitor.html#ae416fa14bfbbc730e3fdc503a5cfe48d":[0,8,0,30,108], "classnmodl_1_1visitor_1_1_nmodl_print_visitor.html#ae4476aea91992898403e9363071b483a":[0,8,0,30,74], "classnmodl_1_1visitor_1_1_nmodl_print_visitor.html#ae44dfe3c414bbf79ace2f7f739d1e7ec":[0,8,0,30,7], -"classnmodl_1_1visitor_1_1_nmodl_print_visitor.html#ae647f43196b57fc3d2da7a0f8d6f1f7e":[0,8,0,30,4] +"classnmodl_1_1visitor_1_1_nmodl_print_visitor.html#ae647f43196b57fc3d2da7a0f8d6f1f7e":[0,8,0,30,4], +"classnmodl_1_1visitor_1_1_nmodl_print_visitor.html#aea8da2c2b8209e79dccf2c31b2a39673":[0,8,0,30,73], +"classnmodl_1_1visitor_1_1_nmodl_print_visitor.html#aec3231cca826cbe2167091e36578493e":[0,8,0,30,59] }; diff --git a/doxygen/navtreeindex23.js b/doxygen/navtreeindex23.js index a61eadd86..231a3162e 100644 --- a/doxygen/navtreeindex23.js +++ b/doxygen/navtreeindex23.js @@ -1,7 +1,5 @@ var NAVTREEINDEX23 = { -"classnmodl_1_1visitor_1_1_nmodl_print_visitor.html#aea8da2c2b8209e79dccf2c31b2a39673":[0,8,0,30,73], -"classnmodl_1_1visitor_1_1_nmodl_print_visitor.html#aec3231cca826cbe2167091e36578493e":[0,8,0,30,59], "classnmodl_1_1visitor_1_1_nmodl_print_visitor.html#aed40e6b59c06924a3fd8a95a9f25c640":[0,8,0,30,107], "classnmodl_1_1visitor_1_1_nmodl_print_visitor.html#aed98101f3280fe85fb28603d275a81d1":[0,8,0,30,64], "classnmodl_1_1visitor_1_1_nmodl_print_visitor.html#aee3b783439677539ca37e9683ded5c1f":[0,8,0,30,40], @@ -249,5 +247,7 @@ var NAVTREEINDEX23 = "classnmodl_1_1visitor_1_1_sympy_solver_visitor.html#af1262aa3d113bc2d58a384fc8fc4aa78":[0,8,0,22,0], "classnmodl_1_1visitor_1_1_sympy_solver_visitor.html#af36bc49a42bc14cf7f4c5ea6ce5af33f":[0,8,0,22,3], "classnmodl_1_1visitor_1_1_sympy_solver_visitor.html#af6a440e7f11d254282a40a6d0b06d4d3":[0,8,0,22,25], -"classnmodl_1_1visitor_1_1_symtab_visitor.html":[0,8,0,31] +"classnmodl_1_1visitor_1_1_symtab_visitor.html":[0,8,0,31], +"classnmodl_1_1visitor_1_1_symtab_visitor.html#a0309f454717bfd5481e7cf848ac072d9":[0,8,0,31,15], +"classnmodl_1_1visitor_1_1_symtab_visitor.html#a0404c1247e787a03c8bec68f6419ab22":[0,8,0,31,43] }; diff --git a/doxygen/navtreeindex24.js b/doxygen/navtreeindex24.js index cbc844d94..531914b8e 100644 --- a/doxygen/navtreeindex24.js +++ b/doxygen/navtreeindex24.js @@ -1,7 +1,5 @@ var NAVTREEINDEX24 = { -"classnmodl_1_1visitor_1_1_symtab_visitor.html#a0309f454717bfd5481e7cf848ac072d9":[0,8,0,31,15], -"classnmodl_1_1visitor_1_1_symtab_visitor.html#a0404c1247e787a03c8bec68f6419ab22":[0,8,0,31,43], "classnmodl_1_1visitor_1_1_symtab_visitor.html#a072518e9ec13c2743cabc1b9e8db876e":[0,8,0,31,39], "classnmodl_1_1visitor_1_1_symtab_visitor.html#a0dbebec67c1ea6ed2a9f0bbecfdf51b8":[0,8,0,31,42], "classnmodl_1_1visitor_1_1_symtab_visitor.html#a11535840b7c80307f912854c3d190a2c":[0,8,0,31,55], @@ -249,5 +247,7 @@ var NAVTREEINDEX24 = "classnmodl_1_1visitor_1_1test_1_1_check_parent_visitor.html#a2bd8fe72f964e842c912934f1e4618e3":[0,8,0,34,96], "classnmodl_1_1visitor_1_1test_1_1_check_parent_visitor.html#a2cb4a89edad314876a550d4fc88a8a82":[0,8,0,34,100], "classnmodl_1_1visitor_1_1test_1_1_check_parent_visitor.html#a2f10e4c9e5ec08f671d17ec923cffe9b":[0,8,0,34,4], -"classnmodl_1_1visitor_1_1test_1_1_check_parent_visitor.html#a3236a7bac97f1e1cfcfb09c36a8cfe0a":[0,8,0,34,13] +"classnmodl_1_1visitor_1_1test_1_1_check_parent_visitor.html#a3236a7bac97f1e1cfcfb09c36a8cfe0a":[0,8,0,34,13], +"classnmodl_1_1visitor_1_1test_1_1_check_parent_visitor.html#a3335d25a1c678904e2a57105eaaaeb2b":[0,8,0,34,114], +"classnmodl_1_1visitor_1_1test_1_1_check_parent_visitor.html#a38bc60900f23f4fd570fcb18125d75a9":[0,8,0,34,61] }; diff --git a/doxygen/navtreeindex25.js b/doxygen/navtreeindex25.js index 1cfcfdf76..40b903f52 100644 --- a/doxygen/navtreeindex25.js +++ b/doxygen/navtreeindex25.js @@ -1,7 +1,5 @@ var NAVTREEINDEX25 = { -"classnmodl_1_1visitor_1_1test_1_1_check_parent_visitor.html#a3335d25a1c678904e2a57105eaaaeb2b":[0,8,0,34,114], -"classnmodl_1_1visitor_1_1test_1_1_check_parent_visitor.html#a38bc60900f23f4fd570fcb18125d75a9":[0,8,0,34,61], "classnmodl_1_1visitor_1_1test_1_1_check_parent_visitor.html#a392fa77ff451c512dbfe1af268de5c31":[0,8,0,34,108], "classnmodl_1_1visitor_1_1test_1_1_check_parent_visitor.html#a3bb3bbdaec11bd3342bf281bf7527043":[0,8,0,34,78], "classnmodl_1_1visitor_1_1test_1_1_check_parent_visitor.html#a3d8737c9555ece78b426d4e32910ca74":[0,8,0,34,71], @@ -249,5 +247,7 @@ var NAVTREEINDEX25 = "codegen__neuron__cpp__visitor_8hpp.html":[3,0,1,1,14], "codegen__neuron__cpp__visitor_8hpp.html#ae9d20aa89d0b81ed34e45cf0dc8e99ca":[3,0,1,1,14,0], "codegen__neuron__cpp__visitor_8hpp.html#ae9d20aa89d0b81ed34e45cf0dc8e99caa3b78e2828fff7425b896b992aab3f54b":[3,0,1,1,14,0,0], -"codegen__neuron__cpp__visitor_8hpp.html#ae9d20aa89d0b81ed34e45cf0dc8e99caa5bd2a19c59dc05515841897bafe4bd55":[3,0,1,1,14,0,1] +"codegen__neuron__cpp__visitor_8hpp.html#ae9d20aa89d0b81ed34e45cf0dc8e99caa5bd2a19c59dc05515841897bafe4bd55":[3,0,1,1,14,0,1], +"codegen__neuron__cpp__visitor_8hpp.html#ga9dc150643b36d2a9087f4ab7c94325c7":[3,0,1,1,14,1], +"codegen__neuron__cpp__visitor_8hpp_source.html":[3,0,1,1,14] }; diff --git a/doxygen/navtreeindex26.js b/doxygen/navtreeindex26.js index 6e5278be4..50d90685a 100644 --- a/doxygen/navtreeindex26.js +++ b/doxygen/navtreeindex26.js @@ -1,7 +1,5 @@ var NAVTREEINDEX26 = { -"codegen__neuron__cpp__visitor_8hpp.html#ga9dc150643b36d2a9087f4ab7c94325c7":[3,0,1,1,14,1], -"codegen__neuron__cpp__visitor_8hpp_source.html":[3,0,1,1,14], "codegen__transform__visitor_8cpp.html":[3,0,1,1,15], "codegen__transform__visitor_8cpp_source.html":[3,0,1,1,15], "codegen__transform__visitor_8hpp.html":[3,0,1,1,16], @@ -249,5 +247,7 @@ var NAVTREEINDEX26 = "functions_b.html":[2,3,0,1], "functions_c.html":[2,3,0,2], "functions_d.html":[2,3,0,3], -"functions_e.html":[2,3,0,4] +"functions_e.html":[2,3,0,4], +"functions_enum.html":[2,3,4], +"functions_f.html":[2,3,0,5] }; diff --git a/doxygen/navtreeindex27.js b/doxygen/navtreeindex27.js index affe1ccc1..943069a45 100644 --- a/doxygen/navtreeindex27.js +++ b/doxygen/navtreeindex27.js @@ -1,7 +1,5 @@ var NAVTREEINDEX27 = { -"functions_enum.html":[2,3,4], -"functions_f.html":[2,3,0,5], "functions_func.html":[2,3,1,0], "functions_func.html":[2,3,1], "functions_func_b.html":[2,3,1,1], @@ -79,8 +77,8 @@ var NAVTREEINDEX27 = "global__var__visitor_8cpp_source.html":[3,0,1,11,10], "global__var__visitor_8hpp.html":[3,0,1,11,11], "global__var__visitor_8hpp_source.html":[3,0,1,11,11], -"globals.html":[3,1,0], "globals.html":[3,1,0,0], +"globals.html":[3,1,0], "globals_b.html":[3,1,0,1], "globals_c.html":[3,1,0,2], "globals_d.html":[3,1,0,3], @@ -119,22 +117,22 @@ var NAVTREEINDEX27 = "group__ast__class.html#ga08b034b62cbcf576e59664949dd07b0a":[0,0,1,4,49], "group__ast__class.html#ga095f0dc46ba2b1463daf409e116b2cea":[0,0,1,180], "group__ast__class.html#ga095f0dc46ba2b1463daf409e116b2cea":[0,0,1,4,56], -"group__ast__class.html#ga0d48ad506faa8de6dca6d5182c7d7352":[0,0,1,4,122], "group__ast__class.html#ga0d48ad506faa8de6dca6d5182c7d7352":[0,0,1,246], +"group__ast__class.html#ga0d48ad506faa8de6dca6d5182c7d7352":[0,0,1,4,122], "group__ast__class.html#ga0e489400312bdda6525ce3b9c1a15278":[0,0,1,4,5], "group__ast__class.html#ga0e489400312bdda6525ce3b9c1a15278":[0,0,1,129], -"group__ast__class.html#ga0eb03b97fd845ed86649d29e0952f571":[0,0,1,4,92], "group__ast__class.html#ga0eb03b97fd845ed86649d29e0952f571":[0,0,1,216], -"group__ast__class.html#ga0f2057e5ee6d098bea109648bcc226bd":[0,0,1,254], +"group__ast__class.html#ga0eb03b97fd845ed86649d29e0952f571":[0,0,1,4,92], "group__ast__class.html#ga0f2057e5ee6d098bea109648bcc226bd":[0,0,1,4,130], -"group__ast__class.html#ga11d5227fc22968f004fcaf055b2e7cb0":[0,0,1,4,95], +"group__ast__class.html#ga0f2057e5ee6d098bea109648bcc226bd":[0,0,1,254], "group__ast__class.html#ga11d5227fc22968f004fcaf055b2e7cb0":[0,0,1,219], +"group__ast__class.html#ga11d5227fc22968f004fcaf055b2e7cb0":[0,0,1,4,95], "group__ast__class.html#ga1477ce725c7f464ed677f67b4242e674":[0,0,1,4,99], "group__ast__class.html#ga1477ce725c7f464ed677f67b4242e674":[0,0,1,223], "group__ast__class.html#ga15183feacb4e7aa62fbe7e1371b33620":[0,0,1,4,76], "group__ast__class.html#ga15183feacb4e7aa62fbe7e1371b33620":[0,0,1,200], -"group__ast__class.html#ga153cbb003a93974756d7842f01679902":[0,0,1,4,11], "group__ast__class.html#ga153cbb003a93974756d7842f01679902":[0,0,1,135], +"group__ast__class.html#ga153cbb003a93974756d7842f01679902":[0,0,1,4,11], "group__ast__class.html#ga171f5d1d942dd88351be072191077e47":[0,0,1,4,108], "group__ast__class.html#ga171f5d1d942dd88351be072191077e47":[0,0,1,232], "group__ast__class.html#ga1769502899ac4dcbfe36a7f340edcd02":[0,0,1,4,131], @@ -143,8 +141,8 @@ var NAVTREEINDEX27 = "group__ast__class.html#ga17c42e3c60a25fe417647c5937b682c9":[0,0,1,139], "group__ast__class.html#ga1a3804b66c6c3c0e23fe0b08c9ce229e":[0,0,1,4,134], "group__ast__class.html#ga1a3804b66c6c3c0e23fe0b08c9ce229e":[0,0,1,258], -"group__ast__class.html#ga1a627463ee876f902fb2baa0775ec966":[0,0,1,156], "group__ast__class.html#ga1a627463ee876f902fb2baa0775ec966":[0,0,1,4,32], +"group__ast__class.html#ga1a627463ee876f902fb2baa0775ec966":[0,0,1,156], "group__ast__class.html#ga1b5521cd31ec4d26c0ec8a039bf7a9c9":[0,0,1,159], "group__ast__class.html#ga1b5521cd31ec4d26c0ec8a039bf7a9c9":[0,0,1,4,35], "group__ast__class.html#ga1f324c705485dbbeffcee8401aa1d097":[0,0,1,239], @@ -155,26 +153,26 @@ var NAVTREEINDEX27 = "group__ast__class.html#ga259f83364b843c691a85687f247244e7":[0,0,1,189], "group__ast__class.html#ga26205d58d3a56e11a1af97124b07a68e":[0,0,1,4,84], "group__ast__class.html#ga26205d58d3a56e11a1af97124b07a68e":[0,0,1,208], -"group__ast__class.html#ga2a8ed6832a20d3b6e5b400b6cb772ca8":[0,0,1,4,111], "group__ast__class.html#ga2a8ed6832a20d3b6e5b400b6cb772ca8":[0,0,1,235], +"group__ast__class.html#ga2a8ed6832a20d3b6e5b400b6cb772ca8":[0,0,1,4,111], "group__ast__class.html#ga2a96d8e7cc4dd454135b86ffd4c456e7":[0,0,1,248], "group__ast__class.html#ga2a96d8e7cc4dd454135b86ffd4c456e7":[0,0,1,4,124], -"group__ast__class.html#ga2ab319dfd9eaa87327dfb00c2c006b5f":[0,0,1,221], "group__ast__class.html#ga2ab319dfd9eaa87327dfb00c2c006b5f":[0,0,1,4,97], +"group__ast__class.html#ga2ab319dfd9eaa87327dfb00c2c006b5f":[0,0,1,221], "group__ast__class.html#ga2d617bed8d16f6e386c7994fe14e1dcb":[0,0,1,178], "group__ast__class.html#ga2d617bed8d16f6e386c7994fe14e1dcb":[0,0,1,4,54], -"group__ast__class.html#ga2eec2446794afeca55a7dbc822fd99ba":[0,0,1,4,70], "group__ast__class.html#ga2eec2446794afeca55a7dbc822fd99ba":[0,0,1,194], +"group__ast__class.html#ga2eec2446794afeca55a7dbc822fd99ba":[0,0,1,4,70], "group__ast__class.html#ga397e386e52928e6043ca71df9d45cfe3":[0,0,1,4,52], "group__ast__class.html#ga397e386e52928e6043ca71df9d45cfe3":[0,0,1,176], "group__ast__class.html#ga3a1a88a6f2e3dbd4bb3acc39728f6eb0":[0,0,1,4,63], "group__ast__class.html#ga3a1a88a6f2e3dbd4bb3acc39728f6eb0":[0,0,1,187], "group__ast__class.html#ga3b6381327cb9e25b740e855660a7ff3a":[0,0,1,4,44], "group__ast__class.html#ga3b6381327cb9e25b740e855660a7ff3a":[0,0,1,168], -"group__ast__class.html#ga3e1362838ed4cc6d1ab04e6a9fc86bf2":[0,0,1,234], "group__ast__class.html#ga3e1362838ed4cc6d1ab04e6a9fc86bf2":[0,0,1,4,110], -"group__ast__class.html#ga3f92f72529d03053ab51c41b38a29897":[0,0,1,4,72], +"group__ast__class.html#ga3e1362838ed4cc6d1ab04e6a9fc86bf2":[0,0,1,234], "group__ast__class.html#ga3f92f72529d03053ab51c41b38a29897":[0,0,1,196], +"group__ast__class.html#ga3f92f72529d03053ab51c41b38a29897":[0,0,1,4,72], "group__ast__class.html#ga4303bc795f23f0909cd1ac655c098ed4":[0,0,1,4,19], "group__ast__class.html#ga4303bc795f23f0909cd1ac655c098ed4":[0,0,1,143], "group__ast__class.html#ga4892777c5b32b112d588b05d07f28549":[0,0,1,4,14], @@ -193,8 +191,8 @@ var NAVTREEINDEX27 = "group__ast__class.html#ga53d7bf2c18bac0edb78e1123e947988e":[0,0,1,226], "group__ast__class.html#ga55e9704837cf41c797642b1f7c102dfc":[0,0,1,4,0], "group__ast__class.html#ga55e9704837cf41c797642b1f7c102dfc":[0,0,1,127], -"group__ast__class.html#ga571f5c2475e8e6fbfd898f82e710960a":[0,0,1,4,40], "group__ast__class.html#ga571f5c2475e8e6fbfd898f82e710960a":[0,0,1,164], +"group__ast__class.html#ga571f5c2475e8e6fbfd898f82e710960a":[0,0,1,4,40], "group__ast__class.html#ga5b2f7b1f3e25a7d8f70d21368f7c4bcc":[0,0,1,4,7], "group__ast__class.html#ga5b2f7b1f3e25a7d8f70d21368f7c4bcc":[0,0,1,131], "group__ast__class.html#ga5bbb1d563621926d689f8480d243d909":[0,0,1,128], @@ -205,18 +203,18 @@ var NAVTREEINDEX27 = "group__ast__class.html#ga6105e91f1ce07693b9df1e0162d8f5a4":[0,0,1,260], "group__ast__class.html#ga630659747411ec7b03685256c92dab8f":[0,0,1,4,106], "group__ast__class.html#ga630659747411ec7b03685256c92dab8f":[0,0,1,230], -"group__ast__class.html#ga63717e8a77ff61eb334fd3389a3c354b":[0,0,1,4,109], "group__ast__class.html#ga63717e8a77ff61eb334fd3389a3c354b":[0,0,1,233], +"group__ast__class.html#ga63717e8a77ff61eb334fd3389a3c354b":[0,0,1,4,109], "group__ast__class.html#ga656b6af0e85f80cdaa43212b01108b42":[0,0,1,4,13], "group__ast__class.html#ga656b6af0e85f80cdaa43212b01108b42":[0,0,1,137], "group__ast__class.html#ga684e856f3a95a7ec25941fdf5ebf53e3":[0,0,1,4,12], "group__ast__class.html#ga684e856f3a95a7ec25941fdf5ebf53e3":[0,0,1,136], "group__ast__class.html#ga693ff03c7dd81449e7b42ee2efa51c17":[0,0,1,179], "group__ast__class.html#ga693ff03c7dd81449e7b42ee2efa51c17":[0,0,1,4,55], -"group__ast__class.html#ga6a8e5076ce68736223774b02972fdfa8":[0,0,1,152], "group__ast__class.html#ga6a8e5076ce68736223774b02972fdfa8":[0,0,1,4,28], -"group__ast__class.html#ga6b742ca0ae8a6ed172f258af20a33cf7":[0,0,1,4,94], +"group__ast__class.html#ga6a8e5076ce68736223774b02972fdfa8":[0,0,1,152], "group__ast__class.html#ga6b742ca0ae8a6ed172f258af20a33cf7":[0,0,1,218], +"group__ast__class.html#ga6b742ca0ae8a6ed172f258af20a33cf7":[0,0,1,4,94], "group__ast__class.html#ga6ca54bc2ec0698aa5a485be7c653781d":[0,0,1,4,143], "group__ast__class.html#ga6ca54bc2ec0698aa5a485be7c653781d":[0,0,1,267], "group__ast__class.html#ga6d8c02bfb7a35cf3ac7858e61f24bf00":[0,0,1,4,47], @@ -235,19 +233,21 @@ var NAVTREEINDEX27 = "group__ast__class.html#ga8805d1aa088c3daac32ec6f4313cf060":[0,0,1,4,119], "group__ast__class.html#ga894e17b916a5edfde8e6b624e9085ae1":[0,0,1,4,87], "group__ast__class.html#ga894e17b916a5edfde8e6b624e9085ae1":[0,0,1,211], -"group__ast__class.html#ga89dc3a73bef71b1d9dd6f379e4ca7801":[0,0,1,4,101], "group__ast__class.html#ga89dc3a73bef71b1d9dd6f379e4ca7801":[0,0,1,225], +"group__ast__class.html#ga89dc3a73bef71b1d9dd6f379e4ca7801":[0,0,1,4,101], "group__ast__class.html#ga8a32b8ca9796d4c6ff51fd651c1e410a":[0,0,1,241], "group__ast__class.html#ga8a32b8ca9796d4c6ff51fd651c1e410a":[0,0,1,4,117], "group__ast__class.html#ga8ae7b3772077532d180c376c149ca59b":[0,0,1,4,139], "group__ast__class.html#ga8ae7b3772077532d180c376c149ca59b":[0,0,1,263], "group__ast__class.html#ga8b7765bb1b32cac9e1d3cef796b747ac":[0,0,1,4,140], "group__ast__class.html#ga8b7765bb1b32cac9e1d3cef796b747ac":[0,0,1,264], -"group__ast__class.html#ga8e133edb6222fbee34e5f0d342797ee4":[0,0,1,4,9], "group__ast__class.html#ga8e133edb6222fbee34e5f0d342797ee4":[0,0,1,133], +"group__ast__class.html#ga8e133edb6222fbee34e5f0d342797ee4":[0,0,1,4,9], "group__ast__class.html#ga90a102823381b1f8e6047a1af748056e":[0,0,1,4,23], "group__ast__class.html#ga90a102823381b1f8e6047a1af748056e":[0,0,1,147], "group__ast__class.html#ga92a0562e9202ed00c90134bccbc09972":[0,0,1,217], "group__ast__class.html#ga92a0562e9202ed00c90134bccbc09972":[0,0,1,4,93], -"group__ast__class.html#ga9313a4af4b7e130f1ff85aa1e11882ab":[0,0,1,195] +"group__ast__class.html#ga9313a4af4b7e130f1ff85aa1e11882ab":[0,0,1,195], +"group__ast__class.html#ga9313a4af4b7e130f1ff85aa1e11882ab":[0,0,1,4,71], +"group__ast__class.html#ga933f5f45973d115b0a274d0ff628cb56":[0,0,1,4,43] }; diff --git a/doxygen/navtreeindex28.js b/doxygen/navtreeindex28.js index 8576535b1..333367046 100644 --- a/doxygen/navtreeindex28.js +++ b/doxygen/navtreeindex28.js @@ -1,12 +1,10 @@ var NAVTREEINDEX28 = { -"group__ast__class.html#ga9313a4af4b7e130f1ff85aa1e11882ab":[0,0,1,4,71], "group__ast__class.html#ga933f5f45973d115b0a274d0ff628cb56":[0,0,1,167], -"group__ast__class.html#ga933f5f45973d115b0a274d0ff628cb56":[0,0,1,4,43], "group__ast__class.html#ga948ddb22b25c884d62ab0df93dfe431a":[0,0,1,236], "group__ast__class.html#ga948ddb22b25c884d62ab0df93dfe431a":[0,0,1,4,112], -"group__ast__class.html#ga94bd299850978ac874ca75863f544d99":[0,0,1,4,82], "group__ast__class.html#ga94bd299850978ac874ca75863f544d99":[0,0,1,206], +"group__ast__class.html#ga94bd299850978ac874ca75863f544d99":[0,0,1,4,82], "group__ast__class.html#ga958228cd1a203da6fea17efac8165a59":[0,0,1,4,46], "group__ast__class.html#ga958228cd1a203da6fea17efac8165a59":[0,0,1,170], "group__ast__class.html#ga9a9684461a0f1ce3adb845a0715b1b9e":[0,0,1,4,8], @@ -15,14 +13,14 @@ var NAVTREEINDEX28 = "group__ast__class.html#ga9af56bff5b44e1074a94e9c357e255bf":[0,0,1,157], "group__ast__class.html#ga9ce603148a38735382611779880b0363":[0,0,1,4,38], "group__ast__class.html#ga9ce603148a38735382611779880b0363":[0,0,1,162], -"group__ast__class.html#ga9fb43fa1fe69f84fc0c86b82e2b7cd7b":[0,0,1,205], "group__ast__class.html#ga9fb43fa1fe69f84fc0c86b82e2b7cd7b":[0,0,1,4,81], +"group__ast__class.html#ga9fb43fa1fe69f84fc0c86b82e2b7cd7b":[0,0,1,205], "group__ast__class.html#gaa55f3ea9308348d5140290e34c4b06dd":[0,0,1,4,89], "group__ast__class.html#gaa55f3ea9308348d5140290e34c4b06dd":[0,0,1,213], "group__ast__class.html#gaa680ed2587655b4f6b771db6584b22cc":[0,0,1,4,75], "group__ast__class.html#gaa680ed2587655b4f6b771db6584b22cc":[0,0,1,199], -"group__ast__class.html#gaa7d7dc200bbee1fe9619323965a1715e":[0,0,1,4,67], "group__ast__class.html#gaa7d7dc200bbee1fe9619323965a1715e":[0,0,1,191], +"group__ast__class.html#gaa7d7dc200bbee1fe9619323965a1715e":[0,0,1,4,67], "group__ast__class.html#gaa7e0498bd12a174ddff55d9f4987c0b6":[0,0,1,4,98], "group__ast__class.html#gaa7e0498bd12a174ddff55d9f4987c0b6":[0,0,1,222], "group__ast__class.html#gaa892d22eb06997da03dc7a433f14ba1e":[0,0,1,4,127], @@ -41,10 +39,10 @@ var NAVTREEINDEX28 = "group__ast__class.html#gaafdc39f0529d0879f741f525181bb756":[0,0,1,4,26], "group__ast__class.html#gaafe0391f61c4d985226cf91abf6d0ea6":[0,0,1,186], "group__ast__class.html#gaafe0391f61c4d985226cf91abf6d0ea6":[0,0,1,4,62], -"group__ast__class.html#gab0ca0546b6c94aa502549453ff611811":[0,0,1,4,74], "group__ast__class.html#gab0ca0546b6c94aa502549453ff611811":[0,0,1,198], -"group__ast__class.html#gab2ab7390c9aa9a581525ec7b2a8ddb64":[0,0,1,4,90], +"group__ast__class.html#gab0ca0546b6c94aa502549453ff611811":[0,0,1,4,74], "group__ast__class.html#gab2ab7390c9aa9a581525ec7b2a8ddb64":[0,0,1,214], +"group__ast__class.html#gab2ab7390c9aa9a581525ec7b2a8ddb64":[0,0,1,4,90], "group__ast__class.html#gab2f01c121a37f709051e291fed2cc6e1":[0,0,1,190], "group__ast__class.html#gab2f01c121a37f709051e291fed2cc6e1":[0,0,1,4,66], "group__ast__class.html#gab35a10b4c8f5ca2515f0bb122853e447":[0,0,1,163], @@ -55,24 +53,24 @@ var NAVTREEINDEX28 = "group__ast__class.html#gab97c8fbc73008d36927a0377335bc0ba":[0,0,1,253], "group__ast__class.html#gaba93060c77072b4da627b13e7ab5fbd8":[0,0,1,158], "group__ast__class.html#gaba93060c77072b4da627b13e7ab5fbd8":[0,0,1,4,34], -"group__ast__class.html#gabcce17a4b7c2abd423cf2319dc492f24":[0,0,1,252], "group__ast__class.html#gabcce17a4b7c2abd423cf2319dc492f24":[0,0,1,4,128], +"group__ast__class.html#gabcce17a4b7c2abd423cf2319dc492f24":[0,0,1,252], "group__ast__class.html#gabdc81c1d11f50f067df4cf0d7746f110":[0,0,1,4,29], "group__ast__class.html#gabdc81c1d11f50f067df4cf0d7746f110":[0,0,1,153], -"group__ast__class.html#gabe0d8be79f0e0c0967da29d186c86c3c":[0,0,1,4,6], "group__ast__class.html#gabe0d8be79f0e0c0967da29d186c86c3c":[0,0,1,130], +"group__ast__class.html#gabe0d8be79f0e0c0967da29d186c86c3c":[0,0,1,4,6], "group__ast__class.html#gabf2f9f79aaa6163faccf95beec66c585":[0,0,1,4,88], "group__ast__class.html#gabf2f9f79aaa6163faccf95beec66c585":[0,0,1,212], "group__ast__class.html#gac02dd08abb8b9d2e817a1ae09297602b":[0,0,1,4,146], "group__ast__class.html#gac02dd08abb8b9d2e817a1ae09297602b":[0,0,1,271], -"group__ast__class.html#gac116c33a0a2c52eeb7b3f7121ee282fb":[0,0,1,151], "group__ast__class.html#gac116c33a0a2c52eeb7b3f7121ee282fb":[0,0,1,4,27], +"group__ast__class.html#gac116c33a0a2c52eeb7b3f7121ee282fb":[0,0,1,151], "group__ast__class.html#gac38a02afaac3a75f0c66f0d351bf9c04":[0,0,1,4,51], "group__ast__class.html#gac38a02afaac3a75f0c66f0d351bf9c04":[0,0,1,175], -"group__ast__class.html#gac58c77a74f980986b6588a285c12d408":[0,0,1,188], "group__ast__class.html#gac58c77a74f980986b6588a285c12d408":[0,0,1,4,64], -"group__ast__class.html#gac59852558ed3eaf48643738b5a00f1ad":[0,0,1,4,113], +"group__ast__class.html#gac58c77a74f980986b6588a285c12d408":[0,0,1,188], "group__ast__class.html#gac59852558ed3eaf48643738b5a00f1ad":[0,0,1,237], +"group__ast__class.html#gac59852558ed3eaf48643738b5a00f1ad":[0,0,1,4,113], "group__ast__class.html#gac6117017139fe43441831581205b087b":[0,0,1,4,2], "group__ast__class.html#gac6117017139fe43441831581205b087b":[0,0,1,125], "group__ast__class.html#gac774fd9ccb62cfdba927225ef59a4de3":[0,0,1,4,105], @@ -93,14 +91,14 @@ var NAVTREEINDEX28 = "group__ast__class.html#gacd652af0b9dd48cd7fee5e26aa19ed71":[0,0,1,166], "group__ast__class.html#gacf97186289f358ea51959f4285f870cb":[0,0,1,172], "group__ast__class.html#gacf97186289f358ea51959f4285f870cb":[0,0,1,4,48], -"group__ast__class.html#gad0fc98ce521337690e9715bbc8e52848":[0,0,1,4,80], "group__ast__class.html#gad0fc98ce521337690e9715bbc8e52848":[0,0,1,204], +"group__ast__class.html#gad0fc98ce521337690e9715bbc8e52848":[0,0,1,4,80], "group__ast__class.html#gad1f90104022d3c27fc1111d3d75a7057":[0,0,1,192], "group__ast__class.html#gad1f90104022d3c27fc1111d3d75a7057":[0,0,1,4,68], "group__ast__class.html#gad3aeaf59438aab6d10b5b6eca24ee7b2":[0,0,1,154], "group__ast__class.html#gad3aeaf59438aab6d10b5b6eca24ee7b2":[0,0,1,4,30], -"group__ast__class.html#gad7bcccf631ed5bf00705df5d1c0e5669":[0,0,1,4,73], "group__ast__class.html#gad7bcccf631ed5bf00705df5d1c0e5669":[0,0,1,197], +"group__ast__class.html#gad7bcccf631ed5bf00705df5d1c0e5669":[0,0,1,4,73], "group__ast__class.html#gad7e9018d9c607b42fcec41da33ef7ffc":[0,0,1,4,17], "group__ast__class.html#gad7e9018d9c607b42fcec41da33ef7ffc":[0,0,1,141], "group__ast__class.html#gad9186bccf4349f4dc1b42448422151a5":[0,0,1,4,1], @@ -113,8 +111,8 @@ var NAVTREEINDEX28 = "group__ast__class.html#gada2c56cc8f8f252d8ebed343eb863985":[0,0,1,4,142], "group__ast__class.html#gadaf9e897c21c83aa9fd6984a839aeaf1":[0,0,1,220], "group__ast__class.html#gadaf9e897c21c83aa9fd6984a839aeaf1":[0,0,1,4,96], -"group__ast__class.html#gade58bfc61f86b2713d50b523aee0c92f":[0,0,1,184], "group__ast__class.html#gade58bfc61f86b2713d50b523aee0c92f":[0,0,1,4,60], +"group__ast__class.html#gade58bfc61f86b2713d50b523aee0c92f":[0,0,1,184], "group__ast__class.html#gae0579e9d3a6f697fcd4ab022eba3ed6d":[0,0,1,4,103], "group__ast__class.html#gae0579e9d3a6f697fcd4ab022eba3ed6d":[0,0,1,227], "group__ast__class.html#gae12e18a06af2fd43a83356f1cd75b66d":[0,0,1,4,83], @@ -125,12 +123,12 @@ var NAVTREEINDEX28 = "group__ast__class.html#gae1ca73bd18179c2c3a1c3a2751043437":[0,0,1,256], "group__ast__class.html#gae2d80677a97c3b1ac8690d73c74be890":[0,0,1,182], "group__ast__class.html#gae2d80677a97c3b1ac8690d73c74be890":[0,0,1,4,58], -"group__ast__class.html#gae340624f70b3f7f3670f17f8de45d1fc":[0,0,1,4,45], "group__ast__class.html#gae340624f70b3f7f3670f17f8de45d1fc":[0,0,1,169], -"group__ast__class.html#gae3fb3e72b2a86631da0a81cbeb96a2e3":[0,0,1,4,126], +"group__ast__class.html#gae340624f70b3f7f3670f17f8de45d1fc":[0,0,1,4,45], "group__ast__class.html#gae3fb3e72b2a86631da0a81cbeb96a2e3":[0,0,1,250], -"group__ast__class.html#gae8ed322d9d79b71a4dd96252e8266a3f":[0,0,1,174], +"group__ast__class.html#gae3fb3e72b2a86631da0a81cbeb96a2e3":[0,0,1,4,126], "group__ast__class.html#gae8ed322d9d79b71a4dd96252e8266a3f":[0,0,1,4,50], +"group__ast__class.html#gae8ed322d9d79b71a4dd96252e8266a3f":[0,0,1,174], "group__ast__class.html#gaea4ef0d9fa16aa06d9167dd81f411913":[0,0,1,238], "group__ast__class.html#gaea4ef0d9fa16aa06d9167dd81f411913":[0,0,1,4,114], "group__ast__class.html#gaed858f15cec95707094262eff7f96003":[0,0,1,247], @@ -249,5 +247,7 @@ var NAVTREEINDEX28 = "group__ast__type.html#ggac392e49849e60c05e42ea02c7b445033a7bb7717b000689e19a9611bcf8541c62":[0,0,2,0,70], "group__ast__type.html#ggac392e49849e60c05e42ea02c7b445033a7f669fa1f9c86cf5c69c0b542529cb46":[0,0,2,0,65], "group__ast__type.html#ggac392e49849e60c05e42ea02c7b445033a7f85400a8b80c1115bab9ee41b1ddefa":[0,0,2,0,29], -"group__ast__type.html#ggac392e49849e60c05e42ea02c7b445033a7f9d9e625820277dc6afa63ca7e3e3fb":[0,0,2,0,38] +"group__ast__type.html#ggac392e49849e60c05e42ea02c7b445033a7f9d9e625820277dc6afa63ca7e3e3fb":[0,0,2,0,38], +"group__ast__type.html#ggac392e49849e60c05e42ea02c7b445033a826c8a2fe513ff58c32444a201b329c3":[0,0,2,0,118], +"group__ast__type.html#ggac392e49849e60c05e42ea02c7b445033a8dda46c0fff4137b6f660f56255d967e":[0,0,2,0,15] }; diff --git a/doxygen/navtreeindex29.js b/doxygen/navtreeindex29.js index ff7c13f76..64cfda907 100644 --- a/doxygen/navtreeindex29.js +++ b/doxygen/navtreeindex29.js @@ -1,7 +1,5 @@ var NAVTREEINDEX29 = { -"group__ast__type.html#ggac392e49849e60c05e42ea02c7b445033a826c8a2fe513ff58c32444a201b329c3":[0,0,2,0,118], -"group__ast__type.html#ggac392e49849e60c05e42ea02c7b445033a8dda46c0fff4137b6f660f56255d967e":[0,0,2,0,15], "group__ast__type.html#ggac392e49849e60c05e42ea02c7b445033a9143f3113407701188b8f7d6cc051124":[0,0,2,0,72], "group__ast__type.html#ggac392e49849e60c05e42ea02c7b445033a9217db46679b03baa861452afa1aa9e1":[0,0,2,0,28], "group__ast__type.html#ggac392e49849e60c05e42ea02c7b445033a92f2f2e6c7bce78a15719e1658063ed8":[0,0,2,0,42], @@ -187,9 +185,9 @@ var NAVTREEINDEX29 = "group__codegen.html":[0,1], "group__codegen__backends.html":[0,1,0], "group__codegen__backends.html#ga743bcd56c5822a14381fd87fe586ed6c":[0,1,0,8], -"group__codegen__backends.html#ga743bcd56c5822a14381fd87fe586ed6c":[0,1,0,3,131], +"group__codegen__backends.html#ga743bcd56c5822a14381fd87fe586ed6c":[0,1,0,3,130], "group__codegen__backends.html#ga9dc150643b36d2a9087f4ab7c94325c7":[0,1,0,6], -"group__codegen__backends.html#gadb57c0920613cf50915a12efe5e987c2":[0,1,0,3,83], +"group__codegen__backends.html#gadb57c0920613cf50915a12efe5e987c2":[0,1,0,3,82], "group__codegen__backends.html#gadb57c0920613cf50915a12efe5e987c2":[0,1,0,7], "group__codegen__details.html":[0,1,1], "group__codegen__details.html#ga207530f6d3d65c81d38a9d754d43f8b7":[0,1,1,14], @@ -247,7 +245,9 @@ var NAVTREEINDEX29 = "group__token__test.html#ga0da85adf566fc93b8d173fa4117ccb74":[3,0,2,0,3,0,3], "group__token__test.html#ga46008ea4532600b05a677394c6600055":[3,0,2,0,3,0,2], "group__token__test.html#ga46008ea4532600b05a677394c6600055":[0,2,1,2], -"group__token__test.html#ga752aa45201ab43cc2d13b3ce5a5f1144":[3,0,2,0,3,0,1], "group__token__test.html#ga752aa45201ab43cc2d13b3ce5a5f1144":[0,2,1,1], -"group__token__test.html#ga9cd6cc464d230725aacf2bf9d41d364e":[0,2,1,0] +"group__token__test.html#ga752aa45201ab43cc2d13b3ce5a5f1144":[3,0,2,0,3,0,1], +"group__token__test.html#ga9cd6cc464d230725aacf2bf9d41d364e":[0,2,1,0], +"group__token__test.html#ga9cd6cc464d230725aacf2bf9d41d364e":[3,0,2,0,3,0,0], +"group__units.html":[0,6] }; diff --git a/doxygen/navtreeindex30.js b/doxygen/navtreeindex30.js index 091e56773..46d9fa4a6 100644 --- a/doxygen/navtreeindex30.js +++ b/doxygen/navtreeindex30.js @@ -1,7 +1,5 @@ var NAVTREEINDEX30 = { -"group__token__test.html#ga9cd6cc464d230725aacf2bf9d41d364e":[3,0,2,0,3,0,0], -"group__units.html":[0,6], "group__units.html#ga08e9b606cb5ea92658765b82a886f2f8":[0,6,1,4], "group__units.html#ga08e9b606cb5ea92658765b82a886f2f8":[0,6,8], "group__units.html#ga141975968d2f0eef8cfc36d80e8962c8":[0,6,0,0], @@ -18,14 +16,14 @@ var NAVTREEINDEX30 = "group__units.html#ga4014c46fced93378dee7846b57211f6e":[0,6,18], "group__units.html#ga53666d277469c1f00a3b0fd26a094178":[0,6,1,5], "group__units.html#ga53666d277469c1f00a3b0fd26a094178":[0,6,9], -"group__units.html#ga5beb2f005efacceb06427827ef45bf15":[0,6,0,2], "group__units.html#ga5beb2f005efacceb06427827ef45bf15":[0,6,6], +"group__units.html#ga5beb2f005efacceb06427827ef45bf15":[0,6,0,2], "group__units.html#ga7ffa76ac1fa5595a4aa1f0f703b34717":[0,6,10], "group__units.html#ga7ffa76ac1fa5595a4aa1f0f703b34717":[0,6,1,6], -"group__units.html#gaaae2d7f1693c0e7abc23003e753d65ec":[0,6,11], "group__units.html#gaaae2d7f1693c0e7abc23003e753d65ec":[0,6,1,0], -"group__units.html#gaac93a10252a81387387be4571bbed890":[0,6,5], +"group__units.html#gaaae2d7f1693c0e7abc23003e753d65ec":[0,6,11], "group__units.html#gaac93a10252a81387387be4571bbed890":[0,6,1,2], +"group__units.html#gaac93a10252a81387387be4571bbed890":[0,6,5], "group__units.html#gabab997408892d209edc2e6207bcf6b3a":[0,6,0,1], "group__units.html#gabab997408892d209edc2e6207bcf6b3a":[0,6,14], "group__units.html#gac26c7781e0924f73bac6a856f2c80217":[0,6,17], @@ -33,8 +31,8 @@ var NAVTREEINDEX30 = "group__units.html#gacf73317c537bff91a6631c0c4f4cded0":[0,6,16], "group__units.html#gae0d4c7dbd75815ee53391809a8dac74d":[0,6,12], "group__units.html#gae0d4c7dbd75815ee53391809a8dac74d":[0,6,1,1], -"group__units.html#gae62d367c779588c163dcfe9cdd9efa37":[0,6,1,3], "group__units.html#gae62d367c779588c163dcfe9cdd9efa37":[0,6,7], +"group__units.html#gae62d367c779588c163dcfe9cdd9efa37":[0,6,1,3], "group__utils.html":[0,7], "group__utils.html#ga08a8b444018d46999224618bb102b3e5":[0,7,9], "group__utils.html#ga09e2cad122ecf35cb2d5fbfc4b1daa2e":[0,7,11], @@ -249,5 +247,7 @@ var NAVTREEINDEX30 = "modl_8h.html":[3,0,1,3,5], "modl_8h.html#a03f3d7e17b9331f1e64621b43b411fc4":[3,0,1,3,5,0], "modl_8h.html#a3fb5b8d5f980b6c3d91b14799de5e2fc":[3,0,1,3,5,2], -"modl_8h.html#aa9461dc2be3a692011544d7b6017b0f2":[3,0,1,3,5,1] +"modl_8h.html#aa9461dc2be3a692011544d7b6017b0f2":[3,0,1,3,5,1], +"modl_8h.html#af41b52becd124ffeffcafeddbdc1041c":[3,0,1,3,5,3], +"modl_8h_source.html":[3,0,1,3,5] }; diff --git a/doxygen/navtreeindex31.js b/doxygen/navtreeindex31.js index c57bb2cf1..e48f9fd92 100644 --- a/doxygen/navtreeindex31.js +++ b/doxygen/navtreeindex31.js @@ -1,7 +1,5 @@ var NAVTREEINDEX31 = { -"modl_8h.html#af41b52becd124ffeffcafeddbdc1041c":[3,0,1,3,5,3], -"modl_8h_source.html":[3,0,1,3,5], "modtoken_8hpp.html":[3,0,1,3,7], "modtoken_8hpp_source.html":[3,0,1,3,7], "modules.html":[0], @@ -39,12 +37,12 @@ var NAVTREEINDEX31 = "namespacemembers_v.html":[1,1,0,20], "namespacemembers_vars.html":[1,1,2], "namespacemembers_w.html":[1,1,0,21], -"namespacenmodl.html":[1,0,0], "namespacenmodl.html":[2,0,0], -"namespacenmodl_1_1ast.html":[1,0,0,0], +"namespacenmodl.html":[1,0,0], "namespacenmodl_1_1ast.html":[2,0,0,0], -"namespacenmodl_1_1codegen.html":[2,0,0,1], +"namespacenmodl_1_1ast.html":[1,0,0,0], "namespacenmodl_1_1codegen.html":[1,0,0,1], +"namespacenmodl_1_1codegen.html":[2,0,0,1], "namespacenmodl_1_1codegen_1_1naming.html":[1,0,0,1,0], "namespacenmodl_1_1codegen_1_1utils.html":[1,0,0,1,1], "namespacenmodl_1_1crout.html":[1,0,0,2], @@ -54,20 +52,20 @@ var NAVTREEINDEX31 = "namespacenmodl_1_1newton.html":[1,0,0,5], "namespacenmodl_1_1parser.html":[2,0,0,3], "namespacenmodl_1_1parser.html":[1,0,0,6], -"namespacenmodl_1_1parser_1_1diffeq.html":[2,0,0,3,0], "namespacenmodl_1_1parser_1_1diffeq.html":[1,0,0,6,0], -"namespacenmodl_1_1printer.html":[1,0,0,7], +"namespacenmodl_1_1parser_1_1diffeq.html":[2,0,0,3,0], "namespacenmodl_1_1printer.html":[2,0,0,4], -"namespacenmodl_1_1pybind__wrappers.html":[2,0,0,5], +"namespacenmodl_1_1printer.html":[1,0,0,7], "namespacenmodl_1_1pybind__wrappers.html":[1,0,0,8], +"namespacenmodl_1_1pybind__wrappers.html":[2,0,0,5], "namespacenmodl_1_1stringutils.html":[1,0,0,9], -"namespacenmodl_1_1symtab.html":[1,0,0,10], "namespacenmodl_1_1symtab.html":[2,0,0,6], +"namespacenmodl_1_1symtab.html":[1,0,0,10], "namespacenmodl_1_1symtab_1_1syminfo.html":[1,0,0,10,0], "namespacenmodl_1_1test__utils.html":[2,0,0,7], "namespacenmodl_1_1test__utils.html":[1,0,0,11], -"namespacenmodl_1_1units.html":[1,0,0,12], "namespacenmodl_1_1units.html":[2,0,0,8], +"namespacenmodl_1_1units.html":[1,0,0,12], "namespacenmodl_1_1utils.html":[2,0,0,9], "namespacenmodl_1_1utils.html":[1,0,0,13], "namespacenmodl_1_1visitor.html":[2,0,0,10], @@ -249,5 +247,7 @@ var NAVTREEINDEX31 = "pynmodl_8cpp.html#a962f776726e762e943b1b741bcbad1ae":[3,0,1,6,3,1], "pynmodl_8cpp.html#aa458e3599e621ccf452566de89f07419":[3,0,1,6,3,6], "pynmodl_8cpp.html#aca486bce53ef7a704e34846b13d6f7b5":[3,0,1,6,3,4], -"pynmodl_8cpp.html#ad22b073fd0c7f42b684dec068e353f1c":[3,0,1,6,3,5] +"pynmodl_8cpp.html#ad22b073fd0c7f42b684dec068e353f1c":[3,0,1,6,3,5], +"pynmodl_8cpp.html#ad7464779774fc6cb7bb6fbad60a4285e":[3,0,1,6,3,8], +"pynmodl_8cpp.html#ad8e1028d0986d63d4284d9aee106f630":[3,0,1,6,3,11] }; diff --git a/doxygen/navtreeindex32.js b/doxygen/navtreeindex32.js index bef73ad54..90598a2b7 100644 --- a/doxygen/navtreeindex32.js +++ b/doxygen/navtreeindex32.js @@ -1,7 +1,5 @@ var NAVTREEINDEX32 = { -"pynmodl_8cpp.html#ad7464779774fc6cb7bb6fbad60a4285e":[3,0,1,6,3,8], -"pynmodl_8cpp.html#ad8e1028d0986d63d4284d9aee106f630":[3,0,1,6,3,11], "pynmodl_8cpp_source.html":[3,0,1,6,3], "random__var_8hpp.html":[3,0,0,0,0,0,95], "random__var_8hpp_source.html":[3,0,0,0,0,0,95], @@ -249,5 +247,7 @@ var NAVTREEINDEX32 = "structnmodl_1_1codegen_1_1_codegen_info.html#ae05c57438cf033efef981b2de6c34ed8":[0,1,1,7,40], "structnmodl_1_1codegen_1_1_codegen_info.html#ae0ae57c15bffa577993551d4345276e3":[0,1,1,7,23], "structnmodl_1_1codegen_1_1_codegen_info.html#ae6f18ddfee31d5a335b0421f24428a60":[0,1,1,7,9], -"structnmodl_1_1codegen_1_1_codegen_info.html#af49fe1ab8d7c35c937585ce7ac7992df":[0,1,1,7,74] +"structnmodl_1_1codegen_1_1_codegen_info.html#af49fe1ab8d7c35c937585ce7ac7992df":[0,1,1,7,74], +"structnmodl_1_1codegen_1_1_codegen_info.html#af61629cf3b042744e0ae3655e807e52a":[0,1,1,7,91], +"structnmodl_1_1codegen_1_1_codegen_info.html#afbc429aec58b9dbf16f0db7fc2d1869a":[0,1,1,7,75] }; diff --git a/doxygen/navtreeindex33.js b/doxygen/navtreeindex33.js index 752cbbf0b..785e2d323 100644 --- a/doxygen/navtreeindex33.js +++ b/doxygen/navtreeindex33.js @@ -1,7 +1,5 @@ var NAVTREEINDEX33 = { -"structnmodl_1_1codegen_1_1_codegen_info.html#af61629cf3b042744e0ae3655e807e52a":[0,1,1,7,91], -"structnmodl_1_1codegen_1_1_codegen_info.html#afbc429aec58b9dbf16f0db7fc2d1869a":[0,1,1,7,75], "structnmodl_1_1codegen_1_1_codegen_info.html#afbd7bbb54c12a07fce90d62325799810":[0,1,1,7,46], "structnmodl_1_1codegen_1_1_codegen_info.html#afda3a06d247507a8e4a90d9e14486320":[0,1,1,7,86], "structnmodl_1_1codegen_1_1_conductance.html":[0,1,1,3], @@ -249,5 +247,7 @@ var NAVTREEINDEX33 = "symbol__properties_8hpp.html#ad9b6b8559b36d0a500ef5110badcc4dbaa2e4822a98337283e39f7b60acf85ec9":[3,0,1,8,4,3,0], "symbol__properties_8hpp.html#ad9b6b8559b36d0a500ef5110badcc4dbaa6ecefaab5c08acc8f2f69a8d98afe9e":[3,0,1,8,4,3,3], "symbol__properties_8hpp.html#ad9b6b8559b36d0a500ef5110badcc4dbaaa553f510cc3f449cdb246f8b31b0c16":[3,0,1,8,4,3,31], -"symbol__properties_8hpp.html#ad9b6b8559b36d0a500ef5110badcc4dbaaa68b373a676197603d94276c0970dd6":[3,0,1,8,4,3,18] +"symbol__properties_8hpp.html#ad9b6b8559b36d0a500ef5110badcc4dbaaa68b373a676197603d94276c0970dd6":[3,0,1,8,4,3,18], +"symbol__properties_8hpp.html#ad9b6b8559b36d0a500ef5110badcc4dbab42b3dbb719197d22c748fc74ac64ba4":[3,0,1,8,4,3,5], +"symbol__properties_8hpp.html#ad9b6b8559b36d0a500ef5110badcc4dbac4ba8c72426a2ce5d391710cb72d933a":[3,0,1,8,4,3,26] }; diff --git a/doxygen/navtreeindex34.js b/doxygen/navtreeindex34.js index 1776edbd0..a9df79a7e 100644 --- a/doxygen/navtreeindex34.js +++ b/doxygen/navtreeindex34.js @@ -1,7 +1,5 @@ var NAVTREEINDEX34 = { -"symbol__properties_8hpp.html#ad9b6b8559b36d0a500ef5110badcc4dbab42b3dbb719197d22c748fc74ac64ba4":[3,0,1,8,4,3,5], -"symbol__properties_8hpp.html#ad9b6b8559b36d0a500ef5110badcc4dbac4ba8c72426a2ce5d391710cb72d933a":[3,0,1,8,4,3,26], "symbol__properties_8hpp.html#ad9b6b8559b36d0a500ef5110badcc4dbac89e419cdec37c6436386d0ccee1096a":[3,0,1,8,4,3,4], "symbol__properties_8hpp.html#ad9b6b8559b36d0a500ef5110badcc4dbac8de66f1a4787fe20ffdde46def4be3a":[3,0,1,8,4,3,23], "symbol__properties_8hpp.html#ad9b6b8559b36d0a500ef5110badcc4dbacb1e09d4f29a44bf586491796c2373e5":[3,0,1,8,4,3,9], @@ -249,5 +247,7 @@ var NAVTREEINDEX34 = "verbatim__driver_8hpp.html#a46229e87df41b4db138f47eeac6c3bfb":[3,0,1,4,14,0], "verbatim__driver_8hpp_source.html":[3,0,1,4,14], "verbatim__var__rename__visitor_8cpp.html":[3,0,1,11,59], -"verbatim__var__rename__visitor_8cpp_source.html":[3,0,1,11,59] +"verbatim__var__rename__visitor_8cpp_source.html":[3,0,1,11,59], +"verbatim__var__rename__visitor_8hpp.html":[3,0,1,11,60], +"verbatim__var__rename__visitor_8hpp_source.html":[3,0,1,11,60] }; diff --git a/doxygen/navtreeindex35.js b/doxygen/navtreeindex35.js index 2d4212493..0fca9ef31 100644 --- a/doxygen/navtreeindex35.js +++ b/doxygen/navtreeindex35.js @@ -1,7 +1,5 @@ var NAVTREEINDEX35 = { -"verbatim__var__rename__visitor_8hpp.html":[3,0,1,11,60], -"verbatim__var__rename__visitor_8hpp_source.html":[3,0,1,11,60], "verbatim__visitor_8cpp.html":[3,0,1,11,61], "verbatim__visitor_8cpp_source.html":[3,0,1,11,61], "verbatim__visitor_8hpp.html":[3,0,1,11,62], diff --git a/doxygen/search/all_13.js b/doxygen/search/all_13.js index 8c31192af..c85ad2438 100644 --- a/doxygen/search/all_13.js +++ b/doxygen/search/all_13.js @@ -20,7 +20,7 @@ var searchData= ['under_5fsolve_5fblock_2448',['under_solve_block',['../classnmodl_1_1visitor_1_1_perf_visitor.html#adfc54ab3e4d8fa2211af69213af5e9c4',1,'nmodl::visitor::PerfVisitor']]], ['under_5fstate_5fblock_2449',['under_state_block',['../classnmodl_1_1visitor_1_1_symtab_visitor.html#a8ad9ccebcbcfd1b0011392dcf9163abf',1,'nmodl::visitor::SymtabVisitor']]], ['unhandled_5fast_5ftypes_5ffunc_2450',['unhandled_ast_types_func',['../classnmodl_1_1codegen_1_1_codegen_compatibility_visitor.html#a320efdb261998e4ce6e10003010a39a4',1,'nmodl::codegen::CodegenCompatibilityVisitor']]], - ['unit_2451',['Unit',['../classnmodl_1_1units_1_1_unit.html',1,'nmodl::units::Unit'],['../classnmodl_1_1ast_1_1_unit.html',1,'nmodl::ast::Unit'],['../classnmodl_1_1units_1_1_unit.html#a6a694adfa7ba3ac4f89c0d1112a3a0bd',1,'nmodl::units::Unit::Unit()=default'],['../classnmodl_1_1units_1_1_unit.html#a644f0c377cca21499472470c45e6c41d',1,'nmodl::units::Unit::Unit(std::string name)'],['../classnmodl_1_1units_1_1_unit.html#afd867ccb4e22a57391ddef31893495aa',1,'nmodl::units::Unit::Unit(const double factor, const std::array< int, MAX_DIMS > &dimensions, std::string name)'],['../classnmodl_1_1ast_1_1_unit.html#a0fd1dc5a4429f1ba40514f83fa7f7933',1,'nmodl::ast::Unit::Unit(String *name)'],['../classnmodl_1_1ast_1_1_unit.html#ac8ac845d612cf2401f770b7123c80622',1,'nmodl::ast::Unit::Unit(std::shared_ptr< String > name)'],['../classnmodl_1_1ast_1_1_unit.html#a19bde5b7464bcbf2ef7c0f256e681b71',1,'nmodl::ast::Unit::Unit(const Unit &obj)'],['../classnmodl_1_1ast_1_1_argument.html#a81fa77cdf45555a201e232e4a0f2c160',1,'nmodl::ast::Argument::unit()'],['../classnmodl_1_1ast_1_1_assigned_definition.html#a535c589d0ed684e7a159e2276a7994c6',1,'nmodl::ast::AssignedDefinition::unit()'],['../classnmodl_1_1ast_1_1_constant_var.html#a5a5d9f1dd2844972f17ed1b2d85ddeca',1,'nmodl::ast::ConstantVar::unit()'],['../classnmodl_1_1ast_1_1_double_unit.html#aa1060ac52de8f757e3c410adb0e1213a',1,'nmodl::ast::DoubleUnit::unit()'],['../classnmodl_1_1ast_1_1_function_block.html#a913fa9fed578d8f508433047f6fdda01',1,'nmodl::ast::FunctionBlock::unit()'],['../classnmodl_1_1ast_1_1_function_table_block.html#ad7497f8928c26a90f6ebc6a0d7d9b305',1,'nmodl::ast::FunctionTableBlock::unit()'],['../classnmodl_1_1ast_1_1_param_assign.html#ae7589a038c57e2b97d3b7545a55bae27',1,'nmodl::ast::ParamAssign::unit()'],['../classnmodl_1_1ast_1_1_procedure_block.html#a0c9dc7cff916b9795bb6598b2e02324d',1,'nmodl::ast::ProcedureBlock::unit()'],['../group__ast__type.html#ggac392e49849e60c05e42ea02c7b445033aec8fc2c42b9c76effd648a14b311411f',1,'nmodl::ast::UNIT()']]], + ['unit_2451',['Unit',['../classnmodl_1_1units_1_1_unit.html',1,'nmodl::units::Unit'],['../classnmodl_1_1ast_1_1_unit.html',1,'nmodl::ast::Unit'],['../classnmodl_1_1ast_1_1_argument.html#a81fa77cdf45555a201e232e4a0f2c160',1,'nmodl::ast::Argument::unit()'],['../classnmodl_1_1ast_1_1_assigned_definition.html#a535c589d0ed684e7a159e2276a7994c6',1,'nmodl::ast::AssignedDefinition::unit()'],['../classnmodl_1_1ast_1_1_constant_var.html#a5a5d9f1dd2844972f17ed1b2d85ddeca',1,'nmodl::ast::ConstantVar::unit()'],['../classnmodl_1_1ast_1_1_double_unit.html#aa1060ac52de8f757e3c410adb0e1213a',1,'nmodl::ast::DoubleUnit::unit()'],['../classnmodl_1_1ast_1_1_function_block.html#a913fa9fed578d8f508433047f6fdda01',1,'nmodl::ast::FunctionBlock::unit()'],['../classnmodl_1_1ast_1_1_function_table_block.html#ad7497f8928c26a90f6ebc6a0d7d9b305',1,'nmodl::ast::FunctionTableBlock::unit()'],['../classnmodl_1_1ast_1_1_param_assign.html#ae7589a038c57e2b97d3b7545a55bae27',1,'nmodl::ast::ParamAssign::unit()'],['../classnmodl_1_1ast_1_1_procedure_block.html#a0c9dc7cff916b9795bb6598b2e02324d',1,'nmodl::ast::ProcedureBlock::unit()'],['../classnmodl_1_1units_1_1_unit.html#a6a694adfa7ba3ac4f89c0d1112a3a0bd',1,'nmodl::units::Unit::Unit()=default'],['../classnmodl_1_1units_1_1_unit.html#a644f0c377cca21499472470c45e6c41d',1,'nmodl::units::Unit::Unit(std::string name)'],['../classnmodl_1_1units_1_1_unit.html#afd867ccb4e22a57391ddef31893495aa',1,'nmodl::units::Unit::Unit(const double factor, const std::array< int, MAX_DIMS > &dimensions, std::string name)'],['../classnmodl_1_1ast_1_1_unit.html#a0fd1dc5a4429f1ba40514f83fa7f7933',1,'nmodl::ast::Unit::Unit(String *name)'],['../classnmodl_1_1ast_1_1_unit.html#ac8ac845d612cf2401f770b7123c80622',1,'nmodl::ast::Unit::Unit(std::shared_ptr< String > name)'],['../classnmodl_1_1ast_1_1_unit.html#a19bde5b7464bcbf2ef7c0f256e681b71',1,'nmodl::ast::Unit::Unit(const Unit &obj)'],['../group__ast__type.html#ggac392e49849e60c05e42ea02c7b445033aec8fc2c42b9c76effd648a14b311411f',1,'nmodl::ast::UNIT()']]], ['unit_2ehpp_2452',['unit.hpp',['../unit_8hpp.html',1,'']]], ['unit1_2453',['unit1',['../classnmodl_1_1ast_1_1_factor_def.html#af1edb85b751a8797a1bc37a85ec8f9df',1,'nmodl::ast::FactorDef::unit1()'],['../classnmodl_1_1ast_1_1_unit_def.html#a041628e752deb7dadabe9cbb1f940033',1,'nmodl::ast::UnitDef::unit1()']]], ['unit2_2454',['unit2',['../classnmodl_1_1ast_1_1_factor_def.html#a842b861427a497f3ee615d14babf6113',1,'nmodl::ast::FactorDef::unit2()'],['../classnmodl_1_1ast_1_1_unit_def.html#aad0139082153e72d94002e4e24b83055',1,'nmodl::ast::UnitDef::unit2()']]], diff --git a/doxygen/search/all_14.js b/doxygen/search/all_14.js index 1194b00e6..c61e49ac3 100644 --- a/doxygen/search/all_14.js +++ b/doxygen/search/all_14.js @@ -143,7 +143,7 @@ var searchData= ['visit_5fprime_5fname_2662',['visit_prime_name',['../classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a0c937b0ca36a6489bbc6630db5df0cf5',1,'nmodl::codegen::CodegenCppVisitor::visit_prime_name()'],['../classnmodl_1_1visitor_1_1_perf_visitor.html#a9c1165355592120fef8efc7ac9defc87',1,'nmodl::visitor::PerfVisitor::visit_prime_name()'],['../classnmodl_1_1visitor_1_1_rename_visitor.html#a632e80145899fe9dc91136e96190f88e',1,'nmodl::visitor::RenameVisitor::visit_prime_name()'],['../classnmodl_1_1visitor_1_1_ast_visitor.html#ae7c7b1cf13a8e45d6db6b8b53aec6a48',1,'nmodl::visitor::AstVisitor::visit_prime_name()'],['../classnmodl_1_1visitor_1_1_const_ast_visitor.html#a77d495ad18950c6ac8575d2f29914f89',1,'nmodl::visitor::ConstAstVisitor::visit_prime_name()'],['../classnmodl_1_1visitor_1_1test_1_1_check_parent_visitor.html#a0059801d1b06f6326bc396a62b14de45',1,'nmodl::visitor::test::CheckParentVisitor::visit_prime_name()'],['../classnmodl_1_1visitor_1_1_j_s_o_n_visitor.html#a4046544d35ac45368cb4b5fec9de4c19',1,'nmodl::visitor::JSONVisitor::visit_prime_name()'],['../classnmodl_1_1visitor_1_1_meta_ast_lookup_visitor.html#ae0ad557404d5a8fa110e30defe0f26d2',1,'nmodl::visitor::MetaAstLookupVisitor::visit_prime_name()'],['../classnmodl_1_1visitor_1_1_nmodl_print_visitor.html#aac10b4b5b4680f303069e923a7be2c68',1,'nmodl::visitor::NmodlPrintVisitor::visit_prime_name()'],['../classnmodl_1_1visitor_1_1_symtab_visitor.html#af8cc7d8f0b8dfbc05bfe248bd686fb85',1,'nmodl::visitor::SymtabVisitor::visit_prime_name()'],['../classnmodl_1_1visitor_1_1_visitor.html#a74b24cb5562c8f2b7f805c64c5dbd68d',1,'nmodl::visitor::Visitor::visit_prime_name()'],['../classnmodl_1_1visitor_1_1_const_visitor.html#ab659b014c4e290127a9952c6a3fcd0e2',1,'nmodl::visitor::ConstVisitor::visit_prime_name()']]], ['visit_5fprocedure_5fblock_2663',['visit_procedure_block',['../classnmodl_1_1codegen_1_1_codegen_helper_visitor.html#ae68d4e127294bf206fec2f8aed9dfba8',1,'nmodl::codegen::CodegenHelperVisitor::visit_procedure_block()'],['../classnmodl_1_1visitor_1_1_function_callpath_visitor.html#a740260d32147029fb83df276457c2ac6',1,'nmodl::visitor::FunctionCallpathVisitor::visit_procedure_block()'],['../classnmodl_1_1visitor_1_1_perf_visitor.html#adb10791f8b4b750b2bf36181003f7238',1,'nmodl::visitor::PerfVisitor::visit_procedure_block()'],['../classnmodl_1_1visitor_1_1_rename_function_arguments_visitor.html#a75e562fb228c979c6078b5a5b7ff6d80',1,'nmodl::visitor::RenameFunctionArgumentsVisitor::visit_procedure_block()'],['../classnmodl_1_1visitor_1_1_semantic_analysis_visitor.html#a60253290c335c3b8398b87bdb0f7e057',1,'nmodl::visitor::SemanticAnalysisVisitor::visit_procedure_block()'],['../classnmodl_1_1visitor_1_1_ast_visitor.html#a67195b6d0f65491415a2fb90e0680142',1,'nmodl::visitor::AstVisitor::visit_procedure_block()'],['../classnmodl_1_1visitor_1_1_const_ast_visitor.html#a5dad4d483fa20621cc3e2f59c25abb01',1,'nmodl::visitor::ConstAstVisitor::visit_procedure_block()'],['../classnmodl_1_1visitor_1_1test_1_1_check_parent_visitor.html#afb8f66b87e39475950ff179ed8dd5417',1,'nmodl::visitor::test::CheckParentVisitor::visit_procedure_block()'],['../classnmodl_1_1visitor_1_1_j_s_o_n_visitor.html#a42d79f72ba101e1b7dde0113c2cd7983',1,'nmodl::visitor::JSONVisitor::visit_procedure_block()'],['../classnmodl_1_1visitor_1_1_meta_ast_lookup_visitor.html#a7729180b7a6aba0cf0cdad976e107281',1,'nmodl::visitor::MetaAstLookupVisitor::visit_procedure_block()'],['../classnmodl_1_1visitor_1_1_nmodl_print_visitor.html#ab2c8312a6b0b4270f1a31d571a028528',1,'nmodl::visitor::NmodlPrintVisitor::visit_procedure_block()'],['../classnmodl_1_1visitor_1_1_symtab_visitor.html#ae89cf84d4e3a08c1e3b359715c5c73b8',1,'nmodl::visitor::SymtabVisitor::visit_procedure_block()'],['../classnmodl_1_1visitor_1_1_visitor.html#a8fe41cd709db609433f80880c01d3ed5',1,'nmodl::visitor::Visitor::visit_procedure_block()'],['../classnmodl_1_1visitor_1_1_const_visitor.html#aa720b8d776da0a450f2a2007a1443a08',1,'nmodl::visitor::ConstVisitor::visit_procedure_block()']]], ['visit_5fprogram_2664',['visit_program',['../classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a491e418920668f8fce331c65e8b48a02',1,'nmodl::codegen::CodegenCppVisitor::visit_program()'],['../classnmodl_1_1codegen_1_1_codegen_helper_visitor.html#aca76a55d964776301826e82460442e92',1,'nmodl::codegen::CodegenHelperVisitor::visit_program()'],['../classnmodl_1_1visitor_1_1_cvode_visitor.html#a40239efb1e9c1764fc75fda045c0ed0f',1,'nmodl::visitor::CvodeVisitor::visit_program()'],['../classnmodl_1_1visitor_1_1_function_callpath_visitor.html#ae5af816b7069226ab9baa3c047963938',1,'nmodl::visitor::FunctionCallpathVisitor::visit_program()'],['../classnmodl_1_1visitor_1_1_indexed_name_visitor.html#a27cc9e015543149f778d9bb8dafe6c25',1,'nmodl::visitor::IndexedNameVisitor::visit_program()'],['../classnmodl_1_1visitor_1_1_inline_visitor.html#a3cb907aee8aebc2a4a49e60d5495a45c',1,'nmodl::visitor::InlineVisitor::visit_program()'],['../classnmodl_1_1visitor_1_1_kinetic_block_visitor.html#ac77988626351cbff3cd3b3a4e4da6190',1,'nmodl::visitor::KineticBlockVisitor::visit_program()'],['../classnmodl_1_1visitor_1_1_local_to_assigned_visitor.html#a12034edb77cc60e476108d721bb1c28f',1,'nmodl::visitor::LocalToAssignedVisitor::visit_program()'],['../classnmodl_1_1visitor_1_1_localize_visitor.html#a26c9dbcc86982d1889af061699c9759d',1,'nmodl::visitor::LocalizeVisitor::visit_program()'],['../classnmodl_1_1visitor_1_1_create_longitudinal_diffusion_blocks.html#a9983365c2f5873daa8373f7bdf3c78d5',1,'nmodl::visitor::CreateLongitudinalDiffusionBlocks::visit_program()'],['../classnmodl_1_1visitor_1_1_neuron_solve_visitor.html#a7d8bc75025a1fcef827c87ac8be6ae84',1,'nmodl::visitor::NeuronSolveVisitor::visit_program()'],['../classnmodl_1_1visitor_1_1_perf_visitor.html#a1d23a57269080183ebae80b1a5529e46',1,'nmodl::visitor::PerfVisitor::visit_program()'],['../classnmodl_1_1visitor_1_1_semantic_analysis_visitor.html#a0145f04c3527c1c1d065f8f89360006e',1,'nmodl::visitor::SemanticAnalysisVisitor::visit_program()'],['../classnmodl_1_1visitor_1_1_solve_block_visitor.html#a6481badf255a690b8adeb5bf6f602429',1,'nmodl::visitor::SolveBlockVisitor::visit_program()'],['../classnmodl_1_1visitor_1_1_steadystate_visitor.html#ad4f195ab154e723d7303f4657cf9a0e7',1,'nmodl::visitor::SteadystateVisitor::visit_program()'],['../classnmodl_1_1visitor_1_1_sympy_conductance_visitor.html#ad754daf2114abe5ea398320aeb9af943',1,'nmodl::visitor::SympyConductanceVisitor::visit_program()'],['../classnmodl_1_1visitor_1_1_sympy_solver_visitor.html#a8b0a436d7075610ef7a966a05bf4bbad',1,'nmodl::visitor::SympySolverVisitor::visit_program()'],['../classnmodl_1_1visitor_1_1_units_visitor.html#ad2b17ab91653b36e8e7f4c1bf61355d3',1,'nmodl::visitor::UnitsVisitor::visit_program()'],['../classnmodl_1_1visitor_1_1_ast_visitor.html#ac1533785a04b7c56a4430a6fd85b7b30',1,'nmodl::visitor::AstVisitor::visit_program()'],['../classnmodl_1_1visitor_1_1_const_ast_visitor.html#a55485b9ec4a13882106d7bb4e59bbd4b',1,'nmodl::visitor::ConstAstVisitor::visit_program()'],['../classnmodl_1_1visitor_1_1test_1_1_check_parent_visitor.html#a42a7066f414fb823d9b89f216d87be7a',1,'nmodl::visitor::test::CheckParentVisitor::visit_program()'],['../classnmodl_1_1visitor_1_1_j_s_o_n_visitor.html#a044a18bde9863c8ff35cd4d74d59d04c',1,'nmodl::visitor::JSONVisitor::visit_program()'],['../classnmodl_1_1visitor_1_1_meta_ast_lookup_visitor.html#a5013462f5e44c055b950ceaa75708b97',1,'nmodl::visitor::MetaAstLookupVisitor::visit_program()'],['../classnmodl_1_1visitor_1_1_nmodl_print_visitor.html#a6d701737317db0582452ddec8b288dda',1,'nmodl::visitor::NmodlPrintVisitor::visit_program()'],['../classnmodl_1_1visitor_1_1_symtab_visitor.html#a185382b93a9521f55d68f2d334b43429',1,'nmodl::visitor::SymtabVisitor::visit_program()'],['../classnmodl_1_1visitor_1_1_visitor.html#a51eb42b5990b2d5afaa2ab5130ae8203',1,'nmodl::visitor::Visitor::visit_program()'],['../classnmodl_1_1visitor_1_1_const_visitor.html#a97971a8961838095ed18d4ee389470d0',1,'nmodl::visitor::ConstVisitor::visit_program()'],['../src_2visitors_2main_8cpp.html#ad7e763f50622bfc18bd74d2d31fd91d0',1,'visit_program(): main.cpp']]], - ['visit_5fprotect_5fstatement_2665',['visit_protect_statement',['../classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a946c6fc559c23573210285ed47e28570',1,'nmodl::codegen::CodegenCppVisitor::visit_protect_statement()'],['../classnmodl_1_1visitor_1_1_semantic_analysis_visitor.html#a95ddaa30e2f56d529e3b1b354e8c22ff',1,'nmodl::visitor::SemanticAnalysisVisitor::visit_protect_statement()'],['../classnmodl_1_1visitor_1_1_ast_visitor.html#a80c146002013ffab5687ca0d88b79d01',1,'nmodl::visitor::AstVisitor::visit_protect_statement()'],['../classnmodl_1_1visitor_1_1_const_ast_visitor.html#af2bdb091626313753da1b37c0938a551',1,'nmodl::visitor::ConstAstVisitor::visit_protect_statement()'],['../classnmodl_1_1visitor_1_1test_1_1_check_parent_visitor.html#aa49297003fb2be6b0b2a004a75b60bcd',1,'nmodl::visitor::test::CheckParentVisitor::visit_protect_statement()'],['../classnmodl_1_1visitor_1_1_j_s_o_n_visitor.html#a24a229814ae9975a730dcecc4108ee4d',1,'nmodl::visitor::JSONVisitor::visit_protect_statement()'],['../classnmodl_1_1visitor_1_1_meta_ast_lookup_visitor.html#a20252f5fcde8471e00b6fa37c578511a',1,'nmodl::visitor::MetaAstLookupVisitor::visit_protect_statement()'],['../classnmodl_1_1visitor_1_1_nmodl_print_visitor.html#a1328bf72643e9d7997310c8fae89d568',1,'nmodl::visitor::NmodlPrintVisitor::visit_protect_statement()'],['../classnmodl_1_1visitor_1_1_visitor.html#a716f9a007901ebe4bf3f7db75f5cde18',1,'nmodl::visitor::Visitor::visit_protect_statement()'],['../classnmodl_1_1visitor_1_1_const_visitor.html#a119508c14f86e906ef4da073b3a2ae1c',1,'nmodl::visitor::ConstVisitor::visit_protect_statement()']]], + ['visit_5fprotect_5fstatement_2665',['visit_protect_statement',['../classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#affd885d93ced7c0bd58ad023444a4737',1,'nmodl::codegen::CodegenCoreneuronCppVisitor::visit_protect_statement()'],['../classnmodl_1_1visitor_1_1_semantic_analysis_visitor.html#a95ddaa30e2f56d529e3b1b354e8c22ff',1,'nmodl::visitor::SemanticAnalysisVisitor::visit_protect_statement()'],['../classnmodl_1_1visitor_1_1_ast_visitor.html#a80c146002013ffab5687ca0d88b79d01',1,'nmodl::visitor::AstVisitor::visit_protect_statement()'],['../classnmodl_1_1visitor_1_1_const_ast_visitor.html#af2bdb091626313753da1b37c0938a551',1,'nmodl::visitor::ConstAstVisitor::visit_protect_statement()'],['../classnmodl_1_1visitor_1_1test_1_1_check_parent_visitor.html#aa49297003fb2be6b0b2a004a75b60bcd',1,'nmodl::visitor::test::CheckParentVisitor::visit_protect_statement()'],['../classnmodl_1_1visitor_1_1_j_s_o_n_visitor.html#a24a229814ae9975a730dcecc4108ee4d',1,'nmodl::visitor::JSONVisitor::visit_protect_statement()'],['../classnmodl_1_1visitor_1_1_meta_ast_lookup_visitor.html#a20252f5fcde8471e00b6fa37c578511a',1,'nmodl::visitor::MetaAstLookupVisitor::visit_protect_statement()'],['../classnmodl_1_1visitor_1_1_nmodl_print_visitor.html#a1328bf72643e9d7997310c8fae89d568',1,'nmodl::visitor::NmodlPrintVisitor::visit_protect_statement()'],['../classnmodl_1_1visitor_1_1_visitor.html#a716f9a007901ebe4bf3f7db75f5cde18',1,'nmodl::visitor::Visitor::visit_protect_statement()'],['../classnmodl_1_1visitor_1_1_const_visitor.html#a119508c14f86e906ef4da073b3a2ae1c',1,'nmodl::visitor::ConstVisitor::visit_protect_statement()']]], ['visit_5frandom_5fvar_2666',['visit_random_var',['../classnmodl_1_1visitor_1_1_ast_visitor.html#a932287c650e47a6332137003d58199e7',1,'nmodl::visitor::AstVisitor::visit_random_var()'],['../classnmodl_1_1visitor_1_1_const_ast_visitor.html#a52968a0544ab88a89d5e1a34be601362',1,'nmodl::visitor::ConstAstVisitor::visit_random_var()'],['../classnmodl_1_1visitor_1_1test_1_1_check_parent_visitor.html#a1069be85bcfd383c187f5baafc53dc02',1,'nmodl::visitor::test::CheckParentVisitor::visit_random_var()'],['../classnmodl_1_1visitor_1_1_j_s_o_n_visitor.html#ab9eec7147fc89240878f1887aca7f0b2',1,'nmodl::visitor::JSONVisitor::visit_random_var()'],['../classnmodl_1_1visitor_1_1_meta_ast_lookup_visitor.html#af0fc5059d8095fd033bc9a67a9468f90',1,'nmodl::visitor::MetaAstLookupVisitor::visit_random_var()'],['../classnmodl_1_1visitor_1_1_nmodl_print_visitor.html#a2c66042b3c545d8ece8d651cbbae820c',1,'nmodl::visitor::NmodlPrintVisitor::visit_random_var()'],['../classnmodl_1_1visitor_1_1_symtab_visitor.html#ade66693c6c4af9b3425b12ef701d7f72',1,'nmodl::visitor::SymtabVisitor::visit_random_var()'],['../classnmodl_1_1visitor_1_1_visitor.html#ac4c44775bd478be76e721114ac06ff0d',1,'nmodl::visitor::Visitor::visit_random_var()'],['../classnmodl_1_1visitor_1_1_const_visitor.html#a255202f2f1cc6e55c83e83cf993790b3',1,'nmodl::visitor::ConstVisitor::visit_random_var()']]], ['visit_5frandom_5fvar_5flist_2667',['visit_random_var_list',['../classnmodl_1_1visitor_1_1_ast_visitor.html#a0edd9895171e1844cc13a71d17287bd8',1,'nmodl::visitor::AstVisitor::visit_random_var_list()'],['../classnmodl_1_1visitor_1_1_const_ast_visitor.html#a0c5794d7de53f9518c0f7e8f4161074a',1,'nmodl::visitor::ConstAstVisitor::visit_random_var_list()'],['../classnmodl_1_1visitor_1_1test_1_1_check_parent_visitor.html#a76ffafc77197d6a0ef2cd309cd8b1af2',1,'nmodl::visitor::test::CheckParentVisitor::visit_random_var_list()'],['../classnmodl_1_1visitor_1_1_j_s_o_n_visitor.html#adbf6e2f3a3d70b73427d0f38974ba134',1,'nmodl::visitor::JSONVisitor::visit_random_var_list()'],['../classnmodl_1_1visitor_1_1_meta_ast_lookup_visitor.html#af2cb27d7479e27520b26ae63834c93f1',1,'nmodl::visitor::MetaAstLookupVisitor::visit_random_var_list()'],['../classnmodl_1_1visitor_1_1_nmodl_print_visitor.html#a1510be445462dbc8a12cf207cfa2ef29',1,'nmodl::visitor::NmodlPrintVisitor::visit_random_var_list()'],['../classnmodl_1_1visitor_1_1_visitor.html#a794f97f4ca5e20f987474a4d9ccd87f0',1,'nmodl::visitor::Visitor::visit_random_var_list()'],['../classnmodl_1_1visitor_1_1_const_visitor.html#a2afa31b56dca4d9442753f3782ae06eb',1,'nmodl::visitor::ConstVisitor::visit_random_var_list()']]], ['visit_5frange_2668',['visit_range',['../classnmodl_1_1visitor_1_1_ast_visitor.html#adf4af1a83254ec46a77cf75b99ca7074',1,'nmodl::visitor::AstVisitor::visit_range()'],['../classnmodl_1_1visitor_1_1_const_ast_visitor.html#a3bc7a69317a5c8afeb159288668a8514',1,'nmodl::visitor::ConstAstVisitor::visit_range()'],['../classnmodl_1_1visitor_1_1test_1_1_check_parent_visitor.html#a2bd8fe72f964e842c912934f1e4618e3',1,'nmodl::visitor::test::CheckParentVisitor::visit_range()'],['../classnmodl_1_1visitor_1_1_j_s_o_n_visitor.html#a905edf6300a9ee341e1f9544a8325d70',1,'nmodl::visitor::JSONVisitor::visit_range()'],['../classnmodl_1_1visitor_1_1_meta_ast_lookup_visitor.html#aecbf7e53de7d920ca0b49ceb34444e34',1,'nmodl::visitor::MetaAstLookupVisitor::visit_range()'],['../classnmodl_1_1visitor_1_1_nmodl_print_visitor.html#aa24128b174f683886061af8137419ff6',1,'nmodl::visitor::NmodlPrintVisitor::visit_range()'],['../classnmodl_1_1visitor_1_1_visitor.html#a00058fbb952a5b9ef3d6612f45dc11be',1,'nmodl::visitor::Visitor::visit_range()'],['../classnmodl_1_1visitor_1_1_const_visitor.html#a3dfb17955ecece7e3def3e9998d2f512',1,'nmodl::visitor::ConstVisitor::visit_range()']]], diff --git a/doxygen/search/all_f.js b/doxygen/search/all_f.js index 10d2099de..1be062612 100644 --- a/doxygen/search/all_f.js +++ b/doxygen/search/all_f.js @@ -73,7 +73,7 @@ var searchData= ['primes_5fsize_1739',['primes_size',['../structnmodl_1_1codegen_1_1_codegen_info.html#abbbe11ab6b05c33f174e313fc15ccc26',1,'nmodl::codegen::CodegenInfo']]], ['print_1740',['print',['../structnmodl_1_1parser_1_1diffeq_1_1_term.html#ad5f66bca40e51a0f57e9cc88e81578c9',1,'nmodl::parser::diffeq::Term::print()'],['../classnmodl_1_1parser_1_1diffeq_1_1_diff_eq_context.html#a5e9bc3675a3684322cf73d2f5f167e18',1,'nmodl::parser::diffeq::DiffEqContext::print()'],['../classnmodl_1_1symtab_1_1_symbol_table_1_1_table.html#a766d8ac1fe308e10f6b0d95f4a3beeb9',1,'nmodl::symtab::SymbolTable::Table::print()'],['../classnmodl_1_1symtab_1_1_symbol_table.html#a5132c3c8dfc5bdc6fe32cf99e26dfdf0',1,'nmodl::symtab::SymbolTable::print()'],['../classnmodl_1_1symtab_1_1_model_symbol_table.html#a459a9e4a03b6484f0f90132dad54ec97',1,'nmodl::symtab::ModelSymbolTable::print()'],['../structnmodl_1_1utils_1_1_perf_stat.html#a1ae5a6a039afaaef47fdc302ead7a413',1,'nmodl::utils::PerfStat::print()'],['../structnmodl_1_1utils_1_1_table_data.html#a62d93ed24adbe07a9f72ec732e176018',1,'nmodl::utils::TableData::print(int indent=0) const'],['../structnmodl_1_1utils_1_1_table_data.html#a407094b179280fe0fb5bdbae67155ed4',1,'nmodl::utils::TableData::print(std::ostream &stream, int indent=0) const'],['../classnmodl_1_1visitor_1_1_d_u_instance.html#a6222b51c51758122efabe6bc31d32198',1,'nmodl::visitor::DUInstance::print()'],['../classnmodl_1_1visitor_1_1_perf_visitor.html#a4bf6cfb238d3a3abcd6451336b2653e3',1,'nmodl::visitor::PerfVisitor::print()']]], ['print_5fabort_5froutine_1741',['print_abort_routine',['../classnmodl_1_1codegen_1_1_codegen_acc_visitor.html#a0afbe91263bad633cba874fd9c7b5af6',1,'nmodl::codegen::CodegenAccVisitor::print_abort_routine()'],['../classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#ab87a69ec67fe4d42df3cb0084c99dc85',1,'nmodl::codegen::CodegenCoreneuronCppVisitor::print_abort_routine()']]], - ['print_5fatomic_5freduction_5fpragma_1742',['print_atomic_reduction_pragma',['../classnmodl_1_1codegen_1_1_codegen_acc_visitor.html#af3e32e5cec32f5b55fa81a654bc4afef',1,'nmodl::codegen::CodegenAccVisitor::print_atomic_reduction_pragma()'],['../classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#a66833aede8ecc336b85129ca1e8b8b2e',1,'nmodl::codegen::CodegenCoreneuronCppVisitor::print_atomic_reduction_pragma()'],['../classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a92bfb8a4daec705014f8e871fb0feacb',1,'nmodl::codegen::CodegenCppVisitor::print_atomic_reduction_pragma()'],['../classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a910f9f22e6fbdae4eefae177eb8910f9',1,'nmodl::codegen::CodegenNeuronCppVisitor::print_atomic_reduction_pragma()']]], + ['print_5fatomic_5freduction_5fpragma_1742',['print_atomic_reduction_pragma',['../classnmodl_1_1codegen_1_1_codegen_acc_visitor.html#af3e32e5cec32f5b55fa81a654bc4afef',1,'nmodl::codegen::CodegenAccVisitor::print_atomic_reduction_pragma()'],['../classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#ab21de33c81f273ad3db2d5271221bcdc',1,'nmodl::codegen::CodegenCoreneuronCppVisitor::print_atomic_reduction_pragma()']]], ['print_5fbackend_5fincludes_1743',['print_backend_includes',['../classnmodl_1_1codegen_1_1_codegen_acc_visitor.html#a2a52b48b11fbf0757fb037d7e579daf3',1,'nmodl::codegen::CodegenAccVisitor::print_backend_includes()'],['../classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#abd6be1c541190358a512f0021ea82b16',1,'nmodl::codegen::CodegenCoreneuronCppVisitor::print_backend_includes()']]], ['print_5fbackend_5finfo_1744',['print_backend_info',['../classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#afc26a2583e8b283deae9944939788f79',1,'nmodl::codegen::CodegenCppVisitor']]], ['print_5fbase_5funits_1745',['print_base_units',['../classnmodl_1_1units_1_1_unit_table.html#a33c4d8277abb65e84cfcb9f53906bfbb',1,'nmodl::units::UnitTable']]], diff --git a/doxygen/search/functions_14.js b/doxygen/search/functions_14.js index ee010ca38..5779ee481 100644 --- a/doxygen/search/functions_14.js +++ b/doxygen/search/functions_14.js @@ -106,7 +106,7 @@ var searchData= ['visit_5fprime_5fname_4842',['visit_prime_name',['../classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a0c937b0ca36a6489bbc6630db5df0cf5',1,'nmodl::codegen::CodegenCppVisitor::visit_prime_name()'],['../classnmodl_1_1visitor_1_1_perf_visitor.html#a9c1165355592120fef8efc7ac9defc87',1,'nmodl::visitor::PerfVisitor::visit_prime_name()'],['../classnmodl_1_1visitor_1_1_rename_visitor.html#a632e80145899fe9dc91136e96190f88e',1,'nmodl::visitor::RenameVisitor::visit_prime_name()'],['../classnmodl_1_1visitor_1_1_ast_visitor.html#ae7c7b1cf13a8e45d6db6b8b53aec6a48',1,'nmodl::visitor::AstVisitor::visit_prime_name()'],['../classnmodl_1_1visitor_1_1_const_ast_visitor.html#a77d495ad18950c6ac8575d2f29914f89',1,'nmodl::visitor::ConstAstVisitor::visit_prime_name()'],['../classnmodl_1_1visitor_1_1test_1_1_check_parent_visitor.html#a0059801d1b06f6326bc396a62b14de45',1,'nmodl::visitor::test::CheckParentVisitor::visit_prime_name()'],['../classnmodl_1_1visitor_1_1_j_s_o_n_visitor.html#a4046544d35ac45368cb4b5fec9de4c19',1,'nmodl::visitor::JSONVisitor::visit_prime_name()'],['../classnmodl_1_1visitor_1_1_meta_ast_lookup_visitor.html#ae0ad557404d5a8fa110e30defe0f26d2',1,'nmodl::visitor::MetaAstLookupVisitor::visit_prime_name()'],['../classnmodl_1_1visitor_1_1_nmodl_print_visitor.html#aac10b4b5b4680f303069e923a7be2c68',1,'nmodl::visitor::NmodlPrintVisitor::visit_prime_name()'],['../classnmodl_1_1visitor_1_1_symtab_visitor.html#af8cc7d8f0b8dfbc05bfe248bd686fb85',1,'nmodl::visitor::SymtabVisitor::visit_prime_name()'],['../classnmodl_1_1visitor_1_1_visitor.html#a74b24cb5562c8f2b7f805c64c5dbd68d',1,'nmodl::visitor::Visitor::visit_prime_name()'],['../classnmodl_1_1visitor_1_1_const_visitor.html#ab659b014c4e290127a9952c6a3fcd0e2',1,'nmodl::visitor::ConstVisitor::visit_prime_name()']]], ['visit_5fprocedure_5fblock_4843',['visit_procedure_block',['../classnmodl_1_1codegen_1_1_codegen_helper_visitor.html#ae68d4e127294bf206fec2f8aed9dfba8',1,'nmodl::codegen::CodegenHelperVisitor::visit_procedure_block()'],['../classnmodl_1_1visitor_1_1_function_callpath_visitor.html#a740260d32147029fb83df276457c2ac6',1,'nmodl::visitor::FunctionCallpathVisitor::visit_procedure_block()'],['../classnmodl_1_1visitor_1_1_perf_visitor.html#adb10791f8b4b750b2bf36181003f7238',1,'nmodl::visitor::PerfVisitor::visit_procedure_block()'],['../classnmodl_1_1visitor_1_1_rename_function_arguments_visitor.html#a75e562fb228c979c6078b5a5b7ff6d80',1,'nmodl::visitor::RenameFunctionArgumentsVisitor::visit_procedure_block()'],['../classnmodl_1_1visitor_1_1_semantic_analysis_visitor.html#a60253290c335c3b8398b87bdb0f7e057',1,'nmodl::visitor::SemanticAnalysisVisitor::visit_procedure_block()'],['../classnmodl_1_1visitor_1_1_ast_visitor.html#a67195b6d0f65491415a2fb90e0680142',1,'nmodl::visitor::AstVisitor::visit_procedure_block()'],['../classnmodl_1_1visitor_1_1_const_ast_visitor.html#a5dad4d483fa20621cc3e2f59c25abb01',1,'nmodl::visitor::ConstAstVisitor::visit_procedure_block()'],['../classnmodl_1_1visitor_1_1test_1_1_check_parent_visitor.html#afb8f66b87e39475950ff179ed8dd5417',1,'nmodl::visitor::test::CheckParentVisitor::visit_procedure_block()'],['../classnmodl_1_1visitor_1_1_j_s_o_n_visitor.html#a42d79f72ba101e1b7dde0113c2cd7983',1,'nmodl::visitor::JSONVisitor::visit_procedure_block()'],['../classnmodl_1_1visitor_1_1_meta_ast_lookup_visitor.html#a7729180b7a6aba0cf0cdad976e107281',1,'nmodl::visitor::MetaAstLookupVisitor::visit_procedure_block()'],['../classnmodl_1_1visitor_1_1_nmodl_print_visitor.html#ab2c8312a6b0b4270f1a31d571a028528',1,'nmodl::visitor::NmodlPrintVisitor::visit_procedure_block()'],['../classnmodl_1_1visitor_1_1_symtab_visitor.html#ae89cf84d4e3a08c1e3b359715c5c73b8',1,'nmodl::visitor::SymtabVisitor::visit_procedure_block()'],['../classnmodl_1_1visitor_1_1_visitor.html#a8fe41cd709db609433f80880c01d3ed5',1,'nmodl::visitor::Visitor::visit_procedure_block()'],['../classnmodl_1_1visitor_1_1_const_visitor.html#aa720b8d776da0a450f2a2007a1443a08',1,'nmodl::visitor::ConstVisitor::visit_procedure_block()']]], ['visit_5fprogram_4844',['visit_program',['../classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a491e418920668f8fce331c65e8b48a02',1,'nmodl::codegen::CodegenCppVisitor::visit_program()'],['../classnmodl_1_1codegen_1_1_codegen_helper_visitor.html#aca76a55d964776301826e82460442e92',1,'nmodl::codegen::CodegenHelperVisitor::visit_program()'],['../classnmodl_1_1visitor_1_1_cvode_visitor.html#a40239efb1e9c1764fc75fda045c0ed0f',1,'nmodl::visitor::CvodeVisitor::visit_program()'],['../classnmodl_1_1visitor_1_1_function_callpath_visitor.html#ae5af816b7069226ab9baa3c047963938',1,'nmodl::visitor::FunctionCallpathVisitor::visit_program()'],['../classnmodl_1_1visitor_1_1_indexed_name_visitor.html#a27cc9e015543149f778d9bb8dafe6c25',1,'nmodl::visitor::IndexedNameVisitor::visit_program()'],['../classnmodl_1_1visitor_1_1_inline_visitor.html#a3cb907aee8aebc2a4a49e60d5495a45c',1,'nmodl::visitor::InlineVisitor::visit_program()'],['../classnmodl_1_1visitor_1_1_kinetic_block_visitor.html#ac77988626351cbff3cd3b3a4e4da6190',1,'nmodl::visitor::KineticBlockVisitor::visit_program()'],['../classnmodl_1_1visitor_1_1_local_to_assigned_visitor.html#a12034edb77cc60e476108d721bb1c28f',1,'nmodl::visitor::LocalToAssignedVisitor::visit_program()'],['../classnmodl_1_1visitor_1_1_localize_visitor.html#a26c9dbcc86982d1889af061699c9759d',1,'nmodl::visitor::LocalizeVisitor::visit_program()'],['../classnmodl_1_1visitor_1_1_create_longitudinal_diffusion_blocks.html#a9983365c2f5873daa8373f7bdf3c78d5',1,'nmodl::visitor::CreateLongitudinalDiffusionBlocks::visit_program()'],['../classnmodl_1_1visitor_1_1_neuron_solve_visitor.html#a7d8bc75025a1fcef827c87ac8be6ae84',1,'nmodl::visitor::NeuronSolveVisitor::visit_program()'],['../classnmodl_1_1visitor_1_1_perf_visitor.html#a1d23a57269080183ebae80b1a5529e46',1,'nmodl::visitor::PerfVisitor::visit_program()'],['../classnmodl_1_1visitor_1_1_semantic_analysis_visitor.html#a0145f04c3527c1c1d065f8f89360006e',1,'nmodl::visitor::SemanticAnalysisVisitor::visit_program()'],['../classnmodl_1_1visitor_1_1_solve_block_visitor.html#a6481badf255a690b8adeb5bf6f602429',1,'nmodl::visitor::SolveBlockVisitor::visit_program()'],['../classnmodl_1_1visitor_1_1_steadystate_visitor.html#ad4f195ab154e723d7303f4657cf9a0e7',1,'nmodl::visitor::SteadystateVisitor::visit_program()'],['../classnmodl_1_1visitor_1_1_sympy_conductance_visitor.html#ad754daf2114abe5ea398320aeb9af943',1,'nmodl::visitor::SympyConductanceVisitor::visit_program()'],['../classnmodl_1_1visitor_1_1_sympy_solver_visitor.html#a8b0a436d7075610ef7a966a05bf4bbad',1,'nmodl::visitor::SympySolverVisitor::visit_program()'],['../classnmodl_1_1visitor_1_1_units_visitor.html#ad2b17ab91653b36e8e7f4c1bf61355d3',1,'nmodl::visitor::UnitsVisitor::visit_program()'],['../classnmodl_1_1visitor_1_1_ast_visitor.html#ac1533785a04b7c56a4430a6fd85b7b30',1,'nmodl::visitor::AstVisitor::visit_program()'],['../classnmodl_1_1visitor_1_1_const_ast_visitor.html#a55485b9ec4a13882106d7bb4e59bbd4b',1,'nmodl::visitor::ConstAstVisitor::visit_program()'],['../classnmodl_1_1visitor_1_1test_1_1_check_parent_visitor.html#a42a7066f414fb823d9b89f216d87be7a',1,'nmodl::visitor::test::CheckParentVisitor::visit_program()'],['../classnmodl_1_1visitor_1_1_j_s_o_n_visitor.html#a044a18bde9863c8ff35cd4d74d59d04c',1,'nmodl::visitor::JSONVisitor::visit_program()'],['../classnmodl_1_1visitor_1_1_meta_ast_lookup_visitor.html#a5013462f5e44c055b950ceaa75708b97',1,'nmodl::visitor::MetaAstLookupVisitor::visit_program()'],['../classnmodl_1_1visitor_1_1_nmodl_print_visitor.html#a6d701737317db0582452ddec8b288dda',1,'nmodl::visitor::NmodlPrintVisitor::visit_program()'],['../classnmodl_1_1visitor_1_1_symtab_visitor.html#a185382b93a9521f55d68f2d334b43429',1,'nmodl::visitor::SymtabVisitor::visit_program()'],['../classnmodl_1_1visitor_1_1_visitor.html#a51eb42b5990b2d5afaa2ab5130ae8203',1,'nmodl::visitor::Visitor::visit_program()'],['../classnmodl_1_1visitor_1_1_const_visitor.html#a97971a8961838095ed18d4ee389470d0',1,'nmodl::visitor::ConstVisitor::visit_program()'],['../src_2visitors_2main_8cpp.html#ad7e763f50622bfc18bd74d2d31fd91d0',1,'visit_program(): main.cpp']]], - ['visit_5fprotect_5fstatement_4845',['visit_protect_statement',['../classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a946c6fc559c23573210285ed47e28570',1,'nmodl::codegen::CodegenCppVisitor::visit_protect_statement()'],['../classnmodl_1_1visitor_1_1_semantic_analysis_visitor.html#a95ddaa30e2f56d529e3b1b354e8c22ff',1,'nmodl::visitor::SemanticAnalysisVisitor::visit_protect_statement()'],['../classnmodl_1_1visitor_1_1_ast_visitor.html#a80c146002013ffab5687ca0d88b79d01',1,'nmodl::visitor::AstVisitor::visit_protect_statement()'],['../classnmodl_1_1visitor_1_1_const_ast_visitor.html#af2bdb091626313753da1b37c0938a551',1,'nmodl::visitor::ConstAstVisitor::visit_protect_statement()'],['../classnmodl_1_1visitor_1_1test_1_1_check_parent_visitor.html#aa49297003fb2be6b0b2a004a75b60bcd',1,'nmodl::visitor::test::CheckParentVisitor::visit_protect_statement()'],['../classnmodl_1_1visitor_1_1_j_s_o_n_visitor.html#a24a229814ae9975a730dcecc4108ee4d',1,'nmodl::visitor::JSONVisitor::visit_protect_statement()'],['../classnmodl_1_1visitor_1_1_meta_ast_lookup_visitor.html#a20252f5fcde8471e00b6fa37c578511a',1,'nmodl::visitor::MetaAstLookupVisitor::visit_protect_statement()'],['../classnmodl_1_1visitor_1_1_nmodl_print_visitor.html#a1328bf72643e9d7997310c8fae89d568',1,'nmodl::visitor::NmodlPrintVisitor::visit_protect_statement()'],['../classnmodl_1_1visitor_1_1_visitor.html#a716f9a007901ebe4bf3f7db75f5cde18',1,'nmodl::visitor::Visitor::visit_protect_statement()'],['../classnmodl_1_1visitor_1_1_const_visitor.html#a119508c14f86e906ef4da073b3a2ae1c',1,'nmodl::visitor::ConstVisitor::visit_protect_statement()']]], + ['visit_5fprotect_5fstatement_4845',['visit_protect_statement',['../classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#affd885d93ced7c0bd58ad023444a4737',1,'nmodl::codegen::CodegenCoreneuronCppVisitor::visit_protect_statement()'],['../classnmodl_1_1visitor_1_1_semantic_analysis_visitor.html#a95ddaa30e2f56d529e3b1b354e8c22ff',1,'nmodl::visitor::SemanticAnalysisVisitor::visit_protect_statement()'],['../classnmodl_1_1visitor_1_1_ast_visitor.html#a80c146002013ffab5687ca0d88b79d01',1,'nmodl::visitor::AstVisitor::visit_protect_statement()'],['../classnmodl_1_1visitor_1_1_const_ast_visitor.html#af2bdb091626313753da1b37c0938a551',1,'nmodl::visitor::ConstAstVisitor::visit_protect_statement()'],['../classnmodl_1_1visitor_1_1test_1_1_check_parent_visitor.html#aa49297003fb2be6b0b2a004a75b60bcd',1,'nmodl::visitor::test::CheckParentVisitor::visit_protect_statement()'],['../classnmodl_1_1visitor_1_1_j_s_o_n_visitor.html#a24a229814ae9975a730dcecc4108ee4d',1,'nmodl::visitor::JSONVisitor::visit_protect_statement()'],['../classnmodl_1_1visitor_1_1_meta_ast_lookup_visitor.html#a20252f5fcde8471e00b6fa37c578511a',1,'nmodl::visitor::MetaAstLookupVisitor::visit_protect_statement()'],['../classnmodl_1_1visitor_1_1_nmodl_print_visitor.html#a1328bf72643e9d7997310c8fae89d568',1,'nmodl::visitor::NmodlPrintVisitor::visit_protect_statement()'],['../classnmodl_1_1visitor_1_1_visitor.html#a716f9a007901ebe4bf3f7db75f5cde18',1,'nmodl::visitor::Visitor::visit_protect_statement()'],['../classnmodl_1_1visitor_1_1_const_visitor.html#a119508c14f86e906ef4da073b3a2ae1c',1,'nmodl::visitor::ConstVisitor::visit_protect_statement()']]], ['visit_5frandom_5fvar_4846',['visit_random_var',['../classnmodl_1_1visitor_1_1_ast_visitor.html#a932287c650e47a6332137003d58199e7',1,'nmodl::visitor::AstVisitor::visit_random_var()'],['../classnmodl_1_1visitor_1_1_const_ast_visitor.html#a52968a0544ab88a89d5e1a34be601362',1,'nmodl::visitor::ConstAstVisitor::visit_random_var()'],['../classnmodl_1_1visitor_1_1test_1_1_check_parent_visitor.html#a1069be85bcfd383c187f5baafc53dc02',1,'nmodl::visitor::test::CheckParentVisitor::visit_random_var()'],['../classnmodl_1_1visitor_1_1_j_s_o_n_visitor.html#ab9eec7147fc89240878f1887aca7f0b2',1,'nmodl::visitor::JSONVisitor::visit_random_var()'],['../classnmodl_1_1visitor_1_1_meta_ast_lookup_visitor.html#af0fc5059d8095fd033bc9a67a9468f90',1,'nmodl::visitor::MetaAstLookupVisitor::visit_random_var()'],['../classnmodl_1_1visitor_1_1_nmodl_print_visitor.html#a2c66042b3c545d8ece8d651cbbae820c',1,'nmodl::visitor::NmodlPrintVisitor::visit_random_var()'],['../classnmodl_1_1visitor_1_1_symtab_visitor.html#ade66693c6c4af9b3425b12ef701d7f72',1,'nmodl::visitor::SymtabVisitor::visit_random_var()'],['../classnmodl_1_1visitor_1_1_visitor.html#ac4c44775bd478be76e721114ac06ff0d',1,'nmodl::visitor::Visitor::visit_random_var()'],['../classnmodl_1_1visitor_1_1_const_visitor.html#a255202f2f1cc6e55c83e83cf993790b3',1,'nmodl::visitor::ConstVisitor::visit_random_var()']]], ['visit_5frandom_5fvar_5flist_4847',['visit_random_var_list',['../classnmodl_1_1visitor_1_1_ast_visitor.html#a0edd9895171e1844cc13a71d17287bd8',1,'nmodl::visitor::AstVisitor::visit_random_var_list()'],['../classnmodl_1_1visitor_1_1_const_ast_visitor.html#a0c5794d7de53f9518c0f7e8f4161074a',1,'nmodl::visitor::ConstAstVisitor::visit_random_var_list()'],['../classnmodl_1_1visitor_1_1test_1_1_check_parent_visitor.html#a76ffafc77197d6a0ef2cd309cd8b1af2',1,'nmodl::visitor::test::CheckParentVisitor::visit_random_var_list()'],['../classnmodl_1_1visitor_1_1_j_s_o_n_visitor.html#adbf6e2f3a3d70b73427d0f38974ba134',1,'nmodl::visitor::JSONVisitor::visit_random_var_list()'],['../classnmodl_1_1visitor_1_1_meta_ast_lookup_visitor.html#af2cb27d7479e27520b26ae63834c93f1',1,'nmodl::visitor::MetaAstLookupVisitor::visit_random_var_list()'],['../classnmodl_1_1visitor_1_1_nmodl_print_visitor.html#a1510be445462dbc8a12cf207cfa2ef29',1,'nmodl::visitor::NmodlPrintVisitor::visit_random_var_list()'],['../classnmodl_1_1visitor_1_1_visitor.html#a794f97f4ca5e20f987474a4d9ccd87f0',1,'nmodl::visitor::Visitor::visit_random_var_list()'],['../classnmodl_1_1visitor_1_1_const_visitor.html#a2afa31b56dca4d9442753f3782ae06eb',1,'nmodl::visitor::ConstVisitor::visit_random_var_list()']]], ['visit_5frange_4848',['visit_range',['../classnmodl_1_1visitor_1_1_ast_visitor.html#adf4af1a83254ec46a77cf75b99ca7074',1,'nmodl::visitor::AstVisitor::visit_range()'],['../classnmodl_1_1visitor_1_1_const_ast_visitor.html#a3bc7a69317a5c8afeb159288668a8514',1,'nmodl::visitor::ConstAstVisitor::visit_range()'],['../classnmodl_1_1visitor_1_1test_1_1_check_parent_visitor.html#a2bd8fe72f964e842c912934f1e4618e3',1,'nmodl::visitor::test::CheckParentVisitor::visit_range()'],['../classnmodl_1_1visitor_1_1_j_s_o_n_visitor.html#a905edf6300a9ee341e1f9544a8325d70',1,'nmodl::visitor::JSONVisitor::visit_range()'],['../classnmodl_1_1visitor_1_1_meta_ast_lookup_visitor.html#aecbf7e53de7d920ca0b49ceb34444e34',1,'nmodl::visitor::MetaAstLookupVisitor::visit_range()'],['../classnmodl_1_1visitor_1_1_nmodl_print_visitor.html#aa24128b174f683886061af8137419ff6',1,'nmodl::visitor::NmodlPrintVisitor::visit_range()'],['../classnmodl_1_1visitor_1_1_visitor.html#a00058fbb952a5b9ef3d6612f45dc11be',1,'nmodl::visitor::Visitor::visit_range()'],['../classnmodl_1_1visitor_1_1_const_visitor.html#a3dfb17955ecece7e3def3e9998d2f512',1,'nmodl::visitor::ConstVisitor::visit_range()']]], diff --git a/doxygen/search/functions_f.js b/doxygen/search/functions_f.js index 03e2e5b3c..c6126dec6 100644 --- a/doxygen/search/functions_f.js +++ b/doxygen/search/functions_f.js @@ -29,7 +29,7 @@ var searchData= ['primename_4285',['PrimeName',['../classnmodl_1_1ast_1_1_prime_name.html#a8ecdb7e25ec671b976b7825e7249d44b',1,'nmodl::ast::PrimeName::PrimeName(String *value, Integer *order)'],['../classnmodl_1_1ast_1_1_prime_name.html#a1a16a5c38df6e5faa9f3b4a578c1fefc',1,'nmodl::ast::PrimeName::PrimeName(std::shared_ptr< String > value, std::shared_ptr< Integer > order)'],['../classnmodl_1_1ast_1_1_prime_name.html#a300b83cc9e662d8055d4dc5561e20b94',1,'nmodl::ast::PrimeName::PrimeName(const PrimeName &obj)'],['../classnmodl_1_1ast_1_1_prime_name.html#a27ece66502c17fbc5b9c0737e0e07906',1,'nmodl::ast::PrimeName::PrimeName()=default']]], ['print_4286',['print',['../structnmodl_1_1parser_1_1diffeq_1_1_term.html#ad5f66bca40e51a0f57e9cc88e81578c9',1,'nmodl::parser::diffeq::Term::print()'],['../classnmodl_1_1parser_1_1diffeq_1_1_diff_eq_context.html#a5e9bc3675a3684322cf73d2f5f167e18',1,'nmodl::parser::diffeq::DiffEqContext::print()'],['../classnmodl_1_1symtab_1_1_symbol_table_1_1_table.html#a766d8ac1fe308e10f6b0d95f4a3beeb9',1,'nmodl::symtab::SymbolTable::Table::print()'],['../classnmodl_1_1symtab_1_1_symbol_table.html#a5132c3c8dfc5bdc6fe32cf99e26dfdf0',1,'nmodl::symtab::SymbolTable::print()'],['../classnmodl_1_1symtab_1_1_model_symbol_table.html#a459a9e4a03b6484f0f90132dad54ec97',1,'nmodl::symtab::ModelSymbolTable::print()'],['../structnmodl_1_1utils_1_1_perf_stat.html#a1ae5a6a039afaaef47fdc302ead7a413',1,'nmodl::utils::PerfStat::print()'],['../structnmodl_1_1utils_1_1_table_data.html#a62d93ed24adbe07a9f72ec732e176018',1,'nmodl::utils::TableData::print(int indent=0) const'],['../structnmodl_1_1utils_1_1_table_data.html#a407094b179280fe0fb5bdbae67155ed4',1,'nmodl::utils::TableData::print(std::ostream &stream, int indent=0) const'],['../classnmodl_1_1visitor_1_1_d_u_instance.html#a6222b51c51758122efabe6bc31d32198',1,'nmodl::visitor::DUInstance::print()'],['../classnmodl_1_1visitor_1_1_perf_visitor.html#a4bf6cfb238d3a3abcd6451336b2653e3',1,'nmodl::visitor::PerfVisitor::print()']]], ['print_5fabort_5froutine_4287',['print_abort_routine',['../classnmodl_1_1codegen_1_1_codegen_acc_visitor.html#a0afbe91263bad633cba874fd9c7b5af6',1,'nmodl::codegen::CodegenAccVisitor::print_abort_routine()'],['../classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#ab87a69ec67fe4d42df3cb0084c99dc85',1,'nmodl::codegen::CodegenCoreneuronCppVisitor::print_abort_routine()']]], - ['print_5fatomic_5freduction_5fpragma_4288',['print_atomic_reduction_pragma',['../classnmodl_1_1codegen_1_1_codegen_acc_visitor.html#af3e32e5cec32f5b55fa81a654bc4afef',1,'nmodl::codegen::CodegenAccVisitor::print_atomic_reduction_pragma()'],['../classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#a66833aede8ecc336b85129ca1e8b8b2e',1,'nmodl::codegen::CodegenCoreneuronCppVisitor::print_atomic_reduction_pragma()'],['../classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#a92bfb8a4daec705014f8e871fb0feacb',1,'nmodl::codegen::CodegenCppVisitor::print_atomic_reduction_pragma()'],['../classnmodl_1_1codegen_1_1_codegen_neuron_cpp_visitor.html#a910f9f22e6fbdae4eefae177eb8910f9',1,'nmodl::codegen::CodegenNeuronCppVisitor::print_atomic_reduction_pragma()']]], + ['print_5fatomic_5freduction_5fpragma_4288',['print_atomic_reduction_pragma',['../classnmodl_1_1codegen_1_1_codegen_acc_visitor.html#af3e32e5cec32f5b55fa81a654bc4afef',1,'nmodl::codegen::CodegenAccVisitor::print_atomic_reduction_pragma()'],['../classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#ab21de33c81f273ad3db2d5271221bcdc',1,'nmodl::codegen::CodegenCoreneuronCppVisitor::print_atomic_reduction_pragma()']]], ['print_5fbackend_5fincludes_4289',['print_backend_includes',['../classnmodl_1_1codegen_1_1_codegen_acc_visitor.html#a2a52b48b11fbf0757fb037d7e579daf3',1,'nmodl::codegen::CodegenAccVisitor::print_backend_includes()'],['../classnmodl_1_1codegen_1_1_codegen_coreneuron_cpp_visitor.html#abd6be1c541190358a512f0021ea82b16',1,'nmodl::codegen::CodegenCoreneuronCppVisitor::print_backend_includes()']]], ['print_5fbackend_5finfo_4290',['print_backend_info',['../classnmodl_1_1codegen_1_1_codegen_cpp_visitor.html#afc26a2583e8b283deae9944939788f79',1,'nmodl::codegen::CodegenCppVisitor']]], ['print_5fbase_5funits_4291',['print_base_units',['../classnmodl_1_1units_1_1_unit_table.html#a33c4d8277abb65e84cfcb9f53906bfbb',1,'nmodl::units::UnitTable']]], diff --git a/doxygen/src_2codegen_2codegen__coreneuron__cpp__visitor_8cpp_source.html b/doxygen/src_2codegen_2codegen__coreneuron__cpp__visitor_8cpp_source.html index e8710fec1..fbcd6511c 100644 --- a/doxygen/src_2codegen_2codegen__coreneuron__cpp__visitor_8cpp_source.html +++ b/doxygen/src_2codegen_2codegen__coreneuron__cpp__visitor_8cpp_source.html @@ -371,7 +371,7 @@
                    275  * only with PROTECT construct (atomic rduction requirement for other cases on CPU
                    276  * is handled via separate shadow vectors).
                    277  */
                    - +
                    279  printer->add_line("#pragma omp atomic update");
                    280 }
                    281 
                    @@ -3134,8 +3134,18 @@
                    3038  current_watch_statement++));
                    3039 }
                    3040 
                    -
                    3041 } // namespace codegen
                    -
                    3042 } // namespace nmodl
                    +
                    3041 
                    + +
                    3043  print_atomic_reduction_pragma();
                    +
                    3044  printer->add_indent();
                    +
                    3045  node.get_expression()->accept(*this);
                    +
                    3046  printer->add_text(";");
                    +
                    3047 }
                    +
                    3048 
                    +
                    3049 
                    +
                    3050 
                    +
                    3051 } // namespace codegen
                    +
                    3052 } // namespace nmodl
                    std::string get_node_name() const override
                    Return name of the node.
                    Definition: ast.cpp:7065
                    @@ -3161,6 +3171,7 @@
                    void print_v_unused() const override
                    Set v_unused (voltage) for NRN_PRCELLSTATE feature.
                    DUState
                    Represent a state in Def-Use chain.
                    void print_derivimplicit_kernel(const ast::Block &block)
                    Print derivative kernel when derivimplicit method is used.
                    +
                    void visit_protect_statement(const ast::ProtectStatement &node) override
                    visit node of type ast::ProtectStatement
                    virtual void print_device_stream_wait() const
                    Print the code to synchronise/wait on stream specific to NrnThread.
                    @ Destructor
                    destructor block
                    virtual void print_net_send_buf_count_update_to_device() const
                    Print the code to update NetSendBuffer_t count from host to device.
                    @@ -3209,7 +3220,6 @@
                    std::string name
                    name of the ion
                    static constexpr char NTHREAD_DT_VARIABLE[]
                    dt variable in neuron thread structure
                    Map different tokens from lexer to token types.
                    -
                    void print_atomic_reduction_pragma() override
                    Print atomic update pragma for reduction statements.
                    Check if variable is used in given block.
                    Implement string manipulation functions.
                    void print_global_variables_for_hoc() override
                    Print byte arrays that register scalar and vector variables for hoc interface.
                    @@ -3255,6 +3265,7 @@
                    Visitor for printing C++ code compatible with legacy api of CoreNEURON
                    static const std::unordered_map< std::string, std::string > VERBATIM_VARIABLES_MAPPING
                    commonly used variables in verbatim block and how they should be mapped to new code generation backen...
                    +
                    void print_ion_variable() override
                    Print the ion variable struct.
                    @ Constructor
                    constructor block
                    void print_ion_var_structure()
                    Print structure of ion variables used for local copies.
                    @@ -3355,11 +3366,13 @@
                    void print_codegen_routines() override
                    Print entry point to code generation.
                    +
                    virtual void print_atomic_reduction_pragma()
                    Print atomic update pragma for reduction statements.
                    static constexpr char THREAD_ARGS_PROTO[]
                    verbatim name of the variable for nrn thread arguments in prototype
                    @ BeforeAfter
                    before / after block
                    virtual void print_net_send_buffering_grow()
                    Print statement that grows NetSendBuffering_t structure if needed.
                    constexpr char NRN_PRIVATE_CONSTRUCTOR_METHOD[]
                    nrn_private_constructor method in generated code
                    virtual std::string get_node_name() const
                    Return name of of the node.
                    Definition: ast.cpp:28
                    +
                    std::shared_ptr< Expression > get_expression() const noexcept
                    Getter for member variable ProtectStatement::expression.
                    virtual void print_net_send_buf_update_to_host() const
                    Print the code to update NetSendBuffer_t from device to host.
                    Auto generated AST classes declaration.
                    void print_data_structures(bool print_initializers) override
                    Print all classes.
                    diff --git a/doxygen/src_2codegen_2codegen__neuron__cpp__visitor_8cpp_source.html b/doxygen/src_2codegen_2codegen__neuron__cpp__visitor_8cpp_source.html index 804a50ff9..185dda6a2 100644 --- a/doxygen/src_2codegen_2codegen__neuron__cpp__visitor_8cpp_source.html +++ b/doxygen/src_2codegen_2codegen__neuron__cpp__visitor_8cpp_source.html @@ -176,3093 +176,3087 @@
                    80 /* Backend specific routines */
                    81 /****************************************************************************************/
                    82 
                    -
                    83 
                    -
                    84 /// TODO: Edit for NEURON
                    - -
                    86  return;
                    -
                    87 }
                    -
                    88 
                    - -
                    90  if (optimize_ionvar_copies) {
                    -
                    91  throw std::runtime_error("Not implemented.");
                    -
                    92  }
                    -
                    93  return false;
                    -
                    94 }
                    + +
                    84  if (optimize_ionvar_copies) {
                    +
                    85  throw std::runtime_error("Not implemented.");
                    +
                    86  }
                    +
                    87  return false;
                    +
                    88 }
                    +
                    89 
                    +
                    90 
                    +
                    91 /****************************************************************************************/
                    +
                    92 /* Printing routines for code generation */
                    +
                    93 /****************************************************************************************/
                    +
                    94 
                    95 
                    -
                    96 
                    -
                    97 /****************************************************************************************/
                    -
                    98 /* Printing routines for code generation */
                    -
                    99 /****************************************************************************************/
                    -
                    100 
                    -
                    101 
                    - -
                    103  if (info.point_process) {
                    -
                    104  printer->add_multi_line(R"CODE(
                    -
                    105  /* Point Process specific functions */
                    -
                    106  static void* _hoc_create_pnt(Object* _ho) {
                    -
                    107  return create_point_process(_pointtype, _ho);
                    -
                    108  }
                    -
                    109  )CODE");
                    -
                    110  printer->push_block("static void _hoc_destroy_pnt(void* _vptr)");
                    -
                    111  if (info.is_watch_used() || info.for_netcon_used) {
                    -
                    112  printer->add_line("Prop* _prop = ((Point_process*)_vptr)->prop;");
                    -
                    113  printer->push_block("if (_prop)");
                    -
                    114  printer->add_line("Datum* _ppvar = _nrn_mechanism_access_dparam(_prop);");
                    -
                    115  if (info.is_watch_used()) {
                    -
                    116  printer->fmt_line("_nrn_free_watch(_ppvar, {}, {});",
                    -
                    117  info.watch_count,
                    -
                    118  info.is_watch_used());
                    -
                    119  }
                    -
                    120  if (info.for_netcon_used) {
                    -
                    121  auto fornetcon_data = get_variable_name("fornetcon_data", false);
                    -
                    122  printer->fmt_line("_nrn_free_fornetcon(&{});", fornetcon_data);
                    -
                    123  }
                    -
                    124  printer->pop_block();
                    -
                    125  }
                    -
                    126  printer->add_line("destroy_point_process(_vptr);");
                    -
                    127  printer->pop_block();
                    -
                    128  printer->add_multi_line(R"CODE(
                    -
                    129  static double _hoc_loc_pnt(void* _vptr) {
                    -
                    130  return loc_point_process(_pointtype, _vptr);
                    -
                    131  }
                    -
                    132 
                    -
                    133  static double _hoc_has_loc(void* _vptr) {
                    -
                    134  return has_loc_point(_vptr);
                    -
                    135  }
                    -
                    136 
                    -
                    137  static double _hoc_get_loc_pnt(void* _vptr) {
                    -
                    138  return (get_loc_point_process(_vptr));
                    -
                    139  }
                    -
                    140  )CODE");
                    -
                    141  }
                    -
                    142 }
                    -
                    143 
                    -
                    144 
                    - -
                    146  if (info.table_count == 0) {
                    -
                    147  return;
                    -
                    148  }
                    -
                    149 
                    -
                    150  // print declarations of `check_*` functions
                    -
                    151  for (const auto& function: info.functions_with_table) {
                    -
                    152  auto name = function->get_node_name();
                    -
                    153  auto internal_params = internal_method_parameters();
                    -
                    154  printer->fmt_line("void {}({});",
                    -
                    155  table_update_function_name(name),
                    -
                    156  get_parameter_str(internal_params));
                    -
                    157  }
                    -
                    158 
                    -
                    159  ParamVector args = {{"", "Memb_list*", "", "_ml"},
                    -
                    160  {"", "size_t", "", "id"},
                    -
                    161  {"", "Datum*", "", "_ppvar"},
                    -
                    162  {"", "Datum*", "", "_thread"},
                    -
                    163  {"", "double*", "", "_globals"},
                    -
                    164  {"", "NrnThread*", "", "nt"},
                    -
                    165  {"", "int", "", "_type"},
                    -
                    166  {"", "const _nrn_model_sorted_token&", "", "_sorted_token"}};
                    -
                    167 
                    -
                    168  // definition of `_check_table_thread` function
                    -
                    169  // signature must be same as the `nrn_thread_table_check_t` type
                    -
                    170  printer->fmt_line("static void {}({})", table_thread_function_name(), get_parameter_str(args));
                    -
                    171  printer->push_block();
                    -
                    172  printer->add_line("_nrn_mechanism_cache_range _lmc{_sorted_token, *nt, *_ml, _type};");
                    -
                    173  printer->fmt_line("auto inst = make_instance_{}(&_lmc);", info.mod_suffix);
                    -
                    174  if (!info.artificial_cell) {
                    -
                    175  printer->fmt_line("auto node_data = make_node_data_{}(*nt, *_ml);", info.mod_suffix);
                    -
                    176  }
                    -
                    177  if (!codegen_thread_variables.empty()) {
                    -
                    178  printer->fmt_line("auto _thread_vars = {}(_thread[{}].get<double*>());",
                    -
                    179  thread_variables_struct(),
                    -
                    180  info.thread_var_thread_id);
                    + +
                    97  if (info.point_process) {
                    +
                    98  printer->add_multi_line(R"CODE(
                    +
                    99  /* Point Process specific functions */
                    +
                    100  static void* _hoc_create_pnt(Object* _ho) {
                    +
                    101  return create_point_process(_pointtype, _ho);
                    +
                    102  }
                    +
                    103  )CODE");
                    +
                    104  printer->push_block("static void _hoc_destroy_pnt(void* _vptr)");
                    +
                    105  if (info.is_watch_used() || info.for_netcon_used) {
                    +
                    106  printer->add_line("Prop* _prop = ((Point_process*)_vptr)->prop;");
                    +
                    107  printer->push_block("if (_prop)");
                    +
                    108  printer->add_line("Datum* _ppvar = _nrn_mechanism_access_dparam(_prop);");
                    +
                    109  if (info.is_watch_used()) {
                    +
                    110  printer->fmt_line("_nrn_free_watch(_ppvar, {}, {});",
                    +
                    111  info.watch_count,
                    +
                    112  info.is_watch_used());
                    +
                    113  }
                    +
                    114  if (info.for_netcon_used) {
                    +
                    115  auto fornetcon_data = get_variable_name("fornetcon_data", false);
                    +
                    116  printer->fmt_line("_nrn_free_fornetcon(&{});", fornetcon_data);
                    +
                    117  }
                    +
                    118  printer->pop_block();
                    +
                    119  }
                    +
                    120  printer->add_line("destroy_point_process(_vptr);");
                    +
                    121  printer->pop_block();
                    +
                    122  printer->add_multi_line(R"CODE(
                    +
                    123  static double _hoc_loc_pnt(void* _vptr) {
                    +
                    124  return loc_point_process(_pointtype, _vptr);
                    +
                    125  }
                    +
                    126 
                    +
                    127  static double _hoc_has_loc(void* _vptr) {
                    +
                    128  return has_loc_point(_vptr);
                    +
                    129  }
                    +
                    130 
                    +
                    131  static double _hoc_get_loc_pnt(void* _vptr) {
                    +
                    132  return (get_loc_point_process(_vptr));
                    +
                    133  }
                    +
                    134  )CODE");
                    +
                    135  }
                    +
                    136 }
                    +
                    137 
                    +
                    138 
                    + +
                    140  if (info.table_count == 0) {
                    +
                    141  return;
                    +
                    142  }
                    +
                    143 
                    +
                    144  // print declarations of `check_*` functions
                    +
                    145  for (const auto& function: info.functions_with_table) {
                    +
                    146  auto name = function->get_node_name();
                    +
                    147  auto internal_params = internal_method_parameters();
                    +
                    148  printer->fmt_line("void {}({});",
                    +
                    149  table_update_function_name(name),
                    +
                    150  get_parameter_str(internal_params));
                    +
                    151  }
                    +
                    152 
                    +
                    153  ParamVector args = {{"", "Memb_list*", "", "_ml"},
                    +
                    154  {"", "size_t", "", "id"},
                    +
                    155  {"", "Datum*", "", "_ppvar"},
                    +
                    156  {"", "Datum*", "", "_thread"},
                    +
                    157  {"", "double*", "", "_globals"},
                    +
                    158  {"", "NrnThread*", "", "nt"},
                    +
                    159  {"", "int", "", "_type"},
                    +
                    160  {"", "const _nrn_model_sorted_token&", "", "_sorted_token"}};
                    +
                    161 
                    +
                    162  // definition of `_check_table_thread` function
                    +
                    163  // signature must be same as the `nrn_thread_table_check_t` type
                    +
                    164  printer->fmt_line("static void {}({})", table_thread_function_name(), get_parameter_str(args));
                    +
                    165  printer->push_block();
                    +
                    166  printer->add_line("_nrn_mechanism_cache_range _lmc{_sorted_token, *nt, *_ml, _type};");
                    +
                    167  printer->fmt_line("auto inst = make_instance_{}(&_lmc);", info.mod_suffix);
                    +
                    168  if (!info.artificial_cell) {
                    +
                    169  printer->fmt_line("auto node_data = make_node_data_{}(*nt, *_ml);", info.mod_suffix);
                    +
                    170  }
                    +
                    171  if (!codegen_thread_variables.empty()) {
                    +
                    172  printer->fmt_line("auto _thread_vars = {}(_thread[{}].get<double*>());",
                    +
                    173  thread_variables_struct(),
                    +
                    174  info.thread_var_thread_id);
                    +
                    175  }
                    +
                    176 
                    +
                    177  for (const auto& function: info.functions_with_table) {
                    +
                    178  auto method_name = function->get_node_name();
                    +
                    179  auto method_args = get_arg_str(internal_method_parameters());
                    +
                    180  printer->fmt_line("{}({});", table_update_function_name(method_name), method_args);
                    181  }
                    -
                    182 
                    -
                    183  for (const auto& function: info.functions_with_table) {
                    -
                    184  auto method_name = function->get_node_name();
                    -
                    185  auto method_args = get_arg_str(internal_method_parameters());
                    -
                    186  printer->fmt_line("{}({});", table_update_function_name(method_name), method_args);
                    -
                    187  }
                    -
                    188  printer->pop_block();
                    -
                    189 }
                    -
                    190 
                    -
                    191 
                    - -
                    193  printer->add_line("/* Neuron setdata functions */");
                    -
                    194  printer->add_line("extern void _nrn_setdata_reg(int, void(*)(Prop*));");
                    -
                    195  printer->push_block("static void _setdata(Prop* _prop)");
                    -
                    196  if (!info.point_process) {
                    -
                    197  printer->add_multi_line(R"CODE(
                    -
                    198  _extcall_prop = _prop;
                    -
                    199  _prop_id = _nrn_get_prop_id(_prop);
                    -
                    200  )CODE");
                    -
                    201  }
                    -
                    202  printer->pop_block();
                    -
                    203 
                    -
                    204  if (info.point_process) {
                    -
                    205  printer->push_block("static void _hoc_setdata(void* _vptr)");
                    -
                    206  printer->add_multi_line(R"CODE(
                    -
                    207  Prop* _prop;
                    -
                    208  _prop = ((Point_process*)_vptr)->prop;
                    +
                    182  printer->pop_block();
                    +
                    183 }
                    +
                    184 
                    +
                    185 
                    + +
                    187  printer->add_line("/* Neuron setdata functions */");
                    +
                    188  printer->add_line("extern void _nrn_setdata_reg(int, void(*)(Prop*));");
                    +
                    189  printer->push_block("static void _setdata(Prop* _prop)");
                    +
                    190  if (!info.point_process) {
                    +
                    191  printer->add_multi_line(R"CODE(
                    +
                    192  _extcall_prop = _prop;
                    +
                    193  _prop_id = _nrn_get_prop_id(_prop);
                    +
                    194  )CODE");
                    +
                    195  }
                    +
                    196  printer->pop_block();
                    +
                    197 
                    +
                    198  if (info.point_process) {
                    +
                    199  printer->push_block("static void _hoc_setdata(void* _vptr)");
                    +
                    200  printer->add_multi_line(R"CODE(
                    +
                    201  Prop* _prop;
                    +
                    202  _prop = ((Point_process*)_vptr)->prop;
                    +
                    203  _setdata(_prop);
                    +
                    204  )CODE");
                    +
                    205  } else {
                    +
                    206  printer->push_block("static void _hoc_setdata()");
                    +
                    207  printer->add_multi_line(R"CODE(
                    +
                    208  Prop *_prop = hoc_getdata_range(mech_type);
                    209  _setdata(_prop);
                    -
                    210  )CODE");
                    -
                    211  } else {
                    -
                    212  printer->push_block("static void _hoc_setdata()");
                    -
                    213  printer->add_multi_line(R"CODE(
                    -
                    214  Prop *_prop = hoc_getdata_range(mech_type);
                    -
                    215  _setdata(_prop);
                    -
                    216  hoc_retpushx(1.);
                    -
                    217  )CODE");
                    -
                    218  }
                    -
                    219  printer->pop_block();
                    -
                    220 }
                    -
                    221 
                    -
                    222 
                    - -
                    224  printer->add_newline(2);
                    -
                    225 
                    -
                    226  auto print_decl = [this](const auto& callables) {
                    -
                    227  for (const auto& node: callables) {
                    -
                    228  print_function_declaration(*node, node->get_node_name());
                    -
                    229  printer->add_text(';');
                    -
                    230  printer->add_newline();
                    -
                    231  }
                    -
                    232  };
                    -
                    233 
                    -
                    234  printer->add_line("/* Mechanism procedures and functions */");
                    -
                    235  print_decl(info.functions);
                    -
                    236  print_decl(info.procedures);
                    -
                    237 
                    -
                    238  for (const auto& node: info.function_tables) {
                    -
                    239  auto [params, table_params] = function_table_parameters(*node);
                    -
                    240  printer->fmt_line("double {}({});",
                    -
                    241  method_name(node->get_node_name()),
                    -
                    242  get_parameter_str(params));
                    -
                    243  printer->fmt_line("double {}({});",
                    -
                    244  method_name("table_" + node->get_node_name()),
                    -
                    245  get_parameter_str(table_params));
                    -
                    246  }
                    -
                    247 }
                    -
                    248 
                    -
                    249 
                    - -
                    251  const ast::Block& node,
                    -
                    252  const std::string& name,
                    -
                    253  const std::unordered_set<CppObjectSpecifier>& specifiers) {
                    -
                    254  printer->add_newline(2);
                    -
                    255  print_function_declaration(node, name, specifiers);
                    -
                    256  printer->add_text(" ");
                    -
                    257  printer->push_block();
                    -
                    258 
                    -
                    259  // function requires return variable declaration
                    -
                    260  if (node.is_function_block()) {
                    -
                    261  auto type = default_float_data_type();
                    -
                    262  printer->fmt_line("{} ret_{} = 0.0;", type, name);
                    -
                    263  } else {
                    -
                    264  printer->fmt_line("int ret_{} = 0;", name);
                    +
                    210  hoc_retpushx(1.);
                    +
                    211  )CODE");
                    +
                    212  }
                    +
                    213  printer->pop_block();
                    +
                    214 }
                    +
                    215 
                    +
                    216 
                    + +
                    218  printer->add_newline(2);
                    +
                    219 
                    +
                    220  auto print_decl = [this](const auto& callables) {
                    +
                    221  for (const auto& node: callables) {
                    +
                    222  print_function_declaration(*node, node->get_node_name());
                    +
                    223  printer->add_text(';');
                    +
                    224  printer->add_newline();
                    +
                    225  }
                    +
                    226  };
                    +
                    227 
                    +
                    228  printer->add_line("/* Mechanism procedures and functions */");
                    +
                    229  print_decl(info.functions);
                    +
                    230  print_decl(info.procedures);
                    +
                    231 
                    +
                    232  for (const auto& node: info.function_tables) {
                    +
                    233  auto [params, table_params] = function_table_parameters(*node);
                    +
                    234  printer->fmt_line("double {}({});",
                    +
                    235  method_name(node->get_node_name()),
                    +
                    236  get_parameter_str(params));
                    +
                    237  printer->fmt_line("double {}({});",
                    +
                    238  method_name("table_" + node->get_node_name()),
                    +
                    239  get_parameter_str(table_params));
                    +
                    240  }
                    +
                    241 }
                    +
                    242 
                    +
                    243 
                    + +
                    245  const ast::Block& node,
                    +
                    246  const std::string& name,
                    +
                    247  const std::unordered_set<CppObjectSpecifier>& specifiers) {
                    +
                    248  printer->add_newline(2);
                    +
                    249  print_function_declaration(node, name, specifiers);
                    +
                    250  printer->add_text(" ");
                    +
                    251  printer->push_block();
                    +
                    252 
                    +
                    253  // function requires return variable declaration
                    +
                    254  if (node.is_function_block()) {
                    +
                    255  auto type = default_float_data_type();
                    +
                    256  printer->fmt_line("{} ret_{} = 0.0;", type, name);
                    +
                    257  } else {
                    +
                    258  printer->fmt_line("int ret_{} = 0;", name);
                    +
                    259  }
                    +
                    260 
                    +
                    261  if (info.mod_suffix != "nothing" && !info.artificial_cell) {
                    +
                    262  printer->add_line(
                    +
                    263  "double v = node_data.node_voltages ? "
                    +
                    264  "node_data.node_voltages[node_data.nodeindices[id]] : 0.0;");
                    265  }
                    266 
                    -
                    267  if (info.mod_suffix != "nothing" && !info.artificial_cell) {
                    -
                    268  printer->add_line(
                    -
                    269  "double v = node_data.node_voltages ? "
                    -
                    270  "node_data.node_voltages[node_data.nodeindices[id]] : 0.0;");
                    -
                    271  }
                    +
                    267  print_statement_block(*node.get_statement_block(), false, false);
                    +
                    268  printer->fmt_line("return ret_{};", name);
                    +
                    269  printer->pop_block();
                    +
                    270 }
                    +
                    271 
                    272 
                    -
                    273  print_statement_block(*node.get_statement_block(), false, false);
                    -
                    274  printer->fmt_line("return ret_{};", name);
                    -
                    275  printer->pop_block();
                    -
                    276 }
                    -
                    277 
                    -
                    278 
                    - -
                    280  auto name = node.get_node_name();
                    -
                    281  if (info.function_uses_table(name)) {
                    -
                    282  auto new_name = "f_" + name;
                    -
                    283  print_function_or_procedure(node,
                    -
                    284  new_name,
                    - -
                    286  print_table_check_function(node);
                    -
                    287  print_table_replacement_function(node);
                    -
                    288  } else {
                    -
                    289  print_function_or_procedure(node, name);
                    -
                    290  }
                    -
                    291 }
                    -
                    292 
                    - -
                    294  const ast::Block* function_or_procedure_block,
                    -
                    295  InterpreterWrapper wrapper_type) {
                    -
                    296  const auto block_name = function_or_procedure_block->get_node_name();
                    -
                    297 
                    -
                    298  const auto get_func_call_str = [&]() {
                    -
                    299  const auto& params = function_or_procedure_block->get_parameters();
                    -
                    300  const auto func_proc_name = block_name + "_" + info.mod_suffix;
                    -
                    301  std::vector<std::string> args;
                    -
                    302  args.reserve(params.size());
                    -
                    303  for (int i = 0; i < params.size(); ++i) {
                    -
                    304  args.push_back(fmt::format("*getarg({})", i + 1));
                    -
                    305  }
                    -
                    306 
                    -
                    307  auto internal_args = internal_method_arguments();
                    -
                    308  return fmt::format("{}({})",
                    -
                    309  func_proc_name,
                    -
                    310  stringutils::join_arguments(internal_args,
                    -
                    311  fmt::format("{}", fmt::join(args, ", "))));
                    -
                    312  };
                    -
                    313 
                    -
                    314  printer->add_line("double _r = 0.0;");
                    -
                    315  if (function_or_procedure_block->is_function_block()) {
                    -
                    316  printer->add_indent();
                    -
                    317  printer->fmt_text("_r = {};", get_func_call_str());
                    -
                    318  printer->add_newline();
                    -
                    319  } else {
                    -
                    320  printer->add_line("_r = 1.;");
                    -
                    321  printer->fmt_line("{};", get_func_call_str());
                    -
                    322  }
                    -
                    323  if (info.point_process || wrapper_type != InterpreterWrapper::HOC) {
                    -
                    324  printer->add_line("return(_r);");
                    -
                    325  } else if (wrapper_type == InterpreterWrapper::HOC) {
                    -
                    326  printer->add_line("hoc_retpushx(_r);");
                    -
                    327  }
                    -
                    328 }
                    -
                    329 
                    - -
                    331  const ast::Block* function_or_procedure_block,
                    -
                    332  InterpreterWrapper wrapper_type) {
                    -
                    333  if (info.mod_suffix == "nothing") {
                    -
                    334  return;
                    -
                    335  }
                    -
                    336 
                    -
                    337  const auto block_name = function_or_procedure_block->get_node_name();
                    -
                    338  printer->add_multi_line(R"CODE(
                    -
                    339  Datum* _ppvar;
                    -
                    340  Datum* _thread;
                    -
                    341  NrnThread* nt;
                    -
                    342  )CODE");
                    -
                    343 
                    -
                    344  std::string prop_name;
                    -
                    345  if (info.point_process) {
                    -
                    346  printer->add_multi_line(R"CODE(
                    -
                    347  auto* const _pnt = static_cast<Point_process*>(_vptr);
                    -
                    348  auto* const _p = _pnt->prop;
                    -
                    349  if (!_p) {
                    -
                    350  hoc_execerror("POINT_PROCESS data instance not valid", nullptr);
                    -
                    351  }
                    -
                    352  _nrn_mechanism_cache_instance _lmc{_p};
                    -
                    353  size_t const id{};
                    -
                    354  _ppvar = _nrn_mechanism_access_dparam(_p);
                    -
                    355  _thread = _extcall_thread.data();
                    -
                    356  nt = static_cast<NrnThread*>(_pnt->_vnt);
                    -
                    357  )CODE");
                    -
                    358 
                    -
                    359  prop_name = "_p";
                    -
                    360  } else if (wrapper_type == InterpreterWrapper::HOC) {
                    -
                    361  if (program_symtab->lookup(block_name)->has_all_properties(NmodlType::use_range_ptr_var)) {
                    -
                    362  printer->push_block("if (!_prop_id)");
                    -
                    363  printer->fmt_line(
                    -
                    364  "hoc_execerror(\"No data for {}_{}. Requires prior call to setdata_{} and that the "
                    -
                    365  "specified mechanism instance still be in existence.\", nullptr);",
                    -
                    366  function_or_procedure_block->get_node_name(),
                    -
                    367  info.mod_suffix,
                    -
                    368  info.mod_suffix);
                    -
                    369  printer->pop_block();
                    -
                    370  printer->add_line("Prop* _local_prop = _extcall_prop;");
                    -
                    371  } else {
                    -
                    372  printer->add_line("Prop* _local_prop = _prop_id ? _extcall_prop : nullptr;");
                    -
                    373  }
                    -
                    374  printer->add_multi_line(R"CODE(
                    -
                    375  _nrn_mechanism_cache_instance _lmc{_local_prop};
                    -
                    376  size_t const id{};
                    -
                    377  _ppvar = _local_prop ? _nrn_mechanism_access_dparam(_local_prop) : nullptr;
                    -
                    378  _thread = _extcall_thread.data();
                    -
                    379  nt = nrn_threads;
                    -
                    380  )CODE");
                    -
                    381  prop_name = "_local_prop";
                    -
                    382  } else { // wrapper_type == InterpreterWrapper::Python
                    -
                    383  printer->add_multi_line(R"CODE(
                    -
                    384  _nrn_mechanism_cache_instance _lmc{_prop};
                    -
                    385  size_t const id = 0;
                    -
                    386  _ppvar = _nrn_mechanism_access_dparam(_prop);
                    -
                    387  _thread = _extcall_thread.data();
                    -
                    388  nt = nrn_threads;
                    -
                    389  )CODE");
                    -
                    390  prop_name = "_prop";
                    -
                    391  }
                    -
                    392 
                    -
                    393  printer->fmt_line("auto inst = make_instance_{}({} ? &_lmc : nullptr);",
                    -
                    394  info.mod_suffix,
                    -
                    395  prop_name);
                    -
                    396  if (!info.artificial_cell) {
                    -
                    397  printer->fmt_line("auto node_data = make_node_data_{}({});", info.mod_suffix, prop_name);
                    -
                    398  }
                    -
                    399  if (!codegen_thread_variables.empty()) {
                    -
                    400  printer->fmt_line("auto _thread_vars = {}(_thread[{}].get<double*>());",
                    -
                    401  thread_variables_struct(),
                    -
                    402  info.thread_var_thread_id);
                    -
                    403  }
                    -
                    404  if (info.function_uses_table(block_name)) {
                    -
                    405  printer->fmt_line("{}({});",
                    -
                    406  table_update_function_name(block_name),
                    -
                    407  internal_method_arguments());
                    -
                    408  }
                    -
                    409 }
                    -
                    410 
                    -
                    411 
                    - -
                    413  const ast::Block* function_or_procedure_block,
                    -
                    414  InterpreterWrapper wrapper_type) {
                    -
                    415  const auto block_name = function_or_procedure_block->get_node_name();
                    -
                    416  if (wrapper_type == InterpreterWrapper::HOC) {
                    -
                    417  return hoc_function_signature(block_name);
                    -
                    418  } else {
                    -
                    419  return py_function_signature(block_name);
                    -
                    420  }
                    -
                    421 }
                    + +
                    274  auto name = node.get_node_name();
                    +
                    275  if (info.function_uses_table(name)) {
                    +
                    276  auto new_name = "f_" + name;
                    +
                    277  print_function_or_procedure(node,
                    +
                    278  new_name,
                    + +
                    280  print_table_check_function(node);
                    +
                    281  print_table_replacement_function(node);
                    +
                    282  } else {
                    +
                    283  print_function_or_procedure(node, name);
                    +
                    284  }
                    +
                    285 }
                    +
                    286 
                    + +
                    288  const ast::Block* function_or_procedure_block,
                    +
                    289  InterpreterWrapper wrapper_type) {
                    +
                    290  const auto block_name = function_or_procedure_block->get_node_name();
                    +
                    291 
                    +
                    292  const auto get_func_call_str = [&]() {
                    +
                    293  const auto& params = function_or_procedure_block->get_parameters();
                    +
                    294  const auto func_proc_name = block_name + "_" + info.mod_suffix;
                    +
                    295  std::vector<std::string> args;
                    +
                    296  args.reserve(params.size());
                    +
                    297  for (int i = 0; i < params.size(); ++i) {
                    +
                    298  args.push_back(fmt::format("*getarg({})", i + 1));
                    +
                    299  }
                    +
                    300 
                    +
                    301  auto internal_args = internal_method_arguments();
                    +
                    302  return fmt::format("{}({})",
                    +
                    303  func_proc_name,
                    +
                    304  stringutils::join_arguments(internal_args,
                    +
                    305  fmt::format("{}", fmt::join(args, ", "))));
                    +
                    306  };
                    +
                    307 
                    +
                    308  printer->add_line("double _r = 0.0;");
                    +
                    309  if (function_or_procedure_block->is_function_block()) {
                    +
                    310  printer->add_indent();
                    +
                    311  printer->fmt_text("_r = {};", get_func_call_str());
                    +
                    312  printer->add_newline();
                    +
                    313  } else {
                    +
                    314  printer->add_line("_r = 1.;");
                    +
                    315  printer->fmt_line("{};", get_func_call_str());
                    +
                    316  }
                    +
                    317  if (info.point_process || wrapper_type != InterpreterWrapper::HOC) {
                    +
                    318  printer->add_line("return(_r);");
                    +
                    319  } else if (wrapper_type == InterpreterWrapper::HOC) {
                    +
                    320  printer->add_line("hoc_retpushx(_r);");
                    +
                    321  }
                    +
                    322 }
                    +
                    323 
                    + +
                    325  const ast::Block* function_or_procedure_block,
                    +
                    326  InterpreterWrapper wrapper_type) {
                    +
                    327  if (info.mod_suffix == "nothing") {
                    +
                    328  return;
                    +
                    329  }
                    +
                    330 
                    +
                    331  const auto block_name = function_or_procedure_block->get_node_name();
                    +
                    332  printer->add_multi_line(R"CODE(
                    +
                    333  Datum* _ppvar;
                    +
                    334  Datum* _thread;
                    +
                    335  NrnThread* nt;
                    +
                    336  )CODE");
                    +
                    337 
                    +
                    338  std::string prop_name;
                    +
                    339  if (info.point_process) {
                    +
                    340  printer->add_multi_line(R"CODE(
                    +
                    341  auto* const _pnt = static_cast<Point_process*>(_vptr);
                    +
                    342  auto* const _p = _pnt->prop;
                    +
                    343  if (!_p) {
                    +
                    344  hoc_execerror("POINT_PROCESS data instance not valid", nullptr);
                    +
                    345  }
                    +
                    346  _nrn_mechanism_cache_instance _lmc{_p};
                    +
                    347  size_t const id{};
                    +
                    348  _ppvar = _nrn_mechanism_access_dparam(_p);
                    +
                    349  _thread = _extcall_thread.data();
                    +
                    350  nt = static_cast<NrnThread*>(_pnt->_vnt);
                    +
                    351  )CODE");
                    +
                    352 
                    +
                    353  prop_name = "_p";
                    +
                    354  } else if (wrapper_type == InterpreterWrapper::HOC) {
                    +
                    355  if (program_symtab->lookup(block_name)->has_all_properties(NmodlType::use_range_ptr_var)) {
                    +
                    356  printer->push_block("if (!_prop_id)");
                    +
                    357  printer->fmt_line(
                    +
                    358  "hoc_execerror(\"No data for {}_{}. Requires prior call to setdata_{} and that the "
                    +
                    359  "specified mechanism instance still be in existence.\", nullptr);",
                    +
                    360  function_or_procedure_block->get_node_name(),
                    +
                    361  info.mod_suffix,
                    +
                    362  info.mod_suffix);
                    +
                    363  printer->pop_block();
                    +
                    364  printer->add_line("Prop* _local_prop = _extcall_prop;");
                    +
                    365  } else {
                    +
                    366  printer->add_line("Prop* _local_prop = _prop_id ? _extcall_prop : nullptr;");
                    +
                    367  }
                    +
                    368  printer->add_multi_line(R"CODE(
                    +
                    369  _nrn_mechanism_cache_instance _lmc{_local_prop};
                    +
                    370  size_t const id{};
                    +
                    371  _ppvar = _local_prop ? _nrn_mechanism_access_dparam(_local_prop) : nullptr;
                    +
                    372  _thread = _extcall_thread.data();
                    +
                    373  nt = nrn_threads;
                    +
                    374  )CODE");
                    +
                    375  prop_name = "_local_prop";
                    +
                    376  } else { // wrapper_type == InterpreterWrapper::Python
                    +
                    377  printer->add_multi_line(R"CODE(
                    +
                    378  _nrn_mechanism_cache_instance _lmc{_prop};
                    +
                    379  size_t const id = 0;
                    +
                    380  _ppvar = _nrn_mechanism_access_dparam(_prop);
                    +
                    381  _thread = _extcall_thread.data();
                    +
                    382  nt = nrn_threads;
                    +
                    383  )CODE");
                    +
                    384  prop_name = "_prop";
                    +
                    385  }
                    +
                    386 
                    +
                    387  printer->fmt_line("auto inst = make_instance_{}({} ? &_lmc : nullptr);",
                    +
                    388  info.mod_suffix,
                    +
                    389  prop_name);
                    +
                    390  if (!info.artificial_cell) {
                    +
                    391  printer->fmt_line("auto node_data = make_node_data_{}({});", info.mod_suffix, prop_name);
                    +
                    392  }
                    +
                    393  if (!codegen_thread_variables.empty()) {
                    +
                    394  printer->fmt_line("auto _thread_vars = {}(_thread[{}].get<double*>());",
                    +
                    395  thread_variables_struct(),
                    +
                    396  info.thread_var_thread_id);
                    +
                    397  }
                    +
                    398  if (info.function_uses_table(block_name)) {
                    +
                    399  printer->fmt_line("{}({});",
                    +
                    400  table_update_function_name(block_name),
                    +
                    401  internal_method_arguments());
                    +
                    402  }
                    +
                    403 }
                    +
                    404 
                    +
                    405 
                    + +
                    407  const ast::Block* function_or_procedure_block,
                    +
                    408  InterpreterWrapper wrapper_type) {
                    +
                    409  const auto block_name = function_or_procedure_block->get_node_name();
                    +
                    410  if (wrapper_type == InterpreterWrapper::HOC) {
                    +
                    411  return hoc_function_signature(block_name);
                    +
                    412  } else {
                    +
                    413  return py_function_signature(block_name);
                    +
                    414  }
                    +
                    415 }
                    +
                    416 
                    +
                    417 void CodegenNeuronCppVisitor::print_hoc_py_wrapper(const ast::Block* function_or_procedure_block,
                    +
                    418  InterpreterWrapper wrapper_type) {
                    +
                    419  if (info.point_process && wrapper_type == InterpreterWrapper::Python) {
                    +
                    420  return;
                    +
                    421  }
                    422 
                    -
                    423 void CodegenNeuronCppVisitor::print_hoc_py_wrapper(const ast::Block* function_or_procedure_block,
                    -
                    424  InterpreterWrapper wrapper_type) {
                    -
                    425  if (info.point_process && wrapper_type == InterpreterWrapper::Python) {
                    -
                    426  return;
                    -
                    427  }
                    -
                    428 
                    -
                    429  printer->push_block(hoc_py_wrapper_signature(function_or_procedure_block, wrapper_type));
                    +
                    423  printer->push_block(hoc_py_wrapper_signature(function_or_procedure_block, wrapper_type));
                    +
                    424 
                    +
                    425  print_hoc_py_wrapper_setup(function_or_procedure_block, wrapper_type);
                    +
                    426  print_hoc_py_wrapper_call_impl(function_or_procedure_block, wrapper_type);
                    +
                    427 
                    +
                    428  printer->pop_block();
                    +
                    429 }
                    430 
                    -
                    431  print_hoc_py_wrapper_setup(function_or_procedure_block, wrapper_type);
                    -
                    432  print_hoc_py_wrapper_call_impl(function_or_procedure_block, wrapper_type);
                    -
                    433 
                    -
                    434  printer->pop_block();
                    -
                    435 }
                    -
                    436 
                    -
                    437 
                    - -
                    439  auto print_wrappers = [this](const auto& callables) {
                    -
                    440  for (const auto& callable: callables) {
                    -
                    441  print_hoc_py_wrapper(callable, InterpreterWrapper::HOC);
                    -
                    442  print_hoc_py_wrapper(callable, InterpreterWrapper::Python);
                    -
                    443  }
                    -
                    444  };
                    -
                    445 
                    -
                    446  print_wrappers(info.procedures);
                    -
                    447  print_wrappers(info.functions);
                    -
                    448 
                    -
                    449  for (const auto& node: info.function_tables) {
                    -
                    450  auto name = node->get_node_name();
                    -
                    451  auto table_name = "table_" + node->get_node_name();
                    +
                    431 
                    + +
                    433  auto print_wrappers = [this](const auto& callables) {
                    +
                    434  for (const auto& callable: callables) {
                    +
                    435  print_hoc_py_wrapper(callable, InterpreterWrapper::HOC);
                    +
                    436  print_hoc_py_wrapper(callable, InterpreterWrapper::Python);
                    +
                    437  }
                    +
                    438  };
                    +
                    439 
                    +
                    440  print_wrappers(info.procedures);
                    +
                    441  print_wrappers(info.functions);
                    +
                    442 
                    +
                    443  for (const auto& node: info.function_tables) {
                    +
                    444  auto name = node->get_node_name();
                    +
                    445  auto table_name = "table_" + node->get_node_name();
                    +
                    446 
                    +
                    447 
                    +
                    448  auto args = std::vector<std::string>{};
                    +
                    449  for (size_t i = 0; i < node->get_parameters().size(); ++i) {
                    +
                    450  args.push_back(fmt::format("*getarg({})", i + 1));
                    +
                    451  }
                    452 
                    -
                    453 
                    -
                    454  auto args = std::vector<std::string>{};
                    -
                    455  for (size_t i = 0; i < node->get_parameters().size(); ++i) {
                    -
                    456  args.push_back(fmt::format("*getarg({})", i + 1));
                    -
                    457  }
                    -
                    458 
                    -
                    459  // HOC
                    -
                    460  std::string return_statement = info.point_process ? "return _ret;" : "hoc_retpushx(_ret);";
                    -
                    461 
                    -
                    462  printer->fmt_push_block("{}", hoc_function_signature(name));
                    -
                    463  printer->fmt_line("double _ret = {}({});", method_name(name), fmt::join(args, ", "));
                    -
                    464  printer->add_line(return_statement);
                    -
                    465  printer->pop_block();
                    -
                    466 
                    -
                    467  printer->fmt_push_block("{}", hoc_function_signature(table_name));
                    -
                    468  printer->fmt_line("double _ret = {}();", method_name(table_name));
                    -
                    469  printer->add_line(return_statement);
                    -
                    470  printer->pop_block();
                    -
                    471 
                    -
                    472  // Python
                    -
                    473  printer->fmt_push_block("{}", py_function_signature(name));
                    -
                    474  printer->fmt_line("return {}({});", method_name(name), fmt::join(args, ", "));
                    -
                    475  printer->pop_block();
                    +
                    453  // HOC
                    +
                    454  std::string return_statement = info.point_process ? "return _ret;" : "hoc_retpushx(_ret);";
                    +
                    455 
                    +
                    456  printer->fmt_push_block("{}", hoc_function_signature(name));
                    +
                    457  printer->fmt_line("double _ret = {}({});", method_name(name), fmt::join(args, ", "));
                    +
                    458  printer->add_line(return_statement);
                    +
                    459  printer->pop_block();
                    +
                    460 
                    +
                    461  printer->fmt_push_block("{}", hoc_function_signature(table_name));
                    +
                    462  printer->fmt_line("double _ret = {}();", method_name(table_name));
                    +
                    463  printer->add_line(return_statement);
                    +
                    464  printer->pop_block();
                    +
                    465 
                    +
                    466  // Python
                    +
                    467  printer->fmt_push_block("{}", py_function_signature(name));
                    +
                    468  printer->fmt_line("return {}({});", method_name(name), fmt::join(args, ", "));
                    +
                    469  printer->pop_block();
                    +
                    470 
                    +
                    471  printer->fmt_push_block("{}", py_function_signature(table_name));
                    +
                    472  printer->fmt_line("return {}();", method_name(table_name));
                    +
                    473  printer->pop_block();
                    +
                    474  }
                    +
                    475 }
                    476 
                    -
                    477  printer->fmt_push_block("{}", py_function_signature(table_name));
                    -
                    478  printer->fmt_line("return {}();", method_name(table_name));
                    -
                    479  printer->pop_block();
                    -
                    480  }
                    + +
                    478  return ParamVector{{"", "ldifusfunc2_t", "", "_f"},
                    +
                    479  {"", "const _nrn_model_sorted_token&", "", "_sorted_token"},
                    +
                    480  {"", "NrnThread&", "", "_nt"}};
                    481 }
                    482 
                    - -
                    484  return ParamVector{{"", "ldifusfunc2_t", "", "_f"},
                    -
                    485  {"", "const _nrn_model_sorted_token&", "", "_sorted_token"},
                    -
                    486  {"", "NrnThread&", "", "_nt"}};
                    -
                    487 }
                    -
                    488 
                    -
                    489 
                    - -
                    491  return ParamVector{{"", "int", "", "_i"},
                    -
                    492  {"", "Memb_list*", "", "_ml_arg"},
                    -
                    493  {"", "size_t", "", "id"},
                    -
                    494  {"", "Datum*", "", "_ppvar"},
                    -
                    495  {"", "double*", "", "_pdvol"},
                    -
                    496  {"", "double*", "", "_pdfcdc"},
                    -
                    497  {"", "Datum*", "", "/* _thread */"},
                    -
                    498  {"", "NrnThread*", "", "nt"},
                    -
                    499  {"", "const _nrn_model_sorted_token&", "", "_sorted_token"}};
                    -
                    500 }
                    -
                    501 
                    - -
                    503  auto coeff_callback_name = [](const std::string& var_name) {
                    -
                    504  return fmt::format("_diffusion_coefficient_{}", var_name);
                    -
                    505  };
                    -
                    506 
                    -
                    507  auto space_name = [](const std::string& var_name) {
                    -
                    508  return fmt::format("_diffusion_space_{}", var_name);
                    -
                    509  };
                    +
                    483 
                    + +
                    485  return ParamVector{{"", "int", "", "_i"},
                    +
                    486  {"", "Memb_list*", "", "_ml_arg"},
                    +
                    487  {"", "size_t", "", "id"},
                    +
                    488  {"", "Datum*", "", "_ppvar"},
                    +
                    489  {"", "double*", "", "_pdvol"},
                    +
                    490  {"", "double*", "", "_pdfcdc"},
                    +
                    491  {"", "Datum*", "", "/* _thread */"},
                    +
                    492  {"", "NrnThread*", "", "nt"},
                    +
                    493  {"", "const _nrn_model_sorted_token&", "", "_sorted_token"}};
                    +
                    494 }
                    +
                    495 
                    + +
                    497  auto coeff_callback_name = [](const std::string& var_name) {
                    +
                    498  return fmt::format("_diffusion_coefficient_{}", var_name);
                    +
                    499  };
                    +
                    500 
                    +
                    501  auto space_name = [](const std::string& var_name) {
                    +
                    502  return fmt::format("_diffusion_space_{}", var_name);
                    +
                    503  };
                    +
                    504 
                    +
                    505  for (auto [var_name, values]: info.longitudinal_diffusion_info) {
                    +
                    506  printer->fmt_line("static void* {};", space_name(var_name));
                    +
                    507  printer->fmt_push_block("static double {}({})",
                    +
                    508  coeff_callback_name(var_name),
                    +
                    509  get_parameter_str(ldifusfunc3_parameters()));
                    510 
                    -
                    511  for (auto [var_name, values]: info.longitudinal_diffusion_info) {
                    -
                    512  printer->fmt_line("static void* {};", space_name(var_name));
                    -
                    513  printer->fmt_push_block("static double {}({})",
                    -
                    514  coeff_callback_name(var_name),
                    -
                    515  get_parameter_str(ldifusfunc3_parameters()));
                    -
                    516 
                    -
                    517  print_entrypoint_setup_code_from_memb_list();
                    -
                    518 
                    -
                    519  auto volume_expr = values.volume("_i");
                    -
                    520  auto mu_expr = values.diffusion_rate("_i");
                    +
                    511  print_entrypoint_setup_code_from_memb_list();
                    +
                    512 
                    +
                    513  auto volume_expr = values.volume("_i");
                    +
                    514  auto mu_expr = values.diffusion_rate("_i");
                    +
                    515 
                    +
                    516  printer->add_indent();
                    +
                    517  printer->add_text("*_pdvol= ");
                    +
                    518  volume_expr->accept(*this);
                    +
                    519  printer->add_text(";");
                    +
                    520  printer->add_newline();
                    521 
                    -
                    522  printer->add_indent();
                    -
                    523  printer->add_text("*_pdvol= ");
                    -
                    524  volume_expr->accept(*this);
                    -
                    525  printer->add_text(";");
                    -
                    526  printer->add_newline();
                    -
                    527 
                    -
                    528  printer->add_line("*_pdfcdc = 0.0;");
                    -
                    529  printer->add_indent();
                    -
                    530  printer->add_text("return ");
                    -
                    531  mu_expr->accept(*this);
                    -
                    532  printer->add_text(";");
                    -
                    533  printer->add_newline();
                    -
                    534 
                    -
                    535  printer->pop_block();
                    -
                    536  }
                    -
                    537 
                    -
                    538  printer->fmt_push_block("static void _apply_diffusion_function({})",
                    -
                    539  get_parameter_str(ldifusfunc1_parameters()));
                    -
                    540  for (auto [var_name, values]: info.longitudinal_diffusion_info) {
                    -
                    541  auto var = program_symtab->lookup(var_name);
                    -
                    542  size_t array_size = var->get_length();
                    -
                    543  printer->fmt_push_block("for(size_t _i = 0; _i < {}; ++_i)", array_size);
                    -
                    544  printer->fmt_line(
                    -
                    545  "(*_f)(mech_type, {}, &{}, _i, /* x pos */ {}, /* Dx pos */ {}, _sorted_token, _nt);",
                    -
                    546  coeff_callback_name(var_name),
                    -
                    547  space_name(var_name),
                    -
                    548  position_of_float_var(var_name),
                    -
                    549  position_of_float_var("D" + var_name));
                    -
                    550  printer->pop_block();
                    -
                    551  }
                    -
                    552  printer->pop_block();
                    -
                    553  printer->add_newline();
                    -
                    554 }
                    -
                    555 
                    -
                    556 /****************************************************************************************/
                    -
                    557 /* Code-specific helper routines */
                    -
                    558 /****************************************************************************************/
                    -
                    559 
                    -
                    560 void CodegenNeuronCppVisitor::add_variable_tqitem(std::vector<IndexVariableInfo>& variables) {
                    -
                    561  if (info.net_send_used) {
                    -
                    562  variables.emplace_back(make_symbol(naming::TQITEM_VARIABLE), false, false, true);
                    -
                    563  variables.back().is_constant = true;
                    -
                    564  info.tqitem_index = static_cast<int>(variables.size() - 1);
                    -
                    565  }
                    +
                    522  printer->add_line("*_pdfcdc = 0.0;");
                    +
                    523  printer->add_indent();
                    +
                    524  printer->add_text("return ");
                    +
                    525  mu_expr->accept(*this);
                    +
                    526  printer->add_text(";");
                    +
                    527  printer->add_newline();
                    +
                    528 
                    +
                    529  printer->pop_block();
                    +
                    530  }
                    +
                    531 
                    +
                    532  printer->fmt_push_block("static void _apply_diffusion_function({})",
                    +
                    533  get_parameter_str(ldifusfunc1_parameters()));
                    +
                    534  for (auto [var_name, values]: info.longitudinal_diffusion_info) {
                    +
                    535  auto var = program_symtab->lookup(var_name);
                    +
                    536  size_t array_size = var->get_length();
                    +
                    537  printer->fmt_push_block("for(size_t _i = 0; _i < {}; ++_i)", array_size);
                    +
                    538  printer->fmt_line(
                    +
                    539  "(*_f)(mech_type, {}, &{}, _i, /* x pos */ {}, /* Dx pos */ {}, _sorted_token, _nt);",
                    +
                    540  coeff_callback_name(var_name),
                    +
                    541  space_name(var_name),
                    +
                    542  position_of_float_var(var_name),
                    +
                    543  position_of_float_var("D" + var_name));
                    +
                    544  printer->pop_block();
                    +
                    545  }
                    +
                    546  printer->pop_block();
                    +
                    547  printer->add_newline();
                    +
                    548 }
                    +
                    549 
                    +
                    550 /****************************************************************************************/
                    +
                    551 /* Code-specific helper routines */
                    +
                    552 /****************************************************************************************/
                    +
                    553 
                    +
                    554 void CodegenNeuronCppVisitor::add_variable_tqitem(std::vector<IndexVariableInfo>& variables) {
                    +
                    555  if (info.net_send_used) {
                    +
                    556  variables.emplace_back(make_symbol(naming::TQITEM_VARIABLE), false, false, true);
                    +
                    557  variables.back().is_constant = true;
                    +
                    558  info.tqitem_index = static_cast<int>(variables.size() - 1);
                    +
                    559  }
                    +
                    560 }
                    +
                    561 
                    + +
                    563  std::vector<IndexVariableInfo>& variables) {
                    +
                    564  variables.emplace_back(make_symbol(naming::POINT_PROCESS_VARIABLE), false, false, true);
                    +
                    565  variables.back().is_constant = true;
                    566 }
                    567 
                    - -
                    569  std::vector<IndexVariableInfo>& variables) {
                    -
                    570  variables.emplace_back(make_symbol(naming::POINT_PROCESS_VARIABLE), false, false, true);
                    -
                    571  variables.back().is_constant = true;
                    -
                    572 }
                    + +
                    569  const auto& args = internal_method_parameters();
                    +
                    570  return get_arg_str(args);
                    +
                    571 }
                    +
                    572 
                    573 
                    - -
                    575  const auto& args = internal_method_parameters();
                    -
                    576  return get_arg_str(args);
                    -
                    577 }
                    + +
                    575  if (info.mod_suffix == "nothing") {
                    +
                    576  return {};
                    +
                    577  }
                    578 
                    -
                    579 
                    - -
                    581  if (info.mod_suffix == "nothing") {
                    -
                    582  return {};
                    -
                    583  }
                    -
                    584 
                    -
                    585  ParamVector params;
                    -
                    586  params.emplace_back("", "_nrn_mechanism_cache_range&", "", "_lmc");
                    -
                    587  params.emplace_back("", fmt::format("{}&", instance_struct()), "", "inst");
                    -
                    588  if (!info.artificial_cell) {
                    -
                    589  params.emplace_back("", fmt::format("{}&", node_data_struct()), "", "node_data");
                    +
                    579  ParamVector params;
                    +
                    580  params.emplace_back("", "_nrn_mechanism_cache_range&", "", "_lmc");
                    +
                    581  params.emplace_back("", fmt::format("{}&", instance_struct()), "", "inst");
                    +
                    582  if (!info.artificial_cell) {
                    +
                    583  params.emplace_back("", fmt::format("{}&", node_data_struct()), "", "node_data");
                    +
                    584  }
                    +
                    585  params.emplace_back("", "size_t", "", "id");
                    +
                    586  params.emplace_back("", "Datum*", "", "_ppvar");
                    +
                    587  params.emplace_back("", "Datum*", "", "_thread");
                    +
                    588  if (!codegen_thread_variables.empty()) {
                    +
                    589  params.emplace_back("", fmt::format("{}&", thread_variables_struct()), "", "_thread_vars");
                    590  }
                    -
                    591  params.emplace_back("", "size_t", "", "id");
                    -
                    592  params.emplace_back("", "Datum*", "", "_ppvar");
                    -
                    593  params.emplace_back("", "Datum*", "", "_thread");
                    -
                    594  if (!codegen_thread_variables.empty()) {
                    -
                    595  params.emplace_back("", fmt::format("{}&", thread_variables_struct()), "", "_thread_vars");
                    -
                    596  }
                    -
                    597  params.emplace_back("", "NrnThread*", "", "nt");
                    -
                    598  return params;
                    +
                    591  params.emplace_back("", "NrnThread*", "", "nt");
                    +
                    592  return params;
                    +
                    593 }
                    +
                    594 
                    +
                    595 
                    +
                    596 /// TODO: Edit for NEURON
                    + +
                    598  return {};
                    599 }
                    600 
                    601 
                    602 /// TODO: Edit for NEURON
                    - -
                    604  return {};
                    -
                    605 }
                    -
                    606 
                    -
                    607 
                    -
                    608 /// TODO: Edit for NEURON
                    - -
                    610  bool table) noexcept {
                    -
                    611  return {};
                    -
                    612 }
                    + +
                    604  bool table) noexcept {
                    +
                    605  return {};
                    +
                    606 }
                    +
                    607 
                    +
                    608 
                    + +
                    610  return internal_method_parameters();
                    +
                    611 }
                    +
                    612 
                    613 
                    -
                    614 
                    - -
                    616  return internal_method_parameters();
                    -
                    617 }
                    -
                    618 
                    -
                    619 
                    - -
                    621  return {{"", "Memb_list*", "", "_ml"},
                    -
                    622  {"", "size_t", "", "_iml"},
                    -
                    623  {"", "Datum*", "", "_ppvar"},
                    -
                    624  {"", "Datum*", "", "_thread"},
                    -
                    625  {"", "double*", "", "_globals"},
                    -
                    626  {"", "NrnThread*", "", "_nt"}};
                    + +
                    615  return {{"", "Memb_list*", "", "_ml"},
                    +
                    616  {"", "size_t", "", "_iml"},
                    +
                    617  {"", "Datum*", "", "_ppvar"},
                    +
                    618  {"", "Datum*", "", "_thread"},
                    +
                    619  {"", "double*", "", "_globals"},
                    +
                    620  {"", "NrnThread*", "", "_nt"}};
                    +
                    621 }
                    +
                    622 
                    +
                    623 
                    +
                    624 /// TODO: Edit for NEURON
                    + +
                    626  return {};
                    627 }
                    628 
                    629 
                    630 /// TODO: Edit for NEURON
                    - +
                    632  return {};
                    633 }
                    634 
                    -
                    635 
                    -
                    636 /// TODO: Edit for NEURON
                    - -
                    638  return {};
                    -
                    639 }
                    -
                    640 
                    -
                    641 std::pair<CodegenNeuronCppVisitor::ParamVector, CodegenNeuronCppVisitor::ParamVector>
                    - -
                    643  auto params = ParamVector{};
                    +
                    635 std::pair<CodegenNeuronCppVisitor::ParamVector, CodegenNeuronCppVisitor::ParamVector>
                    + +
                    637  auto params = ParamVector{};
                    +
                    638 
                    +
                    639  for (const auto& i: node.get_parameters()) {
                    +
                    640  params.emplace_back("", "double", "", i->get_node_name());
                    +
                    641  }
                    +
                    642  return {params, {}};
                    +
                    643 }
                    644 
                    -
                    645  for (const auto& i: node.get_parameters()) {
                    -
                    646  params.emplace_back("", "double", "", i->get_node_name());
                    -
                    647  }
                    -
                    648  return {params, {}};
                    -
                    649 }
                    -
                    650 
                    -
                    651 
                    -
                    652 /** Map of the non-(global/top-local) LOCAL variables.
                    +
                    645 
                    +
                    646 /** Map of the non-(global/top-local) LOCAL variables.
                    +
                    647  *
                    +
                    648  * The map associates the name in the MOD file, e.g. `a` with
                    +
                    649  * the current name of that LOCAL variable, e.g. `a_r_4`.
                    +
                    650  *
                    +
                    651  * auto map = get_nonglobal_local_variable_names();
                    +
                    652  * assert map["a"] == "a_r_4";
                    653  *
                    -
                    654  * The map associates the name in the MOD file, e.g. `a` with
                    -
                    655  * the current name of that LOCAL variable, e.g. `a_r_4`.
                    -
                    656  *
                    -
                    657  * auto map = get_nonglobal_local_variable_names();
                    -
                    658  * assert map["a"] == "a_r_4";
                    -
                    659  *
                    -
                    660  * The two names can differ, because an early pass makes all
                    -
                    661  * names unique by renaming local variables.
                    -
                    662  */
                    -
                    663 std::unordered_map<std::string, std::string> get_nonglobal_local_variable_names(
                    -
                    664  const symtab::SymbolTable& symtab) {
                    -
                    665  if (symtab.global_scope()) {
                    -
                    666  return {};
                    -
                    667  }
                    -
                    668 
                    -
                    669  auto local_variables = symtab.get_variables(NmodlType::local_var);
                    -
                    670  auto parent_symtab = symtab.get_parent_table();
                    -
                    671  if (parent_symtab == nullptr) {
                    -
                    672  throw std::runtime_error(
                    -
                    673  "Internal NMODL error: non top-level symbol table doesn't have a parent.");
                    -
                    674  }
                    -
                    675 
                    -
                    676  auto variable_names = get_nonglobal_local_variable_names(*parent_symtab);
                    -
                    677 
                    -
                    678  for (const auto& symbol: local_variables) {
                    -
                    679  auto status = symbol->get_status();
                    -
                    680  bool is_renamed = (status & symtab::syminfo::Status::renamed) !=
                    - -
                    682  auto current_name = symbol->get_name();
                    -
                    683  auto mod_name = is_renamed ? symbol->get_original_name() : current_name;
                    +
                    654  * The two names can differ, because an early pass makes all
                    +
                    655  * names unique by renaming local variables.
                    +
                    656  */
                    +
                    657 std::unordered_map<std::string, std::string> get_nonglobal_local_variable_names(
                    +
                    658  const symtab::SymbolTable& symtab) {
                    +
                    659  if (symtab.global_scope()) {
                    +
                    660  return {};
                    +
                    661  }
                    +
                    662 
                    +
                    663  auto local_variables = symtab.get_variables(NmodlType::local_var);
                    +
                    664  auto parent_symtab = symtab.get_parent_table();
                    +
                    665  if (parent_symtab == nullptr) {
                    +
                    666  throw std::runtime_error(
                    +
                    667  "Internal NMODL error: non top-level symbol table doesn't have a parent.");
                    +
                    668  }
                    +
                    669 
                    +
                    670  auto variable_names = get_nonglobal_local_variable_names(*parent_symtab);
                    +
                    671 
                    +
                    672  for (const auto& symbol: local_variables) {
                    +
                    673  auto status = symbol->get_status();
                    +
                    674  bool is_renamed = (status & symtab::syminfo::Status::renamed) !=
                    + +
                    676  auto current_name = symbol->get_name();
                    +
                    677  auto mod_name = is_renamed ? symbol->get_original_name() : current_name;
                    +
                    678 
                    +
                    679  variable_names[mod_name] = current_name;
                    +
                    680  }
                    +
                    681 
                    +
                    682  return variable_names;
                    +
                    683 }
                    684 
                    -
                    685  variable_names[mod_name] = current_name;
                    -
                    686  }
                    -
                    687 
                    -
                    688  return variable_names;
                    -
                    689 }
                    -
                    690 
                    -
                    691 
                    - -
                    693  const ast::Verbatim& node,
                    -
                    694  const std::string& verbatim) {
                    -
                    695  // Note, the logic for reducing the number of macros printed, aims to
                    -
                    696  // improve legibility of the generated code by reducing number of lines of
                    -
                    697  // code. It would be correct to print all macros, because that's
                    -
                    698  // essentially what NOCMODL does. Therefore, the logic isn't sharp (and
                    -
                    699  // doesn't have to be).
                    -
                    700 
                    -
                    701  std::vector<std::string> macros_defined;
                    -
                    702  auto print_macro = [this, &verbatim, &macros_defined](const std::string& macro_name,
                    -
                    703  const std::string& macro_value) {
                    -
                    704  if (verbatim.find(macro_name) != std::string::npos) {
                    -
                    705  printer->fmt_line("#define {} {}", macro_name, macro_value);
                    -
                    706  macros_defined.push_back(macro_name);
                    -
                    707  }
                    -
                    708  };
                    +
                    685 
                    + +
                    687  const ast::Verbatim& node,
                    +
                    688  const std::string& verbatim) {
                    +
                    689  // Note, the logic for reducing the number of macros printed, aims to
                    +
                    690  // improve legibility of the generated code by reducing number of lines of
                    +
                    691  // code. It would be correct to print all macros, because that's
                    +
                    692  // essentially what NOCMODL does. Therefore, the logic isn't sharp (and
                    +
                    693  // doesn't have to be).
                    +
                    694 
                    +
                    695  std::vector<std::string> macros_defined;
                    +
                    696  auto print_macro = [this, &verbatim, &macros_defined](const std::string& macro_name,
                    +
                    697  const std::string& macro_value) {
                    +
                    698  if (verbatim.find(macro_name) != std::string::npos) {
                    +
                    699  printer->fmt_line("#define {} {}", macro_name, macro_value);
                    +
                    700  macros_defined.push_back(macro_name);
                    +
                    701  }
                    +
                    702  };
                    +
                    703 
                    +
                    704  printer->add_line("// Setup for VERBATIM");
                    +
                    705  for (const auto& var: codegen_float_variables) {
                    +
                    706  auto name = get_name(var);
                    +
                    707  print_macro(name, get_variable_name(name));
                    +
                    708  }
                    709 
                    -
                    710  printer->add_line("// Setup for VERBATIM");
                    -
                    711  for (const auto& var: codegen_float_variables) {
                    -
                    712  auto name = get_name(var);
                    -
                    713  print_macro(name, get_variable_name(name));
                    -
                    714  }
                    -
                    715 
                    -
                    716  for (const auto& var: codegen_int_variables) {
                    -
                    717  auto name = get_name(var);
                    -
                    718  std::string macro_value = get_variable_name(name);
                    -
                    719  print_macro(name, macro_value);
                    -
                    720  if (verbatim.find("_p_" + name) != std::string::npos) {
                    -
                    721  print_macro("_p_" + name, get_pointer_name(name));
                    -
                    722  }
                    -
                    723  }
                    -
                    724 
                    -
                    725  for (const auto& var: codegen_global_variables) {
                    -
                    726  auto name = get_name(var);
                    -
                    727  print_macro(name, get_variable_name(name));
                    -
                    728  }
                    -
                    729 
                    -
                    730  for (const auto& var: codegen_thread_variables) {
                    -
                    731  auto name = get_name(var);
                    -
                    732  print_macro(name, get_variable_name(name));
                    +
                    710  for (const auto& var: codegen_int_variables) {
                    +
                    711  auto name = get_name(var);
                    +
                    712  std::string macro_value = get_variable_name(name);
                    +
                    713  print_macro(name, macro_value);
                    +
                    714  if (verbatim.find("_p_" + name) != std::string::npos) {
                    +
                    715  print_macro("_p_" + name, get_pointer_name(name));
                    +
                    716  }
                    +
                    717  }
                    +
                    718 
                    +
                    719  for (const auto& var: codegen_global_variables) {
                    +
                    720  auto name = get_name(var);
                    +
                    721  print_macro(name, get_variable_name(name));
                    +
                    722  }
                    +
                    723 
                    +
                    724  for (const auto& var: codegen_thread_variables) {
                    +
                    725  auto name = get_name(var);
                    +
                    726  print_macro(name, get_variable_name(name));
                    +
                    727  }
                    +
                    728 
                    +
                    729  for (const auto& func: info.functions) {
                    +
                    730  auto name = get_name(func);
                    +
                    731  print_macro(name, method_name(name));
                    +
                    732  print_macro(fmt::format("_l{}", name), fmt::format("ret_{}", name));
                    733  }
                    734 
                    -
                    735  for (const auto& func: info.functions) {
                    -
                    736  auto name = get_name(func);
                    +
                    735  for (const auto& proc: info.procedures) {
                    +
                    736  auto name = get_name(proc);
                    737  print_macro(name, method_name(name));
                    -
                    738  print_macro(fmt::format("_l{}", name), fmt::format("ret_{}", name));
                    -
                    739  }
                    +
                    738  }
                    +
                    739 
                    740 
                    -
                    741  for (const auto& proc: info.procedures) {
                    -
                    742  auto name = get_name(proc);
                    -
                    743  print_macro(name, method_name(name));
                    -
                    744  }
                    -
                    745 
                    +
                    741  auto symtab = node.get_parent()->get_symbol_table();
                    +
                    742  auto locals = get_nonglobal_local_variable_names(*symtab);
                    +
                    743  for (const auto& [mod_name, current_name]: locals) {
                    +
                    744  print_macro(fmt::format("_l{}", mod_name), get_variable_name(current_name));
                    +
                    745  }
                    746 
                    -
                    747  auto symtab = node.get_parent()->get_symbol_table();
                    -
                    748  auto locals = get_nonglobal_local_variable_names(*symtab);
                    -
                    749  for (const auto& [mod_name, current_name]: locals) {
                    -
                    750  print_macro(fmt::format("_l{}", mod_name), get_variable_name(current_name));
                    -
                    751  }
                    -
                    752 
                    -
                    753  print_macro(naming::NTHREAD_T_VARIABLE, "nt->_t");
                    -
                    754  print_macro("_nt", "nt");
                    -
                    755  print_macro("_tqitem", "tqitem");
                    -
                    756 
                    -
                    757  auto print_args_macro = [this, print_macro](const std::string& macro_basename,
                    -
                    758  const ParamVector& params) {
                    -
                    759  print_macro("_" + macro_basename + "_", get_arg_str(params));
                    -
                    760  print_macro("_" + macro_basename + "comma_", get_arg_str(params) + ",");
                    -
                    761  print_macro("_" + macro_basename + "proto_", get_parameter_str(params));
                    -
                    762  print_macro("_" + macro_basename + "protocomma_", get_parameter_str(params) + ",");
                    -
                    763  };
                    +
                    747  print_macro(naming::NTHREAD_T_VARIABLE, "nt->_t");
                    +
                    748  print_macro("_nt", "nt");
                    +
                    749  print_macro("_tqitem", "tqitem");
                    +
                    750 
                    +
                    751  auto print_args_macro = [this, print_macro](const std::string& macro_basename,
                    +
                    752  const ParamVector& params) {
                    +
                    753  print_macro("_" + macro_basename + "_", get_arg_str(params));
                    +
                    754  print_macro("_" + macro_basename + "comma_", get_arg_str(params) + ",");
                    +
                    755  print_macro("_" + macro_basename + "proto_", get_parameter_str(params));
                    +
                    756  print_macro("_" + macro_basename + "protocomma_", get_parameter_str(params) + ",");
                    +
                    757  };
                    +
                    758 
                    +
                    759  print_args_macro("internalthreadargs", internalthreadargs_parameters());
                    +
                    760  print_args_macro("threadargs", threadargs_parameters());
                    +
                    761 
                    +
                    762  return macros_defined;
                    +
                    763 }
                    764 
                    -
                    765  print_args_macro("internalthreadargs", internalthreadargs_parameters());
                    -
                    766  print_args_macro("threadargs", threadargs_parameters());
                    -
                    767 
                    -
                    768  return macros_defined;
                    -
                    769 }
                    -
                    770 
                    -
                    771 
                    - -
                    773  const std::vector<std::string>& macros_defined) {
                    -
                    774  for (const auto& macro: macros_defined) {
                    -
                    775  printer->fmt_line("#undef {}", macro);
                    -
                    776  }
                    -
                    777  printer->add_line("// End of cleanup for VERBATIM");
                    -
                    778 }
                    -
                    779 
                    -
                    780 
                    -
                    781 std::string CodegenNeuronCppVisitor::process_verbatim_text(const std::string& verbatim) {
                    - -
                    783  driver.scan_string(verbatim);
                    -
                    784  auto tokens = driver.all_tokens();
                    -
                    785  std::string result;
                    -
                    786  for (size_t i = 0; i < tokens.size(); i++) {
                    -
                    787  auto token = tokens[i];
                    -
                    788 
                    -
                    789  // check if we have function call in the verbatim block where
                    -
                    790  // function is defined in the same mod file
                    -
                    791  if (program_symtab->is_method_defined(token) && tokens[i + 1] == "(") {
                    -
                    792  result += token + "(";
                    -
                    793  if (tokens[i + 2] == naming::THREAD_ARGS) {
                    - -
                    795  } else if (tokens[i + 2] == naming::THREAD_ARGS_COMMA) {
                    - -
                    797  } else {
                    -
                    798  result += tokens[i + 2];
                    -
                    799  }
                    -
                    800 
                    -
                    801  i += 2;
                    -
                    802  } else {
                    -
                    803  result += token;
                    -
                    804  }
                    -
                    805  }
                    -
                    806  return result;
                    -
                    807 }
                    -
                    808 
                    -
                    809 
                    - -
                    811  const auto& verbatim_code = node.get_statement()->eval();
                    -
                    812  auto massaged_verbatim = process_verbatim_text(verbatim_code);
                    -
                    813 
                    -
                    814  auto macros_defined = print_verbatim_setup(node, massaged_verbatim);
                    -
                    815  printer->add_line("// Begin VERBATIM");
                    -
                    816  const auto& lines = stringutils::split_string(massaged_verbatim, '\n');
                    -
                    817  for (const auto& line: lines) {
                    -
                    818  printer->add_line(line);
                    -
                    819  }
                    -
                    820  printer->add_line("// End VERBATIM");
                    -
                    821  print_verbatim_cleanup(macros_defined);
                    -
                    822 }
                    +
                    765 
                    + +
                    767  const std::vector<std::string>& macros_defined) {
                    +
                    768  for (const auto& macro: macros_defined) {
                    +
                    769  printer->fmt_line("#undef {}", macro);
                    +
                    770  }
                    +
                    771  printer->add_line("// End of cleanup for VERBATIM");
                    +
                    772 }
                    +
                    773 
                    +
                    774 
                    +
                    775 std::string CodegenNeuronCppVisitor::process_verbatim_text(const std::string& verbatim) {
                    + +
                    777  driver.scan_string(verbatim);
                    +
                    778  auto tokens = driver.all_tokens();
                    +
                    779  std::string result;
                    +
                    780  for (size_t i = 0; i < tokens.size(); i++) {
                    +
                    781  auto token = tokens[i];
                    +
                    782 
                    +
                    783  // check if we have function call in the verbatim block where
                    +
                    784  // function is defined in the same mod file
                    +
                    785  if (program_symtab->is_method_defined(token) && tokens[i + 1] == "(") {
                    +
                    786  result += token + "(";
                    +
                    787  if (tokens[i + 2] == naming::THREAD_ARGS) {
                    + +
                    789  } else if (tokens[i + 2] == naming::THREAD_ARGS_COMMA) {
                    + +
                    791  } else {
                    +
                    792  result += tokens[i + 2];
                    +
                    793  }
                    +
                    794 
                    +
                    795  i += 2;
                    +
                    796  } else {
                    +
                    797  result += token;
                    +
                    798  }
                    +
                    799  }
                    +
                    800  return result;
                    +
                    801 }
                    +
                    802 
                    +
                    803 
                    + +
                    805  const auto& verbatim_code = node.get_statement()->eval();
                    +
                    806  auto massaged_verbatim = process_verbatim_text(verbatim_code);
                    +
                    807 
                    +
                    808  auto macros_defined = print_verbatim_setup(node, massaged_verbatim);
                    +
                    809  printer->add_line("// Begin VERBATIM");
                    +
                    810  const auto& lines = stringutils::split_string(massaged_verbatim, '\n');
                    +
                    811  for (const auto& line: lines) {
                    +
                    812  printer->add_line(line);
                    +
                    813  }
                    +
                    814  printer->add_line("// End VERBATIM");
                    +
                    815  print_verbatim_cleanup(macros_defined);
                    +
                    816 }
                    +
                    817 
                    +
                    818 
                    +
                    819 /// TODO: Write for NEURON
                    + +
                    821  return {};
                    +
                    822 };
                    823 
                    -
                    824 
                    -
                    825 /// TODO: Write for NEURON
                    - -
                    827  return {};
                    -
                    828 };
                    +
                    824 
                    + +
                    826  const std::string& function_or_procedure_name) const {
                    +
                    827  return fmt::format("_hoc_{}", function_or_procedure_name);
                    +
                    828 }
                    829 
                    830 
                    - +
                    832  const std::string& function_or_procedure_name) const {
                    -
                    833  return fmt::format("_hoc_{}", function_or_procedure_name);
                    -
                    834 }
                    -
                    835 
                    -
                    836 
                    - -
                    838  const std::string& function_or_procedure_name) const {
                    -
                    839  return fmt::format("static {} {}({})",
                    -
                    840  info.point_process ? "double" : "void",
                    -
                    841  hoc_function_name(function_or_procedure_name),
                    -
                    842  info.point_process ? "void * _vptr" : "");
                    +
                    833  return fmt::format("static {} {}({})",
                    +
                    834  info.point_process ? "double" : "void",
                    +
                    835  hoc_function_name(function_or_procedure_name),
                    +
                    836  info.point_process ? "void * _vptr" : "");
                    +
                    837 }
                    +
                    838 
                    +
                    839 
                    + +
                    841  const std::string& function_or_procedure_name) const {
                    +
                    842  return fmt::format("_npy_{}", function_or_procedure_name);
                    843 }
                    844 
                    845 
                    - +
                    847  const std::string& function_or_procedure_name) const {
                    -
                    848  return fmt::format("_npy_{}", function_or_procedure_name);
                    -
                    849 }
                    -
                    850 
                    +
                    848  return fmt::format("static double {}(Prop* _prop)",
                    +
                    849  py_function_name(function_or_procedure_name));
                    +
                    850 }
                    851 
                    - -
                    853  const std::string& function_or_procedure_name) const {
                    -
                    854  return fmt::format("static double {}(Prop* _prop)",
                    -
                    855  py_function_name(function_or_procedure_name));
                    -
                    856 }
                    -
                    857 
                    -
                    858 
                    -
                    859 /****************************************************************************************/
                    -
                    860 /* Code-specific printing routines for code generation */
                    -
                    861 /****************************************************************************************/
                    -
                    862 
                    - -
                    864  return "neuron";
                    -
                    865 }
                    -
                    866 
                    -
                    867 
                    - -
                    869  std::vector<ShadowUseStatement>& statements,
                    -
                    870  const Ion& ion,
                    -
                    871  const std::string& /* concentration */) {
                    -
                    872  auto ion_name = ion.name;
                    -
                    873  int dparam_index = get_int_variable_index(fmt::format("style_{}", ion_name));
                    -
                    874 
                    -
                    875  auto style_name = fmt::format("_style_{}", ion_name);
                    -
                    876  auto style_stmt = fmt::format("int {} = *(_ppvar[{}].get<int*>())", style_name, dparam_index);
                    -
                    877  statements.push_back(ShadowUseStatement{style_stmt, "", ""});
                    -
                    878 
                    -
                    879 
                    -
                    880  auto wrote_conc_stmt = fmt::format("nrn_wrote_conc(_{}_sym, {}, {}, {}, {})",
                    -
                    881  ion_name,
                    -
                    882  get_variable_name(ion.rev_potential_pointer_name()),
                    -
                    883  get_variable_name(ion.intra_conc_pointer_name()),
                    -
                    884  get_variable_name(ion.extra_conc_pointer_name()),
                    -
                    885  style_name);
                    -
                    886  statements.push_back(ShadowUseStatement{wrote_conc_stmt, "", ""});
                    -
                    887 }
                    -
                    888 
                    -
                    889 /****************************************************************************************/
                    -
                    890 /* Routines for returning variable name */
                    -
                    891 /****************************************************************************************/
                    -
                    892 
                    +
                    852 
                    +
                    853 /****************************************************************************************/
                    +
                    854 /* Code-specific printing routines for code generation */
                    +
                    855 /****************************************************************************************/
                    +
                    856 
                    + +
                    858  return "neuron";
                    +
                    859 }
                    +
                    860 
                    +
                    861 
                    + +
                    863  std::vector<ShadowUseStatement>& statements,
                    +
                    864  const Ion& ion,
                    +
                    865  const std::string& /* concentration */) {
                    +
                    866  auto ion_name = ion.name;
                    +
                    867  int dparam_index = get_int_variable_index(fmt::format("style_{}", ion_name));
                    +
                    868 
                    +
                    869  auto style_name = fmt::format("_style_{}", ion_name);
                    +
                    870  auto style_stmt = fmt::format("int {} = *(_ppvar[{}].get<int*>())", style_name, dparam_index);
                    +
                    871  statements.push_back(ShadowUseStatement{style_stmt, "", ""});
                    +
                    872 
                    +
                    873 
                    +
                    874  auto wrote_conc_stmt = fmt::format("nrn_wrote_conc(_{}_sym, {}, {}, {}, {})",
                    +
                    875  ion_name,
                    +
                    876  get_variable_name(ion.rev_potential_pointer_name()),
                    +
                    877  get_variable_name(ion.intra_conc_pointer_name()),
                    +
                    878  get_variable_name(ion.extra_conc_pointer_name()),
                    +
                    879  style_name);
                    +
                    880  statements.push_back(ShadowUseStatement{wrote_conc_stmt, "", ""});
                    +
                    881 }
                    +
                    882 
                    +
                    883 /****************************************************************************************/
                    +
                    884 /* Routines for returning variable name */
                    +
                    885 /****************************************************************************************/
                    +
                    886 
                    +
                    887 
                    + +
                    889  bool use_instance) const {
                    +
                    890  if (!use_instance) {
                    +
                    891  throw std::runtime_error("Printing non-instance variables is not implemented.");
                    +
                    892  }
                    893 
                    - -
                    895  bool use_instance) const {
                    -
                    896  if (!use_instance) {
                    -
                    897  throw std::runtime_error("Printing non-instance variables is not implemented.");
                    -
                    898  }
                    -
                    899 
                    -
                    900  auto name = symbol->get_name();
                    -
                    901  auto dimension = symbol->get_length();
                    -
                    902  if (symbol->is_array()) {
                    -
                    903  return fmt::format("(inst.{}+id*{})", name, dimension);
                    -
                    904  } else {
                    -
                    905  return fmt::format("inst.{}[id]", name);
                    -
                    906  }
                    -
                    907 }
                    +
                    894  auto name = symbol->get_name();
                    +
                    895  auto dimension = symbol->get_length();
                    +
                    896  if (symbol->is_array()) {
                    +
                    897  return fmt::format("(inst.{}+id*{})", name, dimension);
                    +
                    898  } else {
                    +
                    899  return fmt::format("inst.{}[id]", name);
                    +
                    900  }
                    +
                    901 }
                    +
                    902 
                    +
                    903 
                    + +
                    905  const std::string& name,
                    +
                    906  bool use_instance) const {
                    +
                    907  auto position = position_of_int_var(name);
                    908 
                    -
                    909 
                    - -
                    911  const std::string& name,
                    -
                    912  bool use_instance) const {
                    -
                    913  auto position = position_of_int_var(name);
                    -
                    914 
                    -
                    915  if (info.semantics[position].name == naming::RANDOM_SEMANTIC) {
                    -
                    916  return fmt::format("(nrnran123_State*) _ppvar[{}].literal_value<void*>()", position);
                    -
                    917  }
                    -
                    918 
                    -
                    919  if (info.semantics[position].name == naming::FOR_NETCON_SEMANTIC) {
                    -
                    920  return fmt::format("_ppvar[{}].literal_value<void*>()", position);
                    -
                    921  }
                    -
                    922 
                    -
                    923  if (info.semantics[position].name == naming::POINTER_SEMANTIC) {
                    -
                    924  return fmt::format("(*_ppvar[{}].get<double*>())", position);
                    -
                    925  }
                    -
                    926 
                    -
                    927  if (symbol.is_index) {
                    -
                    928  if (use_instance) {
                    -
                    929  throw std::runtime_error("Not implemented. [wiejo]");
                    -
                    930  // return fmt::format("inst->{}[{}]", name, position);
                    -
                    931  }
                    -
                    932  throw std::runtime_error("Not implemented. [ncuwi]");
                    -
                    933  // return fmt::format("indexes[{}]", position);
                    +
                    909  if (info.semantics[position].name == naming::RANDOM_SEMANTIC) {
                    +
                    910  return fmt::format("(nrnran123_State*) _ppvar[{}].literal_value<void*>()", position);
                    +
                    911  }
                    +
                    912 
                    +
                    913  if (info.semantics[position].name == naming::FOR_NETCON_SEMANTIC) {
                    +
                    914  return fmt::format("_ppvar[{}].literal_value<void*>()", position);
                    +
                    915  }
                    +
                    916 
                    +
                    917  if (info.semantics[position].name == naming::POINTER_SEMANTIC) {
                    +
                    918  return fmt::format("(*_ppvar[{}].get<double*>())", position);
                    +
                    919  }
                    +
                    920 
                    +
                    921  if (symbol.is_index) {
                    +
                    922  if (use_instance) {
                    +
                    923  throw std::runtime_error("Not implemented. [wiejo]");
                    +
                    924  // return fmt::format("inst->{}[{}]", name, position);
                    +
                    925  }
                    +
                    926  throw std::runtime_error("Not implemented. [ncuwi]");
                    +
                    927  // return fmt::format("indexes[{}]", position);
                    +
                    928  }
                    +
                    929  if (symbol.is_integer) {
                    +
                    930  if (use_instance) {
                    +
                    931  return fmt::format("inst.{}[id]", name);
                    +
                    932  }
                    +
                    933  return fmt::format("_ppvar[{}]", position);
                    934  }
                    -
                    935  if (symbol.is_integer) {
                    -
                    936  if (use_instance) {
                    -
                    937  return fmt::format("inst.{}[id]", name);
                    -
                    938  }
                    -
                    939  return fmt::format("_ppvar[{}]", position);
                    -
                    940  }
                    -
                    941  if (use_instance) {
                    -
                    942  return fmt::format("(*inst.{}[id])", name);
                    -
                    943  }
                    -
                    944 
                    -
                    945 
                    -
                    946  throw std::runtime_error("Not implemented. [nvueir]");
                    -
                    947 }
                    +
                    935  if (use_instance) {
                    +
                    936  return fmt::format("(*inst.{}[id])", name);
                    +
                    937  }
                    +
                    938 
                    +
                    939 
                    +
                    940  throw std::runtime_error("Not implemented. [nvueir]");
                    +
                    941 }
                    +
                    942 
                    +
                    943 
                    + +
                    945  bool use_instance) const {
                    +
                    946  auto i_var = var_info.offset;
                    +
                    947  auto var_name = var_info.symbol->get_name();
                    948 
                    -
                    949 
                    - -
                    951  bool use_instance) const {
                    -
                    952  auto i_var = var_info.offset;
                    -
                    953  auto var_name = var_info.symbol->get_name();
                    -
                    954 
                    -
                    955  if (use_instance) {
                    +
                    949  if (use_instance) {
                    +
                    950  if (var_info.symbol->is_array()) {
                    +
                    951  return fmt::format("(_thread_vars.{}_ptr(id))", var_name);
                    +
                    952  } else {
                    +
                    953  return fmt::format("_thread_vars.{}(id)", var_name);
                    +
                    954  }
                    +
                    955  } else {
                    956  if (var_info.symbol->is_array()) {
                    -
                    957  return fmt::format("(_thread_vars.{}_ptr(id))", var_name);
                    +
                    957  return fmt::format("({}.thread_data + {})", global_struct_instance(), i_var);
                    958  } else {
                    -
                    959  return fmt::format("_thread_vars.{}(id)", var_name);
                    +
                    959  return fmt::format("{}.thread_data[{}]", global_struct_instance(), i_var);
                    960  }
                    -
                    961  } else {
                    -
                    962  if (var_info.symbol->is_array()) {
                    -
                    963  return fmt::format("({}.thread_data + {})", global_struct_instance(), i_var);
                    -
                    964  } else {
                    -
                    965  return fmt::format("{}.thread_data[{}]", global_struct_instance(), i_var);
                    -
                    966  }
                    -
                    967  }
                    -
                    968 }
                    -
                    969 
                    -
                    970 
                    - -
                    972  bool use_instance) const {
                    -
                    973  if (use_instance) {
                    -
                    974  return fmt::format("inst.{}->{}", naming::INST_GLOBAL_MEMBER, symbol->get_name());
                    -
                    975  } else {
                    -
                    976  return fmt::format("{}.{}", global_struct_instance(), symbol->get_name());
                    -
                    977  }
                    -
                    978 }
                    -
                    979 
                    +
                    961  }
                    +
                    962 }
                    +
                    963 
                    +
                    964 
                    + +
                    966  bool use_instance) const {
                    +
                    967  if (use_instance) {
                    +
                    968  return fmt::format("inst.{}->{}", naming::INST_GLOBAL_MEMBER, symbol->get_name());
                    +
                    969  } else {
                    +
                    970  return fmt::format("{}.{}", global_struct_instance(), symbol->get_name());
                    +
                    971  }
                    +
                    972 }
                    +
                    973 
                    +
                    974 
                    +
                    975 std::string CodegenNeuronCppVisitor::get_pointer_name(const std::string& name) const {
                    +
                    976  auto name_comparator = [&name](const auto& sym) { return name == get_name(sym); };
                    +
                    977 
                    +
                    978  auto var =
                    +
                    979  std::find_if(codegen_int_variables.begin(), codegen_int_variables.end(), name_comparator);
                    980 
                    -
                    981 std::string CodegenNeuronCppVisitor::get_pointer_name(const std::string& name) const {
                    -
                    982  auto name_comparator = [&name](const auto& sym) { return name == get_name(sym); };
                    -
                    983 
                    -
                    984  auto var =
                    -
                    985  std::find_if(codegen_int_variables.begin(), codegen_int_variables.end(), name_comparator);
                    -
                    986 
                    -
                    987  if (var == codegen_int_variables.end()) {
                    -
                    988  throw std::runtime_error("Only integer variables have a 'pointer name'.");
                    -
                    989  }
                    -
                    990  auto position = position_of_int_var(name);
                    -
                    991  return fmt::format("_ppvar[{}].literal_value<void*>()", position);
                    -
                    992 }
                    -
                    993 
                    -
                    994 
                    -
                    995 std::string CodegenNeuronCppVisitor::get_variable_name(const std::string& name,
                    -
                    996  bool use_instance) const {
                    -
                    997  std::string varname = update_if_ion_variable_name(name);
                    -
                    998  if (!info.artificial_cell && varname == "v") {
                    - -
                    1000  }
                    -
                    1001 
                    -
                    1002  auto name_comparator = [&varname](const auto& sym) { return varname == get_name(sym); };
                    -
                    1003 
                    -
                    1004  if (name == naming::POINT_PROCESS_VARIABLE) {
                    -
                    1005  if (printing_net_receive) {
                    -
                    1006  // In net_receive blocks, the point process is passed in as an
                    -
                    1007  // argument called:
                    -
                    1008  return "_pnt";
                    -
                    1009  }
                    -
                    1010  // The "integer variable" branch will pick up the correct `_ppvar` when
                    -
                    1011  // not printing a NET_RECEIVE block.
                    -
                    1012  }
                    -
                    1013 
                    -
                    1014  if (stringutils::starts_with(name, "_ptable_")) {
                    -
                    1015  return fmt::format("{}.{}", global_struct_instance(), name);
                    -
                    1016  }
                    -
                    1017 
                    -
                    1018  // float variable
                    -
                    1019  auto f = std::find_if(codegen_float_variables.begin(),
                    -
                    1020  codegen_float_variables.end(),
                    -
                    1021  name_comparator);
                    -
                    1022  if (f != codegen_float_variables.end()) {
                    -
                    1023  return float_variable_name(*f, use_instance);
                    -
                    1024  }
                    -
                    1025 
                    -
                    1026  // integer variable
                    -
                    1027  auto i =
                    -
                    1028  std::find_if(codegen_int_variables.begin(), codegen_int_variables.end(), name_comparator);
                    -
                    1029  if (i != codegen_int_variables.end()) {
                    -
                    1030  return int_variable_name(*i, varname, use_instance);
                    -
                    1031  }
                    -
                    1032 
                    -
                    1033  // thread variable
                    -
                    1034  auto t = std::find_if(codegen_thread_variables.begin(),
                    -
                    1035  codegen_thread_variables.end(),
                    -
                    1036  name_comparator);
                    -
                    1037  if (t != codegen_thread_variables.end()) {
                    -
                    1038  return thread_variable_name(*t, use_instance);
                    -
                    1039  }
                    -
                    1040 
                    -
                    1041  // global variable
                    -
                    1042  auto g = std::find_if(codegen_global_variables.begin(),
                    -
                    1043  codegen_global_variables.end(),
                    -
                    1044  name_comparator);
                    -
                    1045  if (g != codegen_global_variables.end()) {
                    -
                    1046  return global_variable_name(*g, use_instance);
                    -
                    1047  }
                    -
                    1048 
                    -
                    1049  if (varname == naming::NTHREAD_DT_VARIABLE) {
                    -
                    1050  return std::string("nt->_") + naming::NTHREAD_DT_VARIABLE;
                    -
                    1051  }
                    -
                    1052 
                    -
                    1053  if (varname == naming::NTHREAD_T_VARIABLE) {
                    -
                    1054  return std::string("nt->_") + naming::NTHREAD_T_VARIABLE;
                    -
                    1055  }
                    -
                    1056 
                    -
                    1057  // external variable
                    -
                    1058  auto e = std::find_if(info.external_variables.begin(),
                    -
                    1059  info.external_variables.end(),
                    -
                    1060  name_comparator);
                    -
                    1061  if (e != info.external_variables.end()) {
                    -
                    1062  return fmt::format("{}()", varname);
                    -
                    1063  }
                    -
                    1064 
                    -
                    1065  auto const iter =
                    -
                    1066  std::find_if(info.neuron_global_variables.begin(),
                    -
                    1067  info.neuron_global_variables.end(),
                    -
                    1068  [&varname](auto const& entry) { return entry.first->get_name() == varname; });
                    -
                    1069  if (iter != info.neuron_global_variables.end()) {
                    -
                    1070  std::string ret;
                    -
                    1071  if (use_instance) {
                    -
                    1072  ret = "*(inst.";
                    -
                    1073  }
                    -
                    1074  ret.append(varname);
                    -
                    1075  if (use_instance) {
                    -
                    1076  ret.append(")");
                    -
                    1077  }
                    -
                    1078  return ret;
                    -
                    1079  }
                    -
                    1080 
                    -
                    1081  // otherwise return original name
                    -
                    1082  return varname;
                    -
                    1083 }
                    +
                    981  if (var == codegen_int_variables.end()) {
                    +
                    982  throw std::runtime_error("Only integer variables have a 'pointer name'.");
                    +
                    983  }
                    +
                    984  auto position = position_of_int_var(name);
                    +
                    985  return fmt::format("_ppvar[{}].literal_value<void*>()", position);
                    +
                    986 }
                    +
                    987 
                    +
                    988 
                    +
                    989 std::string CodegenNeuronCppVisitor::get_variable_name(const std::string& name,
                    +
                    990  bool use_instance) const {
                    +
                    991  std::string varname = update_if_ion_variable_name(name);
                    +
                    992  if (!info.artificial_cell && varname == "v") {
                    + +
                    994  }
                    +
                    995 
                    +
                    996  auto name_comparator = [&varname](const auto& sym) { return varname == get_name(sym); };
                    +
                    997 
                    +
                    998  if (name == naming::POINT_PROCESS_VARIABLE) {
                    +
                    999  if (printing_net_receive) {
                    +
                    1000  // In net_receive blocks, the point process is passed in as an
                    +
                    1001  // argument called:
                    +
                    1002  return "_pnt";
                    +
                    1003  }
                    +
                    1004  // The "integer variable" branch will pick up the correct `_ppvar` when
                    +
                    1005  // not printing a NET_RECEIVE block.
                    +
                    1006  }
                    +
                    1007 
                    +
                    1008  if (stringutils::starts_with(name, "_ptable_")) {
                    +
                    1009  return fmt::format("{}.{}", global_struct_instance(), name);
                    +
                    1010  }
                    +
                    1011 
                    +
                    1012  // float variable
                    +
                    1013  auto f = std::find_if(codegen_float_variables.begin(),
                    +
                    1014  codegen_float_variables.end(),
                    +
                    1015  name_comparator);
                    +
                    1016  if (f != codegen_float_variables.end()) {
                    +
                    1017  return float_variable_name(*f, use_instance);
                    +
                    1018  }
                    +
                    1019 
                    +
                    1020  // integer variable
                    +
                    1021  auto i =
                    +
                    1022  std::find_if(codegen_int_variables.begin(), codegen_int_variables.end(), name_comparator);
                    +
                    1023  if (i != codegen_int_variables.end()) {
                    +
                    1024  return int_variable_name(*i, varname, use_instance);
                    +
                    1025  }
                    +
                    1026 
                    +
                    1027  // thread variable
                    +
                    1028  auto t = std::find_if(codegen_thread_variables.begin(),
                    +
                    1029  codegen_thread_variables.end(),
                    +
                    1030  name_comparator);
                    +
                    1031  if (t != codegen_thread_variables.end()) {
                    +
                    1032  return thread_variable_name(*t, use_instance);
                    +
                    1033  }
                    +
                    1034 
                    +
                    1035  // global variable
                    +
                    1036  auto g = std::find_if(codegen_global_variables.begin(),
                    +
                    1037  codegen_global_variables.end(),
                    +
                    1038  name_comparator);
                    +
                    1039  if (g != codegen_global_variables.end()) {
                    +
                    1040  return global_variable_name(*g, use_instance);
                    +
                    1041  }
                    +
                    1042 
                    +
                    1043  if (varname == naming::NTHREAD_DT_VARIABLE) {
                    +
                    1044  return std::string("nt->_") + naming::NTHREAD_DT_VARIABLE;
                    +
                    1045  }
                    +
                    1046 
                    +
                    1047  if (varname == naming::NTHREAD_T_VARIABLE) {
                    +
                    1048  return std::string("nt->_") + naming::NTHREAD_T_VARIABLE;
                    +
                    1049  }
                    +
                    1050 
                    +
                    1051  // external variable
                    +
                    1052  auto e = std::find_if(info.external_variables.begin(),
                    +
                    1053  info.external_variables.end(),
                    +
                    1054  name_comparator);
                    +
                    1055  if (e != info.external_variables.end()) {
                    +
                    1056  return fmt::format("{}()", varname);
                    +
                    1057  }
                    +
                    1058 
                    +
                    1059  auto const iter =
                    +
                    1060  std::find_if(info.neuron_global_variables.begin(),
                    +
                    1061  info.neuron_global_variables.end(),
                    +
                    1062  [&varname](auto const& entry) { return entry.first->get_name() == varname; });
                    +
                    1063  if (iter != info.neuron_global_variables.end()) {
                    +
                    1064  std::string ret;
                    +
                    1065  if (use_instance) {
                    +
                    1066  ret = "*(inst.";
                    +
                    1067  }
                    +
                    1068  ret.append(varname);
                    +
                    1069  if (use_instance) {
                    +
                    1070  ret.append(")");
                    +
                    1071  }
                    +
                    1072  return ret;
                    +
                    1073  }
                    +
                    1074 
                    +
                    1075  // otherwise return original name
                    +
                    1076  return varname;
                    +
                    1077 }
                    +
                    1078 
                    +
                    1079 
                    +
                    1080 /****************************************************************************************/
                    +
                    1081 /* Main printing routines for code generation */
                    +
                    1082 /****************************************************************************************/
                    +
                    1083 
                    1084 
                    -
                    1085 
                    -
                    1086 /****************************************************************************************/
                    -
                    1087 /* Main printing routines for code generation */
                    -
                    1088 /****************************************************************************************/
                    -
                    1089 
                    -
                    1090 
                    - -
                    1092  printer->add_newline();
                    -
                    1093  printer->add_multi_line(R"CODE(
                    -
                    1094  #include <Eigen/Dense>
                    -
                    1095  #include <Eigen/LU>
                    -
                    1096  #include <math.h>
                    -
                    1097  #include <stdio.h>
                    -
                    1098  #include <stdlib.h>
                    -
                    1099  #include <vector>
                    -
                    1100  )CODE");
                    -
                    1101  if (info.eigen_newton_solver_exist) {
                    -
                    1102  printer->add_multi_line(nmodl::solvers::newton_hpp);
                    -
                    1103  }
                    -
                    1104 }
                    -
                    1105 
                    -
                    1106 
                    - -
                    1108  printer->add_newline();
                    -
                    1109  printer->add_multi_line(R"CODE(
                    -
                    1110  #include "mech_api.h"
                    -
                    1111  #include "neuron/cache/mechanism_range.hpp"
                    -
                    1112  #include "nrniv_mf.h"
                    -
                    1113  #include "section_fwd.hpp"
                    -
                    1114  )CODE");
                    -
                    1115 }
                    -
                    1116 
                    -
                    1117 
                    -
                    1118 void CodegenNeuronCppVisitor::print_sdlists_init(bool /* print_initializers */) {
                    -
                    1119  /// _initlists() should only be called once by the mechanism registration function
                    -
                    1120  /// (_<mod_file>_reg())
                    -
                    1121  printer->add_newline(2);
                    -
                    1122  printer->push_block("static void _initlists()");
                    -
                    1123  for (auto i = 0; i < info.prime_variables_by_order.size(); ++i) {
                    -
                    1124  const auto& prime_var = info.prime_variables_by_order[i];
                    -
                    1125  /// TODO: Something similar needs to happen for slist/dlist2 but I don't know their usage at
                    -
                    1126  // the moment
                    -
                    1127  /// TODO: We have to do checks and add errors similar to nocmodl in the
                    -
                    1128  // SemanticAnalysisVisitor
                    -
                    1129  if (prime_var->is_array()) {
                    -
                    1130  /// TODO: Needs a for loop here. Look at
                    -
                    1131  // https://github.com/neuronsimulator/nrn/blob/df001a436bcb4e23d698afe66c2a513819a6bfe8/src/nmodl/deriv.cpp#L524
                    -
                    1132  /// TODO: Also needs a test
                    -
                    1133  printer->fmt_push_block("for (int _i = 0; _i < {}; ++_i)", prime_var->get_length());
                    -
                    1134  printer->fmt_line("/* {}[{}] */", prime_var->get_name(), prime_var->get_length());
                    -
                    1135  printer->fmt_line("_slist1[{}+_i] = {{{}, _i}};",
                    -
                    1136  i,
                    -
                    1137  position_of_float_var(prime_var->get_name()));
                    -
                    1138  const auto prime_var_deriv_name = "D" + prime_var->get_name();
                    -
                    1139  printer->fmt_line("/* {}[{}] */", prime_var_deriv_name, prime_var->get_length());
                    -
                    1140  printer->fmt_line("_dlist1[{}+_i] = {{{}, _i}};",
                    + +
                    1086  printer->add_newline();
                    +
                    1087  printer->add_multi_line(R"CODE(
                    +
                    1088  #include <Eigen/Dense>
                    +
                    1089  #include <Eigen/LU>
                    +
                    1090  #include <math.h>
                    +
                    1091  #include <stdio.h>
                    +
                    1092  #include <stdlib.h>
                    +
                    1093  #include <vector>
                    +
                    1094  )CODE");
                    +
                    1095  if (info.eigen_newton_solver_exist) {
                    +
                    1096  printer->add_multi_line(nmodl::solvers::newton_hpp);
                    +
                    1097  }
                    +
                    1098 }
                    +
                    1099 
                    +
                    1100 
                    + +
                    1102  printer->add_newline();
                    +
                    1103  printer->add_multi_line(R"CODE(
                    +
                    1104  #include "mech_api.h"
                    +
                    1105  #include "neuron/cache/mechanism_range.hpp"
                    +
                    1106  #include "nrniv_mf.h"
                    +
                    1107  #include "section_fwd.hpp"
                    +
                    1108  )CODE");
                    +
                    1109 }
                    +
                    1110 
                    +
                    1111 
                    +
                    1112 void CodegenNeuronCppVisitor::print_sdlists_init(bool /* print_initializers */) {
                    +
                    1113  /// _initlists() should only be called once by the mechanism registration function
                    +
                    1114  /// (_<mod_file>_reg())
                    +
                    1115  printer->add_newline(2);
                    +
                    1116  printer->push_block("static void _initlists()");
                    +
                    1117  for (auto i = 0; i < info.prime_variables_by_order.size(); ++i) {
                    +
                    1118  const auto& prime_var = info.prime_variables_by_order[i];
                    +
                    1119  /// TODO: Something similar needs to happen for slist/dlist2 but I don't know their usage at
                    +
                    1120  // the moment
                    +
                    1121  /// TODO: We have to do checks and add errors similar to nocmodl in the
                    +
                    1122  // SemanticAnalysisVisitor
                    +
                    1123  if (prime_var->is_array()) {
                    +
                    1124  /// TODO: Needs a for loop here. Look at
                    +
                    1125  // https://github.com/neuronsimulator/nrn/blob/df001a436bcb4e23d698afe66c2a513819a6bfe8/src/nmodl/deriv.cpp#L524
                    +
                    1126  /// TODO: Also needs a test
                    +
                    1127  printer->fmt_push_block("for (int _i = 0; _i < {}; ++_i)", prime_var->get_length());
                    +
                    1128  printer->fmt_line("/* {}[{}] */", prime_var->get_name(), prime_var->get_length());
                    +
                    1129  printer->fmt_line("_slist1[{}+_i] = {{{}, _i}};",
                    +
                    1130  i,
                    +
                    1131  position_of_float_var(prime_var->get_name()));
                    +
                    1132  const auto prime_var_deriv_name = "D" + prime_var->get_name();
                    +
                    1133  printer->fmt_line("/* {}[{}] */", prime_var_deriv_name, prime_var->get_length());
                    +
                    1134  printer->fmt_line("_dlist1[{}+_i] = {{{}, _i}};",
                    +
                    1135  i,
                    +
                    1136  position_of_float_var(prime_var_deriv_name));
                    +
                    1137  printer->pop_block();
                    +
                    1138  } else {
                    +
                    1139  printer->fmt_line("/* {} */", prime_var->get_name());
                    +
                    1140  printer->fmt_line("_slist1[{}] = {{{}, 0}};",
                    1141  i,
                    -
                    1142  position_of_float_var(prime_var_deriv_name));
                    -
                    1143  printer->pop_block();
                    -
                    1144  } else {
                    -
                    1145  printer->fmt_line("/* {} */", prime_var->get_name());
                    -
                    1146  printer->fmt_line("_slist1[{}] = {{{}, 0}};",
                    -
                    1147  i,
                    -
                    1148  position_of_float_var(prime_var->get_name()));
                    -
                    1149  const auto prime_var_deriv_name = "D" + prime_var->get_name();
                    -
                    1150  printer->fmt_line("/* {} */", prime_var_deriv_name);
                    -
                    1151  printer->fmt_line("_dlist1[{}] = {{{}, 0}};",
                    -
                    1152  i,
                    -
                    1153  position_of_float_var(prime_var_deriv_name));
                    -
                    1154  }
                    -
                    1155  }
                    -
                    1156  printer->pop_block();
                    +
                    1142  position_of_float_var(prime_var->get_name()));
                    +
                    1143  const auto prime_var_deriv_name = "D" + prime_var->get_name();
                    +
                    1144  printer->fmt_line("/* {} */", prime_var_deriv_name);
                    +
                    1145  printer->fmt_line("_dlist1[{}] = {{{}, 0}};",
                    +
                    1146  i,
                    +
                    1147  position_of_float_var(prime_var_deriv_name));
                    +
                    1148  }
                    +
                    1149  }
                    +
                    1150  printer->pop_block();
                    +
                    1151 }
                    +
                    1152 
                    + +
                    1154  auto params = internal_method_parameters();
                    +
                    1155 
                    +
                    1156  return params;
                    1157 }
                    1158 
                    - -
                    1160  auto params = internal_method_parameters();
                    -
                    1161 
                    -
                    1162  return params;
                    -
                    1163 }
                    -
                    1164 
                    - -
                    1166  const auto value_initialize = print_initializers ? "{}" : "";
                    -
                    1167 
                    -
                    1168  /// TODO: Print only global variables printed in NEURON
                    -
                    1169  printer->add_newline(2);
                    -
                    1170  printer->add_line("/* NEURON global variables */");
                    -
                    1171  if (info.primes_size != 0) {
                    -
                    1172  printer->fmt_line("static neuron::container::field_index _slist1[{0}], _dlist1[{0}];",
                    -
                    1173  info.primes_size);
                    -
                    1174  }
                    -
                    1175 
                    -
                    1176  for (const auto& ion: info.ions) {
                    -
                    1177  printer->fmt_line("static Symbol* _{}_sym;", ion.name);
                    -
                    1178  }
                    -
                    1179 
                    -
                    1180  if (info.emit_cvode) {
                    -
                    1181  printer->add_line("static Symbol** _atollist;");
                    -
                    1182  printer->push_block("static HocStateTolerance _hoc_state_tol[] =");
                    -
                    1183  printer->add_line("{0, 0}");
                    -
                    1184  printer->pop_block(";");
                    -
                    1185  }
                    -
                    1186 
                    -
                    1187  printer->add_line("static int mech_type;");
                    -
                    1188 
                    -
                    1189  if (info.point_process) {
                    -
                    1190  printer->add_line("static int _pointtype;");
                    -
                    1191  } else {
                    -
                    1192  printer->add_multi_line(R"CODE(
                    -
                    1193  static Prop* _extcall_prop;
                    -
                    1194  /* _prop_id kind of shadows _extcall_prop to allow validity checking. */
                    -
                    1195  static _nrn_non_owning_id_without_container _prop_id{};)CODE");
                    -
                    1196  }
                    -
                    1197 
                    -
                    1198  printer->add_line("static _nrn_mechanism_std_vector<Datum> _extcall_thread;");
                    + +
                    1160  const auto value_initialize = print_initializers ? "{}" : "";
                    +
                    1161 
                    +
                    1162  /// TODO: Print only global variables printed in NEURON
                    +
                    1163  printer->add_newline(2);
                    +
                    1164  printer->add_line("/* NEURON global variables */");
                    +
                    1165  if (info.primes_size != 0) {
                    +
                    1166  printer->fmt_line("static neuron::container::field_index _slist1[{0}], _dlist1[{0}];",
                    +
                    1167  info.primes_size);
                    +
                    1168  }
                    +
                    1169 
                    +
                    1170  for (const auto& ion: info.ions) {
                    +
                    1171  printer->fmt_line("static Symbol* _{}_sym;", ion.name);
                    +
                    1172  }
                    +
                    1173 
                    +
                    1174  if (info.emit_cvode) {
                    +
                    1175  printer->add_line("static Symbol** _atollist;");
                    +
                    1176  printer->push_block("static HocStateTolerance _hoc_state_tol[] =");
                    +
                    1177  printer->add_line("{0, 0}");
                    +
                    1178  printer->pop_block(";");
                    +
                    1179  }
                    +
                    1180 
                    +
                    1181  printer->add_line("static int mech_type;");
                    +
                    1182 
                    +
                    1183  if (info.point_process) {
                    +
                    1184  printer->add_line("static int _pointtype;");
                    +
                    1185  } else {
                    +
                    1186  printer->add_multi_line(R"CODE(
                    +
                    1187  static Prop* _extcall_prop;
                    +
                    1188  /* _prop_id kind of shadows _extcall_prop to allow validity checking. */
                    +
                    1189  static _nrn_non_owning_id_without_container _prop_id{};)CODE");
                    +
                    1190  }
                    +
                    1191 
                    +
                    1192  printer->add_line("static _nrn_mechanism_std_vector<Datum> _extcall_thread;");
                    +
                    1193 
                    +
                    1194  // Start printing the CNRN-style global variables.
                    +
                    1195  auto float_type = default_float_data_type();
                    +
                    1196  printer->add_newline(2);
                    +
                    1197  printer->add_line("/** all global variables */");
                    +
                    1198  printer->fmt_push_block("struct {}", global_struct());
                    1199 
                    -
                    1200  // Start printing the CNRN-style global variables.
                    -
                    1201  auto float_type = default_float_data_type();
                    -
                    1202  printer->add_newline(2);
                    -
                    1203  printer->add_line("/** all global variables */");
                    -
                    1204  printer->fmt_push_block("struct {}", global_struct());
                    -
                    1205 
                    -
                    1206  if (!info.ions.empty()) {
                    -
                    1207  // TODO implement these when needed.
                    -
                    1208  }
                    +
                    1200  if (!info.ions.empty()) {
                    +
                    1201  // TODO implement these when needed.
                    +
                    1202  }
                    +
                    1203 
                    +
                    1204  if (!info.thread_variables.empty()) {
                    +
                    1205  size_t prefix_sum = 0;
                    +
                    1206  for (size_t i = 0; i < info.thread_variables.size(); ++i) {
                    +
                    1207  const auto& var = info.thread_variables[i];
                    +
                    1208  codegen_thread_variables.push_back({var, i, prefix_sum});
                    1209 
                    -
                    1210  if (!info.thread_variables.empty()) {
                    -
                    1211  size_t prefix_sum = 0;
                    -
                    1212  for (size_t i = 0; i < info.thread_variables.size(); ++i) {
                    -
                    1213  const auto& var = info.thread_variables[i];
                    -
                    1214  codegen_thread_variables.push_back({var, i, prefix_sum});
                    -
                    1215 
                    -
                    1216  prefix_sum += var->get_length();
                    -
                    1217  }
                    -
                    1218  }
                    -
                    1219 
                    -
                    1220 
                    -
                    1221  for (const auto& var: info.global_variables) {
                    -
                    1222  codegen_global_variables.push_back(var);
                    -
                    1223  }
                    -
                    1224 
                    -
                    1225  if (info.vectorize && !info.top_local_variables.empty()) {
                    -
                    1226  size_t prefix_sum = info.thread_var_data_size;
                    -
                    1227  size_t n_thread_vars = codegen_thread_variables.size();
                    -
                    1228  for (size_t i = 0; i < info.top_local_variables.size(); ++i) {
                    -
                    1229  const auto& var = info.top_local_variables[i];
                    -
                    1230  codegen_thread_variables.push_back({var, n_thread_vars + i, prefix_sum});
                    -
                    1231 
                    -
                    1232  prefix_sum += var->get_length();
                    -
                    1233  }
                    -
                    1234  }
                    -
                    1235 
                    -
                    1236  if (!info.vectorize && !info.top_local_variables.empty()) {
                    -
                    1237  for (size_t i = 0; i < info.top_local_variables.size(); ++i) {
                    -
                    1238  const auto& var = info.top_local_variables[i];
                    -
                    1239  codegen_global_variables.push_back(var);
                    -
                    1240  }
                    -
                    1241  }
                    -
                    1242 
                    +
                    1210  prefix_sum += var->get_length();
                    +
                    1211  }
                    +
                    1212  }
                    +
                    1213 
                    +
                    1214 
                    +
                    1215  for (const auto& var: info.global_variables) {
                    +
                    1216  codegen_global_variables.push_back(var);
                    +
                    1217  }
                    +
                    1218 
                    +
                    1219  if (info.vectorize && !info.top_local_variables.empty()) {
                    +
                    1220  size_t prefix_sum = info.thread_var_data_size;
                    +
                    1221  size_t n_thread_vars = codegen_thread_variables.size();
                    +
                    1222  for (size_t i = 0; i < info.top_local_variables.size(); ++i) {
                    +
                    1223  const auto& var = info.top_local_variables[i];
                    +
                    1224  codegen_thread_variables.push_back({var, n_thread_vars + i, prefix_sum});
                    +
                    1225 
                    +
                    1226  prefix_sum += var->get_length();
                    +
                    1227  }
                    +
                    1228  }
                    +
                    1229 
                    +
                    1230  if (!info.vectorize && !info.top_local_variables.empty()) {
                    +
                    1231  for (size_t i = 0; i < info.top_local_variables.size(); ++i) {
                    +
                    1232  const auto& var = info.top_local_variables[i];
                    +
                    1233  codegen_global_variables.push_back(var);
                    +
                    1234  }
                    +
                    1235  }
                    +
                    1236 
                    +
                    1237 
                    +
                    1238  if (!codegen_thread_variables.empty()) {
                    +
                    1239  if (!info.vectorize) {
                    +
                    1240  // MOD files that aren't "VECTORIZED" don't have thread data.
                    +
                    1241  throw std::runtime_error("Found thread variables with `vectorize == false`.");
                    +
                    1242  }
                    1243 
                    -
                    1244  if (!codegen_thread_variables.empty()) {
                    -
                    1245  if (!info.vectorize) {
                    -
                    1246  // MOD files that aren't "VECTORIZED" don't have thread data.
                    -
                    1247  throw std::runtime_error("Found thread variables with `vectorize == false`.");
                    -
                    1248  }
                    -
                    1249 
                    -
                    1250  codegen_global_variables.push_back(make_symbol("thread_data_in_use"));
                    +
                    1244  codegen_global_variables.push_back(make_symbol("thread_data_in_use"));
                    +
                    1245 
                    +
                    1246  auto symbol = make_symbol("thread_data");
                    +
                    1247  auto thread_data_size = info.thread_var_data_size + info.top_local_thread_size;
                    +
                    1248  symbol->set_as_array(thread_data_size);
                    +
                    1249  codegen_global_variables.push_back(symbol);
                    +
                    1250  }
                    1251 
                    -
                    1252  auto symbol = make_symbol("thread_data");
                    -
                    1253  auto thread_data_size = info.thread_var_data_size + info.top_local_thread_size;
                    -
                    1254  symbol->set_as_array(thread_data_size);
                    -
                    1255  codegen_global_variables.push_back(symbol);
                    -
                    1256  }
                    -
                    1257 
                    -
                    1258  for (const auto& var: info.state_vars) {
                    -
                    1259  auto name = var->get_name() + "0";
                    -
                    1260  auto symbol = program_symtab->lookup(name);
                    -
                    1261  if (symbol == nullptr) {
                    -
                    1262  codegen_global_variables.push_back(make_symbol(name));
                    -
                    1263  }
                    -
                    1264  }
                    -
                    1265 
                    -
                    1266  for (const auto& var: info.constant_variables) {
                    -
                    1267  codegen_global_variables.push_back(var);
                    -
                    1268  }
                    -
                    1269 
                    -
                    1270  for (const auto& var: codegen_global_variables) {
                    -
                    1271  auto name = var->get_name();
                    -
                    1272  auto length = var->get_length();
                    -
                    1273  if (var->is_array()) {
                    -
                    1274  printer->fmt_line("{} {}[{}] /* TODO init const-array */;", float_type, name, length);
                    -
                    1275  } else {
                    -
                    1276  double value{};
                    -
                    1277  if (auto const& value_ptr = var->get_value()) {
                    -
                    1278  value = *value_ptr;
                    -
                    1279  }
                    -
                    1280  printer->fmt_line("{} {}{};",
                    -
                    1281  float_type,
                    -
                    1282  name,
                    -
                    1283  print_initializers ? fmt::format("{{{:g}}}", value) : std::string{});
                    -
                    1284  }
                    -
                    1285  }
                    -
                    1286 
                    -
                    1287  if (info.table_count > 0) {
                    -
                    1288  // basically the same code as coreNEURON uses
                    -
                    1289  printer->fmt_line("double usetable{};", print_initializers ? "{1}" : "");
                    -
                    1290  codegen_global_variables.push_back(make_symbol(naming::USE_TABLE_VARIABLE));
                    -
                    1291 
                    -
                    1292  for (const auto& block: info.functions_with_table) {
                    -
                    1293  const auto& name = block->get_node_name();
                    -
                    1294  printer->fmt_line("{} tmin_{}{};", float_type, name, value_initialize);
                    -
                    1295  printer->fmt_line("{} mfac_{}{};", float_type, name, value_initialize);
                    -
                    1296  codegen_global_variables.push_back(make_symbol("tmin_" + name));
                    -
                    1297  codegen_global_variables.push_back(make_symbol("mfac_" + name));
                    -
                    1298  }
                    -
                    1299 
                    -
                    1300  for (const auto& variable: info.table_statement_variables) {
                    -
                    1301  auto const name = "t_" + variable->get_name();
                    -
                    1302  auto const num_values = variable->get_num_values();
                    -
                    1303  if (variable->is_array()) {
                    -
                    1304  int array_len = variable->get_length();
                    -
                    1305  printer->fmt_line(
                    -
                    1306  "{} {}[{}][{}]{};", float_type, name, array_len, num_values, value_initialize);
                    -
                    1307  } else {
                    -
                    1308  printer->fmt_line("{} {}[{}]{};", float_type, name, num_values, value_initialize);
                    -
                    1309  }
                    -
                    1310  codegen_global_variables.push_back(make_symbol(name));
                    -
                    1311  }
                    -
                    1312  }
                    -
                    1313 
                    -
                    1314  print_global_struct_function_table_ptrs();
                    -
                    1315 
                    -
                    1316  if (info.vectorize && info.thread_data_index) {
                    -
                    1317  // TODO compare CoreNEURON something extcall stuff.
                    -
                    1318  // throw std::runtime_error("Not implemented, global vectorize something else.");
                    -
                    1319  }
                    +
                    1252  for (const auto& var: info.state_vars) {
                    +
                    1253  auto name = var->get_name() + "0";
                    +
                    1254  auto symbol = program_symtab->lookup(name);
                    +
                    1255  if (symbol == nullptr) {
                    +
                    1256  codegen_global_variables.push_back(make_symbol(name));
                    +
                    1257  }
                    +
                    1258  }
                    +
                    1259 
                    +
                    1260  for (const auto& var: info.constant_variables) {
                    +
                    1261  codegen_global_variables.push_back(var);
                    +
                    1262  }
                    +
                    1263 
                    +
                    1264  for (const auto& var: codegen_global_variables) {
                    +
                    1265  auto name = var->get_name();
                    +
                    1266  auto length = var->get_length();
                    +
                    1267  if (var->is_array()) {
                    +
                    1268  printer->fmt_line("{} {}[{}] /* TODO init const-array */;", float_type, name, length);
                    +
                    1269  } else {
                    +
                    1270  double value{};
                    +
                    1271  if (auto const& value_ptr = var->get_value()) {
                    +
                    1272  value = *value_ptr;
                    +
                    1273  }
                    +
                    1274  printer->fmt_line("{} {}{};",
                    +
                    1275  float_type,
                    +
                    1276  name,
                    +
                    1277  print_initializers ? fmt::format("{{{:g}}}", value) : std::string{});
                    +
                    1278  }
                    +
                    1279  }
                    +
                    1280 
                    +
                    1281  if (info.table_count > 0) {
                    +
                    1282  // basically the same code as coreNEURON uses
                    +
                    1283  printer->fmt_line("double usetable{};", print_initializers ? "{1}" : "");
                    +
                    1284  codegen_global_variables.push_back(make_symbol(naming::USE_TABLE_VARIABLE));
                    +
                    1285 
                    +
                    1286  for (const auto& block: info.functions_with_table) {
                    +
                    1287  const auto& name = block->get_node_name();
                    +
                    1288  printer->fmt_line("{} tmin_{}{};", float_type, name, value_initialize);
                    +
                    1289  printer->fmt_line("{} mfac_{}{};", float_type, name, value_initialize);
                    +
                    1290  codegen_global_variables.push_back(make_symbol("tmin_" + name));
                    +
                    1291  codegen_global_variables.push_back(make_symbol("mfac_" + name));
                    +
                    1292  }
                    +
                    1293 
                    +
                    1294  for (const auto& variable: info.table_statement_variables) {
                    +
                    1295  auto const name = "t_" + variable->get_name();
                    +
                    1296  auto const num_values = variable->get_num_values();
                    +
                    1297  if (variable->is_array()) {
                    +
                    1298  int array_len = variable->get_length();
                    +
                    1299  printer->fmt_line(
                    +
                    1300  "{} {}[{}][{}]{};", float_type, name, array_len, num_values, value_initialize);
                    +
                    1301  } else {
                    +
                    1302  printer->fmt_line("{} {}[{}]{};", float_type, name, num_values, value_initialize);
                    +
                    1303  }
                    +
                    1304  codegen_global_variables.push_back(make_symbol(name));
                    +
                    1305  }
                    +
                    1306  }
                    +
                    1307 
                    +
                    1308  print_global_struct_function_table_ptrs();
                    +
                    1309 
                    +
                    1310  if (info.vectorize && info.thread_data_index) {
                    +
                    1311  // TODO compare CoreNEURON something extcall stuff.
                    +
                    1312  // throw std::runtime_error("Not implemented, global vectorize something else.");
                    +
                    1313  }
                    +
                    1314 
                    +
                    1315  if (info.diam_used) {
                    +
                    1316  printer->fmt_line("Symbol* _morphology_sym;");
                    +
                    1317  }
                    +
                    1318 
                    +
                    1319  printer->pop_block(";");
                    1320 
                    -
                    1321  if (info.diam_used) {
                    -
                    1322  printer->fmt_line("Symbol* _morphology_sym;");
                    -
                    1323  }
                    +
                    1321  print_global_var_struct_assertions();
                    +
                    1322  print_global_var_struct_decl();
                    +
                    1323  print_global_var_external_access();
                    1324 
                    -
                    1325  printer->pop_block(";");
                    -
                    1326 
                    -
                    1327  print_global_var_struct_assertions();
                    -
                    1328  print_global_var_struct_decl();
                    -
                    1329  print_global_var_external_access();
                    -
                    1330 
                    -
                    1331  print_global_param_default_values();
                    -
                    1332 }
                    -
                    1333 
                    - -
                    1335  for (const auto& var: codegen_global_variables) {
                    -
                    1336  auto var_name = get_name(var);
                    -
                    1337  auto var_expr = get_variable_name(var_name, false);
                    -
                    1338 
                    -
                    1339  printer->fmt_push_block("auto {}() -> std::decay<decltype({})>::type ",
                    -
                    1340  method_name(var_name),
                    -
                    1341  var_expr);
                    -
                    1342  printer->fmt_line("return {};", var_expr);
                    -
                    1343  printer->pop_block();
                    -
                    1344  }
                    -
                    1345  if (!codegen_global_variables.empty()) {
                    -
                    1346  printer->add_newline();
                    -
                    1347  }
                    -
                    1348 
                    -
                    1349  for (const auto& var: info.external_variables) {
                    -
                    1350  auto var_name = get_name(var);
                    -
                    1351  printer->fmt_line("double {}();", var_name);
                    -
                    1352  }
                    -
                    1353  if (!info.external_variables.empty()) {
                    -
                    1354  printer->add_newline();
                    -
                    1355  }
                    -
                    1356 }
                    -
                    1357 
                    - -
                    1359  printer->push_block("static std::vector<double> _parameter_defaults =");
                    +
                    1325  print_global_param_default_values();
                    +
                    1326 }
                    +
                    1327 
                    + +
                    1329  for (const auto& var: codegen_global_variables) {
                    +
                    1330  auto var_name = get_name(var);
                    +
                    1331  auto var_expr = get_variable_name(var_name, false);
                    +
                    1332 
                    +
                    1333  printer->fmt_push_block("auto {}() -> std::decay<decltype({})>::type ",
                    +
                    1334  method_name(var_name),
                    +
                    1335  var_expr);
                    +
                    1336  printer->fmt_line("return {};", var_expr);
                    +
                    1337  printer->pop_block();
                    +
                    1338  }
                    +
                    1339  if (!codegen_global_variables.empty()) {
                    +
                    1340  printer->add_newline();
                    +
                    1341  }
                    +
                    1342 
                    +
                    1343  for (const auto& var: info.external_variables) {
                    +
                    1344  auto var_name = get_name(var);
                    +
                    1345  printer->fmt_line("double {}();", var_name);
                    +
                    1346  }
                    +
                    1347  if (!info.external_variables.empty()) {
                    +
                    1348  printer->add_newline();
                    +
                    1349  }
                    +
                    1350 }
                    +
                    1351 
                    + +
                    1353  printer->push_block("static std::vector<double> _parameter_defaults =");
                    +
                    1354 
                    +
                    1355  std::vector<std::string> defaults;
                    +
                    1356  for (const auto& p: info.range_parameter_vars) {
                    +
                    1357  double value = p->get_value() == nullptr ? 0.0 : *p->get_value();
                    +
                    1358  defaults.push_back(fmt::format("{:g} /* {} */", value, p->get_name()));
                    +
                    1359  }
                    1360 
                    -
                    1361  std::vector<std::string> defaults;
                    -
                    1362  for (const auto& p: info.range_parameter_vars) {
                    -
                    1363  double value = p->get_value() == nullptr ? 0.0 : *p->get_value();
                    -
                    1364  defaults.push_back(fmt::format("{:g} /* {} */", value, p->get_name()));
                    -
                    1365  }
                    -
                    1366 
                    -
                    1367  printer->add_multi_line(fmt::format("{}", fmt::join(defaults, ",\n")));
                    -
                    1368  printer->pop_block(";");
                    -
                    1369 }
                    -
                    1370 
                    - -
                    1372  auto variable_printer = [&](const std::vector<SymbolType>& variables, bool if_array) {
                    -
                    1373  for (const auto& variable: variables) {
                    -
                    1374  if (variable->is_array() == if_array) {
                    -
                    1375  // false => do not use the instance struct, which is not
                    -
                    1376  // defined in the global declaration that we are printing
                    -
                    1377  auto name = get_variable_name(variable->get_name(), false);
                    -
                    1378  auto ename = add_escape_quote(variable->get_name() + "_" + info.mod_suffix);
                    -
                    1379  if (if_array) {
                    -
                    1380  auto length = variable->get_length();
                    -
                    1381  printer->fmt_line("{{{}, {}, {}}},", ename, name, length);
                    -
                    1382  } else {
                    -
                    1383  printer->fmt_line("{{{}, &{}}},", ename, name);
                    -
                    1384  }
                    -
                    1385  }
                    -
                    1386  }
                    -
                    1387  };
                    -
                    1388 
                    -
                    1389  auto globals = info.global_variables;
                    -
                    1390  auto thread_vars = info.thread_variables;
                    -
                    1391 
                    -
                    1392  if (info.table_count > 0) {
                    -
                    1393  globals.push_back(make_symbol(naming::USE_TABLE_VARIABLE));
                    -
                    1394  }
                    -
                    1395 
                    -
                    1396  printer->add_newline(2);
                    -
                    1397  printer->add_line("/** connect global (scalar) variables to hoc -- */");
                    -
                    1398  printer->add_line("static DoubScal hoc_scalar_double[] = {");
                    -
                    1399  printer->increase_indent();
                    -
                    1400  variable_printer(globals, false);
                    -
                    1401  variable_printer(thread_vars, false);
                    -
                    1402  printer->add_line("{nullptr, nullptr}");
                    -
                    1403  printer->decrease_indent();
                    -
                    1404  printer->add_line("};");
                    -
                    1405 
                    -
                    1406  printer->add_newline(2);
                    -
                    1407  printer->add_line("/** connect global (array) variables to hoc -- */");
                    -
                    1408  printer->add_line("static DoubVec hoc_vector_double[] = {");
                    -
                    1409  printer->increase_indent();
                    -
                    1410  variable_printer(globals, true);
                    -
                    1411  variable_printer(thread_vars, true);
                    -
                    1412  printer->add_line("{nullptr, nullptr, 0}");
                    -
                    1413  printer->decrease_indent();
                    -
                    1414  printer->add_line("};");
                    -
                    1415 
                    -
                    1416  printer->add_newline(2);
                    -
                    1417  printer->add_line("/* declaration of user functions */");
                    -
                    1418 
                    -
                    1419  auto print_entrypoint_decl = [this](const auto& callables, auto get_name) {
                    -
                    1420  for (const auto& node: callables) {
                    -
                    1421  const auto name = get_name(node);
                    -
                    1422  printer->fmt_line("{};", hoc_function_signature(name));
                    +
                    1361  printer->add_multi_line(fmt::format("{}", fmt::join(defaults, ",\n")));
                    +
                    1362  printer->pop_block(";");
                    +
                    1363 }
                    +
                    1364 
                    + +
                    1366  auto variable_printer = [&](const std::vector<SymbolType>& variables, bool if_array) {
                    +
                    1367  for (const auto& variable: variables) {
                    +
                    1368  if (variable->is_array() == if_array) {
                    +
                    1369  // false => do not use the instance struct, which is not
                    +
                    1370  // defined in the global declaration that we are printing
                    +
                    1371  auto name = get_variable_name(variable->get_name(), false);
                    +
                    1372  auto ename = add_escape_quote(variable->get_name() + "_" + info.mod_suffix);
                    +
                    1373  if (if_array) {
                    +
                    1374  auto length = variable->get_length();
                    +
                    1375  printer->fmt_line("{{{}, {}, {}}},", ename, name, length);
                    +
                    1376  } else {
                    +
                    1377  printer->fmt_line("{{{}, &{}}},", ename, name);
                    +
                    1378  }
                    +
                    1379  }
                    +
                    1380  }
                    +
                    1381  };
                    +
                    1382 
                    +
                    1383  auto globals = info.global_variables;
                    +
                    1384  auto thread_vars = info.thread_variables;
                    +
                    1385 
                    +
                    1386  if (info.table_count > 0) {
                    +
                    1387  globals.push_back(make_symbol(naming::USE_TABLE_VARIABLE));
                    +
                    1388  }
                    +
                    1389 
                    +
                    1390  printer->add_newline(2);
                    +
                    1391  printer->add_line("/** connect global (scalar) variables to hoc -- */");
                    +
                    1392  printer->add_line("static DoubScal hoc_scalar_double[] = {");
                    +
                    1393  printer->increase_indent();
                    +
                    1394  variable_printer(globals, false);
                    +
                    1395  variable_printer(thread_vars, false);
                    +
                    1396  printer->add_line("{nullptr, nullptr}");
                    +
                    1397  printer->decrease_indent();
                    +
                    1398  printer->add_line("};");
                    +
                    1399 
                    +
                    1400  printer->add_newline(2);
                    +
                    1401  printer->add_line("/** connect global (array) variables to hoc -- */");
                    +
                    1402  printer->add_line("static DoubVec hoc_vector_double[] = {");
                    +
                    1403  printer->increase_indent();
                    +
                    1404  variable_printer(globals, true);
                    +
                    1405  variable_printer(thread_vars, true);
                    +
                    1406  printer->add_line("{nullptr, nullptr, 0}");
                    +
                    1407  printer->decrease_indent();
                    +
                    1408  printer->add_line("};");
                    +
                    1409 
                    +
                    1410  printer->add_newline(2);
                    +
                    1411  printer->add_line("/* declaration of user functions */");
                    +
                    1412 
                    +
                    1413  auto print_entrypoint_decl = [this](const auto& callables, auto get_name) {
                    +
                    1414  for (const auto& node: callables) {
                    +
                    1415  const auto name = get_name(node);
                    +
                    1416  printer->fmt_line("{};", hoc_function_signature(name));
                    +
                    1417 
                    +
                    1418  if (!info.point_process) {
                    +
                    1419  printer->fmt_line("{};", py_function_signature(name));
                    +
                    1420  }
                    +
                    1421  }
                    +
                    1422  };
                    1423 
                    -
                    1424  if (!info.point_process) {
                    -
                    1425  printer->fmt_line("{};", py_function_signature(name));
                    -
                    1426  }
                    -
                    1427  }
                    -
                    1428  };
                    -
                    1429 
                    -
                    1430  auto get_name = [](const auto& node) { return node->get_node_name(); };
                    -
                    1431  print_entrypoint_decl(info.functions, get_name);
                    -
                    1432  print_entrypoint_decl(info.procedures, get_name);
                    -
                    1433  print_entrypoint_decl(info.function_tables, get_name);
                    -
                    1434  print_entrypoint_decl(info.function_tables, [](const auto& node) {
                    -
                    1435  auto node_name = node->get_node_name();
                    -
                    1436  return "table_" + node_name;
                    -
                    1437  });
                    -
                    1438 
                    -
                    1439  printer->add_newline(2);
                    -
                    1440  printer->add_line("/* connect user functions to hoc names */");
                    -
                    1441  printer->add_line("static VoidFunc hoc_intfunc[] = {");
                    -
                    1442  printer->increase_indent();
                    -
                    1443  if (info.point_process) {
                    -
                    1444  printer->add_line("{0, 0}");
                    -
                    1445  printer->decrease_indent();
                    -
                    1446  printer->add_line("};");
                    -
                    1447  printer->add_line("static Member_func _member_func[] = {");
                    -
                    1448  printer->increase_indent();
                    -
                    1449  printer->add_multi_line(R"CODE(
                    -
                    1450  {"loc", _hoc_loc_pnt},
                    -
                    1451  {"has_loc", _hoc_has_loc},
                    -
                    1452  {"get_loc", _hoc_get_loc_pnt},)CODE");
                    -
                    1453  } else {
                    -
                    1454  if (info.mod_suffix != "nothing") {
                    -
                    1455  printer->fmt_line("{{\"setdata_{}\", _hoc_setdata}},", info.mod_suffix);
                    -
                    1456  }
                    -
                    1457  }
                    -
                    1458 
                    -
                    1459  auto print_callable_reg = [this](const auto& callables, auto get_name) {
                    -
                    1460  for (const auto& node: callables) {
                    -
                    1461  const auto name = get_name(node);
                    -
                    1462  printer->fmt_line("{{\"{}{}\", {}}},", name, info.rsuffix, hoc_function_name(name));
                    -
                    1463  }
                    -
                    1464  };
                    -
                    1465 
                    -
                    1466  print_callable_reg(info.procedures, get_name);
                    -
                    1467  print_callable_reg(info.functions, get_name);
                    -
                    1468  print_callable_reg(info.function_tables, get_name);
                    -
                    1469  print_callable_reg(info.function_tables, [](const auto& node) {
                    -
                    1470  auto node_name = node->get_node_name();
                    -
                    1471  return "table_" + node_name;
                    -
                    1472  });
                    -
                    1473 
                    -
                    1474  printer->add_line("{nullptr, nullptr}");
                    -
                    1475  printer->decrease_indent();
                    -
                    1476  printer->add_line("};");
                    -
                    1477 
                    -
                    1478 
                    -
                    1479  auto print_py_callable_reg = [this](const auto& callables, auto get_name) {
                    -
                    1480  for (const auto& callable: callables) {
                    -
                    1481  const auto name = get_name(callable);
                    -
                    1482  printer->fmt_line("{{\"{}\", {}}},", name, py_function_name(name));
                    -
                    1483  }
                    -
                    1484  };
                    -
                    1485 
                    -
                    1486  if (!info.point_process) {
                    -
                    1487  printer->push_block("static NPyDirectMechFunc npy_direct_func_proc[] =");
                    -
                    1488  print_py_callable_reg(info.procedures,
                    -
                    1489  [](const auto& callable) { return callable->get_node_name(); });
                    -
                    1490  print_py_callable_reg(info.functions,
                    -
                    1491  [](const auto& callable) { return callable->get_node_name(); });
                    -
                    1492  print_py_callable_reg(info.function_tables,
                    -
                    1493  [](const auto& callable) { return callable->get_node_name(); });
                    -
                    1494  print_py_callable_reg(info.function_tables, [](const auto& callable) {
                    -
                    1495  return "table_" + callable->get_node_name();
                    -
                    1496  });
                    -
                    1497  printer->add_line("{nullptr, nullptr}");
                    -
                    1498  printer->pop_block(";");
                    -
                    1499  }
                    -
                    1500 }
                    -
                    1501 
                    - -
                    1503  printer->add_newline(2);
                    -
                    1504  printer->fmt_push_block("extern \"C\" void _{}_reg()", info.mod_file);
                    -
                    1505  if (info.mod_suffix == "nothing") {
                    -
                    1506  print_mechanism_register_nothing();
                    -
                    1507  } else {
                    -
                    1508  print_mechanism_register_regular();
                    -
                    1509  }
                    -
                    1510  printer->pop_block();
                    -
                    1511 }
                    -
                    1512 
                    - -
                    1514  printer->add_line("_initlists();");
                    -
                    1515  printer->add_newline();
                    -
                    1516 
                    -
                    1517  for (const auto& ion: info.ions) {
                    -
                    1518  double valence = ion.valence.value_or(-10000.0);
                    -
                    1519  printer->fmt_line("ion_reg(\"{}\", {});", ion.name, valence);
                    -
                    1520  }
                    -
                    1521  if (!info.ions.empty()) {
                    -
                    1522  printer->add_newline();
                    -
                    1523  }
                    -
                    1524 
                    -
                    1525  for (const auto& ion: info.ions) {
                    -
                    1526  printer->fmt_line("_{0}_sym = hoc_lookup(\"{0}_ion\");", ion.name);
                    -
                    1527  }
                    -
                    1528  if (!info.ions.empty()) {
                    -
                    1529  printer->add_newline();
                    -
                    1530  }
                    -
                    1531 
                    -
                    1532  const auto compute_functions_parameters =
                    -
                    1533  breakpoint_exist()
                    -
                    1534  ? fmt::format("{}, {}, {}",
                    -
                    1535  nrn_cur_required() ? method_name(naming::NRN_CUR_METHOD) : "nullptr",
                    -
                    1536  method_name(naming::NRN_JACOB_METHOD),
                    -
                    1537  nrn_state_required() ? method_name(naming::NRN_STATE_METHOD) : "nullptr")
                    -
                    1538  : "nullptr, nullptr, nullptr";
                    -
                    1539 
                    -
                    1540 
                    -
                    1541  const auto register_mech_args = fmt::format("{}, {}, {}, {}, {}, {}",
                    -
                    1542  get_channel_info_var_name(),
                    -
                    1543  method_name(naming::NRN_ALLOC_METHOD),
                    -
                    1544  compute_functions_parameters,
                    -
                    1545  method_name(naming::NRN_INIT_METHOD),
                    -
                    1546  info.first_pointer_var_index,
                    -
                    1547  1 + info.thread_data_index);
                    -
                    1548  if (info.point_process) {
                    -
                    1549  printer->fmt_line(
                    -
                    1550  "_pointtype = point_register_mech({}, _hoc_create_pnt, _hoc_destroy_pnt, "
                    -
                    1551  "_member_func);",
                    -
                    1552  register_mech_args);
                    -
                    1553 
                    -
                    1554  if (info.destructor_node) {
                    -
                    1555  printer->fmt_line("register_destructor({});",
                    -
                    1556  method_name(naming::NRN_DESTRUCTOR_METHOD));
                    -
                    1557  }
                    -
                    1558  } else {
                    -
                    1559  printer->fmt_line("register_mech({});", register_mech_args);
                    -
                    1560  }
                    -
                    1561 
                    +
                    1424  auto get_name = [](const auto& node) { return node->get_node_name(); };
                    +
                    1425  print_entrypoint_decl(info.functions, get_name);
                    +
                    1426  print_entrypoint_decl(info.procedures, get_name);
                    +
                    1427  print_entrypoint_decl(info.function_tables, get_name);
                    +
                    1428  print_entrypoint_decl(info.function_tables, [](const auto& node) {
                    +
                    1429  auto node_name = node->get_node_name();
                    +
                    1430  return "table_" + node_name;
                    +
                    1431  });
                    +
                    1432 
                    +
                    1433  printer->add_newline(2);
                    +
                    1434  printer->add_line("/* connect user functions to hoc names */");
                    +
                    1435  printer->add_line("static VoidFunc hoc_intfunc[] = {");
                    +
                    1436  printer->increase_indent();
                    +
                    1437  if (info.point_process) {
                    +
                    1438  printer->add_line("{0, 0}");
                    +
                    1439  printer->decrease_indent();
                    +
                    1440  printer->add_line("};");
                    +
                    1441  printer->add_line("static Member_func _member_func[] = {");
                    +
                    1442  printer->increase_indent();
                    +
                    1443  printer->add_multi_line(R"CODE(
                    +
                    1444  {"loc", _hoc_loc_pnt},
                    +
                    1445  {"has_loc", _hoc_has_loc},
                    +
                    1446  {"get_loc", _hoc_get_loc_pnt},)CODE");
                    +
                    1447  } else {
                    +
                    1448  if (info.mod_suffix != "nothing") {
                    +
                    1449  printer->fmt_line("{{\"setdata_{}\", _hoc_setdata}},", info.mod_suffix);
                    +
                    1450  }
                    +
                    1451  }
                    +
                    1452 
                    +
                    1453  auto print_callable_reg = [this](const auto& callables, auto get_name) {
                    +
                    1454  for (const auto& node: callables) {
                    +
                    1455  const auto name = get_name(node);
                    +
                    1456  printer->fmt_line("{{\"{}{}\", {}}},", name, info.rsuffix, hoc_function_name(name));
                    +
                    1457  }
                    +
                    1458  };
                    +
                    1459 
                    +
                    1460  print_callable_reg(info.procedures, get_name);
                    +
                    1461  print_callable_reg(info.functions, get_name);
                    +
                    1462  print_callable_reg(info.function_tables, get_name);
                    +
                    1463  print_callable_reg(info.function_tables, [](const auto& node) {
                    +
                    1464  auto node_name = node->get_node_name();
                    +
                    1465  return "table_" + node_name;
                    +
                    1466  });
                    +
                    1467 
                    +
                    1468  printer->add_line("{nullptr, nullptr}");
                    +
                    1469  printer->decrease_indent();
                    +
                    1470  printer->add_line("};");
                    +
                    1471 
                    +
                    1472 
                    +
                    1473  auto print_py_callable_reg = [this](const auto& callables, auto get_name) {
                    +
                    1474  for (const auto& callable: callables) {
                    +
                    1475  const auto name = get_name(callable);
                    +
                    1476  printer->fmt_line("{{\"{}\", {}}},", name, py_function_name(name));
                    +
                    1477  }
                    +
                    1478  };
                    +
                    1479 
                    +
                    1480  if (!info.point_process) {
                    +
                    1481  printer->push_block("static NPyDirectMechFunc npy_direct_func_proc[] =");
                    +
                    1482  print_py_callable_reg(info.procedures,
                    +
                    1483  [](const auto& callable) { return callable->get_node_name(); });
                    +
                    1484  print_py_callable_reg(info.functions,
                    +
                    1485  [](const auto& callable) { return callable->get_node_name(); });
                    +
                    1486  print_py_callable_reg(info.function_tables,
                    +
                    1487  [](const auto& callable) { return callable->get_node_name(); });
                    +
                    1488  print_py_callable_reg(info.function_tables, [](const auto& callable) {
                    +
                    1489  return "table_" + callable->get_node_name();
                    +
                    1490  });
                    +
                    1491  printer->add_line("{nullptr, nullptr}");
                    +
                    1492  printer->pop_block(";");
                    +
                    1493  }
                    +
                    1494 }
                    +
                    1495 
                    + +
                    1497  printer->add_newline(2);
                    +
                    1498  printer->fmt_push_block("extern \"C\" void _{}_reg()", info.mod_file);
                    +
                    1499  if (info.mod_suffix == "nothing") {
                    +
                    1500  print_mechanism_register_nothing();
                    +
                    1501  } else {
                    +
                    1502  print_mechanism_register_regular();
                    +
                    1503  }
                    +
                    1504  printer->pop_block();
                    +
                    1505 }
                    +
                    1506 
                    + +
                    1508  printer->add_line("_initlists();");
                    +
                    1509  printer->add_newline();
                    +
                    1510 
                    +
                    1511  for (const auto& ion: info.ions) {
                    +
                    1512  double valence = ion.valence.value_or(-10000.0);
                    +
                    1513  printer->fmt_line("ion_reg(\"{}\", {});", ion.name, valence);
                    +
                    1514  }
                    +
                    1515  if (!info.ions.empty()) {
                    +
                    1516  printer->add_newline();
                    +
                    1517  }
                    +
                    1518 
                    +
                    1519  for (const auto& ion: info.ions) {
                    +
                    1520  printer->fmt_line("_{0}_sym = hoc_lookup(\"{0}_ion\");", ion.name);
                    +
                    1521  }
                    +
                    1522  if (!info.ions.empty()) {
                    +
                    1523  printer->add_newline();
                    +
                    1524  }
                    +
                    1525 
                    +
                    1526  const auto compute_functions_parameters =
                    +
                    1527  breakpoint_exist()
                    +
                    1528  ? fmt::format("{}, {}, {}",
                    +
                    1529  nrn_cur_required() ? method_name(naming::NRN_CUR_METHOD) : "nullptr",
                    +
                    1530  method_name(naming::NRN_JACOB_METHOD),
                    +
                    1531  nrn_state_required() ? method_name(naming::NRN_STATE_METHOD) : "nullptr")
                    +
                    1532  : "nullptr, nullptr, nullptr";
                    +
                    1533 
                    +
                    1534 
                    +
                    1535  const auto register_mech_args = fmt::format("{}, {}, {}, {}, {}, {}",
                    +
                    1536  get_channel_info_var_name(),
                    +
                    1537  method_name(naming::NRN_ALLOC_METHOD),
                    +
                    1538  compute_functions_parameters,
                    +
                    1539  method_name(naming::NRN_INIT_METHOD),
                    +
                    1540  info.first_pointer_var_index,
                    +
                    1541  1 + info.thread_data_index);
                    +
                    1542  if (info.point_process) {
                    +
                    1543  printer->fmt_line(
                    +
                    1544  "_pointtype = point_register_mech({}, _hoc_create_pnt, _hoc_destroy_pnt, "
                    +
                    1545  "_member_func);",
                    +
                    1546  register_mech_args);
                    +
                    1547 
                    +
                    1548  if (info.destructor_node) {
                    +
                    1549  printer->fmt_line("register_destructor({});",
                    +
                    1550  method_name(naming::NRN_DESTRUCTOR_METHOD));
                    +
                    1551  }
                    +
                    1552  } else {
                    +
                    1553  printer->fmt_line("register_mech({});", register_mech_args);
                    +
                    1554  }
                    +
                    1555 
                    +
                    1556 
                    +
                    1557  if (info.thread_callback_register) {
                    +
                    1558  printer->fmt_line("_extcall_thread.resize({});", info.thread_data_index + 1);
                    +
                    1559  printer->fmt_line("thread_mem_init(_extcall_thread.data());");
                    +
                    1560  printer->fmt_line("{} = 0;", get_variable_name("thread_data_in_use", false));
                    +
                    1561  }
                    1562 
                    -
                    1563  if (info.thread_callback_register) {
                    -
                    1564  printer->fmt_line("_extcall_thread.resize({});", info.thread_data_index + 1);
                    -
                    1565  printer->fmt_line("thread_mem_init(_extcall_thread.data());");
                    -
                    1566  printer->fmt_line("{} = 0;", get_variable_name("thread_data_in_use", false));
                    -
                    1567  }
                    -
                    1568 
                    -
                    1569 
                    -
                    1570  /// type related information
                    -
                    1571  printer->add_newline();
                    -
                    1572  printer->fmt_line("mech_type = nrn_get_mechtype({}[1]);", get_channel_info_var_name());
                    -
                    1573 
                    -
                    1574  printer->add_line("hoc_register_parm_default(mech_type, &_parameter_defaults);");
                    -
                    1575 
                    -
                    1576  // register the table-checking function
                    -
                    1577  if (info.table_count > 0) {
                    -
                    1578  printer->fmt_line("_nrn_thread_table_reg(mech_type, {});", table_thread_function_name());
                    -
                    1579  }
                    +
                    1563 
                    +
                    1564  /// type related information
                    +
                    1565  printer->add_newline();
                    +
                    1566  printer->fmt_line("mech_type = nrn_get_mechtype({}[1]);", get_channel_info_var_name());
                    +
                    1567 
                    +
                    1568  printer->add_line("hoc_register_parm_default(mech_type, &_parameter_defaults);");
                    +
                    1569 
                    +
                    1570  // register the table-checking function
                    +
                    1571  if (info.table_count > 0) {
                    +
                    1572  printer->fmt_line("_nrn_thread_table_reg(mech_type, {});", table_thread_function_name());
                    +
                    1573  }
                    +
                    1574 
                    +
                    1575  printer->add_line("_nrn_mechanism_register_data_fields(mech_type,");
                    +
                    1576  printer->increase_indent();
                    +
                    1577 
                    +
                    1578  const auto codegen_float_variables_size = codegen_float_variables.size();
                    +
                    1579  std::vector<std::string> mech_register_args;
                    1580 
                    -
                    1581  printer->add_line("_nrn_mechanism_register_data_fields(mech_type,");
                    -
                    1582  printer->increase_indent();
                    -
                    1583 
                    -
                    1584  const auto codegen_float_variables_size = codegen_float_variables.size();
                    -
                    1585  std::vector<std::string> mech_register_args;
                    -
                    1586 
                    -
                    1587  for (int i = 0; i < codegen_float_variables_size; ++i) {
                    -
                    1588  const auto& float_var = codegen_float_variables[i];
                    -
                    1589  if (float_var->is_array()) {
                    -
                    1590  mech_register_args.push_back(
                    -
                    1591  fmt::format("_nrn_mechanism_field<double>{{\"{}\", {}}} /* {} */",
                    -
                    1592  float_var->get_name(),
                    -
                    1593  float_var->get_length(),
                    -
                    1594  i));
                    -
                    1595  } else {
                    -
                    1596  mech_register_args.push_back(fmt::format(
                    -
                    1597  "_nrn_mechanism_field<double>{{\"{}\"}} /* {} */", float_var->get_name(), i));
                    -
                    1598  }
                    -
                    1599  }
                    -
                    1600 
                    -
                    1601  const auto codegen_int_variables_size = codegen_int_variables.size();
                    -
                    1602  for (int i = 0; i < codegen_int_variables_size; ++i) {
                    -
                    1603  const auto& int_var = codegen_int_variables[i];
                    -
                    1604  const auto& name = int_var.symbol->get_name();
                    -
                    1605  if (i != info.semantics[i].index) {
                    -
                    1606  throw std::runtime_error("Broken logic.");
                    -
                    1607  }
                    -
                    1608  const auto& semantic = info.semantics[i].name;
                    -
                    1609 
                    -
                    1610  auto type = "double*";
                    -
                    1611  if (name == naming::POINT_PROCESS_VARIABLE) {
                    -
                    1612  type = "Point_process*";
                    -
                    1613  } else if (name == naming::TQITEM_VARIABLE) {
                    +
                    1581  for (int i = 0; i < codegen_float_variables_size; ++i) {
                    +
                    1582  const auto& float_var = codegen_float_variables[i];
                    +
                    1583  if (float_var->is_array()) {
                    +
                    1584  mech_register_args.push_back(
                    +
                    1585  fmt::format("_nrn_mechanism_field<double>{{\"{}\", {}}} /* {} */",
                    +
                    1586  float_var->get_name(),
                    +
                    1587  float_var->get_length(),
                    +
                    1588  i));
                    +
                    1589  } else {
                    +
                    1590  mech_register_args.push_back(fmt::format(
                    +
                    1591  "_nrn_mechanism_field<double>{{\"{}\"}} /* {} */", float_var->get_name(), i));
                    +
                    1592  }
                    +
                    1593  }
                    +
                    1594 
                    +
                    1595  const auto codegen_int_variables_size = codegen_int_variables.size();
                    +
                    1596  for (int i = 0; i < codegen_int_variables_size; ++i) {
                    +
                    1597  const auto& int_var = codegen_int_variables[i];
                    +
                    1598  const auto& name = int_var.symbol->get_name();
                    +
                    1599  if (i != info.semantics[i].index) {
                    +
                    1600  throw std::runtime_error("Broken logic.");
                    +
                    1601  }
                    +
                    1602  const auto& semantic = info.semantics[i].name;
                    +
                    1603 
                    +
                    1604  auto type = "double*";
                    +
                    1605  if (name == naming::POINT_PROCESS_VARIABLE) {
                    +
                    1606  type = "Point_process*";
                    +
                    1607  } else if (name == naming::TQITEM_VARIABLE) {
                    +
                    1608  type = "void*";
                    +
                    1609  } else if (stringutils::starts_with(name, "style_") &&
                    +
                    1610  stringutils::starts_with(semantic, "#") &&
                    +
                    1611  stringutils::ends_with(semantic, "_ion")) {
                    +
                    1612  type = "int*";
                    +
                    1613  } else if (semantic == naming::FOR_NETCON_SEMANTIC) {
                    1614  type = "void*";
                    -
                    1615  } else if (stringutils::starts_with(name, "style_") &&
                    -
                    1616  stringutils::starts_with(semantic, "#") &&
                    -
                    1617  stringutils::ends_with(semantic, "_ion")) {
                    -
                    1618  type = "int*";
                    -
                    1619  } else if (semantic == naming::FOR_NETCON_SEMANTIC) {
                    -
                    1620  type = "void*";
                    -
                    1621  }
                    -
                    1622 
                    -
                    1623  mech_register_args.push_back(
                    -
                    1624  fmt::format("_nrn_mechanism_field<{}>{{\"{}\", \"{}\"}} /* {} */",
                    -
                    1625  type,
                    -
                    1626  name,
                    -
                    1627  info.semantics[i].name,
                    -
                    1628  i));
                    -
                    1629  }
                    -
                    1630 
                    -
                    1631  if (info.emit_cvode) {
                    -
                    1632  mech_register_args.push_back(
                    -
                    1633  fmt::format("_nrn_mechanism_field<int>{{\"{}\", \"cvodeieq\"}} /* {} */",
                    - -
                    1635  codegen_int_variables_size));
                    -
                    1636  }
                    +
                    1615  }
                    +
                    1616 
                    +
                    1617  mech_register_args.push_back(
                    +
                    1618  fmt::format("_nrn_mechanism_field<{}>{{\"{}\", \"{}\"}} /* {} */",
                    +
                    1619  type,
                    +
                    1620  name,
                    +
                    1621  info.semantics[i].name,
                    +
                    1622  i));
                    +
                    1623  }
                    +
                    1624 
                    +
                    1625  if (info.emit_cvode) {
                    +
                    1626  mech_register_args.push_back(
                    +
                    1627  fmt::format("_nrn_mechanism_field<int>{{\"{}\", \"cvodeieq\"}} /* {} */",
                    + +
                    1629  codegen_int_variables_size));
                    +
                    1630  }
                    +
                    1631 
                    +
                    1632  printer->add_multi_line(fmt::format("{}", fmt::join(mech_register_args, ",\n")));
                    +
                    1633 
                    +
                    1634  printer->decrease_indent();
                    +
                    1635  printer->add_line(");");
                    +
                    1636  printer->add_newline();
                    1637 
                    -
                    1638  printer->add_multi_line(fmt::format("{}", fmt::join(mech_register_args, ",\n")));
                    -
                    1639 
                    -
                    1640  printer->decrease_indent();
                    -
                    1641  printer->add_line(");");
                    -
                    1642  printer->add_newline();
                    -
                    1643 
                    -
                    1644  printer->fmt_line("hoc_register_prop_size(mech_type, {}, {});",
                    -
                    1645  float_variables_size(),
                    -
                    1646  int_variables_size() + static_cast<int>(info.emit_cvode));
                    -
                    1647 
                    -
                    1648  for (int i = 0; i < codegen_int_variables_size; ++i) {
                    -
                    1649  if (i != info.semantics[i].index) {
                    -
                    1650  throw std::runtime_error("Broken logic.");
                    -
                    1651  }
                    -
                    1652 
                    -
                    1653  printer->fmt_line("hoc_register_dparam_semantics(mech_type, {}, \"{}\");",
                    -
                    1654  i,
                    -
                    1655  info.semantics[i].name);
                    -
                    1656  }
                    -
                    1657 
                    -
                    1658  if (!info.longitudinal_diffusion_info.empty()) {
                    -
                    1659  printer->fmt_line("hoc_register_ldifus1(_apply_diffusion_function);");
                    -
                    1660  }
                    -
                    1661 
                    -
                    1662 
                    -
                    1663  if (info.write_concentration) {
                    -
                    1664  printer->fmt_line("nrn_writes_conc(mech_type, 0);");
                    -
                    1665  }
                    -
                    1666 
                    -
                    1667  if (info.artificial_cell) {
                    -
                    1668  printer->fmt_line("add_nrn_artcell(mech_type, {});", info.tqitem_index);
                    -
                    1669  }
                    -
                    1670 
                    -
                    1671  if (info.net_event_used) {
                    -
                    1672  printer->add_line("add_nrn_has_net_event(mech_type);");
                    -
                    1673  }
                    -
                    1674 
                    -
                    1675  if (info.for_netcon_used) {
                    -
                    1676  auto dparam_it =
                    -
                    1677  std::find_if(info.semantics.begin(), info.semantics.end(), [](const IndexSemantics& a) {
                    -
                    1678  return a.name == naming::FOR_NETCON_SEMANTIC;
                    -
                    1679  });
                    -
                    1680  if (dparam_it == info.semantics.end()) {
                    -
                    1681  throw std::runtime_error("Couldn't find `fornetcon` variable.");
                    -
                    1682  }
                    -
                    1683 
                    -
                    1684  int dparam_index = dparam_it->index;
                    -
                    1685  printer->fmt_line("add_nrn_fornetcons(mech_type, {});", dparam_index);
                    -
                    1686  }
                    -
                    1687 
                    -
                    1688  printer->add_line("hoc_register_var(hoc_scalar_double, hoc_vector_double, hoc_intfunc);");
                    -
                    1689  if (!info.point_process) {
                    -
                    1690  printer->add_line("hoc_register_npy_direct(mech_type, npy_direct_func_proc);");
                    -
                    1691  }
                    -
                    1692  if (info.net_receive_node) {
                    -
                    1693  printer->fmt_line("pnt_receive[mech_type] = nrn_net_receive_{};", info.mod_suffix);
                    -
                    1694  printer->fmt_line("pnt_receive_size[mech_type] = {};", info.num_net_receive_parameters);
                    -
                    1695  }
                    -
                    1696 
                    -
                    1697  if (info.net_receive_initial_node) {
                    -
                    1698  printer->fmt_line("pnt_receive_init[mech_type] = net_init;");
                    -
                    1699  }
                    -
                    1700 
                    -
                    1701  if (info.thread_callback_register) {
                    -
                    1702  printer->add_line("_nrn_thread_reg(mech_type, 1, thread_mem_init);");
                    -
                    1703  printer->add_line("_nrn_thread_reg(mech_type, 0, thread_mem_cleanup);");
                    -
                    1704  }
                    -
                    1705 
                    -
                    1706  if (info.diam_used) {
                    -
                    1707  printer->fmt_line("{}._morphology_sym = hoc_lookup(\"morphology\");",
                    -
                    1708  global_struct_instance());
                    -
                    1709  }
                    -
                    1710 
                    -
                    1711  if (info.emit_cvode) {
                    -
                    1712  printer->fmt_line("hoc_register_dparam_semantics(mech_type, {}, \"cvodeieq\");",
                    -
                    1713  codegen_int_variables_size);
                    -
                    1714  printer->fmt_line("hoc_register_cvode(mech_type, {}, {}, {}, {});",
                    -
                    1715  method_name(naming::CVODE_COUNT_NAME),
                    - - -
                    1718  method_name(naming::CVODE_SETUP_STIFF_NAME));
                    -
                    1719  printer->fmt_line("hoc_register_tolerance(mech_type, _hoc_state_tol, &_atollist);");
                    -
                    1720  }
                    -
                    1721 }
                    +
                    1638  printer->fmt_line("hoc_register_prop_size(mech_type, {}, {});",
                    +
                    1639  float_variables_size(),
                    +
                    1640  int_variables_size() + static_cast<int>(info.emit_cvode));
                    +
                    1641 
                    +
                    1642  for (int i = 0; i < codegen_int_variables_size; ++i) {
                    +
                    1643  if (i != info.semantics[i].index) {
                    +
                    1644  throw std::runtime_error("Broken logic.");
                    +
                    1645  }
                    +
                    1646 
                    +
                    1647  printer->fmt_line("hoc_register_dparam_semantics(mech_type, {}, \"{}\");",
                    +
                    1648  i,
                    +
                    1649  info.semantics[i].name);
                    +
                    1650  }
                    +
                    1651 
                    +
                    1652  if (!info.longitudinal_diffusion_info.empty()) {
                    +
                    1653  printer->fmt_line("hoc_register_ldifus1(_apply_diffusion_function);");
                    +
                    1654  }
                    +
                    1655 
                    +
                    1656 
                    +
                    1657  if (info.write_concentration) {
                    +
                    1658  printer->fmt_line("nrn_writes_conc(mech_type, 0);");
                    +
                    1659  }
                    +
                    1660 
                    +
                    1661  if (info.artificial_cell) {
                    +
                    1662  printer->fmt_line("add_nrn_artcell(mech_type, {});", info.tqitem_index);
                    +
                    1663  }
                    +
                    1664 
                    +
                    1665  if (info.net_event_used) {
                    +
                    1666  printer->add_line("add_nrn_has_net_event(mech_type);");
                    +
                    1667  }
                    +
                    1668 
                    +
                    1669  if (info.for_netcon_used) {
                    +
                    1670  auto dparam_it =
                    +
                    1671  std::find_if(info.semantics.begin(), info.semantics.end(), [](const IndexSemantics& a) {
                    +
                    1672  return a.name == naming::FOR_NETCON_SEMANTIC;
                    +
                    1673  });
                    +
                    1674  if (dparam_it == info.semantics.end()) {
                    +
                    1675  throw std::runtime_error("Couldn't find `fornetcon` variable.");
                    +
                    1676  }
                    +
                    1677 
                    +
                    1678  int dparam_index = dparam_it->index;
                    +
                    1679  printer->fmt_line("add_nrn_fornetcons(mech_type, {});", dparam_index);
                    +
                    1680  }
                    +
                    1681 
                    +
                    1682  printer->add_line("hoc_register_var(hoc_scalar_double, hoc_vector_double, hoc_intfunc);");
                    +
                    1683  if (!info.point_process) {
                    +
                    1684  printer->add_line("hoc_register_npy_direct(mech_type, npy_direct_func_proc);");
                    +
                    1685  }
                    +
                    1686  if (info.net_receive_node) {
                    +
                    1687  printer->fmt_line("pnt_receive[mech_type] = nrn_net_receive_{};", info.mod_suffix);
                    +
                    1688  printer->fmt_line("pnt_receive_size[mech_type] = {};", info.num_net_receive_parameters);
                    +
                    1689  }
                    +
                    1690 
                    +
                    1691  if (info.net_receive_initial_node) {
                    +
                    1692  printer->fmt_line("pnt_receive_init[mech_type] = net_init;");
                    +
                    1693  }
                    +
                    1694 
                    +
                    1695  if (info.thread_callback_register) {
                    +
                    1696  printer->add_line("_nrn_thread_reg(mech_type, 1, thread_mem_init);");
                    +
                    1697  printer->add_line("_nrn_thread_reg(mech_type, 0, thread_mem_cleanup);");
                    +
                    1698  }
                    +
                    1699 
                    +
                    1700  if (info.diam_used) {
                    +
                    1701  printer->fmt_line("{}._morphology_sym = hoc_lookup(\"morphology\");",
                    +
                    1702  global_struct_instance());
                    +
                    1703  }
                    +
                    1704 
                    +
                    1705  if (info.emit_cvode) {
                    +
                    1706  printer->fmt_line("hoc_register_dparam_semantics(mech_type, {}, \"cvodeieq\");",
                    +
                    1707  codegen_int_variables_size);
                    +
                    1708  printer->fmt_line("hoc_register_cvode(mech_type, {}, {}, {}, {});",
                    +
                    1709  method_name(naming::CVODE_COUNT_NAME),
                    + + +
                    1712  method_name(naming::CVODE_SETUP_STIFF_NAME));
                    +
                    1713  printer->fmt_line("hoc_register_tolerance(mech_type, _hoc_state_tol, &_atollist);");
                    +
                    1714  }
                    +
                    1715 }
                    +
                    1716 
                    +
                    1717 
                    + +
                    1719  printer->add_line("hoc_register_var(hoc_scalar_double, hoc_vector_double, hoc_intfunc);");
                    +
                    1720 }
                    +
                    1721 
                    1722 
                    -
                    1723 
                    - -
                    1725  printer->add_line("hoc_register_var(hoc_scalar_double, hoc_vector_double, hoc_intfunc);");
                    -
                    1726 }
                    + +
                    1724  if (!info.thread_callback_register) {
                    +
                    1725  return;
                    +
                    1726  }
                    1727 
                    -
                    1728 
                    - -
                    1730  if (!info.thread_callback_register) {
                    -
                    1731  return;
                    -
                    1732  }
                    -
                    1733 
                    -
                    1734  auto static_thread_data = get_variable_name("thread_data", false);
                    -
                    1735  auto inuse = get_variable_name("thread_data_in_use", false);
                    -
                    1736  auto thread_data_index = info.thread_var_thread_id;
                    -
                    1737  printer->push_block("static void thread_mem_init(Datum* _thread) ");
                    -
                    1738  printer->push_block(fmt::format("if({})", inuse));
                    -
                    1739  printer->fmt_line("_thread[{}] = {{neuron::container::do_not_search, new double[{}]{{}}}};",
                    -
                    1740  thread_data_index,
                    -
                    1741  info.thread_var_data_size + info.top_local_thread_size);
                    +
                    1728  auto static_thread_data = get_variable_name("thread_data", false);
                    +
                    1729  auto inuse = get_variable_name("thread_data_in_use", false);
                    +
                    1730  auto thread_data_index = info.thread_var_thread_id;
                    +
                    1731  printer->push_block("static void thread_mem_init(Datum* _thread) ");
                    +
                    1732  printer->push_block(fmt::format("if({})", inuse));
                    +
                    1733  printer->fmt_line("_thread[{}] = {{neuron::container::do_not_search, new double[{}]{{}}}};",
                    +
                    1734  thread_data_index,
                    +
                    1735  info.thread_var_data_size + info.top_local_thread_size);
                    +
                    1736  printer->pop_block();
                    +
                    1737  printer->push_block("else");
                    +
                    1738  printer->fmt_line("_thread[{}] = {{neuron::container::do_not_search, {}}};",
                    +
                    1739  thread_data_index,
                    +
                    1740  static_thread_data);
                    +
                    1741  printer->fmt_line("{} = 1;", inuse);
                    1742  printer->pop_block();
                    -
                    1743  printer->push_block("else");
                    -
                    1744  printer->fmt_line("_thread[{}] = {{neuron::container::do_not_search, {}}};",
                    -
                    1745  thread_data_index,
                    -
                    1746  static_thread_data);
                    -
                    1747  printer->fmt_line("{} = 1;", inuse);
                    -
                    1748  printer->pop_block();
                    +
                    1743  printer->pop_block();
                    +
                    1744 
                    +
                    1745  printer->push_block("static void thread_mem_cleanup(Datum* _thread) ");
                    +
                    1746  printer->fmt_line("double * _thread_data_ptr = _thread[{}].get<double*>();", thread_data_index);
                    +
                    1747  printer->push_block(fmt::format("if(_thread_data_ptr == {})", static_thread_data));
                    +
                    1748  printer->fmt_line("{} = 0;", inuse);
                    1749  printer->pop_block();
                    -
                    1750 
                    -
                    1751  printer->push_block("static void thread_mem_cleanup(Datum* _thread) ");
                    -
                    1752  printer->fmt_line("double * _thread_data_ptr = _thread[{}].get<double*>();", thread_data_index);
                    -
                    1753  printer->push_block(fmt::format("if(_thread_data_ptr == {})", static_thread_data));
                    -
                    1754  printer->fmt_line("{} = 0;", inuse);
                    -
                    1755  printer->pop_block();
                    -
                    1756  printer->push_block("else");
                    -
                    1757  printer->add_line("delete[] _thread_data_ptr;");
                    -
                    1758  printer->pop_block();
                    -
                    1759  printer->pop_block();
                    -
                    1760 }
                    -
                    1761 
                    -
                    1762 
                    - -
                    1764  for (auto const& [var, type]: info.neuron_global_variables) {
                    -
                    1765  auto const name = var->get_name();
                    -
                    1766  printer->fmt_line("extern {} {};", type, name);
                    -
                    1767  }
                    -
                    1768 }
                    +
                    1750  printer->push_block("else");
                    +
                    1751  printer->add_line("delete[] _thread_data_ptr;");
                    +
                    1752  printer->pop_block();
                    +
                    1753  printer->pop_block();
                    +
                    1754 }
                    +
                    1755 
                    +
                    1756 
                    + +
                    1758  for (auto const& [var, type]: info.neuron_global_variables) {
                    +
                    1759  auto const name = var->get_name();
                    +
                    1760  printer->fmt_line("extern {} {};", type, name);
                    +
                    1761  }
                    +
                    1762 }
                    +
                    1763 
                    + +
                    1765  auto const value_initialize = print_initializers ? "{}" : "";
                    +
                    1766  printer->add_newline(2);
                    +
                    1767  printer->add_line("/** all mechanism instance variables and global variables */");
                    +
                    1768  printer->fmt_push_block("struct {} ", instance_struct());
                    1769 
                    - -
                    1771  auto const value_initialize = print_initializers ? "{}" : "";
                    -
                    1772  printer->add_newline(2);
                    -
                    1773  printer->add_line("/** all mechanism instance variables and global variables */");
                    -
                    1774  printer->fmt_push_block("struct {} ", instance_struct());
                    -
                    1775 
                    -
                    1776  for (auto const& [var, type]: info.neuron_global_variables) {
                    -
                    1777  auto const name = var->get_name();
                    -
                    1778  printer->fmt_line("{}* {}{};",
                    -
                    1779  type,
                    -
                    1780  name,
                    -
                    1781  print_initializers ? fmt::format("{{&::{}}}", name) : std::string{});
                    -
                    1782  }
                    -
                    1783  for (auto& var: codegen_float_variables) {
                    -
                    1784  const auto& name = var->get_name();
                    -
                    1785  printer->fmt_line("double* {}{};", name, value_initialize);
                    -
                    1786  }
                    -
                    1787  for (auto& var: codegen_int_variables) {
                    -
                    1788  const auto& name = var.symbol->get_name();
                    -
                    1789  auto position = position_of_int_var(name);
                    -
                    1790 
                    -
                    1791  if (name == naming::POINT_PROCESS_VARIABLE) {
                    -
                    1792  continue;
                    -
                    1793  } else if (var.is_index || var.is_integer) {
                    -
                    1794  // In NEURON we don't create caches for `int*`. Hence, do nothing.
                    -
                    1795  } else if (info.semantics[position].name == naming::POINTER_SEMANTIC) {
                    -
                    1796  // we don't need these either.
                    -
                    1797  } else {
                    -
                    1798  auto qualifier = var.is_constant ? "const " : "";
                    -
                    1799  auto type = var.is_vdata ? "void*" : default_float_data_type();
                    -
                    1800  printer->fmt_line("{}{}* const* {}{};", qualifier, type, name, value_initialize);
                    -
                    1801  }
                    -
                    1802  }
                    -
                    1803 
                    -
                    1804  printer->fmt_line("{}* {}{};",
                    -
                    1805  global_struct(),
                    - -
                    1807  print_initializers ? fmt::format("{{&{}}}", global_struct_instance())
                    -
                    1808  : std::string{});
                    -
                    1809  printer->pop_block(";");
                    -
                    1810 }
                    +
                    1770  for (auto const& [var, type]: info.neuron_global_variables) {
                    +
                    1771  auto const name = var->get_name();
                    +
                    1772  printer->fmt_line("{}* {}{};",
                    +
                    1773  type,
                    +
                    1774  name,
                    +
                    1775  print_initializers ? fmt::format("{{&::{}}}", name) : std::string{});
                    +
                    1776  }
                    +
                    1777  for (auto& var: codegen_float_variables) {
                    +
                    1778  const auto& name = var->get_name();
                    +
                    1779  printer->fmt_line("double* {}{};", name, value_initialize);
                    +
                    1780  }
                    +
                    1781  for (auto& var: codegen_int_variables) {
                    +
                    1782  const auto& name = var.symbol->get_name();
                    +
                    1783  auto position = position_of_int_var(name);
                    +
                    1784 
                    +
                    1785  if (name == naming::POINT_PROCESS_VARIABLE) {
                    +
                    1786  continue;
                    +
                    1787  } else if (var.is_index || var.is_integer) {
                    +
                    1788  // In NEURON we don't create caches for `int*`. Hence, do nothing.
                    +
                    1789  } else if (info.semantics[position].name == naming::POINTER_SEMANTIC) {
                    +
                    1790  // we don't need these either.
                    +
                    1791  } else {
                    +
                    1792  auto qualifier = var.is_constant ? "const " : "";
                    +
                    1793  auto type = var.is_vdata ? "void*" : default_float_data_type();
                    +
                    1794  printer->fmt_line("{}{}* const* {}{};", qualifier, type, name, value_initialize);
                    +
                    1795  }
                    +
                    1796  }
                    +
                    1797 
                    +
                    1798  printer->fmt_line("{}* {}{};",
                    +
                    1799  global_struct(),
                    + +
                    1801  print_initializers ? fmt::format("{{&{}}}", global_struct_instance())
                    +
                    1802  : std::string{});
                    +
                    1803  printer->pop_block(";");
                    +
                    1804 }
                    +
                    1805 
                    + +
                    1807  printer->add_newline(2);
                    +
                    1808  printer->fmt_push_block("static {} make_instance_{}(_nrn_mechanism_cache_range* _lmc)",
                    +
                    1809  instance_struct(),
                    +
                    1810  info.mod_suffix);
                    1811 
                    - -
                    1813  printer->add_newline(2);
                    -
                    1814  printer->fmt_push_block("static {} make_instance_{}(_nrn_mechanism_cache_range* _lmc)",
                    -
                    1815  instance_struct(),
                    -
                    1816  info.mod_suffix);
                    +
                    1812  printer->push_block("if(_lmc == nullptr)");
                    +
                    1813  printer->fmt_line("return {}();", instance_struct());
                    +
                    1814  printer->pop_block_nl(2);
                    +
                    1815 
                    +
                    1816  printer->fmt_push_block("return {}", instance_struct());
                    1817 
                    -
                    1818  printer->push_block("if(_lmc == nullptr)");
                    -
                    1819  printer->fmt_line("return {}();", instance_struct());
                    -
                    1820  printer->pop_block_nl(2);
                    -
                    1821 
                    -
                    1822  printer->fmt_push_block("return {}", instance_struct());
                    -
                    1823 
                    -
                    1824  std::vector<std::string> make_instance_args;
                    +
                    1818  std::vector<std::string> make_instance_args;
                    +
                    1819 
                    +
                    1820 
                    +
                    1821  for (auto const& [var, type]: info.neuron_global_variables) {
                    +
                    1822  auto const name = var->get_name();
                    +
                    1823  make_instance_args.push_back(fmt::format("&::{}", name));
                    +
                    1824  }
                    1825 
                    1826 
                    -
                    1827  for (auto const& [var, type]: info.neuron_global_variables) {
                    -
                    1828  auto const name = var->get_name();
                    -
                    1829  make_instance_args.push_back(fmt::format("&::{}", name));
                    -
                    1830  }
                    -
                    1831 
                    -
                    1832 
                    -
                    1833  const auto codegen_float_variables_size = codegen_float_variables.size();
                    -
                    1834  for (int i = 0; i < codegen_float_variables_size; ++i) {
                    -
                    1835  const auto& float_var = codegen_float_variables[i];
                    -
                    1836  if (float_var->is_array()) {
                    -
                    1837  make_instance_args.push_back(
                    -
                    1838  fmt::format("_lmc->template data_array_ptr<{}, {}>()", i, float_var->get_length()));
                    -
                    1839  } else {
                    -
                    1840  make_instance_args.push_back(fmt::format("_lmc->template fpfield_ptr<{}>()", i));
                    -
                    1841  }
                    -
                    1842  }
                    -
                    1843 
                    -
                    1844  const auto codegen_int_variables_size = codegen_int_variables.size();
                    -
                    1845  for (size_t i = 0; i < codegen_int_variables_size; ++i) {
                    -
                    1846  const auto& var = codegen_int_variables[i];
                    -
                    1847  auto name = var.symbol->get_name();
                    -
                    1848  auto sem = info.semantics[i].name;
                    -
                    1849  auto const variable = [&var, &sem, i]() -> std::string {
                    -
                    1850  if (var.is_index || var.is_integer) {
                    -
                    1851  return "";
                    -
                    1852  } else if (var.is_vdata) {
                    -
                    1853  return "";
                    -
                    1854  } else if (sem == naming::POINTER_SEMANTIC) {
                    -
                    1855  return "";
                    -
                    1856  } else {
                    -
                    1857  return fmt::format("_lmc->template dptr_field_ptr<{}>()", i);
                    -
                    1858  }
                    -
                    1859  }();
                    -
                    1860  if (variable != "") {
                    -
                    1861  make_instance_args.push_back(variable);
                    -
                    1862  }
                    -
                    1863  }
                    +
                    1827  const auto codegen_float_variables_size = codegen_float_variables.size();
                    +
                    1828  for (int i = 0; i < codegen_float_variables_size; ++i) {
                    +
                    1829  const auto& float_var = codegen_float_variables[i];
                    +
                    1830  if (float_var->is_array()) {
                    +
                    1831  make_instance_args.push_back(
                    +
                    1832  fmt::format("_lmc->template data_array_ptr<{}, {}>()", i, float_var->get_length()));
                    +
                    1833  } else {
                    +
                    1834  make_instance_args.push_back(fmt::format("_lmc->template fpfield_ptr<{}>()", i));
                    +
                    1835  }
                    +
                    1836  }
                    +
                    1837 
                    +
                    1838  const auto codegen_int_variables_size = codegen_int_variables.size();
                    +
                    1839  for (size_t i = 0; i < codegen_int_variables_size; ++i) {
                    +
                    1840  const auto& var = codegen_int_variables[i];
                    +
                    1841  auto name = var.symbol->get_name();
                    +
                    1842  auto sem = info.semantics[i].name;
                    +
                    1843  auto const variable = [&var, &sem, i]() -> std::string {
                    +
                    1844  if (var.is_index || var.is_integer) {
                    +
                    1845  return "";
                    +
                    1846  } else if (var.is_vdata) {
                    +
                    1847  return "";
                    +
                    1848  } else if (sem == naming::POINTER_SEMANTIC) {
                    +
                    1849  return "";
                    +
                    1850  } else {
                    +
                    1851  return fmt::format("_lmc->template dptr_field_ptr<{}>()", i);
                    +
                    1852  }
                    +
                    1853  }();
                    +
                    1854  if (variable != "") {
                    +
                    1855  make_instance_args.push_back(variable);
                    +
                    1856  }
                    +
                    1857  }
                    +
                    1858 
                    +
                    1859  printer->add_multi_line(fmt::format("{}", fmt::join(make_instance_args, ",\n")));
                    +
                    1860 
                    +
                    1861  printer->pop_block(";");
                    +
                    1862  printer->pop_block();
                    +
                    1863 }
                    1864 
                    -
                    1865  printer->add_multi_line(fmt::format("{}", fmt::join(make_instance_args, ",\n")));
                    -
                    1866 
                    -
                    1867  printer->pop_block(";");
                    -
                    1868  printer->pop_block();
                    -
                    1869 }
                    -
                    1870 
                    - -
                    1872  printer->add_newline(2);
                    -
                    1873  printer->fmt_push_block("struct {} ", node_data_struct());
                    -
                    1874 
                    -
                    1875  // Pointers to node variables
                    -
                    1876  printer->add_line("int const * nodeindices;");
                    -
                    1877  printer->add_line("double const * node_voltages;");
                    -
                    1878  printer->add_line("double * node_diagonal;");
                    -
                    1879  printer->add_line("double * node_rhs;");
                    -
                    1880  printer->add_line("int nodecount;");
                    -
                    1881 
                    -
                    1882  printer->pop_block(";");
                    -
                    1883 }
                    + +
                    1866  printer->add_newline(2);
                    +
                    1867  printer->fmt_push_block("struct {} ", node_data_struct());
                    +
                    1868 
                    +
                    1869  // Pointers to node variables
                    +
                    1870  printer->add_line("int const * nodeindices;");
                    +
                    1871  printer->add_line("double const * node_voltages;");
                    +
                    1872  printer->add_line("double * node_diagonal;");
                    +
                    1873  printer->add_line("double * node_rhs;");
                    +
                    1874  printer->add_line("int nodecount;");
                    +
                    1875 
                    +
                    1876  printer->pop_block(";");
                    +
                    1877 }
                    +
                    1878 
                    + +
                    1880  printer->add_newline(2);
                    +
                    1881  printer->fmt_push_block("static {} make_node_data_{}(NrnThread& nt, Memb_list& _ml_arg)",
                    +
                    1882  node_data_struct(),
                    +
                    1883  info.mod_suffix);
                    1884 
                    - -
                    1886  printer->add_newline(2);
                    -
                    1887  printer->fmt_push_block("static {} make_node_data_{}(NrnThread& nt, Memb_list& _ml_arg)",
                    -
                    1888  node_data_struct(),
                    -
                    1889  info.mod_suffix);
                    +
                    1885  std::vector<std::string> make_node_data_args = {"_ml_arg.nodeindices",
                    +
                    1886  "nt.node_voltage_storage()",
                    +
                    1887  "nt.node_d_storage()",
                    +
                    1888  "nt.node_rhs_storage()",
                    +
                    1889  "_ml_arg.nodecount"};
                    1890 
                    -
                    1891  std::vector<std::string> make_node_data_args = {"_ml_arg.nodeindices",
                    -
                    1892  "nt.node_voltage_storage()",
                    -
                    1893  "nt.node_d_storage()",
                    -
                    1894  "nt.node_rhs_storage()",
                    -
                    1895  "_ml_arg.nodecount"};
                    +
                    1891  printer->fmt_push_block("return {}", node_data_struct());
                    +
                    1892  printer->add_multi_line(fmt::format("{}", fmt::join(make_node_data_args, ",\n")));
                    +
                    1893 
                    +
                    1894  printer->pop_block(";");
                    +
                    1895  printer->pop_block();
                    1896 
                    -
                    1897  printer->fmt_push_block("return {}", node_data_struct());
                    -
                    1898  printer->add_multi_line(fmt::format("{}", fmt::join(make_node_data_args, ",\n")));
                    -
                    1899 
                    -
                    1900  printer->pop_block(";");
                    -
                    1901  printer->pop_block();
                    -
                    1902 
                    -
                    1903 
                    -
                    1904  printer->fmt_push_block("static {} make_node_data_{}(Prop * _prop)",
                    -
                    1905  node_data_struct(),
                    -
                    1906  info.mod_suffix);
                    -
                    1907 
                    -
                    1908  printer->push_block("if(!_prop)");
                    -
                    1909  printer->fmt_line("return {}();", node_data_struct());
                    -
                    1910  printer->pop_block_nl(2);
                    -
                    1911 
                    -
                    1912  printer->add_line("static std::vector<int> node_index{0};");
                    -
                    1913  printer->add_line("Node* _node = _nrn_mechanism_access_node(_prop);");
                    +
                    1897 
                    +
                    1898  printer->fmt_push_block("static {} make_node_data_{}(Prop * _prop)",
                    +
                    1899  node_data_struct(),
                    +
                    1900  info.mod_suffix);
                    +
                    1901 
                    +
                    1902  printer->push_block("if(!_prop)");
                    +
                    1903  printer->fmt_line("return {}();", node_data_struct());
                    +
                    1904  printer->pop_block_nl(2);
                    +
                    1905 
                    +
                    1906  printer->add_line("static std::vector<int> node_index{0};");
                    +
                    1907  printer->add_line("Node* _node = _nrn_mechanism_access_node(_prop);");
                    +
                    1908 
                    +
                    1909  make_node_data_args = {"node_index.data()",
                    +
                    1910  "&_nrn_mechanism_access_voltage(_node)",
                    +
                    1911  "&_nrn_mechanism_access_d(_node)",
                    +
                    1912  "&_nrn_mechanism_access_rhs(_node)",
                    +
                    1913  "1"};
                    1914 
                    -
                    1915  make_node_data_args = {"node_index.data()",
                    -
                    1916  "&_nrn_mechanism_access_voltage(_node)",
                    -
                    1917  "&_nrn_mechanism_access_d(_node)",
                    -
                    1918  "&_nrn_mechanism_access_rhs(_node)",
                    -
                    1919  "1"};
                    -
                    1920 
                    -
                    1921  printer->fmt_push_block("return {}", node_data_struct());
                    -
                    1922  printer->add_multi_line(fmt::format("{}", fmt::join(make_node_data_args, ",\n")));
                    -
                    1923 
                    -
                    1924  printer->pop_block(";");
                    -
                    1925  printer->pop_block();
                    -
                    1926  printer->add_newline();
                    -
                    1927 }
                    -
                    1928 
                    - -
                    1930  if (codegen_thread_variables.empty()) {
                    -
                    1931  return;
                    -
                    1932  }
                    -
                    1933 
                    -
                    1934  printer->add_newline(2);
                    -
                    1935  printer->fmt_push_block("struct {} ", thread_variables_struct());
                    -
                    1936  printer->add_line("double * thread_data;");
                    -
                    1937  printer->add_newline();
                    -
                    1938 
                    -
                    1939  std::string simd_width = "1";
                    +
                    1915  printer->fmt_push_block("return {}", node_data_struct());
                    +
                    1916  printer->add_multi_line(fmt::format("{}", fmt::join(make_node_data_args, ",\n")));
                    +
                    1917 
                    +
                    1918  printer->pop_block(";");
                    +
                    1919  printer->pop_block();
                    +
                    1920  printer->add_newline();
                    +
                    1921 }
                    +
                    1922 
                    + +
                    1924  if (codegen_thread_variables.empty()) {
                    +
                    1925  return;
                    +
                    1926  }
                    +
                    1927 
                    +
                    1928  printer->add_newline(2);
                    +
                    1929  printer->fmt_push_block("struct {} ", thread_variables_struct());
                    +
                    1930  printer->add_line("double * thread_data;");
                    +
                    1931  printer->add_newline();
                    +
                    1932 
                    +
                    1933  std::string simd_width = "1";
                    +
                    1934 
                    +
                    1935 
                    +
                    1936  for (const auto& var_info: codegen_thread_variables) {
                    +
                    1937  printer->fmt_push_block("double * {}_ptr(size_t id)", var_info.symbol->get_name());
                    +
                    1938  printer->fmt_line("return thread_data + {} + (id % {});", var_info.offset, simd_width);
                    +
                    1939  printer->pop_block();
                    1940 
                    -
                    1941 
                    -
                    1942  for (const auto& var_info: codegen_thread_variables) {
                    -
                    1943  printer->fmt_push_block("double * {}_ptr(size_t id)", var_info.symbol->get_name());
                    -
                    1944  printer->fmt_line("return thread_data + {} + (id % {});", var_info.offset, simd_width);
                    -
                    1945  printer->pop_block();
                    +
                    1941  printer->fmt_push_block("double & {}(size_t id)", var_info.symbol->get_name());
                    +
                    1942  printer->fmt_line("return thread_data[{} + (id % {})];", var_info.offset, simd_width);
                    +
                    1943  printer->pop_block();
                    +
                    1944  }
                    +
                    1945  printer->add_newline();
                    1946 
                    -
                    1947  printer->fmt_push_block("double & {}(size_t id)", var_info.symbol->get_name());
                    -
                    1948  printer->fmt_line("return thread_data[{} + (id % {})];", var_info.offset, simd_width);
                    -
                    1949  printer->pop_block();
                    -
                    1950  }
                    -
                    1951  printer->add_newline();
                    -
                    1952 
                    -
                    1953  printer->push_block(fmt::format("{}(double * const thread_data)", thread_variables_struct()));
                    -
                    1954  printer->fmt_line("this->thread_data = thread_data;");
                    -
                    1955  printer->pop_block();
                    -
                    1956 
                    -
                    1957  printer->pop_block(";");
                    -
                    1958 }
                    -
                    1959 
                    -
                    1960 
                    - -
                    1962  // read ion statements
                    -
                    1963  auto read_statements = ion_read_statements(BlockType::Initial);
                    -
                    1964  for (auto& statement: read_statements) {
                    -
                    1965  printer->add_line(statement);
                    +
                    1947  printer->push_block(fmt::format("{}(double * const thread_data)", thread_variables_struct()));
                    +
                    1948  printer->fmt_line("this->thread_data = thread_data;");
                    +
                    1949  printer->pop_block();
                    +
                    1950 
                    +
                    1951  printer->pop_block(";");
                    +
                    1952 }
                    +
                    1953 
                    +
                    1954 
                    + +
                    1956  // read ion statements
                    +
                    1957  auto read_statements = ion_read_statements(BlockType::Initial);
                    +
                    1958  for (auto& statement: read_statements) {
                    +
                    1959  printer->add_line(statement);
                    +
                    1960  }
                    +
                    1961 
                    +
                    1962  // initial block
                    +
                    1963  if (node != nullptr) {
                    +
                    1964  const auto& block = node->get_statement_block();
                    +
                    1965  print_statement_block(*block, false, false);
                    1966  }
                    1967 
                    -
                    1968  // initial block
                    -
                    1969  if (node != nullptr) {
                    -
                    1970  const auto& block = node->get_statement_block();
                    -
                    1971  print_statement_block(*block, false, false);
                    -
                    1972  }
                    -
                    1973 
                    -
                    1974  // write ion statements
                    -
                    1975  auto write_statements = ion_write_statements(BlockType::Initial);
                    -
                    1976  for (auto& statement: write_statements) {
                    -
                    1977  auto text = process_shadow_update_statement(statement, BlockType::Initial);
                    -
                    1978  printer->add_line(text);
                    +
                    1968  // write ion statements
                    +
                    1969  auto write_statements = ion_write_statements(BlockType::Initial);
                    +
                    1970  for (auto& statement: write_statements) {
                    +
                    1971  auto text = process_shadow_update_statement(statement, BlockType::Initial);
                    +
                    1972  printer->add_line(text);
                    +
                    1973  }
                    +
                    1974 }
                    +
                    1975 
                    + +
                    1977  if (info.mod_suffix == "nothing") {
                    +
                    1978  return;
                    1979  }
                    -
                    1980 }
                    -
                    1981 
                    - -
                    1983  if (info.mod_suffix == "nothing") {
                    -
                    1984  return;
                    -
                    1985  }
                    -
                    1986 
                    -
                    1987  printer->add_line(
                    -
                    1988  "_nrn_mechanism_cache_range _lmc{_sorted_token, *nt, *_ml_arg, _ml_arg->type()};");
                    -
                    1989  printer->fmt_line("auto inst = make_instance_{}(&_lmc);", info.mod_suffix);
                    -
                    1990  if (!info.artificial_cell) {
                    -
                    1991  printer->fmt_line("auto node_data = make_node_data_{}(*nt, *_ml_arg);", info.mod_suffix);
                    +
                    1980 
                    +
                    1981  printer->add_line(
                    +
                    1982  "_nrn_mechanism_cache_range _lmc{_sorted_token, *nt, *_ml_arg, _ml_arg->type()};");
                    +
                    1983  printer->fmt_line("auto inst = make_instance_{}(&_lmc);", info.mod_suffix);
                    +
                    1984  if (!info.artificial_cell) {
                    +
                    1985  printer->fmt_line("auto node_data = make_node_data_{}(*nt, *_ml_arg);", info.mod_suffix);
                    +
                    1986  }
                    +
                    1987  printer->add_line("auto* _thread = _ml_arg->_thread;");
                    +
                    1988  if (!codegen_thread_variables.empty()) {
                    +
                    1989  printer->fmt_line("auto _thread_vars = {}(_thread[{}].get<double*>());",
                    +
                    1990  thread_variables_struct(),
                    +
                    1991  info.thread_var_thread_id);
                    1992  }
                    -
                    1993  printer->add_line("auto* _thread = _ml_arg->_thread;");
                    -
                    1994  if (!codegen_thread_variables.empty()) {
                    -
                    1995  printer->fmt_line("auto _thread_vars = {}(_thread[{}].get<double*>());",
                    -
                    1996  thread_variables_struct(),
                    -
                    1997  info.thread_var_thread_id);
                    -
                    1998  }
                    -
                    1999 }
                    +
                    1993 }
                    +
                    1994 
                    +
                    1995 
                    + +
                    1997  if (info.mod_suffix == "nothing") {
                    +
                    1998  return;
                    +
                    1999  }
                    2000 
                    -
                    2001 
                    - -
                    2003  if (info.mod_suffix == "nothing") {
                    -
                    2004  return;
                    -
                    2005  }
                    -
                    2006 
                    -
                    2007  printer->add_line("Datum* _ppvar = _nrn_mechanism_access_dparam(prop);");
                    -
                    2008  printer->add_line("_nrn_mechanism_cache_instance _lmc{prop};");
                    -
                    2009  printer->add_line("const size_t id = 0;");
                    -
                    2010 
                    -
                    2011  printer->fmt_line("auto inst = make_instance_{}(prop ? &_lmc : nullptr);", info.mod_suffix);
                    -
                    2012  if (!info.artificial_cell) {
                    -
                    2013  printer->fmt_line("auto node_data = make_node_data_{}(prop);", info.mod_suffix);
                    +
                    2001  printer->add_line("Datum* _ppvar = _nrn_mechanism_access_dparam(prop);");
                    +
                    2002  printer->add_line("_nrn_mechanism_cache_instance _lmc{prop};");
                    +
                    2003  printer->add_line("const size_t id = 0;");
                    +
                    2004 
                    +
                    2005  printer->fmt_line("auto inst = make_instance_{}(prop ? &_lmc : nullptr);", info.mod_suffix);
                    +
                    2006  if (!info.artificial_cell) {
                    +
                    2007  printer->fmt_line("auto node_data = make_node_data_{}(prop);", info.mod_suffix);
                    +
                    2008  }
                    +
                    2009 
                    +
                    2010  if (!codegen_thread_variables.empty()) {
                    +
                    2011  printer->fmt_line("auto _thread_vars = {}({}_global.thread_data);",
                    +
                    2012  thread_variables_struct(),
                    +
                    2013  info.mod_suffix);
                    2014  }
                    2015 
                    -
                    2016  if (!codegen_thread_variables.empty()) {
                    -
                    2017  printer->fmt_line("auto _thread_vars = {}({}_global.thread_data);",
                    -
                    2018  thread_variables_struct(),
                    -
                    2019  info.mod_suffix);
                    -
                    2020  }
                    -
                    2021 
                    -
                    2022  printer->add_newline();
                    -
                    2023 }
                    -
                    2024 
                    -
                    2025 
                    - -
                    2027  const std::string& function_name) {
                    -
                    2028  std::string method = function_name.empty() ? compute_method_name(type) : function_name;
                    -
                    2029  ParamVector args = {{"", "const _nrn_model_sorted_token&", "", "_sorted_token"},
                    -
                    2030  {"", "NrnThread*", "", "nt"},
                    -
                    2031  {"", "Memb_list*", "", "_ml_arg"},
                    -
                    2032  {"", "int", "", "_type"}};
                    -
                    2033  printer->fmt_push_block("static void {}({})", method, get_parameter_str(args));
                    -
                    2034  print_entrypoint_setup_code_from_memb_list();
                    -
                    2035  printer->add_line("auto nodecount = _ml_arg->nodecount;");
                    -
                    2036 }
                    +
                    2016  printer->add_newline();
                    +
                    2017 }
                    +
                    2018 
                    +
                    2019 
                    + +
                    2021  const std::string& function_name) {
                    +
                    2022  std::string method = function_name.empty() ? compute_method_name(type) : function_name;
                    +
                    2023  ParamVector args = {{"", "const _nrn_model_sorted_token&", "", "_sorted_token"},
                    +
                    2024  {"", "NrnThread*", "", "nt"},
                    +
                    2025  {"", "Memb_list*", "", "_ml_arg"},
                    +
                    2026  {"", "int", "", "_type"}};
                    +
                    2027  printer->fmt_push_block("static void {}({})", method, get_parameter_str(args));
                    +
                    2028  print_entrypoint_setup_code_from_memb_list();
                    +
                    2029  printer->add_line("auto nodecount = _ml_arg->nodecount;");
                    +
                    2030 }
                    +
                    2031 
                    +
                    2032 
                    +
                    2033 void CodegenNeuronCppVisitor::print_nrn_init(bool skip_init_check) {
                    +
                    2034  printer->add_newline(2);
                    +
                    2035 
                    +
                    2036  print_global_function_common_code(BlockType::Initial);
                    2037 
                    -
                    2038 
                    -
                    2039 void CodegenNeuronCppVisitor::print_nrn_init(bool skip_init_check) {
                    -
                    2040  printer->add_newline(2);
                    -
                    2041 
                    -
                    2042  print_global_function_common_code(BlockType::Initial);
                    -
                    2043 
                    -
                    2044  printer->push_block("for (int id = 0; id < nodecount; id++)");
                    +
                    2038  printer->push_block("for (int id = 0; id < nodecount; id++)");
                    +
                    2039 
                    +
                    2040  printer->add_line("auto* _ppvar = _ml_arg->pdata[id];");
                    +
                    2041  if (!info.artificial_cell) {
                    +
                    2042  printer->add_line("int node_id = node_data.nodeindices[id];");
                    +
                    2043  printer->add_line("inst.v_unused[id] = node_data.node_voltages[node_id];");
                    +
                    2044  }
                    2045 
                    -
                    2046  printer->add_line("auto* _ppvar = _ml_arg->pdata[id];");
                    -
                    2047  if (!info.artificial_cell) {
                    -
                    2048  printer->add_line("int node_id = node_data.nodeindices[id];");
                    -
                    2049  printer->add_line("inst.v_unused[id] = node_data.node_voltages[node_id];");
                    -
                    2050  }
                    -
                    2051 
                    -
                    2052  print_rename_state_vars();
                    -
                    2053 
                    -
                    2054  if (!info.changed_dt.empty()) {
                    -
                    2055  printer->fmt_line("double _save_prev_dt = {};",
                    -
                    2056  get_variable_name(naming::NTHREAD_DT_VARIABLE));
                    -
                    2057  printer->fmt_line("{} = {};",
                    -
                    2058  get_variable_name(naming::NTHREAD_DT_VARIABLE),
                    -
                    2059  info.changed_dt);
                    +
                    2046  print_rename_state_vars();
                    +
                    2047 
                    +
                    2048  if (!info.changed_dt.empty()) {
                    +
                    2049  printer->fmt_line("double _save_prev_dt = {};",
                    +
                    2050  get_variable_name(naming::NTHREAD_DT_VARIABLE));
                    +
                    2051  printer->fmt_line("{} = {};",
                    +
                    2052  get_variable_name(naming::NTHREAD_DT_VARIABLE),
                    +
                    2053  info.changed_dt);
                    +
                    2054  }
                    +
                    2055 
                    +
                    2056  print_initial_block(info.initial_node);
                    +
                    2057 
                    +
                    2058  if (!info.changed_dt.empty()) {
                    +
                    2059  printer->fmt_line("{} = _save_prev_dt;", get_variable_name(naming::NTHREAD_DT_VARIABLE));
                    2060  }
                    2061 
                    -
                    2062  print_initial_block(info.initial_node);
                    -
                    2063 
                    -
                    2064  if (!info.changed_dt.empty()) {
                    -
                    2065  printer->fmt_line("{} = _save_prev_dt;", get_variable_name(naming::NTHREAD_DT_VARIABLE));
                    -
                    2066  }
                    -
                    2067 
                    -
                    2068  printer->pop_block();
                    -
                    2069  printer->pop_block();
                    -
                    2070 }
                    -
                    2071 
                    - -
                    2073  printer->add_newline(2);
                    -
                    2074 
                    -
                    2075  ParamVector args = {{"", "const _nrn_model_sorted_token&", "", "_sorted_token"},
                    -
                    2076  {"", "NrnThread*", "", "nt"},
                    -
                    2077  {"", "Memb_list*", "", "_ml_arg"},
                    -
                    2078  {"", "int", "", "_type"}};
                    -
                    2079 
                    -
                    2080  printer->fmt_push_block("static void {}({})",
                    -
                    2081  method_name(naming::NRN_JACOB_METHOD),
                    -
                    2082  get_parameter_str(args)); // begin function
                    -
                    2083 
                    -
                    2084 
                    -
                    2085  print_entrypoint_setup_code_from_memb_list();
                    -
                    2086  printer->fmt_line("auto nodecount = _ml_arg->nodecount;");
                    -
                    2087  printer->push_block("for (int id = 0; id < nodecount; id++)"); // begin for
                    -
                    2088 
                    -
                    2089  if (breakpoint_exist()) {
                    -
                    2090  printer->add_line("int node_id = node_data.nodeindices[id];");
                    -
                    2091  printer->fmt_line("node_data.node_diagonal[node_id] {} inst.{}[id];",
                    -
                    2092  operator_for_d(),
                    -
                    2093  info.vectorize ? naming::CONDUCTANCE_UNUSED_VARIABLE
                    - -
                    2095  }
                    -
                    2096 
                    -
                    2097  printer->pop_block(); // end for
                    -
                    2098  printer->pop_block(); // end function
                    -
                    2099 }
                    -
                    2100 
                    -
                    2101 
                    - -
                    2103  if (info.constructor_node) {
                    -
                    2104  printer->fmt_line("static void {}(Prop* prop);",
                    -
                    2105  method_name(naming::NRN_CONSTRUCTOR_METHOD));
                    -
                    2106  }
                    -
                    2107 }
                    -
                    2108 
                    - -
                    2110  if (info.constructor_node) {
                    -
                    2111  printer->fmt_push_block("static void {}(Prop* prop)",
                    -
                    2112  method_name(naming::NRN_CONSTRUCTOR_METHOD));
                    -
                    2113 
                    -
                    2114  print_entrypoint_setup_code_from_prop();
                    -
                    2115 
                    -
                    2116  auto block = info.constructor_node->get_statement_block();
                    -
                    2117  print_statement_block(*block, false, false);
                    -
                    2118 
                    -
                    2119  printer->pop_block();
                    -
                    2120  }
                    -
                    2121 }
                    -
                    2122 
                    -
                    2123 
                    - -
                    2125  printer->fmt_line("static void {}(Prop* prop);", method_name(naming::NRN_DESTRUCTOR_METHOD));
                    -
                    2126 }
                    -
                    2127 
                    - -
                    2129  printer->fmt_push_block("static void {}(Prop* prop)",
                    -
                    2130  method_name(naming::NRN_DESTRUCTOR_METHOD));
                    -
                    2131  print_entrypoint_setup_code_from_prop();
                    +
                    2062  printer->pop_block();
                    +
                    2063  printer->pop_block();
                    +
                    2064 }
                    +
                    2065 
                    + +
                    2067  printer->add_newline(2);
                    +
                    2068 
                    +
                    2069  ParamVector args = {{"", "const _nrn_model_sorted_token&", "", "_sorted_token"},
                    +
                    2070  {"", "NrnThread*", "", "nt"},
                    +
                    2071  {"", "Memb_list*", "", "_ml_arg"},
                    +
                    2072  {"", "int", "", "_type"}};
                    +
                    2073 
                    +
                    2074  printer->fmt_push_block("static void {}({})",
                    +
                    2075  method_name(naming::NRN_JACOB_METHOD),
                    +
                    2076  get_parameter_str(args)); // begin function
                    +
                    2077 
                    +
                    2078 
                    +
                    2079  print_entrypoint_setup_code_from_memb_list();
                    +
                    2080  printer->fmt_line("auto nodecount = _ml_arg->nodecount;");
                    +
                    2081  printer->push_block("for (int id = 0; id < nodecount; id++)"); // begin for
                    +
                    2082 
                    +
                    2083  if (breakpoint_exist()) {
                    +
                    2084  printer->add_line("int node_id = node_data.nodeindices[id];");
                    +
                    2085  printer->fmt_line("node_data.node_diagonal[node_id] {} inst.{}[id];",
                    +
                    2086  operator_for_d(),
                    +
                    2087  info.vectorize ? naming::CONDUCTANCE_UNUSED_VARIABLE
                    + +
                    2089  }
                    +
                    2090 
                    +
                    2091  printer->pop_block(); // end for
                    +
                    2092  printer->pop_block(); // end function
                    +
                    2093 }
                    +
                    2094 
                    +
                    2095 
                    + +
                    2097  if (info.constructor_node) {
                    +
                    2098  printer->fmt_line("static void {}(Prop* prop);",
                    +
                    2099  method_name(naming::NRN_CONSTRUCTOR_METHOD));
                    +
                    2100  }
                    +
                    2101 }
                    +
                    2102 
                    + +
                    2104  if (info.constructor_node) {
                    +
                    2105  printer->fmt_push_block("static void {}(Prop* prop)",
                    +
                    2106  method_name(naming::NRN_CONSTRUCTOR_METHOD));
                    +
                    2107 
                    +
                    2108  print_entrypoint_setup_code_from_prop();
                    +
                    2109 
                    +
                    2110  auto block = info.constructor_node->get_statement_block();
                    +
                    2111  print_statement_block(*block, false, false);
                    +
                    2112 
                    +
                    2113  printer->pop_block();
                    +
                    2114  }
                    +
                    2115 }
                    +
                    2116 
                    +
                    2117 
                    + +
                    2119  printer->fmt_line("static void {}(Prop* prop);", method_name(naming::NRN_DESTRUCTOR_METHOD));
                    +
                    2120 }
                    +
                    2121 
                    + +
                    2123  printer->fmt_push_block("static void {}(Prop* prop)",
                    +
                    2124  method_name(naming::NRN_DESTRUCTOR_METHOD));
                    +
                    2125  print_entrypoint_setup_code_from_prop();
                    +
                    2126 
                    +
                    2127  for (const auto& rv: info.random_variables) {
                    +
                    2128  printer->fmt_line("nrnran123_deletestream((nrnran123_State*) {});",
                    +
                    2129  get_variable_name(get_name(rv), false));
                    +
                    2130  }
                    +
                    2131 
                    2132 
                    -
                    2133  for (const auto& rv: info.random_variables) {
                    -
                    2134  printer->fmt_line("nrnran123_deletestream((nrnran123_State*) {});",
                    -
                    2135  get_variable_name(get_name(rv), false));
                    +
                    2133  if (info.destructor_node) {
                    +
                    2134  auto block = info.destructor_node->get_statement_block();
                    +
                    2135  print_statement_block(*block, false, false);
                    2136  }
                    2137 
                    -
                    2138 
                    -
                    2139  if (info.destructor_node) {
                    -
                    2140  auto block = info.destructor_node->get_statement_block();
                    -
                    2141  print_statement_block(*block, false, false);
                    -
                    2142  }
                    -
                    2143 
                    -
                    2144  printer->pop_block();
                    -
                    2145 }
                    -
                    2146 
                    -
                    2147 
                    - -
                    2149  printer->add_newline(2);
                    -
                    2150 
                    -
                    2151  auto method = method_name(naming::NRN_ALLOC_METHOD);
                    -
                    2152  printer->fmt_push_block("static void {}(Prop* _prop)", method);
                    -
                    2153  printer->add_line("Datum *_ppvar = nullptr;");
                    -
                    2154 
                    -
                    2155  if (info.point_process) {
                    -
                    2156  printer->push_block("if (nrn_point_prop_)");
                    -
                    2157  printer->add_multi_line(R"CODE(
                    -
                    2158  _nrn_mechanism_access_alloc_seq(_prop) = _nrn_mechanism_access_alloc_seq(nrn_point_prop_);
                    -
                    2159  _ppvar = _nrn_mechanism_access_dparam(nrn_point_prop_);
                    -
                    2160  )CODE");
                    -
                    2161  printer->chain_block("else");
                    -
                    2162  }
                    -
                    2163  if (info.semantic_variable_count || info.emit_cvode) {
                    -
                    2164  printer->fmt_line("_ppvar = nrn_prop_datum_alloc(mech_type, {}, _prop);",
                    -
                    2165  info.semantic_variable_count + static_cast<int>(info.emit_cvode));
                    -
                    2166  printer->add_line("_nrn_mechanism_access_dparam(_prop) = _ppvar;");
                    -
                    2167  }
                    -
                    2168  printer->add_multi_line(R"CODE(
                    -
                    2169  _nrn_mechanism_cache_instance _lmc{_prop};
                    -
                    2170  size_t const _iml = 0;
                    -
                    2171  )CODE");
                    -
                    2172  printer->fmt_line("assert(_nrn_mechanism_get_num_vars(_prop) == {});",
                    -
                    2173  codegen_float_variables.size());
                    -
                    2174  if (float_variables_size()) {
                    -
                    2175  printer->add_line("/*initialize range parameters*/");
                    -
                    2176  for (size_t i_param = 0; i_param < info.range_parameter_vars.size(); ++i_param) {
                    -
                    2177  const auto var = info.range_parameter_vars[i_param];
                    -
                    2178  if (var->is_array()) {
                    -
                    2179  continue;
                    -
                    2180  }
                    -
                    2181  const auto& var_name = var->get_name();
                    -
                    2182  auto var_pos = position_of_float_var(var_name);
                    -
                    2183 
                    -
                    2184  printer->fmt_line("_lmc.template fpfield<{}>(_iml) = {}; /* {} */",
                    -
                    2185  var_pos,
                    -
                    2186  fmt::format("_parameter_defaults[{}]", i_param),
                    -
                    2187  var_name);
                    -
                    2188  }
                    -
                    2189  }
                    -
                    2190  if (info.point_process) {
                    -
                    2191  printer->pop_block();
                    -
                    2192  }
                    +
                    2138  printer->pop_block();
                    +
                    2139 }
                    +
                    2140 
                    +
                    2141 
                    + +
                    2143  printer->add_newline(2);
                    +
                    2144 
                    +
                    2145  auto method = method_name(naming::NRN_ALLOC_METHOD);
                    +
                    2146  printer->fmt_push_block("static void {}(Prop* _prop)", method);
                    +
                    2147  printer->add_line("Datum *_ppvar = nullptr;");
                    +
                    2148 
                    +
                    2149  if (info.point_process) {
                    +
                    2150  printer->push_block("if (nrn_point_prop_)");
                    +
                    2151  printer->add_multi_line(R"CODE(
                    +
                    2152  _nrn_mechanism_access_alloc_seq(_prop) = _nrn_mechanism_access_alloc_seq(nrn_point_prop_);
                    +
                    2153  _ppvar = _nrn_mechanism_access_dparam(nrn_point_prop_);
                    +
                    2154  )CODE");
                    +
                    2155  printer->chain_block("else");
                    +
                    2156  }
                    +
                    2157  if (info.semantic_variable_count || info.emit_cvode) {
                    +
                    2158  printer->fmt_line("_ppvar = nrn_prop_datum_alloc(mech_type, {}, _prop);",
                    +
                    2159  info.semantic_variable_count + static_cast<int>(info.emit_cvode));
                    +
                    2160  printer->add_line("_nrn_mechanism_access_dparam(_prop) = _ppvar;");
                    +
                    2161  }
                    +
                    2162  printer->add_multi_line(R"CODE(
                    +
                    2163  _nrn_mechanism_cache_instance _lmc{_prop};
                    +
                    2164  size_t const _iml = 0;
                    +
                    2165  )CODE");
                    +
                    2166  printer->fmt_line("assert(_nrn_mechanism_get_num_vars(_prop) == {});",
                    +
                    2167  codegen_float_variables.size());
                    +
                    2168  if (float_variables_size()) {
                    +
                    2169  printer->add_line("/*initialize range parameters*/");
                    +
                    2170  for (size_t i_param = 0; i_param < info.range_parameter_vars.size(); ++i_param) {
                    +
                    2171  const auto var = info.range_parameter_vars[i_param];
                    +
                    2172  if (var->is_array()) {
                    +
                    2173  continue;
                    +
                    2174  }
                    +
                    2175  const auto& var_name = var->get_name();
                    +
                    2176  auto var_pos = position_of_float_var(var_name);
                    +
                    2177 
                    +
                    2178  printer->fmt_line("_lmc.template fpfield<{}>(_iml) = {}; /* {} */",
                    +
                    2179  var_pos,
                    +
                    2180  fmt::format("_parameter_defaults[{}]", i_param),
                    +
                    2181  var_name);
                    +
                    2182  }
                    +
                    2183  }
                    +
                    2184  if (info.point_process) {
                    +
                    2185  printer->pop_block();
                    +
                    2186  }
                    +
                    2187 
                    +
                    2188  if (info.semantic_variable_count) {
                    +
                    2189  printer->add_line("_nrn_mechanism_access_dparam(_prop) = _ppvar;");
                    +
                    2190  }
                    +
                    2191 
                    +
                    2192  const auto codegen_int_variables_size = codegen_int_variables.size();
                    2193 
                    -
                    2194  if (info.semantic_variable_count) {
                    -
                    2195  printer->add_line("_nrn_mechanism_access_dparam(_prop) = _ppvar;");
                    -
                    2196  }
                    -
                    2197 
                    -
                    2198  const auto codegen_int_variables_size = codegen_int_variables.size();
                    -
                    2199 
                    -
                    2200  if (info.diam_used || info.area_used) {
                    -
                    2201  for (size_t i = 0; i < codegen_int_variables.size(); ++i) {
                    -
                    2202  auto var_info = codegen_int_variables[i];
                    -
                    2203  if (var_info.symbol->get_name() == naming::DIAM_VARIABLE) {
                    -
                    2204  printer->fmt_line("Prop * morphology_prop = need_memb({}._morphology_sym);",
                    -
                    2205  global_struct_instance());
                    -
                    2206  printer->fmt_line(
                    -
                    2207  "_ppvar[{}] = _nrn_mechanism_get_param_handle(morphology_prop, 0);", i);
                    -
                    2208  }
                    -
                    2209  if (var_info.symbol->get_name() == naming::AREA_VARIABLE) {
                    -
                    2210  printer->fmt_line("_ppvar[{}] = _nrn_mechanism_get_area_handle(nrn_alloc_node_);",
                    -
                    2211  i);
                    -
                    2212  }
                    -
                    2213  }
                    -
                    2214  }
                    -
                    2215 
                    -
                    2216  for (const auto& ion: info.ions) {
                    -
                    2217  printer->fmt_line("Symbol * {}_sym = hoc_lookup(\"{}_ion\");", ion.name, ion.name);
                    -
                    2218  printer->fmt_line("Prop * {}_prop = need_memb({}_sym);", ion.name, ion.name);
                    -
                    2219 
                    -
                    2220  if (ion.is_exterior_conc_written()) {
                    -
                    2221  printer->fmt_line("nrn_check_conc_write(_prop, {}_prop, 0);", ion.name);
                    -
                    2222  }
                    -
                    2223 
                    -
                    2224  if (ion.is_interior_conc_written()) {
                    -
                    2225  printer->fmt_line("nrn_check_conc_write(_prop, {}_prop, 1);", ion.name);
                    -
                    2226  }
                    -
                    2227 
                    -
                    2228  int conc = ion.is_conc_written() ? 3 : int(ion.is_conc_read());
                    -
                    2229  int rev = ion.is_rev_written() ? 3 : int(ion.is_rev_read());
                    -
                    2230 
                    -
                    2231  printer->fmt_line("nrn_promote({}_prop, {}, {});", ion.name, conc, rev);
                    -
                    2232 
                    -
                    2233  for (size_t i = 0; i < codegen_int_variables_size; ++i) {
                    -
                    2234  const auto& var = codegen_int_variables[i];
                    -
                    2235 
                    -
                    2236  const std::string& var_name = var.symbol->get_name();
                    -
                    2237 
                    -
                    2238  if (stringutils::starts_with(var_name, "ion_")) {
                    -
                    2239  std::string ion_var_name = std::string(var_name.begin() + 4, var_name.end());
                    -
                    2240  if (ion.is_ionic_variable(ion_var_name) ||
                    -
                    2241  ion.is_current_derivative(ion_var_name) || ion.is_rev_potential(ion_var_name)) {
                    -
                    2242  printer->fmt_line("_ppvar[{}] = _nrn_mechanism_get_param_handle({}_prop, {});",
                    -
                    2243  i,
                    -
                    2244  ion.name,
                    -
                    2245  ion.variable_index(ion_var_name));
                    -
                    2246  }
                    -
                    2247  } else {
                    -
                    2248  if (ion.is_style(var_name)) {
                    -
                    2249  printer->fmt_line(
                    -
                    2250  "_ppvar[{}] = {{neuron::container::do_not_search, "
                    -
                    2251  "&(_nrn_mechanism_access_dparam({}_prop)[0].literal_value<int>())}};",
                    -
                    2252  i,
                    -
                    2253  ion.name);
                    -
                    2254  }
                    -
                    2255  }
                    -
                    2256  }
                    -
                    2257  }
                    -
                    2258 
                    -
                    2259  if (!info.random_variables.empty()) {
                    -
                    2260  for (const auto& rv: info.random_variables) {
                    -
                    2261  auto position = position_of_int_var(get_name(rv));
                    -
                    2262  printer->fmt_line("_ppvar[{}].literal_value<void*>() = nrnran123_newstream();",
                    -
                    2263  position);
                    -
                    2264  }
                    -
                    2265  printer->fmt_line("nrn_mech_inst_destruct[mech_type] = neuron::{};",
                    -
                    2266  method_name(naming::NRN_DESTRUCTOR_METHOD));
                    -
                    2267  }
                    -
                    2268 
                    -
                    2269  if (info.point_process || info.artificial_cell) {
                    -
                    2270  printer->fmt_push_block("if(!nrn_point_prop_)");
                    +
                    2194  if (info.diam_used || info.area_used) {
                    +
                    2195  for (size_t i = 0; i < codegen_int_variables.size(); ++i) {
                    +
                    2196  auto var_info = codegen_int_variables[i];
                    +
                    2197  if (var_info.symbol->get_name() == naming::DIAM_VARIABLE) {
                    +
                    2198  printer->fmt_line("Prop * morphology_prop = need_memb({}._morphology_sym);",
                    +
                    2199  global_struct_instance());
                    +
                    2200  printer->fmt_line(
                    +
                    2201  "_ppvar[{}] = _nrn_mechanism_get_param_handle(morphology_prop, 0);", i);
                    +
                    2202  }
                    +
                    2203  if (var_info.symbol->get_name() == naming::AREA_VARIABLE) {
                    +
                    2204  printer->fmt_line("_ppvar[{}] = _nrn_mechanism_get_area_handle(nrn_alloc_node_);",
                    +
                    2205  i);
                    +
                    2206  }
                    +
                    2207  }
                    +
                    2208  }
                    +
                    2209 
                    +
                    2210  for (const auto& ion: info.ions) {
                    +
                    2211  printer->fmt_line("Symbol * {}_sym = hoc_lookup(\"{}_ion\");", ion.name, ion.name);
                    +
                    2212  printer->fmt_line("Prop * {}_prop = need_memb({}_sym);", ion.name, ion.name);
                    +
                    2213 
                    +
                    2214  if (ion.is_exterior_conc_written()) {
                    +
                    2215  printer->fmt_line("nrn_check_conc_write(_prop, {}_prop, 0);", ion.name);
                    +
                    2216  }
                    +
                    2217 
                    +
                    2218  if (ion.is_interior_conc_written()) {
                    +
                    2219  printer->fmt_line("nrn_check_conc_write(_prop, {}_prop, 1);", ion.name);
                    +
                    2220  }
                    +
                    2221 
                    +
                    2222  int conc = ion.is_conc_written() ? 3 : int(ion.is_conc_read());
                    +
                    2223  int rev = ion.is_rev_written() ? 3 : int(ion.is_rev_read());
                    +
                    2224 
                    +
                    2225  printer->fmt_line("nrn_promote({}_prop, {}, {});", ion.name, conc, rev);
                    +
                    2226 
                    +
                    2227  for (size_t i = 0; i < codegen_int_variables_size; ++i) {
                    +
                    2228  const auto& var = codegen_int_variables[i];
                    +
                    2229 
                    +
                    2230  const std::string& var_name = var.symbol->get_name();
                    +
                    2231 
                    +
                    2232  if (stringutils::starts_with(var_name, "ion_")) {
                    +
                    2233  std::string ion_var_name = std::string(var_name.begin() + 4, var_name.end());
                    +
                    2234  if (ion.is_ionic_variable(ion_var_name) ||
                    +
                    2235  ion.is_current_derivative(ion_var_name) || ion.is_rev_potential(ion_var_name)) {
                    +
                    2236  printer->fmt_line("_ppvar[{}] = _nrn_mechanism_get_param_handle({}_prop, {});",
                    +
                    2237  i,
                    +
                    2238  ion.name,
                    +
                    2239  ion.variable_index(ion_var_name));
                    +
                    2240  }
                    +
                    2241  } else {
                    +
                    2242  if (ion.is_style(var_name)) {
                    +
                    2243  printer->fmt_line(
                    +
                    2244  "_ppvar[{}] = {{neuron::container::do_not_search, "
                    +
                    2245  "&(_nrn_mechanism_access_dparam({}_prop)[0].literal_value<int>())}};",
                    +
                    2246  i,
                    +
                    2247  ion.name);
                    +
                    2248  }
                    +
                    2249  }
                    +
                    2250  }
                    +
                    2251  }
                    +
                    2252 
                    +
                    2253  if (!info.random_variables.empty()) {
                    +
                    2254  for (const auto& rv: info.random_variables) {
                    +
                    2255  auto position = position_of_int_var(get_name(rv));
                    +
                    2256  printer->fmt_line("_ppvar[{}].literal_value<void*>() = nrnran123_newstream();",
                    +
                    2257  position);
                    +
                    2258  }
                    +
                    2259  printer->fmt_line("nrn_mech_inst_destruct[mech_type] = neuron::{};",
                    +
                    2260  method_name(naming::NRN_DESTRUCTOR_METHOD));
                    +
                    2261  }
                    +
                    2262 
                    +
                    2263  if (info.point_process || info.artificial_cell) {
                    +
                    2264  printer->fmt_push_block("if(!nrn_point_prop_)");
                    +
                    2265 
                    +
                    2266  if (info.constructor_node) {
                    +
                    2267  printer->fmt_line("{}(_prop);", method_name(naming::NRN_CONSTRUCTOR_METHOD));
                    +
                    2268  }
                    +
                    2269  printer->pop_block();
                    +
                    2270  }
                    2271 
                    -
                    2272  if (info.constructor_node) {
                    -
                    2273  printer->fmt_line("{}(_prop);", method_name(naming::NRN_CONSTRUCTOR_METHOD));
                    -
                    2274  }
                    -
                    2275  printer->pop_block();
                    -
                    2276  }
                    -
                    2277 
                    -
                    2278  printer->pop_block();
                    -
                    2279 }
                    -
                    2280 
                    -
                    2281 
                    -
                    2282 /****************************************************************************************/
                    -
                    2283 /* Print nrn_state routine */
                    -
                    2284 /****************************************************************************************/
                    -
                    2285 
                    - -
                    2287  if (!nrn_state_required()) {
                    -
                    2288  return;
                    -
                    2289  }
                    -
                    2290 
                    -
                    2291  printer->add_newline(2);
                    -
                    2292  print_global_function_common_code(BlockType::State);
                    -
                    2293 
                    -
                    2294  printer->push_block("for (int id = 0; id < nodecount; id++)");
                    -
                    2295  printer->add_line("int node_id = node_data.nodeindices[id];");
                    -
                    2296  printer->add_line("auto* _ppvar = _ml_arg->pdata[id];");
                    -
                    2297  if (!info.artificial_cell) {
                    -
                    2298  printer->add_line("inst.v_unused[id] = node_data.node_voltages[node_id];");
                    -
                    2299  }
                    -
                    2300 
                    -
                    2301  /**
                    -
                    2302  * \todo Eigen solver node also emits IonCurVar variable in the functor
                    -
                    2303  * but that shouldn't update ions in derivative block
                    -
                    2304  */
                    -
                    2305  if (ion_variable_struct_required()) {
                    -
                    2306  throw std::runtime_error("Not implemented.");
                    -
                    2307  }
                    -
                    2308 
                    -
                    2309  auto read_statements = ion_read_statements(BlockType::State);
                    -
                    2310  for (auto& statement: read_statements) {
                    -
                    2311  printer->add_line(statement);
                    -
                    2312  }
                    -
                    2313 
                    -
                    2314  if (info.nrn_state_block) {
                    -
                    2315  info.nrn_state_block->visit_children(*this);
                    -
                    2316  }
                    -
                    2317 
                    -
                    2318  if (info.currents.empty() && info.breakpoint_node != nullptr) {
                    -
                    2319  auto block = info.breakpoint_node->get_statement_block();
                    -
                    2320  print_statement_block(*block, false, false);
                    +
                    2272  printer->pop_block();
                    +
                    2273 }
                    +
                    2274 
                    +
                    2275 
                    +
                    2276 /****************************************************************************************/
                    +
                    2277 /* Print nrn_state routine */
                    +
                    2278 /****************************************************************************************/
                    +
                    2279 
                    + +
                    2281  if (!nrn_state_required()) {
                    +
                    2282  return;
                    +
                    2283  }
                    +
                    2284 
                    +
                    2285  printer->add_newline(2);
                    +
                    2286  print_global_function_common_code(BlockType::State);
                    +
                    2287 
                    +
                    2288  printer->push_block("for (int id = 0; id < nodecount; id++)");
                    +
                    2289  printer->add_line("int node_id = node_data.nodeindices[id];");
                    +
                    2290  printer->add_line("auto* _ppvar = _ml_arg->pdata[id];");
                    +
                    2291  if (!info.artificial_cell) {
                    +
                    2292  printer->add_line("inst.v_unused[id] = node_data.node_voltages[node_id];");
                    +
                    2293  }
                    +
                    2294 
                    +
                    2295  /**
                    +
                    2296  * \todo Eigen solver node also emits IonCurVar variable in the functor
                    +
                    2297  * but that shouldn't update ions in derivative block
                    +
                    2298  */
                    +
                    2299  if (ion_variable_struct_required()) {
                    +
                    2300  throw std::runtime_error("Not implemented.");
                    +
                    2301  }
                    +
                    2302 
                    +
                    2303  auto read_statements = ion_read_statements(BlockType::State);
                    +
                    2304  for (auto& statement: read_statements) {
                    +
                    2305  printer->add_line(statement);
                    +
                    2306  }
                    +
                    2307 
                    +
                    2308  if (info.nrn_state_block) {
                    +
                    2309  info.nrn_state_block->visit_children(*this);
                    +
                    2310  }
                    +
                    2311 
                    +
                    2312  if (info.currents.empty() && info.breakpoint_node != nullptr) {
                    +
                    2313  auto block = info.breakpoint_node->get_statement_block();
                    +
                    2314  print_statement_block(*block, false, false);
                    +
                    2315  }
                    +
                    2316 
                    +
                    2317  const auto& write_statements = ion_write_statements(BlockType::State);
                    +
                    2318  for (auto& statement: write_statements) {
                    +
                    2319  const auto& text = process_shadow_update_statement(statement, BlockType::State);
                    +
                    2320  printer->add_line(text);
                    2321  }
                    2322 
                    -
                    2323  const auto& write_statements = ion_write_statements(BlockType::State);
                    -
                    2324  for (auto& statement: write_statements) {
                    -
                    2325  const auto& text = process_shadow_update_statement(statement, BlockType::State);
                    -
                    2326  printer->add_line(text);
                    -
                    2327  }
                    -
                    2328 
                    -
                    2329  printer->pop_block();
                    -
                    2330  printer->pop_block();
                    -
                    2331 }
                    -
                    2332 
                    -
                    2333 
                    -
                    2334 /****************************************************************************************/
                    -
                    2335 /* Print nrn_cur related routines */
                    -
                    2336 /****************************************************************************************/
                    -
                    2337 
                    - -
                    2339  return get_arg_str(nrn_current_parameters());
                    -
                    2340 }
                    +
                    2323  printer->pop_block();
                    +
                    2324  printer->pop_block();
                    +
                    2325 }
                    +
                    2326 
                    +
                    2327 
                    +
                    2328 /****************************************************************************************/
                    +
                    2329 /* Print nrn_cur related routines */
                    +
                    2330 /****************************************************************************************/
                    +
                    2331 
                    + +
                    2333  return get_arg_str(nrn_current_parameters());
                    +
                    2334 }
                    +
                    2335 
                    +
                    2336 
                    + +
                    2338  if (ion_variable_struct_required()) {
                    +
                    2339  throw std::runtime_error("Not implemented.");
                    +
                    2340  }
                    2341 
                    -
                    2342 
                    - -
                    2344  if (ion_variable_struct_required()) {
                    -
                    2345  throw std::runtime_error("Not implemented.");
                    -
                    2346  }
                    -
                    2347 
                    -
                    2348  ParamVector params = {{"", "_nrn_mechanism_cache_range&", "", "_lmc"},
                    -
                    2349  {"", "NrnThread*", "", "nt"},
                    -
                    2350  {"", "Datum*", "", "_ppvar"},
                    -
                    2351  {"", "Datum*", "", "_thread"}};
                    -
                    2352 
                    -
                    2353  if (info.thread_callback_register) {
                    -
                    2354  auto type_name = fmt::format("{}&", thread_variables_struct());
                    -
                    2355  params.emplace_back("", type_name, "", "_thread_vars");
                    -
                    2356  }
                    -
                    2357  params.emplace_back("", "size_t", "", "id");
                    -
                    2358  params.emplace_back("", fmt::format("{}&", instance_struct()), "", "inst");
                    -
                    2359  params.emplace_back("", fmt::format("{}&", node_data_struct()), "", "node_data");
                    -
                    2360  params.emplace_back("", "double", "", "v");
                    -
                    2361  return params;
                    -
                    2362 }
                    -
                    2363 
                    -
                    2364 
                    - -
                    2366  const auto& args = nrn_current_parameters();
                    -
                    2367  const auto& block = node.get_statement_block();
                    -
                    2368  printer->add_newline(2);
                    -
                    2369  printer->fmt_push_block("static inline double nrn_current_{}({})",
                    -
                    2370  info.mod_suffix,
                    -
                    2371  get_parameter_str(args));
                    -
                    2372  printer->add_line("inst.v_unused[id] = v;");
                    -
                    2373  printer->add_line("double current = 0.0;");
                    -
                    2374  print_statement_block(*block, false, false);
                    -
                    2375  for (auto& current: info.currents) {
                    -
                    2376  const auto& name = get_variable_name(current);
                    -
                    2377  printer->fmt_line("current += {};", name);
                    -
                    2378  }
                    -
                    2379  printer->add_line("return current;");
                    -
                    2380  printer->pop_block();
                    -
                    2381 }
                    -
                    2382 
                    -
                    2383 
                    - -
                    2385  const auto& block = node.get_statement_block();
                    -
                    2386  print_statement_block(*block, false, false);
                    -
                    2387  if (!info.currents.empty()) {
                    -
                    2388  std::string sum;
                    -
                    2389  for (const auto& current: info.currents) {
                    -
                    2390  auto var = breakpoint_current(current);
                    -
                    2391  sum += get_variable_name(var);
                    -
                    2392  if (&current != &info.currents.back()) {
                    -
                    2393  sum += "+";
                    -
                    2394  }
                    -
                    2395  }
                    -
                    2396  printer->fmt_line("double rhs = {};", sum);
                    -
                    2397  }
                    -
                    2398 
                    -
                    2399  std::string sum;
                    -
                    2400  for (const auto& conductance: info.conductances) {
                    -
                    2401  auto var = breakpoint_current(conductance.variable);
                    -
                    2402  sum += get_variable_name(var);
                    -
                    2403  if (&conductance != &info.conductances.back()) {
                    -
                    2404  sum += "+";
                    -
                    2405  }
                    -
                    2406  }
                    -
                    2407  printer->fmt_line("double g = {};", sum);
                    -
                    2408 
                    -
                    2409  for (const auto& conductance: info.conductances) {
                    -
                    2410  if (!conductance.ion.empty()) {
                    -
                    2411  const auto& lhs = std::string(naming::ION_VARNAME_PREFIX) + "di" + conductance.ion +
                    -
                    2412  "dv";
                    -
                    2413  const auto& rhs = get_variable_name(conductance.variable);
                    -
                    2414  const ShadowUseStatement statement{lhs, "+=", rhs};
                    -
                    2415  const auto& text = process_shadow_update_statement(statement, BlockType::Equation);
                    -
                    2416  printer->add_line(text);
                    -
                    2417  }
                    -
                    2418  }
                    -
                    2419 }
                    -
                    2420 
                    -
                    2421 
                    - -
                    2423  printer->fmt_line("double I1 = nrn_current_{}({}+0.001);",
                    -
                    2424  info.mod_suffix,
                    -
                    2425  nrn_current_arguments());
                    -
                    2426  for (auto& ion: info.ions) {
                    -
                    2427  for (auto& var: ion.writes) {
                    -
                    2428  if (ion.is_ionic_current(var)) {
                    -
                    2429  const auto& name = get_variable_name(var);
                    -
                    2430  printer->fmt_line("double di{} = {};", ion.name, name);
                    -
                    2431  }
                    -
                    2432  }
                    -
                    2433  }
                    -
                    2434  printer->fmt_line("double I0 = nrn_current_{}({});", info.mod_suffix, nrn_current_arguments());
                    -
                    2435  printer->add_line("double rhs = I0;");
                    -
                    2436 
                    -
                    2437  printer->add_line("double g = (I1-I0)/0.001;");
                    -
                    2438  for (auto& ion: info.ions) {
                    -
                    2439  for (auto& var: ion.writes) {
                    -
                    2440  if (ion.is_ionic_current(var)) {
                    -
                    2441  const auto& lhs = std::string(naming::ION_VARNAME_PREFIX) + "di" + ion.name + "dv";
                    -
                    2442  auto rhs = fmt::format("(di{}-{})/0.001", ion.name, get_variable_name(var));
                    -
                    2443  if (info.point_process) {
                    -
                    2444  auto area = get_variable_name(naming::NODE_AREA_VARIABLE);
                    -
                    2445  rhs += fmt::format("*1.e2/{}", area);
                    -
                    2446  }
                    -
                    2447  const ShadowUseStatement statement{lhs, "+=", rhs};
                    -
                    2448  const auto& text = process_shadow_update_statement(statement, BlockType::Equation);
                    -
                    2449  printer->add_line(text);
                    -
                    2450  }
                    -
                    2451  }
                    -
                    2452  }
                    -
                    2453 }
                    -
                    2454 
                    -
                    2455 
                    - -
                    2457  printer->add_line("int node_id = node_data.nodeindices[id];");
                    -
                    2458  printer->add_line("double v = node_data.node_voltages[node_id];");
                    -
                    2459  printer->add_line("auto* _ppvar = _ml_arg->pdata[id];");
                    -
                    2460  const auto& read_statements = ion_read_statements(BlockType::Equation);
                    -
                    2461  for (auto& statement: read_statements) {
                    -
                    2462  printer->add_line(statement);
                    +
                    2342  ParamVector params = {{"", "_nrn_mechanism_cache_range&", "", "_lmc"},
                    +
                    2343  {"", "NrnThread*", "", "nt"},
                    +
                    2344  {"", "Datum*", "", "_ppvar"},
                    +
                    2345  {"", "Datum*", "", "_thread"}};
                    +
                    2346 
                    +
                    2347  if (info.thread_callback_register) {
                    +
                    2348  auto type_name = fmt::format("{}&", thread_variables_struct());
                    +
                    2349  params.emplace_back("", type_name, "", "_thread_vars");
                    +
                    2350  }
                    +
                    2351  params.emplace_back("", "size_t", "", "id");
                    +
                    2352  params.emplace_back("", fmt::format("{}&", instance_struct()), "", "inst");
                    +
                    2353  params.emplace_back("", fmt::format("{}&", node_data_struct()), "", "node_data");
                    +
                    2354  params.emplace_back("", "double", "", "v");
                    +
                    2355  return params;
                    +
                    2356 }
                    +
                    2357 
                    +
                    2358 
                    + +
                    2360  const auto& args = nrn_current_parameters();
                    +
                    2361  const auto& block = node.get_statement_block();
                    +
                    2362  printer->add_newline(2);
                    +
                    2363  printer->fmt_push_block("static inline double nrn_current_{}({})",
                    +
                    2364  info.mod_suffix,
                    +
                    2365  get_parameter_str(args));
                    +
                    2366  printer->add_line("inst.v_unused[id] = v;");
                    +
                    2367  printer->add_line("double current = 0.0;");
                    +
                    2368  print_statement_block(*block, false, false);
                    +
                    2369  for (auto& current: info.currents) {
                    +
                    2370  const auto& name = get_variable_name(current);
                    +
                    2371  printer->fmt_line("current += {};", name);
                    +
                    2372  }
                    +
                    2373  printer->add_line("return current;");
                    +
                    2374  printer->pop_block();
                    +
                    2375 }
                    +
                    2376 
                    +
                    2377 
                    + +
                    2379  const auto& block = node.get_statement_block();
                    +
                    2380  print_statement_block(*block, false, false);
                    +
                    2381  if (!info.currents.empty()) {
                    +
                    2382  std::string sum;
                    +
                    2383  for (const auto& current: info.currents) {
                    +
                    2384  auto var = breakpoint_current(current);
                    +
                    2385  sum += get_variable_name(var);
                    +
                    2386  if (&current != &info.currents.back()) {
                    +
                    2387  sum += "+";
                    +
                    2388  }
                    +
                    2389  }
                    +
                    2390  printer->fmt_line("double rhs = {};", sum);
                    +
                    2391  }
                    +
                    2392 
                    +
                    2393  std::string sum;
                    +
                    2394  for (const auto& conductance: info.conductances) {
                    +
                    2395  auto var = breakpoint_current(conductance.variable);
                    +
                    2396  sum += get_variable_name(var);
                    +
                    2397  if (&conductance != &info.conductances.back()) {
                    +
                    2398  sum += "+";
                    +
                    2399  }
                    +
                    2400  }
                    +
                    2401  printer->fmt_line("double g = {};", sum);
                    +
                    2402 
                    +
                    2403  for (const auto& conductance: info.conductances) {
                    +
                    2404  if (!conductance.ion.empty()) {
                    +
                    2405  const auto& lhs = std::string(naming::ION_VARNAME_PREFIX) + "di" + conductance.ion +
                    +
                    2406  "dv";
                    +
                    2407  const auto& rhs = get_variable_name(conductance.variable);
                    +
                    2408  const ShadowUseStatement statement{lhs, "+=", rhs};
                    +
                    2409  const auto& text = process_shadow_update_statement(statement, BlockType::Equation);
                    +
                    2410  printer->add_line(text);
                    +
                    2411  }
                    +
                    2412  }
                    +
                    2413 }
                    +
                    2414 
                    +
                    2415 
                    + +
                    2417  printer->fmt_line("double I1 = nrn_current_{}({}+0.001);",
                    +
                    2418  info.mod_suffix,
                    +
                    2419  nrn_current_arguments());
                    +
                    2420  for (auto& ion: info.ions) {
                    +
                    2421  for (auto& var: ion.writes) {
                    +
                    2422  if (ion.is_ionic_current(var)) {
                    +
                    2423  const auto& name = get_variable_name(var);
                    +
                    2424  printer->fmt_line("double di{} = {};", ion.name, name);
                    +
                    2425  }
                    +
                    2426  }
                    +
                    2427  }
                    +
                    2428  printer->fmt_line("double I0 = nrn_current_{}({});", info.mod_suffix, nrn_current_arguments());
                    +
                    2429  printer->add_line("double rhs = I0;");
                    +
                    2430 
                    +
                    2431  printer->add_line("double g = (I1-I0)/0.001;");
                    +
                    2432  for (auto& ion: info.ions) {
                    +
                    2433  for (auto& var: ion.writes) {
                    +
                    2434  if (ion.is_ionic_current(var)) {
                    +
                    2435  const auto& lhs = std::string(naming::ION_VARNAME_PREFIX) + "di" + ion.name + "dv";
                    +
                    2436  auto rhs = fmt::format("(di{}-{})/0.001", ion.name, get_variable_name(var));
                    +
                    2437  if (info.point_process) {
                    +
                    2438  auto area = get_variable_name(naming::NODE_AREA_VARIABLE);
                    +
                    2439  rhs += fmt::format("*1.e2/{}", area);
                    +
                    2440  }
                    +
                    2441  const ShadowUseStatement statement{lhs, "+=", rhs};
                    +
                    2442  const auto& text = process_shadow_update_statement(statement, BlockType::Equation);
                    +
                    2443  printer->add_line(text);
                    +
                    2444  }
                    +
                    2445  }
                    +
                    2446  }
                    +
                    2447 }
                    +
                    2448 
                    +
                    2449 
                    + +
                    2451  printer->add_line("int node_id = node_data.nodeindices[id];");
                    +
                    2452  printer->add_line("double v = node_data.node_voltages[node_id];");
                    +
                    2453  printer->add_line("auto* _ppvar = _ml_arg->pdata[id];");
                    +
                    2454  const auto& read_statements = ion_read_statements(BlockType::Equation);
                    +
                    2455  for (auto& statement: read_statements) {
                    +
                    2456  printer->add_line(statement);
                    +
                    2457  }
                    +
                    2458 
                    +
                    2459  if (info.conductances.empty()) {
                    +
                    2460  print_nrn_cur_non_conductance_kernel();
                    +
                    2461  } else {
                    +
                    2462  print_nrn_cur_conductance_kernel(node);
                    2463  }
                    2464 
                    -
                    2465  if (info.conductances.empty()) {
                    -
                    2466  print_nrn_cur_non_conductance_kernel();
                    -
                    2467  } else {
                    -
                    2468  print_nrn_cur_conductance_kernel(node);
                    +
                    2465  const auto& write_statements = ion_write_statements(BlockType::Equation);
                    +
                    2466  for (auto& statement: write_statements) {
                    +
                    2467  auto text = process_shadow_update_statement(statement, BlockType::Equation);
                    +
                    2468  printer->add_line(text);
                    2469  }
                    2470 
                    -
                    2471  const auto& write_statements = ion_write_statements(BlockType::Equation);
                    -
                    2472  for (auto& statement: write_statements) {
                    -
                    2473  auto text = process_shadow_update_statement(statement, BlockType::Equation);
                    -
                    2474  printer->add_line(text);
                    -
                    2475  }
                    -
                    2476 
                    -
                    2477  if (info.point_process) {
                    -
                    2478  const auto& area = get_variable_name(naming::NODE_AREA_VARIABLE);
                    -
                    2479  printer->fmt_line("double mfactor = 1.e2/{};", area);
                    -
                    2480  printer->add_line("g = g*mfactor;");
                    -
                    2481  printer->add_line("rhs = rhs*mfactor;");
                    -
                    2482  }
                    -
                    2483 
                    -
                    2484  // print_g_unused();
                    +
                    2471  if (info.point_process) {
                    +
                    2472  const auto& area = get_variable_name(naming::NODE_AREA_VARIABLE);
                    +
                    2473  printer->fmt_line("double mfactor = 1.e2/{};", area);
                    +
                    2474  printer->add_line("g = g*mfactor;");
                    +
                    2475  printer->add_line("rhs = rhs*mfactor;");
                    +
                    2476  }
                    +
                    2477 
                    +
                    2478  // print_g_unused();
                    +
                    2479 }
                    +
                    2480 
                    +
                    2481 
                    +
                    2482 /// TODO: Edit for NEURON
                    + +
                    2484  return;
                    2485 }
                    2486 
                    2487 
                    2488 /// TODO: Edit for NEURON
                    - -
                    2490  return;
                    -
                    2491 }
                    -
                    2492 
                    -
                    2493 
                    -
                    2494 /// TODO: Edit for NEURON
                    - -
                    2496  if (!nrn_cur_required()) {
                    -
                    2497  return;
                    -
                    2498  }
                    -
                    2499 
                    -
                    2500  if (info.conductances.empty()) {
                    -
                    2501  print_nrn_current(*info.breakpoint_node);
                    -
                    2502  }
                    -
                    2503 
                    -
                    2504  printer->add_newline(2);
                    -
                    2505  printer->add_line("/** update current */");
                    -
                    2506  print_global_function_common_code(BlockType::Equation);
                    -
                    2507  // print_channel_iteration_block_parallel_hint(BlockType::Equation, info.breakpoint_node);
                    -
                    2508  printer->push_block("for (int id = 0; id < nodecount; id++)");
                    -
                    2509  print_nrn_cur_kernel(*info.breakpoint_node);
                    -
                    2510  // print_nrn_cur_matrix_shadow_update();
                    -
                    2511  // if (!nrn_cur_reduction_loop_required()) {
                    -
                    2512  // print_fast_imem_calculation();
                    -
                    2513  // }
                    -
                    2514 
                    -
                    2515 
                    -
                    2516  printer->fmt_line("node_data.node_rhs[node_id] {} rhs;", operator_for_rhs());
                    -
                    2517 
                    -
                    2518  if (breakpoint_exist()) {
                    -
                    2519  printer->fmt_line("inst.{}[id] = g;",
                    -
                    2520  info.vectorize ? naming::CONDUCTANCE_UNUSED_VARIABLE
                    - -
                    2522  }
                    -
                    2523  printer->pop_block();
                    -
                    2524 
                    -
                    2525  // if (nrn_cur_reduction_loop_required()) {
                    -
                    2526  // printer->push_block("for (int id = 0; id < nodecount; id++)");
                    -
                    2527  // print_nrn_cur_matrix_shadow_reduction();
                    -
                    2528  // printer->pop_block();
                    -
                    2529  // print_fast_imem_calculation();
                    -
                    2530  // }
                    -
                    2531 
                    -
                    2532  // print_kernel_data_present_annotation_block_end();
                    -
                    2533  printer->pop_block();
                    -
                    2534 }
                    -
                    2535 
                    -
                    2536 
                    -
                    2537 /****************************************************************************************/
                    -
                    2538 /* Main code printing entry points */
                    -
                    2539 /****************************************************************************************/
                    -
                    2540 
                    - -
                    2542  print_standard_includes();
                    -
                    2543  print_neuron_includes();
                    + +
                    2490  if (!nrn_cur_required()) {
                    +
                    2491  return;
                    +
                    2492  }
                    +
                    2493 
                    +
                    2494  if (info.conductances.empty()) {
                    +
                    2495  print_nrn_current(*info.breakpoint_node);
                    +
                    2496  }
                    +
                    2497 
                    +
                    2498  printer->add_newline(2);
                    +
                    2499  printer->add_line("/** update current */");
                    +
                    2500  print_global_function_common_code(BlockType::Equation);
                    +
                    2501  // print_channel_iteration_block_parallel_hint(BlockType::Equation, info.breakpoint_node);
                    +
                    2502  printer->push_block("for (int id = 0; id < nodecount; id++)");
                    +
                    2503  print_nrn_cur_kernel(*info.breakpoint_node);
                    +
                    2504  // print_nrn_cur_matrix_shadow_update();
                    +
                    2505  // if (!nrn_cur_reduction_loop_required()) {
                    +
                    2506  // print_fast_imem_calculation();
                    +
                    2507  // }
                    +
                    2508 
                    +
                    2509 
                    +
                    2510  printer->fmt_line("node_data.node_rhs[node_id] {} rhs;", operator_for_rhs());
                    +
                    2511 
                    +
                    2512  if (breakpoint_exist()) {
                    +
                    2513  printer->fmt_line("inst.{}[id] = g;",
                    +
                    2514  info.vectorize ? naming::CONDUCTANCE_UNUSED_VARIABLE
                    + +
                    2516  }
                    +
                    2517  printer->pop_block();
                    +
                    2518 
                    +
                    2519  // if (nrn_cur_reduction_loop_required()) {
                    +
                    2520  // printer->push_block("for (int id = 0; id < nodecount; id++)");
                    +
                    2521  // print_nrn_cur_matrix_shadow_reduction();
                    +
                    2522  // printer->pop_block();
                    +
                    2523  // print_fast_imem_calculation();
                    +
                    2524  // }
                    +
                    2525 
                    +
                    2526  // print_kernel_data_present_annotation_block_end();
                    +
                    2527  printer->pop_block();
                    +
                    2528 }
                    +
                    2529 
                    +
                    2530 
                    +
                    2531 /****************************************************************************************/
                    +
                    2532 /* Main code printing entry points */
                    +
                    2533 /****************************************************************************************/
                    +
                    2534 
                    + +
                    2536  print_standard_includes();
                    +
                    2537  print_neuron_includes();
                    +
                    2538 
                    +
                    2539  if (info.thread_callback_register) {
                    +
                    2540  printer->add_line("extern void _nrn_thread_reg(int, int, void(*)(Datum*));");
                    +
                    2541  }
                    +
                    2542 }
                    +
                    2543 
                    2544 
                    -
                    2545  if (info.thread_callback_register) {
                    -
                    2546  printer->add_line("extern void _nrn_thread_reg(int, int, void(*)(Datum*));");
                    -
                    2547  }
                    -
                    2548 }
                    -
                    2549 
                    -
                    2550 
                    - -
                    2552  print_global_macros();
                    -
                    2553  print_mechanism_variables_macros();
                    -
                    2554 
                    -
                    2555  printer->add_line("extern Node* nrn_alloc_node_;");
                    -
                    2556 }
                    -
                    2557 
                    -
                    2558 
                    - -
                    2560  printer->add_newline();
                    -
                    2561  printer->add_line("/* NEURON global macro definitions */");
                    -
                    2562  if (info.vectorize) {
                    -
                    2563  printer->add_multi_line(R"CODE(
                    -
                    2564  /* VECTORIZED */
                    -
                    2565  #define NRN_VECTORIZED 1
                    -
                    2566  )CODE");
                    -
                    2567  } else {
                    -
                    2568  printer->add_multi_line(R"CODE(
                    -
                    2569  /* NOT VECTORIZED */
                    -
                    2570  #define NRN_VECTORIZED 0
                    -
                    2571  )CODE");
                    -
                    2572  }
                    -
                    2573 }
                    -
                    2574 
                    -
                    2575 
                    - -
                    2577  printer->add_newline();
                    -
                    2578  printer->add_line("static constexpr auto number_of_datum_variables = ",
                    -
                    2579  std::to_string(int_variables_size()),
                    -
                    2580  ";");
                    -
                    2581  printer->add_line("static constexpr auto number_of_floating_point_variables = ",
                    -
                    2582  std::to_string(codegen_float_variables.size()),
                    -
                    2583  ";");
                    -
                    2584  printer->add_newline();
                    -
                    2585  printer->add_multi_line(R"CODE(
                    -
                    2586  namespace {
                    + +
                    2546  print_global_macros();
                    +
                    2547  print_mechanism_variables_macros();
                    +
                    2548 
                    +
                    2549  printer->add_line("extern Node* nrn_alloc_node_;");
                    +
                    2550 }
                    +
                    2551 
                    +
                    2552 
                    + +
                    2554  printer->add_newline();
                    +
                    2555  printer->add_line("/* NEURON global macro definitions */");
                    +
                    2556  if (info.vectorize) {
                    +
                    2557  printer->add_multi_line(R"CODE(
                    +
                    2558  /* VECTORIZED */
                    +
                    2559  #define NRN_VECTORIZED 1
                    +
                    2560  )CODE");
                    +
                    2561  } else {
                    +
                    2562  printer->add_multi_line(R"CODE(
                    +
                    2563  /* NOT VECTORIZED */
                    +
                    2564  #define NRN_VECTORIZED 0
                    +
                    2565  )CODE");
                    +
                    2566  }
                    +
                    2567 }
                    +
                    2568 
                    +
                    2569 
                    + +
                    2571  printer->add_newline();
                    +
                    2572  printer->add_line("static constexpr auto number_of_datum_variables = ",
                    +
                    2573  std::to_string(int_variables_size()),
                    +
                    2574  ";");
                    +
                    2575  printer->add_line("static constexpr auto number_of_floating_point_variables = ",
                    +
                    2576  std::to_string(codegen_float_variables.size()),
                    +
                    2577  ";");
                    +
                    2578  printer->add_newline();
                    +
                    2579  printer->add_multi_line(R"CODE(
                    +
                    2580  namespace {
                    +
                    2581  template <typename T>
                    +
                    2582  using _nrn_mechanism_std_vector = std::vector<T>;
                    +
                    2583  using _nrn_model_sorted_token = neuron::model_sorted_token;
                    +
                    2584  using _nrn_mechanism_cache_range = neuron::cache::MechanismRange<number_of_floating_point_variables, number_of_datum_variables>;
                    +
                    2585  using _nrn_mechanism_cache_instance = neuron::cache::MechanismInstance<number_of_floating_point_variables, number_of_datum_variables>;
                    +
                    2586  using _nrn_non_owning_id_without_container = neuron::container::non_owning_identifier_without_container;
                    2587  template <typename T>
                    -
                    2588  using _nrn_mechanism_std_vector = std::vector<T>;
                    -
                    2589  using _nrn_model_sorted_token = neuron::model_sorted_token;
                    -
                    2590  using _nrn_mechanism_cache_range = neuron::cache::MechanismRange<number_of_floating_point_variables, number_of_datum_variables>;
                    -
                    2591  using _nrn_mechanism_cache_instance = neuron::cache::MechanismInstance<number_of_floating_point_variables, number_of_datum_variables>;
                    -
                    2592  using _nrn_non_owning_id_without_container = neuron::container::non_owning_identifier_without_container;
                    -
                    2593  template <typename T>
                    -
                    2594  using _nrn_mechanism_field = neuron::mechanism::field<T>;
                    -
                    2595  template <typename... Args>
                    -
                    2596  void _nrn_mechanism_register_data_fields(Args&&... args) {
                    -
                    2597  neuron::mechanism::register_data_fields(std::forward<Args>(args)...);
                    -
                    2598  }
                    -
                    2599  } // namespace
                    -
                    2600  )CODE");
                    -
                    2601 
                    -
                    2602  if (info.point_process) {
                    -
                    2603  printer->add_line("extern Prop* nrn_point_prop_;");
                    -
                    2604  } else {
                    -
                    2605  printer->add_line("Prop* hoc_getdata_range(int type);");
                    -
                    2606  }
                    -
                    2607  // for registration of tables
                    -
                    2608  if (info.table_count > 0) {
                    -
                    2609  printer->add_line("void _nrn_thread_table_reg(int, nrn_thread_table_check_t);");
                    -
                    2610  }
                    -
                    2611  // for CVODE
                    -
                    2612  printer->add_line("extern void _cvode_abstol(Symbol**, double*, int);");
                    -
                    2613  if (info.for_netcon_used) {
                    -
                    2614  printer->add_line("int _nrn_netcon_args(void*, double***);");
                    -
                    2615  }
                    -
                    2616 }
                    -
                    2617 
                    -
                    2618 
                    -
                    2619 void CodegenNeuronCppVisitor::print_data_structures(bool print_initializers) {
                    -
                    2620  print_mechanism_global_var_structure(print_initializers);
                    -
                    2621  print_mechanism_range_var_structure(print_initializers);
                    -
                    2622  print_node_data_structure(print_initializers);
                    -
                    2623  print_thread_variables_structure(print_initializers);
                    -
                    2624  print_make_instance();
                    -
                    2625  print_make_node_data();
                    -
                    2626 }
                    -
                    2627 
                    -
                    2628 
                    - -
                    2630  if (!info.vectorize) {
                    -
                    2631  return;
                    -
                    2632  }
                    -
                    2633  printer->add_multi_line(R"CODE(
                    -
                    2634  #if NRN_PRCELLSTATE
                    -
                    2635  inst->v_unused[id] = v;
                    -
                    2636  #endif
                    -
                    2637  )CODE");
                    -
                    2638 }
                    -
                    2639 
                    -
                    2640 
                    - -
                    2642  printer->add_multi_line(R"CODE(
                    -
                    2643  #if NRN_PRCELLSTATE
                    -
                    2644  inst->g_unused[id] = g;
                    -
                    2645  #endif
                    -
                    2646  )CODE");
                    -
                    2647 }
                    -
                    2648 
                    - -
                    2650  print_hoc_py_wrapper_function_definitions();
                    -
                    2651  for (const auto& procedure: info.procedures) {
                    -
                    2652  print_procedure(*procedure);
                    +
                    2588  using _nrn_mechanism_field = neuron::mechanism::field<T>;
                    +
                    2589  template <typename... Args>
                    +
                    2590  void _nrn_mechanism_register_data_fields(Args&&... args) {
                    +
                    2591  neuron::mechanism::register_data_fields(std::forward<Args>(args)...);
                    +
                    2592  }
                    +
                    2593  } // namespace
                    +
                    2594  )CODE");
                    +
                    2595 
                    +
                    2596  if (info.point_process) {
                    +
                    2597  printer->add_line("extern Prop* nrn_point_prop_;");
                    +
                    2598  } else {
                    +
                    2599  printer->add_line("Prop* hoc_getdata_range(int type);");
                    +
                    2600  }
                    +
                    2601  // for registration of tables
                    +
                    2602  if (info.table_count > 0) {
                    +
                    2603  printer->add_line("void _nrn_thread_table_reg(int, nrn_thread_table_check_t);");
                    +
                    2604  }
                    +
                    2605  // for CVODE
                    +
                    2606  printer->add_line("extern void _cvode_abstol(Symbol**, double*, int);");
                    +
                    2607  if (info.for_netcon_used) {
                    +
                    2608  printer->add_line("int _nrn_netcon_args(void*, double***);");
                    +
                    2609  }
                    +
                    2610 }
                    +
                    2611 
                    +
                    2612 
                    +
                    2613 void CodegenNeuronCppVisitor::print_data_structures(bool print_initializers) {
                    +
                    2614  print_mechanism_global_var_structure(print_initializers);
                    +
                    2615  print_mechanism_range_var_structure(print_initializers);
                    +
                    2616  print_node_data_structure(print_initializers);
                    +
                    2617  print_thread_variables_structure(print_initializers);
                    +
                    2618  print_make_instance();
                    +
                    2619  print_make_node_data();
                    +
                    2620 }
                    +
                    2621 
                    +
                    2622 
                    + +
                    2624  if (!info.vectorize) {
                    +
                    2625  return;
                    +
                    2626  }
                    +
                    2627  printer->add_multi_line(R"CODE(
                    +
                    2628  #if NRN_PRCELLSTATE
                    +
                    2629  inst->v_unused[id] = v;
                    +
                    2630  #endif
                    +
                    2631  )CODE");
                    +
                    2632 }
                    +
                    2633 
                    +
                    2634 
                    + +
                    2636  printer->add_multi_line(R"CODE(
                    +
                    2637  #if NRN_PRCELLSTATE
                    +
                    2638  inst->g_unused[id] = g;
                    +
                    2639  #endif
                    +
                    2640  )CODE");
                    +
                    2641 }
                    +
                    2642 
                    + +
                    2644  print_hoc_py_wrapper_function_definitions();
                    +
                    2645  for (const auto& procedure: info.procedures) {
                    +
                    2646  print_procedure(*procedure);
                    +
                    2647  }
                    +
                    2648  for (const auto& function: info.functions) {
                    +
                    2649  print_function(*function);
                    +
                    2650  }
                    +
                    2651  for (const auto& function_table: info.function_tables) {
                    +
                    2652  print_function_tables(*function_table);
                    2653  }
                    -
                    2654  for (const auto& function: info.functions) {
                    -
                    2655  print_function(*function);
                    -
                    2656  }
                    -
                    2657  for (const auto& function_table: info.function_tables) {
                    -
                    2658  print_function_tables(*function_table);
                    -
                    2659  }
                    -
                    2660 }
                    -
                    2661 
                    - -
                    2663  print_nrn_init();
                    -
                    2664  print_nrn_cur();
                    -
                    2665  print_nrn_state();
                    -
                    2666  print_nrn_jacob();
                    -
                    2667  print_net_receive();
                    -
                    2668  print_net_init();
                    -
                    2669 }
                    -
                    2670 
                    - -
                    2672  print_backend_info();
                    -
                    2673  print_headers_include();
                    -
                    2674  print_macro_definitions();
                    -
                    2675  print_neuron_global_variable_declarations();
                    -
                    2676  print_namespace_start();
                    -
                    2677  print_nmodl_constants();
                    -
                    2678  print_prcellstate_macros();
                    -
                    2679  print_mechanism_info();
                    -
                    2680  print_data_structures(true);
                    -
                    2681  print_nrn_constructor_declaration();
                    -
                    2682  print_nrn_destructor_declaration();
                    -
                    2683  print_nrn_alloc();
                    -
                    2684  print_function_prototypes();
                    -
                    2685  print_longitudinal_diffusion_callbacks();
                    -
                    2686  print_cvode_definitions();
                    -
                    2687  print_point_process_function_definitions();
                    -
                    2688  print_setdata_functions();
                    -
                    2689  print_check_table_entrypoint();
                    -
                    2690  print_top_verbatim_blocks();
                    -
                    2691  print_functors_definitions();
                    -
                    2692  print_global_variables_for_hoc();
                    -
                    2693  print_thread_memory_callbacks();
                    -
                    2694  print_function_definitions();
                    -
                    2695  print_compute_functions(); // only nrn_cur and nrn_state
                    -
                    2696  print_nrn_constructor();
                    -
                    2697  print_nrn_destructor();
                    -
                    2698  print_sdlists_init(true);
                    -
                    2699  print_mechanism_register();
                    -
                    2700  print_namespace_stop();
                    -
                    2701 }
                    -
                    2702 
                    - -
                    2704  print_backend_info();
                    -
                    2705  print_headers_include();
                    -
                    2706  print_namespace_start();
                    -
                    2707  print_function_prototypes();
                    -
                    2708  print_top_verbatim_blocks();
                    -
                    2709  print_global_variables_for_hoc();
                    -
                    2710  print_function_definitions();
                    -
                    2711  print_mechanism_register();
                    -
                    2712  print_namespace_stop();
                    -
                    2713 }
                    -
                    2714 
                    - -
                    2716  if (info.mod_suffix == "nothing") {
                    -
                    2717  print_codegen_routines_nothing();
                    -
                    2718  } else {
                    -
                    2719  print_codegen_routines_regular();
                    -
                    2720  }
                    -
                    2721 }
                    -
                    2722 
                    - -
                    2724  throw std::runtime_error("Not implemented.");
                    -
                    2725 }
                    -
                    2726 
                    -
                    2727 
                    - -
                    2729  auto const& arguments = node.get_arguments();
                    -
                    2730 
                    -
                    2731  if (printing_net_init) {
                    -
                    2732  throw std::runtime_error("Not implemented. [jfiwoei]");
                    -
                    2733  }
                    -
                    2734 
                    -
                    2735  std::string weight_pointer = "nullptr";
                    -
                    2736  auto point_process = get_variable_name(naming::POINT_PROCESS_VARIABLE,
                    -
                    2737  /* use_instance */ false);
                    -
                    2738  if (!printing_net_receive) {
                    -
                    2739  point_process += ".get<Point_process*>()";
                    -
                    2740  }
                    -
                    2741  const auto& tqitem = get_variable_name("tqitem", /* use_instance */ false);
                    -
                    2742 
                    -
                    2743  printer->fmt_text("{}(/* tqitem */ &{}, {}, {}, {} + ",
                    -
                    2744  info.artificial_cell ? "artcell_net_send" : "net_send",
                    -
                    2745  tqitem,
                    -
                    2746  weight_pointer,
                    -
                    2747  point_process,
                    -
                    2748  get_variable_name("t"));
                    -
                    2749  print_vector_elements(arguments, ", ");
                    -
                    2750  printer->add_text(')');
                    -
                    2751 }
                    -
                    2752 
                    - -
                    2754  const auto& point_process = get_variable_name("point_process", /* use_instance */ false);
                    -
                    2755  const auto& tqitem = get_variable_name("tqitem", /* use_instance */ false);
                    -
                    2756 
                    -
                    2757  printer->fmt_text("{}(/* tqitem */ &{}, {}, ",
                    -
                    2758  info.artificial_cell ? "artcell_net_move" : "net_move",
                    -
                    2759  tqitem,
                    -
                    2760  point_process);
                    -
                    2761 
                    -
                    2762  print_vector_elements(node.get_arguments(), ", ");
                    -
                    2763  printer->add_text(')');
                    +
                    2654 }
                    +
                    2655 
                    + +
                    2657  print_nrn_init();
                    +
                    2658  print_nrn_cur();
                    +
                    2659  print_nrn_state();
                    +
                    2660  print_nrn_jacob();
                    +
                    2661  print_net_receive();
                    +
                    2662  print_net_init();
                    +
                    2663 }
                    +
                    2664 
                    + +
                    2666  print_backend_info();
                    +
                    2667  print_headers_include();
                    +
                    2668  print_macro_definitions();
                    +
                    2669  print_neuron_global_variable_declarations();
                    +
                    2670  print_namespace_start();
                    +
                    2671  print_nmodl_constants();
                    +
                    2672  print_prcellstate_macros();
                    +
                    2673  print_mechanism_info();
                    +
                    2674  print_data_structures(true);
                    +
                    2675  print_nrn_constructor_declaration();
                    +
                    2676  print_nrn_destructor_declaration();
                    +
                    2677  print_nrn_alloc();
                    +
                    2678  print_function_prototypes();
                    +
                    2679  print_longitudinal_diffusion_callbacks();
                    +
                    2680  print_cvode_definitions();
                    +
                    2681  print_point_process_function_definitions();
                    +
                    2682  print_setdata_functions();
                    +
                    2683  print_check_table_entrypoint();
                    +
                    2684  print_top_verbatim_blocks();
                    +
                    2685  print_functors_definitions();
                    +
                    2686  print_global_variables_for_hoc();
                    +
                    2687  print_thread_memory_callbacks();
                    +
                    2688  print_function_definitions();
                    +
                    2689  print_compute_functions(); // only nrn_cur and nrn_state
                    +
                    2690  print_nrn_constructor();
                    +
                    2691  print_nrn_destructor();
                    +
                    2692  print_sdlists_init(true);
                    +
                    2693  print_mechanism_register();
                    +
                    2694  print_namespace_stop();
                    +
                    2695 }
                    +
                    2696 
                    + +
                    2698  print_backend_info();
                    +
                    2699  print_headers_include();
                    +
                    2700  print_namespace_start();
                    +
                    2701  print_function_prototypes();
                    +
                    2702  print_top_verbatim_blocks();
                    +
                    2703  print_global_variables_for_hoc();
                    +
                    2704  print_function_definitions();
                    +
                    2705  print_mechanism_register();
                    +
                    2706  print_namespace_stop();
                    +
                    2707 }
                    +
                    2708 
                    + +
                    2710  if (info.mod_suffix == "nothing") {
                    +
                    2711  print_codegen_routines_nothing();
                    +
                    2712  } else {
                    +
                    2713  print_codegen_routines_regular();
                    +
                    2714  }
                    +
                    2715 }
                    +
                    2716 
                    + +
                    2718  throw std::runtime_error("Not implemented.");
                    +
                    2719 }
                    +
                    2720 
                    +
                    2721 
                    + +
                    2723  auto const& arguments = node.get_arguments();
                    +
                    2724 
                    +
                    2725  if (printing_net_init) {
                    +
                    2726  throw std::runtime_error("Not implemented. [jfiwoei]");
                    +
                    2727  }
                    +
                    2728 
                    +
                    2729  std::string weight_pointer = "nullptr";
                    +
                    2730  auto point_process = get_variable_name(naming::POINT_PROCESS_VARIABLE,
                    +
                    2731  /* use_instance */ false);
                    +
                    2732  if (!printing_net_receive) {
                    +
                    2733  point_process += ".get<Point_process*>()";
                    +
                    2734  }
                    +
                    2735  const auto& tqitem = get_variable_name("tqitem", /* use_instance */ false);
                    +
                    2736 
                    +
                    2737  printer->fmt_text("{}(/* tqitem */ &{}, {}, {}, {} + ",
                    +
                    2738  info.artificial_cell ? "artcell_net_send" : "net_send",
                    +
                    2739  tqitem,
                    +
                    2740  weight_pointer,
                    +
                    2741  point_process,
                    +
                    2742  get_variable_name("t"));
                    +
                    2743  print_vector_elements(arguments, ", ");
                    +
                    2744  printer->add_text(')');
                    +
                    2745 }
                    +
                    2746 
                    + +
                    2748  const auto& point_process = get_variable_name("point_process", /* use_instance */ false);
                    +
                    2749  const auto& tqitem = get_variable_name("tqitem", /* use_instance */ false);
                    +
                    2750 
                    +
                    2751  printer->fmt_text("{}(/* tqitem */ &{}, {}, ",
                    +
                    2752  info.artificial_cell ? "artcell_net_move" : "net_move",
                    +
                    2753  tqitem,
                    +
                    2754  point_process);
                    +
                    2755 
                    +
                    2756  print_vector_elements(node.get_arguments(), ", ");
                    +
                    2757  printer->add_text(')');
                    +
                    2758 }
                    +
                    2759 
                    + +
                    2761  const auto& point_process = get_variable_name(naming::POINT_PROCESS_VARIABLE,
                    +
                    2762  /* use_instance */ false);
                    +
                    2763  printer->fmt_text("net_event({}, t)", point_process);
                    2764 }
                    2765 
                    - -
                    2767  const auto& point_process = get_variable_name(naming::POINT_PROCESS_VARIABLE,
                    -
                    2768  /* use_instance */ false);
                    -
                    2769  printer->fmt_text("net_event({}, t)", point_process);
                    -
                    2770 }
                    -
                    2771 
                    - -
                    2773  auto name = node.get_node_name();
                    -
                    2774  const auto& arguments = node.get_arguments();
                    -
                    2775  printer->add_text(method_name(name), "(");
                    -
                    2776  print_vector_elements(arguments, ", ");
                    -
                    2777  printer->add_text(')');
                    -
                    2778 }
                    -
                    2779 
                    -
                    2780 /**
                    -
                    2781  * Rename arguments to NET_RECEIVE block with corresponding pointer variable
                    + +
                    2767  auto name = node.get_node_name();
                    +
                    2768  const auto& arguments = node.get_arguments();
                    +
                    2769  printer->add_text(method_name(name), "(");
                    +
                    2770  print_vector_elements(arguments, ", ");
                    +
                    2771  printer->add_text(')');
                    +
                    2772 }
                    +
                    2773 
                    +
                    2774 /**
                    +
                    2775  * Rename arguments to NET_RECEIVE block with corresponding pointer variable
                    +
                    2776  *
                    +
                    2777  * \code{.mod}
                    +
                    2778  * NET_RECEIVE (weight, R){
                    +
                    2779  * x = R
                    +
                    2780  * }
                    +
                    2781  * \endcode
                    2782  *
                    -
                    2783  * \code{.mod}
                    -
                    2784  * NET_RECEIVE (weight, R){
                    -
                    2785  * x = R
                    -
                    2786  * }
                    +
                    2783  * then generated code should be:
                    +
                    2784  *
                    +
                    2785  * \code{.cpp}
                    +
                    2786  * x[id] = _args[1];
                    2787  * \endcode
                    2788  *
                    -
                    2789  * then generated code should be:
                    -
                    2790  *
                    -
                    2791  * \code{.cpp}
                    -
                    2792  * x[id] = _args[1];
                    -
                    2793  * \endcode
                    -
                    2794  *
                    -
                    2795  * So, the `R` in AST needs to be renamed with `_args[1]`.
                    -
                    2796  */
                    -
                    2797 static void rename_net_receive_arguments(const ast::NetReceiveBlock& net_receive_node,
                    -
                    2798  const ast::Node& node) {
                    -
                    2799  const auto& parameters = net_receive_node.get_parameters();
                    -
                    2800 
                    -
                    2801  auto n_parameters = parameters.size();
                    -
                    2802  for (size_t i = 0; i < n_parameters; ++i) {
                    -
                    2803  const auto& name = parameters[i]->get_node_name();
                    -
                    2804  auto var_used = VarUsageVisitor().variable_used(node, name);
                    -
                    2805  if (var_used) {
                    -
                    2806  RenameVisitor vr(name, fmt::format("_args[{}]", i));
                    -
                    2807  node.get_statement_block()->visit_children(vr);
                    -
                    2808  }
                    -
                    2809  }
                    -
                    2810 }
                    -
                    2811 
                    +
                    2789  * So, the `R` in AST needs to be renamed with `_args[1]`.
                    +
                    2790  */
                    +
                    2791 static void rename_net_receive_arguments(const ast::NetReceiveBlock& net_receive_node,
                    +
                    2792  const ast::Node& node) {
                    +
                    2793  const auto& parameters = net_receive_node.get_parameters();
                    +
                    2794 
                    +
                    2795  auto n_parameters = parameters.size();
                    +
                    2796  for (size_t i = 0; i < n_parameters; ++i) {
                    +
                    2797  const auto& name = parameters[i]->get_node_name();
                    +
                    2798  auto var_used = VarUsageVisitor().variable_used(node, name);
                    +
                    2799  if (var_used) {
                    +
                    2800  RenameVisitor vr(name, fmt::format("_args[{}]", i));
                    +
                    2801  node.get_statement_block()->visit_children(vr);
                    +
                    2802  }
                    +
                    2803  }
                    +
                    2804 }
                    +
                    2805 
                    +
                    2806 
                    + +
                    2808  return {{"", "Point_process*", "", "_pnt"},
                    +
                    2809  {"", "double*", "", "_args"},
                    +
                    2810  {"", "double", "", "flag"}};
                    +
                    2811 }
                    2812 
                    - -
                    2814  return {{"", "Point_process*", "", "_pnt"},
                    -
                    2815  {"", "double*", "", "_args"},
                    -
                    2816  {"", "double", "", "flag"}};
                    -
                    2817 }
                    +
                    2813 
                    + +
                    2815  printer->add_line("_nrn_mechanism_cache_instance _lmc{_pnt->prop};");
                    +
                    2816  printer->add_line("auto * nt = static_cast<NrnThread*>(_pnt->_vnt);");
                    +
                    2817  printer->add_line("auto * _ppvar = _nrn_mechanism_access_dparam(_pnt->prop);");
                    2818 
                    -
                    2819 
                    - -
                    2821  printer->add_line("_nrn_mechanism_cache_instance _lmc{_pnt->prop};");
                    -
                    2822  printer->add_line("auto * nt = static_cast<NrnThread*>(_pnt->_vnt);");
                    -
                    2823  printer->add_line("auto * _ppvar = _nrn_mechanism_access_dparam(_pnt->prop);");
                    -
                    2824 
                    -
                    2825  printer->fmt_line("auto inst = make_instance_{}(&_lmc);", info.mod_suffix);
                    -
                    2826  if (!info.artificial_cell) {
                    -
                    2827  printer->fmt_line("auto node_data = make_node_data_{}(_pnt->prop);", info.mod_suffix);
                    -
                    2828  }
                    -
                    2829  printer->fmt_line("// nocmodl has a nullptr dereference for thread variables.");
                    -
                    2830  printer->fmt_line("// NMODL will fail to compile at a later point, because of");
                    -
                    2831  printer->fmt_line("// missing '_thread_vars'.");
                    -
                    2832  printer->fmt_line("Datum * _thread = nullptr;");
                    -
                    2833 
                    -
                    2834  printer->add_line("size_t id = 0;");
                    -
                    2835  printer->add_line("double t = nt->_t;");
                    -
                    2836 }
                    -
                    2837 
                    - -
                    2839  return {{"", "const _nrn_model_sorted_token&", "", "_sorted_token"},
                    -
                    2840  {"", "NrnThread*", "", "nt"},
                    -
                    2841  {"", "Memb_list*", "", "_ml_arg"},
                    -
                    2842  {"", "int", "", "_type"}};
                    -
                    2843 }
                    -
                    2844 
                    - -
                    2846  ParamVector args = {{"", "_nrn_mechanism_cache_range&", "", "_lmc"},
                    -
                    2847  {"", fmt::format("{}_Instance&", info.mod_suffix), "", "inst"},
                    -
                    2848  {"", fmt::format("{}_NodeData&", info.mod_suffix), "", "node_data"},
                    -
                    2849  {"", "size_t", "", "id"},
                    -
                    2850  {"", "Datum*", "", "_ppvar"},
                    -
                    2851  {"", "Datum*", "", "_thread"},
                    -
                    2852  {"", "NrnThread*", "", "nt"}};
                    -
                    2853 
                    -
                    2854  if (info.thread_callback_register) {
                    -
                    2855  auto type_name = fmt::format("{}&", thread_variables_struct());
                    -
                    2856  args.emplace_back("", type_name, "", "_thread_vars");
                    -
                    2857  }
                    -
                    2858  return args;
                    -
                    2859 }
                    -
                    2860 
                    -
                    2861 
                    - -
                    2863  printer->fmt_push_block("static constexpr int {}(int _type)",
                    -
                    2864  method_name(naming::CVODE_COUNT_NAME));
                    -
                    2865  printer->fmt_line("return {};", info.cvode_block->get_n_odes()->get_value());
                    -
                    2866  printer->pop_block();
                    -
                    2867  printer->add_newline(2);
                    -
                    2868 }
                    -
                    2869 
                    - -
                    2871  const CodegenNeuronCppVisitor::ParamVector tolerances_parameters = {
                    -
                    2872  {"", "Prop*", "", "_prop"},
                    -
                    2873  {"", "int", "", "equation_index"},
                    -
                    2874  {"", "neuron::container::data_handle<double>*", "", "_pv"},
                    -
                    2875  {"", "neuron::container::data_handle<double>*", "", "_pvdot"},
                    -
                    2876  {"", "double*", "", "_atol"},
                    -
                    2877  {"", "int", "", "_type"}};
                    -
                    2878 
                    -
                    2879  auto get_param_name = [](const auto& item) { return std::get<3>(item); };
                    +
                    2819  printer->fmt_line("auto inst = make_instance_{}(&_lmc);", info.mod_suffix);
                    +
                    2820  if (!info.artificial_cell) {
                    +
                    2821  printer->fmt_line("auto node_data = make_node_data_{}(_pnt->prop);", info.mod_suffix);
                    +
                    2822  }
                    +
                    2823  printer->fmt_line("// nocmodl has a nullptr dereference for thread variables.");
                    +
                    2824  printer->fmt_line("// NMODL will fail to compile at a later point, because of");
                    +
                    2825  printer->fmt_line("// missing '_thread_vars'.");
                    +
                    2826  printer->fmt_line("Datum * _thread = nullptr;");
                    +
                    2827 
                    +
                    2828  printer->add_line("size_t id = 0;");
                    +
                    2829  printer->add_line("double t = nt->_t;");
                    +
                    2830 }
                    +
                    2831 
                    + +
                    2833  return {{"", "const _nrn_model_sorted_token&", "", "_sorted_token"},
                    +
                    2834  {"", "NrnThread*", "", "nt"},
                    +
                    2835  {"", "Memb_list*", "", "_ml_arg"},
                    +
                    2836  {"", "int", "", "_type"}};
                    +
                    2837 }
                    +
                    2838 
                    + +
                    2840  ParamVector args = {{"", "_nrn_mechanism_cache_range&", "", "_lmc"},
                    +
                    2841  {"", fmt::format("{}_Instance&", info.mod_suffix), "", "inst"},
                    +
                    2842  {"", fmt::format("{}_NodeData&", info.mod_suffix), "", "node_data"},
                    +
                    2843  {"", "size_t", "", "id"},
                    +
                    2844  {"", "Datum*", "", "_ppvar"},
                    +
                    2845  {"", "Datum*", "", "_thread"},
                    +
                    2846  {"", "NrnThread*", "", "nt"}};
                    +
                    2847 
                    +
                    2848  if (info.thread_callback_register) {
                    +
                    2849  auto type_name = fmt::format("{}&", thread_variables_struct());
                    +
                    2850  args.emplace_back("", type_name, "", "_thread_vars");
                    +
                    2851  }
                    +
                    2852  return args;
                    +
                    2853 }
                    +
                    2854 
                    +
                    2855 
                    + +
                    2857  printer->fmt_push_block("static constexpr int {}(int _type)",
                    +
                    2858  method_name(naming::CVODE_COUNT_NAME));
                    +
                    2859  printer->fmt_line("return {};", info.cvode_block->get_n_odes()->get_value());
                    +
                    2860  printer->pop_block();
                    +
                    2861  printer->add_newline(2);
                    +
                    2862 }
                    +
                    2863 
                    + +
                    2865  const CodegenNeuronCppVisitor::ParamVector tolerances_parameters = {
                    +
                    2866  {"", "Prop*", "", "_prop"},
                    +
                    2867  {"", "int", "", "equation_index"},
                    +
                    2868  {"", "neuron::container::data_handle<double>*", "", "_pv"},
                    +
                    2869  {"", "neuron::container::data_handle<double>*", "", "_pvdot"},
                    +
                    2870  {"", "double*", "", "_atol"},
                    +
                    2871  {"", "int", "", "_type"}};
                    +
                    2872 
                    +
                    2873  auto get_param_name = [](const auto& item) { return std::get<3>(item); };
                    +
                    2874 
                    +
                    2875  auto prop_name = get_param_name(tolerances_parameters[0]);
                    +
                    2876  auto eqindex_name = get_param_name(tolerances_parameters[1]);
                    +
                    2877  auto pv_name = get_param_name(tolerances_parameters[2]);
                    +
                    2878  auto pvdot_name = get_param_name(tolerances_parameters[3]);
                    +
                    2879  auto atol_name = get_param_name(tolerances_parameters[4]);
                    2880 
                    -
                    2881  auto prop_name = get_param_name(tolerances_parameters[0]);
                    -
                    2882  auto eqindex_name = get_param_name(tolerances_parameters[1]);
                    -
                    2883  auto pv_name = get_param_name(tolerances_parameters[2]);
                    -
                    2884  auto pvdot_name = get_param_name(tolerances_parameters[3]);
                    -
                    2885  auto atol_name = get_param_name(tolerances_parameters[4]);
                    -
                    2886 
                    -
                    2887  printer->fmt_push_block("static void {}({})",
                    - -
                    2889  get_parameter_str(tolerances_parameters));
                    -
                    2890  printer->fmt_line("auto* _ppvar = _nrn_mechanism_access_dparam({});", prop_name);
                    -
                    2891  printer->fmt_line("_ppvar[{}].literal_value<int>() = {};", int_variables_size(), eqindex_name);
                    -
                    2892  printer->fmt_push_block("for (int i = 0; i < {}(0); i++)",
                    -
                    2893  method_name(naming::CVODE_COUNT_NAME));
                    -
                    2894  printer->fmt_line("{}[i] = _nrn_mechanism_get_param_handle({}, _slist1[i]);",
                    -
                    2895  pv_name,
                    -
                    2896  prop_name);
                    -
                    2897  printer->fmt_line("{}[i] = _nrn_mechanism_get_param_handle({}, _dlist1[i]);",
                    -
                    2898  pvdot_name,
                    -
                    2899  prop_name);
                    -
                    2900  printer->fmt_line("_cvode_abstol(_atollist, {}, i);", atol_name);
                    -
                    2901  printer->pop_block();
                    -
                    2902  printer->pop_block();
                    -
                    2903  printer->add_newline(2);
                    -
                    2904 }
                    -
                    2905 
                    -
                    2906 void CodegenNeuronCppVisitor::print_cvode_update(const std::string& name,
                    -
                    2907  const ast::StatementBlock& block) {
                    -
                    2908  printer->fmt_push_block("static int {}({})",
                    -
                    2909  method_name(name),
                    -
                    2910  get_parameter_str(cvode_update_parameters()));
                    -
                    2911  printer->add_line(
                    -
                    2912  "auto v = node_data.node_voltages ? "
                    -
                    2913  "node_data.node_voltages[node_data.nodeindices[id]] : 0.0;");
                    -
                    2914 
                    -
                    2915  print_statement_block(block, false, false);
                    -
                    2916 
                    -
                    2917  printer->add_line("return 0;");
                    -
                    2918  printer->pop_block();
                    -
                    2919  printer->add_newline(2);
                    -
                    2920 }
                    -
                    2921 
                    -
                    2922 void CodegenNeuronCppVisitor::print_cvode_setup(const std::string& setup_name,
                    -
                    2923  const std::string& update_name) {
                    -
                    2924  printer->fmt_push_block("static void {}({})",
                    -
                    2925  method_name(setup_name),
                    -
                    2926  get_parameter_str(cvode_setup_parameters()));
                    -
                    2927  print_entrypoint_setup_code_from_memb_list();
                    -
                    2928  printer->fmt_line("auto nodecount = _ml_arg->nodecount;");
                    -
                    2929  printer->push_block("for (int id = 0; id < nodecount; id++)");
                    -
                    2930  printer->add_line("auto* _ppvar = _ml_arg->pdata[id];");
                    -
                    2931  printer->add_line(
                    -
                    2932  "auto v = node_data.node_voltages ? "
                    -
                    2933  "node_data.node_voltages[node_data.nodeindices[id]] : 0.0;");
                    -
                    2934  printer->fmt_line("{}({});", method_name(update_name), get_arg_str(cvode_update_parameters()));
                    +
                    2881  printer->fmt_push_block("static void {}({})",
                    + +
                    2883  get_parameter_str(tolerances_parameters));
                    +
                    2884  printer->fmt_line("auto* _ppvar = _nrn_mechanism_access_dparam({});", prop_name);
                    +
                    2885  printer->fmt_line("_ppvar[{}].literal_value<int>() = {};", int_variables_size(), eqindex_name);
                    +
                    2886  printer->fmt_push_block("for (int i = 0; i < {}(0); i++)",
                    +
                    2887  method_name(naming::CVODE_COUNT_NAME));
                    +
                    2888  printer->fmt_line("{}[i] = _nrn_mechanism_get_param_handle({}, _slist1[i]);",
                    +
                    2889  pv_name,
                    +
                    2890  prop_name);
                    +
                    2891  printer->fmt_line("{}[i] = _nrn_mechanism_get_param_handle({}, _dlist1[i]);",
                    +
                    2892  pvdot_name,
                    +
                    2893  prop_name);
                    +
                    2894  printer->fmt_line("_cvode_abstol(_atollist, {}, i);", atol_name);
                    +
                    2895  printer->pop_block();
                    +
                    2896  printer->pop_block();
                    +
                    2897  printer->add_newline(2);
                    +
                    2898 }
                    +
                    2899 
                    +
                    2900 void CodegenNeuronCppVisitor::print_cvode_update(const std::string& name,
                    +
                    2901  const ast::StatementBlock& block) {
                    +
                    2902  printer->fmt_push_block("static int {}({})",
                    +
                    2903  method_name(name),
                    +
                    2904  get_parameter_str(cvode_update_parameters()));
                    +
                    2905  printer->add_line(
                    +
                    2906  "auto v = node_data.node_voltages ? "
                    +
                    2907  "node_data.node_voltages[node_data.nodeindices[id]] : 0.0;");
                    +
                    2908 
                    +
                    2909  print_statement_block(block, false, false);
                    +
                    2910 
                    +
                    2911  printer->add_line("return 0;");
                    +
                    2912  printer->pop_block();
                    +
                    2913  printer->add_newline(2);
                    +
                    2914 }
                    +
                    2915 
                    +
                    2916 void CodegenNeuronCppVisitor::print_cvode_setup(const std::string& setup_name,
                    +
                    2917  const std::string& update_name) {
                    +
                    2918  printer->fmt_push_block("static void {}({})",
                    +
                    2919  method_name(setup_name),
                    +
                    2920  get_parameter_str(cvode_setup_parameters()));
                    +
                    2921  print_entrypoint_setup_code_from_memb_list();
                    +
                    2922  printer->fmt_line("auto nodecount = _ml_arg->nodecount;");
                    +
                    2923  printer->push_block("for (int id = 0; id < nodecount; id++)");
                    +
                    2924  printer->add_line("auto* _ppvar = _ml_arg->pdata[id];");
                    +
                    2925  printer->add_line(
                    +
                    2926  "auto v = node_data.node_voltages ? "
                    +
                    2927  "node_data.node_voltages[node_data.nodeindices[id]] : 0.0;");
                    +
                    2928  printer->fmt_line("{}({});", method_name(update_name), get_arg_str(cvode_update_parameters()));
                    +
                    2929 
                    +
                    2930  printer->pop_block();
                    +
                    2931  printer->pop_block();
                    +
                    2932 
                    +
                    2933  printer->add_newline(2);
                    +
                    2934 }
                    2935 
                    -
                    2936  printer->pop_block();
                    -
                    2937  printer->pop_block();
                    -
                    2938 
                    -
                    2939  printer->add_newline(2);
                    -
                    2940 }
                    -
                    2941 
                    - -
                    2943  if (!info.emit_cvode) {
                    -
                    2944  return;
                    -
                    2945  }
                    -
                    2946 
                    -
                    2947  printer->add_newline(2);
                    -
                    2948  printer->add_line("/* Functions related to CVODE codegen */");
                    -
                    2949  print_cvode_count();
                    -
                    2950  print_cvode_tolerances();
                    -
                    2951  print_cvode_update(naming::CVODE_UPDATE_NON_STIFF_NAME,
                    -
                    2952  *info.cvode_block->get_non_stiff_block());
                    -
                    2953  print_cvode_update(naming::CVODE_UPDATE_STIFF_NAME, *info.cvode_block->get_stiff_block());
                    - - -
                    2956 }
                    -
                    2957 
                    - -
                    2959  printing_net_receive = true;
                    -
                    2960  auto node = info.net_receive_node;
                    -
                    2961  if (!node) {
                    -
                    2962  return;
                    -
                    2963  }
                    -
                    2964 
                    -
                    2965  printer->fmt_push_block("static void nrn_net_receive_{}({})",
                    -
                    2966  info.mod_suffix,
                    -
                    2967  get_parameter_str(net_receive_args()));
                    + +
                    2937  if (!info.emit_cvode) {
                    +
                    2938  return;
                    +
                    2939  }
                    +
                    2940 
                    +
                    2941  printer->add_newline(2);
                    +
                    2942  printer->add_line("/* Functions related to CVODE codegen */");
                    +
                    2943  print_cvode_count();
                    +
                    2944  print_cvode_tolerances();
                    +
                    2945  print_cvode_update(naming::CVODE_UPDATE_NON_STIFF_NAME,
                    +
                    2946  *info.cvode_block->get_non_stiff_block());
                    +
                    2947  print_cvode_update(naming::CVODE_UPDATE_STIFF_NAME, *info.cvode_block->get_stiff_block());
                    + + +
                    2950 }
                    +
                    2951 
                    + +
                    2953  printing_net_receive = true;
                    +
                    2954  auto node = info.net_receive_node;
                    +
                    2955  if (!node) {
                    +
                    2956  return;
                    +
                    2957  }
                    +
                    2958 
                    +
                    2959  printer->fmt_push_block("static void nrn_net_receive_{}({})",
                    +
                    2960  info.mod_suffix,
                    +
                    2961  get_parameter_str(net_receive_args()));
                    +
                    2962 
                    +
                    2963  rename_net_receive_arguments(*node, *node);
                    +
                    2964  print_net_receive_common_code();
                    +
                    2965 
                    +
                    2966 
                    +
                    2967  print_statement_block(*node->get_statement_block(), false, false);
                    2968 
                    -
                    2969  rename_net_receive_arguments(*node, *node);
                    -
                    2970  print_net_receive_common_code();
                    -
                    2971 
                    -
                    2972 
                    -
                    2973  print_statement_block(*node->get_statement_block(), false, false);
                    -
                    2974 
                    -
                    2975  printer->add_newline();
                    -
                    2976  printer->pop_block();
                    -
                    2977  printing_net_receive = false;
                    -
                    2978 }
                    +
                    2969  printer->add_newline();
                    +
                    2970  printer->pop_block();
                    +
                    2971  printing_net_receive = false;
                    +
                    2972 }
                    +
                    2973 
                    + +
                    2975  const auto node = info.net_receive_initial_node;
                    +
                    2976  if (node == nullptr) {
                    +
                    2977  return;
                    +
                    2978  }
                    2979 
                    - -
                    2981  const auto node = info.net_receive_initial_node;
                    -
                    2982  if (node == nullptr) {
                    -
                    2983  return;
                    -
                    2984  }
                    -
                    2985 
                    -
                    2986  // rename net_receive arguments used in the initial block of net_receive
                    -
                    2987  rename_net_receive_arguments(*info.net_receive_node, *node);
                    -
                    2988 
                    -
                    2989  printing_net_init = true;
                    -
                    2990  printer->add_newline(2);
                    -
                    2991  printer->fmt_push_block("static void net_init({})", get_parameter_str(net_receive_args()));
                    -
                    2992 
                    -
                    2993  auto block = node->get_statement_block().get();
                    -
                    2994  if (!block->get_statements().empty()) {
                    -
                    2995  print_net_receive_common_code();
                    -
                    2996  print_statement_block(*block, false, false);
                    -
                    2997  }
                    -
                    2998  printer->pop_block();
                    -
                    2999  printing_net_init = false;
                    -
                    3000 }
                    -
                    3001 
                    -
                    3002 
                    -
                    3003 /****************************************************************************************/
                    -
                    3004 /* Overloaded visitor routines */
                    -
                    3005 /****************************************************************************************/
                    -
                    3006 
                    -
                    3007 /// TODO: Edit for NEURON
                    - -
                    3009  return;
                    -
                    3010 }
                    -
                    3011 
                    - -
                    3013  const ast::LongitudinalDiffusionBlock& /* node */) {
                    -
                    3014  // These are handled via `print_longitdudinal_*`.
                    -
                    3015 }
                    -
                    3016 
                    - -
                    3018  // These are handled via `print_longitdudinal_*`.
                    -
                    3019 }
                    -
                    3020 
                    - -
                    3022  // The setup for enabling this loop is:
                    -
                    3023  // double ** _fornetcon_data = ...;
                    -
                    3024  // for(size_t i = 0; i < n_netcons; ++i) {
                    -
                    3025  // double * _netcon_data = _fornetcon_data[i];
                    -
                    3026  //
                    -
                    3027  // // loop body.
                    -
                    3028  // }
                    -
                    3029  //
                    -
                    3030  // Where `_fornetcon_data` is an array of pointers to the arguments, one
                    -
                    3031  // for each netcon; and `_netcon_data` points to the arguments for the
                    -
                    3032  // current netcon.
                    -
                    3033  //
                    -
                    3034  // Similar to the CoreNEURON solution, we replace all arguments with the
                    -
                    3035  // C++ string that implements them, i.e. `_netcon_data[{}]`. The arguments
                    -
                    3036  // are positional and thus simply numbered through.
                    -
                    3037  const auto& args = node.get_parameters();
                    -
                    3038  RenameVisitor v;
                    -
                    3039  const auto& statement_block = node.get_statement_block();
                    -
                    3040  for (size_t i_arg = 0; i_arg < args.size(); ++i_arg) {
                    -
                    3041  auto old_name = args[i_arg]->get_node_name();
                    -
                    3042  auto new_name = fmt::format("_netcon_data[{}]", i_arg);
                    -
                    3043  v.set(old_name, new_name);
                    -
                    3044  statement_block->accept(v);
                    -
                    3045  }
                    -
                    3046 
                    -
                    3047  auto dparam_it =
                    -
                    3048  std::find_if(info.semantics.begin(), info.semantics.end(), [](const IndexSemantics& a) {
                    -
                    3049  return a.name == naming::FOR_NETCON_SEMANTIC;
                    -
                    3050  });
                    -
                    3051  if (dparam_it == info.semantics.end()) {
                    -
                    3052  throw std::runtime_error("Couldn't find `fornetcon` variable.");
                    -
                    3053  }
                    -
                    3054 
                    -
                    3055  int dparam_index = dparam_it->index;
                    -
                    3056  auto netcon_var = get_name(codegen_int_variables[dparam_index]);
                    -
                    3057 
                    -
                    3058  // This is called from `print_statement_block` which pre-indents the
                    -
                    3059  // current line. Hence `add_text` only.
                    -
                    3060  printer->add_text("double ** _fornetcon_data;");
                    -
                    3061  printer->add_newline();
                    -
                    3062 
                    -
                    3063  printer->fmt_line("int _n_netcons = _nrn_netcon_args({}, &_fornetcon_data);",
                    -
                    3064  get_variable_name(netcon_var, false));
                    +
                    2980  // rename net_receive arguments used in the initial block of net_receive
                    +
                    2981  rename_net_receive_arguments(*info.net_receive_node, *node);
                    +
                    2982 
                    +
                    2983  printing_net_init = true;
                    +
                    2984  printer->add_newline(2);
                    +
                    2985  printer->fmt_push_block("static void net_init({})", get_parameter_str(net_receive_args()));
                    +
                    2986 
                    +
                    2987  auto block = node->get_statement_block().get();
                    +
                    2988  if (!block->get_statements().empty()) {
                    +
                    2989  print_net_receive_common_code();
                    +
                    2990  print_statement_block(*block, false, false);
                    +
                    2991  }
                    +
                    2992  printer->pop_block();
                    +
                    2993  printing_net_init = false;
                    +
                    2994 }
                    +
                    2995 
                    +
                    2996 
                    +
                    2997 /****************************************************************************************/
                    +
                    2998 /* Overloaded visitor routines */
                    +
                    2999 /****************************************************************************************/
                    +
                    3000 
                    +
                    3001 /// TODO: Edit for NEURON
                    + +
                    3003  return;
                    +
                    3004 }
                    +
                    3005 
                    + +
                    3007  const ast::LongitudinalDiffusionBlock& /* node */) {
                    +
                    3008  // These are handled via `print_longitdudinal_*`.
                    +
                    3009 }
                    +
                    3010 
                    + +
                    3012  // These are handled via `print_longitdudinal_*`.
                    +
                    3013 }
                    +
                    3014 
                    + +
                    3016  // The setup for enabling this loop is:
                    +
                    3017  // double ** _fornetcon_data = ...;
                    +
                    3018  // for(size_t i = 0; i < n_netcons; ++i) {
                    +
                    3019  // double * _netcon_data = _fornetcon_data[i];
                    +
                    3020  //
                    +
                    3021  // // loop body.
                    +
                    3022  // }
                    +
                    3023  //
                    +
                    3024  // Where `_fornetcon_data` is an array of pointers to the arguments, one
                    +
                    3025  // for each netcon; and `_netcon_data` points to the arguments for the
                    +
                    3026  // current netcon.
                    +
                    3027  //
                    +
                    3028  // Similar to the CoreNEURON solution, we replace all arguments with the
                    +
                    3029  // C++ string that implements them, i.e. `_netcon_data[{}]`. The arguments
                    +
                    3030  // are positional and thus simply numbered through.
                    +
                    3031  const auto& args = node.get_parameters();
                    +
                    3032  RenameVisitor v;
                    +
                    3033  const auto& statement_block = node.get_statement_block();
                    +
                    3034  for (size_t i_arg = 0; i_arg < args.size(); ++i_arg) {
                    +
                    3035  auto old_name = args[i_arg]->get_node_name();
                    +
                    3036  auto new_name = fmt::format("_netcon_data[{}]", i_arg);
                    +
                    3037  v.set(old_name, new_name);
                    +
                    3038  statement_block->accept(v);
                    +
                    3039  }
                    +
                    3040 
                    +
                    3041  auto dparam_it =
                    +
                    3042  std::find_if(info.semantics.begin(), info.semantics.end(), [](const IndexSemantics& a) {
                    +
                    3043  return a.name == naming::FOR_NETCON_SEMANTIC;
                    +
                    3044  });
                    +
                    3045  if (dparam_it == info.semantics.end()) {
                    +
                    3046  throw std::runtime_error("Couldn't find `fornetcon` variable.");
                    +
                    3047  }
                    +
                    3048 
                    +
                    3049  int dparam_index = dparam_it->index;
                    +
                    3050  auto netcon_var = get_name(codegen_int_variables[dparam_index]);
                    +
                    3051 
                    +
                    3052  // This is called from `print_statement_block` which pre-indents the
                    +
                    3053  // current line. Hence `add_text` only.
                    +
                    3054  printer->add_text("double ** _fornetcon_data;");
                    +
                    3055  printer->add_newline();
                    +
                    3056 
                    +
                    3057  printer->fmt_line("int _n_netcons = _nrn_netcon_args({}, &_fornetcon_data);",
                    +
                    3058  get_variable_name(netcon_var, false));
                    +
                    3059 
                    +
                    3060  printer->push_block("for (size_t _i = 0; _i < _n_netcons; ++_i)");
                    +
                    3061  printer->add_line("double * _netcon_data = _fornetcon_data[_i];");
                    +
                    3062  print_statement_block(*statement_block, false, false);
                    +
                    3063  printer->pop_block();
                    +
                    3064 }
                    3065 
                    -
                    3066  printer->push_block("for (size_t _i = 0; _i < _n_netcons; ++_i)");
                    -
                    3067  printer->add_line("double * _netcon_data = _fornetcon_data[_i];");
                    -
                    3068  print_statement_block(*statement_block, false, false);
                    -
                    3069  printer->pop_block();
                    -
                    3070 }
                    -
                    3071 
                    -
                    3072 
                    -
                    3073 } // namespace codegen
                    -
                    3074 } // namespace nmodl
                    +
                    3066 
                    +
                    3067 } // namespace codegen
                    +
                    3068 } // namespace nmodl
                    std::string get_node_name() const override
                    Return name of the node.
                    Definition: ast.cpp:7065
                    -
                    void print_verbatim_cleanup(const std::vector< std::string > &macros_defined)
                    Print #undefs to erase all compatibility macros.
                    +
                    void print_verbatim_cleanup(const std::vector< std::string > &macros_defined)
                    Print #undefs to erase all compatibility macros.
                    static constexpr char RANDOM_SEMANTIC[]
                    semantic type for RANDOM variable
                    static bool starts_with(const std::string &haystack, const std::string &needle)
                    Check if haystack starts with needle.
                    static constexpr char THREAD_ARGS_COMMA[]
                    verbatim name of the variable for nrn thread arguments, sometimes with trailing comma
                    -
                    void print_nrn_destructor() override
                    Print nrn_destructor function definition.
                    -
                    void print_global_var_external_access()
                    Print functions for EXTERNAL use.
                    +
                    void print_nrn_destructor() override
                    Print nrn_destructor function definition.
                    +
                    void print_global_var_external_access()
                    Print functions for EXTERNAL use.
                    Base class for all AST node.
                    Definition: node.hpp:40
                    bool is_index
                    if this is pure index (e.g.
                    Represents a C code block.
                    Definition: verbatim.hpp:38
                    -
                    void print_nrn_cur_non_conductance_kernel() override
                    Print the nrn_cur kernel without NMODL conductance keyword provisions.
                    -
                    std::string py_function_signature(const std::string &function_or_procedure_name) const
                    Get the signature of the npy <func_or_proc_name> function.
                    +
                    void print_nrn_cur_non_conductance_kernel() override
                    Print the nrn_cur kernel without NMODL conductance keyword provisions.
                    +
                    std::string py_function_signature(const std::string &function_or_procedure_name) const
                    Get the signature of the npy <func_or_proc_name> function.
                    static constexpr char CVODE_SETUP_TOLERANCES_NAME[]
                    name of CVODE method for setting up tolerances
                    Helper to represent information about index/int variables.
                    -
                    void print_nrn_cur() override
                    Print nrn_cur / current update function definition.
                    -
                    void print_macro_definitions()
                    Print all NEURON macros.
                    +
                    void print_nrn_cur() override
                    Print nrn_cur / current update function definition.
                    +
                    void print_macro_definitions()
                    Print all NEURON macros.
                    bool global_scope() const noexcept
                    -
                    void print_function_definitions()
                    Print function and procedures prototype definitions.
                    +
                    void print_function_definitions()
                    Print function and procedures prototype definitions.
                    SymbolTable * get_parent_table() const noexcept
                    -
                    void print_net_event_call(const ast::FunctionCall &node) override
                    Print call to net_event.
                    +
                    void print_net_event_call(const ast::FunctionCall &node) override
                    Print call to net_event.
                    static constexpr char POINT_PROCESS_VARIABLE[]
                    inbuilt neuron variable for point process
                    const ArgumentVector & get_parameters() const noexcept override
                    Getter for member variable FunctionTableBlock::parameters.
                    -
                    std::string hoc_py_wrapper_signature(const ast::Block *function_or_procedure_block, InterpreterWrapper wrapper_type)
                    Return the wrapper signature.
                    - -
                    void print_neuron_includes()
                    Print includes from NEURON.
                    -
                    void print_codegen_routines_regular()
                    Anything not SUFFIX nothing.
                    +
                    std::string hoc_py_wrapper_signature(const ast::Block *function_or_procedure_block, InterpreterWrapper wrapper_type)
                    Return the wrapper signature.
                    + +
                    void print_neuron_includes()
                    Print includes from NEURON.
                    +
                    void print_codegen_routines_regular()
                    Anything not SUFFIX nothing.
                    static constexpr char NRN_JACOB_METHOD[]
                    nrn_jacob method in generated code
                    -
                    void print_nrn_init(bool skip_init_check=true)
                    Print the nrn_init function definition.
                    +
                    void print_nrn_init(bool skip_init_check=true)
                    Print the nrn_init function definition.
                    -
                    std::string internal_method_arguments() override
                    Arguments for functions that are defined and used internally.
                    +
                    std::string internal_method_arguments() override
                    Arguments for functions that are defined and used internally.
                    std::string join_arguments(const std::string &lhs, const std::string &rhs)
                    Joint two (list of) arguments.
                    std::shared_ptr< symtab::Symbol > SymbolType
                    -
                    void print_nrn_alloc() override
                    Print nrn_alloc function definition.
                    +
                    void print_nrn_alloc() override
                    Print nrn_alloc function definition.
                    static constexpr char VOLTAGE_UNUSED_VARIABLE[]
                    range variable for voltage when unused (for vectorized model)
                    -
                    std::string register_mechanism_arguments() const override
                    Arguments for register_mech or point_register_mech function.
                    +
                    std::string register_mechanism_arguments() const override
                    Arguments for register_mech or point_register_mech function.
                    std::string get_name(ast::Ast const *sym)
                    int position_of_int_var(const std::string &name) const override
                    Determine the position in the data array for a given int variable.
                    const ArgumentVector & get_parameters() const noexcept override
                    Getter for member variable NetReceiveBlock::parameters.
                    -
                    void visit_lon_diffuse(const ast::LonDiffuse &node) override
                    visit node of type ast::LonDiffuse
                    - +
                    void visit_lon_diffuse(const ast::LonDiffuse &node) override
                    visit node of type ast::LonDiffuse
                    +
                    std::string table_thread_function_name() const
                    Name of the threaded table checking function.
                    -
                    bool optimize_ion_variable_copies() const override
                    Check if ion variable copies should be avoided.
                    +
                    bool optimize_ion_variable_copies() const override
                    Check if ion variable copies should be avoided.
                    static constexpr char CVODE_COUNT_NAME[]
                    name of CVODE method for counting # of ODEs
                    static constexpr char CVODE_SETUP_NON_STIFF_NAME[]
                    name of CVODE method for setting up non-stiff systems
                    -
                    void print_cvode_tolerances()
                    Print the CVODE function for setup of tolerances.
                    -
                    std::string hoc_function_name(const std::string &function_or_procedure_name) const
                    All functions and procedures need a hoc <func_or_proc_name> to be available to the HOC interpreter.
                    +
                    void print_cvode_tolerances()
                    Print the CVODE function for setup of tolerances.
                    +
                    std::string hoc_function_name(const std::string &function_or_procedure_name) const
                    All functions and procedures need a hoc <func_or_proc_name> to be available to the HOC interpreter.
                    encapsulates code generation backend implementations
                    Definition: ast_common.hpp:26
                    std::shared_ptr< StatementBlock > get_statement_block() const noexcept override
                    Getter for member variable InitialBlock::statement_block.
                    -
                    std::string global_variable_name(const SymbolType &symbol, bool use_instance=true) const override
                    Determine the variable name for a global variable given its symbol.
                    +
                    std::string global_variable_name(const SymbolType &symbol, bool use_instance=true) const override
                    Determine the variable name for a global variable given its symbol.
                    Represent ions used in mod file.
                    -
                    std::string nrn_thread_internal_arguments() override
                    Arguments for "_threadargs_" macro in neuron implementation.
                    +
                    std::string nrn_thread_internal_arguments() override
                    Arguments for "_threadargs_" macro in neuron implementation.
                    static constexpr char NRN_CONSTRUCTOR_METHOD[]
                    nrn_constructor method in generated code
                    Visitor for printing C++ code compatible with legacy api of NEURON
                    std::string backend_name() const override
                    Name of the code generation backend.
                    - -
                    void print_entrypoint_setup_code_from_prop()
                    Prints setup code for entrypoints NEURON.
                    -
                    void print_global_param_default_values()
                    Print global struct with default value of RANGE PARAMETERs.
                    -
                    ParamVector ldifusfunc1_parameters() const
                    Parameters for what NEURON calls ldifusfunc1_t.
                    + +
                    void print_entrypoint_setup_code_from_prop()
                    Prints setup code for entrypoints NEURON.
                    +
                    void print_global_param_default_values()
                    Print global struct with default value of RANGE PARAMETERs.
                    +
                    ParamVector ldifusfunc1_parameters() const
                    Parameters for what NEURON calls ldifusfunc1_t.
                    std::string name
                    name of the ion
                    static constexpr char NTHREAD_DT_VARIABLE[]
                    dt variable in neuron thread structure
                    -
                    void print_g_unused() const override
                    Set g_unused (conductance) for NRN_PRCELLSTATE feature.
                    -
                    void visit_watch_statement(const ast::WatchStatement &node) override
                    TODO: Edit for NEURON.
                    -
                    void print_net_send_call(const ast::FunctionCall &node) override
                    Print call to net_send.
                    +
                    void print_g_unused() const override
                    Set g_unused (conductance) for NRN_PRCELLSTATE feature.
                    +
                    void visit_watch_statement(const ast::WatchStatement &node) override
                    TODO: Edit for NEURON.
                    +
                    void print_net_send_call(const ast::FunctionCall &node) override
                    Print call to net_send.
                    Check if variable is used in given block.
                    Implement string manipulation functions.
                    -
                    void print_net_move_call(const ast::FunctionCall &node) override
                    Print call to net_move.
                    -
                    std::string thread_variable_name(const ThreadVariableInfo &var_info, bool use_instance=true) const
                    Determine the C++ string to print for thread variables.
                    +
                    void print_net_move_call(const ast::FunctionCall &node) override
                    Print call to net_move.
                    +
                    std::string thread_variable_name(const ThreadVariableInfo &var_info, bool use_instance=true) const
                    Determine the C++ string to print for thread variables.
                    static constexpr char NODE_AREA_VARIABLE[]
                    inbuilt neuron variable for area of the compartment
                    -
                    void print_cvode_setup(const std::string &setup_name, const std::string &update_name)
                    Print the CVODE setup function setup_name that calls the CVODE update function update_name.
                    -
                    void print_nrn_state() override
                    Print nrn_state / state update function definition.
                    +
                    void print_cvode_setup(const std::string &setup_name, const std::string &update_name)
                    Print the CVODE setup function setup_name that calls the CVODE update function update_name.
                    +
                    void print_nrn_state() override
                    Print nrn_state / state update function definition.
                    virtual bool is_function_block() const noexcept
                    Check if the ast node is an instance of ast::FunctionBlock.
                    Definition: ast.cpp:142
                    static constexpr char NRN_ALLOC_METHOD[]
                    nrn_alloc method in generated code
                    -
                    void print_initial_block(const ast::InitialBlock *node)
                    Print the initial block.
                    +
                    void print_initial_block(const ast::InitialBlock *node)
                    Print the initial block.
                    bool is_integer
                    if this is an integer (e.g.
                    std::shared_ptr< String > get_statement() const noexcept
                    Getter for member variable Verbatim::statement.
                    Definition: verbatim.hpp:157
                    Class that binds all pieces together for parsing C verbatim blocks.
                    Definition: c11_driver.hpp:37
                    -
                    void print_global_function_common_code(BlockType type, const std::string &function_name="") override
                    Print common code for global functions like nrn_init, nrn_cur and nrn_state.
                    -
                    std::string float_variable_name(const SymbolType &symbol, bool use_instance) const override
                    Determine the name of a float variable given its symbol.
                    +
                    void print_global_function_common_code(BlockType type, const std::string &function_name="") override
                    Print common code for global functions like nrn_init, nrn_cur and nrn_state.
                    +
                    std::string float_variable_name(const SymbolType &symbol, bool use_instance) const override
                    Determine the name of a float variable given its symbol.
                    std::string extra_conc_pointer_name() const
                    Auto generated AST classes declaration.
                    std::shared_ptr< StatementBlock > get_statement_block() const noexcept override
                    Getter for member variable BreakpointBlock::statement_block.
                    - +
                    std::string rev_potential_pointer_name() const
                    -
                    void print_cvode_definitions()
                    Print all callbacks for CVODE.
                    -
                    void print_v_unused() const override
                    Set v_unused (voltage) for NRN_PRCELLSTATE feature.
                    - +
                    void print_cvode_definitions()
                    Print all callbacks for CVODE.
                    +
                    void print_v_unused() const override
                    Set v_unused (voltage) for NRN_PRCELLSTATE feature.
                    +
                    static constexpr char CONDUCTANCE_VARIABLE[]
                    range variable for conductance
                    -
                    ParamVector functor_params() override
                    The parameters of the Newton solver "functor".
                    -
                    void print_mechanism_register_regular()
                    Function body for anything not SUFFIX nothing.
                    -
                    void print_mechanism_register_nothing()
                    Function body for SUFFIX nothing.
                    +
                    ParamVector functor_params() override
                    The parameters of the Newton solver "functor".
                    +
                    void print_mechanism_register_regular()
                    Function body for anything not SUFFIX nothing.
                    +
                    void print_mechanism_register_nothing()
                    Function body for SUFFIX nothing.
                    Visitor for printing C++ code compatible with legacy api of CoreNEURON
                    std::vector< std::shared_ptr< Symbol > > get_variables(syminfo::NmodlType with=syminfo::NmodlType::empty, syminfo::NmodlType without=syminfo::NmodlType::empty) const
                    get variables
                    @@ -3270,144 +3264,143 @@
                    Base class for all block scoped nodes.
                    Definition: block.hpp:41
                    static constexpr char CVODE_UPDATE_STIFF_NAME[]
                    name of CVODE method for updating stiff systems
                    Represents a INITIAL block in the NMODL.
                    -
                    void print_point_process_function_definitions()
                    Print POINT_PROCESS related functions Wrap external NEURON functions related to POINT_PROCESS mechani...
                    - +
                    void print_point_process_function_definitions()
                    Print POINT_PROCESS related functions Wrap external NEURON functions related to POINT_PROCESS mechani...
                    +
                    Utility functions for visitors implementation.
                    -
                    void print_net_init()
                    Print NET_RECEIVE{ INITIAL{ ...
                    +
                    void print_net_init()
                    Print NET_RECEIVE{ INITIAL{ ...
                    @ Equation
                    breakpoint block
                    static constexpr char USE_TABLE_VARIABLE[]
                    global variable to indicate if table is used
                    Represent WATCH statement in NMODL.
                    -
                    void print_neuron_global_variable_declarations()
                    Print extern declarations for neuron global variables.
                    +
                    void print_neuron_global_variable_declarations()
                    Print extern declarations for neuron global variables.
                    Represents a BREAKPOINT block in NMODL.
                    -
                    void print_nrn_cur_conductance_kernel(const ast::BreakpointBlock &node) override
                    Print the nrn_cur kernel with NMODL conductance keyword provisions.
                    -
                    std::string int_variable_name(const IndexVariableInfo &symbol, const std::string &name, bool use_instance) const override
                    Determine the name of an int variable given its symbol.
                    +
                    void print_nrn_cur_conductance_kernel(const ast::BreakpointBlock &node) override
                    Print the nrn_cur kernel with NMODL conductance keyword provisions.
                    +
                    std::string int_variable_name(const IndexVariableInfo &symbol, const std::string &name, bool use_instance) const override
                    Determine the name of an int variable given its symbol.
                    nmodl::parser::UnitDriver driver
                    Definition: parser.cpp:28
                    InterpreterWrapper
                    Enum to switch between HOC and Python wrappers for functions and procedures defined in mechanisms.
                    virtual symtab::SymbolTable * get_symbol_table() const
                    Return associated symbol table for the AST node.
                    Definition: ast.cpp:38
                    -
                    void print_global_variables_for_hoc() override
                    Print byte arrays that register scalar and vector variables for hoc interface.
                    +
                    void print_global_variables_for_hoc() override
                    Print byte arrays that register scalar and vector variables for hoc interface.
                    static constexpr char INTERNAL_THREAD_ARGS[]
                    variation of _threadargs_ for "internal" functions.
                    -
                    ParamVector cvode_setup_parameters()
                    Get the parameters for functions that setup (initialize) CVODE.
                    -
                    ParamVector internalthreadargs_parameters()
                    The parameters for the four macros _internalthreadargs*_.
                    -
                    std::string get_pointer_name(const std::string &name) const
                    Determine the C++ string to replace pointer names with.
                    -
                    void print_standard_includes() override
                    Print standard C/C++ includes.
                    +
                    ParamVector cvode_setup_parameters()
                    Get the parameters for functions that setup (initialize) CVODE.
                    +
                    ParamVector internalthreadargs_parameters()
                    The parameters for the four macros _internalthreadargs*_.
                    +
                    std::string get_pointer_name(const std::string &name) const
                    Determine the C++ string to replace pointer names with.
                    +
                    void print_standard_includes() override
                    Print standard C/C++ includes.
                    Extracts information required for LONGITUDINAL_DIFFUSION for each KINETIC block.
                    -
                    void print_mechanism_range_var_structure(bool print_initializers) override
                    Print the structure that wraps all range and int variables required for the NMODL.
                    -
                    void add_variable_tqitem(std::vector< IndexVariableInfo > &variables) override
                    Add the variable tqitem during get_int_variables.
                    -
                    std::string hoc_function_signature(const std::string &function_or_procedure_name) const
                    Get the signature of the hoc <func_or_proc_name> function.
                    -
                    std::pair< ParamVector, ParamVector > function_table_parameters(const ast::FunctionTableBlock &) override
                    Parameters of the function itself "{}" and "table_{}".
                    +
                    void print_mechanism_range_var_structure(bool print_initializers) override
                    Print the structure that wraps all range and int variables required for the NMODL.
                    +
                    void add_variable_tqitem(std::vector< IndexVariableInfo > &variables) override
                    Add the variable tqitem during get_int_variables.
                    +
                    std::string hoc_function_signature(const std::string &function_or_procedure_name) const
                    Get the signature of the hoc <func_or_proc_name> function.
                    +
                    std::pair< ParamVector, ParamVector > function_table_parameters(const ast::FunctionTableBlock &) override
                    Parameters of the function itself "{}" and "table_{}".
                    std::shared_ptr< StatementBlock > get_statement_block() const noexcept override
                    Getter for member variable ForNetcon::statement_block.
                    Definition: for_netcon.hpp:185
                    -
                    std::unordered_map< std::string, std::string > get_nonglobal_local_variable_names(const symtab::SymbolTable &symtab)
                    Map of the non-(global/top-local) LOCAL variables.
                    -
                    void print_thread_variables_structure(bool print_initializers)
                    Print the data structure used to access thread variables.
                    +
                    std::unordered_map< std::string, std::string > get_nonglobal_local_variable_names(const symtab::SymbolTable &symtab)
                    Map of the non-(global/top-local) LOCAL variables.
                    +
                    void print_thread_variables_structure(bool print_initializers)
                    Print the data structure used to access thread variables.
                    Represent semantic information for index variable.
                    std::string to_string(const T &obj)
                    -
                    void visit_longitudinal_diffusion_block(const ast::LongitudinalDiffusionBlock &node) override
                    visit node of type ast::LongitudinalDiffusionBlock
                    -
                    void print_function_table_call(const ast::FunctionCall &node) override
                    Print special code when calling FUNCTION_TABLEs.
                    -
                    void print_compute_functions() override
                    Print all compute functions for every backend.
                    +
                    void visit_longitudinal_diffusion_block(const ast::LongitudinalDiffusionBlock &node) override
                    visit node of type ast::LongitudinalDiffusionBlock
                    +
                    void print_function_table_call(const ast::FunctionCall &node) override
                    Print special code when calling FUNCTION_TABLEs.
                    +
                    void print_compute_functions() override
                    Print all compute functions for every backend.
                    static constexpr char NRN_INIT_METHOD[]
                    nrn_init method in generated code
                    const ExpressionVector & get_arguments() const noexcept
                    Getter for member variable FunctionCall::arguments.
                    static constexpr char THREAD_ARGS[]
                    verbatim name of the variable for nrn thread arguments
                    static constexpr char POINTER_SEMANTIC[]
                    semantic type for pointer variable
                    -
                    void print_thread_memory_callbacks()
                    Print thread variable (de-)initialization functions.
                    +
                    void print_thread_memory_callbacks()
                    Print thread variable (de-)initialization functions.
                    static constexpr char CVODE_VARIABLE_NAME[]
                    name of the CVODE variable (can be arbitrary)
                    static void rename_net_receive_arguments(const ast::NetReceiveBlock &net_receive_node, const ast::Node &node)
                    Rename arguments to NET_RECEIVE block with corresponding pointer variable.
                    -
                    void print_entrypoint_setup_code_from_memb_list()
                    Prints setup code for entrypoints from NEURON.
                    -
                    void visit_verbatim(const ast::Verbatim &node) override
                    visit node of type ast::Verbatim
                    -
                    void print_nrn_cur_kernel(const ast::BreakpointBlock &node) override
                    Print main body of nrn_cur function.
                    +
                    void print_entrypoint_setup_code_from_memb_list()
                    Prints setup code for entrypoints from NEURON.
                    +
                    void visit_verbatim(const ast::Verbatim &node) override
                    visit node of type ast::Verbatim
                    +
                    void print_nrn_cur_kernel(const ast::BreakpointBlock &node) override
                    Print main body of nrn_cur function.
                    Blindly rename given variable to new name
                    static constexpr char NRN_CUR_METHOD[]
                    nrn_cur method in generated code
                    static constexpr char CVODE_UPDATE_NON_STIFF_NAME[]
                    name of CVODE method for updating non-stiff systems
                    -
                    void print_mechanism_register() override
                    Print the mechanism registration function.
                    +
                    void print_mechanism_register() override
                    Print the mechanism registration function.
                    Implement utility functions for codegen visitors.
                    static constexpr char TQITEM_VARIABLE[]
                    inbuilt neuron variable for tqitem process
                    -
                    void print_nrn_jacob()
                    Print nrn_jacob function definition.
                    - +
                    void print_nrn_jacob()
                    Print nrn_jacob function definition.
                    + -
                    void print_fast_imem_calculation() override
                    Print fast membrane current calculation code.
                    +
                    void print_fast_imem_calculation() override
                    Print fast membrane current calculation code.
                    Represent symbol table for a NMODL block.
                    static constexpr char CVODE_SETUP_STIFF_NAME[]
                    name of CVODE method for setting up stiff systems
                    void set(const std::string &old_name, std::string new_name)
                    -
                    std::vector< std::string > print_verbatim_setup(const ast::Verbatim &node, const std::string &verbatim)
                    Print compatibility macros required for VERBATIM blocks.
                    -
                    void print_data_structures(bool print_initializers) override
                    Print all classes.
                    -
                    void print_sdlists_init(bool print_initializers) override
                    -
                    const std::string external_method_arguments() noexcept override
                    Arguments for external functions called from generated code.
                    +
                    std::vector< std::string > print_verbatim_setup(const ast::Verbatim &node, const std::string &verbatim)
                    Print compatibility macros required for VERBATIM blocks.
                    +
                    void print_data_structures(bool print_initializers) override
                    Print all classes.
                    +
                    void print_sdlists_init(bool print_initializers) override
                    +
                    const std::string external_method_arguments() noexcept override
                    Arguments for external functions called from generated code.
                    Represent LONGITUDINAL_DIFFUSION statement in NMODL.
                    Definition: lon_diffuse.hpp:39
                    -
                    std::string py_function_name(const std::string &function_or_procedure_name) const
                    In non POINT_PROCESS mechanisms all functions and procedures need a py <func_or_proc_name> to be avai...
                    +
                    std::string py_function_name(const std::string &function_or_procedure_name) const
                    In non POINT_PROCESS mechanisms all functions and procedures need a py <func_or_proc_name> to be avai...
                    size_t offset
                    The global variables ahead of this one require offset doubles to store.
                    -
                    void print_node_data_structure(bool print_initializers)
                    Print the structure that wraps all node variables required for the NMODL.
                    +
                    void print_node_data_structure(bool print_initializers)
                    Print the structure that wraps all node variables required for the NMODL.
                    static std::vector< std::string > split_string(const std::string &text, char delimiter)
                    Split a text in a list of words, using a given delimiter character.
                    static constexpr char INST_GLOBAL_MEMBER[]
                    instance struct member pointing to the global variable structure
                    -
                    void print_cvode_update(const std::string &name, const ast::StatementBlock &block)
                    Print the CVODE update function name contained in block.
                    -
                    void print_make_instance() const
                    Print make_*_instance.
                    -
                    void print_atomic_reduction_pragma() override
                    Print atomic update pragma for reduction statements.
                    +
                    void print_cvode_update(const std::string &name, const ast::StatementBlock &block)
                    Print the CVODE update function name contained in block.
                    +
                    void print_make_instance() const
                    Print make_*_instance.
                    Represents block encapsulating list of statements.
                    NmodlType
                    NMODL variable properties.
                    const ArgumentVector & get_parameters() const noexcept override
                    Getter for member variable ForNetcon::parameters.
                    Definition: for_netcon.hpp:176
                    -
                    void print_setdata_functions()
                    Print NEURON functions related to setting global variables of the mechanism.
                    +
                    void print_setdata_functions()
                    Print NEURON functions related to setting global variables of the mechanism.
                    Represents ion write statement during code generation.
                    -
                    void print_mechanism_variables_macros()
                    Print mechanism variables' related macros.
                    -
                    ParamVector threadargs_parameters()
                    The parameters for the four macros _threadargs*_.
                    -
                    void print_nrn_constructor() override
                    Print nrn_constructor function definition.
                    +
                    void print_mechanism_variables_macros()
                    Print mechanism variables' related macros.
                    +
                    ParamVector threadargs_parameters()
                    The parameters for the four macros _threadargs*_.
                    +
                    void print_nrn_constructor() override
                    Print nrn_constructor function definition.
                    BlockType
                    Helper to represent various block types.
                    -
                    void print_headers_include() override
                    Print all includes.
                    -
                    void print_check_table_entrypoint()
                    Print all check_* function declarations.
                    -
                    const ParamVector external_method_parameters(bool table=false) noexcept override
                    Parameters for functions in generated code that are called back from external code.
                    -
                    void visit_for_netcon(const ast::ForNetcon &node) override
                    visit node of type ast::ForNetcon
                    -
                    void print_function_or_procedure(const ast::Block &node, const std::string &name, const std::unordered_set< CppObjectSpecifier > &specifiers={ CppObjectSpecifier::Inline}) override
                    Print nmodl function or procedure (common code)
                    +
                    void print_headers_include() override
                    Print all includes.
                    +
                    void print_check_table_entrypoint()
                    Print all check_* function declarations.
                    +
                    const ParamVector external_method_parameters(bool table=false) noexcept override
                    Parameters for functions in generated code that are called back from external code.
                    +
                    void visit_for_netcon(const ast::ForNetcon &node) override
                    visit node of type ast::ForNetcon
                    +
                    void print_function_or_procedure(const ast::Block &node, const std::string &name, const std::unordered_set< CppObjectSpecifier > &specifiers={ CppObjectSpecifier::Inline}) override
                    Print nmodl function or procedure (common code)
                    static constexpr char NRN_STATE_METHOD[]
                    nrn_state method in generated code
                    const std::shared_ptr< symtab::Symbol > symbol
                    Version information and units file path.
                    -
                    void print_nrn_current(const ast::BreakpointBlock &node) override
                    Print the nrn_current kernel.
                    +
                    void print_nrn_current(const ast::BreakpointBlock &node) override
                    Print the nrn_current kernel.
                    int position_of_float_var(const std::string &name) const override
                    Determine the position in the data array for a given float variable.
                    -
                    std::string get_variable_name(const std::string &name, bool use_instance=true) const override
                    Determine the C++ string to replace variable names with.
                    -
                    void print_hoc_py_wrapper_call_impl(const ast::Block *function_or_procedure_block, InterpreterWrapper wrapper_type)
                    Print the code that calls the impl from the HOC/Py wrapper.
                    -
                    void print_codegen_routines_nothing()
                    SUFFIX nothing is special.
                    +
                    std::string get_variable_name(const std::string &name, bool use_instance=true) const override
                    Determine the C++ string to replace variable names with.
                    +
                    void print_hoc_py_wrapper_call_impl(const ast::Block *function_or_procedure_block, InterpreterWrapper wrapper_type)
                    Print the code that calls the impl from the HOC/Py wrapper.
                    +
                    void print_codegen_routines_nothing()
                    SUFFIX nothing is special.
                    static constexpr char AREA_VARIABLE[]
                    similar to node_area but user can explicitly declare it as area
                    -
                    void print_make_node_data() const
                    Print make_*_node_data.
                    +
                    void print_make_node_data() const
                    Print make_*_node_data.
                    virtual std::shared_ptr< StatementBlock > get_statement_block() const
                    Return associated statement block for the AST node.
                    Definition: ast.cpp:32
                    std::string simulator_name() override
                    Name of the simulator the code was generated for.
                    -
                    void print_function_procedure_helper(const ast::Block &node) override
                    Common helper function to help printing function or procedure blocks.
                    -
                    std::string process_verbatim_text(const std::string &verbatim)
                    +
                    void print_function_procedure_helper(const ast::Block &node) override
                    Common helper function to help printing function or procedure blocks.
                    +
                    std::string process_verbatim_text(const std::string &verbatim)
                    static constexpr char FOR_NETCON_SEMANTIC[]
                    semantic type for for_netcon statement
                    static constexpr char NTHREAD_T_VARIABLE[]
                    t variable in neuron thread structure
                    -
                    void add_variable_point_process(std::vector< IndexVariableInfo > &variables) override
                    Add the variable point_process during get_int_variables.
                    +
                    void add_variable_point_process(std::vector< IndexVariableInfo > &variables) override
                    Add the variable point_process during get_int_variables.
                    Blindly rename given variable to new name
                    @ State
                    derivative block
                    static constexpr char DIAM_VARIABLE[]
                    inbuilt neuron variable for diameter of the compartment
                    static constexpr char INTERNAL_THREAD_ARGS_COMMA[]
                    variation of _threadargs_ for "internal" functions, with comma (maybe).
                    virtual const ArgumentVector & get_parameters() const
                    Definition: block.hpp:50
                    bool variable_used(const ast::Node &node, std::string name)
                    -
                    std::string nrn_thread_arguments() const override
                    Arguments for "_threadargs_" macro in neuron implementation.
                    +
                    std::string nrn_thread_arguments() const override
                    Arguments for "_threadargs_" macro in neuron implementation.
                    static bool ends_with(const std::string &haystack, const std::string &needle)
                    Check if haystack ends with needle.
                    static constexpr char NRN_DESTRUCTOR_METHOD[]
                    nrn_destructor method in generated code
                    static constexpr char CONDUCTANCE_UNUSED_VARIABLE[]
                    range variable when conductance is not used (for vectorized model)
                    -
                    ParamVector ldifusfunc3_parameters() const
                    Parameters for what NEURON calls ldifusfunc3_t.
                    -
                    ParamVector cvode_update_parameters()
                    Get the parameters for functions that update state at given timestep in CVODE.
                    +
                    ParamVector ldifusfunc3_parameters() const
                    Parameters for what NEURON calls ldifusfunc3_t.
                    +
                    ParamVector cvode_update_parameters()
                    Get the parameters for functions that update state at given timestep in CVODE.
                    -
                    void print_codegen_routines() override
                    Print entry point to code generation.
                    +
                    void print_codegen_routines() override
                    Print entry point to code generation.
                    -
                    void append_conc_write_statements(std::vector< ShadowUseStatement > &statements, const Ion &ion, const std::string &concentration) override
                    Generate Function call statement for nrn_wrote_conc.
                    -
                    void print_longitudinal_diffusion_callbacks()
                    Prints the callbacks required for LONGITUDINAL_DIFFUSION.
                    -
                    ParamVector internal_method_parameters() override
                    Parameters for internally defined functions.
                    +
                    void append_conc_write_statements(std::vector< ShadowUseStatement > &statements, const Ion &ion, const std::string &concentration) override
                    Generate Function call statement for nrn_wrote_conc.
                    +
                    void print_longitudinal_diffusion_callbacks()
                    Prints the callbacks required for LONGITUDINAL_DIFFUSION.
                    +
                    ParamVector internal_method_parameters() override
                    Parameters for internally defined functions.
                    int get_index_from_name(const std::vector< T > &variables, const std::string &name)
                    virtual Ast * get_parent() const
                    Parent getter.
                    Definition: ast.cpp:311
                    virtual std::string get_node_name() const
                    Return name of of the node.
                    Definition: ast.cpp:28
                    -
                    void print_hoc_py_wrapper(const ast::Block *function_or_procedure_block, InterpreterWrapper wrapper_type)
                    Print the wrapper for calling FUNCION/PROCEDURES from HOC/Py.
                    -
                    void print_cvode_count()
                    Print the CVODE function returning the number of ODEs to solve.
                    - +
                    void print_hoc_py_wrapper(const ast::Block *function_or_procedure_block, InterpreterWrapper wrapper_type)
                    Print the wrapper for calling FUNCION/PROCEDURES from HOC/Py.
                    +
                    void print_cvode_count()
                    Print the CVODE function returning the number of ODEs to solve.
                    +
                    Auto generated AST classes declaration.
                    -
                    void print_net_receive()
                    Print net_receive call-back.
                    -
                    void print_function_prototypes() override
                    Print function and procedures prototype declaration.
                    -
                    void print_mechanism_global_var_structure(bool print_initializers) override
                    Print the structure that wraps all global variables used in the NMODL.
                    -
                    void print_hoc_py_wrapper_setup(const ast::Block *function_or_procedure_block, InterpreterWrapper wrapper_type)
                    Print the setup code for HOC/Py wrapper.
                    -
                    std::string namespace_name() override
                    Name of "our" namespace.
                    -
                    void print_global_macros()
                    Print NEURON global variable macros.
                    +
                    void print_net_receive()
                    Print net_receive call-back.
                    +
                    void print_function_prototypes() override
                    Print function and procedures prototype declaration.
                    +
                    void print_mechanism_global_var_structure(bool print_initializers) override
                    Print the structure that wraps all global variables used in the NMODL.
                    +
                    void print_hoc_py_wrapper_setup(const ast::Block *function_or_procedure_block, InterpreterWrapper wrapper_type)
                    Print the setup code for HOC/Py wrapper.
                    +
                    std::string namespace_name() override
                    Name of "our" namespace.
                    +
                    void print_global_macros()
                    Print NEURON global variable macros.
                    std::string intra_conc_pointer_name() const
                    std::vector< std::tuple< std::string, std::string, std::string, std::string > > ParamVector
                    A vector of parameters represented by a 4-tuple of strings:
                    static constexpr char ION_VARNAME_PREFIX[]
                    prefix for ion variable
                    diff --git a/doxygen/src_2main_8cpp_source.html b/doxygen/src_2main_8cpp_source.html index 8d8647726..34c964bd6 100644 --- a/doxygen/src_2main_8cpp_source.html +++ b/doxygen/src_2main_8cpp_source.html @@ -826,7 +826,7 @@
                    Visitor to inline local procedure and function calls
                    Version information and units file path.
                    -
                    void visit_program(const ast::Program &program) override
                    Main and only member function to call after creating an instance of this class.
                    +
                    void visit_program(const ast::Program &program) override
                    Main and only member function to call after creating an instance of this class.
                    Represents top level AST node for whole NMODL input.
                    Definition: program.hpp:39
                    Visitor used for generating the necessary AST nodes for CVODE.
                    THIS FILE IS GENERATED AT BUILD TIME AND SHALL NOT BE EDITED.
                    diff --git a/notebooks/nmodl-kinetic-schemes.ipynb b/notebooks/nmodl-kinetic-schemes.ipynb index ada33b383..f79cea2f6 100644 --- a/notebooks/nmodl-kinetic-schemes.ipynb +++ b/notebooks/nmodl-kinetic-schemes.ipynb @@ -152,10 +152,10 @@ "execution_count": 1, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:03:58.340648Z", - "iopub.status.busy": "2024-11-07T13:03:58.340464Z", - "iopub.status.idle": "2024-11-07T13:03:59.664964Z", - "shell.execute_reply": "2024-11-07T13:03:59.663048Z" + "iopub.execute_input": "2024-11-13T09:18:41.751865Z", + "iopub.status.busy": "2024-11-13T09:18:41.751669Z", + "iopub.status.idle": "2024-11-13T09:18:42.552471Z", + "shell.execute_reply": "2024-11-13T09:18:42.551594Z" } }, "outputs": [], @@ -169,10 +169,10 @@ "execution_count": 2, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:03:59.668932Z", - "iopub.status.busy": "2024-11-07T13:03:59.668516Z", - "iopub.status.idle": "2024-11-07T13:03:59.699983Z", - "shell.execute_reply": "2024-11-07T13:03:59.699089Z" + "iopub.execute_input": "2024-11-13T09:18:42.555059Z", + "iopub.status.busy": "2024-11-13T09:18:42.554826Z", + "iopub.status.idle": "2024-11-13T09:18:42.585239Z", + "shell.execute_reply": "2024-11-13T09:18:42.584620Z" } }, "outputs": [], @@ -277,10 +277,10 @@ "execution_count": 3, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:03:59.702600Z", - "iopub.status.busy": "2024-11-07T13:03:59.702313Z", - "iopub.status.idle": "2024-11-07T13:03:59.707081Z", - "shell.execute_reply": "2024-11-07T13:03:59.706443Z" + "iopub.execute_input": "2024-11-13T09:18:42.587474Z", + "iopub.status.busy": "2024-11-13T09:18:42.587081Z", + "iopub.status.idle": "2024-11-13T09:18:42.592054Z", + "shell.execute_reply": "2024-11-13T09:18:42.591383Z" } }, "outputs": [ @@ -323,10 +323,10 @@ "execution_count": 4, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:03:59.738644Z", - "iopub.status.busy": "2024-11-07T13:03:59.738014Z", - "iopub.status.idle": "2024-11-07T13:03:59.742337Z", - "shell.execute_reply": "2024-11-07T13:03:59.741698Z" + "iopub.execute_input": "2024-11-13T09:18:42.622326Z", + "iopub.status.busy": "2024-11-13T09:18:42.622107Z", + "iopub.status.idle": "2024-11-13T09:18:42.626206Z", + "shell.execute_reply": "2024-11-13T09:18:42.625636Z" } }, "outputs": [ @@ -367,10 +367,10 @@ "execution_count": 5, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:03:59.745157Z", - "iopub.status.busy": "2024-11-07T13:03:59.744599Z", - "iopub.status.idle": "2024-11-07T13:03:59.748742Z", - "shell.execute_reply": "2024-11-07T13:03:59.748072Z" + "iopub.execute_input": "2024-11-13T09:18:42.628010Z", + "iopub.status.busy": "2024-11-13T09:18:42.627818Z", + "iopub.status.idle": "2024-11-13T09:18:42.631599Z", + "shell.execute_reply": "2024-11-13T09:18:42.631040Z" }, "scrolled": true }, @@ -412,10 +412,10 @@ "execution_count": 6, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:03:59.750725Z", - "iopub.status.busy": "2024-11-07T13:03:59.750527Z", - "iopub.status.idle": "2024-11-07T13:03:59.754105Z", - "shell.execute_reply": "2024-11-07T13:03:59.753565Z" + "iopub.execute_input": "2024-11-13T09:18:42.633619Z", + "iopub.status.busy": "2024-11-13T09:18:42.633307Z", + "iopub.status.idle": "2024-11-13T09:18:42.637224Z", + "shell.execute_reply": "2024-11-13T09:18:42.636683Z" }, "scrolled": true }, @@ -459,10 +459,10 @@ "execution_count": 7, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:03:59.755951Z", - "iopub.status.busy": "2024-11-07T13:03:59.755756Z", - "iopub.status.idle": "2024-11-07T13:03:59.760308Z", - "shell.execute_reply": "2024-11-07T13:03:59.759747Z" + "iopub.execute_input": "2024-11-13T09:18:42.639023Z", + "iopub.status.busy": "2024-11-13T09:18:42.638832Z", + "iopub.status.idle": "2024-11-13T09:18:42.642960Z", + "shell.execute_reply": "2024-11-13T09:18:42.642422Z" } }, "outputs": [ diff --git a/notebooks/nmodl-python-tutorial.ipynb b/notebooks/nmodl-python-tutorial.ipynb index e997570ca..6a2a6b282 100644 --- a/notebooks/nmodl-python-tutorial.ipynb +++ b/notebooks/nmodl-python-tutorial.ipynb @@ -30,10 +30,10 @@ "execution_count": 1, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:05.041312Z", - "iopub.status.busy": "2024-11-07T13:04:05.040826Z", - "iopub.status.idle": "2024-11-07T13:04:06.334983Z", - "shell.execute_reply": "2024-11-07T13:04:06.334208Z" + "iopub.execute_input": "2024-11-13T09:18:51.442230Z", + "iopub.status.busy": "2024-11-13T09:18:51.442046Z", + "iopub.status.idle": "2024-11-13T09:18:52.242528Z", + "shell.execute_reply": "2024-11-13T09:18:52.241721Z" } }, "outputs": [], @@ -63,10 +63,10 @@ "execution_count": 2, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:06.337576Z", - "iopub.status.busy": "2024-11-07T13:04:06.337361Z", - "iopub.status.idle": "2024-11-07T13:04:06.366675Z", - "shell.execute_reply": "2024-11-07T13:04:06.366016Z" + "iopub.execute_input": "2024-11-13T09:18:52.245184Z", + "iopub.status.busy": "2024-11-13T09:18:52.244737Z", + "iopub.status.idle": "2024-11-13T09:18:52.273465Z", + "shell.execute_reply": "2024-11-13T09:18:52.272720Z" } }, "outputs": [], @@ -86,10 +86,10 @@ "execution_count": 3, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:06.369207Z", - "iopub.status.busy": "2024-11-07T13:04:06.368795Z", - "iopub.status.idle": "2024-11-07T13:04:06.372544Z", - "shell.execute_reply": "2024-11-07T13:04:06.371982Z" + "iopub.execute_input": "2024-11-13T09:18:52.276021Z", + "iopub.status.busy": "2024-11-13T09:18:52.275484Z", + "iopub.status.idle": "2024-11-13T09:18:52.279329Z", + "shell.execute_reply": "2024-11-13T09:18:52.278705Z" } }, "outputs": [], @@ -152,10 +152,10 @@ "execution_count": 4, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:06.374796Z", - "iopub.status.busy": "2024-11-07T13:04:06.374288Z", - "iopub.status.idle": "2024-11-07T13:04:06.378376Z", - "shell.execute_reply": "2024-11-07T13:04:06.377835Z" + "iopub.execute_input": "2024-11-13T09:18:52.281554Z", + "iopub.status.busy": "2024-11-13T09:18:52.281061Z", + "iopub.status.idle": "2024-11-13T09:18:52.284984Z", + "shell.execute_reply": "2024-11-13T09:18:52.284292Z" } }, "outputs": [], @@ -183,10 +183,10 @@ "execution_count": 5, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:06.380375Z", - "iopub.status.busy": "2024-11-07T13:04:06.379990Z", - "iopub.status.idle": "2024-11-07T13:04:06.383787Z", - "shell.execute_reply": "2024-11-07T13:04:06.383227Z" + "iopub.execute_input": "2024-11-13T09:18:52.287170Z", + "iopub.status.busy": "2024-11-13T09:18:52.286789Z", + "iopub.status.idle": "2024-11-13T09:18:52.290288Z", + "shell.execute_reply": "2024-11-13T09:18:52.289681Z" } }, "outputs": [ @@ -235,10 +235,10 @@ "execution_count": 6, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:06.385944Z", - "iopub.status.busy": "2024-11-07T13:04:06.385561Z", - "iopub.status.idle": "2024-11-07T13:04:06.389536Z", - "shell.execute_reply": "2024-11-07T13:04:06.389031Z" + "iopub.execute_input": "2024-11-13T09:18:52.292362Z", + "iopub.status.busy": "2024-11-13T09:18:52.291973Z", + "iopub.status.idle": "2024-11-13T09:18:52.295806Z", + "shell.execute_reply": "2024-11-13T09:18:52.295299Z" } }, "outputs": [], @@ -260,10 +260,10 @@ "execution_count": 7, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:06.391743Z", - "iopub.status.busy": "2024-11-07T13:04:06.391245Z", - "iopub.status.idle": "2024-11-07T13:04:06.395147Z", - "shell.execute_reply": "2024-11-07T13:04:06.394599Z" + "iopub.execute_input": "2024-11-13T09:18:52.297760Z", + "iopub.status.busy": "2024-11-13T09:18:52.297453Z", + "iopub.status.idle": "2024-11-13T09:18:52.301271Z", + "shell.execute_reply": "2024-11-13T09:18:52.300702Z" } }, "outputs": [ @@ -297,10 +297,10 @@ "execution_count": 8, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:06.397160Z", - "iopub.status.busy": "2024-11-07T13:04:06.396819Z", - "iopub.status.idle": "2024-11-07T13:04:06.403705Z", - "shell.execute_reply": "2024-11-07T13:04:06.403086Z" + "iopub.execute_input": "2024-11-13T09:18:52.303228Z", + "iopub.status.busy": "2024-11-13T09:18:52.302923Z", + "iopub.status.idle": "2024-11-13T09:18:52.310330Z", + "shell.execute_reply": "2024-11-13T09:18:52.309776Z" } }, "outputs": [ @@ -365,10 +365,10 @@ "execution_count": 9, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:06.405716Z", - "iopub.status.busy": "2024-11-07T13:04:06.405334Z", - "iopub.status.idle": "2024-11-07T13:04:06.409319Z", - "shell.execute_reply": "2024-11-07T13:04:06.408773Z" + "iopub.execute_input": "2024-11-13T09:18:52.312328Z", + "iopub.status.busy": "2024-11-13T09:18:52.311873Z", + "iopub.status.idle": "2024-11-13T09:18:52.316147Z", + "shell.execute_reply": "2024-11-13T09:18:52.315505Z" } }, "outputs": [ @@ -416,10 +416,10 @@ "execution_count": 10, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:06.411366Z", - "iopub.status.busy": "2024-11-07T13:04:06.411063Z", - "iopub.status.idle": "2024-11-07T13:04:06.414382Z", - "shell.execute_reply": "2024-11-07T13:04:06.413859Z" + "iopub.execute_input": "2024-11-13T09:18:52.318313Z", + "iopub.status.busy": "2024-11-13T09:18:52.317941Z", + "iopub.status.idle": "2024-11-13T09:18:52.321156Z", + "shell.execute_reply": "2024-11-13T09:18:52.320602Z" } }, "outputs": [], @@ -441,10 +441,10 @@ "execution_count": 11, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:06.416339Z", - "iopub.status.busy": "2024-11-07T13:04:06.416029Z", - "iopub.status.idle": "2024-11-07T13:04:06.419644Z", - "shell.execute_reply": "2024-11-07T13:04:06.419042Z" + "iopub.execute_input": "2024-11-13T09:18:52.323157Z", + "iopub.status.busy": "2024-11-13T09:18:52.322858Z", + "iopub.status.idle": "2024-11-13T09:18:52.326444Z", + "shell.execute_reply": "2024-11-13T09:18:52.325913Z" } }, "outputs": [ @@ -510,10 +510,10 @@ "execution_count": 12, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:06.421540Z", - "iopub.status.busy": "2024-11-07T13:04:06.421343Z", - "iopub.status.idle": "2024-11-07T13:04:06.425007Z", - "shell.execute_reply": "2024-11-07T13:04:06.424440Z" + "iopub.execute_input": "2024-11-13T09:18:52.328398Z", + "iopub.status.busy": "2024-11-13T09:18:52.328094Z", + "iopub.status.idle": "2024-11-13T09:18:52.331276Z", + "shell.execute_reply": "2024-11-13T09:18:52.330741Z" } }, "outputs": [ @@ -548,10 +548,10 @@ "execution_count": 13, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:06.426846Z", - "iopub.status.busy": "2024-11-07T13:04:06.426651Z", - "iopub.status.idle": "2024-11-07T13:04:06.430329Z", - "shell.execute_reply": "2024-11-07T13:04:06.429707Z" + "iopub.execute_input": "2024-11-13T09:18:52.333438Z", + "iopub.status.busy": "2024-11-13T09:18:52.333070Z", + "iopub.status.idle": "2024-11-13T09:18:52.336395Z", + "shell.execute_reply": "2024-11-13T09:18:52.335751Z" } }, "outputs": [ @@ -584,10 +584,10 @@ "execution_count": 14, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:06.432719Z", - "iopub.status.busy": "2024-11-07T13:04:06.432155Z", - "iopub.status.idle": "2024-11-07T13:04:06.435817Z", - "shell.execute_reply": "2024-11-07T13:04:06.435249Z" + "iopub.execute_input": "2024-11-13T09:18:52.338622Z", + "iopub.status.busy": "2024-11-13T09:18:52.338397Z", + "iopub.status.idle": "2024-11-13T09:18:52.342079Z", + "shell.execute_reply": "2024-11-13T09:18:52.341466Z" } }, "outputs": [ @@ -622,10 +622,10 @@ "execution_count": 15, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:06.437971Z", - "iopub.status.busy": "2024-11-07T13:04:06.437501Z", - "iopub.status.idle": "2024-11-07T13:04:06.441735Z", - "shell.execute_reply": "2024-11-07T13:04:06.441082Z" + "iopub.execute_input": "2024-11-13T09:18:52.344298Z", + "iopub.status.busy": "2024-11-13T09:18:52.343926Z", + "iopub.status.idle": "2024-11-13T09:18:52.347808Z", + "shell.execute_reply": "2024-11-13T09:18:52.347267Z" } }, "outputs": [ @@ -669,10 +669,10 @@ "execution_count": 16, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:06.443818Z", - "iopub.status.busy": "2024-11-07T13:04:06.443451Z", - "iopub.status.idle": "2024-11-07T13:04:06.448894Z", - "shell.execute_reply": "2024-11-07T13:04:06.448238Z" + "iopub.execute_input": "2024-11-13T09:18:52.349822Z", + "iopub.status.busy": "2024-11-13T09:18:52.349461Z", + "iopub.status.idle": "2024-11-13T09:18:52.354900Z", + "shell.execute_reply": "2024-11-13T09:18:52.354325Z" } }, "outputs": [ @@ -733,10 +733,10 @@ "execution_count": 17, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:06.451061Z", - "iopub.status.busy": "2024-11-07T13:04:06.450579Z", - "iopub.status.idle": "2024-11-07T13:04:06.454262Z", - "shell.execute_reply": "2024-11-07T13:04:06.453694Z" + "iopub.execute_input": "2024-11-13T09:18:52.357063Z", + "iopub.status.busy": "2024-11-13T09:18:52.356542Z", + "iopub.status.idle": "2024-11-13T09:18:52.360260Z", + "shell.execute_reply": "2024-11-13T09:18:52.359616Z" } }, "outputs": [], @@ -761,10 +761,10 @@ "execution_count": 18, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:06.456402Z", - "iopub.status.busy": "2024-11-07T13:04:06.455930Z", - "iopub.status.idle": "2024-11-07T13:04:06.465855Z", - "shell.execute_reply": "2024-11-07T13:04:06.465294Z" + "iopub.execute_input": "2024-11-13T09:18:52.362270Z", + "iopub.status.busy": "2024-11-13T09:18:52.361915Z", + "iopub.status.idle": "2024-11-13T09:18:52.371922Z", + "shell.execute_reply": "2024-11-13T09:18:52.371275Z" } }, "outputs": [], @@ -857,10 +857,10 @@ "execution_count": 19, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:06.467784Z", - "iopub.status.busy": "2024-11-07T13:04:06.467380Z", - "iopub.status.idle": "2024-11-07T13:04:06.470840Z", - "shell.execute_reply": "2024-11-07T13:04:06.470270Z" + "iopub.execute_input": "2024-11-13T09:18:52.374081Z", + "iopub.status.busy": "2024-11-13T09:18:52.373604Z", + "iopub.status.idle": "2024-11-13T09:18:52.377309Z", + "shell.execute_reply": "2024-11-13T09:18:52.376653Z" } }, "outputs": [ @@ -897,10 +897,10 @@ "execution_count": 20, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:06.473066Z", - "iopub.status.busy": "2024-11-07T13:04:06.472604Z", - "iopub.status.idle": "2024-11-07T13:04:06.477921Z", - "shell.execute_reply": "2024-11-07T13:04:06.477398Z" + "iopub.execute_input": "2024-11-13T09:18:52.379321Z", + "iopub.status.busy": "2024-11-13T09:18:52.378938Z", + "iopub.status.idle": "2024-11-13T09:18:52.384465Z", + "shell.execute_reply": "2024-11-13T09:18:52.383797Z" } }, "outputs": [ diff --git a/notebooks/nmodl-sympy-conductance.ipynb b/notebooks/nmodl-sympy-conductance.ipynb index 60e17a945..07256374c 100644 --- a/notebooks/nmodl-sympy-conductance.ipynb +++ b/notebooks/nmodl-sympy-conductance.ipynb @@ -86,10 +86,10 @@ "execution_count": 1, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:08.794503Z", - "iopub.status.busy": "2024-11-07T13:04:08.794295Z", - "iopub.status.idle": "2024-11-07T13:04:09.729693Z", - "shell.execute_reply": "2024-11-07T13:04:09.728870Z" + "iopub.execute_input": "2024-11-13T09:18:54.830257Z", + "iopub.status.busy": "2024-11-13T09:18:54.830079Z", + "iopub.status.idle": "2024-11-13T09:18:55.628357Z", + "shell.execute_reply": "2024-11-13T09:18:55.627591Z" } }, "outputs": [], @@ -103,10 +103,10 @@ "execution_count": 2, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:09.732544Z", - "iopub.status.busy": "2024-11-07T13:04:09.732014Z", - "iopub.status.idle": "2024-11-07T13:04:09.763831Z", - "shell.execute_reply": "2024-11-07T13:04:09.762997Z" + "iopub.execute_input": "2024-11-13T09:18:55.631061Z", + "iopub.status.busy": "2024-11-13T09:18:55.630560Z", + "iopub.status.idle": "2024-11-13T09:18:55.661290Z", + "shell.execute_reply": "2024-11-13T09:18:55.660609Z" } }, "outputs": [], @@ -149,10 +149,10 @@ "execution_count": 3, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:09.766430Z", - "iopub.status.busy": "2024-11-07T13:04:09.766023Z", - "iopub.status.idle": "2024-11-07T13:04:10.047470Z", - "shell.execute_reply": "2024-11-07T13:04:10.046736Z" + "iopub.execute_input": "2024-11-13T09:18:55.663719Z", + "iopub.status.busy": "2024-11-13T09:18:55.663466Z", + "iopub.status.idle": "2024-11-13T09:18:55.940088Z", + "shell.execute_reply": "2024-11-13T09:18:55.939359Z" } }, "outputs": [ @@ -196,10 +196,10 @@ "execution_count": 4, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:10.049687Z", - "iopub.status.busy": "2024-11-07T13:04:10.049412Z", - "iopub.status.idle": "2024-11-07T13:04:10.184267Z", - "shell.execute_reply": "2024-11-07T13:04:10.183547Z" + "iopub.execute_input": "2024-11-13T09:18:55.942348Z", + "iopub.status.busy": "2024-11-13T09:18:55.942090Z", + "iopub.status.idle": "2024-11-13T09:18:56.073925Z", + "shell.execute_reply": "2024-11-13T09:18:56.073233Z" } }, "outputs": [ @@ -243,10 +243,10 @@ "execution_count": 5, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:10.186852Z", - "iopub.status.busy": "2024-11-07T13:04:10.186421Z", - "iopub.status.idle": "2024-11-07T13:04:10.195282Z", - "shell.execute_reply": "2024-11-07T13:04:10.194720Z" + "iopub.execute_input": "2024-11-13T09:18:56.076360Z", + "iopub.status.busy": "2024-11-13T09:18:56.075881Z", + "iopub.status.idle": "2024-11-13T09:18:56.085091Z", + "shell.execute_reply": "2024-11-13T09:18:56.084492Z" } }, "outputs": [ @@ -290,10 +290,10 @@ "execution_count": 6, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:10.197237Z", - "iopub.status.busy": "2024-11-07T13:04:10.197029Z", - "iopub.status.idle": "2024-11-07T13:04:10.214904Z", - "shell.execute_reply": "2024-11-07T13:04:10.214315Z" + "iopub.execute_input": "2024-11-13T09:18:56.086958Z", + "iopub.status.busy": "2024-11-13T09:18:56.086757Z", + "iopub.status.idle": "2024-11-13T09:18:56.104279Z", + "shell.execute_reply": "2024-11-13T09:18:56.103621Z" } }, "outputs": [ @@ -337,10 +337,10 @@ "execution_count": 7, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:10.217239Z", - "iopub.status.busy": "2024-11-07T13:04:10.216713Z", - "iopub.status.idle": "2024-11-07T13:04:10.337794Z", - "shell.execute_reply": "2024-11-07T13:04:10.337147Z" + "iopub.execute_input": "2024-11-13T09:18:56.106601Z", + "iopub.status.busy": "2024-11-13T09:18:56.106088Z", + "iopub.status.idle": "2024-11-13T09:18:56.225379Z", + "shell.execute_reply": "2024-11-13T09:18:56.224714Z" } }, "outputs": [ @@ -400,10 +400,10 @@ "execution_count": 8, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:10.339926Z", - "iopub.status.busy": "2024-11-07T13:04:10.339703Z", - "iopub.status.idle": "2024-11-07T13:04:10.436570Z", - "shell.execute_reply": "2024-11-07T13:04:10.435913Z" + "iopub.execute_input": "2024-11-13T09:18:56.227581Z", + "iopub.status.busy": "2024-11-13T09:18:56.227373Z", + "iopub.status.idle": "2024-11-13T09:18:56.322291Z", + "shell.execute_reply": "2024-11-13T09:18:56.321674Z" } }, "outputs": [ @@ -456,10 +456,10 @@ "execution_count": 9, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:10.438662Z", - "iopub.status.busy": "2024-11-07T13:04:10.438427Z", - "iopub.status.idle": "2024-11-07T13:04:10.514688Z", - "shell.execute_reply": "2024-11-07T13:04:10.514032Z" + "iopub.execute_input": "2024-11-13T09:18:56.324286Z", + "iopub.status.busy": "2024-11-13T09:18:56.324070Z", + "iopub.status.idle": "2024-11-13T09:18:56.399063Z", + "shell.execute_reply": "2024-11-13T09:18:56.398448Z" } }, "outputs": [ diff --git a/notebooks/nmodl-sympy-solver-cnexp.ipynb b/notebooks/nmodl-sympy-solver-cnexp.ipynb index e599a3392..f3992f265 100644 --- a/notebooks/nmodl-sympy-solver-cnexp.ipynb +++ b/notebooks/nmodl-sympy-solver-cnexp.ipynb @@ -62,10 +62,10 @@ "execution_count": 1, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:12.501813Z", - "iopub.status.busy": "2024-11-07T13:04:12.501241Z", - "iopub.status.idle": "2024-11-07T13:04:13.313108Z", - "shell.execute_reply": "2024-11-07T13:04:13.312323Z" + "iopub.execute_input": "2024-11-13T09:18:58.155478Z", + "iopub.status.busy": "2024-11-13T09:18:58.154916Z", + "iopub.status.idle": "2024-11-13T09:18:58.957386Z", + "shell.execute_reply": "2024-11-13T09:18:58.956572Z" } }, "outputs": [], @@ -79,10 +79,10 @@ "execution_count": 2, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:13.315817Z", - "iopub.status.busy": "2024-11-07T13:04:13.315348Z", - "iopub.status.idle": "2024-11-07T13:04:13.347228Z", - "shell.execute_reply": "2024-11-07T13:04:13.346419Z" + "iopub.execute_input": "2024-11-13T09:18:58.959862Z", + "iopub.status.busy": "2024-11-13T09:18:58.959642Z", + "iopub.status.idle": "2024-11-13T09:18:58.990944Z", + "shell.execute_reply": "2024-11-13T09:18:58.990291Z" } }, "outputs": [], @@ -123,10 +123,10 @@ "execution_count": 3, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:13.350086Z", - "iopub.status.busy": "2024-11-07T13:04:13.349651Z", - "iopub.status.idle": "2024-11-07T13:04:13.770831Z", - "shell.execute_reply": "2024-11-07T13:04:13.770079Z" + "iopub.execute_input": "2024-11-13T09:18:58.993364Z", + "iopub.status.busy": "2024-11-13T09:18:58.993098Z", + "iopub.status.idle": "2024-11-13T09:18:59.437194Z", + "shell.execute_reply": "2024-11-13T09:18:59.436338Z" } }, "outputs": [ @@ -165,10 +165,10 @@ "execution_count": 4, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:13.773290Z", - "iopub.status.busy": "2024-11-07T13:04:13.772837Z", - "iopub.status.idle": "2024-11-07T13:04:13.885090Z", - "shell.execute_reply": "2024-11-07T13:04:13.884354Z" + "iopub.execute_input": "2024-11-13T09:18:59.440052Z", + "iopub.status.busy": "2024-11-13T09:18:59.439558Z", + "iopub.status.idle": "2024-11-13T09:18:59.562106Z", + "shell.execute_reply": "2024-11-13T09:18:59.561399Z" } }, "outputs": [ @@ -207,10 +207,10 @@ "execution_count": 5, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:13.887573Z", - "iopub.status.busy": "2024-11-07T13:04:13.887122Z", - "iopub.status.idle": "2024-11-07T13:04:14.091172Z", - "shell.execute_reply": "2024-11-07T13:04:14.090525Z" + "iopub.execute_input": "2024-11-13T09:18:59.564198Z", + "iopub.status.busy": "2024-11-13T09:18:59.563989Z", + "iopub.status.idle": "2024-11-13T09:18:59.767492Z", + "shell.execute_reply": "2024-11-13T09:18:59.766858Z" } }, "outputs": [ @@ -255,10 +255,10 @@ "execution_count": 6, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:14.093492Z", - "iopub.status.busy": "2024-11-07T13:04:14.093073Z", - "iopub.status.idle": "2024-11-07T13:04:14.254757Z", - "shell.execute_reply": "2024-11-07T13:04:14.254038Z" + "iopub.execute_input": "2024-11-13T09:18:59.769589Z", + "iopub.status.busy": "2024-11-13T09:18:59.769358Z", + "iopub.status.idle": "2024-11-13T09:18:59.930467Z", + "shell.execute_reply": "2024-11-13T09:18:59.929837Z" } }, "outputs": [ @@ -303,10 +303,10 @@ "execution_count": 7, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:14.257098Z", - "iopub.status.busy": "2024-11-07T13:04:14.256703Z", - "iopub.status.idle": "2024-11-07T13:04:16.055928Z", - "shell.execute_reply": "2024-11-07T13:04:16.055293Z" + "iopub.execute_input": "2024-11-13T09:18:59.932463Z", + "iopub.status.busy": "2024-11-13T09:18:59.932255Z", + "iopub.status.idle": "2024-11-13T09:19:01.698050Z", + "shell.execute_reply": "2024-11-13T09:19:01.697409Z" } }, "outputs": [ @@ -351,10 +351,10 @@ "execution_count": 8, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:16.058269Z", - "iopub.status.busy": "2024-11-07T13:04:16.057827Z", - "iopub.status.idle": "2024-11-07T13:04:18.274736Z", - "shell.execute_reply": "2024-11-07T13:04:18.274129Z" + "iopub.execute_input": "2024-11-13T09:19:01.700439Z", + "iopub.status.busy": "2024-11-13T09:19:01.699901Z", + "iopub.status.idle": "2024-11-13T09:19:03.934517Z", + "shell.execute_reply": "2024-11-13T09:19:03.933814Z" } }, "outputs": [ diff --git a/notebooks/nmodl-sympy-solver-derivimplicit.ipynb b/notebooks/nmodl-sympy-solver-derivimplicit.ipynb index f1e3909f2..45ad8cc3e 100644 --- a/notebooks/nmodl-sympy-solver-derivimplicit.ipynb +++ b/notebooks/nmodl-sympy-solver-derivimplicit.ipynb @@ -39,10 +39,10 @@ "execution_count": 1, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:19.973491Z", - "iopub.status.busy": "2024-11-07T13:04:19.972999Z", - "iopub.status.idle": "2024-11-07T13:04:20.781377Z", - "shell.execute_reply": "2024-11-07T13:04:20.780461Z" + "iopub.execute_input": "2024-11-13T09:19:05.643858Z", + "iopub.status.busy": "2024-11-13T09:19:05.643663Z", + "iopub.status.idle": "2024-11-13T09:19:06.455724Z", + "shell.execute_reply": "2024-11-13T09:19:06.454869Z" } }, "outputs": [], @@ -56,10 +56,10 @@ "execution_count": 2, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:20.784363Z", - "iopub.status.busy": "2024-11-07T13:04:20.783935Z", - "iopub.status.idle": "2024-11-07T13:04:20.815294Z", - "shell.execute_reply": "2024-11-07T13:04:20.814637Z" + "iopub.execute_input": "2024-11-13T09:19:06.458122Z", + "iopub.status.busy": "2024-11-13T09:19:06.457907Z", + "iopub.status.idle": "2024-11-13T09:19:06.488537Z", + "shell.execute_reply": "2024-11-13T09:19:06.487921Z" } }, "outputs": [], @@ -100,10 +100,10 @@ "execution_count": 3, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:20.817755Z", - "iopub.status.busy": "2024-11-07T13:04:20.817344Z", - "iopub.status.idle": "2024-11-07T13:04:21.324587Z", - "shell.execute_reply": "2024-11-07T13:04:21.323861Z" + "iopub.execute_input": "2024-11-13T09:19:06.490917Z", + "iopub.status.busy": "2024-11-13T09:19:06.490704Z", + "iopub.status.idle": "2024-11-13T09:19:06.978614Z", + "shell.execute_reply": "2024-11-13T09:19:06.978021Z" } }, "outputs": [ @@ -165,10 +165,10 @@ "execution_count": 4, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:21.326936Z", - "iopub.status.busy": "2024-11-07T13:04:21.326477Z", - "iopub.status.idle": "2024-11-07T13:04:21.628544Z", - "shell.execute_reply": "2024-11-07T13:04:21.627887Z" + "iopub.execute_input": "2024-11-13T09:19:06.981129Z", + "iopub.status.busy": "2024-11-13T09:19:06.980640Z", + "iopub.status.idle": "2024-11-13T09:19:07.277979Z", + "shell.execute_reply": "2024-11-13T09:19:07.277349Z" } }, "outputs": [ diff --git a/notebooks/nmodl-sympy-solver-sparse.ipynb b/notebooks/nmodl-sympy-solver-sparse.ipynb index ebfe3ccab..44a1a36dc 100644 --- a/notebooks/nmodl-sympy-solver-sparse.ipynb +++ b/notebooks/nmodl-sympy-solver-sparse.ipynb @@ -39,10 +39,10 @@ "execution_count": 1, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:23.117930Z", - "iopub.status.busy": "2024-11-07T13:04:23.117377Z", - "iopub.status.idle": "2024-11-07T13:04:23.932962Z", - "shell.execute_reply": "2024-11-07T13:04:23.932211Z" + "iopub.execute_input": "2024-11-13T09:19:08.562100Z", + "iopub.status.busy": "2024-11-13T09:19:08.561537Z", + "iopub.status.idle": "2024-11-13T09:19:09.359397Z", + "shell.execute_reply": "2024-11-13T09:19:09.358659Z" } }, "outputs": [], @@ -56,10 +56,10 @@ "execution_count": 2, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:23.935538Z", - "iopub.status.busy": "2024-11-07T13:04:23.935309Z", - "iopub.status.idle": "2024-11-07T13:04:23.967999Z", - "shell.execute_reply": "2024-11-07T13:04:23.967314Z" + "iopub.execute_input": "2024-11-13T09:19:09.362012Z", + "iopub.status.busy": "2024-11-13T09:19:09.361592Z", + "iopub.status.idle": "2024-11-13T09:19:09.392401Z", + "shell.execute_reply": "2024-11-13T09:19:09.391637Z" } }, "outputs": [], @@ -100,10 +100,10 @@ "execution_count": 3, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:23.970437Z", - "iopub.status.busy": "2024-11-07T13:04:23.970172Z", - "iopub.status.idle": "2024-11-07T13:04:24.466176Z", - "shell.execute_reply": "2024-11-07T13:04:24.465445Z" + "iopub.execute_input": "2024-11-13T09:19:09.395161Z", + "iopub.status.busy": "2024-11-13T09:19:09.394610Z", + "iopub.status.idle": "2024-11-13T09:19:09.887658Z", + "shell.execute_reply": "2024-11-13T09:19:09.887035Z" } }, "outputs": [ @@ -165,10 +165,10 @@ "execution_count": 4, "metadata": { "execution": { - "iopub.execute_input": "2024-11-07T13:04:24.468590Z", - "iopub.status.busy": "2024-11-07T13:04:24.468049Z", - "iopub.status.idle": "2024-11-07T13:04:24.766614Z", - "shell.execute_reply": "2024-11-07T13:04:24.765884Z" + "iopub.execute_input": "2024-11-13T09:19:09.889970Z", + "iopub.status.busy": "2024-11-13T09:19:09.889556Z", + "iopub.status.idle": "2024-11-13T09:19:10.188784Z", + "shell.execute_reply": "2024-11-13T09:19:10.188041Z" } }, "outputs": [