From 8a7ed30676abc351152b05911cda822cd1589d8f Mon Sep 17 00:00:00 2001 From: Dhanya Thattil Date: Mon, 30 Sep 2024 17:22:24 +0200 Subject: [PATCH] Dev/m3 readout speed (#985) * added readoutspeed command to m3 (fullspeed - 10, half speed - 20, quarter speed - 40), removed reaodut pll, moved up system pll clock indices, leaving pll index in common altera code, default speed is half speed, allow only system_c0 to be set, the others can be obtained, same for clkphase, maxclkphaseshift, clkfreq. added to readoutspeedlist commands, updated help and updated tests * updated readoutspeedlist command --- python/slsdet/detector.py | 19 +++-- .../mythen3DetectorServer/RegisterDefs.h | 3 - .../bin/mythen3DetectorServer_developer | Bin 301220 -> 301356 bytes .../slsDetectorFunctionList.c | 73 +++++++++++------- .../slsDetectorServer_defs.h | 35 ++++----- .../include/slsDetectorFunctionList.h | 3 +- .../src/slsDetectorServer_funcs.c | 15 ++-- slsDetectorSoftware/generator/commands.yaml | 10 +-- slsDetectorSoftware/include/sls/Detector.h | 13 ++-- slsDetectorSoftware/src/Detector.cpp | 1 + .../tests/Caller/test-Caller.cpp | 44 ++++++++++- slsSupportLib/include/sls/versionAPI.h | 2 +- 12 files changed, 140 insertions(+), 78 deletions(-) diff --git a/python/slsdet/detector.py b/python/slsdet/detector.py index 8d162dab3..d8a0137ee 100755 --- a/python/slsdet/detector.py +++ b/python/slsdet/detector.py @@ -2111,7 +2111,7 @@ class Detector(CppDetectorApi): Note ----- - [Jungfrau][Moench] FULL_SPEED, HALF_SPEED (Default), QUARTER_SPEED + [Jungfrau][Moench][Mythen3] FULL_SPEED, HALF_SPEED (Default), QUARTER_SPEED [Eiger] FULL_SPEED (Default), HALF_SPEED, QUARTER_SPEED [Moench] FULL_SPEED (Default), HALF_SPEED, QUARTER_SPEED [Gottthard2] G2_108MHZ (Default), G2_144MHZ @@ -2925,7 +2925,9 @@ class Detector(CppDetectorApi): @property def maxclkphaseshift(self): """ - [Gotthard2][Mythen3] Absolute maximum Phase shift of clocks. + [Gotthard2][Mythen3] Absolute maximum Phase shift of clocks.\n + [Gotthard2] Clock index range: 0-5\n + [Mythen3] Clock index range: 0 :setter: Not Implemented @@ -3986,7 +3988,9 @@ class Detector(CppDetectorApi): @property def clkphase(self): """ - [Gotthard2][Mythen3] Phase shift of all clocks. + [Gotthard2][Mythen3] Phase shift of all clocks.\n + [Gotthard2] Clock index range: 0-5\n + [Mythen3] Clock index range: 0 Example ------- @@ -4004,7 +4008,9 @@ class Detector(CppDetectorApi): @property def clkdiv(self): """ - [Gotthard2][Mythen3] Clock Divider of all clocks. Must be greater than 1. + [Gotthard2][Mythen3] Clock Divider of all clocks. Must be greater than 1.\n + [Gotthard2] Clock index range: 0-5\n + [Mythen3] Clock index range: 0 Example ------- @@ -4060,7 +4066,10 @@ class Detector(CppDetectorApi): @property def clkfreq(self): """ - [Gotthard2][Mythen3] Frequency of clock in Hz. + [Gotthard2][Mythen3] Frequency of clock in Hz.\n + [Gotthard2] Clock index range: 0-5\n + [Mythen3] Clock index range: 0 + :setter: Not implemented. Use clkdiv to set frequency diff --git a/slsDetectorServers/mythen3DetectorServer/RegisterDefs.h b/slsDetectorServers/mythen3DetectorServer/RegisterDefs.h index edc58f4fa..6c7e641c9 100644 --- a/slsDetectorServers/mythen3DetectorServer/RegisterDefs.h +++ b/slsDetectorServers/mythen3DetectorServer/RegisterDefs.h @@ -7,9 +7,6 @@ /* Base addresses 0x1804 0000 ---------------------------------------------*/ -/* Reconfiguration core for readout pll */ -#define BASE_READOUT_PLL (0x0000) // 0x1804_0000 - 0x1804_07FF - /* Reconfiguration core for system pll */ #define BASE_SYSTEM_PLL (0x0800) // 0x1804_0800 - 0x1804_0FFF diff --git a/slsDetectorServers/mythen3DetectorServer/bin/mythen3DetectorServer_developer b/slsDetectorServers/mythen3DetectorServer/bin/mythen3DetectorServer_developer index 05d0b45aa482aa9e183f812d3068e5f25f054aec..509c4e5a9773d007455d5541a9debf499d19cbcf 100755 GIT binary patch delta 85882 zcmdSCd0-U9);`?TnS?AP43N$Y!Av%ikN^pr?2utcL{LCLR6s;TR6s;TL}t){TtGw{ zYy<>UL}ZmkR1`8QE>{szQE>|aQ4rbpJ>OH+r)RpGBrNZH@9%s6I5SV5uCA^+Rdwpr zsihaKuCjbhl^H4WAoYc`ff4ar!=(7FFHG^U$uGRsEn32*bcoYhnav54C%0ca-{E0w z;o6Pim1OygcIws&m)ME5Uq|+jkpp+F&5b`@!8faNs`rI3DWb6?xk`MyPDm1S%q3oZ z6Yn+R)iLqjBwkGuZ#nVOO}y2_^O$(+bzc97Y9{6f6foYz3lOi8iT5e-qD{Oni5G6- zeN$Omb(8#Zr4y2uIkw-H-E4A{6xa}^6;_oK)lZX}uxRyCQt$TBVX4yGFiGTnPvunq z_hFK9d}Fce_*1(IAP+ntxsJEoCEXP!d2=$QK9b+*NsyckSwM0`f8stN`6b6ub&e+) z@on&Q3zw>-2J+RoYagUd2EOJV%lKYdrCc*mL>13 zqWWs5s_oM2$p@>b3q~eIE9diz9bpnffcfd^^3f`4C0~+SoL-HcSI?#QmZPhx=SL-} zBWl!b>_3_zxy}|A*Qh4NyUyqD@}A0&GAsN2c3!i|vCd|bWBej}aaGj?_a~_*YSeUz z=g$-td!i+$>jG6WS5-Cd36FYPMiV(jRi|d$&Xd|JvzuBkGhK&;aT%&pxmZ{%1e~d= z=~=H-gUFiAYmz&ycbNaF9Ifz8Ia@tZD_g!pq&p0iP0g>J5UdjeRJDI?REf3YYk$Dx;Z=Ewb@py? zNYb0(qE=?EkevP(96DakYba{w$qCK^IUp%gAasqItFX{@JAN&zALq7mZR3^uc)s(* zU(+Rre~nX#@b6H(gIQ(8JQEA_hv5G!qdlKm^6LkUS(NyMl-)5Fai%>N3>v45=qFCJGkU zqVOY82?F6F@jNsBe?mBLCR{pE0c|WLHI?6!A|eo9N)&z&@EJXFf0HQju+%6*|8J#^ zt((}{{}>M&1B#Vg7tvTgkHCLnaXY-9S7wfPa3LSfcX|ivQF!l*MtBHgYNTXjIVwKdDm$3fa&k(xcH9@nlw(oT3P(M~kODvgCB6$V_TeQN$V;8mTAn{uoJ{ z_YRudmT`*uuX;5SXRFQ#SqhdDlI;|2cMj@wy_||GRj1={NikC9bZEDAXI0la>(7&A z?|OA*!<*&TtExL6Oj_%{@gpWznW_HTXbsz>PH+4u`%;ygJSzWCRh>H_NuAl`1-47g zY&w*;=@*-JjTW+R&C5jH-!w<|A4MC>QN7J7@&H|%CFBWhQKD;^_!Pa+T(~y#c}j_= z6>4&hy0Mu%*i6!Asymx?m7B(^dCgO+@UoAW7V2f6${RjjSUVhr>oo_MP)dMy<^WHd z19W}7uG+W7opR@RwcCue_EjXwk;1hObQ5&R=HrD@vk|06z!zCI-RD&xsAuTD_b%1b zvObqV_m=mw+tm5@d(<5*Z%gbuGgL%(&lG78MRX6+_C%68pjCWhbM1Cr(ghU}iEa?s zNK!#bC`lAX?Vp{fzS7PaIY4h9U9^wxWp3@3RkB-+&95mB*5A-G-x(GN&*WmxR%hf# z%HDIDXO-Mhgc+uXsp$=ciFRbPW{w(&^PD=&doO!jUD~Gs8?P4i@kEF^epvN%>!NnO zqoca9b)^JEE%~z|BnAD8a!yn>$Jx45#LLvJ9fA+Wbs3>f@0XzZ+ukl0#B=o* z$MrU^4UXYl&f2Co*++3ZVQGdL- zK4oNWT$ftRNME6zzR$}_-=(Wgpa1;Tq_2fq@78vur}2_0jcQz%*VV6YiV>g~i^=_(#FJfHOts5F_-yzYbT;F;W2p=RFiDajofkZs9i0<64a0=QSb|h6wQ_ z9kgq_wWQBhV!QBJfV5LhtxUU(`5W@>fWdVe~VPDf|{I^ zsNK|(#i%Jg>cJZ8-UH=uN*&)LLFho&8Qwb8`8^UVasA-EtAbwM#VEMPk}4^u@{1!L z;7VVw9)&%#jT(5U=Zi7Cml3y6GS*wN_jC2>+XqJS3ciKGNLn~FTmD-_n&7=dbX`vG z`UaA6uCRD>Nj~%5r*`h;kpthTLwj}ZA=RoVxz6}@328NKD5{$4v~QOq8tsQ)Ux3ul zLxN!vx(X!iut`51;rgi(OuWKf{25VwkLnttMsKvTQ);u`iF)RRYEt|4_T&h)Zqihn z^WP3CPeYsOnoM2X+f$zhkEmf)ZljJAN}IXuMmpE_*s0zg^GiK_r~vddwCa->hDfz; zJ~>16_sM1@Tw%#kin_B;u+i%ptC!GL(i;^@*H%5F8bI^a7n-kBrIn;UcBhNC#p!o; z;D5usdFtu+rO6u8uUxj(s zN2-}t4HstDZ6H=)d$|5>^+nxxgz|hl9{iuWI_VC6TN<$TGDUcxyjN{ziYS(d7)x%YOh5?GBEhvDbu5+CF0Gq75nes30Q zsm>qiNsn-&%wqKyd0R*7gDCUMI?Pf}-#b$7uBZOuokB(B|KG0gG`Ytb7U zqdytLs~@yuZ$&-)dYbz4ASmKC>bXIU>pb&)Q&(8wuFbM|!s%~b2TdCG{rOGkb2mE` z{B!JKFqL!Fe)l~q4_4H@_hq|y=X6>8!xS}Za1nb_9X~W#&A9(wS1|2y5R@@sep`@t(yDrcv<>gUHNdM3exYQMAX7@X=?1S6mF*F4ZB27sot7;Ha$jZUsQ8OJ}NsBFn}G5k#U^QQ$bjPlQPxA zuV$#XJ{su=%*o_K!I}|{2;Rx7Qy%RrdmE^KJ$kcTIYG^P(i5)hUC(2>rRf-;+XB3f zn2jXP7rN$F>W7mOUhXqr$oISCk6r*d706l9qn4GvI@H>c1e zjS|o!q&DXYy{y+>_AD2>Q9Ik=mFY?9_Qz@pW4I!c&O1>($!gr_`{m9F7-S^-FrvFv z&o%D^9k-cqcN6ZRAOWONaF*H zim)QYh)g_6(ZEds)xi7j!b^#2oikO-jcs5swm{V@$F}18s#@Kha-`~fBD~B54o*;4 zJ&{%^MK^UQUy@op=EgD~c@U`>n^vjzH9Rsxh%e6H#QcofZ|pbnXr86iTD*9K;yeWv zT(=<9C!eGdMlY(K&x(c-4mJvI{*ws}M6-c8#jUeQSRfw5R+w!nk~uGhiew&d6CQgE z@C#gZ3`=_vyOV&M79UIRl@ea=^d{iv?-HDJH0fB9;)_DpoTek&=i5f^|v>rU3Vc`OC#{L-$x5=L?OY_x3{)9AXeuh+V z7#8AA-GY?Xphd&+=PEX?)yxUW@CS65(1Yz!=S*lN`}?l_WkOdbOHI_AXKKlkOYQy4 zjTN~khe-HRO_%!YvuQboV=&K^Dm@5KGDH4Bo=9OaGe@3QPdLgN_Ex`tc3`w|*|xWuKe>_I zT~i;QJXr46TirQ%wEPfHuO|&|3!avS7B>d$VE7$`74(RUI|CvdBAmM6U%HIwvglvQ z+7C5lXDXag$|c_}44igx55y7V+EWn*#6{|!N2{G*NcT%J9_%J3$79{#_ekLh1{R`Ty~T`J)z;ARG#=dj|Y zy2$AcF}aTWOkQ_rW_aDXA1&}byj~~Nh^guFESGwGVQS-u9=s{zk$7YRx+cMa{}X&v zQzEY8;{0y?T6g=3SIvj0rlct?b>$+4Gkib@3&V9n-7qy%_Wq#mo|@%5hAe`DrpHoB zB5WN#wrR)UW#sb$r}Y%_iW=dPFp~63%2EB(fl7fHbXuc4e>nO5+Ot-S2 zCYiTMj;KbWT^@tsd$FWgT{o>=)nEys)I{RfxYU^Eda>`-fzP#acz?*0w1qq6YUcHnaR0(F) zNc<0K*BR;R@6T7L6*wcDqe18O<>}U2uhgNTS~#-Kf%rU{;N6^9s+c1Y~yrZ!+l3IG!!3xi3_g54hmqNvq-zMbEg+ z#d~awBh+tdCHQuf6e(GOol2&((*aVhB&AbS%l6}a`-RTr^HmbJ@p(JowJV}F6aC^0 zo)*+Fe+d^41~^DlTt(D)qq4~ERG*m2`Wun`ZHnw~Q)Jbc6wLfTrpzBOmGeP74*~F& zE?WDqyxyR-JN>9LQsrQMLbbKkCw1A2iM}Ye-ne%nnw_SWvr|uo@+%x2d~)ws?jzR+ zZGlfIPvC`Kn-7ICF~w1p4+{fMJv=bNaJ-Gn<4`_Y53Xqp!wbB=_a-#2614FVC^+2o z45P85LJ32c$2+KClP*>ltBrlXAz6HG@;BY*#s|n;U%7rOEIv2G;dB^MNZ`qlDl5!e znTO^6uQJ2lU=B-D0*H^tDW(MWaqJ=M)zUr0_lsqi474cccprBUdmimEaAfhZR#62rH&6@Xwz!(&yTh zzst4T=ibHVL|lL1VvlbZpAr!YD#fklJ)9J6O{+R!RxCelpkcNw{(tSh#N{#!K8*#ggj#)LDKh4H$?@eqGdROnCh)sm<3O4IK7Za(#(KCDHulj>-#mbRiHtD3Hy%P;1YeE?dB zr;_Ae$p5QJZch!W^f#k~o=B=%Afumx^5(8IQF1-pd{(%sBb@kd;@|1!&Tkj&M?HK+ zh#yK$JTnN-+@ItYS_uk}cLtOrNs?p4F#JyLRgwC~1P52MWxuXMkw{+F5%6aW~Gm;yVU(V?-KPK{^cA8sRep-k?9W%FLBDc0`2XwQ6 z8y|c~!~gNn{JCike);0~niYf;rnvbea~?NYb&Jb1*9e153}YR}Sb_X1Gu&$ayw37V zZguLsq&uso(F zx5VVlE8+6%ZdH55n%H=h$d%pzqxr@8ZV@y0dwb4df|wg_OWbfAw67{M!1;!wW;y34 zsSD>v>i2l&jC-qvywn}@D~kBIW#l?WH41V$J-?a!u1KYN>w+ZtL$^A7L4A3%TdYP1 zEC`pkxYf@W)Jf*KRAB9K3$G$_n;DDBV|bdrb;J9Vsy19$jiL8n*qr^TPFdKP9Z)}B zn8%K&#}@XD_GeX;JQtvF*Q&i)%7A)OkCu3 zJjw}o`N-GSL`z;i#hU7rTBy0NYgg^HbX0@avJUssc@{O!jPhg?sWoxJIDzdqq3!qb2nGqBE>oa&WR38?N8n) z)U1&6WJ=aBBx~4H!iGVz1~1K$U+AkoztrPsXSid(I{EJ|5H;YK6eXd^zg^Ri@R zJ>40DJ7a=(#xF}(HqxEpxHCL>XFcwGPIn%`okxOq4lPS={WaZr40j$grRT9wdU#%i z;C4{hQ3yNA2&;Bo?o#&Aoe{V*B6w%)@?>^GowK|;dfWBO^RrJ;sIdq&R$nKE>LahI#F$|woL=##2vMPuaxg?S^40+PH&wp4Q_LgSR_i@r&}o z3}#35*owk>NptH#Wnncf+@`t^mp;@ zR>;On;rs~aH^Qk)S9O#-->Dv7RbTFMr<(QlA-U_Fs%v$#I=55sClLGzBRI0~gdQzV zy6~PLvEIkk@vA*mq~?`Gj>Lj1u1z0QSFX;Ly$`8Ht6eSoQhWu7ufP;vfi0Q$P`GCh z?inMTT7OMiy7X$gq)Y@G6bFmOHL>L`f7?ouGKBM5?g}K=P#<5D9pSB2Lkg(s;x%b# z?&_Co(i88eI42?Cq^EW{Fw7UlI;o{vc&M5ufVDP4L_;auvk3QWuoAXfJKR_C9g7|q zuw9ZyfhL3If!+pf2JHYH07*YcQaq?8s0Apfpq|AW>~3ATfG$Z`ymB1tKW~Ro7C@TcMA0@<;UtP zGiSZy_R0E^ybUuVoT44gu!{A_PD#1|iY$isKq;WwpeCSppj$zAfrfxaf&8FppxK~B zptnIEg1!K42Ni=3fX;v%yCliy#Lo?&nxKXtFQ^Ns4`>i*1ZW&+GH51fA!s@1Jxfe?S7D6i{tY6Hq(Qt)RO=LqMZIe$X_~Y|tXm+n^6YUx2oQia`fJXF!fUKJ-3& zAOTQKP(zRx)CJTBGzc^TG!8TwG!wKCv>fyvXftRV=r_JrF9aIcD z@Hfi;41i-lqyV}BR1?$?e*^ zfZU)Opt>NQkQVsw1nLPI;KR>DpfR8V&JrF9po#<&jHXGkmDev0OG0qFOl!R^`bJ~ zgYy3`<+Swo`2KsME;RwZ|EIY>hW7veHUaqkc&;?NBVJIh13aB=y38)?DR?uCbA)rwp|6!E>G=SNlMWDAqAA-IBZ3h*D z4uH;p97mv>KsSJDf*OLnpe~?3ph2J!pmCtdpqZeBpyid`dkRW57PbXMo2Mz6AUP;jnqmh|z>2fgdGY z5qJdQD!>mDb^{M}NHC-QlA}5BEtE#Nx|=K=R2d?WDfgqs0( zC!7!5jc_~QE`&SJ^Eo4KqKj_0(SdMJ;I@SC0QM5@2i%hI{lLu#j{t5=_;KKdgvSG8 z3x>$#MBrS)(|~Jn>_hHn;G!nomQ3kmlE{*drp!0!_t2)v%~ zVBocc9|V4z@NnQ2gdg+aVkuob0sJQ6@xY4+KLh+K;VHoL3BLe5m+;HLvkAWnJd5yK zz%LSB4g5Ue_kpJY`*`j@!o|Pn#;3rO2>%=S8Ny!!`w4FYev0r9z+(yj4E#9Z-+@OF z-VOW+;eEiv2p@dK>5IV94N(NgaAOGJ6TtToJ_|gM@Fn2>gdOvp5tynK&qf2^LAVld zFT(M_JqT9^zLjta@GS!SBu6GLI@68Xz#R$a0kx5(Lp!0CiX0H+Wh4V*-H9B?Ax3BWGGlYrw1 zPX(?_cm{ABVc#rV#L&eY;7Gy?fWrwd0+tEC1zaNQiCYPLf$%!uvxGMQpCTLpK2G>E z;3I^;0zN2{{@;d+{dD68;Jt)@0p3G+C-5%9dw`1w{|)>r;X}YX2%iA{f$%xt?+BLw ze?!=@0Q!FmUBoPKM*N$w6ZkX23h*a{6M+MSlYuu9&H&y(xEAocgzEyYBYY$9YQoKd zS8~ktzZVzF=tg_sC4{>Gzd^VM@N0zo052eXH}E{d1A$*Ad_V9@gdYM{2|ofngYe_P zzUS!TDO^k;{50^hgr5a2AUq9t0$~*x>z_p>odf(N;rYO02)_pW7~#dhBMC1990urMK1X;2@M*%Mflm+~2Yi&U ze6Ho-y(blcroD%z^@Z#uR0?Z5{>|Vg>Ve;9Kudujc@|+Ou{z+zd+cRhKuQR zQ4@G7;o88H3D*anNVo~`(}Y_A8yV;TJdXG`0Y5>w3-D;d-GCn@+zWUFlYF9b-Gz&X z>Bb=7p@bg-zMt?Y;6a4P0pCN|2i%YF)4+EUo&?;7@D$+N2|o|qo$$<8eHa+f#T?w| zLU`tbjV8~M1% zBis(SHsPCrvkCVA&Ln&%a5~|8fl~+%1x_M70yvTIXkZuNr+_iRDBjz-02h_%Vmfdf z;n~13gckxw5`F_XobWPWnef|-)HlD)sjy{{)A2W!RTnpNt4F>a*UUd477KS`vAocW zE!Knd6D5iw=#&n7~*1A!CTw6E4o05t+okih{*ErC5nh;_#^bzMmv}C#rvaU!ToT zt8Kp_<1oDe%Z~Uu{oot07ELUS$D0Dx)xO))WN!_1{PuM0(|c{Z+TfH)N~cXyI%|^B zd6SebE^=!A@p27y+7F8F`Hhwt>^`U9Lv%>*q3iENZ0BBR{c8=+zg12&2+ z9M~wfC}5-5Vu6ifs|1WEw&v*2M_jU~P&pShLrAkU}2_;D~Jf=rz^6TAvG-h1Fh+IR=Ri?Z=jK6fk8 zHeMU>Vr;yVzAxNLMH@5s-)<$=#+w0NoQ?Mfc$I9tZC|<-r;Yd4S8k=UjmNgQl`7x~ zMQn)m!>`>+Ra?M+gBNe(m4K(%c!^uxN`j4-1)j^s>j|Da#Pf-A4}e)M#1y<@@Dgpj z^l#isbsMiGcsJO1{lQDJ@ty$BW8=;J#^+X&ZOnHNFvZ6E3A|JrFL|3=Nwe`j0x#Xh z+XY??8!z`;x01nm+z>Ow-xbVETfn*CW!ZS|f>+bV`xU%w8}BrDIW}JP@7zi)6VJz+ zU1Kn7o0yz;CwO&iyeGlSwejYHmuKU>3tn9t?8oX{cUJ-b=T6ie`Ghp6kVM>liesL?^ZM@gP>tW+<1Fxrzw;#OQ zZ9LbnZl#xvR}Z}2J{$8UF#Fhe_keeYjrSRNeQmsdz`N7NbN=R5?y~W21n+L*`Hb4% z7tDUPfIjg0+jxt>8(`y|1n(XjugC9hWuT2W2E2Q%JfCABn1ifLM-h1U*?1-34Yu)m z7P*!CZM?_88)D-<58eYd-a7Dx27K0L_cNFe+5(;j?;#t{wbQLUY~!^9Z?f`8*deO(`~%pzLj|KnEX+jviax4_2R0^UL! zZy9*6hIpfRldT5*@tTd-47}GlkL*8@<3I86qEJA=yXSygdBesV2i{^EZ#H;u+ISy= zx5UQV0p43Cp0NKK9&{^9O-!EZ3kbN(#+!_A%Wb^-!CPVDy$aq+8*d|ct8Ba<4#NI> z+s0ga)UB+x@iv3E#>P7f-dY2ZEAQF@`oMe7 z#(NpO_ien-z}sNsC7i&}E@ak;cMJya19LcT|E&k}Lo*Y+zfQW9jW%BRDYvr8#!CjT z(8lWmUckm14BkgJo(i7tV;ge=n4j2q#o%qW@fw_VE1%kUF=yP$XExq#;C*i6%>eHU zohR%+A)4i2{@WHX_pDp_(#9JJ-d8r>jga6L8*d82eQo1y0B@^>hw|SK<~J6mqze?t6=!2Hb?a3grX+jzUdE3)w}fw$AfOS|Y+ifz0W;O(;V ze2#u#?zS==W5D~v#+w7)9vkmN@cy*%egy9?8}AHwdu_Zbm)y!ell>>8P!G(%Z2|uT zZ@-OqAmCR1vGKA#aw`XHygA?%cp2xBtEY^MWm4&(Gb;MH_E8c$aLvz2KGDcrv_el1&Bo1CIrHWdA(@rW|DI{=aHp z!l4-AiDLQz;T$&JVerCjyvlIRMc8=UtyjUu>)^vnB5ll`2pDDKZ2>RZ#+!v_V{N=u z;KkW^$H1#(<9!RB6FiIkSMe)23T*+iz^h{8%>l2fjrR_C@iyL&E$|cCcniQw2=Q(a zV*LqBSBNQihrx5(c#&VjPxz5jDZxPjVSKL=9bzCH^o7MU)RqTsZe;QOSH7=o-@nDJ zuWmZfJKIxEXp4(pZFTT*R-~>!_?4V3aC?# zq$_Rd&KcY}6MW0ZM|fhI9j$&#$2at|%)1&dD`m<9JMQ_0`rupxKUobc+HkZdpE8j) zRw>FHa$+xk|*WxBLUSvkJiRJsvPUk#yhcw6emkgZ=*_5L@ZVlPtA}#;n=tu zj?zF@#AfrDR=d2roD%0b&IQ1Wb($jf^kHogThTEOrdqVE!}yhUsSC@A4n?kxKHj`_ z-*WPSE!(aOrhHt`^C1p}rET2aFV%CW6Zv#b+zI}Qt}R%7^DCyGNRXwe>S7$qKDeAW zoyVKb8*ft2oygBFFI_k$!F4Vedf>^9*(1t{n;)O0AIK`9zI=DGR&>#4ZZTmo;SIII zDUV{zRME*qda&>%0z}DnUKax4Yvc zjveBiufKs4I{Z6O7gG4iB4YZisDs{w*0WUqfGp|7Gx5C84yB7C?04GZ36&Wt1ZD^M zDJ;b}uhpaApuMT;oYVDl`C;nf%xY0ERLz%Wqk!= zt(i-Ge|99TNJXw^pK>IdEhRs70hL+Z&#eKwh_0p(9=bR5czCnMy-PJ#? z4ZDGPGA+`Kz*_rl&S2YY7iydQjaf((|FQ+&Ma+wo2X(LjbKrcOP*CyhgqrHM3#q<` zpS4W=HNg^&3pfsO3Ft21tECi#z4aQx8}a%KaJ~OCk+mn{9HRw)^t{c$%@rHH z`FV5bPlRq+kHfP|bc~Z?wGzh0XNL_gy9>5xR&BA&8sTJJtw?6W_2${kq^-3V!&r{X z=xtnQ@mi=^7fxsmoT;pyKV6MlciU)c7C6vD?RGrL9K}Efs}&xbi5j52=s?*>)kWE) zX+Jwye6UEJi*Yb=HO(2$qJlivV(qIKIaJOTrK63lz&v4r=^6Y~Fn%aF`byr}WNA0e zWHIIhoC;^2>LL#rIL`!%pPw-2&&1*H{69TY%Zp%Lvv0U+k#&7RS3ssdw7NxuVD$yp z$6S-~=x?sT5|vt+x~)QaXa}1^%D3iWbp?@!q6#b_QEJ6cLD5eKD z;v!jkP(<|?Yuz@pkcjw6k%x_@pbd*;nTg&er9_1T$h=LomFB3LF4mI2G(~j;Q5^|J z6&J-a^Q0CyuHz(s6#qCRhNn{Dtq+*@JmT{`MkDnu)=JJYPkTd)^CSF@8u6h{AJywL z*Ao#9CCPDImzdYV4~*CCqL4z>K8s>$;r@#j*tLu4r~QxBs~6Ru1MDD+fS0e1>bQQe_PRLDm)l*=3F5a2+x-q;-xdOV&8} z4YHmRV=6YgtgXeiA5mqMC2L(y`nNg)2^m`BiY!U?Hqv@kWLZI}^j@s_E||*FB71E^ zMV1&R8ia?JnO|}gX}c@3UI~(m%f5onThC7p3pl0aTGv?CNVGKlMCb@@O)PVT4-rjz zYb@)AhUbZ6X;z~IYodZi2`pD>s@5+K?MC`j8;k!4{#_PCJtvOUN_}YY6)Yg_FGSC^ zRCFaK3<};8XHs!qp(p0YRMpY8RbtidrU$qM#y?je?EVqdE=l7S;P4h4nqbkmBHU;S zM_N7@4u__4OCH(l;4~G$xW(Fn%B;Fp^bw2U^)7(@E+QU|`64LjhtgIbMRb!S?^6Ecdd$}k5n%cvlW`pxS;KkrKXufn-k!s4ui5jMs=?`uOVvyj32 zl1OJre^@(*?<%tnqTu_F&D2^~VaYx(;&Z7BxA9i5oJLQNHJPp#7jEO4}6)XYxY8IXBC#4ypo`j4)FxP7-n?s;PIkq$BzhGr7cBp&tQ9v*#=BV$8ggj++$_F|rI)^m52LlXYV6+ZqH_9viz%kf zsm5|6_;;=FnyuAXb#_eKUyY@w8ubYSHfdN^umdaLg9lW7BqleJVYH)dZO>dXi_l7H zvQ(bNuFvQL@idlWO4(-=JC=0)z}Y(iE>oMr=c(-QPPhvv%3sw8Hx@ zrLgANspUjx9kKlN7E3EVx+5aG`KgGmZaL9ehGE*IrF>vvI4$&gpB1Y2!)laK?{h`H zKU9Myxb$ztS@VX&T(#;MtWEot<)p;YH=;8Sb|$)6DO#o8Aas|CHa-nSCcU9us>$t) z>DpDKE(t=hB9a-A5LKk|PlQfN%J zHdr*45_`|izH+woqWz6T;sE!?J?`gfCrXp9A%3~$My;?R~_7V z&D4@Eu^Z5JaA&R6#vXB*jeV&OEH-?Dk^4*1vEo|lMd0KXRh}OquWf9|nzSk?r{-ELTu6mxR3bb`H&^XLaXzuxWjOs!;V0;gaxHKC z<@HC353&Wl^Rx7XyDpTVGM45S%tH5q6Z?;(v(|hZ3_&JZ1nJZTiS9*=fg7=eFsYXk z^qr-PZtyx4ctWYYLWatRYwtG}N~7}%)<~<^1fI4~s=4x~YlYX326L+LX01$GyHO`h7fns42^fz!Uz}wY8EaaKSWf#wy8yWm@NE zEQ{Ze_SWV_l%&mU#!^MdZ$!wXm{42H5FZrKexE7wVw+0RrnJ!Qrj;#NGLOJJgN^+KcRF*zAqGP&r|02OGu2h^nUE^tjc}n;4XY+wZC)`8{>C!(P@advQ5U#j3G~ zwbs3tMu&smNk%Njc*JD+Ty;vM^g5E1Ln&Ezy(!^6Vi=FcNQz;Sw_!PrEJBIao0Rxw z3iJT~nnoFVnli~-WxOSd3i>1uO{|e8*VB&WUTr6F9gpzA7gWTx%s5f{uc#hEEruou zwJX~ttvWDIcZ*Q4IgtCtf<4eDq#>Z!xvwhN1CcMM44GfU7?Ua+Pf06FO5iQAq+|=F zga$ytl+e5g+S>Y#7(4w~PTjMbItiWlEYbQHVd_K~UX(wyVV&UQLgOs2kKjA-{A+Oj zK5tlPkiovTWpuj94sfKA5VjEfU@C?;6H3 zHUI6*d9~dh^#TBD z+hOq~4qx|UU4nChV|2x`S$)+Lni90m^7iVFftWX6o8BKig}bvYx@VV-q~*r;fK|`{e!vQ#cVVValk=VPE2n&`8>UT$^|r^ zM;m$%>&-mc$M>)X3XXkn$@nT)SRh4cYkqxDyYw(~X{iI5%fVd`sy{PB3$G!(F4G4x zPalhwS%vg%38xDhahLr8oCv8c6(8_yRM`ZBSy)0ecJVYxQ#1iXlBgxU) zSw8V4j6AqGxWL5%ihgu(ghv}V2#%HH2o&W>ZqcP(IOC%M$pt zUh7@a0rAnn%*uW&%16zQk+g5_XIS5&{c=CcP2g4f^4ce+>Ugs>o4%na{o>QqdNO&k zL%zSz&|sh?moP;`!Ar@dQhqK=H=9K&uU)TO!;! z(Z`Zv2r*e#N4Rl4!ms$hFZ|5%vsjMsueP)4-zQgF@sRMiefbbev(}C7C;>haxxgJ! z`nM28gUX|1(VSwiV+pR0f&aLbP4dl*ny+CfuhF!z{f=TRKc1FVV2z$49JId#mBB`i)&F4~8N$S}zUJ z%%Z&}gQ<*n4jaL$x9nB^J4KDHYLi=~pxizi!Lm}(@hK7h6datBVy>f?Cy_)k40-3S zfijXMMA5(eWL>u?$YR6UfR-7M+(((q_W-@KJmu-Mi9#$R(i?9K3piuYS8ORMar3Vr zWug(s=#5yk;aJ=^%f}e>W10<0wQ;dlqYrDz*J>GRG!~H=YBYx71KqgBw-Uut@6f}B z!_A(h`J^?bHP_Fx#Xg;8#<{FmjO*gh zK;LzAp-=T6#;4oyQlX!=z9qgWF7UU&Xs7~j2S)95@Wf$@3f~YGYB^%veC+S|nsyq# zrkx7cbE>-Om~egvbBE7Yi`-!av-roNXa{&Amtp#@GwVD%a``6>s)~?1gjIIKSitiN zzPaqe^UVSd=azh!MSH;81!*8mLYQB2A)JDbG~_TZ#V5C2yRg~-Y2u|K9{>HV z(20jdZ#f;uO7L-Au}!Nc1eqeXaO`?O3|#rDQvS_m{vqe!ceasVPiz3s6&AN~{ZWX$ ze^j)4sdm!`$%C4BKaHO!A^%87CZBCbB$yM!zjn%piHSc-5DlHM_)j^S;!nu>Ph({| zMofQF)DP%Udr~QC>>w0r{yrL$^(EqUafyCxK|_y<8i#Tg9}PCb_)rOgf^g}HL0}Bu z&X<#zzmS-}Oo{o664OB>W|!*^U2yz^&5H0~6c+d4Gi8wQ#QU%Tf%EF%Ft zXF|E(YEtg#J%R~G4-!l`_hIhxm6FmJp3;C&Z4P)T;W0@;;&e^bZYWpTPNA})uK9P= z`HmMZL7}d>S95pa<=UFGSWsIVTFjS;hKcTq>q!2Ec18F%O)5-8SQ66PU zi};aP-fub%mxxJcp1Hb0A?<-4L#pk1%;GCT1>{2=)!#NreIv7~mU4+zyY5Dsf)qgw zZR3@W_abK7rL$gh&1LF=(}joOwhlL6#OLc_mNXNAuFHNghOgJLXk+@nSZ;ZGNmbnwU&2y}N z4qyK$RGc4u;{`MU?vOU~XaT1*L7V@azPq$Ei4ML}Ld)EXeH}B1X=J?feSdsNUCP$& zP!~onVC&M90g$s8@{u|B2qj$Q2MT>LGIAjvFV za?*9Qi0j@k32vxMh}+=j3O+vTCAtYr3ko;f@lC}J5KmtL_C;}viSMzZxYEQk_=1=5 zjEg(r#St<588HJg|K-p-;zambJUj-R9&Pu_Sl&u;>F>u!wv4!@ayQ`BydU4wGM;f^ zgjvq}6U6%u^Kb0%_hS+>5|f%y+WwbA@~R@j;L}%Pt7QbvfjOaN&Sm&SkuG&zeuXlm zp-rC~N`HiSZn^g5yiiB)tU9LH6^(y4W^hYYrmorsrbBb5$5RhYH$)mqV%0 z6D->jthbKi{Md;o346-SwM)OZlh3STD`si;uxYoTtb6b3ar)1f66foBoTc8w*GqVu zwtITEp2V1{1NNAi%7N$q$3<+7wOkrw8_B}CII4zV{!JmRrZFOGTGr?7ZO1$Eqw zZoB2{Pp*0g zqQlY@L?<>dmKR+a8yI!-xa^&wJIYC+)w~irLy;1`Gn8B2WSn3VL1XQXlz=wUN;{Cbru=@3-pDODHjWH3ywbNb_UnD&TPm=4O;Bzm&!-n#8 zXP4e#YFym1kT<>ZGHt?PMx3dmRuykqT|HwS{lPOug=AQvQrpI%VaWn#pxG*z!|S>$*}x9*?VZj9jbB z#b};<9K)A2=?9X)3HP%0@du_uQyMJOnirZD5?e>b#)Na54;en4IYArtA-31^Etad` zjLJ7zxP6D;`00w=*^97A3{zKph_In_J7RsgGKtxvhubG4E}`W1%u9n zF8hRK-hM@yz)M4mE+gPEHk6bQN*TxYcz0U20KBrydem3xt%LeGZdU3Ys!`>$$gD&e z8)ju7Ud#NH)oQ)Sq?|GB8JuEVTuv=4{q5WYF}6H3S=hhk1}$uhgNd7E=@uga9}*O@$~6_<$SCVR{ST0S zoZrS>`sJ=R!S1!d(Y(uduYJ5sA4^>LAB`o7w7Pv*J$qL1Lc8yXpV&sC2VaR4qf@l;bm_;=7jZA$np|oV;3YlBp{G4>qjwv|XhQZ_F6rd|j)6T4R_B z53#~~FH~YN=fV#S_(|*j4fhS<1h#MB!|~px&HsiqZ~vLS^;hB=Kp#tfRgMO*c3Ylp zbQ+^+?>TlCd9;Pwtec}ZA)tQv+yGQ&9FB{0?cc^S)1^PFSWQgK0b*JkGt-z_;3rPr zPrjMkzh&-nQ@y>MR9kz`HQz!Yx*)PN_8p7A>3XGM8Hz$%oTZOiUTvi`>22%T7C0u4 z>ubKKr;KV(kCxZzp&#ax8Q0*9zlMrP?de+8;Z;`i>x}(6^z(l3$o&fhQONyzhKgU#z+*B?5i@74Gx3 zGQs;=+Ak~%%A@lyEVGr^X|Wf#5kz<3V^0DPzPF^3pC3RYJgM-QVXV>WSAHfdzmJs@ zVmR-x+#mLEzg?MF2W}}*S~~yF8M0-|Iu>&TMZwoS@od{g z@wZ(R5YPTXZS60Zm?C*ZaCyM5a_KkLO*u%$c`@QE4i4i7{*I0H?4hy;NtQ(m+Q+|} z4C%_twU{F2xydj|%Bp-_`PaoU`;k#w-+0xTIb%@ZVih<1G%+Y>y<%!3i&!nxi}^*O zdVHq;9V%jt!R)&W2X40B$x?v(?FN2oCyPu%U3Bd%DK_e(_3OaeYdaZE#L<4-$@1_Q zQOuI@msu>BeT!LoEPp&YKs$7_DaEXMsT#`s*#SX^<~cp7!pgo)g7{D!@22W_3sxeQ^1rKcI|3D2DobS##gGatg)rZazw){=_)WU^2E+!J&l7e_O`1lvsffnl->l@%6KGH^9WdnKNhg z@_LSQUU=HkGI@ghSQvfI@6=Bo4up=v-LPCM{F`|i8HvVhgUeyG4kVgp9ZLU9N@%%+ z;UqE?7M%@Zw5S4F>f--8MWp-p{n!zU1{3!W`$PGHl+59cm>hh{aHK~ZV3}rXpwR)A zu6#*Bk09ugr;K^TVFy^F`j$$yNy0~q`6M+}mTmOhQ9O4v_}q^NSeuTP=U&Bg%=FxL zdhQsWJ7zowsT^x5CUkgMVQ&8Xkk`YU61&!3SB`@qzau)NoCZevIoVRiK8 zd=~MZeQMWcF>!%-&+75=-M^Ob(G>m+!k;mvA4j?!!@7o!E3^-eVf|B^&`bSVP2SX!UOLXA5<4Dj3K1|zn-%q3 z;a+{d8;^Vct%uRP$MxgY0$+>vnWT+5&SLosq}#PA$8iwxEp;rK%u=rCAdsZ3$Jw12 zqUD^>r`$}VUvmrj_yo&qf7=TE`%1k+sg)erl6}rN0*0(e^&OXo$NK$7CryV@-@U?W z(m;!vI?(wib+Pdd^cqHO*D>OBahcHqFR4*o$yn8|jcCB)FYBYZThQ7^-z@s*mrgTJ zvVU&WXxTj4$j_)T7;pL*8J8e2#{-G7ZNO5SbBbl4$w)B3HdUbwcLL+VP z8Q6RySBTCUWsAWV?T5Ldju+k#LxmcBbs(y4&^c&25$raL9^+eAL?=c1Z!|UG^6a?Y zaP3#FD`jHGJ%2V+d!dKv%Mnkl5Z|ZBHS%0W=N7>~WI)}c^aOpnqC7nT`4Re^9J}Y+bBY`;j}|&~m$3s}+5GY!l#M^>x@EKT8f7!pCY!ywY&Ku5 zY>?E;>&@Z+McMr4Iu*Vc2K8;UEQ`;i(6s)3S;mJPCYnAWNXK6WKiB37m-%yIjg$TJ zNt?oCEZm){6@|$SvQLCMVf|YgWQ_CCzeRy+%^Y%C82|iHe}`NxMtpAR1eRfe@r*<6 zRVQp%+2)kRM-MaZT+o+ZPBQ0*>&e^{j$}ra6T3B;i4l~{{0KS8lFa)f7jxH#_g?K#oQyBYb&gh7waRetKw98l zR!v>;eN}U)VU_ey+TnE81`T7SQ}&d#4J5)TW1@9}mg|%g!uh;GfmZoZ7SASV{hTuY zUKSqCtz=QjZb{2?%1UJmvl13N^Czob?J)(xqfL!f7-h^E@|JpSQ{^=+2`h6FUVQm7 zL)}=ty5?*vhx?j7hw;TkH}_#R8zMR5ZYI3v5f6?n9?mD+MPrGH4Q;`PeZ)&Q@d}714w0u9|BHBh zf1Qz->BNgS@l@iW$b#W!=hoCy%}=a09)5)ahMRb=VZF;u^8Bbbhw+4eXM{oyAn%J*%|E@MedEi`U&#Q_#2-fxBVZz10O1MozxwFNOH7GzCUWm z=UCSON75N>tV{05c4!~FslWGhzdU^RYa= znwcimM1-_2KH_Z(7*63#u0s*-AA0d(3Ri)`nLa2f!X2h?ICVfIFiH>S<0k>Q_8WB) zDKt(Yd65FfP=tKGeV-}ZK8kQMg^Q(drb9Tyi;Y7###6XT6i%NtHbwX+MQ9u!T7?3d z=8Q#z#)5^R6rn=lXznp6YMOhD7(n6N6wc&L^>+3l#|P-ey(nNJ1>`FZu);kU;a&>Y zg~HuH;rPmjzf9r&qHt{}oQJ~kg8=Azsv;x&yj1OIlH6PNZ_qk>r^4cMIMbC=`qtN36K4l zDd&~>rndBmX$XWz>SxK#Z?wPZObNc?YkFG`dX#!S?)CI`e)qL3=xOCXx<>`zLR&zz ziP^e|)+Sr-s60SH@C{nmaV$5}gUrvC#a73Ud5}jb2tIY|IuQ)w$k7zt5Z_qN1Vl5|y_P5ET@Z6!qkjl#~?B2PG;hDj_N=l6kmFMn-8ujwzZY z`6yFV@{pOLV)`qunUPXaQ9mm{bHW4p8de!GcA5Nu3LLTX<#`aSUx2dQ5{r)So|V1mcbEVsU{ZP zQZ(7N63Yp}@;$NWmZGuvMN%%2V7X2#x}{Jq#BxHg{6Q?brBE)tD3@MfQ6jX#L$?&l zg;-7q7FS}?EroLF&3byeQmn+IqMW<;z$h(s zb`)#x*^5|o2V8r>;UXJ?eP*4_D=(QL5z z=GFCRhHn|eF1=T5JFmV=%Abznzvh$su;5uZr%)H{U~v&oygj|`JRT*{PV4XSG!B1e zZLGquJi0i7GjR0-QNjsR-u#zn=4=0}53`uqxD0NN!32LwMyNO`w=OU6>*&wlf56n1 zSI4kW_CyA6`XHKiY6kE2AU3jqM+rPFgU^4EjkR^>PV>aeNldwg;PyCE0uZ7Q;t-M$ zG7xeRHX`gnC`WKCKBh<9zl=&Hn!JpfPc)}xR3;JSWz;gF$;+q}M3a|MtB58qqwy@bV|yo}<+C@-Um_}+)vtIb}^&{k2W?JxFc(@kxxe{|A5Qx0>% zaPDsXgJT2j1k3rAe=vacXqEFTZpLAGrnb!Of^=&vA2^WV`3aE@Jx6_OAO7~+7=%^` zRNs6<`K%nsUJO>#i#re^|Ed7+1mi5ONsh1`@cAIVVBh#4K7J7Mwunp%tW(7j*_Ce@ z#G0B#w0}ometZy%VPBT;JA>HtUi)EgH7K6El{&7UhM4r#bo34-%3?L;Dnqs2VUOTz zt*nRVVM-@2eopfXR(8cHewfzr7la2B^(VUF( zHzLYLd5dVWQT|0V*(h10W>>ONHYJ*Dlx{?mjk0xQBWrsvVw8=teWbd!ZyvBfwaT2N z&iv!2nLppOmw5yngVUg~G6HEAcXoUkJXajtChI z^$oLr)*09KF!thNgo7#8IX}_d$nW+r7CdbvMUnFsZ3?j*zD(U)7_&e#EK&A6yn{q_ zwc;gN!cSuF!6#0OPoTV{=^=_)F`W6cCl>HmhqKXwT|+fV@y>m9Au^*;Dg8#U zK0O?@LXp~eAWbdjHd^G$5v-e|X8Jr(uNl3Kr_q|JTKG3Lqd|rg*eXt|Sq&o%yl0%$F}1 z$(DPbjttB>3$v#d6Iw1mXlJ9?S{C_fB)+B%+f(E4Iy+(B7++PxxkTxxb;J~){2)K^ z2piGoy9J@@u)Ni*_=!t)caLcgNB=MA*ryivhO*awYfhfM6s0{-V1 zwx(I_e&M^_EiDRGx_AmvPdTD4Jjw?4DEFXj&>1R@h;fWMLrY4N zjWpSgGy}&nzc5D{*)8}G|1$6|bMUVoiy2`sMP(r>%MtbASQgwanxd8>YN=GwrJ|w* zU*)^=c73p*?3l=0`6J_49J4Oud>ji39Jw&m`!7xB;;-7&Qip;fzZl0(vvCXg_C(ev z@QMG(emjwUCoY+NJs$lq^#E@e&w_f*C-G?Ft{D;9;fA&>5I0R+He#ZOT@2L)ELh0L zO<-Yq`eAx{8f_ivX|z?-XCXZvMN*A#A(cnFC&E{wCRZk~kMt}(^(>`jKUjWxjCEmI z3whg#EG%>xDvN7w>bnTBQK{yvCzCdCkZjgOi~`S5q0;m6h}txf&6u>7qG%IDICRwx zX%obP-4qr|e$bP~k*14B5p|^9oosFcEwy=~Ewn{8h#M66wCwjTKG)rIt=y&UV53U@X;+s`HPhFt0#S<$Lq^0(pF)=fQ7JW*3+; zfuEbgyaPo|?`8iS?4LW>U6Qb5{fuf+g{UgM7Cb$PwQu*0q=et01hIJ_a_rByCbQoB zvm_|tdrJNZl7FHnM`b>7R>Gji|38#)(pd?wKK_4Eg8ky-*oktv-b;*2+`ldJhihs`Ndm4jvWawrpFzE`?dzsK%<`Z9&Qkbx#p}q}L2= zL0P}$*Jm>CN8`0Dg+mZoioa@-2Ha6?(C(L6es}AyyQ?MXievtp-;QI@F ze>wR4W*XJ#wDxbRQI90`jwCB*vS805lA3Pqk^vl^iTx*CDR2BuZg-H|9X&VnlRJ`9 zut-!rX$fVIi^ATw9ZH!ni#^r(07a1}b+}8~o>zU&dyDv=voL@ifwBBaJ_mo*Hj!Qw z1U>hg&FoG+#VwV+5_qAJbkd>>={`thQ^sFugzaxeF}2CXHIQrYBDZL~sH3V#>qKO| zWDa}P^e^r;m-z?QH)8EgVTVl}b~s_K)_^PKvi6;tm8zyK{IqI^`mo@FBrc95N0GCy zdz98enjor)_6{u7M4JpOXu$NxYaV;EkD?o$7LMgL6=NKA51x54UZr5adJ1B+e*-s?$r@&7Kk^K52dI_qrC zNebnIo@9RfnRFK58ApZSMQz> z^L=Z(*~D)GzsbSBWImf0y#T%t7p>Gan|e%zm5rGHVc1c-MFu6Mr9NrHD}$Z(%%&(O z`{OqlXqLdf;?9di_=7jPhY@Rd9IByi+HOmK=Q z2WeRfTVAn{jb>O3R#bUPsyEey+Q-__D1z8jMlnIO2m~JIf(*33G z7T1ADil>j1@+usvi_Jfi<$z{7JYX*K41DK5nw?9gW_CR?;lPhe`JY7o40$uWo=KE} z*EFf`X@Tdf;h!?uIGfuJr`2ilMyxy$@(_v;N)Rd# zst{@slvl7XgU}Tr7QwMPt&F;Vb@~O-20FPtJ4Oe$*WUKbR+vS&7!rM$g9&<(c1n@+r{esjA9GbR;QhovKY_c=)iIw>bTn| zCi;qvFI>vHM7L?CZOYuGjs+~f9P9LI7q{jbkC~pLaO3BevOmn&+29|i;}q`aEI0w{ zXWVZYo9fw@%930g%38mSO)<6M*O%c+XU-w+myKnMa)gh}X8w_b-!Xc_kay77E!{=e zQ~UXF%FPU~W7hmOa@&;6#(0jQD26CT?=H0QyVg&-ha4xF1PFl=IJcTO} zk5e+qk0QsFPqAP&cQN1j6!t^j-|1v=A+KWJ10fzE86guP51|O51fc?<3ZWK3*(O=s zJZdL-M{ohrWQ)rpnv=ynO+?w^RuWCNxMztbTUC`>B!i3c%ceS;JILpI^_~;zWc+U|l9SM;DD{|Nr&(A38 zPk8q~HSZ4DuII4TEy}NAUs_BTI)riCKiFQ+%Z&-i2d`x5ZBjYm6)g`5?H2@4C~T-$RX`%s^Lrc zm}l5n2Yz@7f9n}GVNw&bvsVKaUQJ)R=M;x&vk`1;s`Jqic!1P22oGRmRSO%ip1UW0 z5az3bew9yN&HAwNzxevqtedCl(vj1M4>-f z7LjV2!S^*Ix0nQ5Y&K9mKvwJ24=ZNm6(zR0pIO2mc#ipwZ?a0$+v+8BfCrtR2dQdy zMP9B_UYJ=pKFk^<^3vW)sg`fj^sC-NGw~JAF}z&COz%@eaV8RT1BofkW0WNR^>b{* zFu^`CN~yxPc*Hky)Y?Lw>bydivZxU$rTrOXHFphepXuzo8)293(qbO=9iaPf^8`4}az3vcipU-?lb(Q=M zDa3=_*ee!))pl-Gk+qVb$-mr{+cvmf6T5er$ioD);meuvai-n$rd%SR9nRQ z$&bGfX>#YyUO<0tO^i5$6bnC+zt;~|*+P4>G}i01ISa0|(O8<{Q6Bu3fq&h4xD-T6zk zGv-#^c*9!k&)e+AR4m61P15%KKl%nLUAk${6Va;3iZt`qF~0%#r15^I<~+VzBOa$j zp!BOLy*wnh>IQ$z)7P=~t(>#qzpP_k?VhJ3@|7@=PwS z&qjLfa~7Gh;@_-iLD6Ltcb^6{A5fmx&3Qz^)pTnL?^D30dYx!I+qVi>m{+B9wtA7* z3Ro|%pD2!&vU*(aLe|;q4#nx!&{V_c7qTUxEJkZ=(!4_>G}Tf&KL&*IJl^VMHfUgT zVs|dap+MEe`V!CmwdcQNvhKX>Wj0`N05MT>Im(68akPZ)CObRJNKMOaoCOtpwfO;_ zx`A~c9R6Qq*y}%J=*n62;F$j+!-0RB;TvtOyI^4N;Ct*1SXDR02VLKSRgMjBSL29i zidXAE4~T$EI#yFq_gY9n!Xk@vO4r6xy55r#mo#|C#Vo+qa-WlDOgVyQ77+3gwjq=v zoI$8Ys6(*4&lDeoa0DxY!!r(zx!*I6B%16QA0?WTXPiJp*)vWdn(P^qi6(o-nM9L4 z<6NT2o^d|WWY3rx(}-tWMvSs&ToI#s#%8OsG|za9x7y4GwzA?KBNYuJOzJ4wmrvfz z<~>-D<+LB9R2dFZwcTU)coA1jB1IqimEYaWvdz}koeSn$d+^;wEH?0UM{w~Rl(g>`gQ z(!1aw=~xY~Gn+c`&$h5p=JNKP)k``9wzAm4NB>Lt;gZzJV*7A?{!=jZ!R|0i7k+&! z!<)}>C+KX$v+gc%7vKv`4{T?=BuoC;Ma|?IjiLE ztIW4~dEamni*MM$y0Krg_?T_1JIhJtE4Hz5fw$2QMa#hTsMFQAwQrD$r2tyV9i`pa z#`^RYx1ZFf6Vcm5CB)DrDxuOv&1E_&qhEItn(Wtf+5eX%l#dDL4VzgHKEMlaCGPP$ zp3H(#@G-A5&-VBST5cxf@Nt3VSgv6f`V*802HWc_JJ1Vd{(Fn@-Oli$&v{S}tOaH1 z)>6Z_?O~l*r)9!iI`VbfS%_gP$*-{pUb~%jZ_@oiD31FTGrarx81GjMCBb}DC0VYN zn=Iewn1ne9zo62gB+E6>e{!N5<`(l`DoHoDRri})`Wwu*gD@`_JOXUFs+pRL1^@r7 z{m&y_W%0c34c0PnL?gvITbthw7VJ9VU8uU5doF+In5k_)wSNh#aWXjc=P%Ij^eKA> zVHH>~LJ8$t$p}|zMwqgUpWJ~9k-8D430?kMBb>eyyX2~|scUBKYJ{koN>e=)(NINP z`8&Fk_3_er*lG1%kywgY%GF-hd>30fU|A#eR&Sta$Aebko&F`&rkhcloKyVhE*9ip z{uXSe9^U5mpl>bp4K-rq_rwPi)qeEiyS!l+^AuI|+ReJP+wiV_N**BA#MHlh5IuP} zy5ZLUsDX34S(xJ%A?9c9;&y*T;M-DjicERgXlwk00k&mg|l16OH(JTWF8J@D{TM9&JQ= z>3|s>>-t-4MBvAbu+d>NRdT`}QAwBXe5vTWc>l@PJvi6=ZW%wlhee7;xV;Al96v4N zz29b$uHxNPs_R#~bJ5$ZQ%xM7`?O` ze|#U-Y?giw!xb&6&a;m3b9vfL7p|{P(f3z1$j01alLE7CMjR z6ud-*lb294;%E0USAAF%vp9TLQ88IODL0yq=874&FkUf~irfOV_VB>1ebs3Lqhg~= zm~Urc2l3)Y;q5`%Jw0E_3+*quu9g>nv4r(DyFBk+P?a0VTPCsxeAR;eh?%U7m|N{< z?OVFEQ1_SAj^M)k>}USXT}Ej;1fBcwsr#9yZ+Q*+`@aU&xC}$bLdVNxR+I2B)6e6c1@)Qc0 zsYVXx4}ZWO3x@g}3o7ybarKeggGXyB@C6ffODr{;pZow>&dcWJ)0jP_XY($n(Y2uN z(Wlwc?#m2yIBj>VqDR~%`#3SG;}_NLgMQi!`=e}ahP~h3<3kn(qq$(8{1KaF@-4s6L-DLe z53RO+ThRn}zzBPO&F_B7yzRf9#Y3-c$}ir-bn4^f=_nBji=(RyI(nM zY?=Hh41l&gYAFr5Ew#Ju=RImzdw%?Dw)}6?)%|_CXTJG2>3;vabo_6Ny8U-a+Vhs* zva_B_f34c`aJ!#h|CTNCbf+kJ(GN%V9nR$fDT=O_Xcf1A@tvyd3-)u@*g%s@uG+3V z`+LkT(I$RZ*(|0JFB0*hAkJkX7D)!HO-KJ+)H2}-*O>(k$tPS#|26n7+K>Lit})Nf zBna&is{VUFKY9cAfYAD1-_Qi&{cfrRKKZ653nB)Z?4`f6Ou6uj_Vj;-)UkR$A6}2M0o`V3w^NIbLM_5ggn9(m1U!m_;DZo?5RMRq z5Sw7%(cQeHr9G;@Im&DszBnx{U|hz`nJEEXBO@XL9*KijzzlfY%*@O=>9Ygkrlrl& zK6vMVMeCoLS>GpOr%-aL(m8;A>T1;`uTV$*_ zQ3B?qr_9V!hRk1_mJ*OYA2Q6$yhonQ`2n3$dNfz=i?RRuqIpRFR+;XY@F3rsM;aP% zLHW@S&9ivcIdcbA)1PlRXWq*~hV$VcoA266pEQf|)t^-SJ|f{Iz!ktEBk_}ga8|;z zfU6|_*}#`2oB~`c;l;o=C5-pl1uGU@a@PxZ5)5t<&IEQ(w_iDLUeUy_q1LP<^-+{~ z9BPW6t+g&pIv9kXBLGc&0oh1I&4d%-(nFk@>e)y7kg+(y- zt2Rf1(f(w$ARxuhH6YaVw+DP{{?j6ow!31U&5~m6E3cTVn}|G;Yt6|FWu2%scVTCS z^4OovKJJl<(qtrtD$`tS_(Ce)_GiR`3$dNq%^^JHXY;TQv5>YoQxsRz1d~WHN2KU0 zQp646r@+CAhH$s*=5~G04AD4mLo2SPM9XicM1PSgLTP%HqBN+uC5lWsj6)`MgY8Mz z&6g}@XvyC5rrFD6kH2Yd-&E9i&K>h{CTbdf*Idp}v3IUpT9{BD`yG=d)GTz-xrs$p z+Hm}Jsp*eS*pzQRXP(O|n^=6>)D1RcR-`DRJVfyH}*@N?b1H^|b1wK+RXW5gM@f@l5}_u>3{h-Gw} zyirAO z5@&kG0p6+$=r`YUrsurR2MW3eCVp~0+iH1w7t0gE9?x~LjAjkB+^;M6M1P2anuNOg z!qU(hqq|x#&A-lH>}v64F2VfGu9hIv9{$g+7XP4{N!X!L&Kk(Hn`0gyle`v-Pg{lVJn;}9K7~&V3ltRMQ zz(-n}R0|Rrd=Fd$z3Bq}0UWW$z|AZWu!l)Wr1b59m!HH=HsMI%d|0McVCJU8Soq{H zOB)s+$QEz@;CUt2ab<7 z@~H>TI-w{rB$EaG{W3m@pewZvaKt{7+A&3)1A)t)H7OA!S8w3d&A2~8>EWh&EBRea zN)-_%g2BVhqIdweR(zBc;F~uLr7i@{FXJzEgL_zR<$JqXdJIeOH7V;T{ZEKLf8FG; zirc`k*+zPAY{zv#qa7jsU|@H5i;~I%!!7NnRlke7EELtYJ^oQpVf+L@ph;j&w4;5n zTo83zAaESkJ%|_hY2Z{8t+(%sz$HI3q}Ae!f$RB}aEm`n9?y@4Tl}WSK^1zm2lfEF zN;nKSuh67qQu0{f%dl_VKF0y){Af}zF;$D72AuL9#y8@B3b+v8(d>>U&YEqAWd~j9 zZ&GrI?+kE$tP%es@HTEzN-6%1z>$U-wsb{5_`;-Yr1%cN8=p5RxrD=kbM16A_<3*AO66WH`hmE;*>_ZNTpM@_8); z6Zx$Jt~n{%NWjnCAg}@fMduJI z9uAx;;ogYQT~!csvnlal2*7Zt8%Z*7A8_ebXoYYza0QwGIjBt#2b_qzps5s}0_-u3oQVx>x&Q=sN#dozt^s&KfL>!@ z3#>ecGI$v{#1*&c2=4^WIEph)!sWo{;axoN$^>CEUjf%(xU8r68^9CWfFCwy6AaDW z@cwB@r5%Ce(U0{Sg##x@@gsoG?=&);1e}I0Am-d6zYO3#dyRe%B`a5<5%J>=qg)Mq z>nyI9qI@;MP7uoAHFCfpGI$rb;wNM5I1QZjFtk7#xd?o762?H{zXBXG8cveB3&N4Z*sM|++>{9dJDS8tnFE~D!SDl51G`?t z_|ZWV_+{YbRfc1FU8H{;hDrGy0FK4tR@dlp;QA!oFhKcgjXwb)Rg&;$;Iv0^`xYaE z(8wL&n-I`S{9c%shTt_pbse?%?!enl!@E&@Z{UrR5n6$xq;5V1xC-$$(JI1GOa&pt zQDbi<6F5^6Xbo_R6u%BQM~dGLoG;-+z{@9~8OgI&02eKU7D&KPfiZcv!SYc9%vq{I zh{YJYjTq{HeQd_yqhM^^xE@-e_y>TG^v0VB2?qmL%rcr_0B~I&y`Q@&V}O0a4bM6a z*g6UN*GIDjAmm9kd>+^h-AXTD2k_NRhHw8KHPhD(ZCFd?7~*rjG%0WmYLlG@-Y9A0 z2jJu(P`h41;3C^x5GcVN5b76UN=zzi?T$8gw4t}+4}1oXN?xT5Vt_m3o0JN|C!-Z* zS2^xH5Plf(nHY?8qfP}rf@y9ImA4ewR)KkLCKdP`2$e_Cw+U|mj``W73*JacH5dt;xC0wQl;I5Eb@MTWqxf{-x=AJnehxUI3-+ifzMwVQzeFnF z4KNH1!3B8A@Gx-sNuvfI0T-Pz79T$VCr!j0k}|vnT=*$AzA1eRc$-|wuLJ|H!<<#O zsYv)=r7Napdbbz_oca=O>rsYDz(;}&m1O{*U1cmaa)FmiM!N;Ld^d!oCfp(TVFNiN z&~e}+QiW|_f=~%psT7tT4m%{tBGwNN@92Ts`1aFkB9$8ny;L0}W&l4go&D7D7;l-GIwNFcuK*4P5-X zN$E;>2yiB*SOJti3HZoU@Ea7r82EgtNgEr)_@4(tJ&@0kvQO(>9_$*@#BGG-$wf%A;L5eiie9`Jk6*wfh~Ozsm3eHv%pmgVae3S#lSJI zIQp^j4sek|Duz*h0PNn^NdE)y#x`X2h`$Nkp)dTuUO-bHFnnTi?DMz-dtec(kM};n zNs>xCiueXh`0&%3wNb)=OD5upIAGB$Vu7>P7%QDefV)ZpB?DX6+3*-0)p#BVNqY=W zmkC^1j9x)CUJaa!u|O~2Rp3m!F&69xKJTz0FXeraKG>vOCV@@?=fxST-%o(EY%>hc z_bmt><6#&i&@aFViN-cn18}KSKua8AmSHR{C;oQ8#Zz(nn+og%93|B_1~}^z!-hrx z+j93CDxL^JzQ0L{LpKmAoC_TCq%poP2DVBW<^gYmQKC{R|0dwG)!;{~i1cp($1lLK zFbViRa6%_z0&=Py+P@4aG`@;TGrNL)57*eKUKY%380xp|xOwq2n!ZZF49%dqeoB5_BR;_HD^qyk$@ zJ5lb~iSh#uC^06rJ%AI?$2U@XE3gGNQ%cx2285Vl#umzKfj2=2vieNm(w7a-_bhOR zB)}`cw|+Bfybm}Ft~-|sI0>ATY#8Ooz-92;Ia<6;`2mE|!N!c|2Jl3z8j2}{Rvl2_ zKVaD;kPmReCc|jMfR{@G4FEne3|*7bCjbw<0j*FI%msFTTCWh6ri(zx-C}ZhzGs15 zo8fve75ECU$6BLCdw{Ll=%rfuyCNRd-AMeWfV*NdLEpl;2z=&c_!)}-7C7%E@CX6L z_+KXoQVkf^bTMy1r6h41;Bxee0IHE6a1Cq(?m%6tYvqXz4NEd>~W5HI@mYrx6=7PSq<>UlSC^(bS; z^geK<T`1(T1Fj~Z;K=IR>c`1W|D|`%3HwL(Rq{HYGkKSk!RX}z8$LbdhCGAa)ew_xK zUtr9LRse64nur4@Zq$v)P1y|`@K2Lt!f`^R-)d5PAd?XI0`L*+`79@azX2}!4b85P z|38D^GZ0#!1h;@QBtKyChf#Jk3iJfdI0VC^Htqy`cDrH3gMjNFGP>Ou;KU~}I+792 z2KK>@iY=KWS^`48)Mn2BCoD6pz7Y7V6u$+y>=k4D-w*75+T?I#$AHr?-s_I*OW-VY zJKgcz08Wm^`ahf`G6f(*ES=nGr?Vw+%?zV}cEClL$E)22Dh&g^{I;=B830_p56?Q0 zMn(cxK|O9Xw#)$DBQ@a?;N>H2keU+Yf{^yGVI+mXSVrby>RfqT<;MW3xyisJa|5A38)(R2{?AN$?NbgTwJD=OsQS?47@sEtyJPTigFr%sbAZpZ zHD6)#TXp32^aZ)GKL zL{pr9=mO+}P>dSlR7JIkLf~>K!(!l}Q{f9p!2Q6v*!|Y6{Di<#6I21GcwrJsO?nkL zL5lw!*wvN<|4$h<3B~`X(G$>Cq8l~`F0D0Ot1oad1aeh1=B4xmuH6MKQ2Gaft(}bn zh&bSy*;wt805gG8&KXm%bYNQyO1Bcj3c-L`X*^|E09-v8G{RefD@NjMnDAcUU6P6` zfJ-HO5jbWjhGfeBYv6Jz{?}00U-AKCd{)BXdeLe1;kG4kwbTS2z{Nda6O>^f@R>cB zkPwapuE#Vyl?3bud{!!OEO3>CXN1B2Z+RM*S{8vJR_dp#fQ#NSn&4&NTWCWc6d(qt z*9G23YdJL8JHQ@Ts4OP|P5?(p6PizeYj6>08^wQT1L3kH(eJ?Z2hdNcMy}n^4d)ws zM4rG_d5Q&`h8d1-gb~2&-Zz@e3cTlK^mQt5Bygc*gti$V)L=BzRkm1QIGz9!AP2Y> zOD(<4*8_KuGAIJBP|QjK6|fJuPO8vx;CcyP1RnaWV`XI%&v+_{QigYdJ!;@3T4=qX z6~^IejBe|w06*Y_SG5sV^pbACnQ6v^B?kB=rf?vsQ@DqK6S9pN(FEX-zWTMII5%ZB z2v@N!7DolN@IiY@0xd!Ox`oDVnrDEMF^|^;+5o(9E%!^X`1W}d|64GFE~mT>1Bc^m z!AkfzaM~~kMEC-*bu3RuTHDw7e`pT)N%L2Mcg-`pYm@GZ5&(ar_eO8v6m0idDX+C| zXxe`oo8BD}?}~c3B3?My5Ru+7sw>I};9HK)ESD=FsE(Wf^3Qfm$;8<*iunxFZS|Yvw2MSTri z^^)OEegUq1OzXYsOw6Sx+6<>@0hB=y@E)oA@AkkvY|MuBy} zSF;Qoaz%kjQhxY^uac@_cw!+yFA%ER8F$-;0oROxlvKbJU>`>faZ&?p{myWJ3xW4Y zR=-AIq>rNX+Xa6&v^kCPdx0~B04QG-;5Z2Rqo8I=@F}pEBv^r4V~6!J@J)Ew8jAlF zI7h0HB@#2W5Alf)iVp&=wOD|Vo_Q!efX_fcn6o;B^aYN|Liw1@sa75j!q7uFsv)CF z0j^wx(>KD4f%ByTR|8jX!N7xVyyS{4b7gw$tf^A;_naK;dx_XG#a?@T?9)1IB;bNc$#SW z{{uLGDgvcn2YfRY3mV-~><1w^z$owxa87@0O}$}cgN!9* zOW^!mv^izQG|bv7Kw=^69~p;#&)9=Ncj;W(xOXZ>!}V6MQW#-+Fwz#G>< zS`zq0U>~^ZcoMKs@S_RR2=4;6r9Eey!oLSXg~Q5ylyks&=*PN%)xaG#7|VrUfD>Oc z{6=e-dkBsXlc@lI;3A75U?gzdEn`tUC<^VL_nXm;#)BchuUQc{mxWEt0QM+DGf<5d z0{bBMI4a;Dz(sJyuE1hFvk5r|YqLjOy}MMYgDKY(G^ z6i7@3+yyR?nxu6!+6-q`85AD?oPvFYJi>i|&kw=qh@K}ZFbH_h9OD}FDBz*pj1}E< z8wf|F0u}*peA=ktYT$?yXhW*ePT*ABMbQO544jV@mOdA)1TNfXQtF8Rd*H5DjGG&` zfs@U~_Moj*AE>y>P*Ho};t9s0Ra_HIdDPfrjsi|jMl+CA4+K7g8tEz?4}9L&5O6kd z24?fRz|R0jeC{aErn~||JvuF#SykB{;P^+8DcQg=;4_kjeA*!1VWikdLAvmNufbriG1RvOe?sz%^Z-j(;29dz-SRM?e4Eh0A zN&<}rzFA}pPSb&Fr1-@G`x?9a&jP2kr5RN_7|AOjB-9#Htlhu?Q|zrKTcS;-K0Aj_ zu{3>P_RP$&+T&L0LtXYE(=Dx8TRht|b;kU(w3#z9=gd!^`sDnSnf7rhmJ&-F@ZS?- zH_fr!eBc2jamwgsmZiFVXpGperXQHD`m+kZVMU4yg1B)O(%Gy;@P`U4ZMoaa7Pm<8 zv`QjqZ|zjs)n9trmw-fC=onA2An$W##Y0VNPkPysXfh48@84iqYcg%)4{fvrH<>uu Sq8#OO@GtXP&tKeV@%n$ZOoN30 delta 85266 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 diff --git a/slsDetectorServers/mythen3DetectorServer/slsDetectorFunctionList.c b/slsDetectorServers/mythen3DetectorServer/slsDetectorFunctionList.c index f9b8fcd72..6fd3fb00a 100644 --- a/slsDetectorServers/mythen3DetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorServers/mythen3DetectorServer/slsDetectorFunctionList.c @@ -451,8 +451,6 @@ void setupDetector() { if (updateModuleId() == FAIL) return; - clkDivider[READOUT_C0] = DEFAULT_READOUT_C0; - clkDivider[READOUT_C1] = DEFAULT_READOUT_C1; clkDivider[SYSTEM_C0] = DEFAULT_SYSTEM_C0; clkDivider[SYSTEM_C1] = DEFAULT_SYSTEM_C1; clkDivider[SYSTEM_C2] = DEFAULT_SYSTEM_C2; @@ -472,16 +470,10 @@ void setupDetector() { // pll defines ALTERA_PLL_C10_SetDefines( - REG_OFFSET, BASE_READOUT_PLL, BASE_SYSTEM_PLL, PLL_RESET_REG, - PLL_RESET_READOUT_MSK, PLL_RESET_SYSTEM_MSK, SYSTEM_STATUS_REG, - SYSTEM_STATUS_RDO_PLL_LCKD_MSK, SYSTEM_STATUS_R_PLL_LCKD_MSK, - READOUT_PLL_VCO_FREQ_HZ, SYSTEM_PLL_VCO_FREQ_HZ); - ALTERA_PLL_C10_ResetPLL(READOUT_PLL); + REG_OFFSET, 0, BASE_SYSTEM_PLL, PLL_RESET_REG, 0, PLL_RESET_SYSTEM_MSK, + SYSTEM_STATUS_REG, SYSTEM_STATUS_RDO_PLL_LCKD_MSK, + SYSTEM_STATUS_R_PLL_LCKD_MSK, 0, SYSTEM_PLL_VCO_FREQ_HZ); ALTERA_PLL_C10_ResetPLL(SYSTEM_PLL); - // change startup clock divider in software - // because firmware only sets max clock divider - setClockDividerWithTimeUpdateOption(READOUT_C0, DEFAULT_READOUT_C0_STARTUP, - 0); // hv DAC6571_SetDefines(HV_HARD_MAX_VOLTAGE, HV_DRIVER_FILE_NAME); @@ -552,6 +544,7 @@ void setupDetector() { } setAllTrimbits(DEFAULT_TRIMBIT_VALUE); + setReadoutSpeed(DEFAULT_READOUT_SPEED); } int resetToDefaultDacs(int hardReset) { @@ -2246,9 +2239,7 @@ int setPhase(enum CLKINDEX ind, int val, int degrees) { relativePhase *= -1; direction = 0; } - int pllIndex = (int)(ind >= SYSTEM_C0 ? SYSTEM_PLL : READOUT_PLL); - int clkIndex = (int)(ind >= SYSTEM_C0 ? ind - SYSTEM_C0 : ind); - ALTERA_PLL_C10_SetPhaseShift(pllIndex, clkIndex, relativePhase, direction); + ALTERA_PLL_C10_SetPhaseShift(SYSTEM_PLL, ind, relativePhase, direction); clkPhase[ind] = valShift; return OK; @@ -2318,8 +2309,7 @@ int getVCOFrequency(enum CLKINDEX ind) { LOG(logERROR, ("Unknown clock index %d to get vco frequency\n", ind)); return -1; } - int pllIndex = (int)(ind >= SYSTEM_C0 ? SYSTEM_PLL : READOUT_PLL); - return ALTERA_PLL_C10_GetVCOFrequency(pllIndex); + return ALTERA_PLL_C10_GetVCOFrequency(SYSTEM_PLL); } int getMaxClockDivider() { return ALTERA_PLL_C10_GetMaxClockDivider(); } @@ -2358,9 +2348,7 @@ int setClockDividerWithTimeUpdateOption(enum CLKINDEX ind, int val, } // Calculate and set output frequency - int pllIndex = (int)(ind >= SYSTEM_C0 ? SYSTEM_PLL : READOUT_PLL); - int clkIndex = (int)(ind >= SYSTEM_C0 ? ind - SYSTEM_C0 : ind); - ALTERA_PLL_C10_SetOuputClockDivider(pllIndex, clkIndex, val); + ALTERA_PLL_C10_SetOuputClockDivider(SYSTEM_PLL, ind, val); // Update time settings that depend on system frequency // timeUpdate = 0 for setChipRegister/setTrimbits etc @@ -2392,14 +2380,9 @@ int setClockDividerWithTimeUpdateOption(enum CLKINDEX ind, int val, clkDivider[ind])); // phase is reset by pll (when setting output frequency) - if (ind < SYSTEM_C0) { - clkPhase[READOUT_C0] = 0; - clkPhase[READOUT_C1] = 0; - } else { - clkPhase[SYSTEM_C0] = 0; - clkPhase[SYSTEM_C1] = 0; - clkPhase[SYSTEM_C2] = 0; - } + clkPhase[SYSTEM_C0] = 0; + clkPhase[SYSTEM_C1] = 0; + clkPhase[SYSTEM_C2] = 0; // set the phase in degrees (reset by pll) for (int i = 0; i < NUM_CLOCKS; ++i) { @@ -2422,6 +2405,42 @@ int getClockDivider(enum CLKINDEX ind) { return clkDivider[ind]; } +int setReadoutSpeed(int val) { + enum speedLevel speed = FULL_SPEED; + switch (val) { + case FULL_SPEED: + LOG(logINFO, ("Setting Full Speed (100 MHz):\n")); + speed = FULL_SPEED_CLKDIV; + break; + case HALF_SPEED: + LOG(logINFO, ("Setting Half Speed (50 MHz):\n")); + speed = HALF_SPEED_CLKDIV; + break; + case QUARTER_SPEED: + LOG(logINFO, ("Setting Quarter Speed (25 MHz):\n")); + speed = QUARTER_SPEED_CLKDIV; + break; + default: + LOG(logERROR, ("Unknown readout speed %d\n", val)); + return FAIL; + } + return setClockDivider(SYSTEM_C0, speed); +} + +int getReadoutSpeed(int *retval) { + int clkdiv = getClockDivider(SYSTEM_C0); + if (clkdiv == FULL_SPEED_CLKDIV) { + *retval = FULL_SPEED; + } else if (clkdiv == HALF_SPEED_CLKDIV) { + *retval = HALF_SPEED; + } else if (clkdiv == QUARTER_SPEED_CLKDIV) { + *retval = QUARTER_SPEED; + } else { + return FAIL; + } + return OK; +} + int setBadChannels(int numChannels, int *channelList) { LOG(logINFO, ("Setting %d bad channels\n", numChannels)); memset(badChannelMask, 0, NCHAN_PER_MODULE * sizeof(char)); diff --git a/slsDetectorServers/mythen3DetectorServer/slsDetectorServer_defs.h b/slsDetectorServers/mythen3DetectorServer/slsDetectorServer_defs.h index 5ba93057c..c3583aacf 100644 --- a/slsDetectorServers/mythen3DetectorServer/slsDetectorServer_defs.h +++ b/slsDetectorServers/mythen3DetectorServer/slsDetectorServer_defs.h @@ -57,15 +57,16 @@ #define DEFAULT_SETTINGS (STANDARD) #define DEFAULT_TRIMBIT_VALUE (0) #define DEFAULT_COUNTER_DISABLED_VTH_VAL (2800) +#define DEFAULT_READOUT_SPEED (HALF_SPEED) -#define DEFAULT_READOUT_C0 (10) //(100000000) // rdo_clk, 100 MHz -#define DEFAULT_READOUT_C1 (10) //(100000000) // rdo_smp_clk, 100 MHz #define DEFAULT_SYSTEM_C0 (10) //(100000000) // run_clk, 100 MHz #define DEFAULT_SYSTEM_C1 (6) //(166666666) // str_clk, 166 MHz const #define DEFAULT_SYSTEM_C2 (5) //(200000000) // smp_clk, 200 MHz const #define DEFAULT_TRIMMING_RUN_CLKDIV (40) // (25000000) // 25 MHz -#define DEFAULT_READOUT_C0_STARTUP (20) //(50000000) // rdo_clk, 50 MHz +#define FULL_SPEED_CLKDIV (10) //(100000000) 100 MHz +#define HALF_SPEED_CLKDIV (20) //( 50000000) 50 MHz +#define QUARTER_SPEED_CLKDIV (40) //( 25000000) 25 MHz #define DEFAULT_ASIC_LATCHING_NUM_PULSES (10) #define DEFAULT_MSTR_OTPT_P1_NUM_PULSES (20) @@ -73,12 +74,11 @@ #define DEFAULT_ADIF_ADD_OFST_VAL (0) /* Firmware Definitions */ -#define MAX_TIMESLOT_VAL (0xFFFFFF) -#define IP_HEADER_SIZE (20) -#define FIXED_PLL_FREQUENCY (020000000) // 20MHz -#define READOUT_PLL_VCO_FREQ_HZ (1000000000) // 1GHz -#define SYSTEM_PLL_VCO_FREQ_HZ (1000000000) // 1GHz -#define MAX_NUM_DESERIALIZERS (40) +#define MAX_TIMESLOT_VAL (0xFFFFFF) +#define IP_HEADER_SIZE (20) +#define FIXED_PLL_FREQUENCY (020000000) // 20MHz +#define SYSTEM_PLL_VCO_FREQ_HZ (1000000000) // 1GHz +#define MAX_NUM_DESERIALIZERS (40) /** Other Definitions */ #define BIT16_MASK (0xFFFF) @@ -140,19 +140,12 @@ enum ADCINDEX { TEMP_FPGA }; #define SPECIAL_DEFAULT_HIGHGAIN_DAC_VALS \ { 1300, 1100 } -enum CLKINDEX { - READOUT_C0, - READOUT_C1, - SYSTEM_C0, - SYSTEM_C1, - SYSTEM_C2, - NUM_CLOCKS -}; -#define NUM_CLOCKS_TO_SET (3) +enum CLKINDEX { SYSTEM_C0, SYSTEM_C1, SYSTEM_C2, NUM_CLOCKS }; +#define NUM_CLOCKS_TO_SET (1) -#define CLK_NAMES \ - "READOUT_C0", "READOUT_C1", "SYSTEM_C0", "SYSTEM_C1", "SYSTEM_C2" -enum PLLINDEX { READOUT_PLL, SYSTEM_PLL }; +#define CLK_NAMES "SYSTEM_C0", "SYSTEM_C1", "SYSTEM_C2" + +#define SYSTEM_PLL (1) /* Struct Definitions */ typedef struct udp_header_struct { diff --git a/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h b/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h index bad660152..9e5e6c8fc 100644 --- a/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h +++ b/slsDetectorServers/slsDetectorServer/include/slsDetectorFunctionList.h @@ -655,7 +655,8 @@ int setClockDivider(enum CLKINDEX ind, int val); int setClockDividerWithTimeUpdateOption(enum CLKINDEX ind, int val, int timeUpdate); int getClockDivider(enum CLKINDEX ind); - +int setReadoutSpeed(int val); +int getReadoutSpeed(int *retval); #elif GOTTHARD2D int checkDetectorType(char *mess); int powerChip(int on, char *mess); diff --git a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c index 9cd631959..d2d36a094 100644 --- a/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c +++ b/slsDetectorServers/slsDetectorServer/src/slsDetectorServer_funcs.c @@ -6009,11 +6009,9 @@ int get_clock_frequency(int file_des) { case ADC_CLOCK: c = ADC_CLK; break; -#ifdef CHIPTESTBOARDD case DBIT_CLOCK: c = DBIT_CLK; break; -#endif case RUN_CLOCK: c = RUN_CLK; break; @@ -6078,7 +6076,11 @@ int set_clock_phase(int file_des) { #endif default: #if defined(GOTTHARD2D) || defined(MYTHEN3D) - if (ind < NUM_CLOCKS) { +#ifdef MYTHEN3D + if (args[0] < NUM_CLOCKS_TO_SET) { +#else + if (args[0] < NUM_CLOCKS) { +#endif c = (enum CLKINDEX)ind; break; } @@ -9687,7 +9689,7 @@ int get_readout_speed(int file_des) { LOG(logDEBUG1, ("Getting readout speed\n")); #if !defined(JUNGFRAUD) && !defined(MOENCHD) && !defined(EIGERD) && \ - !defined(GOTTHARD2D) + !defined(GOTTHARD2D) && !defined(MYTHEN3D) functionNotImplemented(); #else // get only @@ -9711,7 +9713,7 @@ int set_readout_speed(int file_des) { LOG(logDEBUG1, ("Setting readout speed : %u\n", arg)); #if !defined(JUNGFRAUD) && !defined(MOENCHD) && !defined(EIGERD) && \ - !defined(GOTTHARD2D) + !defined(GOTTHARD2D) && !defined(MYTHEN3D) functionNotImplemented(); #else // only set @@ -9727,7 +9729,8 @@ int set_readout_speed(int file_des) { #endif if (ret == OK) { switch (arg) { -#if defined(EIGERD) || defined(JUNGFRAUD) || defined(MOENCHD) +#if defined(EIGERD) || defined(JUNGFRAUD) || defined(MOENCHD) || \ + defined(MYTHEN3D) case FULL_SPEED: case HALF_SPEED: case QUARTER_SPEED: diff --git a/slsDetectorSoftware/generator/commands.yaml b/slsDetectorSoftware/generator/commands.yaml index fc3c5c636..41cb2cd06 100644 --- a/slsDetectorSoftware/generator/commands.yaml +++ b/slsDetectorSoftware/generator/commands.yaml @@ -2904,7 +2904,7 @@ exptime3: value: 2 readoutspeed: - help: "\n\t[0 or full_speed|1 or half_speed|2 or quarter_speed]\n\t[Eiger][Jungfrau][Moench] Readout speed of chip.\n\t[Eiger][Moench] Default speed is full_speed.\n\t[Jungfrau] Default speed is half_speed. full_speed option only available from v2.0 boards and is recommended to set number of interfaces to 2. Also overwrites adcphase to recommended default.\n\t [144|108]\n\t\t[Gotthard2] Readout speed of chip in MHz. Default is 108." + help: "\n\t[0 or full_speed|1 or half_speed|2 or quarter_speed]\n\t[Eiger][Jungfrau][Moench][Mythen3] Readout speed of chip.\n\t[Eiger][Moench] Default speed is full_speed.\n\t[Jungfrau][Mythen3] Default speed is half_speed. \n\t[Jungfrau] full_speed option only available from v2.0 boards and is recommended to set number of interfaces to 2. Also overwrites adcphase to recommended default.\n\t [144|108]\n\t\t[Gotthard2] Readout speed of chip in MHz. Default is 108." actions: GET: extra_variables: @@ -3044,7 +3044,7 @@ dbitphase: output: [ 'args[0]',"' '", 'args[1]' ] clkfreq: - help: "[n_clock (0-5)] [freq_in_Hz]\n\t[Gotthard2][Mythen3] Frequency of clock n_clock in Hz. Use clkdiv to set frequency." + help: "[n_clock] [freq_in_Hz]\n\t[Gotthard2][Mythen3] Frequency of clock n_clock in Hz. Use clkdiv to set frequency.\n\t[Gotthard2] Clock index range: 0-5\n\t[Mythen3] Clock index range: 0" actions: GET: extra_variables: @@ -3063,7 +3063,7 @@ clkfreq: output: [ OutString(t) ] clkphase: - help: "[n_clock (0-5)] [phase] [deg (optional)]\n\t[Gotthard2][Mythen3] Phase of clock n_clock. If deg, then phase shift in degrees, else absolute phase shift values." + help: "[n_clock] [phase] [deg (optional)]\n\t[Gotthard2][Mythen3] Phase of clock n_clock. If deg, then phase shift in degrees, else absolute phase shift values.n\t[Gotthard2] Clock index range: 0-5\n\t[Mythen3] Clock index range: 0" actions: GET: extra_variables: @@ -3118,7 +3118,7 @@ clkphase: output: [ 'args[1]', '" "', 'args[2]' ] maxclkphaseshift: - help: "[n_clock (0-5)]\n\t[Gotthard2][Mythen3] Absolute Maximum Phase shift of clock n_clock." + help: "[n_clock]\n\t[Gotthard2][Mythen3] Absolute Maximum Phase shift of clock n_clock.n\t[Gotthard2] Clock index range: 0-5\n\t[Mythen3] Clock index range: 0" actions: GET: extra_variables: @@ -3137,7 +3137,7 @@ maxclkphaseshift: function: getMaxClockPhaseShift clkdiv: - help: "[n_clock (0-5)] [n_divider]\n\t[Gotthard2][Mythen3] Clock Divider of clock n_clock. Must be greater than 1." + help: "[n_clock] [n_divider]\n\t[Gotthard2][Mythen3] Clock Divider of clock n_clock. Must be greater than 1.n\t[Gotthard2] Clock index range: 0-5\n\t[Mythen3] Clock index range: 0" actions: GET: extra_variables: diff --git a/slsDetectorSoftware/include/sls/Detector.h b/slsDetectorSoftware/include/sls/Detector.h index 9fad286b3..889bd527a 100644 --- a/slsDetectorSoftware/include/sls/Detector.h +++ b/slsDetectorSoftware/include/sls/Detector.h @@ -363,11 +363,11 @@ class Detector { /** list of possible timing modes for this detector */ std::vector getTimingModeList() const; - /** [Eiger][Jungfrau][Moench][Gotthard2] */ + /** [Eiger][Jungfrau][Moench][Gotthard2][Mythen3] */ Result getReadoutSpeed(Positions pos = {}) const; /** [Eiger][Jungfrau][Moench][Gotthard2] - * [Jungfrau] Options: FULL_SPEED, HALF_SPEED (Default), + * [Jungfrau][Mythen3] Options: FULL_SPEED, HALF_SPEED (Default), * QUARTER_SPEED \n [Moench] Options: FULL_SPEED (Default) \n [Eiger] * Options: FULL_SPEED (Default), HALF_SPEED, QUARTER_SPEED \n [Gotthard2] * Options: G2_108MHZ (Default), G2_144MHZ \n [Jungfrau][Moench] FULL_SPEED @@ -429,7 +429,8 @@ class Detector { /** [Mythen3][Gotthard2] */ Result getClockPhase(int clkIndex, Positions pos = {}); - /** [Mythen3][Gotthard2] absolute phase shift */ + /** [Mythen3][Gotthard2] absolute phase shift \n + * [Gotthard2] clkIndex: 0-5, [Mythen3] clkIndex 0 only */ void setClockPhase(int clkIndex, int value, Positions pos = {}); /** [Mythen3][Gotthard2] */ @@ -438,13 +439,15 @@ class Detector { /** [Mythen3][Gotthard2] */ Result getClockPhaseinDegrees(int clkIndex, Positions pos = {}); - /** [Mythen3][Gotthard2] */ + /** [Mythen3][Gotthard2] \n + * [Gotthard2] clkIndex: 0-5, [Mythen3] clkIndex 0 only */ void setClockPhaseinDegrees(int clkIndex, int value, Positions pos = {}); /** [Mythen3][Gotthard2] */ Result getClockDivider(int clkIndex, Positions pos = {}); - /** [Mythen3][Gotthard2] Must be greater than 1. */ + /** [Mythen3][Gotthard2] Must be greater than 1. \n + * [Gotthard2] clkIndex: 0-5, [Mythen3] clkIndex 0 only */ void setClockDivider(int clkIndex, int value, Positions pos = {}); Result getHighVoltage(Positions pos = {}) const; diff --git a/slsDetectorSoftware/src/Detector.cpp b/slsDetectorSoftware/src/Detector.cpp index b34061005..2ed986bab 100644 --- a/slsDetectorSoftware/src/Detector.cpp +++ b/slsDetectorSoftware/src/Detector.cpp @@ -533,6 +533,7 @@ std::vector Detector::getReadoutSpeedList() const { case defs::EIGER: case defs::JUNGFRAU: case defs::MOENCH: + case defs::MYTHEN3: return std::vector{defs::FULL_SPEED, defs::HALF_SPEED, defs::QUARTER_SPEED}; case defs::GOTTHARD2: diff --git a/slsDetectorSoftware/tests/Caller/test-Caller.cpp b/slsDetectorSoftware/tests/Caller/test-Caller.cpp index fad23d35a..427855683 100644 --- a/slsDetectorSoftware/tests/Caller/test-Caller.cpp +++ b/slsDetectorSoftware/tests/Caller/test-Caller.cpp @@ -1101,14 +1101,16 @@ TEST_CASE("CALLER::readoutspeed", "[.cmdcall]") { Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::EIGER || det_type == defs::JUNGFRAU || - det_type == defs::MOENCH || det_type == defs::GOTTHARD2) { + det_type == defs::MOENCH || det_type == defs::GOTTHARD2 || + det_type == defs::MYTHEN3) { auto prev_val = det.getReadoutSpeed(); // full speed for jungfrau/moench only works for new boards (chipv1.1 is // with new board [hw1.0 and chipv1.0 not tested here]) if (((det_type == defs::JUNGFRAU) && det.getChipVersion().squash() * 10 == 11) || - (det_type == defs::EIGER) || (det_type == defs::MOENCH)) { + det_type == defs::EIGER || det_type == defs::MOENCH || + det_type == defs::MYTHEN3) { std::ostringstream oss1, oss2, oss3, oss4; caller.call("readoutspeed", {"0"}, -1, PUT, oss1); REQUIRE(oss1.str() == "readoutspeed full_speed\n"); @@ -1121,7 +1123,7 @@ TEST_CASE("CALLER::readoutspeed", "[.cmdcall]") { } if (det_type == defs::EIGER || det_type == defs::JUNGFRAU || - det_type == defs::MOENCH) { + det_type == defs::MOENCH || det_type == defs::MYTHEN3) { { std::ostringstream oss1, oss2, oss3, oss4; caller.call("readoutspeed", {"1"}, -1, PUT, oss1); @@ -1189,7 +1191,8 @@ TEST_CASE("CALLER::readoutspeedlist", "[.cmdcall]") { Caller caller(&det); auto det_type = det.getDetectorType().squash(); if (det_type == defs::GOTTHARD2 || det_type == defs::JUNGFRAU || - det_type == defs::MOENCH || det_type == defs::EIGER) { + det_type == defs::MOENCH || det_type == defs::EIGER || + det_type == defs::MYTHEN3) { REQUIRE_NOTHROW(caller.call("readoutspeedlist", {}, -1, GET)); REQUIRE_THROWS(caller.call("readoutspeedlist", {}, -1, PUT)); } else { @@ -1301,6 +1304,12 @@ TEST_CASE("CALLER::clkfreq", "[.cmdcall]") { REQUIRE_THROWS(caller.call("clkfreq", {}, -1, GET)); REQUIRE_THROWS(caller.call("clkfreq", {"7"}, -1, GET)); REQUIRE_NOTHROW(caller.call("clkfreq", {"0"}, -1, GET)); + // other clocks removed for m3 (setting not supported) + if (det_type == defs::MYTHEN3) { + REQUIRE_NOTHROW(caller.call("clkfreq", {"1"}, -1, GET)); + REQUIRE_NOTHROW(caller.call("clkfreq", {"2"}, -1, GET)); + REQUIRE_THROWS(caller.call("clkfreq", {"3"}, -1, GET)); + } } else { REQUIRE_THROWS(caller.call("clkfreq", {"0"}, -1, GET)); } @@ -1339,6 +1348,18 @@ TEST_CASE("CALLER::clkphase", "[.cmdcall]") { for (int i = 0; i != det.size(); ++i) { det.setClockPhase(0, prev_val[i], {i}); } + // other clocks removed for m3 (setting not supported) + if (det_type == defs::MYTHEN3) { + REQUIRE_THROWS( + caller.call("clkphase", {"1", s_deg_val, "deg"}, -1, PUT)); + REQUIRE_NOTHROW(caller.call("clkphase", {"1"}, -1, GET)); + REQUIRE_THROWS( + caller.call("clkphase", {"2", s_deg_val, "deg"}, -1, PUT)); + REQUIRE_NOTHROW(caller.call("clkphase", {"2"}, -1, GET)); + REQUIRE_THROWS( + caller.call("clkphase", {"3", s_deg_val, "deg"}, -1, PUT)); + REQUIRE_THROWS(caller.call("clkphase", {"3"}, -1, GET)); + } } else { REQUIRE_THROWS(caller.call("clkphase", {"0"}, -1, GET)); } @@ -1365,6 +1386,15 @@ TEST_CASE("CALLER::clkdiv", "[.cmdcall]") { for (int i = 0; i != det.size(); ++i) { det.setClockDivider(0, prev_val[i], {i}); } + // other clocks removed for m3 (setting not supported) + if (det_type == defs::MYTHEN3) { + REQUIRE_THROWS(caller.call("clkdiv", {"1", "2"}, -1, PUT)); + REQUIRE_NOTHROW(caller.call("clkdiv", {"1"}, -1, GET)); + REQUIRE_THROWS(caller.call("clkdiv", {"2", "2"}, -1, PUT)); + REQUIRE_NOTHROW(caller.call("clkdiv", {"2"}, -1, GET)); + REQUIRE_THROWS(caller.call("clkdiv", {"3", "2"}, -1, PUT)); + REQUIRE_THROWS(caller.call("clkdiv", {"3"}, -1, GET)); + } } else { REQUIRE_THROWS(caller.call("clkdiv", {"0"}, -1, GET)); } @@ -1379,6 +1409,12 @@ TEST_CASE("CALLER::maxclkphaseshift", "[.cmdcall]") { REQUIRE_THROWS(caller.call("maxclkphaseshift", {}, -1, GET)); REQUIRE_THROWS(caller.call("maxclkphaseshift", {"7"}, -1, GET)); REQUIRE_NOTHROW(caller.call("maxclkphaseshift", {"0"}, -1, GET)); + // other clocks removed for m3 (setting not supported) + if (det_type == defs::MYTHEN3) { + REQUIRE_NOTHROW(caller.call("maxclkphaseshift", {"1"}, -1, GET)); + REQUIRE_NOTHROW(caller.call("maxclkphaseshift", {"2"}, -1, GET)); + REQUIRE_THROWS(caller.call("maxclkphaseshift", {"3"}, -1, GET)); + } } else { REQUIRE_THROWS(caller.call("maxclkphaseshift", {"0"}, -1, GET)); } diff --git a/slsSupportLib/include/sls/versionAPI.h b/slsSupportLib/include/sls/versionAPI.h index 1fd79f94a..9a00852b4 100644 --- a/slsSupportLib/include/sls/versionAPI.h +++ b/slsSupportLib/include/sls/versionAPI.h @@ -7,8 +7,8 @@ #define APICTB "developer 0x240918" #define APIGOTTHARD "developer 0x240918" #define APIGOTTHARD2 "developer 0x240918" -#define APIMYTHEN3 "developer 0x240918" #define APIMOENCH "developer 0x240918" #define APIXILINXCTB "developer 0x240918" #define APIEIGER "developer 0x240918" #define APIJUNGFRAU "developer 0x240930" +#define APIMYTHEN3 "developer 0x240930"