From 68827546becf77d0bb2130b8a46c56a4a00a73f5 Mon Sep 17 00:00:00 2001 From: auphelia <jakobapk@web.de> Date: Wed, 26 Feb 2020 12:10:34 +0000 Subject: [PATCH] [Sphinx Documentation] Edit source code section and section about internals --- docs/finn/_build/doctrees/environment.pickle | Bin 134065 -> 134314 bytes docs/finn/_build/doctrees/internals.doctree | Bin 2626 -> 3684 bytes .../source_code/finn.analysis.doctree | Bin 15589 -> 14161 bytes .../finn.analysis.fpgadataflow.doctree | Bin 8422 -> 8352 bytes .../source_code/finn.transformation.doctree | Bin 46556 -> 37474 bytes .../finn.transformation.fpgadataflow.doctree | Bin 78930 -> 78930 bytes .../_build/html/_sources/internals.rst.txt | 12 ++++ .../finn.analysis.fpgadataflow.rst.txt | 12 ++-- .../source_code/finn.analysis.rst.txt | 5 -- .../finn.transformation.fpgadataflow.rst.txt | 4 +- .../source_code/finn.transformation.rst.txt | 5 -- docs/finn/_build/html/genindex.html | 12 +--- docs/finn/_build/html/internals.html | 20 +++++- docs/finn/_build/html/objects.inv | Bin 3804 -> 3785 bytes docs/finn/_build/html/py-modindex.html | 10 --- docs/finn/_build/html/searchindex.js | 2 +- .../finn.analysis.fpgadataflow.html | 13 ++-- .../html/source_code/finn.analysis.html | 19 ++---- .../_build/html/source_code/finn.core.html | 4 +- .../finn.transformation.fpgadataflow.html | 39 ++++++----- .../html/source_code/finn.transformation.html | 64 ++++-------------- .../finn.transformation.streamline.html | 27 ++++---- .../finn/_build/html/source_code/modules.html | 2 - docs/finn/internals.rst | 12 ++++ .../finn.analysis.fpgadataflow.rst | 12 ++-- docs/finn/source_code/finn.analysis.rst | 5 -- .../finn.transformation.fpgadataflow.rst | 4 +- docs/finn/source_code/finn.transformation.rst | 5 -- 28 files changed, 123 insertions(+), 165 deletions(-) diff --git a/docs/finn/_build/doctrees/environment.pickle b/docs/finn/_build/doctrees/environment.pickle index b5c70b7e187c6716b679b6cd48e85d68061d42b3..6907a584f84aa14c161fa0cefbd657fd4c13a184 100644 GIT binary patch literal 134314 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 TwhueWVX@h_FQESn>(&1s41((m literal 134065 zcmd_T3Ah~BSs*Igvi8l3ye~IaY)iIpU+=4AS*x{P$&&0ij^uXT?z*?T)wiqNT`lP* zIA9=7G}M=fq)jqp;E^{oESWIjg=G>5!;lFKBoiJF<~?8tkmMy0!jMduK;C13dH;X@ zsygSdb80!&eKp~G{`~b-{dLa2pa1-4t?ya-`qCwrEW!VREBoC>vvaQEcFr_=UT5Cz z_`_hs&Ox(X-=l!uH{9~-@Ri}_;4-J%9Zm<U>R!$7xo*AL8wOjZ&U(Gm{jO7Ur)Ha- z&J?`t)4!@ShzS8$x<3q-^?Nl@>H5@4P^jj0W}9=vU~R}<^t@~ry@=Ua>78+Vy=EOy zzcLIi@4Nm$u;-rh-A=#hb^60oLn-7rzv2vh57-$x!SZg;Yq>R$cj?~!)6>IXWzFj@ z^qO-G0Ij+I-uv&pXX5#08?*x)LA8blvfldU%EYttgPu3n9!xl$`ow|C#8KDpH75^x zZU=c@=ezUWw&T0~YS-}_NPkr|h5_9T?zvifP<QdQ@Ad?Xn}cPfD&XQoV=zC{uheJY z-<93RtH*t>=MLRqRl}ceSN(=N?}CX)Gu577k3r&n-*^0GO_H8>`aq<LA_tc@J9QVN zS?6{KGu2wZU!85XL3P05I#HQ{)(TKdDYUll4SF@V+8@l$HUZD-n%8cF28Eu3)kk`D zx98S(H$kUhp<|%fO0SRp)N}iOZ&33G@Y)C44Ew>_&R`yFT%GlL^NufkYk8k=fx?c{ zzb0-+mw{qXaTqM$+nlQi(B-}}(+0?j6ZltvR@J<^J2}(#YNw(8p=RH2cINQSAXs+B zX%B>lY;IiBxHh;9oP9X`&SB$*#*K|#_>b!v*9S{cTm%Qp!Kcu7hQX4dcpoh9xoy|! zyTitQ0$dJG<SfLGE5&1VcHSROQ-Kw2r!zNj=G+Ld8aQ*>ZWWwgD113R_lFKuxQ?W( zM)ibgIu6?Unz!{l&wr)zw&>j}Zv!2^LcBFLH?{~2je8pp5~}r~ncNQO1hfEtH1KC9 zAD!%je^QZkVUe!W>w~bMe!_8UV}c5-sk^hzpzT+C9w<5#>N=-hug(rS!s6g!J%|<! zw-2g)7uDK;1?Ii_00c$e;}<tW3z-L7dw$3B-D=OB1yAXqD`C_ao)3xk8{XL}HMM>O zT-RNg!?4t^_WcFH%U(3nl?`a9ZEUQu%D{3V*P)bG$TD7+yfhN@rpC<;foFZxG^;ZZ zM})lueC=u1?N-k^y$)zFX6B0ipxXs+?#nl)LSol|+@gI|Yu^04*Qr7|Y$fnsAY27a zq3U*<ZEr5prvO0|Qb1P<MPa;zCR3elJ3u>B?z%4M(CIBeTb_5C;GLIt!2{8MgEbup z#h@S&%ZJm`2-`p~B@(^@Z?N#Z)9Hd|_N#*)I6Prk(P{eKX6^LC@VqFrE_|*w=Q<dE zPEp-u)M_K!TopEAXt?mNYTfNZz&m(}K-qYt@hIV54-LFgg#t4Wh@5sis(pokyDx*D zqA(D0vpT8)jUp0%mEZ1Hp=CB_7b4JV1l7QSdVW6=WYqv1x(eb!M;2l0gWCL;2jF?J zGOtu%RYy4VFu3gH-O$8^Mz2=ihXEU#$>v~X)Cxs2zO>~)NM9kkIc!L$u#W@<L+lfQ z&K(fGwIbxsKnxLWx^XR;LO`Q%^Yl|IM5nwYSc-5Fi&lve6!aS(Z+sjLc%_6@6~7km z!tzZYT1w+uD!*Ek4|^~Od7>aO6v+b4<aUPihI$8Jpxx{@+}<#%5%wB!AKAE`%C8sb zp%3o(&DkbY2$l~zr#s%+2qDq$*F?|N_$<|0A!-ep^&von%8B(F_UJ<jX#s)epp+Yd zLhgEQ+;@deCh&DVY&Bu0CSEk|YTQi}No`T*%L)ag4d1JUE_@jwCC(8HX+_u!<Dz{? z7eL8fl|D51Dl}4PT#=JsE%=&uLU{FTvyN?K3DqKLMA(DIh@D-t0~rUP6-J`h;L%m; zx!*<L4FV@5J+)p_#5L5Rs6cNZU4k$&1DOt3FMM-_sB^a0#C{QDG;}PhAf;)(6$(3T zBG`Ci<MuEtiq2p7U6f1Eiz}5Eit|y3qj$pjf~zp8nwWr4Ho))=Sqb#0gkys!2U7R^ zs-Ih$@*WoaR|*6WHa%$Lg7g{znRU)ILHH2ZxTi5G-Zm<YDf-79jXSCQdQl#NW6$C8 zZ6wr?HB|@QI;3&X<B4vadIj;e5B@j<JtuaX0!)>l^8@XA9j6T_(FLN{SBY8_w$YN! zng~RqD!s#gv+F`81jauNZgA<Rej!9niJ9sGqFSiJZoBD+zHy#dp%<9RR;iB%zZEsE zCf2csr58vldU*}K6zLtp;}mac#fNl_Fc7QA3OIhJ?>fC&15+S{A#7Dq-Ow_`kcu>X zLFk0<%fvfmHuex;mO8cY1=$%L9Mi~1!6chE@Vf)(W8<{va*_6g+>_%%-wYWC<P4A? zVrL+DC-YG!hJ93&-(Fgo2rGxm6C%reg9}10lWl^?lCr80GI|(Mp=CfE50#E-VV$A| zuqACmqGFeU{dA;f!YBGi$e=Lc?nV8asPJGF+c*G2e}LZJZ?qu%h`~tkmWJ<l`;Sje z)#{yAzfx;^gF0jxJ+}gynR1}uRJ%FTp9*VD-Cud6^3aqR&iIv9e>-R%`s8gV+~+5E z96mmI`0%0Xz7vNJc|G`7s4LOkBgLdD)<vv@F%J96OHXbFZ$G(Z=#nYo%JpU+Mo|l* zL%sCmTd>fns8EcExQSxG`Z*T{ROft5z|hFUcLmEskmyS{MDH>67UAe!ty3@#7D-X` zZh&3V`51m>1jlh>I7ACOf*ayjvfcYm51^O^P<+2OD$~Y*0>P%!2VLSo^7_5c9y&BJ zz2oqniLHAM@7RCnsU5p_AKP>M_>;q!_(oZq1`{xjbmoV_)rWRWKmF{Er=jYhLr=Av z6|Xm^R9l1QItT4w4ttVdMHej$5K7_J)7vO6i<G6YC0KzY_X?JZhQoKhxpMNUx4n`a z?g|(m@-BmfX8?VOKXim+uObo@p9N$CL16L#d{%_NFrmDWUSLq6f6c?717di4Fy9GN z(U4&*at?xLl%ZZv<$bT)cF(x&YB+er@eU=xS5tvx*cJSQIF*j~(hl?`=m}R*HSr3= zIAo{LnTuEJ=oO3w#ef9Dj{sjoU?u!V$%R@A6kY=_z+ORsH(*<boTzp>kz=ouFED3| zQtvAyxQ7!C(1jelL|{_h_|172!eFQY<ps{rV19b=@?;gKQ-h8eVxf3(oum@JklY2A zzW9dF!YjezVJ8Qz7~E$mx)01Sh)y5f|3>HFC6Pa@#nMvOq|B@OV5+vuJJi+{&>krg zTmin=?96&Nbs;i{$Ww_FB)2!Veiljxw;t)Z6Tr4Rp=3l8-t0s?zq9smvtM)DknDnT z`mvi{8Bx&Pazpe=vvu^s=vFb$QdnqM;i#9)zA-}30m)q7X|}<a2BCvteLwQ#S_4yz zVEJ9!Cf|PB-7kd^WvwXEanGW}@OtT>1A|P8Hdl#vm`lWcSv=rDx&n1L4r6^B<=^LE zdI<)tz8?>;uB~;ulwRnAT2bc;QJ`LhnJkfT0!LBkyBc4KIRew$ji7TdzT56XQ0>&i z`2rZS1S{h=B4}R~KSl*1K2NtkAI9yg<?Fh81|}Bf#Kg_zZf6oK9T&S!77NKmgRbC` z`(&|ovKZx&F#?6o=^4-x%yHn%q44)fiC}|70L8@k+JvI#&f_!)e}Ap4OY;a(%RC>W zxLy{SZ+4(J=*?H#5a%IENR=oW>qB&emS67=8=sDmC_K^}l=^bLq!4E2D@Bvu2bPjz z-Y84qv>VJTb*eM~1mBUIC|Zw;(Uit1iR&7PONb5m7o{rerw0Ar)J(H8)o2d<W?NQK zG!^5eI#<MXq8GB(gd_yX1x_4Rp-I35EadCH=fUWU0@DU?By!BeX#EO|Rs2n`9OE8D zD9q`g^ALHWC}PNj<x32*QI;7dk?UWE!4|fL1knv4Tui5l$+ED*n(zh94Fs2WVBm2k zN>|l)S{`-<<}#u$f>sTQG*0<nPJI)_k*l!)2vwbT#heXz5G0hrDyQ9TI5RHv&tbsX z7!{0W3nS}>*-!Gdk`apVabsKnRtzA5z{nJR$-#-@XuK_%fvH_cle;i#lu<^=f~@)r zT^Cj|;8n0v;vhb*iO7W0c}<ui>Om3~C34a0W(VdwU_b@<h?^*S4hA#9T1qxy782OQ zzBjmvLC~3c4){T^4Du0VWV&%pur6G|i2I`DN5fTzXbq#WqOlU^Zi5v-mL^T#1Bvl^ zNR+@WA&Y|nXxlprv+do5&dWH**7g?UT)s$ph2kLhgwg6SxGS97#TFn|VJaf;q=|Nj zjuns%(n#z-KvzD_5;Ps0d$={H;xM>FE8#%vS?D+WmD%o`1H)y9cwGVWZ=y8=1u%+e zWI$n!n7?a=*>`Y#Dmv))I%lyn>f%xdtvbZ=K#rz@XucV+ub=6;XPUm#2UDPzAid@p zr|wnz3oubV4DM8`iF~&<fDkzkEhNGJM!h7?f(AF}@Cd^&xJP@LP(0U>PD4bw3xk=) zKAdO_mv}0aX~0+weeSx@pJHGG))`<5-p7~MCSQUw#5f1uMGJj#MOeoJ@YRVbWHfkj zed0ySIpffLlW_gSTO8R94_+E<Ou)Mfux!@B8cF)NFk}Gt{W^k|5uV|}M+d>xVONb# z4lR!6Scd0=D;XR{d|;sSums@Y>^P>`!3xj|PIuu0=o5n(q(-=k027;_vh%@47yvt` zt1eV&S0Qo2seQ;{-W9Cr!t6iBV$n$l6Vb5w?Afyw5()=hQ_xjRLCO9Ute|0ycwqxt zf3T)ETT^h{6yXq^O{MAjvjPY9Dp(&&v-<0r9X6lQI2Eje7$N%Q>N#xBs0AGN^anE> zx~k#8+Km_(LCPOoBYGpy3e1#41c0D|-CrH#yh@$tj+Ue_g=<{aXr2$&Mia!Kd6+S5 zd^%VoDpaG{^g*x!X7okGL?yQlUb<w-(>s3e_4mL1!#{IJYis=UuLk|rZu#{0TUy)W zr=R}S54E0*pZ@h<-`m;~KYjH4^R0dH)6X1zLu;FS`Y&&4?T?>+_A~dlo{pb>?Js|_ zwJU!5&0D_QnvS2o{Z~KVIubp7_Z46Kht}cv>5+{eZ|#hqc3%6r*3tOsg%2KYJrzIA z{oXfP&%{sv(ml{RAfNu+ZS9DketgfzT6^Wwhc>qk$)|68V-Ub%8;*-%;tEG~jr)St zVSfrkWn4<7^#$-`2y&NUTYum19m8XwZPYJz7WY&tQ}92ot<8AeX<B@rq{M6zBl4ts z&Vf~Fx6(f|H@qOUjrBG{rRMyc=p`nhW2>F6bYc8_K`0UnY$C+4Xiw|;QMjLi#1faS z7N9W<gGyQ{5$+eNVU+D)swgU?qOHPc13KU;mbxGeh+I6JhF=Y+Q_yy+uxJL;@95)# z&QpadHeeM=^bpYek|-_+zd<H$P2j?*yeaJQF!K=9CQK!~P6wu9&bc*F<Tg{0a5Rup z2-dn_2{kS>F$Kxg6vjgbXY8gZC_PYlcnXG-^Mcr2CSr(S0AmluCZcfCBtkq~CTO4S zLE`N8M5(7!srF&gaT4;=(>U`zg;I;3>XGT`=c~u|9ID<|eYlDP%$fTU(*@B2g<exp zIy0oSe9b?Ylr-v;r<jNMI12}BfiM#yq<Ld%HPsJ;?Wx5Wc1o+DyP1VtdI5$pGmc+t z2tqrHVE}8MftfFKUlIBtiE?{5T_}*)vH@#OT^QCVY-~<t<6Ot<b-ixQ8+3d@EZOAZ zL}@A(Gs^a$<Au&AYI5m1#j!b5rjVieW^6Gr0q8fNDK@-z9htcx;&ZV!`2Pz}z*tZJ zcNZ|k!u+Gxg9u>!w=m~@sg`FhJd)e%{+5g>nBTG%DR{fT7;n)&4eCK|N>mc4Azy2X zka0ou;l-j$(qnkeJ|!A4w2pZkj5)CHsYAg&KPV+zTLLjP?zT|DmV`8kqRcG!W|xI2 zQwTj#zeLIkoh9zY6X<85ondAT2>=XR1w)fXi1ZsyH|)@Jn3`!qw&3(og&1iBiKKHZ zdWVCF9J<8Q*|M<)QG<~(be2)5!}&}l);(!~Y2G;vJO0E7zSo3?Ds+(VL=RbzsKFk! z&Y&wW+pvbIJ$Pfa*@f&W>avolQ_^RY;r<j2EUL-wb*lyMQaw0RB1G70Q5_}<+OQ8u z><@yp6cV{MP6(1SKVgAL>H;((*s!S$xw**D#Qq9V+eQZw?M@eFR49epWyN|2{0deX zy((t3A_pM_SUC}_ox&o%V1Angbzwl7oWjL1>-v;{iv|*VfK6C@#DZ7emDrdF6ibXY zyODp4F(t;qB}S<4gf1z^_Hqsp#vrh=)`gi8XoMIoMa~u^d-X*8Q0hA~eXlno9Oi*+ zBPx}8u9%b-wQ>xo)`I*NW>ur)l3GVj-(~7hZ5-3KE6p*!A`MFm9xJRmv04K`LZ|^1 zctOl#6w9w4B{J|EPqx-NXR7Vl+7wtA2Jbk9FSez@9ugcq_NR7DKPSwT?C?d(hCM6v zs<qQlQIsk{;KbftqN;sb{6Om1lMiQSnm*_~V)4d=s)Zmp;uTyN-{NlGvf>>N#Veti zLt#~;>eWO?@OG0)E}2uqR9~|rPA=4ktpx~Gt?z;#oQMk6!Y(A&fo0(KS!ba?d=Jc6 z&BNL@8aFKZRwx=Q4d=5&on>OiQcTT?Swk_miK^^Z#6%G+aflLllz`5jtn4{wX^I_J zSyt2<aI^&WK*5T0>ze}o30Q)`>9X}Z!-ar}J+u(;j-kNN`Wq~!y$zO$Wom!e`WCz& z%s8;pCD*fY>iDuIETO_FiREIIOe}K4f}7aj4$u{_J5)Z*fHR9dBd6f#!E)b$<t*65 z-})<oTFltB{u}(8WD*=T_P4$b5D?>U;ZLxBPp3ZVdz0{IVlS@zaPE_DTT3njQ>=p@ z;JkGS{Ka|L%iu2{yqx|lr#~y{&uZ~!&{_+BBffBMHixgv_lwgbjGGWfJlq8MM&SWx zgmZXU|1{0$PaF?dyBIgxTjJ}k5&6Qo=^Vc31QBC~K*YhLBXWTA;W-?v+#fHqF*X!9 z@v?VBUT`)(hnK6ST^~0bO&o=kz=0Vom>l9>Y%D?iofwfnTp!5cZ~f6XPd_uUTdbsF zvdVeW-V$FkBl3kS6*+vZJ}y=|Cw4){$$4ULh@b9={NP$i4nHe)gsZ!p83`s%-aaBH zxK5M9$+ZzD6O$8rk3PL)H}oueY)mahd<G-(i7QAsd@kLE%fze!5{NkX;So8&RjV8h zR_+orsS`)KoDBs|y!_;dyx^Ky4lmcmykwd!y%=%&3nOxh>v=hxt~-HSbK@-%Ty@Ep z#MP%q<O-*wa=5ygbCs#YoU+98?~KSZ4p4J=zER`(xZG~S8b)SG;`a+9@{8-UIs7ht z7Ppo$#t1|le0@X?a7{Rm1F?0Mb09#(!QYL@0j@*maIo@3ya|Z0p}>ikRZB<9@NgA8 zhnH*jhUZJ2_QZ2|+ArEI#5hYWMSNa2BA>WEpTp;^&xx%?6Z;Mw7w5pk$K$xu2sT9a zxl84iCcf_&jqgFQs_nsUP&`s42UcQKLjw;SC5UYpEzH%$7K|2V$6`Z33$s+Q^`eD2 zqS$uP!fZ@zxoBbjBeq+#F!K;Q1X|ehi&gp-_N`*6yoG(7Sln%44<nZDS{T8_l1vMu zrr1)^!dN7>Q?#&^iz$c}wl=YiqJ>^BwotUt=fw7j7FtzoooER?!3j&)rx))!p)ug< znE@P0r}I7W$T2a>5`)E+cmk*ji`Mfg#e((WUMAQU6b?wQh)xe-QacCB;*FHL#LLQf zH&0qI8t-L|R$KoAT~Q424p=(}4%lh$9qja32HXsK%^?l8SJCETF*a@N566Q0P{D%M z9&1`5id`{^?PXDHi%~pY7R95YBKiDd@NeT_`^mHyyVG9mPkWI+Zf|WwhZedW02aGp zve}Nf`3Ghy#PN+ZJNB$;X?FC=qL6lMmqiiUQA|!;G&>sRIa-@y>;0IuEN1JWOnKJ( z5o=nS^?tZ43TeIfmqig;PfY7rTW@o#Y%|Q7B5K_i8}hT(Vwnwz;^i6gH>_!ChWs^w zqLrq{&8=~VvzzvLXD57b0?yq{KuR+qj)7nY2&;oVp50^@rKtBcYZVk!cX0D2IMa+1 zroibWa5{;}^JL6vs7cwk{h2i<nlZjy7KLn8UnF~u+iGi$xi1fzu%l3%KwvpDe??YV zclmhwBCQbwYd7^&PBbg5wx+CEVMSRKg{@FJ2wih*(80AZYBkNy#BMmel593<g~&Ab zTT558!CbqkN8C|MX?7-IS2=R08EMLz2hB+L2ox7FZf%d^ztfoz=`Y^ya>kv2E&uKI z1WfV3F;O@#>~*n;Ou!=?7J+dlJ{cyeN5)3RJZ`PXqQ-n`6CM%=SDSP?lZw2PLf%P` z7xsb2@=n5IQeMsKN3EIFtbVvG3fVLdkmHOyK;9g+OzhJR3}D-|+nb0t&hvgPr!1NF zthJ~`O?yk+PO(>O5wDYySIuy~H7lCoUM`Db(G7R2YB*d^pXd)@_&xy_s=*1E_5wFu zZfP>!2d%{|YP<<%Jmhy$@H-jvtC{Zu*34+;d%Y}*MK|9YQ_MHOYXBw=xE<I5l9)6r zR)q}tE7pP+HRSDSh7_DnwnEM|Yktz2Bh8whD2pO#P1k;301n<rwbX-`Kq0xHWVZwg z$pwvnN}!Nje5!2L9u8#1K7h0VSnBwzbPlQSDQInvN3TnljVEzOnes-jmsr!%Joz7l zC#PnC<5%9=H#Ho8qS+S-_;%hmB;JviZ?YEB96&UM!bs>W@G{x#i*#F0vL~!5YwEpO zph#EmPVju#i$u5ZrcFi{-#R2WObKb1L+UK<qd7I)JRN8U(qDt4u*xxWeAEuNi!#w< zb$=+z#2XC5)7%J*Ple+HKi!QGc0`_vs7pu)(NB{jRGwFV4Q|?96Yg`1uJM5bo1oy< zH2xgLpJVuQ0)L*vpXc%C1^hXQKQH3XOYq~uHaO=TY>LLi(U-&SF^6vJn+}%FwY?cQ zy}PW@ti!oan4Vu7(hLFTgB5g93!KtD2rZP>bi5AaIp>2_un|t`JoJVqfgqfl7CT6W z!KT#fm0`C&TmnoN^DY&a035uYn!po)!ERzYBrT&fIpRoB`i9ZDplCA^7yrF%*BkZ~ zV#k(sUr~0>Q`zLDPWiMB$Nk0ot+i?nZzxw@e=)SCr3JJfEQ><+_U|r>BDA2`=XTL7 zXxtFTZ26YhmY=eg%xp`PFwd61Vogi4<tNLckhc6pSrnly#h$>6W=m}YA+uvMw&Pz~ zOJ%krN|$HHuUXU5?D%J8QAj&}xh#s%j$#j`wH-@m;B40=Gve9Uh}SK*?KI6sMA7n$ zxY3%HX2dH6iu6n|ZMv<r4woMm*TE--_A!()k4LNpE2zX^#ir<bpimWZ9q2)8qMA1E z%hBd`@OR_hgEG0c@DQGBXI!9!S*?D<5FWA>*>%=MMp!lXE+{j8Jih_>O)2z?psUtP z_%nk)b^MuyAC@Fvl9eRGbu{Bhl3Vj&m7tQIAZyn+;ax>74{9A;N&b2S_#QD+Cf6A$ zN3D#`1%-o=xL7|57lRqvNOtjJy4<|Z0{T1Rfc`;idCaj0_t)nI^bc6m(n8Sd0!3;- zAOF69JHmYd;+kpL`UwBi6>t+>xZPGPu;Eq#KIKxh5;d=1v{p+&69jigdj$mdxMUV_ z4|mt}VTK0Q$Hd-St+)6$);wvZ`nj?wWCHcSk+sL(ORqXUn29<{wOzoMc;pK*&L3M# zQPeoAH^Dt-5f_>P{?MAPW`N%(?WG2rv3A#@{VUz|bm7|*UxP1-B&VQSm&3O~;6o#F zKIzhn)>S@Y(N#vxNz5-%pShO&=5NZ{4|9J)LG~M|w_2<Qv_3wdbQIzU?7n8LNPA22 z+zvLiOCyRlr45@RLx{Kr{AlgzHf!Qqd%9JixQKlZ++zrr)JLLKqD$zwveOEY&i7i2 zT~z0{ghLI{ff$(7EU?R(70m+p#UMKm3Q@=|Wg8hWtxG98CHV$!D!iI%mfr-(t+vTj z{$zMf-N`ELz$X*7tc5OW!YyVKnwZzDIcLq4X3ct86iI8A2$3?%QmZb3LUKV-wgd{v z1?9CRP)IJ`J4%lOBNK5hH8ojCYcQo}N>Wd+s$EIzeepo$qt@PHZU!i3-azFe*0eO| z{waYXwX+!i67VgFE_q_JdUALR4?lT@Df0Z5wHgYl95yjWy;|5|Ppa2*=)L!6tvS&Q z@*CL(8UM)faUSAT0V`>Duujl;fE#ODHlmYso9juu&h?~nC2WL?Z21jq4HmWK6Xsr| zki5F3|BE%Bnx+4|ED9M*|CF31E$Efa67J2gB)^O|GM*X?gZr|pryKvOm9}|PQRClN z!1!D;-Q*jrxzkL(wk(RI$xHOWvJ<BeQv!wL;@8UhuH=Gxo{_lt@lm*dR6<-Gaq&_K z{ThnahvK~9d281&`##E)mp43XO-u9SV*<rR%p2mhDHdvCDD@s^tpzKn#H<x7-<qhV z&6l&aIsQ)nN)e)Q-Km1tf#GH8yfZfyART|eTHK;KzJUd4&RnQ6xlZ`HH5;1N-&+=i zjDznX!;QNGzFC^ba5Fr&)U8@sK0Y6k**<A4Y*Dk_uA9xov}VCiSaYOV@E6LWSab{0 zbeHg9$d%*k`nl=S3X#RWU@crxi}5)zok`79e`L*yW~%>O7R92Q>MGfQ;?F{GJ6+97 zKmrS&YY5xb(pBThS+#yUxKVFcl0VHvmss<mndl$BV@<SC8bJ9h2RD+^n5Yah(`IY+ z6m3j5>t<4U)C_gIH7A;(ZYzso(c6-0DEVoWbVG?U%ut7{WgEp%3Xhth_FHqJ8ES7? z6iGvs7$(V)7G;+uP)II1WkZAHf<_D@adBi6E?~STF6z5@<2~haKXuU3`e;1p`$22} zFgrU6mN)2ow>2%zoqs@}NFDU04^v9dzN;G@R2>?2K>Uogd<AtGWbc6ZX=}QgUO$|z z*Vb5fKnP!9J0J>wfYG=G;`f00|4CaQ9<|s45q~O4*#ohH67An8Ye5;@$busUx1S&< zNE=F)ZbIwjb)VBP5=riXNWLYNeA`+jMH|zGO=O8luM3Cfksqz&{gyRxtwnv4l$jRm z(<4>cDf3l3;j5GryTqsDd7x5WkZ!MAJ)RMR7W9K_cq$rwyi3>cMr#%{4PRLng-j~e z3lynKjAcy`PM$>4SNNyPcrJPi4J<_2llZ~eL}9YnR%=;{wuZ#qNgB^u6M4*<Bh7#h zmqoGY2E0}=3fd(4L>)KXbxJ8=y0{n_?ImmZiW==!b2F2CYUVm+&5LHP7s{eobaQP{ z41wmNZ=t~b5jeAqpE->`&&3URmr_p{Fry-w^!u%KP}HP+eNg5K87yf=e$|>g&B$*r zi(=7@e4}D4G_v|>N^aJhl#;@%tSA}sC#~fyYRF9~ZIdyfneJa&^P`#We=Un5X}S_g zq|8Gp?<s*oazS}$2^5kG8Yh-OA-Q;0*&GnLfT6y)2R|+SOHDaSC)w$j<*UhH>zCt^ z|6f|Wi@61$oOvVvuUXU5y!+1tiqw(+_!W8;-r$`ao2a@Bj3p?%tXVUj3|mufaP=nG z5;d7Sf>~+JfTr<f0!6CE|EG>%CauLQ=)6H%_*Qpm>BE`3tohN@eP>w|GGx7xES5Ha zFFTxhNa;_p=T%ivN&Pl8?~@-^aELy+AQEa$&sgiGsJXYL^wtI03#}+O1x#CWsyV{J zvM3ha5$;!vs5wHMsIt$Tb1!&ML7;m<62nRQM0vQ(Ij~ksQ6G4`hz}&03whHVpl8jd z<^Wz<6yG5Zz&`k0$^k+Q+yVZnwOSU(0l0XY1N@LRo0<c>uPlm1cYxcK2CPMZ`185k z=65J{^hPf$QK<iAYuSrhd9p||m+WYU{Y7ieG{gRzvM3hauy-m((hUof%Kp65({8HX ztkg1?R;fnD{i3z}MU6XE$hZnantA`&nm5h7e^?ep(!3=Gu5#>4d3y;Il8ejA3L?3n z@!CjSe7WqXF&u%5@4H>R5qR=*aOzmG_1SpbeaG7I3=L7bym9v?Yg(F5PY4tjaTIv_ z(}QLmJ}u!*;9U&yUHR}8Y2`zFi8aK6btnk!u~v#X2x$fg?$|VkyyG_~Lf+{n{Uq;N z?Ad9}l4hsvWl_jhzm-g#Hhe5SHD$4dqG>HfQQKs1p_sL%s~Mn1+DnZ$W8Fd_d{5az z0r#ukqg_wL-Hr|0#a&N#<<+1ukGKoee0S3Ykh%3<_+ghdUA!A8wpnbyNN7Xe-4xzK z@oHHYkbNGxz({@GVzt4ICs_QPFx^IxQih`D$E?*;v}IniiJK<%W{Qtmv!FH7j|dbO zu{Wc<nhRK&ar|1N<MrmNzE^c-A&E|$eW3--v|1;j+R3OMS?71HRa4YDJh4t=NfAWr z+<x1dH_dFHD~m#QZl58`r*&>+=SJyzilkbaU9au*P${_T$A`l-gf`b8%ZfT=*Kb=3 zUevC4vjLNtomc?Prr)yWOS9=W%c59xo8BfywF#BXdhL1@CcFE-)A1AOr_l+p0-S@2 zYmh;2T(?Nse{ffpK@;3-_PoxTEzO=A%c59xd(zH<ggxinj@xq*UwF<eNe0|*EoRXc z$yc6I*wrkz)tVp8a*vfovFMgFHmqi6*6mfJL!*hN_(oIP6*W#ORmhYzYq^V>GBda) z`PWSPk~LqNNl%qUvFIk9NHtKk-*CFg-NAHSRH8A2_6*CDG2dw|aZzJ#&I+t#%#ah! zlHYI5lxE3S%c4kHvc#}Nj%+AzE`dUFK_i<IC?pp&7gYj<<l^SCSw}dhcob&cQil)Y z--L4W2|jF_oKWv7Vu@wz58^4t|7h(q=C**s=1npFrZp|i#eZF(xQJT4g=@8+eFIcZ zVG2KgVXcOODu)}Oc=UtIXuESxw6j&;it<%!PBepjCEFn5-}yu9NL)@fUsb8KU8ghX zGLH|6S0f{>SwEiSTWc4=y;*&PYOh!jt*=;V&75YpWo1#w_;{H>ks8R#4wEaUUZ3j) zPU1jLUTt>amz#O2Xyub(ZL;>g*4ilABp)trZ6=jw^GRzKHJjg67R935oG#(YY}B!K z`tTjAT7#RNb{iF_k7f@MkmXNU>!hgVA1h(`kTuQt&scM*8GpJgibXem;Wk_CbQk)~ zd2V{T{;iPd!|G)CbJqGOYWPR24IeV5nSEf*qh|JASrm(I_5wY!H{Wfx6Z750tC5}m znY99n+S#Hb4+YT-{7<c!(+vDWWl=1;foUIacFXL*y~sY!9pmMlZD+ylB_?SeE6||} zBs3omXii3W$o~J%T0ceY|D;7bH_54a!!KL2s(HgNmPN7X-at3EW_m-<b$nM$z2QN; zYRXBxt@$1y5YZ$aVmhgyBB%JWwVH}L#m?eRkt(j{7+<tzS96R%E{kH(9V5T{heq9B z==cp&!k^#$N40szzhc8;jqi$g{}E@QT$<T0x8_kZ`=w=3EV|hr$Zf{(F?Z29C_6FL zeR2Vv5Xg!sgaLX61qB6wd#v?RGyw3MoAbG2%xNyL#hOpe1@0(|V$oe7zwORDr=de| zyKQe_9==x0GynWSBUXoQK-MSYAGOv<QR6>aIQl0g(=313nn}&_2g;&YbjuerUA4Q= zdAVBeH6cmlrq2%^WO_sZ4nP>l_`bDLiW<N8fL|D26;8AM%hp_K*6)->vFO&%@A0LA zx;?MOZC}iHAm<ad7xl^VAFx(PQOg(a@)Lq-c7NTPN6qf<EsJ8&?VdlD>p`e?YHk(3 zmecm;;Oh(RuH!cnW5OqLQ-=`G$p{gC$05W-zVJzFB^C9B9fiAqRADu*_=GjLnpgZn zSrm)z75Vf1eb*P4*jDj!Vjc|gQwXR`S9YGH>SX^fSgWI`{fkfdbFnm||B*F|n$iDr zSrm(I^a6GhBR<hd>U}`|e7_hl8ajccS1i`JuXyf9gIOt>X8KF4nbb`G58tt-r<;_r z21fE=B^&SARHRnE*;<c9TlxKkqr4PGGxP1%>}h7ctt^UU3oo%#MsBvDO#mfONG`rq zb}NG9g7$`t#KpfKg$uaI=c$Xk<>$r|$t^#}eVA387sqhaw$u8vc*D=Uwa1v-1d5us z;iqLyOLOo!f#M==_(|$?vs7u~dvBQ~DF6l53Mi;-I6p{VHKQ+uCZefw7)uK}=dD@N zZ1P&RO~$|H$9N7x3R!Vx`d)8_XNCpqkez<oS}8^C#BUNvwNoU5X08ugbEcW=C(5Fb z(fMDH#m9Xj#+U^vcCC5sw$tsqFna6a+EAUF*f<klsE(t*us)gl|FG6bQFCV|fd<wj zXPV`I%bH2e@}Dh>V$m&67k#8Rho0;8>d9HZqLs+Ve{C&%Q6pE1#a_5#m4wht`&ZVi zX{P-~Srm(ITI1}V;`%*r(5YAb27JM=0q33)b31t<LDYs79a){Mef^c=8P{oPO^`Xc zmnD~G_G_$p)XaWWSrm(I_Ipf|a*BHT&AAS4^bnTgaojiql&DJEJE$^Qe4Di@ini|u z3$|}Al4kD5tr^tJ{YY69NpqJN70H1W<$EPiNG`swY`BtK&`4k;F6yIj0mHjzF7EJd z>9c;5pE_*)bv%yyUTfDdyFbd5H;(&mYg(Eof0saU5yx@sQF%>&VdAh?AGDKa#k98+ zQ$A!ZXhEe08#WDypGg|G8NMX(qt?VVEq^du%i|xJtrt-rMT46P`pp^-?Alw>@~5l? zEvn^fS>#sO(t`7^So5GM`;%o+$gubcve&rBRrGZ^AwC}df$eX#({MWyHx7NcATETP z<fs%G=})btD{3VELC2VZn7(GK|J#}s%~oG1i{fJ1N<HMlZKW8L6(Uoux@tVRuhta= z22(NmnyHpsv!a=5X;~DDZmM-M*x|P=xrvf5$ut#fVT!gQ{`nlyiUd=dN$$30K{Ltb zvM4U5Nqo1T*dV5uM7$)E9J3Z?1d|B5nn{jWv!I#eP+1g7laxrPWlm1{MhO&>iw~5I z%#sVrEl1*FVH7T4WN_djj|?ypvG~)v3_c}64*q^?*DyOc%9J-U7+TZPJoyI&iu94e zSTDm9GAWngO$Qs2H`~E|cTTXT*{QV$b$1rdAN7Z)hOJKmm+ZrVOM~S#r|UPp&Tu+d zI@k7QhUbH2jb^<LXHw4xYeNJvU`1yzKjZdb4*MWz70xgMVz1L)fU>K4&RN*q+G`3@ zp@N=V2KJnXpWwb?H`j&Z3gwG|OUWO8x~z?43nLqi)WY693K!7Ac9d#iWe*{*JTdUS zUejsw>B-g=aVz_ZwLIolhH~Y#vM*WF(puS{ltm#U_2<)3yne}&OP1h&&{CGe6b1ZQ zNq<(0KOsBlP+-cv7uA&4?j3Y$*iN1H#B;E(aJE@<M6+cJ<hRC#-Ej4IvT2ku&#-H) zX=#RCRThOb?DDcGLVF&%sP??|x#k(C?oHq~cbrarB78iK`^DUTGtpotW4k_KEv31^ zqO^H-ebkzkX4i+xqL6mIzbp!}>mXR~d$lU`Th*v{dS$q|br9q~cu8w3{n<@_w&R}_ zttau%rL8>#+(&=5(VzYF?rHq9thEdOENxBWpB3U;*YF2FVFZ8h#@d6cT6lHF!7Ig{ znuE*5+$;RS4jias)Pz6S#^4W{<lrTPU>)+?cWczu_J^+w2{a3952E)Kpbbz8w#m5F zu!}|@%!~n!Q}Fi?_Pf*ga}<A$;m-;Dc@BS`$DbGQ=Oq5Th(9mEkK01=u>On75rjW8 z_*2K9S@>~VC^-bi%U3`qAtZ(e@jYT8FxHiK<O(_Ay+}I-!3L3s;POe&of$OSb-^;S z`ks*W3xa3)gv`q)ltMnCIPwYQl20h0d_qa(6N)UKQ1<9auzNvhA_83yn!qR247>v! z$S2f|d_pD3C)AdFLUrL2YVU&37e3+VWG@JP;S)N{1#!7>{4@yGVonAs6SnRT-!lxZ zh*B^HT~+tyon{9o%22DpB{lJ9xi`~tYjAzzE5pXVgG&a%%38ze%(<{@m)?hu@%t6E zrcWIUV8JR-BZLUITN^!r4QCND2rjF2y8_wjp6B`1{=)o>*B-W>195_7$LZ;P!!563 z8Ij9P2P@&y@Q#0^cccqx=elTf;ZdjO%=ZDZCW7qf&EfOvx?6+mMTxKJV0qoEb)0z@ z-mGu-kGbmG^TEn$tpUE(g9P@}Fj!l4I$md&gh0=YeS4^n#+FFTIGsi=F*<<XVswB% z7#-jbMhEyqO-w`wc*5uae=s`0A8I~f8`-=$Sk{LLOE~)<(A1X$y*J$b0M{>3n!9Bf zTuuL?4N%ehVPpTa4{ZD#gudWbF<%qCs`wsUwd&0+C^&95;fM<|WDh#+cGY(~u+ykt zoqgc`&08imH#-xAfNrYOC;^wWXF+>YNnm57o|uCT?_IdKkjPbM!4Lz#UyveKNGwdn zjFb_sG~p0F+%W9)3erlETjF8pcj70sA?kKP82AHw`n%A=+<H}PlPE}%PJQYM&BV>v zpnb$K20UvryHE{3qbk1gt$0Z2ZwaLu>M#;p!vX?ZmS6@%;54)#p2cBBB|xNI(Wjmo zZVtVl&dJ9})Op(qoIHkTgGZ`i7e*B(&YJTgL@0tkZfqKburO7;kVY#@ErrN{q7LyE zUZ`5C@QiIbVPMu?s?P4s*BP(NNbcqD3hReg1Fbxop%q>jwkWCQj~ofJGU-U+*L1y} zTZwK`Rs7_7Rpy#nhzWPcZs=c6EOgz8&CntB`x6j51)Ho2FmIq%iRv<pm7V*icN}~3 z1YHQj(8Luc93Q4tW(K|snCY%&bHNZ9BQUjd|Is6db{s2Cf$pG9r690z5_=CF*>U25 z`^Q8g#KuTW?w>w!-^0ZT&@HMdG6-A@{XGD(VBcW#*jN=rr6GTyIO}=HA7IE)F*cgd zQ_KT8?+=cT_Xip8sP#w3hx}27eCouWV|Fbo)9*uUj6~&G5WvPOGutj9V+1A<X5p8a z#ud19^cJ3(i=MltP>+po=Bg**oI*Vo-kHlkcTa)d!asA-a|gxb**ojjv4_<AkT{-9 z%)5TWt3%|^^v@6(v+vYQ(?8p+`;EdR=rZw?uo+=vG(?t<$x+m)R$<FyVS2PrHiaIh z`bo@;_LEowCw97Czu%l`!-;FBJ#fVkqmV}F0)`Co2IP!`t;j)t9+VH+XUs-n@oDRS z27L`RqkbO@bebI>ZV@f6aT>{`kd*isox9)zpoL|k;c5y2K$O7T?2HL>v%@e?;<i?c z#+4a+2p7Yz=+Qmr)*v@i$6iWi`9>|XG?Ztkw;Kwek`m)|p<+W(h!l!n846SkFvfsl zLSWu)pY1ta7|1I^u^9)!h+2>#s~koYZ;DVD(q^?P4|D1phKEsjBpTmvPfD#UBP#9o z*7#?nDiL-@^JuN%)=pRD{6~0~f3**j0kAle^t=Mh?2#cWwR9zyEaP$~6|cd?jW95t z5j#n(mGnq)z8E3K2@d1wYchlRWVA|^RvJoi=+x3U-5^OAsKWvL`k=O`)FTp%`Y!Aw z6i>ma%S0cQDwI?K4Tp1l)kKN$BD&0G2R<|Dw3}}&p$nzUOl4Y3(kVn32Tvi7kkg0@ z-K(ImuC+%#RKz1SGK`Cz_&S`Jj4~H%J_@xA10lwV&<C3$wdSL+J{TFs#dd{F@of)l zCc-b><J3vEV}wiyDvSrwPQte$k%Lc-c-DLrZYN1fjF*S!pu<Y!&8cEdpclg>e+$ri z(TD8vnkgb@^!AD?mE8HRzd)D7z-P34_ndDnKHVymLqCO>fuoLlmXd0;MHM60B66e? zV;ns!3{aH5txW`SMsF)DA%VbQm?%m&9<CMYvlt0R{eix7#$MUVNHW!3D~OrVdJ-@3 zQ3AHLtc7}o1QEu;Q~2^C^a>go#>Gy29ma*l?G+4!7$@760*e@rlT;WFkH!a^t^I)( znsTC0jGj@wNp|kI6I?_?W#n-KxHTMvQV7JQ7@7w}F4}WNeb`s-iE*ZB2o=|d=uOux z2)<)*MZ?4h#iJ=)B|}B!(NN}hC5>oEhDgllvFym`5eY-TEg~#ffsII2(Kp1AHcuEj zCY?}N22Mu&7HR69JMX~|8fz-XzDYB-QjVdTQeLEKNht!RR%Yvz7qFBRGr|a{y!vhU zenSCXWjTgwswZEh@+ylYc$F_I3LYZhh8uFC#Zx*Q6|M<;T}87SnPvxl-<z*`UB>2Z zy9D?MR7(unqvF6>f<h&#!!S)n4iPmGvU`Lkt|SLL;XI^Pf;Bcy0~1)pk85S9)$%k{ zOpL}u>YJ($%Ye!-PUBTdLre9s8De?GI4R<p@G*K1)3^4pL_ED(NVL0Cgs&J7GKx=# z)-O67_>e2j8o;!wI!4QoGn~!UN>tLYGTKwv8AaMCBxb6YsF)ZHb;Cg+65*V?E|Riy zfl&zO1>*|ygEs7vkM4O;S|FbnOexP$KXMpxoshUvnq`I4gjO2PbEOceaJ-D>?wqE} zNhL7J7C?8V$`+7WExnN+DAWKmkxQPoCmKm+wY;W!(9p6B4wgwnvi6h}YX;KHhDXzy zUwH<@xyoV=Rjm2%Qd(4b#=_BmLB<r4Ok+{<h<qe7pcK^5%EII^r9hNMGD44Yhp?lU z)2caYMm9`AV@`YSToab<)IEi_7!w3YkEkR=cONv%sN>HRA*v0^N(R>G6*ja87b8Mj znPdo|n^j<YB@Wc^`zY~;R+J#iwlWo|%SawMF76=&8oNUputOE1ISeLJbD~N*Um*4F zM8i%mTuG<Rcs!XCpi5DZk?5ImFq|IHX9@-M5oLJOSY*&SWp=0;qOc*1jVQ|VV-dx` zDwCyQ(P4}z(5bNql*TWU>McsNAHQXejztiKMaFwF(>>SmdR?zugG<PKCEVR+4%%vI zhW4@N0ngD8&tb<uJZPr}HWdqmGTPlMW2*YPqT^+B_vQqx99%Lyg|pppN0w7DJrEtz zo43J7a?ne@b|kzZr(#}qdDzfmM`3TLC3^<)%$~>68sI2QK5fZl8V`)qJxU83g*o~T zTw(85$DNFyt*U3h?sZ7okge3DQ!Sp?2-UKLnn=6igqqwLoeVDO{`36cqLyZ&-490_ zcZrsnF@?mwc?|;HnJ~JFy`mswly=R)=Qd8yc;{xrGqMKDrXiATHaT=it5Hc(W4!E~ zfiq0XS%gxogbT}YSW9Px6Jwn0tKqy6d|TS3gH!Z<wo?3TD`*uM;}}RXuJ$L3&{tzi zvGrtGw!$yfs;8_D;B*&UlTf7-TVl=)SuMp_a%v&feknwm#-79h4xXIyd-J8Z2^Z(` zy-6X&ICvaykmwjEJJTeS%_>|WC_tTvFv?ruq#xJ?cGs1XJY0e;KszGCs6Sm_fCb=Y zjShR^xm9qSQjE|kCfQx2sjXt7$ap$|sS|9QaYNUss}2k4pDX&0f(=7jX@9{QB7@2# z&$!*5ljx=CK{6I@E6F#ZN{R6RTYW?bbn*MCaK5yZ0Siau1Tn_ReoQiF;kIBnEGW(o z(x$;u3>A)jW}1vIF|8W%1%U>d+X##mj(rMaDpAJS9xMdkzZCN@)x=)*T%V9$luXys z{7xj|oSx24v__G-0+fcmBtM)U<L4miht7jnLnS7+z*}f3IqjS#2Mt%mRRo+W<83eU zM*S9i%wq)OB?oz#Y$XUXj&|Z%dZ!HzC2mDp>`1_gF;4b1yAUYU&|Ny$D4d%aNiwc> zw4vq8W3;8>5`8YcKu^bMF+TQ+?28}jEX7P=&oK~W9PNXSAN&8Pd#1Klil@T%GLmFm zJ>Km(bMsC)KQ5e?g+v(Tr{McMb<Bpux^yW$gqv1#!xJnyD5Mw{+rdR3#?Us1QcM)i zE>ud4hsQ>so}5BU4Qxb%(R~s(@l~CE>6Enas6ZjaIM|8<68J1}tz5=gI5&^UFzVZU zZw_wOsMgx2OIbd-oRq42Nr%zT%)ems?imjP94r)xJTFWNJ@p99R`Xmf<0BOhW95Zi zlH7j0mf~qjc#&M%7J*`9U_$0d*1#Z@ze*}gjPujUsgyiZmLMpTu9wCvO7=uh%W@)U zB+;s47cFCAX;zshSX6_(W!zFJj59x+DLBC~l8utfkj0u{dP}N=OfyO9g(pl#lI6`~ zw~TQDW=<W{FRH7Z9JfF!=gdO$G^E8rHo7D3B3x9-X2va<&c7}nAF}@AlaKSy<m;Cm za*x#D8jE2?)5HOjwG$5EFPgK~7DLQ%VkBy9Ov2MBq0RKtNLCzs29o5S$=0%*?ifk5 zv1cF&=9y%WRnNl3a$?jTnRQWv%-H?XAOMrF$)`saRk#<&-RL;)OfI<4;xw$WHJmOC z-EuaVkD4IK%zy0BGffI6>rBDvnUUJv*t1I0bPsGfSLR?A)ftl;!bWw1jOn9UWoBbh zWg7c9Mq!+JTs@vESyXw(p8dycGiheC_v(!588SSK-98HAOrp&BXv#uhv+*oU+AKi# zHskoUhOz<Yu>vzjW+aS>6UU=n&3ktp5`=aVp+a*-W&$u#l(~Xzt|j+4Gfo({uI&_& z6)EWhFJyIsRyeb#h3b~mLRO@uIGIh<3TGw3Ftg5!HK$#x`txq?&J-(}QjX)}GfT{> zL4vdYcqBkpnFKE>vs!s!zoZqO9iJ5xW|<Tx3r@k6lpuMIfps2MIE~Y8FBYD5v!b;q z?I32A>EBT&tQN_Qo*SPVsoXL->WK|FizLbz<7<LpCXJY$u-`FM(#bNXC#-Oa9U?m4 zOtv;oUX<8%WW|VVLC*M`FNJX?-8n3Tw^u5o-1r!<cBPDY6}+UR^W&8?M+heMz##Qm zw>j5{u2os2=Ga<Pk(mTc-Z_+)w(=F7hbn2*%moT7oZ%ifbxzkL6X7hjZOe+jY?5P_ zN#$9WiBIY;k|&N?CeAaHNh~CprtlX@vdo1fD-S5Pf3SgVD=~M!NTOv<I@ybsV47Ji zl1g>ee>765Of#v(LQ(Y59@=NE-NiiCJ}z@Y-rizH)|rIDZed5T$f17B-k4yTNmWm* zvMiD(jx$@%*j3vwtg0-ML}Rp(foWzV*sE-_E7!{TWnY{;Sw6x5ne)qJnNM3dStK)! zvCm55oXK~x;F3>CBaLwu!?esZW3|jvQijY0D=VBCOFJ(qD<q5LT4S6OQ<!Dm^dhLE z*bZAOy~##D#@W@FRVKkp%1X$0z8w^1nH0sAZQ$DmUC(Qewrs<YFec=(&0*)<Q6yAq z*@h7)yllg2$z>bH3FEf>vP}_E(u0dF+Z4gMNXs@wNK0{wB}zqbW-i;5S~4g?RZ3DU zJQl$zKGz0ADvU79$E=qOicpgh6zgn@;2hVIK@nP#|6;+t2+oRm$v{kg@d=8;F}?^{ zDN3<Pl_EH4>H&^P<29j%D>p}<R4KxRl&n~SS_EgYNtMzAz9KA0vBnt35+hU=0Y)0| z*-2Dvz*huk?j@{c2Yf|{OA{3v@D;&XS=0ev5e}qOV{A{0GvKomXN-N&7zccIG87x| z6~Q^~0bdcC(zV8z(Ts7xXD7oLbAmAr`0QjDqaD%)e3=Jxqq$=BEAICc*qRsDV_jJC z&TKaC=EFCJ{duQ%ntgl?zpo=dfnc6iS86hHPo6jgC=Z7y3+?z*P{DZdfvlBQrD#PV z#5g!&yP+=ysce|ZOI6cUsIrtj+B=}^Qp!tdbJ@$h5GAE{>X>J5!EI70c%{-Z=QL7k z8^<yG;=#eln%Y*vw^GI?2h|NiBQutHF-n@UR1R1Rcor8n_02IOb9tbQ`pmpAexFmy zgiD)=PtxSZAhqd9A3QiB!zwe3<7bd#evQw_+TB~0S<Z*fr`-rT#oMG(OY_P3V0^v_ z^;u@CK`yt4%4*fb4deM3@=Vi4g|8pVWjA>zX`!yhzzE}XIx)l@*;RLyQfkJ+>M_F_ z<;Yx?(xrhBrpq^_joL<Lx0I)*al?4tTX4}Z*E>t~>85evA*+SJT)vXGAs1>jj0L8z z1IqAeWV4pa&J+e1XZzwo(a3z2%7tR`jH?66FlS`GO6f~sfH-qoJ1<?bL|#FBlZaUH z2jSpj#rTN@8t1^EgMIXkmtvAmp6EH9{;b!7>y8Z{Y2Y;h?`;OM6^?`9e*nIN-Ih0i za(s!3vPY&*QDqjc2*ivQ4Ga^t#E~$#vwa>fBXeefeOFNv8yM!-WaM^>)x>E)eZt!j zBId)xe1xFU$4nYEa9z>JF>VfID!LFpsef|WeD-yo3}&H^t|XB)yI$LY^#reqmu@R2 zxl0|ZXV+p1cxD&e=>(sY-AS0~ZvGSA^U8hw$;+Lxv4d?WGt4d~uA9lG%lLd#wxPIQ z3LuwOqyBbeZVe`+ucIX}<9H1A>cdr|PRCcLcD7_#kXK@gd15ah1S3ZHGTRcz1Ew-I zeqO4=2r$|^GL4djMyj9gam-W_=fI$7x>!DegO0nvcP8TK&c0e<F3rSyIBXlo2Qv_> z>h+w45E2Bf8Vw)5j(jsh$|!ElRA>qYsmuFJK{2J4L5*9VZk}<E!M8cR`4euZ@Aanf z1M-EX&ZKTc&1BzMNOmJ0sewnbG+?Z2(8H6WAlyXY%(UGynxMH$vxikukTYHEF0Km$ zoAH;Sjh$rV4=H>Y^zk?reYVqldEidNing6s(Dk1gx=0{qdU&d^9uiojM?9405s8`x z`HfvM4G^Op+G-%r>WUM!n6TUS<7G3u;jXR|_{Gnhc9*~eQHO4tOlUe$tiow9`nxif zosCH9o4#&g#f3rT^mTh97BMBL>if=&j+3~iDoof%gd&dP{V>HeO*lZ!8Qwr;NXLYl z(cD%*!8!`5+6)8h)l{Xrt)pxdWQ^2ouv}}qPG_Kg$agA3%ciPK@+Wp7zGt;B{3Z-+ z!jqb$bmt&I(--+FA-k2345OWsq-3Cxnl~pY8C6y7Z*KkE)k~HH#;%D=48awmGkrfr z$y**Ota=pzQ^M1`;MLO-cXpP@1XFQ>F}9lGX}TDY?kI#APlq#`Ls68{NIOU2%wRCO z%RkdaW8L)OYmMv<l}GJuMmV^Nr1l~TWh_T^!FV<*qDqSW4E!B0W5N`~(vbTs44Hz= zU`}JlWb`t)ZXCY5t~9`hZH-A7m?`&1ri`%L8<J{*8R<^wBA!WAVj~*(I%01^BT{KT zS|%^eoxyYk`YZaVl47&s{S{SZ#(H8`gwMuG;=4}8`YS>Yb`f<LZJYjzqmd>k&|mSY z2BjNkvl8t^Oda8D6rSA|mr1FK*|y@%#(;<^<&;R*b~ZasZ{c|2TB)2wIiF=P*|7p4 z$G{_{dS<p5|23OdW=TkzowizLw>(Sa2FIXPzf3ByrsBKe+F|@)GM>|ozGh4=0UF;? z*g4XWF$JI6C5qwb2}!1YKe-g!#T+D!&q@kwjDH&ku_a{XAhyU24wB!~Lb&KJbo_>v z>K5*4IR>W6{qXt5;{yBsqmc62ga?il%%0!V@+$c0NQE}z%c7^vL@Ldh-_vFyGMFwu zyN6vSFl}E|)?$@T_wk~QTF1gvb#%X=qHOK6v7(L~EV(B)!t2!_yrZxR8;r~6iU;)~ zxTRfbzfxAHDuT~oUgLxy>mbEOg1Xyndkga}`{wf_MQxiv!Bn<yw?KWuJNoA7XKZYm zKnez>h3hOOCF)dE+Kj8|;)cw^DGiw4MP}hK7%qP-DiC%TIxko2J(#Xl*9HrZMUyy~ zk`5k*8<o*)yF>iNQ{yCFupaGn%(b2(P=(WHygg%Sz;v|IhQ?J)y{)99GMF*HXOyby z_Pmx7S_}7#90OC+fk=f%0k>O&FS?hpAu<LQ%pV_cPGb9o#2IHt%NP(DNn(}u%MbY3 z{29!bKYh}J@aELqDsDt+dvn#E+wMAkLmd@8RWy#K;bMw=%Q2$(91%R`wvQ6M;+9RL z12#UI+i9j%u9*2^ygS8>Zb?RZ0bK=|6=y6_8{8s)W*5I6hugHPV0(2VP2rhchJYz? z&vDn^1E>!R%*CzFFoLP`dl*)uqL5|$94v0sRD{xe`Q1b+5`&@g(;pg@h?tJiMTx(K z)1L$irkq1!Y=E6;7zAx1Z~`&djP^TbId`H?B}t!gcg(_cVtf_rNy95GNV{)G;n847 z;{rSDo8v=JiV5#48hPW&q#n2R6k9&K(-ak9OC)UnZu5<Dw`Wk46_^nor0Fd}l-Zmm z0&oT6f~hPKUZsIp8MVhVO>V3&O>11*H`XzjkdD43{6eYh%)kbe8O3_+=v!VrCgi>y z0@r;zoBrWJdw<9GXq#J3<I|V{H5&&VTER*RLB`c|QPq<s(r`+17zZ7Nc{7;k5Qzah zpM=f^ZNGT}zR=Ncz>c#Lx-&+rH2#c4nf|h)l@(s8Lu0hE!j-Pa$oDR)9*soDphqL# zl6o}aGU)NZUZ>`Jy(0r`#>bm;ox{#tr|Azcr79RHE7X{vB^!q?x}{S|G96|QUo5an z4H}0p7MKkBGp0WZ%9_`1JKequqn0jC;6o#){tMKVmHuR*U}`$DE2IE}13@5vQ)L!z zV9PiInpFpu+(<};g=`+d*NVHBroyrC2rMujr;|b)$=g|zr4nE<uj|mn($sjQ%Q!qy zv~w$hSvCs#_Dg!_Uj&<>VdNz;J=g2i*_7I3p~MdEkq{M`YMwgmopHhOkK*}w8{Z0% zfw_!(8Wj_VB`cf~<6>`71DSD2lh9ePbd#9t8;r0YxjhaaPjPyYcAT;bGA`SsD9AvP zX)1f!rZ`fmvb><Bs?5M$w(h{CglAnu-7%8m(j7xOitZR9gYJxTvZ`6VL8o4gKdGQj z<z>yuW?*0{dgd77-_fb>YB#%adY!i?H3K`u2jkRrMwN=02gYai0UUee(xk=%IQ9q) zrp=3!eaInk_lhvClI%QCEV{GmOj!q_lOsUjgeR<8JcnRt!J2uQDk~2iv)JKrTvBG7 z70y)iuuA*oWvY3YRKvNgXV_HBbz-Vz;5XZq8K>W@DMq?RHIgjBq`iGtx4U!DY>UpD z4-sSyQ1J~3G8I{m;d=;rO&6j;vjcah)!lx4%2i@hs!A2zm5v{!S5Y#04~8%M-k?`2 zPL3vnj66l;LX3>s-7~1FqB2cn$RrRk+>b@`v;!Yc)xee@zfqJDO%<8NF`#91x8c{= z25sDqgnsDOt98$>!rX4X3P*V7#3#|4oeA=#q)6Zylo~3ubMP_Z_u_7DR8zICewQYT z9-S0c=;<gJi7j~P!^}dp14p$`pINwXOj=B-%aGoUF9hE`&-3%p-fTh}*Jg<KH#@%D zgR=l<+$tQM?lsTh%^C0s%6fCYI@|N+<yJA#wz8z5#8c6f1#ZUFJz^bDxGeC|%M<sO zq`15~L;Xk>K4<HTvvk<c%;VHg7rft_&7-0<;Z#hF;N9TVaC{HHG!7s5%p;;%j@4#} z@9DYoke?TIHBCvpIz#<f4>O=a7d3=7oCAM|G?ga-owQV(AOja8daJY|o+1IitDOdo zDgDdMTK}RJWXK+LdOc_1{)T%lTkk3Yh%I-Rd8j0?F;XHK=q{kHkY$KxGYh^eYNY8Z zL6tUB3zeyFM36NjW(+(YOL>2%YfGEXPU*CbI5}B`n6;wQ$Qp4nvX8=Echq&yZ^MxQ z`T|!$Ju7`a)3X61Bl$4gI7CEY^B$ZOucyX!6)m_EUH_mfSHs81?LjvJ!8&el-s}4! z5<C4WSR^NiB&gFOxK2F}J!58j(x*}P*h;$MG7M99kYFRtyVDUf1|ACy9p3l_)Qgi= zVv)*J#e|X(-9P9Uv?RJiYcnXlB4eTm3C5HXAk~G{%mAqtWXLLFCvH|Iu2uzK-Xue# z`i9|Q6dnsRWxv+O_F161%+8hkGL=}AHv@h~_d!F>oQgz}RJ!-n(iJ_6-iGOJvx_;Q zo<OG}l4R)wsc59Br7N5UllE|TLF{b8bQ*KSHtaO)xc$DI9;wzA;4o%t@}^P+GmGA= zqVrRf3}fyIr4}6vgWj>(O$*lvRwh$i#*CB^zE)QCI-PS$6WOTc5Lkd!zW0pN9=LE$ z8KxoNe~~Muv5b{LYswe_Ar%7#Mnd7wcl)sGkGKL%I)7MzRek{Nj8L(6sa=J8L94Up zI%zCoNkDwNR0%@Fo$)%7OhPcF47(M?aMTp{ixCQuFhUO{BpP&zk)mxM!dXo+#b_8Y zQXh#@tu@@*>8=M!ZW;AyNQjWzIv}P@T07{^Uix!L{22^_OI!WnE5psL^Kc0Hm0_@) zjE}I!zJp5!!BQBAHPjMo8_@r|FAv1kR#f*OAUogMDt>p1-|gb}N%6Z!{O%LK+r;mF z@%yy+-6ejf#qSaEdszJ9#a!pb!SwTDf6aL@^>bcGb6yB@zJ;=!Z=opX2ZGziJEbU_ zgSEoToQ~6m1DpL}3ke3xNWkH1!{8eBzT$gudy+S|Km}VnuV1p{wPEX%pcksSVs_A} z;eB3ExAiM#@Tbh+Uo(P(H*f|pcFrzTYjlk%-h&x39r5y6GaB0N6v<gpBUc5JMB3#A zJ2R@#)|y~Xl%a)+j}ZS3B1S-<3K{MiG9%7H_xomaR|;`!Ue6Wx3j1)4#ju5zkJ$JV ztcQT$axoi+ivCgzTZ!MwXwJZd0K&hL0{?0X{4Y}AUr&L5GX?&w6!^DO;D4I}|N9j9 zl8uoLxV)F8z?Y@KSEj(%q`=pwz^{zq%jn`5RQ^U2@H!LlMicNB6Yvct;2TZAJ59j5 z48VY9FoefN*B~pci#y-FF#^^GC`bqt5INlT*&e2nJzn?WxUO{E$6}bGxUDAOb`x-? z3Ao1u+-CwFGy$hgz-LUr6DHuBOu!dRz*8pROD15=1e`Sin<ik}1oTY6o(VWG0neF$ zZ!-Xct7JgKOiS$H=8o}dTupVV*7uvi?=*w|i4h!Zl+<zh403MtaZdk2epQ;f(5wEC zx#~Ki8eO$LY+<Jz1@IriItWk#_>aXfr5*fp6Y$4Pz@IV!KVkxY)CByP0T_jaNQR1- zPK=juxkw+65y+<fOEF9l>ED`wziI-0+64R$Cg5jcAakG38NmT1@?n7Uy0E=ut_d@a zkkF_$`dxEn8gk0Yw89E=o;Xi{XQty*+8o^<#OS1cJ|Dvr{rrgu_$3qYD<<Gq4Zwhw zEF{x->t)yL)?mii=WKpGt}fa9W(-r<{FVv$Z4>ZsO~Ai50he48H4D{@8ux1AHf&)U z9JQ<EhyVdfyIK{)6z<oWfE!G}t4zRaOu*|+z?)3KTTQ^*Ou*Ysz|AJ$-6mkg1ia4# ze9#1Z!~}fY1l(o<K4k*#G6DCRfcs6rLnh!66Y!V`_^b)|yb1Ug6Yxb7&@lkRy=Ah+ zsXkk&!R7)FzQP6Li)N=g@L?j#?K!X~mwWSEj99kCRt!_TdENx<nt**1@Qew#U;=)Z z3HaS6;P;w<?=S)1Wdi<y3HWXk@CQx6p$YhY6Yz&kz#lOIf6N5@=LTSSgJ6p7<Njh6 zhHeY6Mkj7Z=7#^N7^^h=M`D;__>Y=^A2R`e-UR%(3HVDU;J-Bif7Jy1v<dhhOu)~W zfS)q~f7=B7T@&#CG6Da<1pK@S_$MadmrTH~n1Ek30sq1T{JIJFO%w22Cg8VCz`r#C z|K0>#a&6R2D!z1?0a(zL*$2V6E3b^PN>^SJ!xZxCO~5Nnz>Oy0btd4ACg3e5;2TW9 zH=2NVnt*qifRiTRy(ZuTCg8&+;9~}0I7^%oZ{#67HB$;`7B;Pp{Eiv7=FXVBwC0`| zrdV^I33$*1oHhZUF#%7QfNwGZUoZhrnSd{ufHf0v)&y*tfNc}dGXZ-h;J^etX9B*> z01U_4d?Wc#e7+${lD`+L;k2=mB)=nuNh5|n!coEgLAaq2h7Zao4LJHAh*3!&d3Ov` z(9_~%5<S0yo}(VdXe8?Q$1nvoE$t*w^NZ9u<{yc%NX$PL!xYRkl1gBv{H@JV{&-wn zqWq~CCQ-IN5(8zykH#>i;KyR1Eco*=Oey&B7$^(=QVf#?!}Z~WG<4Z74rg)Z8K&0J zS0d;6)fkOL{plE{pr%cLM$~l6F30<s7>C6BxfrJ4HGZ9gXV-M;?ocd>M121z#D&-Q zDo+1<F-*ZvtJn#?IewVl#HC}gfXu1<QH)Va@r4+sP$_a1V?>1(VL72cjgd-1e;&gW zLdG*WMsZ+=2JFq@WWEujlw|%YhACtUSS7rpky+*ciE&B%|2>8&_>0`cXt<J(OLNI} zx(_UkVG6bUOB`xx_q%b5t77a@zO^w-p_p$begzpPb5)E|lDQ^^DP-~w{OdPjaZ)$M zXeFszW0*q9{7DS;N@TI&Q{Iuq>D(UUlyo-7FojNjOOp4~(3MV{P$fnx3EdaN6hiqX zl7#Tm3r^;d7^Nihcnnj>7*Ch72Ag)%3Mcqfj9e1j6~h#Q`2jE594@vla4P#_jFQTs z7^YCkcZb9s8=TIu7^kH3Yz$NA(00MB@U0}o*dK%)L_k|@6BTK&F0OkJi|bKuQbp2u zn}yPw%)~H-9ooQ=iZwh(J!HrmF(N7J=@=%Fw>mLU7JNB|DFyu)C<~sAVM@Wb#z0x{ zl^7-qnm>3WwFNU=i8Ih##P5r7N;<C@VCN06AcjePUVqQ(CE~wuGjO`X!$X0bo%hBl zB|ERjFiEEMffy(YelUh91%EUK%7Pz?VX|O&Fd~EB#IZTf_)o+rC7BP$FolfqYYU3K z*x@2h<7Z-glE%-*Foni?vEn5*_J~79L$MPjYBIlwRq#}j(qw))hDkK7e`f;zdlT^2 zO~Bubf$ADU>pz;o|GOFdJ7)0zX$Jqk8T^N4@E@DOUo?ZiYy^i}a)hqc{i$5#Uo+Ni z{iPZFU(MkEW(NO_8T|j6!GC84{|__xQrJ;MuEI=sxe=_YLhUBGDptpJr4z4<VT$)% zVFF%l0$v*f8J9O0!2vA?3xkQhi>z%-<krERa$KT2jCERD%;0;>;3*?`(0UZ$xI=6Q z{M{^ebv5=k_MZn9c59Gn4RTCCaGO+A>p2bbf`H&2rl`yX4Kmaqzpg=kTZ8;34f6W} zf@`}Gt*>d2ztbQ~Za~@9TI)2(EdqiIjuGY;HON2FAfM47U)Lc2RfF7cBl3e|@rc%h z2Dw9n+@nG6*C4w!$N>#<R6sCcil{%QK~8Fr84c3VARP_jYmm2UknhnTuW67#gS=OR zd_aTzs0R5L8sx(o<Rb!tDPg3ak7<xkYmnd4AfMMDU(z676%g!8BU&qNLf=p!w`h=i zG|0V42yG4xF6%+CksCy5f9qv^zmC9QH4JX%ye=+Y;;z<cL+rA)Gvl_!KG$Fc>;P+a z>h8HAlwQC~KIo~jKUmxEHkz>6y6wRUP<I$yQ9S{t<@#{46!0DGdFK{}?}Nbe-N0I~ z9=?U}Rya2l7I5KB>l8>GERQDKf;ES|`k?Jj>=)Gh;j6>e_d!)rto8l)uXn)DJ7F*0 z%sYp{vOXN~sx^kK9{^xuf9qBFvpG>ASbba+nmFprxkD4iKw=yOtDKJ4k)pR=ftRhf z3-qx659x%&UK^5j2f;GfS~>^wYQgGI7uYKdgAIF|Z5Pj<;+NERH)}qKyX95T#rJ^7 z?}5L#Z}>tWKD|2$TVCN9?j-IvnRL%N^Kcrn(mykYdk()hERLIsFHpZT3179Wovw5{ zSYUv-{uwg%zrfFhnP7RnJqx5^qVN3x2-fcQ&UV_KQ%8RK#6)nV*K5wfXCvBG!F+Yl gYl7{Al{lCZA1J`5)jinM4r|-Kdk+0)FjM*e0EF_)tpET3 diff --git a/docs/finn/_build/doctrees/internals.doctree b/docs/finn/_build/doctrees/internals.doctree index 7868da2c0af74986e0d5f24c83975dec7865c55d..f3962cc63fd2cf21dc0acd8b2cca96fd75391037 100644 GIT binary patch delta 1047 zcma)*&q^Cn6voNu)J9{pXg4+`Q;Hgec>%#fyC_K8>mO2W7g^krn|u?TJH!0JN(o7k zmV&c$DhPsz4<Jnz0hhi*_bvoq!#go?W<m@u=bZbU@BGf3b2)vTk?X^Mzo!4m|D_s6 z7k>IxKL;64FjDX_(f#)3R=C3~ofS3eFlB?87PA?5sG}KtNqN6Qh`LJ17r!lg{^;kw z{I209W>Ux_fg!vg$dH2{l2S`!2J3e*EF$yasr!xMWzb=^;Cr)Lq$kyi^`w?G&Q*i+ z?>@yVf$~}i=Ar^6E?82cidmtUFVuV&3rLD4#^Oy37*y($QDoa&7Bx*~b;l78hR}v6 zt%uA}x}fQUeQB~igG$7HEc(hz>4Du&$1X(ejo$(F<q-u3@Vps+%jx#6t=Y;Nwe2oZ zPc%gOBanWFNcX>SFM^PcA&k?GfocW@A;Wz_=_Cd~h>{ONe3ZSZyhXWPGAzBlu`!gs zxe(}70G;#!I*tH6ivdkJF|%H*p7bN&M0pmjeNt=QNS~#|RdZQB8(Pib0xgtLL>*Ne z;Sdd+yIzu0ojJQEv)dPaK~N^B6C4pVh>L7+L@lw`MR8zNRD^5~=Qws7$#;ocN*Hw% delta 64 zcmaDNb4Y}>fn};W*GAT>Oq<WLB{4D9Y&PIr%&d?RmJwXs!<m<un_5y?kXk&Yc1lK= TUvY*!kPgn^F5axf>%<5E=4=+V diff --git a/docs/finn/_build/doctrees/source_code/finn.analysis.doctree b/docs/finn/_build/doctrees/source_code/finn.analysis.doctree index 7c7281c3b5e3d62a60759e0ef664d58b17c8044c..4eec028a00625ac2e1bb78c23fc315168f73de45 100644 GIT binary patch delta 3191 zcma)8Z%|ZK6z4tI<*m5DA}K5j3#_uhB7a20fl@Ik1KnVpbf&~u1-#s$WfdvWA;Fm@ ztWB-6^+jiLsu@j5V=%MwL-nyg7}JOPqQQ`p_FboDEIa4k_m;QpI`(1j-h1vjzkA;O z{m#Aj*3fj&GLrJ{Q}q)TuD~|U1s-derJ6ZeCA3>B?LMZkWR}OunXA<bVXHeUoG}n$ zy}^T(fv&D#e^>WF1U|8zR@$H?mD@M!t{MWYgKtu6EstZ*2Y;vTP^{3dwOjV#xL-i` znV{2guHYS8ljSH*kI=MZ*fi}J+|8O`RN1V!L9s1`pKYrx$I){b-d@~iZB=mk1Y9bu zQ%=F<MLaqc%4-UzV1|1l5Gfmt3`a_tg;`l@2X>m^Vp@aJ1b5N`$~9cD1okb?vwVr5 zR}eIWGpc>7%C6Iti+#twA7o|hN1E32`hmIpBCQYX73h84zD{MgU_x`*4evSh{*5d( zhUG?Fd^gLdwA>vLHXdL__~)T6oJoJi$);(|%NR4Ua7|lAQASeO77FYS?A;#-G5kRA zW!%*4N>UPY@-%Q{R=By1MtSTaa;KoxN<*Y`a5rCsUD%%4qvgqfTnccQ15zje{>}7e zrU;k$9H6Se4LclF-ZeN8P7U_=2D`csMvhUkmqemSj9ivB$RK9UaZo3wGwYSCPZ#p> z8QjULRK5adVVm+SwA;%vjZH&Ncq`?Lamo~Uvi-^~aws+&kQLz|H;H#pzJi;ZFjJJR zvft?sPC9eckOJ*B1?fg062$w2snswcLkY3wdE(88AEinktw7Se_<L}SC&6@a{w9@@ zu<~U5<DJ;(O!CcS7bP{HC%2$6c0VLRIZHp%PEvrAA18vcb%OZQWR#@73Cc3>63I~v zI*g_-f%OHMn`+THtcHdnypDQW&tP!Rf!_XLgxBMke@x9<Y!(uzuVUu#*JZnO4jXfL zA`U;#DbhLoI*!9@xCUSxa`;Q`Y6UB60f*$E@68l-6LUBl&*6=D4ijOSIJ|=R^Bl_2 zLJqf@Ih@7-gTpTp<e7lOQbD4@D|EO{!w%QDrl^9@2SjMGLFiTSy`oC*>*z+6Zp(k( zmLX&8D$G{-qAJjXEGUorRH=pv%=!Ia6_nx%iB%w1iK-y^RCps)mE^<ig1x#H&KC~n zv-pBGzC65K_@@=7OKGU<=`%{B$0XHvBb+T9QP~t!6zx>~Vm_w48)*Y%*=(h5Vrg`$ zapk>Jm}1I15td0Bb%;MN4LMpUjb^hn+AzS7#@YmVK2#c$)t*k(HbNmz{;J?MDu{Zr z$_hWMV;X{(S#i{MTn2?j&|`**^dKw39aiB%W{IH)b6PN4;%RuqnQ#{26RV*f)_ITE z%~!XBu5P&P9aS$=HWfMPxcr2kv;G{&HSPgaPdQv)RRmhudQuOcfGuUOE5;qMsQi#u zSfk;7Np-xs;6nLw)YDJpJ?bAqFEM(WL)fDh673ZH<7-gw36~g2%|+MXcd46DQi=v` zHSQ=hT^K23i4jyHB$J?SBKo|b<S0f^BP&Z|1oamN7=oHfkmW-K1%IymRx3>wdMbgL zstTK~jPL>2ms<>He9vWzGsZ(crk6mlifi>Uu8!iON6cz6x?1Tm;DP+=6B#jQ8s7p} zt2?wUGSZJ5<5?o#99$11DYlS(>1OHFOn<VF$pxBxZa7!t$bORSdFC)rvRT3AeINy| zd4z&rM!Yx$quO3v^<j*9b0MR4dv5yR?s>w(S|Awc8ye^xhy*6zt8G!0$;sKebIC{E zBFr}^(O%ZWU!&1cYAzy2`~nd*&c?-qKsI!(aM92y!bLMo0f(p|A&6!$Yzqcn>OL?O z!nZU&205+cXT5&0gkQk>+4$H7fjTA-#{}9KCpf=A85?A73KsdLu^#3V$+13}*)Tt^ z!V?W%75{cN7Pj2QKzvvlkL>s9tifs-XIEtI^x%@Y(@iRKr-M`GPUX#q=qv6e!-htu dG6XL)7A=>crsC(*=qRD(_s*%4XBwN8{{Y<UslxyO delta 4314 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 diff --git a/docs/finn/_build/doctrees/source_code/finn.analysis.fpgadataflow.doctree b/docs/finn/_build/doctrees/source_code/finn.analysis.fpgadataflow.doctree index e3e1b426070c54cad6e32e44f5969c37df0bed96..f3a43330175f494ae4a3d768522216ac77091f75 100644 GIT binary patch delta 252 zcmaFnxWJL6fo1B{i7c&?(<OL?GT39MWH9uwgrruKOqo2TN8E98tc3W+{hW-PX$9$t zDTyVCX_GH9$|3Q7Fy=CvP5!_uJ(-tTnsW-+1koO2u*d}#37#pfQyQn#PSMC<?SU)X ztk2BE#b`WPUtD^!FE3C{YK9`vV&&K=2#u3xi_1;Ez$?$F1vE+vZm=ehCpTGEh#T2p kuoBiO8B$qnljX&9H=pE7<zUnV8n20LG+gWE+2Y=u04-8gl>h($ delta 340 zcmZ4B_{@=|fo1CLi7c%~ZUOF&E{P?HZaMkoQ!?0Nr(`hnu!N*mluVgCrAOQ`FEOXG zII~zmR{^eY<8EF?PB?G!MMgO!-VerHM%&4TTym3Jm?Q)ga`RJ4b5bGZiuPCmC5(k( zf~`{;r_@f-$YAY(YhZ`UZI)tY;$pO#EX!*wtP3?GHA4~TIOW(W5My9UC-?K(G8#^P z$R{`XH7^gkjRrsoEg`502n*rrVWw=3=bO&KXaKZOTCpg#SU0t}Br`X$Br`t`(|WL( QY!EYnw##iU7T4tj0QiY@<NyEw diff --git a/docs/finn/_build/doctrees/source_code/finn.transformation.doctree b/docs/finn/_build/doctrees/source_code/finn.transformation.doctree index bc6d983c0745235c9089b1d31e22eef0eb682527..abf2d9014985cf6ca4d1c5d0ed1eebdd24730c03 100644 GIT binary patch literal 37474 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%0AIkfyuX*g@K&&74Rn$ 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 literal 46556 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 diff --git a/docs/finn/_build/doctrees/source_code/finn.transformation.fpgadataflow.doctree b/docs/finn/_build/doctrees/source_code/finn.transformation.fpgadataflow.doctree index 2d501995c702e856c07b2e074a115714b01aa7df..646172e2786851902ce5c38b62c00dd0cbd957da 100644 GIT binary patch delta 73 zcmccgg5}Z+mI?iwX$9$tDTyVCX%lCtAvhb43p0wtrE>DiHK$~-$4<!*?U4(aeo&E7 Ou9=@{J3kYnvk?GR&Kk}D delta 93 zcmccgg5}Z+mI?iwZUOF&E{P?HZWCvyAvhb43o{zPrE>DiHK$~-$4<!*?U4&9O3W)x b%P-1JEXmBzD^}2eD{JOr+Rnwq=wSo^Q@$W3 diff --git a/docs/finn/_build/html/_sources/internals.rst.txt b/docs/finn/_build/html/_sources/internals.rst.txt index 0423e63d3..6b8faea09 100644 --- a/docs/finn/_build/html/_sources/internals.rst.txt +++ b/docs/finn/_build/html/_sources/internals.rst.txt @@ -3,3 +3,15 @@ Internals ********* .. note:: **Here will be soon an overview of the internals that are used in FINN.** + +Intermediate Representation: FINN-ONNX +====================================== + +ModelWrapper +============ + +Analysis Pass +============= + +Transformation Pass +=================== diff --git a/docs/finn/_build/html/_sources/source_code/finn.analysis.fpgadataflow.rst.txt b/docs/finn/_build/html/_sources/source_code/finn.analysis.fpgadataflow.rst.txt index 54befd447..e31723ca3 100644 --- a/docs/finn/_build/html/_sources/source_code/finn.analysis.fpgadataflow.rst.txt +++ b/docs/finn/_build/html/_sources/source_code/finn.analysis.fpgadataflow.rst.txt @@ -1,20 +1,20 @@ *********************** -Analysis - FPGADataFlow +Analysis - fpgadataflow *********************** -Analysis Passes (FPGADataFlow) +Analysis Passes (fpgadataflow) ============================== -finn.analysis.fpgadataflow.hls\_synth\_res\_estimation module -------------------------------------------------------------- +finn.analysis.fpgadataflow.hls\_synth\_res\_estimation +------------------------------------------------------ .. automodule:: finn.analysis.fpgadataflow.hls_synth_res_estimation :members: :undoc-members: :show-inheritance: -finn.analysis.fpgadataflow.res\_estimation module -------------------------------------------------- +finn.analysis.fpgadataflow.res\_estimation +------------------------------------------ .. automodule:: finn.analysis.fpgadataflow.res_estimation :members: diff --git a/docs/finn/_build/html/_sources/source_code/finn.analysis.rst.txt b/docs/finn/_build/html/_sources/source_code/finn.analysis.rst.txt index 99ebb7ef4..2a66199d0 100644 --- a/docs/finn/_build/html/_sources/source_code/finn.analysis.rst.txt +++ b/docs/finn/_build/html/_sources/source_code/finn.analysis.rst.txt @@ -2,11 +2,6 @@ Analysis ******** -.. automodule:: finn.analysis - :members: - :undoc-members: - :show-inheritance: - Submodules ========== diff --git a/docs/finn/_build/html/_sources/source_code/finn.transformation.fpgadataflow.rst.txt b/docs/finn/_build/html/_sources/source_code/finn.transformation.fpgadataflow.rst.txt index 7dbca7844..ba850d8fd 100644 --- a/docs/finn/_build/html/_sources/source_code/finn.transformation.fpgadataflow.rst.txt +++ b/docs/finn/_build/html/_sources/source_code/finn.transformation.fpgadataflow.rst.txt @@ -1,8 +1,8 @@ ***************************** -Transformation - FPGADataFlow +Transformation - fpgadataflow ***************************** -Transformations (FPGADataFlow) +Transformations (fpgadataflow) ============================== finn.transformation.fpgadataflow.cleanup diff --git a/docs/finn/_build/html/_sources/source_code/finn.transformation.rst.txt b/docs/finn/_build/html/_sources/source_code/finn.transformation.rst.txt index 6819785c2..6a5fcf29c 100644 --- a/docs/finn/_build/html/_sources/source_code/finn.transformation.rst.txt +++ b/docs/finn/_build/html/_sources/source_code/finn.transformation.rst.txt @@ -2,11 +2,6 @@ Transformation ************** -.. automodule:: finn.transformation - :members: - :undoc-members: - :show-inheritance: - Submodules ========== diff --git a/docs/finn/_build/html/genindex.html b/docs/finn/_build/html/genindex.html index 9c3bc921b..003bbe3ee 100644 --- a/docs/finn/_build/html/genindex.html +++ b/docs/finn/_build/html/genindex.html @@ -269,8 +269,6 @@ <li><a href="source_code/finn.transformation.streamline.html#finn.transformation.streamline.sign_to_thres.ConvertSignToThres.apply">(finn.transformation.streamline.sign_to_thres.ConvertSignToThres method)</a> </li> <li><a href="source_code/finn.transformation.streamline.html#finn.transformation.streamline.Streamline.apply">(finn.transformation.streamline.Streamline method)</a> -</li> - <li><a href="source_code/finn.transformation.html#finn.transformation.Transformation.apply">(finn.transformation.Transformation method)</a> </li> </ul></li> </ul></td> @@ -476,8 +474,6 @@ <li><a href="source_code/finn.core.html#finn.core.modelwrapper.ModelWrapper.find_consumer">find_consumer() (finn.core.modelwrapper.ModelWrapper method)</a> </li> <li><a href="source_code/finn.core.html#finn.core.modelwrapper.ModelWrapper.find_producer">find_producer() (finn.core.modelwrapper.ModelWrapper method)</a> -</li> - <li><a href="source_code/finn.analysis.html#module-finn.analysis">finn.analysis (module)</a> </li> <li><a href="source_code/finn.analysis.fpgadataflow.html#module-finn.analysis.fpgadataflow.hls_synth_res_estimation">finn.analysis.fpgadataflow.hls_synth_res_estimation (module)</a> </li> @@ -520,8 +516,6 @@ <li><a href="source_code/finn.custom_op.html#module-finn.custom_op.streamingdataflowpartition">finn.custom_op.streamingdataflowpartition (module)</a> </li> <li><a href="source_code/finn.custom_op.html#module-finn.custom_op.xnorpopcount">finn.custom_op.xnorpopcount (module)</a> -</li> - <li><a href="source_code/finn.transformation.html#module-finn.transformation">finn.transformation (module)</a> </li> <li><a href="source_code/finn.transformation.html#module-finn.transformation.batchnorm_to_affine">finn.transformation.batchnorm_to_affine (module)</a> </li> @@ -533,10 +527,10 @@ </li> <li><a href="source_code/finn.transformation.fpgadataflow.html#module-finn.transformation.fpgadataflow.codegen_ipgen">finn.transformation.fpgadataflow.codegen_ipgen (module)</a> </li> - </ul></td> - <td style="width: 33%; vertical-align: top;"><ul> <li><a href="source_code/finn.transformation.fpgadataflow.html#module-finn.transformation.fpgadataflow.codegen_ipstitch">finn.transformation.fpgadataflow.codegen_ipstitch (module)</a> </li> + </ul></td> + <td style="width: 33%; vertical-align: top;"><ul> <li><a href="source_code/finn.transformation.fpgadataflow.html#module-finn.transformation.fpgadataflow.codegen_npysim">finn.transformation.fpgadataflow.codegen_npysim (module)</a> </li> <li><a href="source_code/finn.transformation.fpgadataflow.html#module-finn.transformation.fpgadataflow.compile">finn.transformation.fpgadataflow.compile (module)</a> @@ -1070,8 +1064,6 @@ <li><a href="source_code/finn.custom_op.fpgadataflow.html#finn.custom_op.fpgadataflow.HLSCustomOp.toggle_clk">toggle_clk() (finn.custom_op.fpgadataflow.HLSCustomOp method)</a> </li> <li><a href="source_code/finn.core.html#finn.core.modelwrapper.ModelWrapper.transform">transform() (finn.core.modelwrapper.ModelWrapper method)</a> -</li> - <li><a href="source_code/finn.transformation.html#finn.transformation.Transformation">Transformation (class in finn.transformation)</a> </li> </ul></td> </tr></table> diff --git a/docs/finn/_build/html/internals.html b/docs/finn/_build/html/internals.html index 5d669ebcc..4fb99c3e9 100644 --- a/docs/finn/_build/html/internals.html +++ b/docs/finn/_build/html/internals.html @@ -84,7 +84,13 @@ <li class="toctree-l1"><a class="reference internal" href="getting_started.html">Getting Started</a></li> <li class="toctree-l1"><a class="reference internal" href="tutorials.html">Tutorials</a></li> <li class="toctree-l1"><a class="reference internal" href="end_to_end_flow.html">End-to-End Flow</a></li> -<li class="toctree-l1 current"><a class="current reference internal" href="#">Internals</a></li> +<li class="toctree-l1 current"><a class="current reference internal" href="#">Internals</a><ul> +<li class="toctree-l2"><a class="reference internal" href="#intermediate-representation-finn-onnx">Intermediate Representation: FINN-ONNX</a></li> +<li class="toctree-l2"><a class="reference internal" href="#modelwrapper">ModelWrapper</a></li> +<li class="toctree-l2"><a class="reference internal" href="#analysis-pass">Analysis Pass</a></li> +<li class="toctree-l2"><a class="reference internal" href="#transformation-pass">Transformation Pass</a></li> +</ul> +</li> <li class="toctree-l1"><a class="reference internal" href="brevitas_export.html">Brevitas Export</a></li> <li class="toctree-l1"><a class="reference internal" href="nw_prep.html">Network Preparation</a></li> <li class="toctree-l1"><a class="reference internal" href="vivado_synth.html">Vivado HLS and Vivado Synthesis</a></li> @@ -162,6 +168,18 @@ <p class="admonition-title">Note</p> <p><strong>Here will be soon an overview of the internals that are used in FINN.</strong></p> </div> +<div class="section" id="intermediate-representation-finn-onnx"> +<h2>Intermediate Representation: FINN-ONNX<a class="headerlink" href="#intermediate-representation-finn-onnx" title="Permalink to this headline">¶</a></h2> +</div> +<div class="section" id="modelwrapper"> +<h2>ModelWrapper<a class="headerlink" href="#modelwrapper" title="Permalink to this headline">¶</a></h2> +</div> +<div class="section" id="analysis-pass"> +<h2>Analysis Pass<a class="headerlink" href="#analysis-pass" title="Permalink to this headline">¶</a></h2> +</div> +<div class="section" id="transformation-pass"> +<h2>Transformation Pass<a class="headerlink" href="#transformation-pass" title="Permalink to this headline">¶</a></h2> +</div> </div> diff --git a/docs/finn/_build/html/objects.inv b/docs/finn/_build/html/objects.inv index ebe8f5a3baa2a445cb81f7e3b8cf995fcdfec4c2..daf072a775d9bef7a87e35b7168dc384adfc12e2 100644 GIT binary patch delta 2860 zcmV+{3)A%69myS#x?V)EO4lex60InI4>nYUV#nkr%&-WtkR(Bpa5hhOza%`)DW3m* zE_j|rIE;9V|F&wuk_r8bz3J0m=bvV);k2!KRym8z|IdRIbw~lt_fc*==27yLQ@-By z%ustClN<p`f5J&Ip202C_9P>8M?AxUu8(q;;&!3t(z7CKAi)>)XHlR<6bW%o&H=0g zCAhwOxO)0sgCQw1vdkr(3i$Zr`_+>}#M|#bt`@dMIYPX9SbYAcTRg||es&D!Sl&O} z!u`u3+~Vt#;~M?qy1KkLt}ic+E6j`Q8uQ|~%DgzPe>3XY&EIisI%q66Je~%(B=Via za^nh5y8znzE6;>NW-hT=o`fkEf-ETx-w@4<hpHoZktq8rUvAIg3Y=&ML*g}dW{m`G zok0=i3QCYQ8(TZ^7DuXmR6UzXe#jZTCXP0LsY$Nl#PmHwX<8KOSe;d%;9ej6=YTrc zZ)!x_e>;BTN~ak&+TiFlJOmY?*q~I!L_&GfWJShShc3d1C#j0KmV^?yb4{VHi4_17 zc`~-ic7Ugustb{OaNUhn%7UQ;3m+VW5lIjwfBMOS!ZXpawo~eZps-IZ;_*Xa<6w^j zroDN@H_utZR@^y<`rWt&P0%Y2agxeisC#?ee~KmEN-s1FzaOk)+M073ec&22!&+)l zysp6odUI|C;kUyPzB?S@zrzup`vaLFCRRL4#sPE2wx&H!a+UTdfqD98IJ6F3k8#&d zVSC?jic@%src>Oag-E#%ru*4<4r9PGoN$S!mq`WZ7;}^?Nd-w9$U5L0V-A&NV}+tu ze`wZIUe+LLfBMG!`;oT0_jR-un3H<j(m4BrnqXVqsD~}QfQGsg6waX40~lupyl)TN zAKSDw)2Z%*4vNFhr$m1O;ltRKIf1E|)v2n!ji7sSt>M~VzdsLbAuTg$-5kM^qUd$W zxBFh9r?DooW+*wHvGh)=5yLfRI5VUne@WHBWvE%YQ(ZC?cajp-Vg+GqicKF84QLh9 z$aSKg29+65Zey&j?BBCaB;(q+dQ=;RZl?kl64^Q1P;y<3V3<uPnP#}COL4U_^@-6O z${6~rpT=0USsW^N8zlmYRE8@~V`XPs)O|u4_uQ)8UVxl1)mdQmc<3`T<B)fpe`n@^ zH&2$zcPotDYf{G{yX~8y%}x0dQB~3r&10zCny39`9)eUAEVQ#@vUp})n1AAQryot_ zv&z<M80s`b>jVMSC)H?T{Qx!r7Zjxqm25Z<#0bcxM@~Z|;G7!ml!h^mfSeb}*Q)CY zBl_x(FXHTtQ!^rHJcq)4;hFcif3=Z0xH+7;(`UX_HF=3|M`!_zgGZ@@ikHWT1BvlQ z3G*EbjuPcRW*j36CbSx(%mxM8IUYK+38xP#co?k@G{_jMvXJ+2iy0<V8l?^@q#7e` z!t4Z$K&Sw1jJB!MFEA>-hhAeu0flH|q=5uGqlEbnipIzqF`YMDnC;#Pe_O9qSh7=H z))L8R<2`gbPa8a!$+tJ(P4acA#!JvNNCjZHG*A~*pfpTYglH7X1ScO#(EA4x1QJ9J zl;k^n94N<s;5bYWOvpG)6WDy+P+71udZX3B%=rzMr{AioxW96fVX;w?`>o==q||pz z)*JZ&bwZ7)j8O&?Xb)Ege>KiCLK)}?&v1QUV>_dyebo9Uagx&g<Lm<#Ytg%XxMGDG z4jU#5bRcY)G^io4VXEK<zlQ1aKI}D24$y$tFi{{wT>~ZgALJS)2zGcYLEDsb3O&44 zqdi#S9&I0WGSKi=9~GAv-s-0de0ZyuEZD)Dev-fjZ~Dmr9K7izf9N97On+sUiDvrg z1NSX^$-0bh*-IL@Z`n)L1%1n2`rv%aUUHy)%U+^jean850Da3|f<S!Ba-c$ZcPFLt z4rPL}SDZm|1&i<M|NWlVi<8>G2k4GADFE^C8p(b8a*f3Py|yN5n8~#!cIf%49y(xV zrrLx+O-r<CfO6See>H$Q=WR;BM(!I$K*a)00zkd~CK2$SbdwVAK64W>kayff58?+m zlKb~~o2Y&Hwn<JU*)KA1wDV0JG`QD?iz>&2?QmMLo$is-&g6cNn|3}A8{f1O`q~Yr zoz>xPHb+FoPGX%KLk-0}Z9&uEGrT6MquDuXizS?{u+{x`f2N7t2j*o5qfD!;(D_Y{ z-m;qs4$=RY;?!f6dqUSTiqmPAGfsi~u4tSN4_(waA-=k<acUfPX<Np#l&2BTnRL|9 zs*u5d)xl$NaF3+wn<qA@4s@rDr;E#dGwEXV&>*@feO3J~UQd<0c90;M<aF%AYrnCn z{hE^*Nmk&Af8N6bt@OBCdy6`{|7^4B<_OGC^@B=V@T)y*V+%V+I*BbnX-Ydnr$MA7 z<rHO_QWuqb6V~y~i&Hq0*EZQ!z6GyVNO$%eOzqmZdO*<ZPA?IY!ntkh@WHJ*ys45o zv0@vEb9>cZzM~kiJRM}U?)j4*jKPimeMyIyuq9R>f514xo@0p>p5A5Zu(KqPiL1P- zMaKABRfTVJH?v>D^g=n9UCY`$S>IAuOmNTwRt60k;7g*i$0=+%SmM0}4myC!;4D9+ z{mmYopoTY$D#v?f@20LXLK@e2JKFov?|GS}y#mzKXZV9V9Z_8qhO*u90%MTE7^n%b zxD>Ipe_^IR4ttKrxh=9L4Z)2$Gi<!hvt61r!4;XRLiXdy&`wmHSa03;Y!2@pzk#?> zt^9EICrp^e+;^Fk(=s?ESN(`i>bv^Nmkmy3z?Fy@yozy3`7Xg-Bb-i)<A^!<V*W1p z<L?ju1}KI$dSLUXJN8EyXXFjEIUG|5_bNf>fBwr}2}BVzE4V}{q#6I;Man=E@ALnt z4sawvi{P99xDv=z>q81xk7-lB4l_(sBsY-WZ<B=J$)5Plraxi&SSs^eI0F^Im6qNq z+I+Pk>HLta(;}+z2G3Z2RR{Nl2G51j$PH+A<FZ|%pE_a=jPnTFQ*}vzD~6u0BTOv- zf4kcdbv^}A;FfbM&-rq}uj1I*>_Y>->xqYw=9_XAo)C+9vM{^gJd|JMb()#8EMBvO zRc%>P>^)PbJU+Aa!pI*veo#36vUJ4ZIy-iSLAkiV{S@I5z8&i-zXI>hV(m13jAp-H z?#W^n+~(tXPvp>6rv$F8WEVTpq3a?JlVb`h5;>QvoHmg|TD#Dop7n;m{|a=Ip9(Dk zsjQRE3S0s}Sd%OZRy<#vABt)LT!Ak2uOqB-h9Z}GKrhr&MN^RVR~&M)Kd`P?I1Xbj z_0W49syedne5tb?TrXwRX<=O5y?m3t3l<7*&#UH?k*(fRLX+ML7!_`Nue%cSqHU_* zW?D^y&CJ-j{>B-T3k)_W?<wmP)xeiKi4Bnx_`TSlSn3wJg6G&Ig+1(-iS6!0ZgBI& zBHQmblW7bh1N;3bla34^0^6vQunZwEQ!mjjqFA`75LGh!dW_!aEFBBY8QV^(V;UeZ z8)*@?;wC_t<ZwwW<Rn2Fp!fiVvjGhs0e`QaJY|h|hFeMW1s3y0{hKxKW6+LL+wEX( zcleqANM}7a2I~oaYKT3Pvc&D<w=2C`<Mym2>ccp#glE<#%onw^*^s4eL%2?JSSRi* z@aE+c15_N1ah+;7tX-I$?Uh@}_TBdUMg6M**oR|dgDXzkn>E%<=8|XRsIS{67Cq|A z!<pG0ghVGbpqgHEq{U+g(fMzcle0JShGHI?m6tVyO1ee(&7{nK{r)^xfqr>tmS|$# KLHr+k8UyAriHCy# delta 2892 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 diff --git a/docs/finn/_build/html/py-modindex.html b/docs/finn/_build/html/py-modindex.html index f94442696..7402105af 100644 --- a/docs/finn/_build/html/py-modindex.html +++ b/docs/finn/_build/html/py-modindex.html @@ -170,11 +170,6 @@ <td> <code class="xref">finn</code></td><td> <em></em></td></tr> - <tr class="cg-1"> - <td></td> - <td>    - <a href="source_code/finn.analysis.html#module-finn.analysis"><code class="xref">finn.analysis</code></a></td><td> - <em></em></td></tr> <tr class="cg-1"> <td></td> <td>    @@ -280,11 +275,6 @@ <td>    <a href="source_code/finn.custom_op.html#module-finn.custom_op.xnorpopcount"><code class="xref">finn.custom_op.xnorpopcount</code></a></td><td> <em></em></td></tr> - <tr class="cg-1"> - <td></td> - <td>    - <a href="source_code/finn.transformation.html#module-finn.transformation"><code class="xref">finn.transformation</code></a></td><td> - <em></em></td></tr> <tr class="cg-1"> <td></td> <td>    diff --git a/docs/finn/_build/html/searchindex.js b/docs/finn/_build/html/searchindex.js index 9e1f5508b..f4eedb5af 100644 --- a/docs/finn/_build/html/searchindex.js +++ b/docs/finn/_build/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({docnames:["brevitas_export","end_to_end_flow","genindex","getting_started","index","internals","nw_prep","pynq_deploy","source_code/finn","source_code/finn.analysis","source_code/finn.analysis.fpgadataflow","source_code/finn.core","source_code/finn.custom_op","source_code/finn.custom_op.fpgadataflow","source_code/finn.transformation","source_code/finn.transformation.fpgadataflow","source_code/finn.transformation.streamline","source_code/finn.util","source_code/modules","tutorials","verification","vivado_synth"],envversion:{"sphinx.domains.c":1,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":1,"sphinx.domains.index":1,"sphinx.domains.javascript":1,"sphinx.domains.math":2,"sphinx.domains.python":1,"sphinx.domains.rst":1,"sphinx.domains.std":1,sphinx:56},filenames:["brevitas_export.rst","end_to_end_flow.rst","genindex.rst","getting_started.rst","index.rst","internals.rst","nw_prep.rst","pynq_deploy.rst","source_code/finn.rst","source_code/finn.analysis.rst","source_code/finn.analysis.fpgadataflow.rst","source_code/finn.core.rst","source_code/finn.custom_op.rst","source_code/finn.custom_op.fpgadataflow.rst","source_code/finn.transformation.rst","source_code/finn.transformation.fpgadataflow.rst","source_code/finn.transformation.streamline.rst","source_code/finn.util.rst","source_code/modules.rst","tutorials.rst","verification.rst","vivado_synth.rst"],objects:{"finn.analysis":{topology:[9,0,0,"-"],verify_custom_nodes:[9,0,0,"-"]},"finn.analysis.fpgadataflow":{hls_synth_res_estimation:[10,0,0,"-"],res_estimation:[10,0,0,"-"]},"finn.analysis.fpgadataflow.hls_synth_res_estimation":{hls_synth_res_estimation:[10,1,1,""]},"finn.analysis.fpgadataflow.res_estimation":{res_estimation:[10,1,1,""]},"finn.analysis.topology":{all_tensors_f32:[9,1,1,""],get_per_tensor_fanouts:[9,1,1,""],is_linear:[9,1,1,""],node_inputs_in_expected_order:[9,1,1,""]},"finn.analysis.verify_custom_nodes":{verify_nodes:[9,1,1,""]},"finn.core":{datatype:[11,0,0,"-"],execute_custom_node:[11,0,0,"-"],modelwrapper:[11,0,0,"-"],onnx_exec:[11,0,0,"-"],remote_exec:[11,0,0,"-"],rtlsim_exec:[11,0,0,"-"]},"finn.core.datatype":{DataType:[11,2,1,""]},"finn.core.datatype.DataType":{BINARY:[11,3,1,""],BIPOLAR:[11,3,1,""],FLOAT32:[11,3,1,""],INT16:[11,3,1,""],INT2:[11,3,1,""],INT32:[11,3,1,""],INT3:[11,3,1,""],INT4:[11,3,1,""],INT8:[11,3,1,""],TERNARY:[11,3,1,""],UINT16:[11,3,1,""],UINT2:[11,3,1,""],UINT32:[11,3,1,""],UINT3:[11,3,1,""],UINT4:[11,3,1,""],UINT8:[11,3,1,""],allowed:[11,4,1,""],bitwidth:[11,4,1,""],get_hls_datatype_str:[11,4,1,""],get_num_possible_values:[11,4,1,""],get_smallest_possible:[11,4,1,""],is_integer:[11,4,1,""],max:[11,4,1,""],min:[11,4,1,""],signed:[11,4,1,""]},"finn.core.execute_custom_node":{execute_custom_node:[11,1,1,""]},"finn.core.modelwrapper":{ModelWrapper:[11,2,1,""]},"finn.core.modelwrapper.ModelWrapper":{analysis:[11,4,1,""],check_all_tensor_shapes_specified:[11,4,1,""],check_compatibility:[11,4,1,""],find_consumer:[11,4,1,""],find_producer:[11,4,1,""],get_all_tensor_names:[11,4,1,""],get_initializer:[11,4,1,""],get_metadata_prop:[11,4,1,""],get_tensor_datatype:[11,4,1,""],get_tensor_fanout:[11,4,1,""],get_tensor_shape:[11,4,1,""],get_tensor_valueinfo:[11,4,1,""],graph:[11,4,1,""],make_empty_exec_context:[11,4,1,""],make_new_valueinfo_name:[11,4,1,""],model:[11,4,1,""],rename_tensor:[11,4,1,""],save:[11,4,1,""],set_initializer:[11,4,1,""],set_metadata_prop:[11,4,1,""],set_tensor_datatype:[11,4,1,""],set_tensor_shape:[11,4,1,""],transform:[11,4,1,""]},"finn.core.onnx_exec":{compare_execution:[11,1,1,""],execute_node:[11,1,1,""],execute_onnx:[11,1,1,""],execute_onnx_and_make_model:[11,1,1,""]},"finn.core.remote_exec":{remote_exec:[11,1,1,""]},"finn.core.rtlsim_exec":{rtlsim_exec:[11,1,1,""]},"finn.custom_op":{CustomOp:[12,2,1,""],fpgadataflow:[13,0,0,"-"],multithreshold:[12,0,0,"-"],registry:[12,0,0,"-"],streamingdataflowpartition:[12,0,0,"-"],xnorpopcount:[12,0,0,"-"]},"finn.custom_op.CustomOp":{execute_node:[12,4,1,""],get_nodeattr:[12,4,1,""],get_nodeattr_types:[12,4,1,""],infer_node_datatype:[12,4,1,""],make_shape_compatible_op:[12,4,1,""],set_nodeattr:[12,4,1,""],verify_node:[12,4,1,""]},"finn.custom_op.fpgadataflow":{HLSCustomOp:[13,2,1,""],convolutioninputgenerator:[13,0,0,"-"],streamingfclayer_batch:[13,0,0,"-"],streamingmaxpool_batch:[13,0,0,"-"],templates:[13,0,0,"-"],tlastmarker:[13,0,0,"-"]},"finn.custom_op.fpgadataflow.HLSCustomOp":{blackboxfunction:[13,4,1,""],bram_estimation:[13,4,1,""],code_generation_ipgen:[13,4,1,""],code_generation_npysim:[13,4,1,""],compile_singlenode_code:[13,4,1,""],dataoutstrm:[13,4,1,""],defines:[13,4,1,""],docompute:[13,4,1,""],dynamic_input_to_npy:[13,4,1,""],exec_precompiled_singlenode_model:[13,4,1,""],execute_node:[13,4,1,""],generate_params:[13,4,1,""],get_folded_input_shape:[13,4,1,""],get_folded_output_shape:[13,4,1,""],get_instream_width:[13,4,1,""],get_nodeattr_types:[13,4,1,""],get_number_output_values:[13,4,1,""],get_outstream_width:[13,4,1,""],global_includes:[13,4,1,""],ipgen_singlenode_code:[13,4,1,""],lut_estimation:[13,4,1,""],node_res_estimation:[13,4,1,""],npy_to_dynamic_output:[13,4,1,""],pragmas:[13,4,1,""],read_npy_data:[13,4,1,""],reset_rtlsim:[13,4,1,""],rtlsim:[13,4,1,""],save_as_npy:[13,4,1,""],strm_decl:[13,4,1,""],toggle_clk:[13,4,1,""]},"finn.custom_op.fpgadataflow.convolutioninputgenerator":{ConvolutionInputGenerator:[13,2,1,""]},"finn.custom_op.fpgadataflow.convolutioninputgenerator.ConvolutionInputGenerator":{blackboxfunction:[13,4,1,""],bram_estimation:[13,4,1,""],dataoutstrm:[13,4,1,""],defines:[13,4,1,""],docompute:[13,4,1,""],execute_node:[13,4,1,""],get_input_datatype:[13,4,1,""],get_nodeattr_types:[13,4,1,""],get_number_output_values:[13,4,1,""],get_output_datatype:[13,4,1,""],get_stream_width:[13,4,1,""],global_includes:[13,4,1,""],infer_node_datatype:[13,4,1,""],lut_estimation:[13,4,1,""],make_shape_compatible_op:[13,4,1,""],pragmas:[13,4,1,""],read_npy_data:[13,4,1,""],save_as_npy:[13,4,1,""],strm_decl:[13,4,1,""],verify_node:[13,4,1,""]},"finn.custom_op.fpgadataflow.streamingfclayer_batch":{StreamingFCLayer_Batch:[13,2,1,""]},"finn.custom_op.fpgadataflow.streamingfclayer_batch.StreamingFCLayer_Batch":{blackboxfunction:[13,4,1,""],bram_estimation:[13,4,1,""],calc_tmem:[13,4,1,""],calc_wmem:[13,4,1,""],dataoutstrm:[13,4,1,""],defines:[13,4,1,""],docompute:[13,4,1,""],execute_node:[13,4,1,""],generate_params:[13,4,1,""],get_folded_input_shape:[13,4,1,""],get_folded_output_shape:[13,4,1,""],get_hls_compatible_threshold_tensor:[13,4,1,""],get_hls_compatible_weight_tensor:[13,4,1,""],get_input_datatype:[13,4,1,""],get_instream_width:[13,4,1,""],get_nodeattr_types:[13,4,1,""],get_number_output_values:[13,4,1,""],get_output_datatype:[13,4,1,""],get_outstream_width:[13,4,1,""],get_template_param_values:[13,4,1,""],get_weight_datatype:[13,4,1,""],global_includes:[13,4,1,""],infer_node_datatype:[13,4,1,""],lut_estimation:[13,4,1,""],make_shape_compatible_op:[13,4,1,""],pragmas:[13,4,1,""],read_npy_data:[13,4,1,""],save_as_npy:[13,4,1,""],strm_decl:[13,4,1,""],verify_node:[13,4,1,""]},"finn.custom_op.fpgadataflow.streamingmaxpool_batch":{StreamingMaxPool_Batch:[13,2,1,""]},"finn.custom_op.fpgadataflow.streamingmaxpool_batch.StreamingMaxPool_Batch":{blackboxfunction:[13,4,1,""],bram_estimation:[13,4,1,""],dataoutstrm:[13,4,1,""],defines:[13,4,1,""],docompute:[13,4,1,""],get_nodeattr_types:[13,4,1,""],get_number_output_values:[13,4,1,""],global_includes:[13,4,1,""],infer_node_datatype:[13,4,1,""],lut_estimation:[13,4,1,""],make_shape_compatible_op:[13,4,1,""],pragmas:[13,4,1,""],read_npy_data:[13,4,1,""],save_as_npy:[13,4,1,""],strm_decl:[13,4,1,""],verify_node:[13,4,1,""]},"finn.custom_op.fpgadataflow.tlastmarker":{TLastMarker:[13,2,1,""]},"finn.custom_op.fpgadataflow.tlastmarker.TLastMarker":{blackboxfunction:[13,4,1,""],dataoutstrm:[13,4,1,""],defines:[13,4,1,""],docompute:[13,4,1,""],execute_node:[13,4,1,""],get_folded_input_shape:[13,4,1,""],get_folded_output_shape:[13,4,1,""],get_instream_width:[13,4,1,""],get_nodeattr_types:[13,4,1,""],get_number_output_values:[13,4,1,""],get_outstream_width:[13,4,1,""],global_includes:[13,4,1,""],infer_node_datatype:[13,4,1,""],make_shape_compatible_op:[13,4,1,""],pragmas:[13,4,1,""],read_npy_data:[13,4,1,""],save_as_npy:[13,4,1,""],strm_decl:[13,4,1,""],verify_node:[13,4,1,""]},"finn.custom_op.multithreshold":{MultiThreshold:[12,2,1,""],compare:[12,1,1,""],multithreshold:[12,1,1,""]},"finn.custom_op.multithreshold.MultiThreshold":{execute_node:[12,4,1,""],get_nodeattr_types:[12,4,1,""],infer_node_datatype:[12,4,1,""],make_shape_compatible_op:[12,4,1,""],verify_node:[12,4,1,""]},"finn.custom_op.registry":{getCustomOp:[12,1,1,""]},"finn.custom_op.streamingdataflowpartition":{StreamingDataflowPartition:[12,2,1,""]},"finn.custom_op.streamingdataflowpartition.StreamingDataflowPartition":{execute_node:[12,4,1,""],get_nodeattr_types:[12,4,1,""],infer_node_datatype:[12,4,1,""],make_shape_compatible_op:[12,4,1,""],verify_node:[12,4,1,""]},"finn.custom_op.xnorpopcount":{XnorPopcountMatMul:[12,2,1,""],xnorpopcountmatmul:[12,1,1,""]},"finn.custom_op.xnorpopcount.XnorPopcountMatMul":{execute_node:[12,4,1,""],get_nodeattr_types:[12,4,1,""],infer_node_datatype:[12,4,1,""],make_shape_compatible_op:[12,4,1,""],verify_node:[12,4,1,""]},"finn.transformation":{Transformation:[14,2,1,""],batchnorm_to_affine:[14,0,0,"-"],bipolar_to_xnor:[14,0,0,"-"],fold_constants:[14,0,0,"-"],general:[14,0,0,"-"],infer_datatypes:[14,0,0,"-"],infer_shapes:[14,0,0,"-"],streamline:[16,0,0,"-"]},"finn.transformation.Transformation":{apply:[14,4,1,""]},"finn.transformation.batchnorm_to_affine":{BatchNormToAffine:[14,2,1,""]},"finn.transformation.batchnorm_to_affine.BatchNormToAffine":{apply:[14,4,1,""]},"finn.transformation.bipolar_to_xnor":{ConvertBipolarMatMulToXnorPopcount:[14,2,1,""]},"finn.transformation.bipolar_to_xnor.ConvertBipolarMatMulToXnorPopcount":{apply:[14,4,1,""]},"finn.transformation.fold_constants":{FoldConstants:[14,2,1,""]},"finn.transformation.fold_constants.FoldConstants":{apply:[14,4,1,""]},"finn.transformation.fpgadataflow":{cleanup:[15,0,0,"-"],codegen_ipgen:[15,0,0,"-"],codegen_ipstitch:[15,0,0,"-"],codegen_npysim:[15,0,0,"-"],compile:[15,0,0,"-"],convert_to_hls_layers:[15,0,0,"-"],create_dataflow_partition:[15,0,0,"-"],hlssynth_ipgen:[15,0,0,"-"],insert_tlastmarker:[15,0,0,"-"],make_deployment:[15,0,0,"-"],make_pynq_driver:[15,0,0,"-"],make_pynq_proj:[15,0,0,"-"],replace_verilog_relpaths:[15,0,0,"-"],set_exec_mode:[15,0,0,"-"],synth_pynq_proj:[15,0,0,"-"],templates:[15,0,0,"-"]},"finn.transformation.fpgadataflow.cleanup":{CleanUp:[15,2,1,""]},"finn.transformation.fpgadataflow.cleanup.CleanUp":{apply:[15,4,1,""]},"finn.transformation.fpgadataflow.codegen_ipgen":{CodeGen_ipgen:[15,2,1,""]},"finn.transformation.fpgadataflow.codegen_ipgen.CodeGen_ipgen":{apply:[15,4,1,""]},"finn.transformation.fpgadataflow.codegen_ipstitch":{CodeGen_ipstitch:[15,2,1,""]},"finn.transformation.fpgadataflow.codegen_ipstitch.CodeGen_ipstitch":{apply:[15,4,1,""]},"finn.transformation.fpgadataflow.codegen_npysim":{CodeGen_npysim:[15,2,1,""]},"finn.transformation.fpgadataflow.codegen_npysim.CodeGen_npysim":{apply:[15,4,1,""]},"finn.transformation.fpgadataflow.compile":{Compile:[15,2,1,""]},"finn.transformation.fpgadataflow.compile.Compile":{apply:[15,4,1,""]},"finn.transformation.fpgadataflow.convert_to_hls_layers":{InferBinaryStreamingFCLayer:[15,2,1,""]},"finn.transformation.fpgadataflow.convert_to_hls_layers.InferBinaryStreamingFCLayer":{apply:[15,4,1,""]},"finn.transformation.fpgadataflow.create_dataflow_partition":{CreateDataflowPartition:[15,2,1,""]},"finn.transformation.fpgadataflow.create_dataflow_partition.CreateDataflowPartition":{apply:[15,4,1,""]},"finn.transformation.fpgadataflow.hlssynth_ipgen":{HLSSynth_IPGen:[15,2,1,""]},"finn.transformation.fpgadataflow.hlssynth_ipgen.HLSSynth_IPGen":{apply:[15,4,1,""]},"finn.transformation.fpgadataflow.insert_tlastmarker":{InsertTLastMarker:[15,2,1,""]},"finn.transformation.fpgadataflow.insert_tlastmarker.InsertTLastMarker":{apply:[15,4,1,""]},"finn.transformation.fpgadataflow.make_deployment":{DeployToPYNQ:[15,2,1,""]},"finn.transformation.fpgadataflow.make_deployment.DeployToPYNQ":{apply:[15,4,1,""]},"finn.transformation.fpgadataflow.make_pynq_driver":{MakePYNQDriver:[15,2,1,""]},"finn.transformation.fpgadataflow.make_pynq_driver.MakePYNQDriver":{apply:[15,4,1,""]},"finn.transformation.fpgadataflow.make_pynq_proj":{MakePYNQProject:[15,2,1,""]},"finn.transformation.fpgadataflow.make_pynq_proj.MakePYNQProject":{apply:[15,4,1,""]},"finn.transformation.fpgadataflow.replace_verilog_relpaths":{ReplaceVerilogRelPaths:[15,2,1,""]},"finn.transformation.fpgadataflow.replace_verilog_relpaths.ReplaceVerilogRelPaths":{apply:[15,4,1,""]},"finn.transformation.fpgadataflow.set_exec_mode":{SetExecMode:[15,2,1,""]},"finn.transformation.fpgadataflow.set_exec_mode.SetExecMode":{apply:[15,4,1,""]},"finn.transformation.fpgadataflow.synth_pynq_proj":{SynthPYNQProject:[15,2,1,""]},"finn.transformation.fpgadataflow.synth_pynq_proj.SynthPYNQProject":{apply:[15,4,1,""]},"finn.transformation.general":{ConvertSubToAdd:[14,2,1,""],GiveRandomTensorNames:[14,2,1,""],GiveReadableTensorNames:[14,2,1,""],GiveUniqueNodeNames:[14,2,1,""]},"finn.transformation.general.ConvertSubToAdd":{apply:[14,4,1,""]},"finn.transformation.general.GiveRandomTensorNames":{apply:[14,4,1,""]},"finn.transformation.general.GiveReadableTensorNames":{apply:[14,4,1,""]},"finn.transformation.general.GiveUniqueNodeNames":{apply:[14,4,1,""]},"finn.transformation.infer_datatypes":{InferDataTypes:[14,2,1,""]},"finn.transformation.infer_datatypes.InferDataTypes":{apply:[14,4,1,""]},"finn.transformation.infer_shapes":{InferShapes:[14,2,1,""]},"finn.transformation.infer_shapes.InferShapes":{apply:[14,4,1,""]},"finn.transformation.streamline":{Streamline:[16,2,1,""],absorb:[16,0,0,"-"],collapse_repeated:[16,0,0,"-"],reorder:[16,0,0,"-"],round_thresholds:[16,0,0,"-"],sign_to_thres:[16,0,0,"-"]},"finn.transformation.streamline.Streamline":{apply:[16,4,1,""]},"finn.transformation.streamline.absorb":{Absorb1BitMulIntoMatMul:[16,2,1,""],AbsorbAddIntoMultiThreshold:[16,2,1,""],AbsorbMulIntoMultiThreshold:[16,2,1,""],FactorOutMulSignMagnitude:[16,2,1,""]},"finn.transformation.streamline.absorb.Absorb1BitMulIntoMatMul":{apply:[16,4,1,""]},"finn.transformation.streamline.absorb.AbsorbAddIntoMultiThreshold":{apply:[16,4,1,""]},"finn.transformation.streamline.absorb.AbsorbMulIntoMultiThreshold":{apply:[16,4,1,""]},"finn.transformation.streamline.absorb.FactorOutMulSignMagnitude":{apply:[16,4,1,""]},"finn.transformation.streamline.collapse_repeated":{CollapseRepeatedAdd:[16,2,1,""],CollapseRepeatedMul:[16,2,1,""],CollapseRepeatedOp:[16,2,1,""]},"finn.transformation.streamline.collapse_repeated.CollapseRepeatedOp":{apply:[16,4,1,""]},"finn.transformation.streamline.reorder":{MoveAddPastMul:[16,2,1,""],MoveScalarAddPastMatMul:[16,2,1,""],MoveScalarMulPastMatMul:[16,2,1,""]},"finn.transformation.streamline.reorder.MoveAddPastMul":{apply:[16,4,1,""]},"finn.transformation.streamline.reorder.MoveScalarAddPastMatMul":{apply:[16,4,1,""]},"finn.transformation.streamline.reorder.MoveScalarMulPastMatMul":{apply:[16,4,1,""]},"finn.transformation.streamline.round_thresholds":{RoundAndClipThresholds:[16,2,1,""]},"finn.transformation.streamline.round_thresholds.RoundAndClipThresholds":{apply:[16,4,1,""]},"finn.transformation.streamline.sign_to_thres":{ConvertSignToThres:[16,2,1,""]},"finn.transformation.streamline.sign_to_thres.ConvertSignToThres":{apply:[16,4,1,""]},"finn.util":{basic:[17,0,0,"-"],data_packing:[17,0,0,"-"],fpgadataflow:[17,0,0,"-"],onnx:[17,0,0,"-"],test:[17,0,0,"-"]},"finn.util.basic":{CppBuilder:[17,2,1,""],calculate_signed_dot_prod_range:[17,1,1,""],gen_finn_dt_tensor:[17,1,1,""],get_by_name:[17,1,1,""],get_finn_root:[17,1,1,""],interleave_matrix_outer_dim_from_partitions:[17,1,1,""],make_build_dir:[17,1,1,""],pad_tensor_to_multiple_of:[17,1,1,""],random_string:[17,1,1,""],remove_by_name:[17,1,1,""],roundup_to_integer_multiple:[17,1,1,""]},"finn.util.basic.CppBuilder":{append_includes:[17,4,1,""],append_sources:[17,4,1,""],build:[17,4,1,""],set_executable_path:[17,4,1,""]},"finn.util.data_packing":{array2hexstring:[17,1,1,""],finnpy_to_packed_bytearray:[17,1,1,""],hexstring2npbytearray:[17,1,1,""],npbytearray2hexstring:[17,1,1,""],npy_to_rtlsim_input:[17,1,1,""],numpy_to_hls_code:[17,1,1,""],pack_innermost_dim_as_hex_string:[17,1,1,""],packed_bytearray_to_finnpy:[17,1,1,""],rtlsim_output_to_npy:[17,1,1,""],unpack_innermost_dim_from_hex_string:[17,1,1,""]},"finn.util.fpgadataflow":{IPGenBuilder:[17,2,1,""],pyverilate_get_liveness_threshold_cycles:[17,1,1,""],pyverilate_stitched_ip:[17,1,1,""]},"finn.util.fpgadataflow.IPGenBuilder":{append_tcl:[17,4,1,""],build:[17,4,1,""],set_ipgen_path:[17,4,1,""]},"finn.util.onnx":{valueinfo_to_tensor:[17,1,1,""]},"finn.util.test":{get_test_model_def_fxn:[17,1,1,""],get_test_model_trained:[17,1,1,""],get_test_model_untrained:[17,1,1,""],get_trained_checkpoint:[17,1,1,""]},finn:{analysis:[9,0,0,"-"],custom_op:[12,0,0,"-"],transformation:[14,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","function","Python function"],"2":["py","class","Python class"],"3":["py","attribute","Python attribute"],"4":["py","method","Python method"]},objtypes:{"0":"py:module","1":"py:function","2":"py:class","3":"py:attribute","4":"py:method"},terms:{"0f01":17,"0x07":17,"0x0e":17,"0x0f01":17,"0xb":17,"0xe":17,"abstract":[12,13,14],"boolean":11,"class":[11,14,15,16,17],"const":14,"default":[12,13,14],"enum":11,"final":11,"float":17,"function":[3,11,12,13,14,17],"import":3,"int":15,"new":[3,4,11,12,13],"return":[9,10,11,12,13,14,16,17],"static":9,"throw":17,"true":[11,17],"try":3,"var":13,For:[15,16],HLS:[4,11,12,15,17],IPs:15,PEs:13,The:[3,4,8,9,11,12,14,15,16,17],There:3,Use:[11,17],abc:[12,14],abit:17,abort:13,about:[4,7,9,15],abov:3,absolut:15,absorb1bitmulintomatmul:16,absorb:15,absorbaddintomultithreshold:16,absorbmulintomultithreshold:16,acceler:[3,15],access:3,accord:[13,17],account:11,action:15,activ:[11,17],add:[14,16,17],added:13,adder:16,adding:3,addit:[3,13,15],addition:16,address:15,admin:3,after:[13,17],aim:16,all:[3,9,11,12,13,14,15,17],all_tensors_f32:9,allow:11,alreadi:[15,19],also:[3,12,13,15],amount:17,analysi:[8,11,18],analysis_fxn:11,anaylsis_fxn:11,ani:[3,11,12,14,15,17],annot:[9,11,12,13],anoth:15,append_includ:17,append_sourc:17,append_tcl:17,appli:[11,14,15,16],apply_rep:14,appropri:[3,14],arbitrari:17,architectur:4,argument:[3,15,17],around:11,arrai:17,array2hexstr:17,arxiv:16,assign:11,associ:[11,14],assum:17,attribut:[9,12,13,15],attribute_nam:[12,13],attributeproto:[12,13],avail:19,back:[3,13],backend:15,base:[11,14,15,16,17],bash:[13,17],basic:13,batchnorm:14,batchnormtoaffin:14,been:[12,15],befor:17,below:8,between:[13,17],bias:12,binari:[11,13,15,16,17],bipolar:[11,12,13,14,16,17],bit:[11,17],bitfil:[3,12],bitwidth:11,blackbock:13,blackboxfunct:13,block:[13,15,17],blott:13,board:[11,15],bool:[9,14],both:17,bram:13,bram_estim:13,brevita:[4,17],brien:13,browser:3,build:[13,17],built:9,calc_tmem:13,calc_wmem:13,calcul:13,calculate_signed_dot_prod_rang:17,call:[3,11,13,14,15],can:[3,4,7,11,13,14,15,16,17],cannot:14,centerpiec:4,certain:9,chang:[3,11,14],check:[9,11,12,13],check_all_tensor_shapes_specifi:11,check_compat:11,client:3,clk:[13,15],clock:13,clone:[3,17],code:[13,15,17,18],code_gen_dir:17,code_gen_dir_ipgen:15,code_gen_dir_npysim:15,code_generation_ipgen:13,code_generation_npysim:13,collaps:16,collapserepeatedadd:16,collapserepeatedmul:16,collapserepeatedop:16,collect:[3,15],colloqui:4,come:[3,9],command:[3,13,17],commun:4,compar:[11,12],compare_execut:11,compare_fxn:11,comparison:12,compat:[11,12,13],compil:[4,13,17],compile_singlenode_cod:13,complet:3,compon:4,comput:[3,11,13],configur:3,consecut:16,constant:[9,11,16],construct:4,consum:11,contain:[3,4,11,12,13,14,15,17],context:[11,12,13],contribut:4,convent:9,convert:[3,13,14,15,16,17],convertbipolarmatmultoxnorpopcount:14,convertsigntothr:16,convertsubtoadd:14,copi:[11,14,15],core:[8,15,18],correct:[14,17],correctli:[3,9,12,13,15],correspond:[4,11,12,13],count:13,cpp_file:17,cppbuilder:[13,17],creat:[3,11,15,17],createdataflowpartit:15,current:[4,11,13],custom:[3,4,8,9,11,15,18],customop:[12,13],cycl:[13,17],data:[11,12,13,15,17],dataflow:[4,11,15],dataoutstrm:13,datatyp:[12,13,14,17],debug:11,declar:[13,14],deep:[4,11,13,14],default_v:[12,13],default_valu:[12,13],defin:13,deliveri:3,depend:3,deploi:3,deploy:15,deploytopynq:15,descript:[0,6,20,21],design:[3,15],detail:[0,4,6,7,20,21],develop:4,dict:[11,12,13],dictionari:[9,11,13],differ:[3,8,12,13],digit:17,dimens:17,dimension:17,dir:[15,17],directli:4,directori:[3,15,17],distr_pad:17,divid:8,divis:17,doc:4,docker:17,dockerfil:3,docomput:13,doe:[3,11,12],don:14,done:9,dot:17,down:[3,11],driver:15,dt_a:17,dt_b:17,dtype:[9,11,12,13,17],dynam:9,dynamic_input_to_npi:13,each:[4,9,11,14,15,16,17],editor:3,effect:14,either:3,element:17,embed:11,emit:17,emphasi:4,empti:11,end:13,ensur:[13,14,15,17],entir:3,entri:17,enumer:14,environ:3,equal:[12,13],equival:16,estim:[10,13],even:14,evenli:17,event:3,everi:[3,12,13,14,15],everyth:3,exampl:[3,17],excel:3,except:17,exec_mod:15,exec_precompiled_singlenode_model:13,execut:[11,12,13,15,17],executable_path:[15,17],execute_nod:[11,12,13],execute_onnx:[11,15],execute_onnx_and_make_model:11,execution_context:11,exist:[12,13,17],exit:17,expect:[9,11,12,13,15],experi:4,experiment:4,explor:[4,11,13],expos:11,extens:3,extra:[3,9,17],extract:[9,10],f5c6bd32ae93ec103a88152214baedff4ce1850d81065bfc:3,factor:17,factoroutmulsignmagnitud:16,fals:[11,14,17],familiar:3,fan:9,fast:13,feel:19,fewer:11,fewest:11,field:[15,17],file:[3,11,13,15,17],filenam:[11,15],fill:[12,13,14],find:[7,11],find_consum:11,find_produc:11,finish:17,finn:[0,5,6,7,8,19,20,21],finn_dt:17,finnpy_to_packed_bytearrai:17,first:[9,16],fix:[14,17],flatten:17,float32:[9,11],fold:13,foldconst:14,folder:[3,15,17],follow:[3,4,9,11,12,15],form:13,format:13,forward:3,found:[4,15],four:17,fpga:[3,4],fpgadataflow:[9,12,14],fpgapart:[13,15],framework:[4,13],fraser:13,free:19,from:[3,4,10,11,13,15,17],full:11,further:14,gambardella:13,gen_finn_dt_tensor:17,gener:[4,13,15,17],generate_param:13,get:[11,12,13,15],get_all_tensor_nam:11,get_by_nam:17,get_finn_root:17,get_folded_input_shap:13,get_folded_output_shap:13,get_hls_compatible_threshold_tensor:13,get_hls_compatible_weight_tensor:13,get_hls_datatype_str:11,get_initi:11,get_input_datatyp:13,get_instream_width:13,get_metadata_prop:11,get_nodeattr:12,get_nodeattr_typ:[12,13],get_num_possible_valu:11,get_number_output_valu:13,get_output_datatyp:13,get_outstream_width:13,get_per_tensor_fanout:9,get_smallest_poss:11,get_stream_width:13,get_template_param_valu:13,get_tensor_datatyp:11,get_tensor_fanout:11,get_tensor_shap:11,get_tensor_valueinfo:11,get_test_model_def_fxn:17,get_test_model_train:17,get_test_model_untrain:17,get_trained_checkpoint:17,get_weight_datatyp:13,getcustomop:12,github:[3,4],give:[3,14,16],give_unique_node_nam:14,given:[9,10,11,12,13,17],giverandomtensornam:14,givereadabletensornam:14,giveuniquenodenam:14,global:13,global_includ:13,graph:[9,11,12,13,14,15],graphic:4,greater:12,group:12,guarante:[14,17],guid:[18,19],hand:4,happen:3,has:[3,9,11,13,14,15,17],have:[3,9,11,12,13,14,15,16],help:3,helper:12,here:[0,5,6,20,21],hex:17,hexstr:17,hexstring2npbytearrai:17,high:3,highli:4,hls:13,hls_var_nam:17,hlscustomop:13,hlslib:[4,13],homepag:4,host:[3,17],how:[6,17,18,21],http:3,human:14,imag:13,immedi:15,implement:[11,13,15],includ:[4,11,13,15],include_path:17,indic:[11,12,13,14,15],infer:[3,4,11,12,13,14,17],infer_node_datatyp:[12,13],inferbinarystreamingfclay:15,inferdatatyp:14,infershap:14,infinit:14,info:[14,17],info_messag:9,inform:[9,15],infrastructur:15,inherit:14,initi:[3,9,11],innermost:17,inp0:12,inp1:12,inp:13,input:[9,11,12,13,14,16,17],input_dict:11,input_dtyp:17,input_fil:17,insert:[13,15,17],inserttlastmark:15,insid:[3,12],instal:3,instanc:[11,12,16],instant:17,instanti:15,instead:17,int16:11,int2:11,int32:11,int3:11,int4:11,int8:11,integ:[11,12,16,17],interest:11,interfac:15,interleav:[13,17],interleave_matrix_outer_dim_from_partit:17,intermedi:[11,14],intern:14,interv:12,involv:3,ipgen:13,ipgen_path:[15,17],ipgen_singlenode_cod:13,ipgenbuild:[13,17],is_integ:11,is_linear:9,item:17,its:12,itself:12,jupyt:[4,19],kei:11,kind:15,know:14,lab:4,lambda:11,largest:11,launch:3,layer:[14,15],lead:17,learn:[4,13],leeser:13,len:17,let:14,letter:17,librari:[4,17],library_path:17,like:3,linear:[9,11],link:[3,4,19],list:[8,9,11,17],load:17,locat:3,look:[3,4,9,19],loop:[13,14],lut:13,lut_estim:13,made:[11,14],magnitud:16,mai:3,make:[3,13,14,15],make_build_dir:17,make_collapsed_param_fxn:16,make_deepcopi:11,make_empty_exec_context:11,make_new_valueinfo_nam:11,make_project:15,make_shape_compatible_op:[12,13],makepynqdriv:15,makepynqproject:15,mani:3,manipul:11,manual:14,map:12,mark:13,matmul:[14,16],matrix:[12,13,16,17],max:[11,17],mean:17,meant:14,member:[12,13,17],meta:12,metadata:11,metadata_prop:[11,15],method:[12,13,14,20],min:[11,17],minimum:17,minut:15,mixtur:9,mkdtemp:17,mode:[3,15],model:[9,10,11,12,13,14,15,16,17,20],model_a:11,model_b:11,model_was_chang:14,modelproto:[11,15],modelwrapp:[9,14],modul:18,modular:4,more:[4,7,11,14,17],mount:3,move:16,moveaddpastmul:16,movescalaraddpastmatmul:16,movescalarmulpastmatmul:16,mul:[14,16],multidimension:17,multipl:[12,14,16,17],multipli:16,multithreshold:[15,16],must:[12,14,15,16,17],mvtu:15,n_partit:17,n_thres_step:13,name:[9,10,11,12,14,17],name_field:17,ndarrai:17,nearest:[16,17],necessari:15,need:[10,12,13,14],neg:[11,16],netnam:17,netron:3,network:[3,4,13,17],neural:[4,13],neuron:13,new_nam:11,next:16,no_decl:17,node:[9,10,11,14,15,16,18],node_inputs_in_expected_ord:9,node_res_estim:13,non:15,none:[11,12,17],note:[3,12],notebook:[4,19],notwithstand:9,now:[9,11],npbytearrai:17,npbytearray2hexstr:17,npy:[13,17],npy_to_dynamic_output:13,npy_to_rtlsim_input:17,npysim:[13,15],number:[11,12,13,17],numpi:[13,17],numpy_to_hls_cod:17,object:[11,17],observ:13,old_nam:11,onc:[13,14],one:[9,11,13,15,17],ones:[3,15],onli:[9,11,14,15,16],onlin:3,onnx:[11,12,13,15],onnx_exec:15,onnx_model_proto:11,onnx_nod:[12,13],onnxruntim:11,op_nam:16,op_typ:9,open:3,oper:[11,16],ops:[9,13,16],option:3,order:[9,11],orig_thres_matrix:13,orig_weight_matrix:13,origin:13,other:[11,16],otherwis:[3,11,12,14,17],out:[9,12,13],out_bia:12,out_scal:12,out_shap:17,outcom:15,outermost:17,output:[11,12,13,14,17],output_shap:17,overlai:15,overview:[4,5],own:[3,12],pack:[15,17],pack_innermost_dim:17,pack_innermost_dim_as_hex_str:17,packag:15,packed_bytearrai:17,packed_bytearray_to_finnpi:17,packedbit:17,pad:17,pad_tensor_to_multiple_of:17,pad_to_dim:17,pad_to_nbit:17,page:[7,19],pair:15,param:13,paramet:[13,16,17],part:[12,13,17],particular:[12,13,17],partit:[11,17],pass:[13,17,18],password:[3,15],past:16,path:[13,15,17],payload:3,per:15,perform:[3,12,13],permit:[12,13],place:[13,15],placehold:12,platform:15,pleas:19,point:[3,14],popcount:12,port:3,posit:[13,16,17],possibl:[11,13,15],post:12,pragma:13,preced:16,precid:16,precis:17,precompil:13,precomput:14,prefer:11,prefix:17,prepend:17,pretrain:17,preusser:13,previous:15,print:3,prior:[14,15,17],process:[3,12],produc:[9,11,12,13,17],product:17,project:[4,15],properti:[9,11],provid:[3,11],push:3,pushbutton:3,pynq:[11,15],pynq_driver_dir:15,python:[3,15,17],pytorch:17,pyveril:[11,13,17],pyverilate_get_liveness_threshold_cycl:17,pyverilate_stitched_ip:17,qnn:[3,4],quantiz:[4,9,11,13],random:[14,17],random_str:17,randomli:17,rather:3,reach:14,read:[4,13],read_npy_data:13,readabl:14,real:12,recommend:14,refer:4,referenc:15,reflect:3,regular:12,rel:15,relat:[4,11,17],remot:11,remov:[15,17],remove_by_nam:17,remove_prefix:17,renam:11,rename_tensor:11,repeat:[14,16],repeatedli:11,replac:14,replaceverilogrelpath:15,repo:[3,19],repositori:[3,4],repres:[11,17],represent:17,requir:[11,12,13],research:4,reset:13,reset_rtlsim:13,reshap:13,resourc:[3,10,13],respect:17,result:[9,10,11,14,15,16,17],return_full_exec_context:11,returned_dict:[12,13],reus:13,revers:17,reverse_endian:17,reverse_inn:17,right:13,root:[3,17],round:[16,17],roundandclipthreshold:16,roundup_to_integer_multipl:17,row:13,rtlsim:[11,13,15,17],rtlsim_output_to_npi:17,run:[11,13,15],run_dock:3,same:[15,17],sampl:13,save:[11,13,15,17],save_as_npi:13,scalar:16,scale:12,scp:15,script:[3,13,15,17],second:[15,16],see:[16,17],seen:4,sep:13,separ:[4,12],sequenc:17,server:3,servic:3,set:[3,11,12,13,15,16,17],set_executable_path:17,set_initi:11,set_ipgen_path:17,set_metadata_prop:11,set_nodeattr:12,set_tensor_datatyp:11,set_tensor_shap:11,setexecmod:15,settings64:3,sever:[3,15],shape:[11,12,13,14,17],shell:15,shortli:19,should:[3,9,11,12,13,14,15],sign:[11,14,16,17],sim:[13,17],simd:13,simpli:3,simul:[12,13,15,17],sinc:[11,17],singl:[3,11,13,15,16,17],slide:13,small:9,smaller:11,smallest:11,smee:3,some:[3,4,11,12,13,14,15],someth:3,soon:[0,5,6,7,20,21],sourc:18,spawn:3,specif:4,specifi:[11,14,15,17],split:[15,16,17],stai:4,standard:[11,12,13],stitch:[11,13,15,17],store:[12,15,17],stream:13,streamingdataflowpartit:15,streamingfclayer_batch:15,streamlin:14,string:[9,15,17],stringlength:17,strm_decl:13,structur:9,style:4,sub:14,subdirectori:15,subgraph:11,submodul:18,subsequ:15,subset:9,succes:15,success:[12,15],suitabl:13,summar:13,support:11,sure:3,surviv:17,synaps:13,synthesi:[10,15],synthpynqproject:15,t_0:12,t_1:12,t_n:12,take:[3,9,11,14,16,17,19],taken:[4,11,15],target:[4,15],target_dir:15,targetbit:17,tcl:[13,15,17],tcl_script:17,tempfil:17,temporari:17,tensor:[9,11,12,14,16,17],tensor_fanout:9,tensor_nam:[9,11],tensor_shap:[11,17],tensor_valu:11,termin:[3,15],ternari:11,test:14,text:3,than:[11,12],thei:[8,16],them:[9,15,16],thi:[3,4,7,9,11,12,13,14,15,17,19],thing:4,thought:3,thresh:13,threshold:[12,13,16],through:3,time:[3,13,14,15],tlastmark:15,tmem:13,togeth:[3,15],toggl:13,toggle_clk:13,token:3,tool:[3,4],train:[3,4],transform:[8,11,18],transformed_model:14,travers:9,trigger:3,tune:4,tupl:14,two:[4,11,12,15,16,17],type:[11,13,14,17],ubuntu:3,uint16:11,uint2:[11,17],uint32:11,uint3:11,uint4:11,uint8:[11,17],umuroglu:13,under:[4,15],uniqu:14,unpack:[15,17],unpack_innermost_dim_from_hex_str:17,unsign:[11,16],until:11,untrain:17,updat:[4,16],use:[4,15],used:[4,5,11,12,13,15,17,20,21],useful:11,user:[3,14],usernam:[3,15],using:[11,13,14,15,16,17,19],util:[8,11,12,13,18],val:17,valu:[11,12,13,15,16,17],value_info:11,valueinfo:[11,14],valueinfo_to_tensor:17,valueinfoproto:[11,17],variabl:[3,17],vector:[16,17],verif:9,verifi:[9,12,13,20],verify_nod:[9,12,13],verilog:15,version:4,via:11,visser:13,vivado:[3,4,10,11,15,17],vivado_path:3,vivado_pynq_proj:15,vivado_stitch_proj:15,wai:[3,9],wait:17,want:16,wbit:17,webbrows:3,webhook:3,websit:4,weight:[11,13,17],welcom:4,well:3,when:[3,9,12,13,14],where:[3,11,12,13,15,16],wherea:11,whether:[9,11,12,13,14],which:[3,4,11,12,13,15,16,17],width:[13,17],window:13,without:3,wmem:13,work:[3,6,11,17],workspac:3,wrapper:11,write:[3,12,13,18],xilinx:4,xnor:12,xnorpopcountmatmul:[12,14,15],you:[3,7,14],your:[3,14],zero:[11,13,16,17]},titles:["Brevitas Export","End-to-End Flow","Index","Getting Started","FINN","Internals","Network Preparation","PYNQ Deployment","Source Code","Analysis","Analysis - FPGADataFlow","Core","Custom Op","Custom Op - FPGADataFlow","Transformation","Transformation - FPGADataFlow","Transformation - Streamline","Util","finn","Tutorials","Functional Verification","Vivado HLS and Vivado Synthesis"],titleterms:{"class":[12,13],"export":0,"function":20,HLS:[13,21],absorb:16,analysi:[9,10],base:[12,13],basic:17,batchnorm_to_affin:14,bipolar_to_xnor:14,brevita:0,cleanup:15,code:8,codegen_ipgen:15,codegen_ipstitch:15,codegen_npysim:15,collapse_rep:16,compil:[3,15],convert_to_hls_lay:15,convolutioninputgener:13,core:11,create_dataflow_partit:15,custom:[12,13],custom_op:[12,13],data_pack:17,datatyp:11,deploy:7,develop:3,directli:3,docker:3,end:1,execute_custom_nod:11,experiment:3,finn:[3,4,9,10,11,12,13,14,15,16,17,18],flow:1,fold_const:14,fpgadataflow:[10,13,15,17],gener:14,get:3,guid:14,hls_synth_res_estim:10,hlssynth_ipgen:15,how:[3,9],index:2,infer_datatyp:14,infer_shap:14,insert_tlastmark:15,interact:3,intern:5,jenkin:3,jupyt:3,make_deploy:15,make_pynq_driv:15,make_pynq_proj:15,modelwrapp:11,modul:[8,10,11,17],multithreshold:12,network:6,node:[12,13],notebook:3,onnx:17,onnx_exec:11,pass:[9,10,14],prepar:6,pynq:7,registri:12,remote_exec:11,reorder:16,replace_verilog_relpath:15,requir:3,res_estim:10,round_threshold:16,rtlsim_exec:11,run:3,set_exec_mod:15,shell:3,sign_to_thr:16,sourc:8,start:3,streamingdataflowpartit:12,streamingfclayer_batch:13,streamingmaxpool_batch:13,streamlin:16,submodul:[9,12,14],suit:3,synth_pynq_proj:15,synthesi:21,templat:[13,15],test:[3,17],tlastmark:13,topolog:9,transform:[14,15,16],tutori:19,use:3,using:3,util:17,verif:20,verify_custom_nod:9,vivado:21,what:4,write:[9,14],xnorpopcount:12}}) \ No newline at end of file +Search.setIndex({docnames:["brevitas_export","end_to_end_flow","genindex","getting_started","index","internals","nw_prep","pynq_deploy","source_code/finn","source_code/finn.analysis","source_code/finn.analysis.fpgadataflow","source_code/finn.core","source_code/finn.custom_op","source_code/finn.custom_op.fpgadataflow","source_code/finn.transformation","source_code/finn.transformation.fpgadataflow","source_code/finn.transformation.streamline","source_code/finn.util","source_code/modules","tutorials","verification","vivado_synth"],envversion:{"sphinx.domains.c":1,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":1,"sphinx.domains.index":1,"sphinx.domains.javascript":1,"sphinx.domains.math":2,"sphinx.domains.python":1,"sphinx.domains.rst":1,"sphinx.domains.std":1,sphinx:56},filenames:["brevitas_export.rst","end_to_end_flow.rst","genindex.rst","getting_started.rst","index.rst","internals.rst","nw_prep.rst","pynq_deploy.rst","source_code/finn.rst","source_code/finn.analysis.rst","source_code/finn.analysis.fpgadataflow.rst","source_code/finn.core.rst","source_code/finn.custom_op.rst","source_code/finn.custom_op.fpgadataflow.rst","source_code/finn.transformation.rst","source_code/finn.transformation.fpgadataflow.rst","source_code/finn.transformation.streamline.rst","source_code/finn.util.rst","source_code/modules.rst","tutorials.rst","verification.rst","vivado_synth.rst"],objects:{"finn.analysis":{topology:[9,0,0,"-"],verify_custom_nodes:[9,0,0,"-"]},"finn.analysis.fpgadataflow":{hls_synth_res_estimation:[10,0,0,"-"],res_estimation:[10,0,0,"-"]},"finn.analysis.fpgadataflow.hls_synth_res_estimation":{hls_synth_res_estimation:[10,1,1,""]},"finn.analysis.fpgadataflow.res_estimation":{res_estimation:[10,1,1,""]},"finn.analysis.topology":{all_tensors_f32:[9,1,1,""],get_per_tensor_fanouts:[9,1,1,""],is_linear:[9,1,1,""],node_inputs_in_expected_order:[9,1,1,""]},"finn.analysis.verify_custom_nodes":{verify_nodes:[9,1,1,""]},"finn.core":{datatype:[11,0,0,"-"],execute_custom_node:[11,0,0,"-"],modelwrapper:[11,0,0,"-"],onnx_exec:[11,0,0,"-"],remote_exec:[11,0,0,"-"],rtlsim_exec:[11,0,0,"-"]},"finn.core.datatype":{DataType:[11,2,1,""]},"finn.core.datatype.DataType":{BINARY:[11,3,1,""],BIPOLAR:[11,3,1,""],FLOAT32:[11,3,1,""],INT16:[11,3,1,""],INT2:[11,3,1,""],INT32:[11,3,1,""],INT3:[11,3,1,""],INT4:[11,3,1,""],INT8:[11,3,1,""],TERNARY:[11,3,1,""],UINT16:[11,3,1,""],UINT2:[11,3,1,""],UINT32:[11,3,1,""],UINT3:[11,3,1,""],UINT4:[11,3,1,""],UINT8:[11,3,1,""],allowed:[11,4,1,""],bitwidth:[11,4,1,""],get_hls_datatype_str:[11,4,1,""],get_num_possible_values:[11,4,1,""],get_smallest_possible:[11,4,1,""],is_integer:[11,4,1,""],max:[11,4,1,""],min:[11,4,1,""],signed:[11,4,1,""]},"finn.core.execute_custom_node":{execute_custom_node:[11,1,1,""]},"finn.core.modelwrapper":{ModelWrapper:[11,2,1,""]},"finn.core.modelwrapper.ModelWrapper":{analysis:[11,4,1,""],check_all_tensor_shapes_specified:[11,4,1,""],check_compatibility:[11,4,1,""],find_consumer:[11,4,1,""],find_producer:[11,4,1,""],get_all_tensor_names:[11,4,1,""],get_initializer:[11,4,1,""],get_metadata_prop:[11,4,1,""],get_tensor_datatype:[11,4,1,""],get_tensor_fanout:[11,4,1,""],get_tensor_shape:[11,4,1,""],get_tensor_valueinfo:[11,4,1,""],graph:[11,4,1,""],make_empty_exec_context:[11,4,1,""],make_new_valueinfo_name:[11,4,1,""],model:[11,4,1,""],rename_tensor:[11,4,1,""],save:[11,4,1,""],set_initializer:[11,4,1,""],set_metadata_prop:[11,4,1,""],set_tensor_datatype:[11,4,1,""],set_tensor_shape:[11,4,1,""],transform:[11,4,1,""]},"finn.core.onnx_exec":{compare_execution:[11,1,1,""],execute_node:[11,1,1,""],execute_onnx:[11,1,1,""],execute_onnx_and_make_model:[11,1,1,""]},"finn.core.remote_exec":{remote_exec:[11,1,1,""]},"finn.core.rtlsim_exec":{rtlsim_exec:[11,1,1,""]},"finn.custom_op":{CustomOp:[12,2,1,""],fpgadataflow:[13,0,0,"-"],multithreshold:[12,0,0,"-"],registry:[12,0,0,"-"],streamingdataflowpartition:[12,0,0,"-"],xnorpopcount:[12,0,0,"-"]},"finn.custom_op.CustomOp":{execute_node:[12,4,1,""],get_nodeattr:[12,4,1,""],get_nodeattr_types:[12,4,1,""],infer_node_datatype:[12,4,1,""],make_shape_compatible_op:[12,4,1,""],set_nodeattr:[12,4,1,""],verify_node:[12,4,1,""]},"finn.custom_op.fpgadataflow":{HLSCustomOp:[13,2,1,""],convolutioninputgenerator:[13,0,0,"-"],streamingfclayer_batch:[13,0,0,"-"],streamingmaxpool_batch:[13,0,0,"-"],templates:[13,0,0,"-"],tlastmarker:[13,0,0,"-"]},"finn.custom_op.fpgadataflow.HLSCustomOp":{blackboxfunction:[13,4,1,""],bram_estimation:[13,4,1,""],code_generation_ipgen:[13,4,1,""],code_generation_npysim:[13,4,1,""],compile_singlenode_code:[13,4,1,""],dataoutstrm:[13,4,1,""],defines:[13,4,1,""],docompute:[13,4,1,""],dynamic_input_to_npy:[13,4,1,""],exec_precompiled_singlenode_model:[13,4,1,""],execute_node:[13,4,1,""],generate_params:[13,4,1,""],get_folded_input_shape:[13,4,1,""],get_folded_output_shape:[13,4,1,""],get_instream_width:[13,4,1,""],get_nodeattr_types:[13,4,1,""],get_number_output_values:[13,4,1,""],get_outstream_width:[13,4,1,""],global_includes:[13,4,1,""],ipgen_singlenode_code:[13,4,1,""],lut_estimation:[13,4,1,""],node_res_estimation:[13,4,1,""],npy_to_dynamic_output:[13,4,1,""],pragmas:[13,4,1,""],read_npy_data:[13,4,1,""],reset_rtlsim:[13,4,1,""],rtlsim:[13,4,1,""],save_as_npy:[13,4,1,""],strm_decl:[13,4,1,""],toggle_clk:[13,4,1,""]},"finn.custom_op.fpgadataflow.convolutioninputgenerator":{ConvolutionInputGenerator:[13,2,1,""]},"finn.custom_op.fpgadataflow.convolutioninputgenerator.ConvolutionInputGenerator":{blackboxfunction:[13,4,1,""],bram_estimation:[13,4,1,""],dataoutstrm:[13,4,1,""],defines:[13,4,1,""],docompute:[13,4,1,""],execute_node:[13,4,1,""],get_input_datatype:[13,4,1,""],get_nodeattr_types:[13,4,1,""],get_number_output_values:[13,4,1,""],get_output_datatype:[13,4,1,""],get_stream_width:[13,4,1,""],global_includes:[13,4,1,""],infer_node_datatype:[13,4,1,""],lut_estimation:[13,4,1,""],make_shape_compatible_op:[13,4,1,""],pragmas:[13,4,1,""],read_npy_data:[13,4,1,""],save_as_npy:[13,4,1,""],strm_decl:[13,4,1,""],verify_node:[13,4,1,""]},"finn.custom_op.fpgadataflow.streamingfclayer_batch":{StreamingFCLayer_Batch:[13,2,1,""]},"finn.custom_op.fpgadataflow.streamingfclayer_batch.StreamingFCLayer_Batch":{blackboxfunction:[13,4,1,""],bram_estimation:[13,4,1,""],calc_tmem:[13,4,1,""],calc_wmem:[13,4,1,""],dataoutstrm:[13,4,1,""],defines:[13,4,1,""],docompute:[13,4,1,""],execute_node:[13,4,1,""],generate_params:[13,4,1,""],get_folded_input_shape:[13,4,1,""],get_folded_output_shape:[13,4,1,""],get_hls_compatible_threshold_tensor:[13,4,1,""],get_hls_compatible_weight_tensor:[13,4,1,""],get_input_datatype:[13,4,1,""],get_instream_width:[13,4,1,""],get_nodeattr_types:[13,4,1,""],get_number_output_values:[13,4,1,""],get_output_datatype:[13,4,1,""],get_outstream_width:[13,4,1,""],get_template_param_values:[13,4,1,""],get_weight_datatype:[13,4,1,""],global_includes:[13,4,1,""],infer_node_datatype:[13,4,1,""],lut_estimation:[13,4,1,""],make_shape_compatible_op:[13,4,1,""],pragmas:[13,4,1,""],read_npy_data:[13,4,1,""],save_as_npy:[13,4,1,""],strm_decl:[13,4,1,""],verify_node:[13,4,1,""]},"finn.custom_op.fpgadataflow.streamingmaxpool_batch":{StreamingMaxPool_Batch:[13,2,1,""]},"finn.custom_op.fpgadataflow.streamingmaxpool_batch.StreamingMaxPool_Batch":{blackboxfunction:[13,4,1,""],bram_estimation:[13,4,1,""],dataoutstrm:[13,4,1,""],defines:[13,4,1,""],docompute:[13,4,1,""],get_nodeattr_types:[13,4,1,""],get_number_output_values:[13,4,1,""],global_includes:[13,4,1,""],infer_node_datatype:[13,4,1,""],lut_estimation:[13,4,1,""],make_shape_compatible_op:[13,4,1,""],pragmas:[13,4,1,""],read_npy_data:[13,4,1,""],save_as_npy:[13,4,1,""],strm_decl:[13,4,1,""],verify_node:[13,4,1,""]},"finn.custom_op.fpgadataflow.tlastmarker":{TLastMarker:[13,2,1,""]},"finn.custom_op.fpgadataflow.tlastmarker.TLastMarker":{blackboxfunction:[13,4,1,""],dataoutstrm:[13,4,1,""],defines:[13,4,1,""],docompute:[13,4,1,""],execute_node:[13,4,1,""],get_folded_input_shape:[13,4,1,""],get_folded_output_shape:[13,4,1,""],get_instream_width:[13,4,1,""],get_nodeattr_types:[13,4,1,""],get_number_output_values:[13,4,1,""],get_outstream_width:[13,4,1,""],global_includes:[13,4,1,""],infer_node_datatype:[13,4,1,""],make_shape_compatible_op:[13,4,1,""],pragmas:[13,4,1,""],read_npy_data:[13,4,1,""],save_as_npy:[13,4,1,""],strm_decl:[13,4,1,""],verify_node:[13,4,1,""]},"finn.custom_op.multithreshold":{MultiThreshold:[12,2,1,""],compare:[12,1,1,""],multithreshold:[12,1,1,""]},"finn.custom_op.multithreshold.MultiThreshold":{execute_node:[12,4,1,""],get_nodeattr_types:[12,4,1,""],infer_node_datatype:[12,4,1,""],make_shape_compatible_op:[12,4,1,""],verify_node:[12,4,1,""]},"finn.custom_op.registry":{getCustomOp:[12,1,1,""]},"finn.custom_op.streamingdataflowpartition":{StreamingDataflowPartition:[12,2,1,""]},"finn.custom_op.streamingdataflowpartition.StreamingDataflowPartition":{execute_node:[12,4,1,""],get_nodeattr_types:[12,4,1,""],infer_node_datatype:[12,4,1,""],make_shape_compatible_op:[12,4,1,""],verify_node:[12,4,1,""]},"finn.custom_op.xnorpopcount":{XnorPopcountMatMul:[12,2,1,""],xnorpopcountmatmul:[12,1,1,""]},"finn.custom_op.xnorpopcount.XnorPopcountMatMul":{execute_node:[12,4,1,""],get_nodeattr_types:[12,4,1,""],infer_node_datatype:[12,4,1,""],make_shape_compatible_op:[12,4,1,""],verify_node:[12,4,1,""]},"finn.transformation":{batchnorm_to_affine:[14,0,0,"-"],bipolar_to_xnor:[14,0,0,"-"],fold_constants:[14,0,0,"-"],general:[14,0,0,"-"],infer_datatypes:[14,0,0,"-"],infer_shapes:[14,0,0,"-"],streamline:[16,0,0,"-"]},"finn.transformation.batchnorm_to_affine":{BatchNormToAffine:[14,2,1,""]},"finn.transformation.batchnorm_to_affine.BatchNormToAffine":{apply:[14,4,1,""]},"finn.transformation.bipolar_to_xnor":{ConvertBipolarMatMulToXnorPopcount:[14,2,1,""]},"finn.transformation.bipolar_to_xnor.ConvertBipolarMatMulToXnorPopcount":{apply:[14,4,1,""]},"finn.transformation.fold_constants":{FoldConstants:[14,2,1,""]},"finn.transformation.fold_constants.FoldConstants":{apply:[14,4,1,""]},"finn.transformation.fpgadataflow":{cleanup:[15,0,0,"-"],codegen_ipgen:[15,0,0,"-"],codegen_ipstitch:[15,0,0,"-"],codegen_npysim:[15,0,0,"-"],compile:[15,0,0,"-"],convert_to_hls_layers:[15,0,0,"-"],create_dataflow_partition:[15,0,0,"-"],hlssynth_ipgen:[15,0,0,"-"],insert_tlastmarker:[15,0,0,"-"],make_deployment:[15,0,0,"-"],make_pynq_driver:[15,0,0,"-"],make_pynq_proj:[15,0,0,"-"],replace_verilog_relpaths:[15,0,0,"-"],set_exec_mode:[15,0,0,"-"],synth_pynq_proj:[15,0,0,"-"],templates:[15,0,0,"-"]},"finn.transformation.fpgadataflow.cleanup":{CleanUp:[15,2,1,""]},"finn.transformation.fpgadataflow.cleanup.CleanUp":{apply:[15,4,1,""]},"finn.transformation.fpgadataflow.codegen_ipgen":{CodeGen_ipgen:[15,2,1,""]},"finn.transformation.fpgadataflow.codegen_ipgen.CodeGen_ipgen":{apply:[15,4,1,""]},"finn.transformation.fpgadataflow.codegen_ipstitch":{CodeGen_ipstitch:[15,2,1,""]},"finn.transformation.fpgadataflow.codegen_ipstitch.CodeGen_ipstitch":{apply:[15,4,1,""]},"finn.transformation.fpgadataflow.codegen_npysim":{CodeGen_npysim:[15,2,1,""]},"finn.transformation.fpgadataflow.codegen_npysim.CodeGen_npysim":{apply:[15,4,1,""]},"finn.transformation.fpgadataflow.compile":{Compile:[15,2,1,""]},"finn.transformation.fpgadataflow.compile.Compile":{apply:[15,4,1,""]},"finn.transformation.fpgadataflow.convert_to_hls_layers":{InferBinaryStreamingFCLayer:[15,2,1,""]},"finn.transformation.fpgadataflow.convert_to_hls_layers.InferBinaryStreamingFCLayer":{apply:[15,4,1,""]},"finn.transformation.fpgadataflow.create_dataflow_partition":{CreateDataflowPartition:[15,2,1,""]},"finn.transformation.fpgadataflow.create_dataflow_partition.CreateDataflowPartition":{apply:[15,4,1,""]},"finn.transformation.fpgadataflow.hlssynth_ipgen":{HLSSynth_IPGen:[15,2,1,""]},"finn.transformation.fpgadataflow.hlssynth_ipgen.HLSSynth_IPGen":{apply:[15,4,1,""]},"finn.transformation.fpgadataflow.insert_tlastmarker":{InsertTLastMarker:[15,2,1,""]},"finn.transformation.fpgadataflow.insert_tlastmarker.InsertTLastMarker":{apply:[15,4,1,""]},"finn.transformation.fpgadataflow.make_deployment":{DeployToPYNQ:[15,2,1,""]},"finn.transformation.fpgadataflow.make_deployment.DeployToPYNQ":{apply:[15,4,1,""]},"finn.transformation.fpgadataflow.make_pynq_driver":{MakePYNQDriver:[15,2,1,""]},"finn.transformation.fpgadataflow.make_pynq_driver.MakePYNQDriver":{apply:[15,4,1,""]},"finn.transformation.fpgadataflow.make_pynq_proj":{MakePYNQProject:[15,2,1,""]},"finn.transformation.fpgadataflow.make_pynq_proj.MakePYNQProject":{apply:[15,4,1,""]},"finn.transformation.fpgadataflow.replace_verilog_relpaths":{ReplaceVerilogRelPaths:[15,2,1,""]},"finn.transformation.fpgadataflow.replace_verilog_relpaths.ReplaceVerilogRelPaths":{apply:[15,4,1,""]},"finn.transformation.fpgadataflow.set_exec_mode":{SetExecMode:[15,2,1,""]},"finn.transformation.fpgadataflow.set_exec_mode.SetExecMode":{apply:[15,4,1,""]},"finn.transformation.fpgadataflow.synth_pynq_proj":{SynthPYNQProject:[15,2,1,""]},"finn.transformation.fpgadataflow.synth_pynq_proj.SynthPYNQProject":{apply:[15,4,1,""]},"finn.transformation.general":{ConvertSubToAdd:[14,2,1,""],GiveRandomTensorNames:[14,2,1,""],GiveReadableTensorNames:[14,2,1,""],GiveUniqueNodeNames:[14,2,1,""]},"finn.transformation.general.ConvertSubToAdd":{apply:[14,4,1,""]},"finn.transformation.general.GiveRandomTensorNames":{apply:[14,4,1,""]},"finn.transformation.general.GiveReadableTensorNames":{apply:[14,4,1,""]},"finn.transformation.general.GiveUniqueNodeNames":{apply:[14,4,1,""]},"finn.transformation.infer_datatypes":{InferDataTypes:[14,2,1,""]},"finn.transformation.infer_datatypes.InferDataTypes":{apply:[14,4,1,""]},"finn.transformation.infer_shapes":{InferShapes:[14,2,1,""]},"finn.transformation.infer_shapes.InferShapes":{apply:[14,4,1,""]},"finn.transformation.streamline":{Streamline:[16,2,1,""],absorb:[16,0,0,"-"],collapse_repeated:[16,0,0,"-"],reorder:[16,0,0,"-"],round_thresholds:[16,0,0,"-"],sign_to_thres:[16,0,0,"-"]},"finn.transformation.streamline.Streamline":{apply:[16,4,1,""]},"finn.transformation.streamline.absorb":{Absorb1BitMulIntoMatMul:[16,2,1,""],AbsorbAddIntoMultiThreshold:[16,2,1,""],AbsorbMulIntoMultiThreshold:[16,2,1,""],FactorOutMulSignMagnitude:[16,2,1,""]},"finn.transformation.streamline.absorb.Absorb1BitMulIntoMatMul":{apply:[16,4,1,""]},"finn.transformation.streamline.absorb.AbsorbAddIntoMultiThreshold":{apply:[16,4,1,""]},"finn.transformation.streamline.absorb.AbsorbMulIntoMultiThreshold":{apply:[16,4,1,""]},"finn.transformation.streamline.absorb.FactorOutMulSignMagnitude":{apply:[16,4,1,""]},"finn.transformation.streamline.collapse_repeated":{CollapseRepeatedAdd:[16,2,1,""],CollapseRepeatedMul:[16,2,1,""],CollapseRepeatedOp:[16,2,1,""]},"finn.transformation.streamline.collapse_repeated.CollapseRepeatedOp":{apply:[16,4,1,""]},"finn.transformation.streamline.reorder":{MoveAddPastMul:[16,2,1,""],MoveScalarAddPastMatMul:[16,2,1,""],MoveScalarMulPastMatMul:[16,2,1,""]},"finn.transformation.streamline.reorder.MoveAddPastMul":{apply:[16,4,1,""]},"finn.transformation.streamline.reorder.MoveScalarAddPastMatMul":{apply:[16,4,1,""]},"finn.transformation.streamline.reorder.MoveScalarMulPastMatMul":{apply:[16,4,1,""]},"finn.transformation.streamline.round_thresholds":{RoundAndClipThresholds:[16,2,1,""]},"finn.transformation.streamline.round_thresholds.RoundAndClipThresholds":{apply:[16,4,1,""]},"finn.transformation.streamline.sign_to_thres":{ConvertSignToThres:[16,2,1,""]},"finn.transformation.streamline.sign_to_thres.ConvertSignToThres":{apply:[16,4,1,""]},"finn.util":{basic:[17,0,0,"-"],data_packing:[17,0,0,"-"],fpgadataflow:[17,0,0,"-"],onnx:[17,0,0,"-"],test:[17,0,0,"-"]},"finn.util.basic":{CppBuilder:[17,2,1,""],calculate_signed_dot_prod_range:[17,1,1,""],gen_finn_dt_tensor:[17,1,1,""],get_by_name:[17,1,1,""],get_finn_root:[17,1,1,""],interleave_matrix_outer_dim_from_partitions:[17,1,1,""],make_build_dir:[17,1,1,""],pad_tensor_to_multiple_of:[17,1,1,""],random_string:[17,1,1,""],remove_by_name:[17,1,1,""],roundup_to_integer_multiple:[17,1,1,""]},"finn.util.basic.CppBuilder":{append_includes:[17,4,1,""],append_sources:[17,4,1,""],build:[17,4,1,""],set_executable_path:[17,4,1,""]},"finn.util.data_packing":{array2hexstring:[17,1,1,""],finnpy_to_packed_bytearray:[17,1,1,""],hexstring2npbytearray:[17,1,1,""],npbytearray2hexstring:[17,1,1,""],npy_to_rtlsim_input:[17,1,1,""],numpy_to_hls_code:[17,1,1,""],pack_innermost_dim_as_hex_string:[17,1,1,""],packed_bytearray_to_finnpy:[17,1,1,""],rtlsim_output_to_npy:[17,1,1,""],unpack_innermost_dim_from_hex_string:[17,1,1,""]},"finn.util.fpgadataflow":{IPGenBuilder:[17,2,1,""],pyverilate_get_liveness_threshold_cycles:[17,1,1,""],pyverilate_stitched_ip:[17,1,1,""]},"finn.util.fpgadataflow.IPGenBuilder":{append_tcl:[17,4,1,""],build:[17,4,1,""],set_ipgen_path:[17,4,1,""]},"finn.util.onnx":{valueinfo_to_tensor:[17,1,1,""]},"finn.util.test":{get_test_model_def_fxn:[17,1,1,""],get_test_model_trained:[17,1,1,""],get_test_model_untrained:[17,1,1,""],get_trained_checkpoint:[17,1,1,""]},finn:{custom_op:[12,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","function","Python function"],"2":["py","class","Python class"],"3":["py","attribute","Python attribute"],"4":["py","method","Python method"]},objtypes:{"0":"py:module","1":"py:function","2":"py:class","3":"py:attribute","4":"py:method"},terms:{"0f01":17,"0x07":17,"0x0e":17,"0x0f01":17,"0xb":17,"0xe":17,"abstract":[12,13],"boolean":11,"class":[11,14,15,16,17],"const":14,"default":[12,13],"enum":11,"final":11,"float":17,"function":[3,11,12,13,17],"import":3,"int":15,"new":[3,4,11,12,13],"return":[9,10,11,12,13,16,17],"static":9,"throw":17,"true":[11,17],"try":3,"var":13,For:[15,16],HLS:[4,11,12,15,17],IPs:15,PEs:13,The:[3,4,8,11,12,15,16,17],There:3,Use:[11,17],abc:12,abit:17,abort:13,about:[4,7,9,15],abov:3,absolut:15,absorb1bitmulintomatmul:16,absorb:15,absorbaddintomultithreshold:16,absorbmulintomultithreshold:16,acceler:[3,15],access:3,accord:[13,17],account:11,action:15,activ:[11,17],add:[14,16,17],added:13,adder:16,adding:3,addit:[3,13,15],addition:16,address:15,admin:3,after:[13,17],aim:16,all:[3,9,11,12,13,14,15,17],all_tensors_f32:9,allow:11,alreadi:[15,19],also:[3,12,13,15],amount:17,analysi:[8,11,18],analysis_fxn:11,anaylsis_fxn:11,ani:[3,11,12,14,15,17],annot:[9,11,12,13],anoth:15,append_includ:17,append_sourc:17,append_tcl:17,appli:[11,14,15,16],appropri:[3,14],arbitrari:17,architectur:4,argument:[3,15,17],around:11,arrai:17,array2hexstr:17,arxiv:16,assign:11,associ:[11,14],assum:17,attribut:[9,12,13,15],attribute_nam:[12,13],attributeproto:[12,13],avail:19,back:[3,13],backend:15,base:[11,14,15,16,17],bash:[13,17],basic:13,batchnorm:14,batchnormtoaffin:14,been:[12,15],befor:17,below:8,between:[13,17],bias:12,binari:[11,13,15,16,17],bipolar:[11,12,13,14,16,17],bit:[11,17],bitfil:[3,12],bitwidth:11,blackbock:13,blackboxfunct:13,block:[13,15,17],blott:13,board:[11,15],bool:9,both:17,bram:13,bram_estim:13,brevita:[4,17],brien:13,browser:3,build:[13,17],built:9,calc_tmem:13,calc_wmem:13,calcul:13,calculate_signed_dot_prod_rang:17,call:[3,11,13,15],can:[3,4,7,11,13,15,16,17],centerpiec:4,chang:[3,11],check:[9,11,12,13],check_all_tensor_shapes_specifi:11,check_compat:11,client:3,clk:[13,15],clock:13,clone:[3,17],code:[13,15,17,18],code_gen_dir:17,code_gen_dir_ipgen:15,code_gen_dir_npysim:15,code_generation_ipgen:13,code_generation_npysim:13,collaps:16,collapserepeatedadd:16,collapserepeatedmul:16,collapserepeatedop:16,collect:[3,15],colloqui:4,come:[3,9],command:[3,13,17],commun:4,compar:[11,12],compare_execut:11,compare_fxn:11,comparison:12,compat:[11,12,13],compil:[4,13,17],compile_singlenode_cod:13,complet:3,compon:4,comput:[3,11,13],configur:3,consecut:16,constant:[9,11,16],construct:4,consum:11,contain:[3,4,11,12,13,15,17],context:[11,12,13],contribut:4,convert:[3,13,14,15,16,17],convertbipolarmatmultoxnorpopcount:14,convertsigntothr:16,convertsubtoadd:14,copi:[11,15],core:[8,15,18],correct:[14,17],correctli:[3,9,12,13,15],correspond:[4,11,12,13],count:13,cpp_file:17,cppbuilder:[13,17],creat:[3,11,15,17],createdataflowpartit:15,current:[4,11,13],custom:[3,4,8,9,11,15,18],customop:[12,13],cycl:[13,17],data:[11,12,13,15,17],dataflow:[4,11,15],dataoutstrm:13,datatyp:[12,13,14,17],debug:11,declar:13,deep:[4,11,13],default_v:[12,13],default_valu:[12,13],defin:13,deliveri:3,depend:3,deploi:3,deploy:15,deploytopynq:15,descript:[0,6,20,21],design:[3,15],detail:[0,4,6,7,20,21],develop:4,dict:[11,12,13],dictionari:[9,11,13],differ:[3,8,12,13],digit:17,dimens:17,dimension:17,dir:[15,17],directli:4,directori:[3,15,17],distr_pad:17,divid:8,divis:17,doc:4,docker:17,dockerfil:3,docomput:13,doe:[3,11,12],done:9,dot:17,down:[3,11],driver:15,dt_a:17,dt_b:17,dtype:[9,11,12,13,17],dynam:9,dynamic_input_to_npi:13,each:[4,9,11,14,15,16,17],editor:3,either:3,element:17,embed:11,emit:17,emphasi:4,empti:11,end:13,ensur:[13,14,15,17],entir:3,entri:17,enumer:14,environ:3,equal:[12,13],equival:16,estim:[10,13],evenli:17,event:3,everi:[3,12,13,14,15],everyth:3,exampl:[3,17],excel:3,except:17,exec_mod:15,exec_precompiled_singlenode_model:13,execut:[11,12,13,15,17],executable_path:[15,17],execute_nod:[11,12,13],execute_onnx:[11,15],execute_onnx_and_make_model:11,execution_context:11,exist:[12,13,17],exit:17,expect:[9,11,12,13,15],experi:4,experiment:4,explor:[4,11,13],expos:11,extens:3,extra:[3,9,17],extract:10,f5c6bd32ae93ec103a88152214baedff4ce1850d81065bfc:3,factor:17,factoroutmulsignmagnitud:16,fals:[11,17],familiar:3,fan:9,fast:13,feel:19,fewer:11,fewest:11,field:[15,17],file:[3,11,13,15,17],filenam:[11,15],fill:[12,13],find:[7,11],find_consum:11,find_produc:11,finish:17,finn:[0,6,7,8,19,20,21],finn_dt:17,finnpy_to_packed_bytearrai:17,first:[9,16],fix:17,flatten:17,float32:[9,11],fold:13,foldconst:14,folder:[3,15,17],follow:[3,4,9,11,12,15],form:13,format:13,forward:3,found:[4,15],four:17,fpga:[3,4],fpgadataflow:[9,12,14],fpgapart:[13,15],framework:[4,13],fraser:13,free:19,from:[3,4,10,11,13,15,17],full:11,gambardella:13,gen_finn_dt_tensor:17,gener:[4,13,15,17],generate_param:13,get:[11,12,13,15],get_all_tensor_nam:11,get_by_nam:17,get_finn_root:17,get_folded_input_shap:13,get_folded_output_shap:13,get_hls_compatible_threshold_tensor:13,get_hls_compatible_weight_tensor:13,get_hls_datatype_str:11,get_initi:11,get_input_datatyp:13,get_instream_width:13,get_metadata_prop:11,get_nodeattr:12,get_nodeattr_typ:[12,13],get_num_possible_valu:11,get_number_output_valu:13,get_output_datatyp:13,get_outstream_width:13,get_per_tensor_fanout:9,get_smallest_poss:11,get_stream_width:13,get_template_param_valu:13,get_tensor_datatyp:11,get_tensor_fanout:11,get_tensor_shap:11,get_tensor_valueinfo:11,get_test_model_def_fxn:17,get_test_model_train:17,get_test_model_untrain:17,get_trained_checkpoint:17,get_weight_datatyp:13,getcustomop:12,github:[3,4],give:[3,14,16],give_unique_node_nam:14,given:[9,10,11,12,13,17],giverandomtensornam:14,givereadabletensornam:14,giveuniquenodenam:14,global:13,global_includ:13,graph:[9,11,12,13,14,15],graphic:4,greater:12,group:12,guarante:17,guid:19,hand:4,happen:3,has:[3,9,11,13,14,15,17],have:[3,9,11,12,13,15,16],help:3,helper:12,here:[0,5,6,20,21],hex:17,hexstr:17,hexstring2npbytearrai:17,high:3,highli:4,hls:13,hls_var_nam:17,hlscustomop:13,hlslib:[4,13],homepag:4,host:[3,17],how:[6,17,21],http:3,human:14,imag:13,immedi:15,implement:[11,13,15],includ:[4,11,13,15],include_path:17,indic:[11,12,13,15],infer:[3,4,11,12,13,14,17],infer_node_datatyp:[12,13],inferbinarystreamingfclay:15,inferdatatyp:14,infershap:14,info:[14,17],info_messag:9,inform:15,infrastructur:15,initi:[3,9,11],innermost:17,inp0:12,inp1:12,inp:13,input:[9,11,12,13,14,16,17],input_dict:11,input_dtyp:17,input_fil:17,insert:[13,15,17],inserttlastmark:15,insid:[3,12],instal:3,instanc:[11,12,16],instant:17,instanti:15,instead:17,int16:11,int2:11,int32:11,int3:11,int4:11,int8:11,integ:[11,12,16,17],interest:11,interfac:15,interleav:[13,17],interleave_matrix_outer_dim_from_partit:17,intermedi:[11,14],intern:14,interv:12,involv:3,ipgen:13,ipgen_path:[15,17],ipgen_singlenode_cod:13,ipgenbuild:[13,17],is_integ:11,is_linear:9,item:17,its:12,itself:12,jupyt:[4,19],kei:11,kind:15,lab:4,lambda:11,largest:11,launch:3,layer:[14,15],lead:17,learn:[4,13],leeser:13,len:17,letter:17,librari:[4,17],library_path:17,like:3,linear:[9,11],link:[3,4,19],list:[8,9,11,17],load:17,locat:3,look:[3,4,9,19],loop:13,lut:13,lut_estim:13,made:11,magnitud:16,mai:3,make:[3,13,15],make_build_dir:17,make_collapsed_param_fxn:16,make_deepcopi:11,make_empty_exec_context:11,make_new_valueinfo_nam:11,make_project:15,make_shape_compatible_op:[12,13],makepynqdriv:15,makepynqproject:15,mani:3,manipul:11,map:12,mark:13,matmul:[14,16],matrix:[12,13,16,17],max:[11,17],mean:17,member:[12,13,17],meta:12,metadata:11,metadata_prop:[11,15],method:[12,13,20],min:[11,17],minimum:17,minut:15,mixtur:9,mkdtemp:17,mode:[3,15],model:[9,10,11,12,13,14,15,16,17,20],model_a:11,model_b:11,modelproto:[11,15],modul:18,modular:4,more:[4,7,11,14,17],mount:3,move:16,moveaddpastmul:16,movescalaraddpastmatmul:16,movescalarmulpastmatmul:16,mul:[14,16],multidimension:17,multipl:[12,16,17],multipli:16,multithreshold:[15,16],must:[12,15,16,17],mvtu:15,n_partit:17,n_thres_step:13,name:[10,11,12,14,17],name_field:17,ndarrai:17,nearest:[16,17],necessari:15,need:[10,12,13],neg:[11,16],netnam:17,netron:3,network:[3,4,13,17],neural:[4,13],neuron:13,new_nam:11,next:16,no_decl:17,node:[9,10,11,14,15,16,18],node_inputs_in_expected_ord:9,node_res_estim:13,non:15,none:[11,12,17],note:[3,12],notebook:[4,19],notwithstand:9,now:[9,11],npbytearrai:17,npbytearray2hexstr:17,npy:[13,17],npy_to_dynamic_output:13,npy_to_rtlsim_input:17,npysim:[13,15],number:[11,12,13,17],numpi:[13,17],numpy_to_hls_cod:17,object:[11,17],observ:13,old_nam:11,onc:13,one:[9,11,13,15,17],ones:[3,15],onli:[9,11,14,15,16],onlin:3,onnx:[11,12,13,15],onnx_exec:15,onnx_model_proto:11,onnx_nod:[12,13],onnxruntim:11,op_nam:16,op_typ:9,open:3,oper:[11,16],ops:[9,13,16],option:3,order:[9,11],orig_thres_matrix:13,orig_weight_matrix:13,origin:13,other:[11,16],otherwis:[3,11,12,17],out:[9,12,13],out_bia:12,out_scal:12,out_shap:17,outcom:15,outermost:17,output:[11,12,13,14,17],output_shap:17,overlai:15,overview:[4,5],own:[3,12],pack:[15,17],pack_innermost_dim:17,pack_innermost_dim_as_hex_str:17,packag:15,packed_bytearrai:17,packed_bytearray_to_finnpi:17,packedbit:17,pad:17,pad_tensor_to_multiple_of:17,pad_to_dim:17,pad_to_nbit:17,page:[7,19],pair:15,param:13,paramet:[13,16,17],part:[12,13,17],particular:[12,13,17],partit:[11,17],pass:[13,17,18],password:[3,15],past:16,path:[13,15,17],payload:3,per:15,perform:[3,12,13],permit:[12,13],place:[13,15],placehold:12,platform:15,pleas:19,point:3,popcount:12,port:3,posit:[13,16,17],possibl:[11,13,15],post:12,pragma:13,preced:16,precid:16,precis:17,precompil:13,precomput:14,prefer:11,prefix:17,prepend:17,pretrain:17,preusser:13,previous:15,print:3,prior:[14,15,17],process:[3,12],produc:[11,12,13,17],product:17,project:[4,15],properti:11,provid:[3,11],push:3,pushbutton:3,pynq:[11,15],pynq_driver_dir:15,python:[3,15,17],pytorch:17,pyveril:[11,13,17],pyverilate_get_liveness_threshold_cycl:17,pyverilate_stitched_ip:17,qnn:[3,4],quantiz:[4,9,11,13],random:[14,17],random_str:17,randomli:17,rather:3,read:[4,13],read_npy_data:13,readabl:14,real:12,recommend:14,refer:4,referenc:15,reflect:3,regular:12,rel:15,relat:[4,11,17],remot:11,remov:[15,17],remove_by_nam:17,remove_prefix:17,renam:11,rename_tensor:11,repeat:16,repeatedli:11,replac:14,replaceverilogrelpath:15,repo:[3,19],repositori:[3,4],repres:[11,17],represent:17,requir:[11,12,13],research:4,reset:13,reset_rtlsim:13,reshap:13,resourc:[3,10,13],respect:17,result:[9,10,11,14,15,16,17],return_full_exec_context:11,returned_dict:[12,13],reus:13,revers:17,reverse_endian:17,reverse_inn:17,right:13,root:[3,17],round:[16,17],roundandclipthreshold:16,roundup_to_integer_multipl:17,row:13,rtlsim:[11,13,15,17],rtlsim_output_to_npi:17,run:[11,13,15],run_dock:3,same:[15,17],sampl:13,save:[11,13,15,17],save_as_npi:13,scalar:16,scale:12,scp:15,script:[3,13,15,17],second:[15,16],see:[16,17],seen:4,sep:13,separ:[4,12],sequenc:17,server:3,servic:3,set:[3,11,12,13,15,16,17],set_executable_path:17,set_initi:11,set_ipgen_path:17,set_metadata_prop:11,set_nodeattr:12,set_tensor_datatyp:11,set_tensor_shap:11,setexecmod:15,settings64:3,sever:[3,15],shape:[11,12,13,14,17],shell:15,shortli:19,should:[3,9,11,12,13,15],sign:[11,14,16,17],sim:[13,17],simd:13,simpli:3,simul:[12,13,15,17],sinc:[11,17],singl:[3,11,13,15,16,17],slide:13,small:9,smaller:11,smallest:11,smee:3,some:[3,4,11,12,13,15],someth:3,soon:[0,5,6,7,20,21],sourc:18,spawn:3,specif:4,specifi:[11,14,15,17],split:[15,16,17],stai:4,standard:[11,12,13],stitch:[11,13,15,17],store:[12,15,17],stream:13,streamingdataflowpartit:15,streamingfclayer_batch:15,streamlin:14,string:[9,15,17],stringlength:17,strm_decl:13,style:4,sub:14,subdirectori:15,subgraph:11,submodul:18,subsequ:15,subset:9,succes:15,success:[12,15],suitabl:13,summar:13,support:11,sure:3,surviv:17,synaps:13,synthesi:[10,15],synthpynqproject:15,t_0:12,t_1:12,t_n:12,take:[3,11,16,17,19],taken:[4,11,15],target:[4,15],target_dir:15,targetbit:17,tcl:[13,15,17],tcl_script:17,tempfil:17,temporari:17,tensor:[9,11,12,14,16,17],tensor_fanout:9,tensor_nam:[9,11],tensor_shap:[11,17],tensor_valu:11,termin:[3,15],ternari:11,test:14,text:3,than:[11,12],thei:[8,16],them:[9,15,16],thi:[3,4,7,9,11,12,13,14,15,17,19],thing:4,thought:3,thresh:13,threshold:[12,13,16],through:3,time:[3,13,14,15],tlastmark:15,tmem:13,togeth:[3,15],toggl:13,toggle_clk:13,token:3,tool:[3,4],train:[3,4],transform:[8,11,18],trigger:3,tune:4,two:[4,11,12,15,16,17],type:[11,13,14,17],ubuntu:3,uint16:11,uint2:[11,17],uint32:11,uint3:11,uint4:11,uint8:[11,17],umuroglu:13,under:[4,15],uniqu:14,unpack:[15,17],unpack_innermost_dim_from_hex_str:17,unsign:[11,16],until:11,untrain:17,updat:[4,16],use:[4,15],used:[4,5,11,12,13,15,17,20,21],useful:11,user:3,usernam:[3,15],using:[11,13,14,15,16,17,19],util:[8,11,12,13,18],val:17,valu:[11,12,13,15,16,17],value_info:11,valueinfo:[11,14],valueinfo_to_tensor:17,valueinfoproto:[11,17],variabl:[3,17],vector:[16,17],verif:9,verifi:[9,12,13,20],verify_nod:[9,12,13],verilog:15,version:4,via:11,visser:13,vivado:[3,4,10,11,15,17],vivado_path:3,vivado_pynq_proj:15,vivado_stitch_proj:15,wai:[3,9],wait:17,want:16,wbit:17,webbrows:3,webhook:3,websit:4,weight:[11,13,17],welcom:4,well:3,when:[3,9,12,13],where:[3,11,12,13,15,16],wherea:11,whether:[9,11,12,13],which:[3,4,11,12,13,15,16,17],width:[13,17],window:13,without:3,wmem:13,work:[3,6,11,17],workspac:3,wrapper:11,write:[3,12,13],xilinx:4,xnor:12,xnorpopcountmatmul:[12,14,15],you:[3,7],your:3,zero:[11,13,16,17]},titles:["Brevitas Export","End-to-End Flow","Index","Getting Started","FINN","Internals","Network Preparation","PYNQ Deployment","Source Code","Analysis","Analysis - fpgadataflow","Core","Custom Op","Custom Op - FPGADataFlow","Transformation","Transformation - fpgadataflow","Transformation - Streamline","Util","finn","Tutorials","Functional Verification","Vivado HLS and Vivado Synthesis"],titleterms:{"class":[12,13],"export":0,"function":20,HLS:[13,21],absorb:16,analysi:[5,9,10],base:[12,13],basic:17,batchnorm_to_affin:14,bipolar_to_xnor:14,brevita:0,cleanup:15,code:8,codegen_ipgen:15,codegen_ipstitch:15,codegen_npysim:15,collapse_rep:16,compil:[3,15],convert_to_hls_lay:15,convolutioninputgener:13,core:11,create_dataflow_partit:15,custom:[12,13],custom_op:[12,13],data_pack:17,datatyp:11,deploy:7,develop:3,directli:3,docker:3,end:1,execute_custom_nod:11,experiment:3,finn:[3,4,5,9,10,11,12,13,14,15,16,17,18],flow:1,fold_const:14,fpgadataflow:[10,13,15,17],gener:14,get:3,hls_synth_res_estim:10,hlssynth_ipgen:15,how:3,index:2,infer_datatyp:14,infer_shap:14,insert_tlastmark:15,interact:3,intermedi:5,intern:5,jenkin:3,jupyt:3,make_deploy:15,make_pynq_driv:15,make_pynq_proj:15,modelwrapp:[5,11],modul:[8,11,17],multithreshold:12,network:6,node:[12,13],notebook:3,onnx:[5,17],onnx_exec:11,pass:[5,9,10,14],prepar:6,pynq:7,registri:12,remote_exec:11,reorder:16,replace_verilog_relpath:15,represent:5,requir:3,res_estim:10,round_threshold:16,rtlsim_exec:11,run:3,set_exec_mod:15,shell:3,sign_to_thr:16,sourc:8,start:3,streamingdataflowpartit:12,streamingfclayer_batch:13,streamingmaxpool_batch:13,streamlin:16,submodul:[9,12,14],suit:3,synth_pynq_proj:15,synthesi:21,templat:[13,15],test:[3,17],tlastmark:13,topolog:9,transform:[5,14,15,16],tutori:19,use:3,using:3,util:17,verif:20,verify_custom_nod:9,vivado:21,what:4,xnorpopcount:12}}) \ No newline at end of file diff --git a/docs/finn/_build/html/source_code/finn.analysis.fpgadataflow.html b/docs/finn/_build/html/source_code/finn.analysis.fpgadataflow.html index aed9e8c60..6949bee40 100644 --- a/docs/finn/_build/html/source_code/finn.analysis.fpgadataflow.html +++ b/docs/finn/_build/html/source_code/finn.analysis.fpgadataflow.html @@ -8,7 +8,7 @@ <meta name="viewport" content="width=device-width, initial-scale=1.0"> - <title>Analysis - FPGADataFlow — FINN documentation</title> + <title>Analysis - fpgadataflow — FINN documentation</title> @@ -93,7 +93,6 @@ <li class="toctree-l1 current"><a class="reference internal" href="finn.html">Source Code</a><ul class="current"> <li class="toctree-l2 current"><a class="reference internal" href="finn.html#modules">Modules</a><ul class="current"> <li class="toctree-l3 current"><a class="reference internal" href="finn.analysis.html">Analysis</a><ul class="current"> -<li class="toctree-l4"><a class="reference internal" href="finn.analysis.html#how-to-write-an-analysis-pass-for-finn">How to write an analysis pass for FINN</a></li> <li class="toctree-l4 current"><a class="reference internal" href="finn.analysis.html#submodules">Submodules</a></li> <li class="toctree-l4"><a class="reference internal" href="finn.analysis.html#analysis-passes">Analysis Passes</a></li> </ul> @@ -156,7 +155,7 @@ <li><a href="finn.analysis.html">Analysis</a> »</li> - <li>Analysis - FPGADataFlow</li> + <li>Analysis - fpgadataflow</li> <li class="wy-breadcrumbs-aside"> @@ -176,11 +175,11 @@ <div itemprop="articleBody"> <div class="section" id="analysis-fpgadataflow"> -<h1>Analysis - FPGADataFlow<a class="headerlink" href="#analysis-fpgadataflow" title="Permalink to this headline">¶</a></h1> +<h1>Analysis - fpgadataflow<a class="headerlink" href="#analysis-fpgadataflow" title="Permalink to this headline">¶</a></h1> <div class="section" id="analysis-passes-fpgadataflow"> -<h2>Analysis Passes (FPGADataFlow)<a class="headerlink" href="#analysis-passes-fpgadataflow" title="Permalink to this headline">¶</a></h2> +<h2>Analysis Passes (fpgadataflow)<a class="headerlink" href="#analysis-passes-fpgadataflow" title="Permalink to this headline">¶</a></h2> <div class="section" id="module-finn.analysis.fpgadataflow.hls_synth_res_estimation"> -<span id="finn-analysis-fpgadataflow-hls-synth-res-estimation-module"></span><h3>finn.analysis.fpgadataflow.hls_synth_res_estimation module<a class="headerlink" href="#module-finn.analysis.fpgadataflow.hls_synth_res_estimation" title="Permalink to this headline">¶</a></h3> +<span id="finn-analysis-fpgadataflow-hls-synth-res-estimation"></span><h3>finn.analysis.fpgadataflow.hls_synth_res_estimation<a class="headerlink" href="#module-finn.analysis.fpgadataflow.hls_synth_res_estimation" title="Permalink to this headline">¶</a></h3> <dl class="function"> <dt id="finn.analysis.fpgadataflow.hls_synth_res_estimation.hls_synth_res_estimation"> <code class="sig-prename descclassname">finn.analysis.fpgadataflow.hls_synth_res_estimation.</code><code class="sig-name descname">hls_synth_res_estimation</code><span class="sig-paren">(</span><em class="sig-param">model</em><span class="sig-paren">)</span><a class="headerlink" href="#finn.analysis.fpgadataflow.hls_synth_res_estimation.hls_synth_res_estimation" title="Permalink to this definition">¶</a></dt> @@ -190,7 +189,7 @@ </div> <div class="section" id="module-finn.analysis.fpgadataflow.res_estimation"> -<span id="finn-analysis-fpgadataflow-res-estimation-module"></span><h3>finn.analysis.fpgadataflow.res_estimation module<a class="headerlink" href="#module-finn.analysis.fpgadataflow.res_estimation" title="Permalink to this headline">¶</a></h3> +<span id="finn-analysis-fpgadataflow-res-estimation"></span><h3>finn.analysis.fpgadataflow.res_estimation<a class="headerlink" href="#module-finn.analysis.fpgadataflow.res_estimation" title="Permalink to this headline">¶</a></h3> <dl class="function"> <dt id="finn.analysis.fpgadataflow.res_estimation.res_estimation"> <code class="sig-prename descclassname">finn.analysis.fpgadataflow.res_estimation.</code><code class="sig-name descname">res_estimation</code><span class="sig-paren">(</span><em class="sig-param">model</em><span class="sig-paren">)</span><a class="headerlink" href="#finn.analysis.fpgadataflow.res_estimation.res_estimation" title="Permalink to this definition">¶</a></dt> diff --git a/docs/finn/_build/html/source_code/finn.analysis.html b/docs/finn/_build/html/source_code/finn.analysis.html index 70811fefc..9574fc358 100644 --- a/docs/finn/_build/html/source_code/finn.analysis.html +++ b/docs/finn/_build/html/source_code/finn.analysis.html @@ -35,7 +35,7 @@ <link rel="stylesheet" href="../_static/pygments.css" type="text/css" /> <link rel="index" title="Index" href="../genindex.html" /> <link rel="search" title="Search" href="../search.html" /> - <link rel="next" title="Analysis - FPGADataFlow" href="finn.analysis.fpgadataflow.html" /> + <link rel="next" title="Analysis - fpgadataflow" href="finn.analysis.fpgadataflow.html" /> <link rel="prev" title="Source Code" href="finn.html" /> </head> @@ -93,7 +93,6 @@ <li class="toctree-l1 current"><a class="reference internal" href="finn.html">Source Code</a><ul class="current"> <li class="toctree-l2 current"><a class="reference internal" href="finn.html#modules">Modules</a><ul class="current"> <li class="toctree-l3 current"><a class="current reference internal" href="#">Analysis</a><ul> -<li class="toctree-l4"><a class="reference internal" href="#how-to-write-an-analysis-pass-for-finn">How to write an analysis pass for FINN</a></li> <li class="toctree-l4"><a class="reference internal" href="#submodules">Submodules</a></li> <li class="toctree-l4"><a class="reference internal" href="#analysis-passes">Analysis Passes</a></li> </ul> @@ -173,20 +172,14 @@ <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> <div itemprop="articleBody"> - <div class="section" id="module-finn.analysis"> -<span id="analysis"></span><h1>Analysis<a class="headerlink" href="#module-finn.analysis" title="Permalink to this headline">¶</a></h1> -<div class="section" id="how-to-write-an-analysis-pass-for-finn"> -<h2>How to write an analysis pass for FINN<a class="headerlink" href="#how-to-write-an-analysis-pass-for-finn" title="Permalink to this headline">¶</a></h2> -<p>An analysis pass traverses the graph structure and produces information about -certain properties. The convention is to take in a ModelWrapper, and return -a dictionary of named properties that the analysis extracts.</p> -</div> + <div class="section" id="analysis"> +<h1>Analysis<a class="headerlink" href="#analysis" title="Permalink to this headline">¶</a></h1> <div class="section" id="submodules"> <h2>Submodules<a class="headerlink" href="#submodules" title="Permalink to this headline">¶</a></h2> <div class="toctree-wrapper compound"> <ul> -<li class="toctree-l1"><a class="reference internal" href="finn.analysis.fpgadataflow.html">Analysis - FPGADataFlow</a><ul> -<li class="toctree-l2"><a class="reference internal" href="finn.analysis.fpgadataflow.html#analysis-passes-fpgadataflow">Analysis Passes (FPGADataFlow)</a></li> +<li class="toctree-l1"><a class="reference internal" href="finn.analysis.fpgadataflow.html">Analysis - fpgadataflow</a><ul> +<li class="toctree-l2"><a class="reference internal" href="finn.analysis.fpgadataflow.html#analysis-passes-fpgadataflow">Analysis Passes (fpgadataflow)</a></li> </ul> </li> </ul> @@ -255,7 +248,7 @@ and inputs.</p> <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation"> - <a href="finn.analysis.fpgadataflow.html" class="btn btn-neutral float-right" title="Analysis - FPGADataFlow" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a> + <a href="finn.analysis.fpgadataflow.html" class="btn btn-neutral float-right" title="Analysis - fpgadataflow" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a> <a href="finn.html" class="btn btn-neutral float-left" title="Source Code" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a> diff --git a/docs/finn/_build/html/source_code/finn.core.html b/docs/finn/_build/html/source_code/finn.core.html index df897750e..01fd53e80 100644 --- a/docs/finn/_build/html/source_code/finn.core.html +++ b/docs/finn/_build/html/source_code/finn.core.html @@ -36,7 +36,7 @@ <link rel="index" title="Index" href="../genindex.html" /> <link rel="search" title="Search" href="../search.html" /> <link rel="next" title="Custom Op" href="finn.custom_op.html" /> - <link rel="prev" title="Analysis - FPGADataFlow" href="finn.analysis.fpgadataflow.html" /> + <link rel="prev" title="Analysis - fpgadataflow" href="finn.analysis.fpgadataflow.html" /> </head> <body class="wy-body-for-nav"> @@ -581,7 +581,7 @@ context contains the input values.</p> <a href="finn.custom_op.html" class="btn btn-neutral float-right" title="Custom Op" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a> - <a href="finn.analysis.fpgadataflow.html" class="btn btn-neutral float-left" title="Analysis - FPGADataFlow" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a> + <a href="finn.analysis.fpgadataflow.html" class="btn btn-neutral float-left" title="Analysis - fpgadataflow" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a> </div> diff --git a/docs/finn/_build/html/source_code/finn.transformation.fpgadataflow.html b/docs/finn/_build/html/source_code/finn.transformation.fpgadataflow.html index 45cfe3151..2c2c278da 100644 --- a/docs/finn/_build/html/source_code/finn.transformation.fpgadataflow.html +++ b/docs/finn/_build/html/source_code/finn.transformation.fpgadataflow.html @@ -8,7 +8,7 @@ <meta name="viewport" content="width=device-width, initial-scale=1.0"> - <title>Transformation - FPGADataFlow — FINN documentation</title> + <title>Transformation - fpgadataflow — FINN documentation</title> @@ -96,7 +96,6 @@ <li class="toctree-l3"><a class="reference internal" href="finn.core.html">Core</a></li> <li class="toctree-l3"><a class="reference internal" href="finn.custom_op.html">Custom Op</a></li> <li class="toctree-l3 current"><a class="reference internal" href="finn.transformation.html">Transformation</a><ul class="current"> -<li class="toctree-l4"><a class="reference internal" href="finn.transformation.html#guide-to-writing-finn-transformations">Guide to writing FINN transformations</a></li> <li class="toctree-l4 current"><a class="reference internal" href="finn.transformation.html#submodules">Submodules</a></li> <li class="toctree-l4"><a class="reference internal" href="finn.transformation.html#transformation-passes">Transformation Passes</a></li> </ul> @@ -156,7 +155,7 @@ <li><a href="finn.transformation.html">Transformation</a> »</li> - <li>Transformation - FPGADataFlow</li> + <li>Transformation - fpgadataflow</li> <li class="wy-breadcrumbs-aside"> @@ -176,15 +175,15 @@ <div itemprop="articleBody"> <div class="section" id="transformation-fpgadataflow"> -<h1>Transformation - FPGADataFlow<a class="headerlink" href="#transformation-fpgadataflow" title="Permalink to this headline">¶</a></h1> +<h1>Transformation - fpgadataflow<a class="headerlink" href="#transformation-fpgadataflow" title="Permalink to this headline">¶</a></h1> <div class="section" id="transformations-fpgadataflow"> -<h2>Transformations (FPGADataFlow)<a class="headerlink" href="#transformations-fpgadataflow" title="Permalink to this headline">¶</a></h2> +<h2>Transformations (fpgadataflow)<a class="headerlink" href="#transformations-fpgadataflow" title="Permalink to this headline">¶</a></h2> <div class="section" id="module-finn.transformation.fpgadataflow.cleanup"> <span id="finn-transformation-fpgadataflow-cleanup"></span><h3>finn.transformation.fpgadataflow.cleanup<a class="headerlink" href="#module-finn.transformation.fpgadataflow.cleanup" title="Permalink to this headline">¶</a></h3> <dl class="class"> <dt id="finn.transformation.fpgadataflow.cleanup.CleanUp"> <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.fpgadataflow.cleanup.</code><code class="sig-name descname">CleanUp</code><a class="headerlink" href="#finn.transformation.fpgadataflow.cleanup.CleanUp" title="Permalink to this definition">¶</a></dt> -<dd><p>Bases: <a class="reference internal" href="finn.transformation.html#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p> +<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p> <p>Remove any generated files for fpgadataflow nodes.</p> <dl class="method"> <dt id="finn.transformation.fpgadataflow.cleanup.CleanUp.apply"> @@ -199,7 +198,7 @@ <dl class="class"> <dt id="finn.transformation.fpgadataflow.codegen_ipgen.CodeGen_ipgen"> <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.fpgadataflow.codegen_ipgen.</code><code class="sig-name descname">CodeGen_ipgen</code><span class="sig-paren">(</span><em class="sig-param">fpgapart</em>, <em class="sig-param">clk</em><span class="sig-paren">)</span><a class="headerlink" href="#finn.transformation.fpgadataflow.codegen_ipgen.CodeGen_ipgen" title="Permalink to this definition">¶</a></dt> -<dd><p>Bases: <a class="reference internal" href="finn.transformation.html#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p> +<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p> <p>Call custom implementation to generate code for single custom node and create folder that contains all the generated files. All nodes in the graph must have the fpgadataflow backend attribute and @@ -224,7 +223,7 @@ The subsequent transformation is HLSSynth_IPGen</p> <dl class="class"> <dt id="finn.transformation.fpgadataflow.codegen_ipstitch.CodeGen_ipstitch"> <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.fpgadataflow.codegen_ipstitch.</code><code class="sig-name descname">CodeGen_ipstitch</code><span class="sig-paren">(</span><em class="sig-param">fpgapart</em><span class="sig-paren">)</span><a class="headerlink" href="#finn.transformation.fpgadataflow.codegen_ipstitch.CodeGen_ipstitch" title="Permalink to this definition">¶</a></dt> -<dd><p>Bases: <a class="reference internal" href="finn.transformation.html#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p> +<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p> <p>Create a Vivado IP Block Design project from all the generated IPs of a graph. All nodes in the graph must have the fpgadataflow backend attribute, and the CodeGen_ipgen transformation must have been previously run on @@ -248,7 +247,7 @@ The packaged block design IP can be found under the ip subdirectory.</p> <dl class="class"> <dt id="finn.transformation.fpgadataflow.codegen_npysim.CodeGen_npysim"> <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.fpgadataflow.codegen_npysim.</code><code class="sig-name descname">CodeGen_npysim</code><a class="headerlink" href="#finn.transformation.fpgadataflow.codegen_npysim.CodeGen_npysim" title="Permalink to this definition">¶</a></dt> -<dd><p>Bases: <a class="reference internal" href="finn.transformation.html#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p> +<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p> <p>Call custom implementation to generate code for single custom node and create folder that contains all the generated files. All nodes in the graph must have the fpgadataflow backend attribute.</p> @@ -268,7 +267,7 @@ The subsequent transformation is Compile</p> <dl class="class"> <dt id="finn.transformation.fpgadataflow.compile.Compile"> <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.fpgadataflow.compile.</code><code class="sig-name descname">Compile</code><a class="headerlink" href="#finn.transformation.fpgadataflow.compile.Compile" title="Permalink to this definition">¶</a></dt> -<dd><p>Bases: <a class="reference internal" href="finn.transformation.html#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p> +<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p> <p>For every node: compile C++ code in node attribute “code_gen_dir_npysim†and save path to executables in node attribute “executable_pathâ€. All nodes in the graph must have the fpgadataflow backend attribute.</p> @@ -288,7 +287,7 @@ finn.core.onnx_exec</p> <dl class="class"> <dt id="finn.transformation.fpgadataflow.convert_to_hls_layers.InferBinaryStreamingFCLayer"> <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.fpgadataflow.convert_to_hls_layers.</code><code class="sig-name descname">InferBinaryStreamingFCLayer</code><a class="headerlink" href="#finn.transformation.fpgadataflow.convert_to_hls_layers.InferBinaryStreamingFCLayer" title="Permalink to this definition">¶</a></dt> -<dd><p>Bases: <a class="reference internal" href="finn.transformation.html#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p> +<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p> <p>Convert pairs of binary XnorPopcountMatMul layers to StreamingFCLayer_Batch layers. Any immediately following MultiThreshold layers will also be absorbed into the MVTU.</p> @@ -305,7 +304,7 @@ layers will also be absorbed into the MVTU.</p> <dl class="class"> <dt id="finn.transformation.fpgadataflow.create_dataflow_partition.CreateDataflowPartition"> <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.fpgadataflow.create_dataflow_partition.</code><code class="sig-name descname">CreateDataflowPartition</code><a class="headerlink" href="#finn.transformation.fpgadataflow.create_dataflow_partition.CreateDataflowPartition" title="Permalink to this definition">¶</a></dt> -<dd><p>Bases: <a class="reference internal" href="finn.transformation.html#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p> +<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p> <p>Split a graph into two graphs; one which contains non-FINN-dataflow nodes and a StreamingDataflowPartition node, and another which only contains FINN dataflow nodes. The StreamingDataflowPartition has a model attribute @@ -324,7 +323,7 @@ dataflow nodes. No action is taken if there are no dataflow nodes.</p> <dl class="class"> <dt id="finn.transformation.fpgadataflow.hlssynth_ipgen.HLSSynth_IPGen"> <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.fpgadataflow.hlssynth_ipgen.</code><code class="sig-name descname">HLSSynth_IPGen</code><a class="headerlink" href="#finn.transformation.fpgadataflow.hlssynth_ipgen.HLSSynth_IPGen" title="Permalink to this definition">¶</a></dt> -<dd><p>Bases: <a class="reference internal" href="finn.transformation.html#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p> +<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p> <p>For each node: generate IP block from code in folder that is referenced in node attribute “code_gen_dir_ipgen†and save path of generated project in node attribute “ipgen_pathâ€. @@ -344,7 +343,7 @@ some time (several minutes)</p> <dl class="class"> <dt id="finn.transformation.fpgadataflow.insert_tlastmarker.InsertTLastMarker"> <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.fpgadataflow.insert_tlastmarker.</code><code class="sig-name descname">InsertTLastMarker</code><a class="headerlink" href="#finn.transformation.fpgadataflow.insert_tlastmarker.InsertTLastMarker" title="Permalink to this definition">¶</a></dt> -<dd><p>Bases: <a class="reference internal" href="finn.transformation.html#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p> +<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p> <p>Ensure that the graph is terminated with a TLastMarker node, inserting one if necessary.</p> <dl class="method"> @@ -360,7 +359,7 @@ one if necessary.</p> <dl class="class"> <dt id="finn.transformation.fpgadataflow.make_deployment.DeployToPYNQ"> <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.fpgadataflow.make_deployment.</code><code class="sig-name descname">DeployToPYNQ</code><span class="sig-paren">(</span><em class="sig-param">ip</em>, <em class="sig-param">username</em>, <em class="sig-param">password</em>, <em class="sig-param">target_dir</em><span class="sig-paren">)</span><a class="headerlink" href="#finn.transformation.fpgadataflow.make_deployment.DeployToPYNQ" title="Permalink to this definition">¶</a></dt> -<dd><p>Bases: <a class="reference internal" href="finn.transformation.html#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p> +<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p> <p>Collects all necessary files for deployment and copies them to the PYNQ board. Expects information about PYNQ board to make scp possible:</p> <p>IP address of board, username and password for board and target directory where @@ -378,7 +377,7 @@ the files are stored on the board</p> <dl class="class"> <dt id="finn.transformation.fpgadataflow.make_pynq_driver.MakePYNQDriver"> <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.fpgadataflow.make_pynq_driver.</code><code class="sig-name descname">MakePYNQDriver</code><a class="headerlink" href="#finn.transformation.fpgadataflow.make_pynq_driver.MakePYNQDriver" title="Permalink to this definition">¶</a></dt> -<dd><p>Bases: <a class="reference internal" href="finn.transformation.html#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p> +<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p> <p>Create PYNQ Python code to correctly interface the generated accelerator, including data packing/unpacking. The MakePYNQProject transformation must have been already applied.</p> @@ -398,7 +397,7 @@ value.</p> <dl class="class"> <dt id="finn.transformation.fpgadataflow.make_pynq_proj.MakePYNQProject"> <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.fpgadataflow.make_pynq_proj.</code><code class="sig-name descname">MakePYNQProject</code><span class="sig-paren">(</span><em class="sig-param">platform</em><span class="sig-paren">)</span><a class="headerlink" href="#finn.transformation.fpgadataflow.make_pynq_proj.MakePYNQProject" title="Permalink to this definition">¶</a></dt> -<dd><p>Bases: <a class="reference internal" href="finn.transformation.html#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p> +<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p> <p>Create a Vivado PYNQ overlay project (including the shell infrastructure) from the already-stitched IP block for this graph. All nodes in the graph must have the fpgadataflow backend attribute, @@ -420,7 +419,7 @@ value.</p> <dl class="class"> <dt id="finn.transformation.fpgadataflow.replace_verilog_relpaths.ReplaceVerilogRelPaths"> <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.fpgadataflow.replace_verilog_relpaths.</code><code class="sig-name descname">ReplaceVerilogRelPaths</code><a class="headerlink" href="#finn.transformation.fpgadataflow.replace_verilog_relpaths.ReplaceVerilogRelPaths" title="Permalink to this definition">¶</a></dt> -<dd><p>Bases: <a class="reference internal" href="finn.transformation.html#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p> +<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p> <p>Convert ./ relative file paths to absolute ones for generated Verilog</p> <dl class="method"> <dt id="finn.transformation.fpgadataflow.replace_verilog_relpaths.ReplaceVerilogRelPaths.apply"> @@ -435,7 +434,7 @@ value.</p> <dl class="class"> <dt id="finn.transformation.fpgadataflow.set_exec_mode.SetExecMode"> <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.fpgadataflow.set_exec_mode.</code><code class="sig-name descname">SetExecMode</code><span class="sig-paren">(</span><em class="sig-param">mode</em><span class="sig-paren">)</span><a class="headerlink" href="#finn.transformation.fpgadataflow.set_exec_mode.SetExecMode" title="Permalink to this definition">¶</a></dt> -<dd><p>Bases: <a class="reference internal" href="finn.transformation.html#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p> +<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p> <p>Set attribute exec_mode in all fpgadataflow nodes to specify which kind of execution should be used (“npysim†or “rtlsimâ€)</p> <dl class="method"> @@ -451,7 +450,7 @@ kind of execution should be used (“npysim†or “rtlsimâ€)</p> <dl class="class"> <dt id="finn.transformation.fpgadataflow.synth_pynq_proj.SynthPYNQProject"> <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.fpgadataflow.synth_pynq_proj.</code><code class="sig-name descname">SynthPYNQProject</code><a class="headerlink" href="#finn.transformation.fpgadataflow.synth_pynq_proj.SynthPYNQProject" title="Permalink to this definition">¶</a></dt> -<dd><p>Bases: <a class="reference internal" href="finn.transformation.html#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p> +<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p> <p>Run synthesis for the PYNQ project for this graph. The MakePYNQProject transformation must be applied prior to this transformation.</p> <dl class="method"> diff --git a/docs/finn/_build/html/source_code/finn.transformation.html b/docs/finn/_build/html/source_code/finn.transformation.html index 6c7614b3e..ff5c738d9 100644 --- a/docs/finn/_build/html/source_code/finn.transformation.html +++ b/docs/finn/_build/html/source_code/finn.transformation.html @@ -35,7 +35,7 @@ <link rel="stylesheet" href="../_static/pygments.css" type="text/css" /> <link rel="index" title="Index" href="../genindex.html" /> <link rel="search" title="Search" href="../search.html" /> - <link rel="next" title="Transformation - FPGADataFlow" href="finn.transformation.fpgadataflow.html" /> + <link rel="next" title="Transformation - fpgadataflow" href="finn.transformation.fpgadataflow.html" /> <link rel="prev" title="Custom Op - FPGADataFlow" href="finn.custom_op.fpgadataflow.html" /> </head> @@ -96,7 +96,6 @@ <li class="toctree-l3"><a class="reference internal" href="finn.core.html">Core</a></li> <li class="toctree-l3"><a class="reference internal" href="finn.custom_op.html">Custom Op</a></li> <li class="toctree-l3 current"><a class="current reference internal" href="#">Transformation</a><ul> -<li class="toctree-l4"><a class="reference internal" href="#guide-to-writing-finn-transformations">Guide to writing FINN transformations</a></li> <li class="toctree-l4"><a class="reference internal" href="#submodules">Submodules</a></li> <li class="toctree-l4"><a class="reference internal" href="#transformation-passes">Transformation Passes</a></li> </ul> @@ -173,47 +172,14 @@ <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> <div itemprop="articleBody"> - <div class="section" id="module-finn.transformation"> -<span id="transformation"></span><h1>Transformation<a class="headerlink" href="#module-finn.transformation" title="Permalink to this headline">¶</a></h1> -<div class="section" id="guide-to-writing-finn-transformations"> -<h2>Guide to writing FINN transformations<a class="headerlink" href="#guide-to-writing-finn-transformations" title="Permalink to this headline">¶</a></h2> -<ul class="simple"> -<li><p>Your transformation must inherit the Transformation abstract base class.</p></li> -<li><p>Your transformation’s apply function should take in a ModelWrapper, and return -a tuple with (transformed_model: ModelWrapper, model_was_changed: Bool)</p></li> -<li><p>The transformations are meant to be applied using the .transform function -in ModelWrapper. This makes a deep copy of the input model by default, so -you don’t have to.</p></li> -<li><p>model_was_changed indicates whether your transformation made any changes to -the model. If you know your transformation needs to be called only once and -repeated calls have no further effect, you can return False even if the model -was changed.</p></li> -<li><p>You MUST return model_was_changed=False at some point when your transformation -is called multiple times, otherwise apply_repeated() will loop infinitely.</p></li> -<li><p>If you cannot guarantee that the transformation will reach a fixed point, -you must declare this, return model_was_changed = False and let the user -manually re-apply the transform.</p></li> -</ul> -<dl class="class"> -<dt id="finn.transformation.Transformation"> -<em class="property">class </em><code class="sig-prename descclassname">finn.transformation.</code><code class="sig-name descname">Transformation</code><a class="headerlink" href="#finn.transformation.Transformation" title="Permalink to this definition">¶</a></dt> -<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">abc.ABC</span></code></p> -<p>Transformation class all transformations are based on. Contains only -abstract method apply() every transformation has to fill.</p> -<dl class="method"> -<dt id="finn.transformation.Transformation.apply"> -<em class="property">abstract </em><code class="sig-name descname">apply</code><span class="sig-paren">(</span><em class="sig-param">model</em><span class="sig-paren">)</span><a class="headerlink" href="#finn.transformation.Transformation.apply" title="Permalink to this definition">¶</a></dt> -<dd></dd></dl> - -</dd></dl> - -</div> + <div class="section" id="transformation"> +<h1>Transformation<a class="headerlink" href="#transformation" title="Permalink to this headline">¶</a></h1> <div class="section" id="submodules"> <h2>Submodules<a class="headerlink" href="#submodules" title="Permalink to this headline">¶</a></h2> <div class="toctree-wrapper compound"> <ul> -<li class="toctree-l1"><a class="reference internal" href="finn.transformation.fpgadataflow.html">Transformation - FPGADataFlow</a><ul> -<li class="toctree-l2"><a class="reference internal" href="finn.transformation.fpgadataflow.html#transformations-fpgadataflow">Transformations (FPGADataFlow)</a></li> +<li class="toctree-l1"><a class="reference internal" href="finn.transformation.fpgadataflow.html">Transformation - fpgadataflow</a><ul> +<li class="toctree-l2"><a class="reference internal" href="finn.transformation.fpgadataflow.html#transformations-fpgadataflow">Transformations (fpgadataflow)</a></li> </ul> </li> <li class="toctree-l1"><a class="reference internal" href="finn.transformation.streamline.html">Transformation - Streamline</a><ul> @@ -230,7 +196,7 @@ abstract method apply() every transformation has to fill.</p> <dl class="class"> <dt id="finn.transformation.batchnorm_to_affine.BatchNormToAffine"> <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.batchnorm_to_affine.</code><code class="sig-name descname">BatchNormToAffine</code><a class="headerlink" href="#finn.transformation.batchnorm_to_affine.BatchNormToAffine" title="Permalink to this definition">¶</a></dt> -<dd><p>Bases: <a class="reference internal" href="#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p> +<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p> <p>Replaces any test-time BatchNorm layers with Mul-Add layers.</p> <dl class="method"> <dt id="finn.transformation.batchnorm_to_affine.BatchNormToAffine.apply"> @@ -245,7 +211,7 @@ abstract method apply() every transformation has to fill.</p> <dl class="class"> <dt id="finn.transformation.bipolar_to_xnor.ConvertBipolarMatMulToXnorPopcount"> <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.bipolar_to_xnor.</code><code class="sig-name descname">ConvertBipolarMatMulToXnorPopcount</code><a class="headerlink" href="#finn.transformation.bipolar_to_xnor.ConvertBipolarMatMulToXnorPopcount" title="Permalink to this definition">¶</a></dt> -<dd><p>Bases: <a class="reference internal" href="#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p> +<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p> <p>Convert MatMul nodes with all-bipolar inputs to XnorPopcountMatMul and associated result correction.</p> <dl class="method"> @@ -261,7 +227,7 @@ and associated result correction.</p> <dl class="class"> <dt id="finn.transformation.fold_constants.FoldConstants"> <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.fold_constants.</code><code class="sig-name descname">FoldConstants</code><a class="headerlink" href="#finn.transformation.fold_constants.FoldConstants" title="Permalink to this definition">¶</a></dt> -<dd><p>Bases: <a class="reference internal" href="#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p> +<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p> <p>Replace the output of a node with const-only inputs with a precomputed result.</p> <dl class="method"> @@ -277,7 +243,7 @@ result.</p> <dl class="class"> <dt id="finn.transformation.general.ConvertSubToAdd"> <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.general.</code><code class="sig-name descname">ConvertSubToAdd</code><a class="headerlink" href="#finn.transformation.general.ConvertSubToAdd" title="Permalink to this definition">¶</a></dt> -<dd><p>Bases: <a class="reference internal" href="#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p> +<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p> <p>Convert sub nodes to add nodes of appropriate sign.</p> <dl class="method"> <dt id="finn.transformation.general.ConvertSubToAdd.apply"> @@ -289,7 +255,7 @@ result.</p> <dl class="class"> <dt id="finn.transformation.general.GiveRandomTensorNames"> <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.general.</code><code class="sig-name descname">GiveRandomTensorNames</code><a class="headerlink" href="#finn.transformation.general.GiveRandomTensorNames" title="Permalink to this definition">¶</a></dt> -<dd><p>Bases: <a class="reference internal" href="#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p> +<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p> <p>Give random tensor names to all tensors.</p> <dl class="method"> <dt id="finn.transformation.general.GiveRandomTensorNames.apply"> @@ -301,7 +267,7 @@ result.</p> <dl class="class"> <dt id="finn.transformation.general.GiveReadableTensorNames"> <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.general.</code><code class="sig-name descname">GiveReadableTensorNames</code><a class="headerlink" href="#finn.transformation.general.GiveReadableTensorNames" title="Permalink to this definition">¶</a></dt> -<dd><p>Bases: <a class="reference internal" href="#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p> +<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p> <p>Give more human-readable names to all internal tensors. It’s recommended to apply give_unique_node_names prior to this transform.</p> <dl class="method"> @@ -314,7 +280,7 @@ to apply give_unique_node_names prior to this transform.</p> <dl class="class"> <dt id="finn.transformation.general.GiveUniqueNodeNames"> <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.general.</code><code class="sig-name descname">GiveUniqueNodeNames</code><a class="headerlink" href="#finn.transformation.general.GiveUniqueNodeNames" title="Permalink to this definition">¶</a></dt> -<dd><p>Bases: <a class="reference internal" href="#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p> +<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p> <p>Give unique names to each node in the graph using enumeration.</p> <dl class="method"> <dt id="finn.transformation.general.GiveUniqueNodeNames.apply"> @@ -329,7 +295,7 @@ to apply give_unique_node_names prior to this transform.</p> <dl class="class"> <dt id="finn.transformation.infer_datatypes.InferDataTypes"> <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.infer_datatypes.</code><code class="sig-name descname">InferDataTypes</code><a class="headerlink" href="#finn.transformation.infer_datatypes.InferDataTypes" title="Permalink to this definition">¶</a></dt> -<dd><p>Bases: <a class="reference internal" href="#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p> +<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p> <p>Infer FINN DataType info for all intermediate/output tensors based on inputs and node type.</p> <dl class="method"> @@ -345,7 +311,7 @@ inputs and node type.</p> <dl class="class"> <dt id="finn.transformation.infer_shapes.InferShapes"> <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.infer_shapes.</code><code class="sig-name descname">InferShapes</code><a class="headerlink" href="#finn.transformation.infer_shapes.InferShapes" title="Permalink to this definition">¶</a></dt> -<dd><p>Bases: <a class="reference internal" href="#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p> +<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p> <p>Ensure every tensor in the model has a specified shape (ValueInfo).</p> <dl class="method"> <dt id="finn.transformation.infer_shapes.InferShapes.apply"> @@ -366,7 +332,7 @@ inputs and node type.</p> <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation"> - <a href="finn.transformation.fpgadataflow.html" class="btn btn-neutral float-right" title="Transformation - FPGADataFlow" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a> + <a href="finn.transformation.fpgadataflow.html" class="btn btn-neutral float-right" title="Transformation - fpgadataflow" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a> <a href="finn.custom_op.fpgadataflow.html" class="btn btn-neutral float-left" title="Custom Op - FPGADataFlow" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a> diff --git a/docs/finn/_build/html/source_code/finn.transformation.streamline.html b/docs/finn/_build/html/source_code/finn.transformation.streamline.html index d5423099b..d8199d94b 100644 --- a/docs/finn/_build/html/source_code/finn.transformation.streamline.html +++ b/docs/finn/_build/html/source_code/finn.transformation.streamline.html @@ -36,7 +36,7 @@ <link rel="index" title="Index" href="../genindex.html" /> <link rel="search" title="Search" href="../search.html" /> <link rel="next" title="Util" href="finn.util.html" /> - <link rel="prev" title="Transformation - FPGADataFlow" href="finn.transformation.fpgadataflow.html" /> + <link rel="prev" title="Transformation - fpgadataflow" href="finn.transformation.fpgadataflow.html" /> </head> <body class="wy-body-for-nav"> @@ -96,7 +96,6 @@ <li class="toctree-l3"><a class="reference internal" href="finn.core.html">Core</a></li> <li class="toctree-l3"><a class="reference internal" href="finn.custom_op.html">Custom Op</a></li> <li class="toctree-l3 current"><a class="reference internal" href="finn.transformation.html">Transformation</a><ul class="current"> -<li class="toctree-l4"><a class="reference internal" href="finn.transformation.html#guide-to-writing-finn-transformations">Guide to writing FINN transformations</a></li> <li class="toctree-l4 current"><a class="reference internal" href="finn.transformation.html#submodules">Submodules</a></li> <li class="toctree-l4"><a class="reference internal" href="finn.transformation.html#transformation-passes">Transformation Passes</a></li> </ul> @@ -182,7 +181,7 @@ <dl class="class"> <dt id="finn.transformation.streamline.Streamline"> <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.streamline.</code><code class="sig-name descname">Streamline</code><a class="headerlink" href="#finn.transformation.streamline.Streamline" title="Permalink to this definition">¶</a></dt> -<dd><p>Bases: <a class="reference internal" href="finn.transformation.html#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p> +<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p> <p>Apply the streamlining transform, see arXiv:1709.04060.</p> <dl class="method"> <dt id="finn.transformation.streamline.Streamline.apply"> @@ -196,7 +195,7 @@ <dl class="class"> <dt id="finn.transformation.streamline.absorb.Absorb1BitMulIntoMatMul"> <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.streamline.absorb.</code><code class="sig-name descname">Absorb1BitMulIntoMatMul</code><a class="headerlink" href="#finn.transformation.streamline.absorb.Absorb1BitMulIntoMatMul" title="Permalink to this definition">¶</a></dt> -<dd><p>Bases: <a class="reference internal" href="finn.transformation.html#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p> +<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p> <p>Absorb bipolar or binary multiplications into the preciding matrix multiply.</p> <dl class="method"> @@ -209,7 +208,7 @@ multiply.</p> <dl class="class"> <dt id="finn.transformation.streamline.absorb.AbsorbAddIntoMultiThreshold"> <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.streamline.absorb.</code><code class="sig-name descname">AbsorbAddIntoMultiThreshold</code><a class="headerlink" href="#finn.transformation.streamline.absorb.AbsorbAddIntoMultiThreshold" title="Permalink to this definition">¶</a></dt> -<dd><p>Bases: <a class="reference internal" href="finn.transformation.html#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p> +<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p> <p>Absorb preceding Add ops into MultiThreshold by updating the threshold values. Only scalar/1D add vectors can be absorbed.</p> <dl class="method"> @@ -222,7 +221,7 @@ values. Only scalar/1D add vectors can be absorbed.</p> <dl class="class"> <dt id="finn.transformation.streamline.absorb.AbsorbMulIntoMultiThreshold"> <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.streamline.absorb.</code><code class="sig-name descname">AbsorbMulIntoMultiThreshold</code><a class="headerlink" href="#finn.transformation.streamline.absorb.AbsorbMulIntoMultiThreshold" title="Permalink to this definition">¶</a></dt> -<dd><p>Bases: <a class="reference internal" href="finn.transformation.html#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p> +<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p> <p>Absorb preceding Mul ops into MultiThreshold by updating the threshold values. Only <em>positive</em> scalar/1D mul vectors can be absorbed.</p> <dl class="method"> @@ -235,7 +234,7 @@ values. Only <em>positive</em> scalar/1D mul vectors can be absorbed.</p> <dl class="class"> <dt id="finn.transformation.streamline.absorb.FactorOutMulSignMagnitude"> <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.streamline.absorb.</code><code class="sig-name descname">FactorOutMulSignMagnitude</code><a class="headerlink" href="#finn.transformation.streamline.absorb.FactorOutMulSignMagnitude" title="Permalink to this definition">¶</a></dt> -<dd><p>Bases: <a class="reference internal" href="finn.transformation.html#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p> +<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p> <p>Split multiply-by-constant nodes into two multiply-by-constant nodes, where the first node is a bipolar vector (of signs) and the second is a vector of magnitudes.</p> @@ -266,7 +265,7 @@ vector of magnitudes.</p> <dl class="class"> <dt id="finn.transformation.streamline.collapse_repeated.CollapseRepeatedOp"> <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.streamline.collapse_repeated.</code><code class="sig-name descname">CollapseRepeatedOp</code><span class="sig-paren">(</span><em class="sig-param">op_name</em>, <em class="sig-param">make_collapsed_param_fxn</em><span class="sig-paren">)</span><a class="headerlink" href="#finn.transformation.streamline.collapse_repeated.CollapseRepeatedOp" title="Permalink to this definition">¶</a></dt> -<dd><p>Bases: <a class="reference internal" href="finn.transformation.html#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p> +<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p> <p>Collapse repeated consecutive operations with constant parameters into a single operation. make_collapsed_param_fxn must take two tensors and return a tensor which gives the equivalent result using a single op.</p> @@ -283,7 +282,7 @@ return a tensor which gives the equivalent result using a single op.</p> <dl class="class"> <dt id="finn.transformation.streamline.reorder.MoveAddPastMul"> <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.streamline.reorder.</code><code class="sig-name descname">MoveAddPastMul</code><a class="headerlink" href="#finn.transformation.streamline.reorder.MoveAddPastMul" title="Permalink to this definition">¶</a></dt> -<dd><p>Bases: <a class="reference internal" href="finn.transformation.html#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p> +<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p> <p>Move add operations past multiply operations. The aim is to have them next to each other such that they can be collapsed into a single add.</p> <dl class="method"> @@ -296,7 +295,7 @@ next to each other such that they can be collapsed into a single add.</p> <dl class="class"> <dt id="finn.transformation.streamline.reorder.MoveScalarAddPastMatMul"> <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.streamline.reorder.</code><code class="sig-name descname">MoveScalarAddPastMatMul</code><a class="headerlink" href="#finn.transformation.streamline.reorder.MoveScalarAddPastMatMul" title="Permalink to this definition">¶</a></dt> -<dd><p>Bases: <a class="reference internal" href="finn.transformation.html#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p> +<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p> <p>Move scalar add operations past matmul operations. We want to have adds next to each other such that they can be collapsed into a single add.</p> <dl class="method"> @@ -309,7 +308,7 @@ next to each other such that they can be collapsed into a single add.</p> <dl class="class"> <dt id="finn.transformation.streamline.reorder.MoveScalarMulPastMatMul"> <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.streamline.reorder.</code><code class="sig-name descname">MoveScalarMulPastMatMul</code><a class="headerlink" href="#finn.transformation.streamline.reorder.MoveScalarMulPastMatMul" title="Permalink to this definition">¶</a></dt> -<dd><p>Bases: <a class="reference internal" href="finn.transformation.html#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p> +<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p> <p>Move scalar mul operations past matmul operations. We want to have muls next to each other such that they can be collapsed into a single mul.</p> <dl class="method"> @@ -325,7 +324,7 @@ next to each other such that they can be collapsed into a single mul.</p> <dl class="class"> <dt id="finn.transformation.streamline.round_thresholds.RoundAndClipThresholds"> <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.streamline.round_thresholds.</code><code class="sig-name descname">RoundAndClipThresholds</code><a class="headerlink" href="#finn.transformation.streamline.round_thresholds.RoundAndClipThresholds" title="Permalink to this definition">¶</a></dt> -<dd><p>Bases: <a class="reference internal" href="finn.transformation.html#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p> +<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p> <p>For MultiThreshold nodes operating on integer inputs, round up thresholds values to the nearest integer. Additionally, if the input is unsigned, sets negative thresholds to zero.</p> @@ -342,7 +341,7 @@ is unsigned, sets negative thresholds to zero.</p> <dl class="class"> <dt id="finn.transformation.streamline.sign_to_thres.ConvertSignToThres"> <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.streamline.sign_to_thres.</code><code class="sig-name descname">ConvertSignToThres</code><a class="headerlink" href="#finn.transformation.streamline.sign_to_thres.ConvertSignToThres" title="Permalink to this definition">¶</a></dt> -<dd><p>Bases: <a class="reference internal" href="finn.transformation.html#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p> +<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p> <p>Convert Sign node instances to MultiThreshold with threshold at 0.</p> <dl class="method"> <dt id="finn.transformation.streamline.sign_to_thres.ConvertSignToThres.apply"> @@ -366,7 +365,7 @@ is unsigned, sets negative thresholds to zero.</p> <a href="finn.util.html" class="btn btn-neutral float-right" title="Util" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a> - <a href="finn.transformation.fpgadataflow.html" class="btn btn-neutral float-left" title="Transformation - FPGADataFlow" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a> + <a href="finn.transformation.fpgadataflow.html" class="btn btn-neutral float-left" title="Transformation - fpgadataflow" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a> </div> diff --git a/docs/finn/_build/html/source_code/modules.html b/docs/finn/_build/html/source_code/modules.html index e15c1a51a..4d65b4270 100644 --- a/docs/finn/_build/html/source_code/modules.html +++ b/docs/finn/_build/html/source_code/modules.html @@ -161,7 +161,6 @@ <li class="toctree-l1"><a class="reference internal" href="finn.html">Source Code</a><ul> <li class="toctree-l2"><a class="reference internal" href="finn.html#modules">Modules</a><ul> <li class="toctree-l3"><a class="reference internal" href="finn.analysis.html">Analysis</a><ul> -<li class="toctree-l4"><a class="reference internal" href="finn.analysis.html#how-to-write-an-analysis-pass-for-finn">How to write an analysis pass for FINN</a></li> <li class="toctree-l4"><a class="reference internal" href="finn.analysis.html#submodules">Submodules</a></li> <li class="toctree-l4"><a class="reference internal" href="finn.analysis.html#analysis-passes">Analysis Passes</a></li> </ul> @@ -176,7 +175,6 @@ </ul> </li> <li class="toctree-l3"><a class="reference internal" href="finn.transformation.html">Transformation</a><ul> -<li class="toctree-l4"><a class="reference internal" href="finn.transformation.html#guide-to-writing-finn-transformations">Guide to writing FINN transformations</a></li> <li class="toctree-l4"><a class="reference internal" href="finn.transformation.html#submodules">Submodules</a></li> <li class="toctree-l4"><a class="reference internal" href="finn.transformation.html#transformation-passes">Transformation Passes</a></li> </ul> diff --git a/docs/finn/internals.rst b/docs/finn/internals.rst index 0423e63d3..6b8faea09 100644 --- a/docs/finn/internals.rst +++ b/docs/finn/internals.rst @@ -3,3 +3,15 @@ Internals ********* .. note:: **Here will be soon an overview of the internals that are used in FINN.** + +Intermediate Representation: FINN-ONNX +====================================== + +ModelWrapper +============ + +Analysis Pass +============= + +Transformation Pass +=================== diff --git a/docs/finn/source_code/finn.analysis.fpgadataflow.rst b/docs/finn/source_code/finn.analysis.fpgadataflow.rst index 54befd447..e31723ca3 100644 --- a/docs/finn/source_code/finn.analysis.fpgadataflow.rst +++ b/docs/finn/source_code/finn.analysis.fpgadataflow.rst @@ -1,20 +1,20 @@ *********************** -Analysis - FPGADataFlow +Analysis - fpgadataflow *********************** -Analysis Passes (FPGADataFlow) +Analysis Passes (fpgadataflow) ============================== -finn.analysis.fpgadataflow.hls\_synth\_res\_estimation module -------------------------------------------------------------- +finn.analysis.fpgadataflow.hls\_synth\_res\_estimation +------------------------------------------------------ .. automodule:: finn.analysis.fpgadataflow.hls_synth_res_estimation :members: :undoc-members: :show-inheritance: -finn.analysis.fpgadataflow.res\_estimation module -------------------------------------------------- +finn.analysis.fpgadataflow.res\_estimation +------------------------------------------ .. automodule:: finn.analysis.fpgadataflow.res_estimation :members: diff --git a/docs/finn/source_code/finn.analysis.rst b/docs/finn/source_code/finn.analysis.rst index 99ebb7ef4..2a66199d0 100644 --- a/docs/finn/source_code/finn.analysis.rst +++ b/docs/finn/source_code/finn.analysis.rst @@ -2,11 +2,6 @@ Analysis ******** -.. automodule:: finn.analysis - :members: - :undoc-members: - :show-inheritance: - Submodules ========== diff --git a/docs/finn/source_code/finn.transformation.fpgadataflow.rst b/docs/finn/source_code/finn.transformation.fpgadataflow.rst index 7dbca7844..ba850d8fd 100644 --- a/docs/finn/source_code/finn.transformation.fpgadataflow.rst +++ b/docs/finn/source_code/finn.transformation.fpgadataflow.rst @@ -1,8 +1,8 @@ ***************************** -Transformation - FPGADataFlow +Transformation - fpgadataflow ***************************** -Transformations (FPGADataFlow) +Transformations (fpgadataflow) ============================== finn.transformation.fpgadataflow.cleanup diff --git a/docs/finn/source_code/finn.transformation.rst b/docs/finn/source_code/finn.transformation.rst index 6819785c2..6a5fcf29c 100644 --- a/docs/finn/source_code/finn.transformation.rst +++ b/docs/finn/source_code/finn.transformation.rst @@ -2,11 +2,6 @@ Transformation ************** -.. automodule:: finn.transformation - :members: - :undoc-members: - :show-inheritance: - Submodules ========== -- GitLab