From 26031b5e702de71cada6f2eec152298eb66cf45a Mon Sep 17 00:00:00 2001 From: auphelia <jakobapk@web.de> Date: Thu, 20 Feb 2020 15:56:42 +0000 Subject: [PATCH] [Sphinx documentation] Add first structure to index.rst --- .../_build/doctrees/end_to_end_flow.doctree | Bin 0 -> 2272 bytes docs/finn/_build/doctrees/environment.pickle | Bin 124382 -> 126096 bytes .../_build/doctrees/getting_started.doctree | Bin 0 -> 2246 bytes docs/finn/_build/doctrees/index.doctree | Bin 8407 -> 9307 bytes docs/finn/_build/doctrees/source_code.doctree | Bin 0 -> 2226 bytes .../html/_sources/end_to_end_flow.rst.txt | 3 + .../html/_sources/getting_started.rst.txt | 3 + docs/finn/_build/html/_sources/index.rst.txt | 18 +- .../_build/html/_sources/source_code.rst.txt | 3 + docs/finn/_build/html/end_to_end_flow.html | 204 ++++++++++++++++++ .../finn.transformation.fpgadataflow.html | 28 +-- .../finn/_build/html/finn.transformation.html | 23 +- docs/finn/_build/html/genindex.html | 8 +- docs/finn/_build/html/getting_started.html | 204 ++++++++++++++++++ docs/finn/_build/html/index.html | 38 ++-- docs/finn/_build/html/modules.html | 9 +- docs/finn/_build/html/objects.inv | Bin 3447 -> 3521 bytes docs/finn/_build/html/py-modindex.html | 8 +- docs/finn/_build/html/search.html | 8 +- docs/finn/_build/html/searchindex.js | 2 +- docs/finn/_build/html/source_code.html | 201 +++++++++++++++++ docs/finn/end_to_end_flow.rst | 3 + docs/finn/getting_started.rst | 3 + docs/finn/index.rst | 18 +- docs/finn/source_code.rst | 3 + 25 files changed, 695 insertions(+), 92 deletions(-) create mode 100644 docs/finn/_build/doctrees/end_to_end_flow.doctree create mode 100644 docs/finn/_build/doctrees/getting_started.doctree create mode 100644 docs/finn/_build/doctrees/source_code.doctree create mode 100644 docs/finn/_build/html/_sources/end_to_end_flow.rst.txt create mode 100644 docs/finn/_build/html/_sources/getting_started.rst.txt create mode 100644 docs/finn/_build/html/_sources/source_code.rst.txt create mode 100644 docs/finn/_build/html/end_to_end_flow.html create mode 100644 docs/finn/_build/html/getting_started.html create mode 100644 docs/finn/_build/html/source_code.html create mode 100644 docs/finn/end_to_end_flow.rst create mode 100644 docs/finn/getting_started.rst create mode 100644 docs/finn/source_code.rst diff --git a/docs/finn/_build/doctrees/end_to_end_flow.doctree b/docs/finn/_build/doctrees/end_to_end_flow.doctree new file mode 100644 index 0000000000000000000000000000000000000000..152488a5d25cce8ead0409a9790448550c51c038 GIT binary patch literal 2272 zcmZ`)TWcIQ6n0|o&6n{dmxm@ME+wQftk<QXq<!l{1HrH_Euk+(Xh)ir@QgH-G~V?? zpnWJLptq_&t^cQ=W@g9Ug&NGxIXX9e`p!9j?ELfZaI60F3DariWNt5%X50opjEaIQ z7yb^f{|q0)*M4N^!s^PTJoqhGq(bJ*a20+FV#^OKPo31Nvll(l7lZn&=cLQ|y%YcR z-TUeEY<%{UVq>Sr_&Ix*>qTfCc7EZ@nE8M0{t9(X$Z_KPB}El3h$HbpZ2Nv&<J9lu zQt>dYX4LOe=Zu_H4tI-p*_O<rZa+wKYAuxb?kQR{Uqe=vcfyRO*M?`&rt$+v=kX|r zM0_FkVn*@Ik0%Rlu5C$EKFOp~6QF0CFRmDIn#7+BH@q+wl|H}PMpfbzrHB_u{Wv;} zVH3fKKhZQ$@g?B<3g=JbIpDgpIBP9l!r~PQ6R*Vx1#LG4iSx}At5BkK=wK4((f5H* z(#k{_NeAElO4GpThn71h)g0_N?&y*ktsKe<zW;&d74Tc}MI=){nsdbsb=m|7i~@c~ zixR?KlZGJnHN@RktV|B+!0D7k*yAbE^-!0&4gMt4+9~b$y~C>q{vc9MRRvjQ+7tnr z#NxF}lIkK-*dpY!M#FPnYsf-6K~|5CjIBe<hN<5-ywt{#oZs*~Ts`!=g65sr^T&KC zft91KvMZyW?=e2B=17+;s8PTQ7KYOTnvpYLN4!+{<P)jN%7GNAX0Qr=RJm;Yc5EfS zpRXShZj3fWP{nd?fO9N0b-^F%%B@G~)lq^!-8k6@AwKw|33^vR^5gX9_vF`aFW!v5 z`To1NsAAn>BZNPSH?e?A0H_={3;rOdYF^Pf2ks2=LyQLh$naDfMi?)_66BMh$kg{! ztukB|xJX7yw3l24(f0|h&@6W<|4@Qj2dpYe($Np_)(Q#c8AbCL@UYeZV`U==?o_4a z71Lx{L}DHBWvMME_dRQ_q>kK3D;uI75+*I3<?$kIm4j7Vh;zS>%UCo5t;Zd>)0&Y? z=FR*_N?sD&iKC&?`o8;7Gowfy8Sc-7bEW-ZGFdDZ7v-%JT3u)}pD=zifu)@U|0H_E zh|z;MUI1kWREN-yUtYceEQ!g|jWkhnm*)8@jnf*VU2>PzX@o0sq!>9mLnAOJ!qw29 zf>s6TI;<<7)MG7tjzb95NM*T+HwSwoMhtY`!)EA2wBM1vRgNx+kaLmaA7tIhb>#WJ zEhxI`_X<sH;rXbR8<FHXr7eP|si5c=yl>N7NE@dRf%kP)qL{d_>aEf?{b!Iwr&48j z>eUoDiF3hLvvs>8Ud%W{W8NZ{;M^hFlQh@#n(%_koKS|XRxgE5ew(YCxIz4|nFnY< zut+K<!D~kxHFJ*nf)Ra;L|}!(76mpe?u(C@SZms5r$CKpSts-(`>~FoA4FyIEiT2_ z`cYK4+Y(@X4B~QX#S8q7#h&#C_n)fvK1e0zQB04BjV89!%C0H%zNWE5@p!Oert|Lg zYtzRY%FcSU7IC!7T05Pr#m9U!E)L`;o3YxHEk8uFcV-DzIeG+Z*kX<}0lS`FQ}1=^ S`bl<K95Zc4#vNGAF8%}A#e`G< literal 0 HcmV?d00001 diff --git a/docs/finn/_build/doctrees/environment.pickle b/docs/finn/_build/doctrees/environment.pickle index 79e8f26eb65a4dbc468def8398d8c886f06762e2..609f74b65aab83f064e115a591444b2c572c7cf3 100644 GIT binary patch literal 126096 zcmd753A`j%c^@i`W*^O_Wwar5Eg>-@>Gstul19r&nng1j&8nFZVi~Ea?yh^gdwNqZ zGjqWrR%|4VT|okx*a<JZ;FmbqjvX8l5<e#-I8OMPXZ&#N81o*4X9yUt&&I*A4Kewa zTFzEg=hW?%&5z$)b=5ilZ$01n&Qj<6!152>eA(rf;s1iG2EBTtbFt)i&NuqqPTTJc z$HAt3qeiRtxbWzM<83dFUl?x<uJC%j@$q17ty>-TeZSV|kArP<7rOm(gPvFQ=jI!o z&K$fP@PCynh=dQY^k5vU9Q3PH>4wxwP^jAN%r_Rs!TON9==aL~{32#&P4~Rt?>A}y z{lYj{G4O{YV$Z)g^gDw_w=)<&J5GeWI4pUiVHemLd%>z+zuWYyAn)>nhmRj02WzU` z-eSM8P=`mi?zm^iJ$KK%tu*s=d(`hPv_^N&JXxAK=@0vj*&|)QgY2yYuzD9X@P_Pi z8-{+n*Ybw`pxpC@b!2I6IerGLZ1OKwTcetfuZMo0xZWD9WbFZCXX>MNWl*YB;J-@; zPM1#)yM2G`2W#uYcB?$B`)wbr#>y)9hqd?-y&nv{VWXOmZhHeDQbsKVD;k}ee{mda z@Oz_5xjGn>=Nm21Ca}1HDoc;n)1#(PX#Jo&>R0{pU^GA90GxHzZmR`KCDjM(PV{Sj z->)5LfSSQ*r$E=G{s3L9?+=FkQFS<i*F!MZco3}bjM`xK@_e`7_J-tcs|Jh(3OmjJ zHFG<95fp=p<6zan#zKi6tr&Wh7Cc#f2LIBdwbgFTpRKgI)pJn)Xk##JbQbW<C|G&k zYmLZhw$``QuM4gK{~sTJd0fA-ep7uv{>Sz88-nF1E<O%cft#T_jf2a^^gdYC_glU< z@W=JT{9pz6mA4rGTth$0^X=jII2Tym@;VD6Z^4fqtOL%xmS2YUKnh>QzXxNFD_qY~ zmZN%PnvRFI-tz8#w>x~H^zP{03-1OUzQDZIx7N22Lj9ilE{56|n#u2gPCyIbN2B5V z?C#kC_%RpR5Ekiq{Q(FI>Sv5w>N8y6%9=m#jatKUzYB^Eg}UCW)yngu4p|&rtPcUC z?hin<uW+qRSfJgljX+T3J$`XBw4^rJx;yN2hkm*5&x5CQ(3LQdj4y>m2leiSGPkoq z^l(FOaRDRMpgb5Z5-$hQNLSUN?Y6M}#wr8Lg<OYHZcfT{d+eo=pl_((Tqm53QPV6} zAheLZ==u6{zTYcf@cJFlV9d<s!Kl{*ZyqFXo(+j@0lBGtm8;!$yW1&4Icz2Ho&eWE zQz-krMytCJ>60EoU=ki(MT)`@3QeXw-|~QVsN4-b(4p5~gtpxF8sMGFdf<WRzrmFq zh|ZuO3h(3N$MM-FekKIR7vK#RZhM^`c;=uy>Vv~G!s<?A*lSeJEsifyp$*~ha$})` z;pbVdyOLXNWSgtQMhp!X{;OQ`dl2xBTuzYn`|G<Idm}XPdKn5-AP{-2R#ba4J@=mn zJw;(4<Yrw|0~$pn{@P({P==P-m|u(@t;0uEaG?Hh5DBtw06H2zKLR(4HFuTptn88Z zj)N<nKLG8S)OU^eK8()TCbkA^q9#Xec3IPd_`RCCIczo0Vjl_Ggg{48%^xw|dWx?V z2pH6W>({Z~>1h;O4n4M-I_1lP<@lTe&sr+M5x)M(`X|v^S0&HNf)mrbuzX_(&7yuC zmtRNa!@dgQ8x>@RB3Zz5{LYx)a902fv>JoD-ycUc!Y(52BkMPC`Hch*eQ;;km~TLZ zVAZH|uG75`0W$qTmAa|=FLSNcRBP0zjo}HYoLR48k3Q!374V}4DCI|wLhky0+);%d zMR>g~Hj%IgqZjo%>vu6lR$J85N`(T}#;{ur{q+h4WzO+2q!nSCi;E5*T>vHbMEcOW z%g`dBB}E>64e{0X!sq1+jT$zH%eWRxLop6o9`<aFPOH%YSTYj79u535chj%%<4uGK zNl&%kpdf}iqze27(j|x)707hJdf}VRROdp!ft?@*WavfKLh{mh7ZmndOtAi@`t4y1 zq@JGqE=nBu#Z|%!!TC6z@jG(9;A%{&W@aF6jWAY23Ig3HV{D>wAa#FO9_E(jBu9$$ zYX|^hWEa{vk-n0i%zNh>Abj|+es_JA-quU?IsT73>Tl-q8>u`*!oDZVcP&Fhic}u; zYLK%*_eOm<cLDTv0RC8kZW8-Qdd!uervvSFJ6;PQ(FLN{S5qyH(P+s=l>!k}<#*Ug z_IyZt!1(9D4VL}lCqrn?!bBIKYM}~yt;R6)jZ4f5zrakk%pE%TE!DV&S;y{_Um&UI z<raQPxg0)^^SR}vA>?L^z^o!G;P{<^@Aa#7%y$HauvJBML(4EjB53%6;mG%s#5-g* z_7Gr}d$8~Y+Zi1kbH+%)EL(Rp?2Vv9jdPq8l;eclv*SWX4Cw_V2#^h8XF$BO`MAfz z4k=1zmz8G1%AxW|<RrO}1>u)!n_#l6tTKd*K1Nh%84$-qrDG0Q<EQ~_B{pGEvCF_t zInp!ZQD+G05@y%^sGp+>yUN(c;bG_x(6tZiO$a|U@(A8h9}ati2j}LhwN7(Ts<yhL z8l)6`zXY0@^Pu2dt5F%ug|+5(l<qIxJ4a)eVW~NI6f_SV@SZdNTW9wkJ3V{s*wOM6 zXO121_Tj%mT~XhT6jfDhh*$|@9QKvV&Ta*7Kf7)0vnk@rwZ;I3OpDZ^E<5`UEc9$t zC<bC~q8PAo!H3b)#UW-}XyoxL!K&~P^`)Dl_n2o>IC`b|4j2bh1{A#;VV86%etuQ- z9LJ5}cr5G)Zj4_g?SAO>;VGs89N(`*&0PeST)?0ntnQ(*;R&Zs8~JS%A}M>QZwprA zAi9L5qLJyF-c~yM*t=hl#-j8<8IMBZF@jh=9DC$oYZ;&8Bt6;0Phb!azC&Rs%;Ik1 z7udM@zuJ)LLo98L+MO`}3%SK27a@p6Y2giAe%S4`{PTXR9FEv<kil8!HC#Xqf5cCS zDRh9#IuO&*B3E-YdWGQ>QbOod>D2~)1p_b|1wa^}$6NTZ5Qd{pUaSS$uC}}ZMrV4w z3ELdxCe?FFV!Jtc(Z^vw#Ox!NQx)OOu+jD*?u4QWFK|i(6T%}a)GA)53OyeLA9`_p zLM42Wun{bK?)ySht^w1Ay$UoNaFXTdBrtxbUKaiBChy4Qk>S^4=|rilwW|kUla?>{ zV9kxt0J!OG29IlW=DRpCKwWm^k4y@($(x!VgVMn*Cp!KNu<g$XDacHBekPt!S%0iC zsQN9)E<rhi*dMQoDCqvTDSD+DHF{z6pP1)FSZF@sn3C;#Z3NH($^4<$Xo1s=LQlf_ z!^mZ;b?noFRd?>0eb23Ty)$gW>#0b`zkm|M>*b>k4B@zWUrq0@^Nu@@c!Ys;2|66* zNSz8Nycc2e28M*gVLW`fuG;Hyf36Q1sm^99P%Fbc5oLJ5Q50*g!B;c_H@&?UbPmS% zTRn(komw~=hcQC1CVoRv^6L0!R1gB<@#e3Ef%2N<b<IBy!}bN57FpqUX2H^NvFnp! zA-QOj6I{MMDYhXg#)(@DAkaBi0WHA{0#4PDzt1KBn-TyhMx$2~MBi`YB!m3^x}+|T z(xaAnDTcTqDbj9qV9u`JF1H|>Lkgd$M9|m(!XUK#+F)G&#TZ23k!N_smm3obVJf_a zn)DN3sYJ}1l2SOS1+zAtGLN{xcM?tnt;fZ9!r<8iYfFMfVnf2ixxvP{(V#z9X>{i5 zjnS~tN~#E&igCHl=D1GuBB?c#5Q5$ur{&7fBw%_I669gG3&R}_Oq;-w*fEvi@n(!w z@|$24#yyBo+_)((qY{S9GkJ+IHp=S4q;2E#Fu1|SpwQeDKBu`Vnu!W4Tp7OLv3Rhe z1Bw3mC_NP4X?f3P%pIuDfkq99D^9Vm;68}M$Te61WGc6Pnh*g8f&?yD>$Q4yui`^L z9LAe#qk_>?Tx49vxlVm8WMC9MZi)-Q3_S!87zv^)c{mFjjc*fXVBQqc(jJV`k|0B} zAgja0o)0Sr@G4l7U@#wBA~NAzSpy~%`!E)b5~t{OqXY8`Fn|F(<|YcBqfsST&&eH3 z@d10-^#)f<Ptce89^}QrO2|8qk>kRY{)TYnAnuY@oeXFD<F$imDWbjx=ShRrzy(iG zz6yEi2Fk&zBWTcVFz7hAksf&9yNiRypfulG@L+W4&9}N2Km+uW+DvehTvI7|HN6GK zI|H8PrszqTD_H{)NEmX$JbE}Ai>(T}B%VM;T{Ak)zXcm1hl7R$*(HooiH~SDKTHnR zQ{jl`aqvb1@e*j>_uAOGje{9e0ZG)?z%ub<I8KL!s}3dZo?%3RmbyOFe*CZwQ{ONv zJj9pRsV^Jh<N&;jmZRc|u-XKVZ&0c<z4IPVevn@%Z*iD0KC&#hR(alAgw>i3)=<gd zl7!*$U|7S)D;Z~eWcMhzChW%0Sm2I4;2&QKu9BX^@B<8V2_~PrI4_I2X0RH>$GI2$ z0cyjR4rv3<U&AaLXy#IIEsVyzb7dc@w91fF;G{D2@2><`_F&!_0~K{(!AvxUyKvz` ziG?b4`wMdrM(3d9U=G%9utq$kj!omr{(M!ycteCifw<K0hx3Gi5f|%YX{r8(Mn@W4 z*PjhGK#QS1t9%iC8MT1P|6o*+pRTQYuxdb~14xI1EflIjD=<e3-Vg4JT|*7zyjq-e zjTS>-C5l#O>Q@ALO9sLEXg(8c1MQ~%i@}uyS&k-uN5N{CZKi-jX5fZ$Xzv$3_^|_@ zIQ@8_v>1Nz@89^Vna!U|efkUkP;8z2@aw0(qlFTF^X=dK580uDiaow@+mXN+Gx+uO z>z~VQ)m(DtN53G3DSp`d;=gG=yzH{e@YhfM)i=NX&F0?d*Y`HP@0sTA_}Au@r<!|` zU;o!Pnh(amuG%%zd?5Mtffb_w){1b12~#mRY^rY$)`dM53_5WokY~)HIY3Ce0^`C5 z$L}4V8gFej00-mmjiu5Y{2x|}!-ZtXilL_{gTIeoYc|7DC8bmp>gJ#|!lFPqjNcth znXqPXTUrIk+i=ZgF}qY*;^JJ$#barpV&t5w!@|U15mv{bT@A{xlmqj`=>J6VJ}U@A z#e1wO%6zv%zEx%5<kTF_47V=yA$9Zn#M&(i1uBJIA7%hl;!aZu|Ds<VLCP(dARSKR zFE}&@Y0Df2R}bf+<~YLbEZsLZfQhYH$jQ#(?CM;%)453hlusN#{?_uT$B&k`m+vd% zn5wdaXw8@y!)lN__*E{FN(=^xZ7lLyvmNT|mejIdh0)%m5{&YPIUFZJPs{$bE47&9 zF+-T97{byO%p(x5kJ?q^4jp<LSaj$?nhjBZSgjL60b9lr(1g&i4nA1#wrT{YdTpF8 z&BZ)KITCb;&?!XjzBN^ni=A%2*X>oiqt1|Mq^neN8du%SL;k%8BcDV!`%-z5i~@dn z9%jW*6zUNd{EpxEV5J4QeXZF^X<L{Z&WS)I+}~hF!05~W?=509g}JqEAKIevze$+w zb_$ftW@+6WcF@tfJ;(Z`yTlt5vSdWa!y4S$C*v_)>*%7!dU+Hv2XlAe&{1S&9c)u1 zP^w6_$bqjkpojGOIN-oWYV=<Po*EaFZDS=5HVAdN!%&;QQjMEbizwLjQM1`%vStQ# zuNS5P`EfAx{W$+nSe%Cti1|MZPGRIpoKCFUdac<DT_VRKCWG(H)<iPcgC2>d8Hjfm zH&J7jqM0<C@3CeKcaV8K80_>Rhr|U~8&?wqlbrftYqEXla$q<eb#QD{2Tz^652{g5 z(X=44R~dBs71GlK)&kQcA~Z}A8SB2*d_Hu%n-mZVe7OCHNaTdY-CP;|t@Qo#Ft~>e zIi2(6)_ipiB!Dy?XPs#00xUCPwmF#FfBY?kthRP@uUUY=(S!SmKz_qlOArf^OS$)q z1sFaPGHlcc#(0>st)2r_l2}H2VWLZK3y?n@lHZw{^2)h*r7;9|4B2^&Mv*v*%V~XL zJ_HGW&4<We?(|@SjWX}RB`n>mxUAAxWKytmvoq?Ea-8bHx-x8Vpn5K%!O)LKevKYT zNY&LbV-~wSRZ>=m133{@l9<W&7CX=5Qc9CpP(58A*gfQ;)6jg0i2I#tcObEZ-9X(k zj*}@j=LoEhF|rgTHPb^b<Y5XF#;Va^1y|98(aOYncBl5x_Rhh6aLHo#JBTFb!jCxA zj2dF22XhqB$k7EL;k?#wfLY1gT)dS4U<RqxUBm@`tp6I#K4DC`7DQ>Z7id~&7V@v^ zxl#}I8oUNmdyNk5qOXmcL+Hqw7vLY9RSMR_CK=y@Mbp*=Z*edN6q>!FF!frnx(%zs zX!@|)2&x6k!-*=Yzmn!NY2ub9sA%RBJBC4trj}qihf3fUcm7ObP2al^Zoh&Biq+LR zd<6m9bzrTw`3D4l239X{9_&h-ai0n2G++*lsyF`x%gC>Sm9(@w95?@ecsZ(gusoEk z0ppbN6%AN+gxS(nw6sJE!>~$4Tdv{hYS_Y<{HTE1XhX%buo-^U(1SG~+*TfnF{;oE zTl0^A5(`8e)ekqn1y4YRZzF%#(qch0<z|*4rA+fX0MJ}}1qsspF8lxint#RMm%(G8 zv5fyL=RYgyW?{x;XZKfoi-zvb|FtHh(U7Gq}ErUG++Ju%@G<{oF^a=712++$oe zGi!Lyyxp-x-f+e%hc}qThfPZHjE|YY>x4pQVHqth#cb|cBAYnblEdb00tdi=g$KMz zsDV72tFQq3mM8#@{c{B1<wUvHi`6K_i_DVD@5v?div!afe(xal$@~gyjAqttE3p*M zEl~;_<>W}gEek`unPJ0w=B>3v-f%T0hqo=XKV)|1@lI`a*qwzxGY4_?S8|55Ld@m6 zWG)ML9UPAT5O{`gj7vv3tZy|rhnT3EwQXOG#rr$5c+DS#-_WDHm;b!Xe=hN#AE7^C z#}Z0{%U(H>Y&^uPxihE36?;kh+FR!9!$1pq?zqcv<qH?!a`@s;86{@;5p(d9OXL6- z{c<?C0_MzQU!*5Y|6eVUJ}xun&|i0&cCpXwhXIMqhxCT|`HxHEXB4b$bzwIce#4NY zhm@gl28AgO=P8&jG^x+W&Y9Mfn%Mu*ia`@Qk|y;A7@}zcu!&)gW@MTeRA`;Hi4B(< z8u~b`&o<GkC_8SVbvd&|J=2<OlO%+Xkzk7ru6R@a$~ow|$_PHy<gM^==Bgxml&r47 z&GKbfduyi@+Zt>Pw_3oig)k%D9PPA+wAEXH^~8EgWoBkgyxAbF80DODPAs~4^Dogg zD6jlo5MFF%`FSM{9e86J>_S)xtc?1NF{k=#c~c<e$MwS;Cjx<6Ci&l-Nrp%UH8J9U zCB)`$!5>o!zP0(~)Hh#CdDHx6+6&U{y3?adw79A^9N`VKw|4oIbR1lH8*Ctn`3M8^ zUjXM!c$G8Z5aKeZ$Pmj3B2~4`-v(kZDB^F{)7;U1(2|VYaC1Yj3P!ZFnf%%D*5m4i zlb2wpj<CfGf2upt@R@N(NKzN`mhnsQefX8(h&b8@zqPp&wQw)~b3gv`0RHn3{Nuwg z*t^JIzdiXq_#X@-J^r@rc(8n-)vdtxo|W}R4fb@vf2|LJ;|HsGmoseRIdWOBmIGq9 z(}Ir#LPwAF3EQbCK*KlosYd|N;GRDeUrsyIj;vzS-3qL_HSLhR6zoJd@Z;V%KTL#J zLOf)o%ZaPh7TGM=AU7VP&!%T!oe4LM4&+9uy=7jWbJmb$@PmfQyAWqFi5rKlDruPS za3&l=Bn|VeMIoMnilQmpjoLgJLvZ9R0FiL<MTj6p+?2S8W?#}mf2yBtE$V0~vouoo zx;c)(Kk95Hvxng(E||okuVJL_wV628*qN5*RPQH<)M)?L-I0FMSwc%~=5?f>a3-v& z_T$;AZQcRzP05Qx$W1y=au=cVJf68H^CkEyU+w*xUj}~QWBsXibj^c6q<IMb3GT}2 z-=e8g>gbw>p-R-v{VM!-;rPLUkZrT1DE2eNMQXSy8g14>p2<Cl(xZtlScva9>%q2h ztivob;zH}o{@j_a);7Lf6e8(GrlkLyX%Z%OzG&y`3~NJ9GIGkYm2O$#>aDg`dZU<f zlr)z0B;*awtZ0V2p(w=E4ad`9u@-PAp0dZ;Xu~^Ydvmq3;l|vvWg4$X71^NsomF6K z&~0Xe8br};`<OFVnr-(Kg|N15;T%j$=f&(R(B8747M$g=HPp36L+M7TIdh;H#UqH+ z1a0E|&mB*6FU$<PGjvYEjMstx^G97U`8*iRz^5!TIKwUnLfcAgmsgy%Vr!Q--v$SG z;Iuz+KkIei|I9sXj2{eUf%}y4*?XON(k%72i$WyL=Wi8-NXBREFB8aY3P2=W@UWr) zM52rL6-^P4i)j7(^&2JHERBmnt9eU2Wc-}7)y?ezSN!vajGuL;rTO`12qHBir4Jcj zhm`maoW-+LWssc`|E@D#O|9Q33XwFKud!v)=Dv&S|3NuL5?3TkY2R%{DU;~(!JcfO zv-}0vS^Na-tndw3gvGtbrj?V)r?u7+JY?+Er5z5b^6Gv6dS^a0msndAV(Kn&PlhGs z@9-kyNsh2RyL!6ucR6dswta86Fup9AZu0HU+-W8+6@{3($+aX~vZ(f!8|z!0#j&;5 zt@-xS4fM1#JDPz`6@^d@R3JG@@+<Cx3qT}X{8G{WCd{vBwf^<XuME5SL<eln#_81i zoh@YcITSE2oqC@$EzO~RgdqNArc)nx7SB?ZIqB5TIMdbC`cp+Ak{0q$*fNt&r*5Fm z5BIH>qR$bHon%Hi4z9o9ETXM-Zj^$n#Ht=tf6bW<%~-!$6k_Ve3irFBu?*kr8|}v1 zHA!h<6?r-_s>DY8b7#?Qjd;6mM1u&rJ-_YDk!H_t6@{3(J$cHWi~}?J@mUU$O~fuG z$SKSAd&8>93`exyCXlE1HI{Y5-QdiMX1FayA*OCPK4FTq5T8+Dv|4z=6t-9_2xAF2 z%_1tvHhaujO4~MfliucHZgqq0appra*n>qOrfx88L?E>-?JZlT<}8k_Wj1S;(e2?m zQ`hYATu}(s9tCpyWO%?iWdVqUi&u(<@NjrQAIZFa!vmWSZki9pV}yU;Y$mgxp_F-J zgum}hOY^E9C5QrJgu)AMPTO7ojkAQ7+RWRf^YhMxHPwDHTeXwjr9<u_?b69S57D?y z=WD?5>$pwl?woBp@i%VzKAqnvYMmsIv2~Ud$Ueaap7bbA+>RslY~l;<)GmjMOWgJ= z**1^tMTx&Es{drq>351kBpu0=^e=vhh~FW~2XICCo@ANZdEiZFcG0(s<~nS&+oxtU zWn2~=A*M*6XD7EhbEE~kTZ%$V-JE>*st`=V6XA@8yhSx+bbee^noW4vSz6n6cZ-}% z#wLvT(2aM{nHSA?`-?(M-FUnjlo*fC-huN@q9Y^X6C)x6N$rwXgSa}i%l!Im;I^|y zYz-{02H8lao4o1Foo4cdq7YLzId6AJ6eFHYXf(3;sW}<hRD;d>erKs|&3ao(yA^rS z4f#H2el$b=NKuHX8&VsHOHEUI%NF{V&f?fwXp7lGx>5eQGYgtg{#j87)hGq>(<H^^ zv0VX(go|;}EG-<X(@7Dp-&kD?1*u0!h;G<C91q<8$k}FQ&qI;(2JXM_OiOdIZxTd- zfqT)tI^yU<R3Y3Do9yW4M!bH_WQHZ0DsvY1);iPG)ViuDMABxK6U4-~&ps@qrmAnl zC1NS3;~INR-Yq4hMbgHrTr4*7c4tjlwwGX!Ia15prBb=n1A57sQ_U^zDhe@mw|F4S zE#h=nI(FIU6AuYE+VMN#K{Akchd^if0OtsaJ>qF+CE0q!gEk&v7FKtMQ_gH^?r@?g z#NQBikWMI%j3@<lOLqu?jP9`Ltfc9<gCwl(4(FZO)ZAfE6k_V`aJSH^wN4{Gs?g{G z^f^O#(3l<&w7MJu{(-Y5Y;8Vk69QtcbTj{bXU;S;|7cN&shhc!Y3AfQ1EZn&(1)~a zKsfz0s?DbUw6ivBO+9C2>O?Bt*q?IdO*8f{6or_&v9*!26u7mwY^|?5i(_l8w3!bv zr_?R<RcC%Q3w@<1gleGzBjjX|&Ev2F5D6DwFFG0w2ibIf)$2FN=7mN1q(S5Pam{Dq z!Sx&0PG&@iqUH^*Z*r!kxz_arQDAWW`mBoYahA~Bm^E$Yt%^VBOjuLx{n@IW?5a2k zD6ERZ!B6>D?csS&c{lc%4|%GAY|VN2XWFMa35Q*5&sjy6+o`^k{&Z23CLxebx}*@e zi@oBnaVh<Wob_Parm~mPUv#FcHL3R$g-E)fDe0f{QpE)gH<d)0rIg9=+Fx4bvv6kp z+3<3ks5+-QA9GfRttI8eG>x<5(j7hR`Nz(@Y1aPnq7YNJHXnGQsztuOC^D5~X&$AT zE3%z&87->HR{j-dHP~ADE@}8-<_c|$Jn0txWoN!L3;(C05L37CHX3ItDv|GGimW6V z*ytHp558ZBE^~@1vU&g5SqHY}y)(<avMjoF|InE&&APu=6k_Vu<&}5Ex(jsAUMsSW zWLBFBY|d-eO)38m<l(28dEJhio%zx1xS=S-)a__&ZOWx(Mtk06YTi`wY;wO{RFe(6 z+gS^??KCqCE7Ir&zSo&A&A>Z~LQLJjZ%(ySnJ?RmY$UZ-<7w`pb>(Vo+Oy8`+nRQ3 zRtRR(GDEsu-{#DeX4khAg|N13;aLD}@=h|K_LlAR1J3f;+DZQANRF+#X<l&VLo?00 z2qJafW#Vh<w;vicYJPMm6)bPk2~;z(q{?ZDmUY-RA9dD=t!?hOZ2@_Yj-&$KX~AYz z<vrAKa<uD5oLSP$^x>iqNelY1q7ccn13SwErX31EBwX-RVF8Fl7uOce2*debx*g{A zoBy@FG)9bFO+TIr{)V&V%}oNO&YKGUnlmlU*Z)6)NDWDUt!GlLxN<UCwWi9PeOAky z>1t~IUQx>=&E~sonMuzX8Yd%oZwVfWU*bDojTx3(Rqi3SIqTB0IRx^Gx!f-ZH$#O2 z>HYZ~&YWphzO5+4)UABKDTNlStX+m|H27{y6g+s0?^KRp*!ahs^<!)N-B~GimYljD zJn77&<_Cw0LQLHcc$Z6h;|Oo-j?5<ZX@O&1Hu>|;s<1VA$<pMZNV=gr&a7#MK35cC z>W02Ar>UyfkQ*(Y7c~e3W~}4O%p(-G{fC^jV{7~SZEdeywyrzD2b_7-oZ!`>5L0)8 zojFb*UCkcZPHOY_S|IR}1vx>4!S?@oXT{jsf0w2GB>{Egf6|#j&G?@v3Ndx#Yttu^ zVYRnxvM)P}V{5WI>`bN`>Hl$NNi)(HibAMHDlqO%hR!^+Dgcpi@#Uh!h;ZmkSCYPd zLubSFrJ@ry2k|I*%lgR-?NGqHQS#N!v^0m>L=b;7N6Gg(i)U`anksWf$vd3sYHFP; z3X!ysyV)|69wqasIC$Y*sp1V9@iADUI|pfnIJCaaSvXs}TqlLrgh@S?zQvgb%|@q- zLQLI8e99b&kDtqz@p4C;<2GG5!yDe>vS-!8Y_b=eWwkY#d?a1WN5qD1xpz6UqFL@j zQHa;ma^f~>qvZrEo654`KI$y$5)3D@p&RZa&a7yL`*2Z+sT+=O^dtAh)A@`BODV&K z`j5_{*&0gz{yk<<H_$ISv!EI1-xY;;Jq<MU2g5uAiDlS8zw0d85)6dobpw6FnFY;2 zUn>eRbpvVRFe#(Z-m+2FZ<tcH9LR?|Vyn^ZvDTToW{*`xAyj)57)>PuGS1=)KqOqO zFX~v~fb3xyucQtmCcgf^1uvYMnVosOQ^SRH_%m~`)x98HLDhUQ9+Vwatn`EM=Gk%c zz5M58{&R`{{0RLqw|x}SJSh7esKqY5-<ekER9}rD9xDp*r5IvQQHU=91YDK0w~#pt z@1HSlaT3!J^LI+)Sl;KI<uzLv<<7Hk$C;L9;d2C$+Ft%z7pGry7SB?Z#$k8TaQ==n zT}`b&TofW{I4`qhCOz!tZ*`UBD$&79)t2vdMm=L<<6N6V(Z6t3hpi>=kp}7(Vnv;A zV(y=FW==Er&lZK4y19+34YIl6sCn3;U2gQ?U!&2D3tuLTvoZ+V{<oZUV{7~S>}@Z~ zsC&SFab{8Tfd5<+V(K1X++kp{9vE*hYz(V)qZ9BcF_{gFm5fdx<FFrm*I7fhe(*p6 zKVS}ZSNIEOE;U#9v!W1FcLnQ)T<-K12aUGT5sWL?CVzqpiX{|wgPD!;K&xm5tmQ{R z<_fln!H_@Q32t`gQFDSDi$YA@2`swsZoAiL`9|wI*Ji69a8`$H<9A2^SS;P#d!3on z%>77Fh^d>KPio7K+a0*Ydx#$-;*FUtZ_)1$jK+V=v~@vgS%k&=7Xa<70>|D^ch;7z zH$39d6&R$}eZzNVRr8HXQHZJg#@>8;_I+>Y)2CbWFs%WLDSb#08eMauxZe_wzXd}; zTqRNv*+l|prP;d3K6@8Q6JB?dOU~?SZt_x5h^f0te%b&neX!UW*5&+Pns?1l8zK<n zDB|PJ+OhQq`?Miqkfqd};Afn9)STd_ib71?3HYMrtbU}?8BjNp9IIvQMEG35d?4sU zbR-TAzu~MUTW653S<Yut<WYBsUvuVDbBJFp3Ndwu$ZybX?;La;ey`PCZ2KMaN?HEs z6j7kV&|ugV{@htVwyu!5|6NLY6ghQ2__i~Xnjd_tD8$tLz|Ml@-eTwZa;@KhRMQw1 z^5Y9T0^)!>NI>igZ`d@gk){0v1G$1As_qLnICH7_!j_^CQ}>1ZOd(NFuitGNJ;BbQ zAaf*75MkI49&=WYZAh?B6=X4WFWBSEqviz<7KNC)7wpO%1`PaR8RnPDc+IKN2l5>W zAkHGjSqX$apysR^TMxLG?gvmlk)9QMgIQo~7WkS)+3=rH%h&DiIdiDl|GA<NQ@4M9 zX2635ij!jdl?Dv?6V8N^9tU1=R*<b1*rx`Hpt>Wx*O^Jp5&m{jh^adQU!IheMaRc2 z8>2vh`WyiMsk2IKO~1o>_8=BbH~LRHv!@yTCyGK$-RRl|E2&j$Z`oj<cNWLiV3{Yy zh=E%-)90L-(#-VPq7bT?k}XyF3nn2KxPgYX%bPq3KqOq$i!N$~+jw>t+Qw7#rkRb0 z{NWHcs-GUh^rByrw`2Wyte7>MCo^O~>GC$~taPTOdD9g|Ard=YRum$%<DNoxEW90S zIc~3$t@rWRdb^xuF$WElDbIS_ooQ*-D-lHMR;$#liG`K7{+YTroM{Z`NTNq2Ee6Uv zjuWSyg|t*?u>Q6Sz{_l7KwrG;q4uORWlg=ua@2dr^2;vU_Tu=3@z&;_fWhmBo8N*z zu=(=4@CTpf2i9OEtX9BG*0@P7BOeRB(eKo74GsU`(#9B1f!?^lfv7wP0}(!4H|UP~ zRUZzntocyN53X!<s;yDYpNCb~!T4F=<y|05^ZW6i_rO2mVbDjG1*@uF57%G-YWYH| zTNz&pR@NJ}n%^0}608rg!Uvav)tynh;`bp49sw_h)f=GE?X(uhmqHcZ4vJ|Wf`5YB z(oceJbZY)Z;q2!d!k&ec?m6f%B${+iY_}zKPERhK3vQfC;^MBQZ~;4A9|S*q9izh) zgML+t3C&N%k@e@CMKK2g6e%yV{;V@Ct?B<XL8R+$qD`M<5}Ll&dV|$)Ul7b!59{M2 z%d;Bmr6o1i+tV8>&pHf*=DM7l>t~AUI%%$~>m@amk1d4@XebX9YA8i>$#thGTF>mq zXf2Lqn!ggam+v@BWNt4gSzdejb7xvwd---zh$N5vR#6DfBS*o;VYga_t_k|fVZQ<0 z9(KVEkpIXP%_ja?)jWrPRy14utBrqFH}OVC_=EQ{99h@IbI0Hpepn5E@T-U;m(wQ$ zN3LpOQVzect3I-fqAUDD4IjCD6l_591Ha0hBU0x_^Nj`J(IzN0?E8K>>{Jsjv6J43 z9p}CH&;9t%1NhHF@Q+UdKxXk}_~A8?arp5yxCqrFzOim{(E~AP=<|u=XUC&p6Qu>1 zTJ-(OsL`sCs*w1rp~_w(E|Oo!PVx)+N`4`O$uHy(f1$=-BNp)&a{L;xh`&(PuhFFx z$uG=L@E0ogHA+;HUzoAPzed4&Oi_S)QsiL#>NwaOWhBzmwY6^BgERxaGe!Y}%d7Nf zRkzagt3%X$b01JUa@i<YQ>}ZQ1s`Twxk&g^EV8=V7<!Z>0ajQM>V*%<-s_`Zpx1eP zG77G!_Id=luHWs#6!l`e(rt~Khk$Od@-+YY;5f`8zXMN?2W#L6&Cc*d|3nYcu?^9r z&q=TEwFmIz%IL}7{sR79SM#eacp2tzt7_e9$7}oWW@BS;$`{{W3f7dXb+9+2oRAa- z>&srJ+u5Hy8C8N6SXt7|vL^oA+T42;X0^epurCmGv%Kv=-y{@TU-t%O|M?Md#nrJT zULv=+MD6erHN#8f8keXMULwc1L{0D#wZKc%054JdyF|_J5;@2va^*|Z_8{quthlVV zC@`@#SdPmEV~PR6%5dWRrEz!!fY<R_uqAa+8g_f#R(D}>Ow2VqASM*z6D74mC9l;g z5B<)d+aHwYckbXy!Rq-@r%D!ps(c2QUKKL;a?kIF)ywms{1Lbzk(CknLKq#P0h{UI zyg#pRs>F*VdZi9@GZ1ciKnwnq{fj;De!o`k_G`Wo==*53B?f}^)yDi{IlTQG(L$ah zRq>4)S>;P1hEQ1+c)dhYwgexL6vK-%Y$e!018oZT3H5z&IM{;?o`?e(a<PcPqY}D& zXKNZl4z$cZ-$7tzF^e%?n6#-^GQr49+?Xz<td6UwV71%#OBfr6i#>l#jWN;}-=-xM zC>?;3XX28<3Wzy_0gN>RK5*Y$xU}!^@x7<s#^}KsZwMW8Wi-SwY7pLwEpibPfqExT z9Nl}$z2d>6C-$DfW{G{gLXrJCh10{w&uqWXSdANFdNnh#yjnYrwDMR?kt~ncE+etL zTDy(4GVONe@l&Y=&vcZh)AgUJ6Rc-8KyEd&1#-DeF+nalvkh{q6)*yHQQZqLJHu^Y zW!oRtyESZbZ_*on(&Q?Q;e|#Gx^b-<UwV|%0I*ZT7#c+qn3wA75FEoZATV$5bq9k+ zrRA5;d#w?6GSr3z{(1E-17*+#*`XJRp>z!H*HbW{e{FPz@bQ{Kgj=$d2jg>{RCbL9 zbW*B-na+pj<e99>hpmuA{zbnE;Z^LbnMf4b1q~X?mJH8ACZz;tOQH(Ms{Gc4zSo1q zMkXc139(S=7}j`3tRZwJd|ENdl3J-0^_RN-9yc>4(JWQ#e)U{A$>YNNDar%LiyHF{ zlZtu&K@MAtTZL~zAO)#3T8$y3l&XaV1EdQGQq<@YqES22D&((mGq%Totq`?Q)r7&B zM~+0;wgo-$$UqZGXxr%`AylIS8~wdj<6S0(__I<AhCmM<2AeVn*V7ejWh&%`llVAp z=}6Wbg-D#w>o}a3TSyk-&^04EjJ3r=7z(0raY<K);&e5SBWR+A&LF&m9n-dSYtv>m zzug-y!f?Z{qAw5qi?GU}HV1pOj(>ss1r(`FBU}y5N-pAB=ftW}!MGVl$D!-!7<|-2 zj$Q}e`7qrU+q6|9!cA^VZ$yYPiAIDtxsAxm`30mD=jS1Hj%MR+LAqtGPC5oW1B<+p zOGQ27?S>L13g&&Eio-cOIIbiQmU=@WjgGP7o)kyC&Xo|xREa;8BrWKa=!pj%2Q@y? z%O!5t#B$2=hgrmEFzmL=-Cn6ZYQf50bZGSWL*+lXjQ&USHIdT7?mDGX=@??1i7}|E z(Ao2Tyl`GYBdOF@G>Q|7V*7cN#j@k1gz+COg9Fksj(;K9R1qI@LgX8w5L4(;RLC$r zv1F3$NbLdQCnpt<8)KiR;)Y#=C9W_RqeF$wAPp*P5Me#Zv2uJt@h6r+0=Q05c;8=W zz+eKBD3mvHxiGDa8H`GyP50ANm^U?`hkZj_kMA3R9X*&!;Oct(*`Q4CfWlRJz0zrz z*!S81iE||g33ImmZDYt#GHLSEBv5mj#4{72VbfIJIuS}%P3YN)kg{)DCnrKLv&n_C zZLw$K9j?7@uL{TFL&hZfK2NkJ0aGkldMi{r8CE;y4I%bwUKeItMoNbIIsUa*QB4jv zRzY{4Bc_$l9C8G;_YVHV$l4&{G<awnVOW=GT~WC(#SPIk1du}L23b<sd(`-<M9U;N zh0{c_n?wb3{2{fP7(#Th`DV~WhcPv=T3RQ~w}TogTRBEJv84-Y?*XYoV@?~T7`o7E zFBS`(87aaMY0R&*6ar(c^W7F@skGPwXD|7%DhT&M)8bmxf1Z$CL|zO@#VGAh&=2EM z(jggL$m-rXVFIN}3(knHbT7tBY$T7E{FNt864qL!)g;^_AX0qCq$y$+f~$eUew*zj zQd4_!JG-abtb`i_JDBvUa=mTha&<9f#3dh%*4atZie@i)%%zG}nKU_!Pt?+cjQ@2Z z8ikc8D5^y3(~y*RSd_s>!J6?5y-K<|4bmY^Y$Ci?sZyPI$U)O`qF)ZzL{yR!4>`D} z#cP2>(Y{?n)10_!ja{TF=W~-bDD+U7k#*wEo8FhJvQ9kA_WIsJ+cVfw9mOm;pu@nk zhKG+)DAGgi#Jek;#4N)WA0Vkyn|LRJy&{~~P=%aVwb{falM*nM+K#N&zySk>|MRdn z0#3XtS3EfSkXeqhufy&D$+W`3{YMFRUxF*-U2mTlv_;01X=1Y?QsgLA@^Y=ylM}4! zwW{S|+c)G`lcsXPNag9t$ds`E=yfN`@=YOXjzjlrJ9v@G#0lhassemFsw4u@Vo z9z}+mHnpggnXtH-2UC^#ZmR|x`ZyU4S5VZ@<xNhH0?9BnOQG4GEKS^IBFu!xixcsB zoGNp3s`M}TjfHx&1g6_Kb9m!!<Ghi^#K|#>Y5DJj$>j}cG6!$&%CsBIWM*mZM01BR zlc$$$!^{zdyL{2UbdGwdL&OP78Meao!Qmw1dfpgqg0fkS&eVmMC3N$7<FX01K>HEd z1k;$*u~_D)&#e{YjKU_E{AG^6CYYFk{AnYv2}(18F&AvW>~*`X;$toeAQ`J1^Ddr5 z+@*}UY@jDL=CUJ}H|DZ4t`)5bj8p9Bq|IsDH3vHy>Ejf;gvg2t=GT)+i0sMH7yWs& zyLMfv9nr~jrB<{i*p*t*n@m?~MQYMrsTI*BcBNJ{CeoE!QJO$kYDZ_OU8xn7%&t`3 z+$E)pQTiTES41<GZ_XM+3+E}z^PD>^Yn9F%^#;RZUjH2K38(RUvJXMsdL^@)9OW#6 zSoEXnRzWM+%wA00S7V2m)?e)@pu1AW44S%;(Tcn5xw0pVuqaF$WzJL`St5A$oYcXh z=x`W0?e9yQ5h)Cu*VXgatH~Z0EBjFnVb!UtyQ8e(LC@J5*<VQ2d5J+Geyvh~LW;KU zfeS^6)V@~TeP?C1oL;q1WX$Y83&paGL1!TjGyBAwGMrTI(=vO)Cyt(u_Hb$an7Tb% zGL=x#qVKvtgWHk>l{do6w2X*^XNr}>6%F_TBD|_XThe&MmNONPuk;F)CTxeyG_}ki zT`mPjH+L3VK1NemCBUyP)a8K8q(nr_?CisjFwC3qB$TucKK#_k0wI04`LM0JYm4y7 zQllC!4#ANx#wGjAb!ky3`kbrR_i-Ht&X%i*S`WWDQPm!P0+cUqcFtk#`njub)~;%s zu~@sR0GOSns2ht@Lk1$|WhPEwdD%#2HYs|FeFl=*F{+TcS%<x!<YgMxA(AdS6<dNi z{_qj>DT$mYXWj&YwZbSEswao2?bBLJ++PF%B#J2P!Frgr4v?w2&Aqn4EhnF`jy#|u zXh;2F3y#^>1yVQWr#8kk0PBt?GncaNHZt<3%neMU3l6&r(3zI2t#i6QI1!4!wxk1h zO0?MtK0#@ti+J;3LFj?;ps#2m;Q=ygeytKswI2thGu^!cj<D5<<82YB5*$<j2bB_I z;tuQEjLbFQU?>kh5bT!m^9xxV9`30;$Tdp1YaVW}+Q*OitDG}k@k^bMm1NR`2O&$w zO%wE1lc2bN1i#USBV{{yAeCq~{zgLKN3Kvh2=zf!vASR_^UWI)Nf{xHcTUw6R=Br^ zoq;0L{8@;(WMq`nqY5}!4US2{ngYMv&g?3uv6_i-2(BzT1z+lR+h^z?vEy{&n#u<E zV<~JHA<~%P@RNlEyGK1ZcqNM+WAhD_Um|vNkTiz4hsa>)=}zPMk$)Vrc(ZP}gRlok zW5n3(d9EPZP@psi4xkEUrAFy+XWs80fbHsdU{(kqI2exyoiNe_m@zeHW{37<Dctin zx<<-eoLN6z_e^|e$gbB;<M?U=$8zH}hNv@ruQQm3P9Z$rO=+`y@`56mTqlhoo)lNA z^28RNwO8^gaMoXCOs5h?eHo`rd38#Asp|H94g4DOaA(+!zRSczMg@o9iL#<_kzfQW z44`?2$PyI-Au*_Yv9B=7b8kz5oCvd#HYdoe5i*TgWB#GJOzEIkh0pI!jL`b0;qazo z-U6I}1E;dHGYJmxxS>&$901c8HFn+tZnfKLdA)%TrziICT3+Z3(c+Pt^8!q|xwY!h zw=&?V5Rdv-#fg@V3i{MknAe8#dBt-B6jpg!WGM<b(Mz+<9XU4d`{4ndqD71ypJ33i z5*&DS-Ur>E#Kkp(vUmWQE|(c5O%k3@u|qozTkySp#9H{7x}x<w2NAh5;7yKAP#tM- zQfx|iX>1ykBhkcgE&yB$5uK_6J-p~3#$icD?b0cP+uNz_Z#8=HQ7s{;5TT625_jA* zp^b@&0FP(i;W&)MmL<*$#!}Td`3Jl+U6NO8^m)NJ4=_!}H)c0@St>rRB)v_YrnN{+ zP&EGY94M)p#_2}l6h0+y!LWYNsE+9{=BQV=QF&Y1-|Oug!Ku=?gpcQ@3vR<7_a{g~ zStO1(n<QU6Qe7c|VI5>v=6g@TUDdjr7@O<zk>^?!p5`%E!RaBMp2l$!>~O|&GF6(a zcmV)EHyX9@x_k5)m@Kcs5#V?xUm3F51+W|;NGCXO@+)A#5UY#|FV~V!4fJX}G?uCj z%az6OoHV`s&8iJ)W*W)hG36%4xXTbI;6a)FmX99-LQ>vuT*TdD@YP!lZsDBo!y!`f zfjW_SBtf|~2za!RN~Qsb$djZhnm_d5qsQ<BGKdXrOb2^-MAE!T08M1D0Sv+MJ6~8h zGS$#n?E7u#SF`lW6Ayw^eGIRo9>%WlWYL&U6G=W<lj`FD6m(cU7jqXiK+YVrLM5-? z_ZD~5{fp@$@w|jy72Sbncab7^YGrW<$BYA>iA#>wI!a7>N2gZ^K&X~2hY(jpJ(WTs zcp{e9yi5Y{a8VZkz6)V3@TW$Ysq1ZrCua1@s5u}Br*5>na0D&31NcG~bdup>Y4%X9 zfd0caGI1n$ourLW4Lnhg5VZEEOC+>yss5;AkcrxMwp4-_i*x17dgR4C_d;qE3zZI^ zJmh!M`V%2Wr&fwOmLYyGOv0M`lyrcU4ua=DvN<kcPr>U!=1zi7GSoqOi?~gJI}128 z3=Wfpt`SBgy0!R_A41@R0<lP>RiXdDm!<d=P|BWYx-kcH2<Ioumf{%_B8V^PASe6} zx+l2>A7;;&=P$z1h&rn|H6gu$1O^73dQDzqNTmr!W2M(MQsv@s{RJHU+v`FsHc?#@ zcZ;$HjMGb!|5TwT?2N!(dockLE}Jk8!A(_5`w`;l2qIY#FwdX&7U&dQJZ7#G5|0p~ zv@T>NJ~x;fkCIc$tiX&bCLH9zEKBq5Ep#6SZ#b~742gElhlVUd33=f@QglJIH2I8^ z?kV!YO%e2QKI$kE(S<3lFGwi@3W7f2AZQ9^nz+V1-zYAGeOlNQg*6V^Git}8ieQ4E z#zDJ1UYd{=EsuAi$lhwv>bM$+MH^YdhU?VoWP~&cESfK`5@LkLyn_ypfSg&h)+q}& zqNPR|gs1cOH9B5@k%xVdOoqouXcF_sgxPJ<kw%(Mct=VmDOlQvaTBH^7~+z_gtK1K zfJ*!6&4G}Da8@V9&BPNd^x{e*O)vRP8XSc0yD^05{3b2e#tnm~>GB-Pxip8!Z_=4~ zX+j#8Bc(_I8=7F%yexfPAhrhM3{4IKGzA2ezBf<|%^T0Nyi#XOhfNbZKP1rz7_ND2 zbr;)oC#)#5amh)NS*cz+KuBl0C*OAbDb2RV>2hnhG#T@IU}Cbj*m=HO>%%fQjPpey zd2?Bo1=RYbW8OI*B|IR&3Eh%$K2(=e;7CDC6E(l7Cal7gPg54uIBA)}7S@iLItf4g zDkQIp@8&lNnH?1{P0W0+<#0p_)a5j;K}vEe)k_qR(4c9O8rLA5Ak$>!Nrf!$6TXoW z-PX7YFR~;Vf7GnfO?q%EBK+kmD(i>qhcAIud-MeFPK=(sM|<*v+LQOv6TI9qs`bO# zlUKDT@24kto_$p7x3wqV(4O3LHS#RhdPIBj7(Kz0izDQ>YfsABlY#c+hqWjFh@RjM z#t8ZA+LHs<Acta^MeWJEwI@HXJ-Pl`#KDaQ5v>{R$yV*jJ=&8ewI`>vCvVrDROksV z?L^eSUwiVy+LMoHPkuss^0V5LPtp?{gh#Z#u02@+!@#XHP>;%N(VpC-J=vx`xr?4) z>xpo7X-^*3o*dAg9Mztj(Vm>up47A_E$zurd-DC-lONKa1lp6a_T=xXPm-%Eujs?9 zOLBo`e5K_TgCX6{8mxohy3nOt+Ua)A@HWnsEwAFY=!VT;H4NS9R`qf7OF*f9I9NaE z)f+Gi)at@ggb(+mme1fm8kl8*FF7E<UR)f15N`JTGL#NB!ocHQu)#Mh;KQ3>CD(^b zKLHv}6K;)z6^HTO_VIB1;<)+SP_Ow_{O4=<&wqn|UWR+dDld=W#_Dd3c>&HBXX9V> z!_BWiv8_to;L2lgQ&G#GNk{(!0e$5FCa3Xiy>G$8G{|+QsnE<x50+X?{QhZzIKn%U z;ST#)nWVu`jW3OxzXwH|zfZ*A7g7yLzch|*IKq3oK{x94!_UIivn%=I6u5E~2XZr8 zK_4LPwsEkI|BGe?$MwU<hhvZK1BFUko0ne)cDaRye$ky*@ol97#?1mod^uKJkWoXh zUCDJ$bbaa8Z8KXNof!t;ZcL-JZQSfbH$cpVFc0B!k$#n_CE7?qE5+BES^`{D0QS*7 zclxN*aK))5=(`nA&IV#_gddTGyZ4dcKrlgQP@de)sv}wB;SiM2ve+~b2dn&m!ZA;~ zN7M!Gt}!_XbK=uQsfoAoG+%@vpAL?b6P&KepA-m`9yC$1Ly<J|_B2{qS`ss^)azS8 zZ!ar)<9U6v%&C&zlP{@USCa3b{LWe`xf;k4D6;UXicuE9Oy8HweB>RN=q294%gl5E z5zfruY0LuZ4I-*kNRs^yoN~dPu`^rg64@CDKosMoDj?ej71_euWM_CzP%0f?V>uJw zF$(~HR{@v{ua&h&_<Jfsc)zSY!vCfq%+f`t_VxdFrT*P`;i-M~A2(FrX<z*xE7g(v zoetzbrqoC7ciEHwX+!nh_SJt@sXiB8Piv3xa|%L<@2Ry1_!kPmEL~V@U;kg3>N^<l z|5WOe04^5%w+a9W;9$akZ>sNL!~dYv#|zl;c3TXYdelhb0AH60LEt|r0CUkrx7G;1 ztRPVKgB?^9195@h8tqpUv`4}ZCF475!;=%O0sn6W@L>ehZo;*O`_Bs8_T*ArYmEP* zVB863*H~BnEv<5+V_o_GRVvT&&MWKs|5d5adu^z%i9SyjQb3{edz04r8Olrj;G>2D z$fuHzr_l!2{+hxp4;82aa1-ClD{v_d6|{m9d(x%3#;#hV0o;63;pYA*3z3yC){<$& zP4@Q{q?5T<_BxaJBZb61!|lD!pnsx(Vltgv<m(Lg-;HoE4?uVNI>Y@B1#UmaiDW!T zdj$v1sDG)TQaBSXDRl<?p9<h($fk5(sWaqdFh?j3U-u!Ta&@UQ=oJbm@fm{hRlv@W zD;3B`1wQEuD`&(t3L@D&WHR0w<cxZyf_mQq-W6;M0}c#R2g5}O85<R#gS1GYUmR=; z9Y>I>jKKOG!p^|gD!}(qIJ1QjM894EdRV$!*cLDr_$CEzCw@xqjPgbW<q_J=mR#HI z4ETKt;A055w8s1<1#%xkF10bgSpj`i04>(??o<$W$LmVYN}N@o-jL+I@io9gAAcjb zBup;yTom>3aVe>T-$`fbi?<siXQu2Ut`ALihr*0>DWDC&y=eeQ#Rg!v0<b5_qliuU z24ow&hZMZ4V)Y72-J~j&Rq50HoXG@9m@dX=-O!$N`e>yNAG`~Aa=MsOUNYDH@b!>z zo3fUXrC@-`_9+4$h!lqNj;J9PI0Znthj}IrIgcx_PhxL{kjbse#lfFYz>n}p%?KY4 zyNaV9QP59Pze5dOykVl-D^B9LLSnx#*IOL*DFroZ!-%N1+!T9)L!41i9+chG4eS{O zES$@WsYe$y3(o&WsWE9KCAZ%WUKO3JmdRK|2jn}eu*4I*$-z4?T<43LaR4vf{VXsk zP4L>(mDoNJZ@0tQPU$k}^p=~>7YOAkLY>WN#pz(l>E=3baqF%r<SJIJdx=CB6rxqT zR=-55O@(URAsQ@^bXy_)j_fG0L~1>S+MATXFJ3Y%w1ivD%~dQd`Thgq0XKZ)LAuY2 zDB$HIg~fw8UM^NQTw$H`Ru>iEqgMWG4gYQh{+ONTTI0V*!9V5Tqt--TRERvD?TyyB zKcwJ3EY^gN2ci4P4DDiZ@R64lxa(v$7CiS_qvuM_dTZ3Vq`D|j3>1oUIbIoK#^Ll; z6+v`A6ke90q$7MlLAX~$;HzM*a6Y8q+-K*hIzvCE06pa3k~-Rl6|^}VfkoM*m0%xH z5X9TotpGk60r<3gEXnG5V|6u7RHTJwI5*3D@3!EF4;%eZUKdZrk=*s|aL!gl?yz(b zcdGwdk^wjWiAVwAHji`a)!PO&+UWv5vq)n*ZX!RaP;V+XLr#_WKUIj&V`>N=PC}2{ zo+{ygrVy@#_bpD9=s#D8*5c#ir%Lu;Dr6UO!sz6D>t8FB+Za6MEA^%-`7fC0N6{@c zcu!9LPbu^V)Oi@rho7nzKCN&8XCMrtJ7=)H;eL{-GVn_Z1Lu$dPOAA>|EW^{j6%Js z-1$9K;-6KB!%k5+q>g&ntO=FLx!~s%1{(4yw^J4V^9pTP9X|($a^Nv{x$`}f)4;DQ zTvWmXaHlHzZz@FL+#unq@TrpiqC$FJINo-ugukQ^u3;}u7l==l>{k@B^V!3v$vM_n z6~cU;LrT6H&ml<Hlncq~0~X1u8AQrd&zz2C*`#~REz?vp0mxB*N0HTc%~8$B$()$X zZJeF{o<g_gn4K0R`-ckI=i)2O^IW+g!9O+<#M{iLMDR})g70+5ybH?sX9~%)mN|Dp za(|(ad(JxBE=cgZ3PH~$&n`&wdkW1Oe=!2zaPuYTQ}Ui=@Y$BQwSzJ`{XX<5QD31@ zZ(%+eQV&nvQC5%5a|i`>zFHxF5y|7m#Ee_gr=*E>3M(T6E7FDOQ{rQT!p8#g;Wp4K zXpGHf%8X_=x+qBb8WUx=!DT_p*C~`~SZ%soeM;88QK4T)YljWbc0gHB^qW&izYg}E zQApD;I{Gx3!>zW5c%pIVHiZFFyK)ixlq`OSLb~QShAwFBZ3@|Xfzfk8(swJQt8U}w zf>h@es_mj9=7RKhDD=--j+G0NyH_DsaT+BTB)VH6`c8-OaY2#~DI}i*9J`TmL4uDc z1mEc}CN4;FuR_vpG%Ve&TXZxmfuxLvkBK+RyN-q>0x%jrsK{D;G%O(}qhXobcr<)i zp<8$~>_+yeLblLY(T(H@g{1RX(T&_Gg<OHLq8q`d6@rv77fc@AD8E&qy!7PJjs80n z`h`;oH?q$uWS5jmxRLf0(nV7VH>x#->e5pQH~I?-edkodja*Y9S1^@uBidGo7D^@D zNcI$x1yTt&f&+zMp;W?+<avc8pP-sDu^x@U#B(9;wwOzg>q!X%AH0=Dss$H&w7vd0 zzb~XJB^zQ%O^Mti!ohf!Nr`YgA7mmgD5^T)IxjE4l|*LZoZ|-+3Qsyr6z78fpaOo- za!NQC_$3AS3G2z<T<A**^bwb7-dyxRL4O+OR@`S+bLqUQ(0PkM$7K#Rm(T|kLQnD3 zAdfQaCg^f$e8@z@Et|@v@nZ^&XHbqJlWw_`KCDnWg_L+x6zrd$kjg%y5IOERqmwJe zM->963e4T)68T38k!Om|m*i6VCkmy5mNO%{z(1t`A9b1o$%X$J1^!8g*^XTBk1OC$ zSkG(ZLVrSme$rtEBNzOW3b?u>U)&=g^z<n^^2O3p@4iF0+SjgkhaUYG6yEl`_UIzf zxEKGFg1XOf9o-1}X$ABNynwqLu0X<3cYF$c-juWv`j-^w!zwhNhh7N#GYa;TxNg^g z8*KQrIP5oIDbM(go@i=3$9X?Z@So@<A3S_k0e{3HT`~fGP62$-GDR|ieO>{3*g7pT z!u`4ecPP4~oR|Li>XSk?`b`D-3?^A{iIX4NswNr>5^$eBWl(nW=UeNG3YqwD5Ojh< zjDJZ%ghLPT2uJG$d83}cqJSP2k~LPf)q1xP`>P5zeNS3oG2ICMbp`x!_vFur`%M$B zTf%3={e1=ZNYNzEi2g?k`oRK;oe}s?6ySZ1$(#}Nzbl|m@clZI2$KIpf!^!3xMpPc zFBQy#6vyS0`wF$_|ET~!0bLK?_YlQ89xWAuz6{R$6}QnmXqi+R6>x<D_Lx&5X@p#< zKt2lUgs});a8*d+H45SbOTfBP!Ft3YwKa;nQ2~6|I-NDbU8TV78Fm*IAkC<@&K1(# zwGp0A$73fSN*Pa!uXu3NP6w{;Mql;jp=%Tmjg%&>;xjVnfMU3OQmZMYwFmZLf#U#u zrn@%;mXDOo2ZTiT#z>s-v!^HFX3ExLteJd_lFmn*@7}C{8*e(TG<sdQ78ezS-#QAJ z{+;5Sp2~?_OH$2K_`wyNva^rN@K?BJx^D&aligkwZY3P51A%OG(9^AoD9>c;N#>5e z0Lx)0R@&_fCBEQJVGvUTNRK;%q1PFTldjt`bS77lRQAw800gx~c$uCg<A8GRR9N1d zsT{d_Nv0gDVOGK9(V?P-@MLbmXQa`gxwItseW9<M9#x<n)!>+tOwmJvAoC7|zlSqr z4(mmZ5L1iAy;p@h1UH17qFXx8(9Lzny*8e@Y{}hj1#X`ecV?O~j}IxJk5GB|qyq1S zEyCp^3g7{IE)7&;KKClH4<esWcN))+{Npg9aMR=g1?(|v9#x7le}@!EV_4*gx@aSx z*u=BKqEbt8^*x92tEU6-tr;Fboaajl5_tSkh3);Bno#QVZCnZQSQ#f2RO98(3`WB% zQ4?>@2zFu>Ne%ZOMm3zq@1N{+z+^!IXB1ZVSSWxiv-Ba&SoCKUJU-h>4q8HJlg_r1 zOGyIGp22Gj<{>knOd>mGfLLc0Hg;x;rGUr6lp_?M?qpB$BIC`Ayzqcmc$d7&pxdtq za!TulvYaKYo+SAbdkJg%zQzy^j5^#IcFiYn<bi@xYLPf$UUWQDDH>a)G)`iDEhq$z zat-K$i0{nvt}OU(D)6TY@o(lPmZ7Z>31x_Mzf>7|3Vbmc%-qB>3=|?y9`vfiZvVsx zUFbAiU4G14fI|RBHSNfD3oD#gz)w0_A)S|)|3!tw12p}X&RezHYI(hZU+()oyk<~5 znC<?Icq+KK1|c=V6Z=C7r$PexSydJ`w8i%*B5D-CQrS^Xj2jyFK;cD&!f{mwm|V_I zy>dkOA%(yhTSw5ig%pwv7^zpB_kLL+W4x$MV72de`!#7F1>RN@AE21-MPWtB@Q)pX z3*y1pCt-hvlSM)>utT8mf6!J<Aq1SMEU^%`l2;Yr!&vY%d{5~0BaXeIOn*SZK2d~e z6E89MA5tg?+=HS?--WsVF$H@G+{?Vg+<#c1usbJ0^<jWsE5`>%iU}W{IBVmb3WDUO zPo2WIdpouLtw!$*d=fsu<0<n}L9x*&=-{{iP!TbEb|3?*l)_xB%>P57bZ?F_@d$XF zS|N1`N!Cs~O-j`zH9i>)oPofZF6q%eL`txrzmF+WS@)9?P&~R8Sc(<*(+UZ`WIZ*) z397o?N>!3_cAcj0zcIhHRtl)$;|h-t+C~zATrBV>A~2tBu1gZ~>&a#4dijbsXjBDJ zw}_%9B_!Ey-{0%)8#P+gZ^+XTNevL@Uq|%A4EkOW#)pR8=)l%nxIrqOV@zt51n5|f zUr=y%g*b!ms9&{*`IG{4R|RFTW#ZFH?FVoMp0}Lg<Oh6sHcZX{&k^XC6s$e?S^Eg? zrNg!Fg^ph<*Sc`S7#ww9hJoAyt$-@$n<f-M(VtQ9?t#gsGTOLYiw=iIF|!~(t3YhS zHL=Pf9gCk=_j5|!yRa^i?{~YyyxN~vY9DTNhJL^0!wKGH7{B%#7je@S9M)26w9E7T zZacXRn>;8>s$W;I@1}i8WOsn0TT8O4|E5y?{vI425+1e<5w(rOn;zJ{JD(@y7Zs$t zz^*kA1v&z_lRU5Xmz3If_x(0xFShpiic<Xn>R(4a>=jVi3!vOcmONIzs$lV@8{~~R zQw6rEo&$-5h$3COp%s(@%Pz0q_ZD~5{fpUp5h;QD|Bk}bqv(6QIEd^(bE+&3;Wk9T zP7_Z-{5=Kn!I-5Tot`V$AF5yigtM%Ftbpwf1?BZS{?^-4$Ujw}?t@*FtTq0Ko_AiD z+J~a8KU07nN38=Zu;HTJ9So`AdV@0PFvs5&+`mw8A62c14$QW;6#2UfVz}%XeKZYl zpiWDy?<rV^M;(LQ6tJ8nUq*Lr9v{N(q{1zj)Of_rG?}eTEGV_I65V&7)q#sup?$4V zxOpJ#e}~m%w~xk~OeOBi*D6@M44tq@J_TmI0<#BuW8N5{cf=NWn-si<dW*Qxk-Ow! z1J+p~iZtjzbW?*6DS*PRR?zr}R#Fk3(l3}zI-)f$Aerl)_@)xd;%O-;%|#I%=wF{s zf9MZj>64Q@xPVosj|C+9JFz#%r)8++x8NYD`SSclx|7PJ3M>gM+^n#mqCnaWsWD|= z87MOf3Z42Y@B-_&RyemQILr-KEz{jcy)N{GX=)8+x<f(Xs}j&^f<~pQ67U@>({DaZ zcS+LC^_Yn#m*Q^65LQygA)-f>s*nwJMlb;t+igxv(=Dn-7XADUaHsA=`w{Qyya_E6 z3t-t&q6I?BS?cXA!0I5M0Uyaxis;8tVY`BPf4)k<7ctAFHZLgVUTejO0FrtR?T1%~ z5^Q;dlc{VG6I6AdBG$3Y(VVPr5ekO2B1f^>9#HTfbWq!XqMD$&-R_!W3`u#%5>_J$ zMfAsYL4}VfBAzayLPis`7_t^Ca<4+gI6-B!59AAjMq5y0)&x}sf~3U5krE?xcNKC? zP~bsDwCvfv3=U)Ug-pfDJFHN!h-bXfThN+)Jmad8x*pme;koFE_L_r&jw|fD#51M~ znjx@c_xV!_CXGn4Lp*O-!Y&@O@0Pdd_r-b7J@&1Wc0S2KlDeLy<?nrsj@Mu0X(Jf0 zh3Ed|%vCAwVW0#GeTyP|)uqWAAbIILh2Pi<-=<LApC1chV<ybFM7>iotswa2UTd|d zfyt`hPsI*|9pXu^4^bGt&~Q?F8YNKubBYpNRG$W0O5-_Jy{AykkDlP-e3iP|eOpIQ z89`F=Vb}$Fda*OCmuaBmqFWgi6gsbn<`6w)Ec{AEWGYr(L!rP|&}U^Cjm`je5|)Lp zs|1IYuAp~Ak(7AyFi{adMb2LSltP2fBIvTCNctB0xS-=fP(Uq+{KYDLULj;$5SRF+ zX~CM`Yjqdfen%W2Wi5zjK}gDc;s8OP>7IPs@uyt;QQ-@ecwUh$dsj*phb4)rSb2*I zf&843nCvZfo-fz>u+2`~ziXXSsu+^`jvRyYs!??ZLVWvfUd06szDE)8DSJ0m(Mk$q zu@YZYXyix41RAFOn?i%Oj)*dXq`)U5K2HL+U(MV5ta}Yv7a0Tny`;#Ny;7Hf6>Bfz zDpubmg+zV>=H4V`Q_!Dv16Cj;1s<i)jV>7R>JSVSU{K-v6#25ZHAyN|z)Bipu@c{} z5ZRfV5XDDv2<qEzn*ha?CB+%{a*6^8q_XyMidC3^-`vd;Dtq|PgZ$?K`ZEevHrn2T zKNtt=20b`q=wgYcVuDQv;RDkSY^27mxd$56;rN5&Z7+_SUx8|`!fY#oy%uahRn5Xq z`0BY*ud^_IX*|G}58ntcE5WK-YaUPr<L3SFAXtB(d!f_ndNqU|FkWy~x8GQR47*h( jKFXthWBkH6Sc6)kj1zyY>%&wUY~dgJ7l-hBR4M&0)4dx> literal 124382 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 W{<X0Wvu3bcf9Rhd!r!Ax>Hh~jULZaI diff --git a/docs/finn/_build/doctrees/getting_started.doctree b/docs/finn/_build/doctrees/getting_started.doctree new file mode 100644 index 0000000000000000000000000000000000000000..9de9cb5bd3d602d0b06b10a413c8e9345d8e80cc GIT binary patch literal 2246 zcmZWq&ub$$6izm=V<++C$2L856E>wR+YLBQ=~A}6^;Am0mn};#MaU!B5}A>vk|uTz zf%Z_?1>LItHT~!MX=XgJ-GIrwPfzcczW3fAyZ`*#+p7M2!gN|Xnb~Wl8MndrB9L?C z!r$S|pW!il?fZt#tu9T<gWrNiDrCkCSK+rHw)~#usgqi@`l2JcVy`;uIO#IJa^jDE z;?7AmyL|7cah!!lbN3g%h%W!H@K>m!fYnpqEhzlDAdbbh*zw&as<GeAq~c**PN?6f z&KWr=9kPkh??`45sozU8YArx~cNER*uO2IlCt*U<JHw|@r}TS{&f-xJiTFYsM33Ty zACBhQ+}VPrd^D9xjZiOJf6eODh^<q*HWrbd-|iqPae+|8OSnF2w1$mVpyEr^>Z_Hb z%crAPIC_m>#2e8^5Ic1c;%d|E(uQa*w51VO@$R-y($d7zk+x)qOQbHH@7X$haNwjR z#nfo!xMIO~KhUg1&6cbX$=LU2TyaC4HUR>oD7m9~0pXx_Lty(3;(jBRCWAC^Iwi5x z@f7Ylh|4?#e>&CLDed^m;qA5`M1rX@CyS{zc>t1Fyl_EMokyZtn0!$qJmVEY=F$nW zd~kSdE;I}n`$NMEZ5+w?J<r1JGruor)`}f}!WR;?a@3V}snqcu#wX<r?vgn*3M__( z;WP)*cLt1zNrjI-k*X*i;VRV(TEX{AHyyqkT8Z!T^+Upq(S``BSjG+N979bVh@wlk zZlzOM3I1Z^WW$8`;FH?uQvk`2<M%(4U%$P6JN)MR@7^Jbb&U-Z{y1i0Q7(Z(Wymb} zK}OZAq%)4XGsw>{0Q_^qQ*9VwyZ}q!Pl6(2-%YieB3aZ$GE$(W<RXZ!PiW~hd4l{i z32F^knHQv`AIe(+63jD-X3^kLg`mdDMiM+hh2<sFWRXW=9rHz@EhnotE3TxD+)FEK zq8<?@EuCaBktWK$Wm||Ve~4r(Mii}v8o1M_k*Um(9QrgVctMa8M?<AmzK0Q+P`Hi^ z_m{%C!u~KC&FAy$;=u{6uC<ws7{4Du(~g2ai#MXhc!M~eqsk6d?ExRYx_OJTBxag! zxQWP<oAad`r!@w+<ZfEI5iZZ*qVMPgjli4;w>^IWTIHneur_>Bjk55`e_ll+mE|U8 z4)(?xG0^z{^S>3*e#iDfIl3T1&P0YE$hw>9$n!&+W2%$iOEj^?&F7U|izL%2Z7O(? z3W|Qg`_|2c7mHJf;PzcvAegw8s@>5v{U?w_r&3Mv)XOPw8s~y7C+m90JfCoe#(aP; z!MTIAvozE6j_{nyj8KN%RV{*#euu03xHWvQo(E_^ut+K<!D~k_$1$y|H$Q<Ru)<+i zqBbn<h(}DUHMHI%fMIRg3f;(ltRUcf5v;$(jTl<rkAQn9P^`xwZpK!;#Q&i<uzs-m zRMqW4Dlw0udswWI*iK8mI?Pq1)&pVjVEII6?dw;npKXAxc7M%cf9bWlbh>80+EZ~L vpKaP|PPTjx&EBddSl{RotX_*bQX6c0dJR5k;p$2DSsXJ>N5&mkPOkq0S&@Hw literal 0 HcmV?d00001 diff --git a/docs/finn/_build/doctrees/index.doctree b/docs/finn/_build/doctrees/index.doctree index fc8dac0c237643c38c2df91e02132379ef6a81c5..9fdcfe505c4853f9fb879490dda05571768439cc 100644 GIT binary patch delta 2699 zcmdT_O>7%Q6wcz<bsD>|)4EAY)C{5p*CIBJ5K?KCQd&Yvkwrz2Olfe|yW^eR+B;@< zmc}4rI8cJv9?)zL{M_lKKxILt9&&*jCoTku13k7v;=q*)Z`QlE6H*lAmdkqHn>U}o zH}Ab~*3bMtAN^qP#;ZqeM_Huh9?#_#h;E~+xMJ%JBUmbqWnq)mn#eI#Y$1i3HnSXs z>D0{Uavs^U=#c?822N^f9`}xY=)Lb{NtB%Nw^Hu(b|KIDnBGTTfUy0Oor5GpUgQ_! zD0&uFr(u=l_hSiZw*7YG`AGClaK6D`iqA;H{6XyXXbo%w>|A;pRvM8=gd8PLkS8zf z<12f9ioOfpWf3185&L{4ep*^+uf->&SC;0^7mKK2Q3ERs5n9I$S;OcQVXR?4S12s& zHQij!YdRxNC9l&$RX5GT>{2<uw{u^!;U$$`^AXSO9MK2Nl2mEJM@sarFYvTHp#Pau zfg%lAxQd~g3ht|udt%3b-bp6qX12VKfXNi}!ownf*;i1f$(B24%605LEY6JqbH~y> z_wfJUvFDH@<cn^?F(z9YX8qYdwpE#08|u_a>!9f3@kQVysy7`}dpfMPCzC_a`IBM5 zf7$^84nqKffRH`;M$r4#-P^5$>Rph4?IBU0lq=<X)f0xuga0x<$^S?tqG_<Mi}p@_ z3aizyUwJV;#UCWn$F2q4E8_fa_Ddes>(HA07w`gqJb9E~N}l3hC+APBll!(H^;>wV zgHnXUABRm!V*Vt%p<Vhx8W`a5k(0ycnUDy%LLJ7@&;kC|$a@FS0!1|}TPCVg3->l# zj*SuPR~Ok-QI%RqMg*4jG&K=kZeU9n9SWfsS-3$#h^W;Ry2E7Mw2=+thF*3WO$KUY zQidy(UIED>x<Zg5o2Y^T6~rnKEdMW;YI@PU(kp#1nhLEKO8&5RMwD3?7gYRCp^Lla z(0;!g^Pk&s{#}V_?z+5To)W=pQrd;=Nv2NzhEe=796k3Wbn;FM8Orsbfap`2jtv6v z&ju|H+_&80q2_LTYPvEk$bZ)*|IBs<u(f#tH_35_R!@CHd$ZUY3FuZ|Z^@c3vVzM- zjU_)q(%{A<6noHges4VK3+@<f{?!%SKl=qYLw+Ue0y`945v%cw>6LP}=#F4hEi+mc zKh+w&>Rt1|3GWcoO|5Lho5Zl{JBMxRSPCvHRK?)HZbCPenxo>XUc<Jx=w*#_kcBZP zKJ)Ow{9bx&f6*P(YP8~g;>L)ss@U{ad1myfF<@jo3sJ#KFhMfL447OVof$Ho78`=) z=cAXUeQjmp(j(IK_S&O2BP|WK3{`x};&WL<-X(X8gTmSmAIBXM?=x#QfEB!phB#65 xql@J3svo%Oka4jka7eBLqLDk~wvS*WeVAmGQYOT;3{Rkda+8YQ{&^}P{R@^!yFmZ| delta 2067 zcmbtVU5Fc16y7wMWYW#D$=Y<|I&`OQ*Jf9@l!8lL!Llf&?y{jsQ7et^B)QF*X=XCb zOxP@Hw|x*=xFGgkAAKnZ1;M2az6iegQml%75$sdxW1lL8g81OM^OtPWV#SA@z4trk zo^$SZzjJc;#P7?}#l)Al)f<u<?|zjy8kd$K569TK^bvMBkzoaSMS2I3lZedc7I3u& zF^Iz~yaWeVGwhoDqqL6bhvI}ZChY85`dIAc?#ieVo3UF>gH&A=nkKQeIytnPL#oW- zjk!zwQ(gq={dv!EYRJ*|%LexS!}ia35CS$a>jpb7tL$Pzmd0`Ch@EsER~FlzI>=tj z<>nee&BE^8p<RIyD(NPc#TgF^qNkXXn;iq9*TG#<7Y`q{JB;O)$CEz9spMmKax05h z;cKT22Y`h!{Tw9>ZH56M>D{;$?&%$NFaLV#6zGnsJ8XOM^NB%H=x>8A>41)5OP2SD zxPfJCM?~z!-8T^t*O7?go-g34s5j(7xU8`UQx}fYjBZsM?HW0&H;BW_oXV!wsS(=+ zzPgL1s+#TUO^eg?n@!6lmg_8Wny5FL6@G;#L9f+_#jmhGUwB2OyIa~u=nwZqzF!0G z3z+XG_NsCu3Aen|wsNMNLAK^Xc6_#qa3}=m#M@R)uM$VqteWa-6;YnYX!ePw9vgpS zhQEYtw}fmT_sMp8_<f4dd!X^97CF1LUMH4r)ktT3K(fYIY-Gf%;1`;)307y-KkDF- zJ{9$RMrd+Nw;H;&Lu7IoJiJN|=v^QQdE<G^)vjo;S9D7OJ7=oQi!|Y-qjATrahk&K zf=Ew5L5F?#r<OU=ZcK_o^G0G1{zoAwTQrG&wPuyWA2jVPO-;ABF^di~g@C(h6HenI z8Xd(i>DUdus=N5e!n~oiEPmNL>T0bzaZx7GO+>~Ck<p(G`!Vx4Zu_cdpU8R9qq4A# z`bDW**rtXo&P8)Y^v}?9m`x=5NzZXyoW-GHJco-=Hb#UN`cM>g5GCT>JQE^2i7(-? zzS4c-jRS~2EA6Z3D_A$5#`<Xy?3r0N7KMB70t0lvh%BD)GkSAS7QkBp@UI+?`I2{t z)~dpg;5RYMFvAhLgW;qfBjnfLz6*U*O33;WM*M&5UhuD`oO>F(6dnF6yJ7JI+|FRd zAN%=yZUwLr0CK2bW-F8Ib~gJS3`|*6yFY%~6%sWvoj^5<xwe3FZ6TOznrLs)#gVmd z>alN?eX;58&&mh8V)whn>Fe>*4_JfoJ$~R3JT$%&yPNoF)3l|TL^QJ_er65fSAs_+ Z&!yCcf&jg9^Y9SXyhHG~dvs<d_75lwxZeN( diff --git a/docs/finn/_build/doctrees/source_code.doctree b/docs/finn/_build/doctrees/source_code.doctree new file mode 100644 index 0000000000000000000000000000000000000000..8b88115807bce692a0b3025bf8b5c7a365d3539a GIT binary patch literal 2226 zcmZ8iU27vZ6iqhqSDZ{fw&_DRVN=S|CSW_IOWF3V^r-~=vSsN@5%P@25}A>vk|uT@ z0_{U#7xY&3H}r4zXl6W)9WWUkUEPnPbFco~|M$QCPW9)aM8%~QnHfu!Fymc606CM^ z|KqR!@=yL7H_&upRH<X;-3}~bF0w>3>3{cp$Mp=0tx&SH=N;bVy=t#xh0WNr9XEVm zIlB58(R^dI|0`RDaGRTd`zkuTow;s75zl&l!gu+e>o(a;-F_w{^V4!h-2t^$i&<$= zMaX(jBnBC}UYt>50OGqNX<mQzld@PZW;DLnEDbiL>sdMvTb@V!3qA}H`73ulStxyP z3L3LXDx{o%CsTjb*^n3|jkQ6R7k7Keh+iTN{u*J2wZ$k{c*?&7H(#ycs|J1p_-iD< zulWFh_v*m>X4~EBJZ}!Pbnu&ScGpF5sRLc4rRi{m)O5MNVb%&c$9<o+0!X!zmdV7s z?gyHc;Ay1*9!=d~&Lq>+D($gIC}_4cFR*B;Bk+BX<v~M7sWYsOtcppXH|!!@2YKm7 z@6J-CtW=gg+q~O#M?p-o%*irUI`=>#gIg^?ZXQHw;PO?Cu#8m*SqRI?>XH$$Indnt z)E#P8C~Zl`9$4n@Ubq8Jvv%2Wr)(*}m8G^cE2EC<By3jB5iVL#Ex{EmG^06?fz?n! zD9V3yk&s1c36r=*Sa~-nZ8~~4G6LTho127btu*0OCK=P<Iiwm}?~YYzH@$Q!FWy~l z?QFT=A6!&BT_+IzG=2XI`R%*$+tIf_eE$wvY+7u&a3`S>1G+ef%21hiM;Vp#lFnHr zYVTg4+1*RcVx<$3umUPUJOPPJT{l)TMX}&TB&0waiKXXV7tzuxvWDCX0cjm2WnPe0 zexSDk1eB*G&4R<@3IWH`1QD#E!mu(?WSIwHov>x03?t7^R$7TIc@Rd_LOmvlFm#rM zLYgdltG3`b?hwToGy<_`%vkyK>$oQMim5Y)ubP;pi7VL)aSp@YKR6}Pr9KTal# z#bR7MTCU_+>G>pK4-;6LiFfDWMDQ3+5X*9~Y{7CL_~^~;ThJ2eG~Nmmkad`gRT!%j zhP7Zet-^4dX9zK{bcRMqEcbVPcL`bLr0uXaeNv4t|H*w`Wh10vI#dqz296TQd5Brx zF42A`=22R@BwWmSh9AVbpQ)hpLz7c<)gL9A*x=;LYF#f$refMKco}nwe!>0L&4n8a zQ;6X7eOVxx@B~%wMAP)2AQBY|nc}KfQ{XJj1yjy8?M_%eV+k7b5wSR97T(U|OwoJ7 zaw;-H6TDN^@c-!cn0yE?h3nVz01XHg37H7!+7e6koMFCTE}tS0RAKQhf}13~3s0C> z8)*G@0EV};U37!`@$3Na1+f0+w|r#WAOQBU09j9--%bsGjsGJ)H16p6RaK{tVu5)S z!oy>Ygmzll)oDIQYC9y43(IFJYj3|Y{cH<ttp^((2dk*np|cJDn2*|qfqcI0tJ&Fc oeKdP(7U9W8kKnmAm?O2rwx>7XVGCDRa*%{E({yBb1IyX?e_6P8p#T5? literal 0 HcmV?d00001 diff --git a/docs/finn/_build/html/_sources/end_to_end_flow.rst.txt b/docs/finn/_build/html/_sources/end_to_end_flow.rst.txt new file mode 100644 index 000000000..482ced084 --- /dev/null +++ b/docs/finn/_build/html/_sources/end_to_end_flow.rst.txt @@ -0,0 +1,3 @@ +********************** +FINN - End-to-End Flow +********************** diff --git a/docs/finn/_build/html/_sources/getting_started.rst.txt b/docs/finn/_build/html/_sources/getting_started.rst.txt new file mode 100644 index 000000000..41173f451 --- /dev/null +++ b/docs/finn/_build/html/_sources/getting_started.rst.txt @@ -0,0 +1,3 @@ +*************** +Getting Started +*************** diff --git a/docs/finn/_build/html/_sources/index.rst.txt b/docs/finn/_build/html/_sources/index.rst.txt index 9a6a63725..26813ae1d 100644 --- a/docs/finn/_build/html/_sources/index.rst.txt +++ b/docs/finn/_build/html/_sources/index.rst.txt @@ -6,30 +6,28 @@ **** FINN **** +**This website is currently under construction.** + FINN is an experimental framework from Xilinx Research Labs to explore deep neural network inference on FPGAs. It specifically targets quantized neural networks, with emphasis on generating dataflow-style architectures customized for each network. It is not intended to be a generic DNN accelerator like xDNN, but rather a tool for exploring the design space of DNN inference accelerators on FPGAs. What is FINN? ============= 'FINN' is colloquially used to refer to two separate but highly related things: -* The FINN project, which includes tools for training quantized neural networks such as Brevitas, the FINN compiler, and the finn-hlslib Vivado HLS library of FPGA components for QNNs. An overview of the project can be taken from the following graphic and details can be seen on the project homepage. +* The FINN project, which includes tools for training quantized neural networks such as Brevitas, the FINN compiler, and the finn-hlslib Vivado HLS library of FPGA components for QNNs. An overview of the project can be taken from the following graphic and details can be seen on the `FINN project homepage <https://xilinx.github.io/finn/>`_. .. image:: ../img/finn-stack.png - :height: 600px :scale: 75% :align: center -* The repository, this Read the Docs website corresponds to. This is the FINN compiler, which is the centerpiece of the FINN project. The GitHub repository can be viewed using the link in the upper right corner. +* The repository, this Read the Docs website corresponds to. It is about the FINN compiler, which is the centerpiece of the FINN project. The GitHub repository can be viewed using the link in the upper right corner. To learn more about the FINN compiler, use this website and for a hands-on experience the repository contains some Jupyter notebooks which can be found under this `link <https://github.com/Xilinx/finn/tree/dev/notebooks>`_. .. toctree:: :maxdepth: 2 - :caption: Contents: - + :hidden: + end_to_end_flow + getting_started + source_code -Indices and tables -================== -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` diff --git a/docs/finn/_build/html/_sources/source_code.rst.txt b/docs/finn/_build/html/_sources/source_code.rst.txt new file mode 100644 index 000000000..99d708a16 --- /dev/null +++ b/docs/finn/_build/html/_sources/source_code.rst.txt @@ -0,0 +1,3 @@ +*********** +Source Code +*********** diff --git a/docs/finn/_build/html/end_to_end_flow.html b/docs/finn/_build/html/end_to_end_flow.html new file mode 100644 index 000000000..3efb43cc3 --- /dev/null +++ b/docs/finn/_build/html/end_to_end_flow.html @@ -0,0 +1,204 @@ + + +<!DOCTYPE html> +<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]--> +<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]--> +<head> + <meta charset="utf-8"> + + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + + <title>FINN - End-to-End Flow — FINN documentation</title> + + + + + + + + + <script type="text/javascript" src="_static/js/modernizr.min.js"></script> + + + <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script> + <script type="text/javascript" src="_static/jquery.js"></script> + <script type="text/javascript" src="_static/underscore.js"></script> + <script type="text/javascript" src="_static/doctools.js"></script> + <script type="text/javascript" src="_static/language_data.js"></script> + + <script type="text/javascript" src="_static/js/theme.js"></script> + + + + + <link rel="stylesheet" href="_static/css/theme.css" type="text/css" /> + <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="Getting Started" href="getting_started.html" /> + <link rel="prev" title="FINN" href="index.html" /> +</head> + +<body class="wy-body-for-nav"> + + + <div class="wy-grid-for-nav"> + + <nav data-toggle="wy-nav-shift" class="wy-nav-side"> + <div class="wy-side-scroll"> + <div class="wy-side-nav-search" > + + + + <a href="index.html" class="icon icon-home"> FINN + + + + </a> + + + + + + + +<div role="search"> + <form id="rtd-search-form" class="wy-form" action="search.html" method="get"> + <input type="text" name="q" placeholder="Search docs" /> + <input type="hidden" name="check_keywords" value="yes" /> + <input type="hidden" name="area" value="default" /> + </form> +</div> + + + </div> + + <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation"> + + + + + + + <ul class="current"> +<li class="toctree-l1 current"><a class="current reference internal" href="#">FINN - End-to-End Flow</a></li> +<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="source_code.html">Source Code</a></li> +</ul> + + + + </div> + </div> + </nav> + + <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> + + + <nav class="wy-nav-top" aria-label="top navigation"> + + <i data-toggle="wy-nav-top" class="fa fa-bars"></i> + <a href="index.html">FINN</a> + + </nav> + + + <div class="wy-nav-content"> + + <div class="rst-content"> + + + + + + + + + + + + + + + + + +<div role="navigation" aria-label="breadcrumbs navigation"> + + <ul class="wy-breadcrumbs"> + + <li><a href="index.html">Docs</a> »</li> + + <li>FINN - End-to-End Flow</li> + + + <li class="wy-breadcrumbs-aside"> + + + <a href="_sources/end_to_end_flow.rst.txt" rel="nofollow"> View page source</a> + + + </li> + + </ul> + + + <hr/> +</div> + <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> + <div itemprop="articleBody"> + + <div class="section" id="finn-end-to-end-flow"> +<h1>FINN - End-to-End Flow<a class="headerlink" href="#finn-end-to-end-flow" title="Permalink to this headline">¶</a></h1> +</div> + + + </div> + + </div> + <footer> + + <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation"> + + <a href="getting_started.html" class="btn btn-neutral float-right" title="Getting Started" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a> + + + <a href="index.html" class="btn btn-neutral float-left" title="FINN" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a> + + </div> + + + <hr/> + + <div role="contentinfo"> + <p> + © Copyright 2020, Y. Umuroglu, J. Petri-Koenig + + </p> + </div> + Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>. + +</footer> + + </div> + </div> + + </section> + + </div> + + + + <script type="text/javascript"> + jQuery(function () { + SphinxRtdTheme.Navigation.enable(true); + }); + </script> + + + + + + +</body> +</html> \ No newline at end of file diff --git a/docs/finn/_build/html/finn.transformation.fpgadataflow.html b/docs/finn/_build/html/finn.transformation.fpgadataflow.html index 7b698bbfa..878f3de34 100644 --- a/docs/finn/_build/html/finn.transformation.fpgadataflow.html +++ b/docs/finn/_build/html/finn.transformation.fpgadataflow.html @@ -78,30 +78,12 @@ - <!-- Local TOC --> - <div class="local-toc"><ul> -<li><a class="reference internal" href="#">finn.transformation.fpgadataflow package</a><ul> -<li><a class="reference internal" href="#submodules">Submodules</a></li> -<li><a class="reference internal" href="#module-finn.transformation.fpgadataflow.cleanup">finn.transformation.fpgadataflow.cleanup module</a></li> -<li><a class="reference internal" href="#module-finn.transformation.fpgadataflow.codegen_ipgen">finn.transformation.fpgadataflow.codegen_ipgen module</a></li> -<li><a class="reference internal" href="#module-finn.transformation.fpgadataflow.codegen_ipstitch">finn.transformation.fpgadataflow.codegen_ipstitch module</a></li> -<li><a class="reference internal" href="#module-finn.transformation.fpgadataflow.codegen_npysim">finn.transformation.fpgadataflow.codegen_npysim module</a></li> -<li><a class="reference internal" href="#module-finn.transformation.fpgadataflow.compile">finn.transformation.fpgadataflow.compile module</a></li> -<li><a class="reference internal" href="#module-finn.transformation.fpgadataflow.convert_to_hls_layers">finn.transformation.fpgadataflow.convert_to_hls_layers module</a></li> -<li><a class="reference internal" href="#module-finn.transformation.fpgadataflow.create_dataflow_partition">finn.transformation.fpgadataflow.create_dataflow_partition module</a></li> -<li><a class="reference internal" href="#module-finn.transformation.fpgadataflow.hlssynth_ipgen">finn.transformation.fpgadataflow.hlssynth_ipgen module</a></li> -<li><a class="reference internal" href="#module-finn.transformation.fpgadataflow.insert_tlastmarker">finn.transformation.fpgadataflow.insert_tlastmarker module</a></li> -<li><a class="reference internal" href="#module-finn.transformation.fpgadataflow.make_deployment">finn.transformation.fpgadataflow.make_deployment module</a></li> -<li><a class="reference internal" href="#module-finn.transformation.fpgadataflow.make_pynq_driver">finn.transformation.fpgadataflow.make_pynq_driver module</a></li> -<li><a class="reference internal" href="#module-finn.transformation.fpgadataflow.make_pynq_proj">finn.transformation.fpgadataflow.make_pynq_proj module</a></li> -<li><a class="reference internal" href="#finn-transformation-fpgadataflow-set-sim-mode-module">finn.transformation.fpgadataflow.set_sim_mode module</a></li> -<li><a class="reference internal" href="#module-finn.transformation.fpgadataflow.synth_pynq_proj">finn.transformation.fpgadataflow.synth_pynq_proj module</a></li> -<li><a class="reference internal" href="#module-finn.transformation.fpgadataflow.templates">finn.transformation.fpgadataflow.templates module</a></li> -<li><a class="reference internal" href="#module-finn.transformation.fpgadataflow">Module contents</a></li> + <ul> +<li class="toctree-l1"><a class="reference internal" href="end_to_end_flow.html">FINN - End-to-End Flow</a></li> +<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="source_code.html">Source Code</a></li> </ul> -</li> -</ul> -</div> + </div> diff --git a/docs/finn/_build/html/finn.transformation.html b/docs/finn/_build/html/finn.transformation.html index 5224ebc2e..0407b0f9c 100644 --- a/docs/finn/_build/html/finn.transformation.html +++ b/docs/finn/_build/html/finn.transformation.html @@ -78,25 +78,12 @@ - <!-- Local TOC --> - <div class="local-toc"><ul> -<li><a class="reference internal" href="#">finn.transformation package</a><ul> -<li><a class="reference internal" href="#subpackages">Subpackages</a></li> -<li><a class="reference internal" href="#submodules">Submodules</a></li> -<li><a class="reference internal" href="#module-finn.transformation.batchnorm_to_affine">finn.transformation.batchnorm_to_affine module</a></li> -<li><a class="reference internal" href="#module-finn.transformation.bipolar_to_xnor">finn.transformation.bipolar_to_xnor module</a></li> -<li><a class="reference internal" href="#module-finn.transformation.fold_constants">finn.transformation.fold_constants module</a></li> -<li><a class="reference internal" href="#module-finn.transformation.general">finn.transformation.general module</a></li> -<li><a class="reference internal" href="#module-finn.transformation.infer_datatypes">finn.transformation.infer_datatypes module</a></li> -<li><a class="reference internal" href="#module-finn.transformation.infer_shapes">finn.transformation.infer_shapes module</a></li> -<li><a class="reference internal" href="#module-finn.transformation">Module contents</a><ul> -<li><a class="reference internal" href="#guide-to-writing-finn-transformations">Guide to writing FINN transformations</a></li> + <ul> +<li class="toctree-l1"><a class="reference internal" href="end_to_end_flow.html">FINN - End-to-End Flow</a></li> +<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="source_code.html">Source Code</a></li> </ul> -</li> -</ul> -</li> -</ul> -</div> + </div> diff --git a/docs/finn/_build/html/genindex.html b/docs/finn/_build/html/genindex.html index ce9b2ccb8..1d58d38f7 100644 --- a/docs/finn/_build/html/genindex.html +++ b/docs/finn/_build/html/genindex.html @@ -79,8 +79,12 @@ - <!-- Local TOC --> - <div class="local-toc"></div> + <ul> +<li class="toctree-l1"><a class="reference internal" href="end_to_end_flow.html">FINN - End-to-End Flow</a></li> +<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="source_code.html">Source Code</a></li> +</ul> + </div> diff --git a/docs/finn/_build/html/getting_started.html b/docs/finn/_build/html/getting_started.html new file mode 100644 index 000000000..42798fdba --- /dev/null +++ b/docs/finn/_build/html/getting_started.html @@ -0,0 +1,204 @@ + + +<!DOCTYPE html> +<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]--> +<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]--> +<head> + <meta charset="utf-8"> + + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + + <title>Getting Started — FINN documentation</title> + + + + + + + + + <script type="text/javascript" src="_static/js/modernizr.min.js"></script> + + + <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script> + <script type="text/javascript" src="_static/jquery.js"></script> + <script type="text/javascript" src="_static/underscore.js"></script> + <script type="text/javascript" src="_static/doctools.js"></script> + <script type="text/javascript" src="_static/language_data.js"></script> + + <script type="text/javascript" src="_static/js/theme.js"></script> + + + + + <link rel="stylesheet" href="_static/css/theme.css" type="text/css" /> + <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="Source Code" href="source_code.html" /> + <link rel="prev" title="FINN - End-to-End Flow" href="end_to_end_flow.html" /> +</head> + +<body class="wy-body-for-nav"> + + + <div class="wy-grid-for-nav"> + + <nav data-toggle="wy-nav-shift" class="wy-nav-side"> + <div class="wy-side-scroll"> + <div class="wy-side-nav-search" > + + + + <a href="index.html" class="icon icon-home"> FINN + + + + </a> + + + + + + + +<div role="search"> + <form id="rtd-search-form" class="wy-form" action="search.html" method="get"> + <input type="text" name="q" placeholder="Search docs" /> + <input type="hidden" name="check_keywords" value="yes" /> + <input type="hidden" name="area" value="default" /> + </form> +</div> + + + </div> + + <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation"> + + + + + + + <ul class="current"> +<li class="toctree-l1"><a class="reference internal" href="end_to_end_flow.html">FINN - End-to-End Flow</a></li> +<li class="toctree-l1 current"><a class="current reference internal" href="#">Getting Started</a></li> +<li class="toctree-l1"><a class="reference internal" href="source_code.html">Source Code</a></li> +</ul> + + + + </div> + </div> + </nav> + + <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> + + + <nav class="wy-nav-top" aria-label="top navigation"> + + <i data-toggle="wy-nav-top" class="fa fa-bars"></i> + <a href="index.html">FINN</a> + + </nav> + + + <div class="wy-nav-content"> + + <div class="rst-content"> + + + + + + + + + + + + + + + + + +<div role="navigation" aria-label="breadcrumbs navigation"> + + <ul class="wy-breadcrumbs"> + + <li><a href="index.html">Docs</a> »</li> + + <li>Getting Started</li> + + + <li class="wy-breadcrumbs-aside"> + + + <a href="_sources/getting_started.rst.txt" rel="nofollow"> View page source</a> + + + </li> + + </ul> + + + <hr/> +</div> + <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> + <div itemprop="articleBody"> + + <div class="section" id="getting-started"> +<h1>Getting Started<a class="headerlink" href="#getting-started" title="Permalink to this headline">¶</a></h1> +</div> + + + </div> + + </div> + <footer> + + <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation"> + + <a href="source_code.html" class="btn btn-neutral float-right" title="Source Code" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a> + + + <a href="end_to_end_flow.html" class="btn btn-neutral float-left" title="FINN - End-to-End Flow" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a> + + </div> + + + <hr/> + + <div role="contentinfo"> + <p> + © Copyright 2020, Y. Umuroglu, J. Petri-Koenig + + </p> + </div> + Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>. + +</footer> + + </div> + </div> + + </section> + + </div> + + + + <script type="text/javascript"> + jQuery(function () { + SphinxRtdTheme.Navigation.enable(true); + }); + </script> + + + + + + +</body> +</html> \ No newline at end of file diff --git a/docs/finn/_build/html/index.html b/docs/finn/_build/html/index.html index 38e5cad4b..9fad3773b 100644 --- a/docs/finn/_build/html/index.html +++ b/docs/finn/_build/html/index.html @@ -34,7 +34,8 @@ <link rel="stylesheet" href="_static/css/theme.css" type="text/css" /> <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="search" title="Search" href="search.html" /> + <link rel="next" title="FINN - End-to-End Flow" href="end_to_end_flow.html" /> </head> <body class="wy-body-for-nav"> @@ -78,15 +79,12 @@ - <!-- Local TOC --> - <div class="local-toc"><ul> -<li><a class="reference internal" href="#">FINN</a><ul> -<li><a class="reference internal" href="#what-is-finn">What is FINN?</a></li> -<li><a class="reference internal" href="#indices-and-tables">Indices and tables</a></li> + <ul> +<li class="toctree-l1"><a class="reference internal" href="end_to_end_flow.html">FINN - End-to-End Flow</a></li> +<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="source_code.html">Source Code</a></li> </ul> -</li> -</ul> -</div> + </div> @@ -151,28 +149,21 @@ <div class="section" id="finn"> <h1>FINN<a class="headerlink" href="#finn" title="Permalink to this headline">¶</a></h1> +<p><strong>This website is currently under construction.</strong></p> <p>FINN is an experimental framework from Xilinx Research Labs to explore deep neural network inference on FPGAs. It specifically targets quantized neural networks, with emphasis on generating dataflow-style architectures customized for each network. It is not intended to be a generic DNN accelerator like xDNN, but rather a tool for exploring the design space of DNN inference accelerators on FPGAs.</p> <div class="section" id="what-is-finn"> <h2>What is FINN?<a class="headerlink" href="#what-is-finn" title="Permalink to this headline">¶</a></h2> <p>‘FINN’ is colloquially used to refer to two separate but highly related things:</p> <ul class="simple"> -<li><p>The FINN project, which includes tools for training quantized neural networks such as Brevitas, the FINN compiler, and the finn-hlslib Vivado HLS library of FPGA components for QNNs. An overview of the project can be taken from the following graphic and details can be seen on the project homepage.</p></li> +<li><p>The FINN project, which includes tools for training quantized neural networks such as Brevitas, the FINN compiler, and the finn-hlslib Vivado HLS library of FPGA components for QNNs. An overview of the project can be taken from the following graphic and details can be seen on the <a class="reference external" href="https://xilinx.github.io/finn/">FINN project homepage</a>.</p></li> </ul> -<a class="reference internal image-reference" href="_images/finn-stack.png"><img alt="_images/finn-stack.png" class="align-center" src="_images/finn-stack.png" style="width: 480.75px; height: 450.0px;" /></a> +<a class="reference internal image-reference" href="_images/finn-stack.png"><img alt="_images/finn-stack.png" class="align-center" src="_images/finn-stack.png" style="width: 480.75px; height: 468.75px;" /></a> <ul class="simple"> -<li><p>The repository, this Read the Docs website corresponds to. This is the FINN compiler, which is the centerpiece of the FINN project. The GitHub repository can be viewed using the link in the upper right corner.</p></li> +<li><p>The repository, this Read the Docs website corresponds to. It is about the FINN compiler, which is the centerpiece of the FINN project. The GitHub repository can be viewed using the link in the upper right corner. To learn more about the FINN compiler, use this website and for a hands-on experience the repository contains some Jupyter notebooks which can be found under this <a class="reference external" href="https://github.com/Xilinx/finn/tree/dev/notebooks">link</a>.</p></li> </ul> <div class="toctree-wrapper compound"> </div> </div> -<div class="section" id="indices-and-tables"> -<h2>Indices and tables<a class="headerlink" href="#indices-and-tables" title="Permalink to this headline">¶</a></h2> -<ul class="simple"> -<li><p><a class="reference internal" href="genindex.html"><span class="std std-ref">Index</span></a></p></li> -<li><p><a class="reference internal" href="py-modindex.html"><span class="std std-ref">Module Index</span></a></p></li> -<li><p><a class="reference internal" href="search.html"><span class="std std-ref">Search Page</span></a></p></li> -</ul> -</div> </div> @@ -181,6 +172,13 @@ </div> <footer> + <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation"> + + <a href="end_to_end_flow.html" class="btn btn-neutral float-right" title="FINN - End-to-End Flow" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a> + + + </div> + <hr/> diff --git a/docs/finn/_build/html/modules.html b/docs/finn/_build/html/modules.html index d3401a10b..7c636d62b 100644 --- a/docs/finn/_build/html/modules.html +++ b/docs/finn/_build/html/modules.html @@ -78,11 +78,12 @@ - <!-- Local TOC --> - <div class="local-toc"><ul> -<li><a class="reference internal" href="#">src</a></li> + <ul> +<li class="toctree-l1"><a class="reference internal" href="end_to_end_flow.html">FINN - End-to-End Flow</a></li> +<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="source_code.html">Source Code</a></li> </ul> -</div> + </div> diff --git a/docs/finn/_build/html/objects.inv b/docs/finn/_build/html/objects.inv index d51d8e9c3322c2ecf119e0ad48d6cc37fae43435..6c1470ab78bd9139da07a32aee3313c43be1de06 100644 GIT binary patch delta 3438 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 QJSJhKpZ<UMe~R;$?sdhGRsaA1 delta 3364 zcmV+<4cqd;8}}NJbbrfo<G2;w_gA<o*)}UZlS-v#XS>rKSGC=aEmtxt7DPf4ViLdr zpe^O=g9j;*5?>&3*}ako66YLTye=+Da6>4);)maImKGVl`peZuCqz4yXMb`@AOC#y z@q<l76lDiV<mKhnnf`pyhHp`d6xw9$y$7UznFnID%VaDMRDbPafn|)PA~{lo(FLh` zHEar+*#DmfRSeLBm+!1pfy<&8XBpcbCO4!CAVOIdD@-L5GT!|9ORus4G0_&Qm}61m z#T!Ifq2w$`BIArujKnMy%2FH?%C#E(6XQL{iNa~jM2aUNzhOZ(hd3#uVtH)fr}ya= ztSapYJW^l61b@ENVN%;Q*fXZBsRN&$G5W0ktV)C=LsC{UPXGfsqno>j>!;rh08&bj zb)oPSkjL-euAgS2eEIhMdgXe;43xWv)u+GB#|R+f*8mU!Wc+nL#NTH^tp4#7pq0IZ zsM?nRb^8*aa$iE!?n{8`eF;#%dM;z{IJE;ARy&sZLw~G^dMByc&A~9!pz&g=GqF@+ zE*>rNm@_HKI>YfB%8GKrnE@$tZ7=PU9C7CW5;L(Xyv4Ihnxp-!?1awAF3Fbqv>v?2 ziEgL$ncI5~ZNccmJ@)~+WN99py$i&7Ss6Zh>Y1Z^bMWsI(x|z;6QQ~K8D-&atYn9i z*ZAbT#(#2$xc0H7_Uy=p_*CN%Ny2ijz4kT9h&qIT)z_pNmC7Rb=`I6+T<H2t!T_4# zp=Mi(ax6pP5=s<78Tns0sT#wsn2Zg0DA2O(4evM{tXmre2DN=4Fs7Yr2;HzCxcYY& z0w_nXIL0|whuDmkrZ*|PSHYkuem|Amw*Mf|=6@grkibS#Sw$fLC3*`|LK(h;ONb6G zVLG@3=!;4qDmP5z<G~oEd)qI(r~hNl$j*8K$Icn)h*=E^IQlZaPRu2ONturjBRy5x zE`IEcV*s5eR<^ySL90_8Rz04+wg0~JOGm1S(3ADTnrF>nJdj;dXb`j53I-ILZX{>H z>3`uC3k%rSFURBAnzmi>=*H>wQ|lNq9#n=hUM<Qu1*iXJK>Kw=t+a9NKfgVXXth1@ z>S5eyouTA)&GyG$*kg#9OakTSF@F%E#5CV6rdU{_m~eft93AC)k(ER8<(%kVBnjPS z*!I<Apast(G>PU$f)aqGO0mAOfApG3z<-S4Ok4|&;-K9^lDIn^v0|nvz_D4!n+sgF zhqT@xx;)*0)MMtsc`Rk0!m)OQP%a^fRJ>tXs%_}1uFH80&!_v<LWG3s4vh5>+!bF9 z$Ti+03BXn4Ywfd?hU^T@24r+&;S#3I*cxTJ=8~*PAxmXv$mJ%KOjpzrj({yn%YTyw zFl78-hWu&{aP1L}jtjKS5n!9p4Lmgym|X}!(inGMs0`F+g2p%Tn;1#h3Ewziaf%bb ziCwX+9s=SddkxExF#5(a8^^FSY&o?v0kUrDWQ%T3XYS0IuXP>4)>jkwf!AS^6hW@n zrU(LChfER!v0j-Z1ZG_`MGD-qV1J4l=kyw<a7-v`IZcqx@nlWlPV`h|rKF#$3gO)U zNs1ts2~z}lMv<2h1-a;$qGw8Id>LgRON%K&0GA+B<bXN(lf=L*2Bt_Ec^k!Fj2mVN z-EOpNe$Ye88mVLlvSetdik_?FFSp-p@=c{6*kZwp8F-oCsReR@;3p+PS$`6%9Opk= z#QP5x0k%l;lmW3k@{|CxF!B=tw<Pk@0eUaRR|@>ymdT3X?#K8`GS9HrTtl@JSnjmU z?&r>aq`Y@bwmbEcXoFn$Pf-K6VDwi58Go3d20ZfMuL(5fFiFnO)P5Asd3Kyiev&FH zN1vaf${@orep0{#F@AC&Lw_)SN|p(}_-O(OyZA`}47m6S0SmQw%76*7_=$iIujFXY z8OxRkuQaGmCB8@dN0ST~UKzu@RCr~amPNuVqolwG6~@T`4JwS2031{pC1Noze!QCH zy!dgN7V*JGNm<SZ8zpBEA8eG8g?+G5nqYmfQ4*H$!A1#z_rb==0DtzuMu`CP!K%fy z1aZ5R_M%jd#48ri_|fW{{(pbu3g*CdZ~(h%U94c9P$waT&(lc;<K1-8!QC9`VqD_h z!w7D;y9|BgkYVUPUPxE9mlxbA?PCXx+IA8{`n_GG;2v%l@iHD{7dwcr*hL2D6?RdA z`G1{+FrHo)T}YoUFMl#cjyGs$>{8GKitf$fs*dZqbwMxQ?EMV-(ZlRb(9aQQ!-9U2 zkh>W4GtJzQ;0(OnL!@<+4PUIw7VZxz@RsOKewfieDhSiK>U$&ji#aX;tIn-WrAyel z8}Vp)-JqwH<>&I$W1Y{lTTkMd-QB0Lh8YH?aR(Y6rjdsnHh-omm^qy6DHELWgcVfH z=oEFB=s)`4u{^j(N{@dNn*RXe?1nysAErqUu>@+oLo^|q=@3`I2H7~sk;;qAXCgRm z>(#LVee-;K6F<9VbphFE)@_L6pd!S1*5ZWwAlmSzwpeanQb!vTR0>k)7Tn0jOdoXG zid`R>Cfi~ZLw^tx5zaCs42@}9Va(ISv~N*hp>ABV>lG_j?<w<a<xLmDa3-o{H&j)K zDjCFXO~~krKD@0HOtw%Ta1dMcZVJ|O@i?<I-qp!4q6J@uCAu}gFMP=OJ<DYemXS3v zl}t}RX2X-y#$bTvt8?l8nBuQ>W(ZSuGcILTsr}EkCx3~6EbHiMMLqF@+P8yu87tSe znS-~nBRiJ##0_ZQR!(T!+O5>UjcQqR$&PFwW^AxP8_xO}#_uq%h1jPWCAb+|IHNnW zXu2U3iNpExlwgMT)B#)-noPMBqdAUy!dhXgql-7XwP%LIUclw=(g9l?x=FaNsV(7b zG|9})PJhq#@b2*|n7h%-32R$IrR{iqPq_rO?<Jw`=O(G|;TNc~UQ)wa+s27f%rkb# zaa%wzsHxA`qR;m4iaq}R@Gl?}_faljT7IB^#Hk=};LZ4)F1ptVrj(zL>`><IW?jm{ zT(JKxW?w^gEa#&>z=;AkZyPDBb=?H8lzGqCB7ZyIz#Djo7S_Z)4~ot;uG<?R3lg_0 zv8ur1bFp5r>olDevg^PM5v{ABzv>a_3DK10EBpTXL-oa_*`iyKgG<M{#@87J5r2st zTK)?qe-!vZFZ9DoKf?_n+uf6^ZpVd*b)R9nrDOF~ym{8>hYn{D_w~1c)^LDM@ADCS zrhgqSK|@%;-I~wF+)z7RI?5Ea%by!0eReqK@B$xcj|m)Ttw)bFpoJVkbZvh=-4JuD z>y9ec@sL5N5_J(mTe9TU^PuJIe@<`-(uE3K8F|qHw~~Sv_zOxD6W<HdoSw;+-lHug zsz@<haXTsD3Y)MjLtL7T`nieErGR6^1%H?JDP77_nJ~gv4N=AmUYH?jnD;yXL9}oU zN?<0^5iykM&8TFE?%5mG4d&4V;6UoHoe11?mhU-184?vMTA+k2j7t_((=A-o1|wim zSwYj&_Hh!jXPi+*PbT4-rned4tA>Km)*Z(TXJzyCa&r&RN&qx*gXb6%(TOXzs(+{h z+jfX@u2Bm`TB1)TwcR-O%o<6OOv@GBa(+{gENzK(pYr!-G-bv#?RnMC7fG^0B(s3l z=66PZ^Ccel=(Gv=#2mG~w%Ctm_P{Od?r^5j;51H|vY$qebz9iBzKYThXr2TyX>nTL zThbRp#p}cIGt&N<tpLH8^3P7F!ha&e=3P474FuVn7eh@<hUD=^u>5p?TKa?An7^%c zjW@wC995f%n(l31@!{s#?~Ol{urW^aWduUE6SCu6Pm9xQ$qxSoH^nd(-)ak2#qj}i zAGt=!Ygq`dv8A3lLPDU!FFU;Vw@3rWB)cz*nH1fj)(3?x_+-eVs9z|bkAGIf2vFRz ztnPbV?j8N<SViv8+)lOW<dzVbUoD1Wku#}m-$gRkrHyA6_q<MxT36$fAxqPhZ@r&B zLOKbope;qW!`8II_dgvy(7zftw(R32zLR(-LNy1gwwI6n(L5*OZXh!wyN@&aO~wsG zelV}yxJlVQplWu%;6Bw>eSiDitGZ04$nLs8=!RMU(R=<@SSoK~ld0UPR<~IDDcm^4 zn|QOQzTD?9+N0I(YdROEptFEn-dI;;^2!;ZBZtT<snXw4mRx--FEMBBzbn(r(H1*4 zL{WB-L|$B9oj7GYUE7M#?C+g$7k8|C&Nqn?Ch!HWNvy%xYnr*LcYnezvo_uqJ4@>T z=`Uo@Mgmv8-;=L%oxQAf&e3wW>Z<i6w{Fb-LJU1&a5elUOb>PK2HF7e*$VP%=yqJ4 z)Gjj5@sFM4s<sd<bLml+&=l`&rVOodX0lbOF4vv;`{8t1iCw$m%iY7n2i@yip!nfq ub;4bH??yQX>V~#PCmk%4+{IEPAEfpgl3f$krMYXK-T6mToc{w)j8xi^5S&2( diff --git a/docs/finn/_build/html/py-modindex.html b/docs/finn/_build/html/py-modindex.html index c72fcdc41..56dfa4763 100644 --- a/docs/finn/_build/html/py-modindex.html +++ b/docs/finn/_build/html/py-modindex.html @@ -81,8 +81,12 @@ - <!-- Local TOC --> - <div class="local-toc"></div> + <ul> +<li class="toctree-l1"><a class="reference internal" href="end_to_end_flow.html">FINN - End-to-End Flow</a></li> +<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="source_code.html">Source Code</a></li> +</ul> + </div> diff --git a/docs/finn/_build/html/search.html b/docs/finn/_build/html/search.html index 507b33139..869a314d3 100644 --- a/docs/finn/_build/html/search.html +++ b/docs/finn/_build/html/search.html @@ -79,8 +79,12 @@ - <!-- Local TOC --> - <div class="local-toc"></div> + <ul> +<li class="toctree-l1"><a class="reference internal" href="end_to_end_flow.html">FINN - End-to-End Flow</a></li> +<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="source_code.html">Source Code</a></li> +</ul> + </div> diff --git a/docs/finn/_build/html/searchindex.js b/docs/finn/_build/html/searchindex.js index 76340dc94..26e2f7334 100644 --- a/docs/finn/_build/html/searchindex.js +++ b/docs/finn/_build/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({docnames:["finn","finn.analysis","finn.analysis.fpgadataflow","finn.core","finn.custom_op","finn.custom_op.fpgadataflow","finn.transformation","finn.transformation.fpgadataflow","finn.transformation.streamline","finn.util","index","modules"],envversion:{"sphinx.domains.c":1,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":1,"sphinx.domains.javascript":1,"sphinx.domains.math":2,"sphinx.domains.python":1,"sphinx.domains.rst":1,"sphinx.domains.std":1,sphinx:56},filenames:["finn.rst","finn.analysis.rst","finn.analysis.fpgadataflow.rst","finn.core.rst","finn.custom_op.rst","finn.custom_op.fpgadataflow.rst","finn.transformation.rst","finn.transformation.fpgadataflow.rst","finn.transformation.streamline.rst","finn.util.rst","index.rst","modules.rst"],objects:{"":{finn:[0,0,0,"-"]},"finn.analysis":{fpgadataflow:[2,0,0,"-"],topology:[1,0,0,"-"],verify_custom_nodes:[1,0,0,"-"]},"finn.analysis.fpgadataflow":{hls_synth_res_estimation:[2,0,0,"-"],res_estimation:[2,0,0,"-"]},"finn.analysis.fpgadataflow.hls_synth_res_estimation":{hls_synth_res_estimation:[2,1,1,""]},"finn.analysis.fpgadataflow.res_estimation":{res_estimation:[2,1,1,""]},"finn.analysis.topology":{all_tensors_f32:[1,1,1,""],get_per_tensor_fanouts:[1,1,1,""],is_linear:[1,1,1,""],node_inputs_in_expected_order:[1,1,1,""]},"finn.analysis.verify_custom_nodes":{verify_nodes:[1,1,1,""]},"finn.core":{datatype:[3,0,0,"-"],execute_custom_node:[3,0,0,"-"],modelwrapper:[3,0,0,"-"],onnx_exec:[3,0,0,"-"]},"finn.core.datatype":{DataType:[3,2,1,""]},"finn.core.datatype.DataType":{BINARY:[3,3,1,""],BIPOLAR:[3,3,1,""],FLOAT32:[3,3,1,""],INT16:[3,3,1,""],INT2:[3,3,1,""],INT32:[3,3,1,""],INT3:[3,3,1,""],INT4:[3,3,1,""],INT8:[3,3,1,""],TERNARY:[3,3,1,""],UINT16:[3,3,1,""],UINT2:[3,3,1,""],UINT32:[3,3,1,""],UINT3:[3,3,1,""],UINT4:[3,3,1,""],UINT8:[3,3,1,""],allowed:[3,4,1,""],bitwidth:[3,4,1,""],get_hls_datatype_str:[3,4,1,""],get_num_possible_values:[3,4,1,""],get_smallest_possible:[3,4,1,""],is_integer:[3,4,1,""],max:[3,4,1,""],min:[3,4,1,""],signed:[3,4,1,""]},"finn.core.execute_custom_node":{execute_custom_node:[3,1,1,""]},"finn.core.modelwrapper":{ModelWrapper:[3,2,1,""]},"finn.core.modelwrapper.ModelWrapper":{analysis:[3,4,1,""],check_all_tensor_shapes_specified:[3,4,1,""],check_compatibility:[3,4,1,""],find_consumer:[3,4,1,""],find_producer:[3,4,1,""],get_all_tensor_names:[3,4,1,""],get_initializer:[3,4,1,""],get_metadata_prop:[3,4,1,""],get_tensor_datatype:[3,4,1,""],get_tensor_fanout:[3,4,1,""],get_tensor_shape:[3,4,1,""],get_tensor_valueinfo:[3,4,1,""],graph:[3,4,1,""],make_empty_exec_context:[3,4,1,""],make_new_valueinfo_name:[3,4,1,""],model:[3,4,1,""],rename_tensor:[3,4,1,""],save:[3,4,1,""],set_initializer:[3,4,1,""],set_metadata_prop:[3,4,1,""],set_tensor_datatype:[3,4,1,""],set_tensor_shape:[3,4,1,""],transform:[3,4,1,""]},"finn.core.onnx_exec":{compare_execution:[3,1,1,""],execute_node:[3,1,1,""],execute_onnx:[3,1,1,""],execute_onnx_and_make_model:[3,1,1,""]},"finn.custom_op":{CustomOp:[4,2,1,""],fpgadataflow:[5,0,0,"-"],multithreshold:[4,0,0,"-"],registry:[4,0,0,"-"],streamingdataflowpartition:[4,0,0,"-"],xnorpopcount:[4,0,0,"-"]},"finn.custom_op.CustomOp":{execute_node:[4,4,1,""],get_nodeattr:[4,4,1,""],get_nodeattr_types:[4,4,1,""],infer_node_datatype:[4,4,1,""],make_shape_compatible_op:[4,4,1,""],set_nodeattr:[4,4,1,""],verify_node:[4,4,1,""]},"finn.custom_op.fpgadataflow":{HLSCustomOp:[5,2,1,""],convolutioninputgenerator:[5,0,0,"-"],streamingfclayer_batch:[5,0,0,"-"],streamingmaxpool_batch:[5,0,0,"-"],templates:[5,0,0,"-"],tlastmarker:[5,0,0,"-"]},"finn.custom_op.fpgadataflow.HLSCustomOp":{blackboxfunction:[5,4,1,""],bram_estimation:[5,4,1,""],code_generation_ipgen:[5,4,1,""],code_generation_npysim:[5,4,1,""],compile_singlenode_code:[5,4,1,""],dataoutstrm:[5,4,1,""],defines:[5,4,1,""],docompute:[5,4,1,""],dynamic_input_to_npy:[5,4,1,""],exec_precompiled_singlenode_model:[5,4,1,""],execute_node:[5,4,1,""],generate_params:[5,4,1,""],get_folded_input_shape:[5,4,1,""],get_folded_output_shape:[5,4,1,""],get_instream_width:[5,4,1,""],get_nodeattr_types:[5,4,1,""],get_number_output_values:[5,4,1,""],get_outstream_width:[5,4,1,""],global_includes:[5,4,1,""],ipgen_singlenode_code:[5,4,1,""],lut_estimation:[5,4,1,""],node_res_estimation:[5,4,1,""],npy_to_dynamic_output:[5,4,1,""],pragmas:[5,4,1,""],read_npy_data:[5,4,1,""],reset_rtlsim:[5,4,1,""],rtlsim:[5,4,1,""],save_as_npy:[5,4,1,""],strm_decl:[5,4,1,""],toggle_clk:[5,4,1,""]},"finn.custom_op.fpgadataflow.convolutioninputgenerator":{ConvolutionInputGenerator:[5,2,1,""]},"finn.custom_op.fpgadataflow.convolutioninputgenerator.ConvolutionInputGenerator":{blackboxfunction:[5,4,1,""],bram_estimation:[5,4,1,""],dataoutstrm:[5,4,1,""],defines:[5,4,1,""],docompute:[5,4,1,""],execute_node:[5,4,1,""],get_input_datatype:[5,4,1,""],get_nodeattr_types:[5,4,1,""],get_number_output_values:[5,4,1,""],get_output_datatype:[5,4,1,""],get_stream_width:[5,4,1,""],global_includes:[5,4,1,""],infer_node_datatype:[5,4,1,""],lut_estimation:[5,4,1,""],make_shape_compatible_op:[5,4,1,""],pragmas:[5,4,1,""],read_npy_data:[5,4,1,""],save_as_npy:[5,4,1,""],strm_decl:[5,4,1,""],verify_node:[5,4,1,""]},"finn.custom_op.fpgadataflow.streamingfclayer_batch":{StreamingFCLayer_Batch:[5,2,1,""]},"finn.custom_op.fpgadataflow.streamingfclayer_batch.StreamingFCLayer_Batch":{blackboxfunction:[5,4,1,""],bram_estimation:[5,4,1,""],calc_tmem:[5,4,1,""],calc_wmem:[5,4,1,""],dataoutstrm:[5,4,1,""],defines:[5,4,1,""],docompute:[5,4,1,""],execute_node:[5,4,1,""],generate_params:[5,4,1,""],get_folded_input_shape:[5,4,1,""],get_folded_output_shape:[5,4,1,""],get_hls_compatible_threshold_tensor:[5,4,1,""],get_hls_compatible_weight_tensor:[5,4,1,""],get_input_datatype:[5,4,1,""],get_instream_width:[5,4,1,""],get_nodeattr_types:[5,4,1,""],get_number_output_values:[5,4,1,""],get_output_datatype:[5,4,1,""],get_outstream_width:[5,4,1,""],get_template_param_values:[5,4,1,""],get_weight_datatype:[5,4,1,""],global_includes:[5,4,1,""],infer_node_datatype:[5,4,1,""],lut_estimation:[5,4,1,""],make_shape_compatible_op:[5,4,1,""],pragmas:[5,4,1,""],read_npy_data:[5,4,1,""],save_as_npy:[5,4,1,""],strm_decl:[5,4,1,""],verify_node:[5,4,1,""]},"finn.custom_op.fpgadataflow.streamingmaxpool_batch":{StreamingMaxPool_Batch:[5,2,1,""]},"finn.custom_op.fpgadataflow.streamingmaxpool_batch.StreamingMaxPool_Batch":{blackboxfunction:[5,4,1,""],bram_estimation:[5,4,1,""],dataoutstrm:[5,4,1,""],defines:[5,4,1,""],docompute:[5,4,1,""],get_nodeattr_types:[5,4,1,""],get_number_output_values:[5,4,1,""],global_includes:[5,4,1,""],infer_node_datatype:[5,4,1,""],lut_estimation:[5,4,1,""],make_shape_compatible_op:[5,4,1,""],pragmas:[5,4,1,""],read_npy_data:[5,4,1,""],save_as_npy:[5,4,1,""],strm_decl:[5,4,1,""],verify_node:[5,4,1,""]},"finn.custom_op.fpgadataflow.tlastmarker":{TLastMarker:[5,2,1,""]},"finn.custom_op.fpgadataflow.tlastmarker.TLastMarker":{blackboxfunction:[5,4,1,""],dataoutstrm:[5,4,1,""],defines:[5,4,1,""],docompute:[5,4,1,""],execute_node:[5,4,1,""],get_folded_input_shape:[5,4,1,""],get_folded_output_shape:[5,4,1,""],get_instream_width:[5,4,1,""],get_nodeattr_types:[5,4,1,""],get_number_output_values:[5,4,1,""],get_outstream_width:[5,4,1,""],global_includes:[5,4,1,""],infer_node_datatype:[5,4,1,""],make_shape_compatible_op:[5,4,1,""],pragmas:[5,4,1,""],read_npy_data:[5,4,1,""],save_as_npy:[5,4,1,""],strm_decl:[5,4,1,""],verify_node:[5,4,1,""]},"finn.custom_op.multithreshold":{MultiThreshold:[4,2,1,""],compare:[4,1,1,""],multithreshold:[4,1,1,""]},"finn.custom_op.multithreshold.MultiThreshold":{execute_node:[4,4,1,""],get_nodeattr_types:[4,4,1,""],infer_node_datatype:[4,4,1,""],make_shape_compatible_op:[4,4,1,""],verify_node:[4,4,1,""]},"finn.custom_op.registry":{getCustomOp:[4,1,1,""]},"finn.custom_op.streamingdataflowpartition":{StreamingDataflowPartition:[4,2,1,""]},"finn.custom_op.streamingdataflowpartition.StreamingDataflowPartition":{execute_node:[4,4,1,""],get_nodeattr_types:[4,4,1,""],infer_node_datatype:[4,4,1,""],make_shape_compatible_op:[4,4,1,""],verify_node:[4,4,1,""]},"finn.custom_op.xnorpopcount":{XnorPopcountMatMul:[4,2,1,""],xnorpopcountmatmul:[4,1,1,""]},"finn.custom_op.xnorpopcount.XnorPopcountMatMul":{execute_node:[4,4,1,""],get_nodeattr_types:[4,4,1,""],infer_node_datatype:[4,4,1,""],make_shape_compatible_op:[4,4,1,""],verify_node:[4,4,1,""]},"finn.transformation":{Transformation:[6,2,1,""],batchnorm_to_affine:[6,0,0,"-"],bipolar_to_xnor:[6,0,0,"-"],fold_constants:[6,0,0,"-"],fpgadataflow:[7,0,0,"-"],general:[6,0,0,"-"],infer_datatypes:[6,0,0,"-"],infer_shapes:[6,0,0,"-"],streamline:[8,0,0,"-"]},"finn.transformation.Transformation":{apply:[6,4,1,""]},"finn.transformation.batchnorm_to_affine":{BatchNormToAffine:[6,2,1,""]},"finn.transformation.batchnorm_to_affine.BatchNormToAffine":{apply:[6,4,1,""]},"finn.transformation.bipolar_to_xnor":{ConvertBipolarMatMulToXnorPopcount:[6,2,1,""]},"finn.transformation.bipolar_to_xnor.ConvertBipolarMatMulToXnorPopcount":{apply:[6,4,1,""]},"finn.transformation.fold_constants":{FoldConstants:[6,2,1,""]},"finn.transformation.fold_constants.FoldConstants":{apply:[6,4,1,""]},"finn.transformation.fpgadataflow":{cleanup:[7,0,0,"-"],codegen_ipgen:[7,0,0,"-"],codegen_ipstitch:[7,0,0,"-"],codegen_npysim:[7,0,0,"-"],compile:[7,0,0,"-"],convert_to_hls_layers:[7,0,0,"-"],create_dataflow_partition:[7,0,0,"-"],hlssynth_ipgen:[7,0,0,"-"],insert_tlastmarker:[7,0,0,"-"],make_deployment:[7,0,0,"-"],make_pynq_driver:[7,0,0,"-"],make_pynq_proj:[7,0,0,"-"],synth_pynq_proj:[7,0,0,"-"],templates:[7,0,0,"-"]},"finn.transformation.fpgadataflow.cleanup":{CleanUp:[7,2,1,""]},"finn.transformation.fpgadataflow.cleanup.CleanUp":{apply:[7,4,1,""]},"finn.transformation.fpgadataflow.codegen_ipgen":{CodeGen_ipgen:[7,2,1,""]},"finn.transformation.fpgadataflow.codegen_ipgen.CodeGen_ipgen":{apply:[7,4,1,""]},"finn.transformation.fpgadataflow.codegen_ipstitch":{CodeGen_ipstitch:[7,2,1,""]},"finn.transformation.fpgadataflow.codegen_ipstitch.CodeGen_ipstitch":{apply:[7,4,1,""]},"finn.transformation.fpgadataflow.codegen_npysim":{CodeGen_npysim:[7,2,1,""]},"finn.transformation.fpgadataflow.codegen_npysim.CodeGen_npysim":{apply:[7,4,1,""]},"finn.transformation.fpgadataflow.compile":{Compile:[7,2,1,""]},"finn.transformation.fpgadataflow.compile.Compile":{apply:[7,4,1,""]},"finn.transformation.fpgadataflow.convert_to_hls_layers":{InferBinaryStreamingFCLayer:[7,2,1,""]},"finn.transformation.fpgadataflow.convert_to_hls_layers.InferBinaryStreamingFCLayer":{apply:[7,4,1,""]},"finn.transformation.fpgadataflow.create_dataflow_partition":{CreateDataflowPartition:[7,2,1,""]},"finn.transformation.fpgadataflow.create_dataflow_partition.CreateDataflowPartition":{apply:[7,4,1,""]},"finn.transformation.fpgadataflow.hlssynth_ipgen":{HLSSynth_IPGen:[7,2,1,""]},"finn.transformation.fpgadataflow.hlssynth_ipgen.HLSSynth_IPGen":{apply:[7,4,1,""]},"finn.transformation.fpgadataflow.insert_tlastmarker":{InsertTLastMarker:[7,2,1,""]},"finn.transformation.fpgadataflow.insert_tlastmarker.InsertTLastMarker":{apply:[7,4,1,""]},"finn.transformation.fpgadataflow.make_deployment":{DeployToPYNQ:[7,2,1,""]},"finn.transformation.fpgadataflow.make_deployment.DeployToPYNQ":{apply:[7,4,1,""]},"finn.transformation.fpgadataflow.make_pynq_driver":{MakePYNQDriver:[7,2,1,""]},"finn.transformation.fpgadataflow.make_pynq_driver.MakePYNQDriver":{apply:[7,4,1,""]},"finn.transformation.fpgadataflow.make_pynq_proj":{MakePYNQProject:[7,2,1,""]},"finn.transformation.fpgadataflow.make_pynq_proj.MakePYNQProject":{apply:[7,4,1,""]},"finn.transformation.fpgadataflow.synth_pynq_proj":{SynthPYNQProject:[7,2,1,""]},"finn.transformation.fpgadataflow.synth_pynq_proj.SynthPYNQProject":{apply:[7,4,1,""]},"finn.transformation.general":{ConvertSubToAdd:[6,2,1,""],GiveRandomTensorNames:[6,2,1,""],GiveReadableTensorNames:[6,2,1,""],GiveUniqueNodeNames:[6,2,1,""]},"finn.transformation.general.ConvertSubToAdd":{apply:[6,4,1,""]},"finn.transformation.general.GiveRandomTensorNames":{apply:[6,4,1,""]},"finn.transformation.general.GiveReadableTensorNames":{apply:[6,4,1,""]},"finn.transformation.general.GiveUniqueNodeNames":{apply:[6,4,1,""]},"finn.transformation.infer_datatypes":{InferDataTypes:[6,2,1,""]},"finn.transformation.infer_datatypes.InferDataTypes":{apply:[6,4,1,""]},"finn.transformation.infer_shapes":{InferShapes:[6,2,1,""]},"finn.transformation.infer_shapes.InferShapes":{apply:[6,4,1,""]},"finn.transformation.streamline":{Streamline:[8,2,1,""],absorb:[8,0,0,"-"],collapse_repeated:[8,0,0,"-"],reorder:[8,0,0,"-"],round_thresholds:[8,0,0,"-"],sign_to_thres:[8,0,0,"-"]},"finn.transformation.streamline.Streamline":{apply:[8,4,1,""]},"finn.transformation.streamline.absorb":{Absorb1BitMulIntoMatMul:[8,2,1,""],AbsorbAddIntoMultiThreshold:[8,2,1,""],AbsorbMulIntoMultiThreshold:[8,2,1,""],FactorOutMulSignMagnitude:[8,2,1,""]},"finn.transformation.streamline.absorb.Absorb1BitMulIntoMatMul":{apply:[8,4,1,""]},"finn.transformation.streamline.absorb.AbsorbAddIntoMultiThreshold":{apply:[8,4,1,""]},"finn.transformation.streamline.absorb.AbsorbMulIntoMultiThreshold":{apply:[8,4,1,""]},"finn.transformation.streamline.absorb.FactorOutMulSignMagnitude":{apply:[8,4,1,""]},"finn.transformation.streamline.collapse_repeated":{CollapseRepeatedAdd:[8,2,1,""],CollapseRepeatedMul:[8,2,1,""],CollapseRepeatedOp:[8,2,1,""]},"finn.transformation.streamline.collapse_repeated.CollapseRepeatedOp":{apply:[8,4,1,""]},"finn.transformation.streamline.reorder":{MoveAddPastMul:[8,2,1,""],MoveScalarAddPastMatMul:[8,2,1,""],MoveScalarMulPastMatMul:[8,2,1,""]},"finn.transformation.streamline.reorder.MoveAddPastMul":{apply:[8,4,1,""]},"finn.transformation.streamline.reorder.MoveScalarAddPastMatMul":{apply:[8,4,1,""]},"finn.transformation.streamline.reorder.MoveScalarMulPastMatMul":{apply:[8,4,1,""]},"finn.transformation.streamline.round_thresholds":{RoundAndClipThresholds:[8,2,1,""]},"finn.transformation.streamline.round_thresholds.RoundAndClipThresholds":{apply:[8,4,1,""]},"finn.transformation.streamline.sign_to_thres":{ConvertSignToThres:[8,2,1,""]},"finn.transformation.streamline.sign_to_thres.ConvertSignToThres":{apply:[8,4,1,""]},"finn.util":{basic:[9,0,0,"-"],data_packing:[9,0,0,"-"],fpgadataflow:[9,0,0,"-"],onnx:[9,0,0,"-"],test:[9,0,0,"-"]},"finn.util.basic":{CppBuilder:[9,2,1,""],calculate_signed_dot_prod_range:[9,1,1,""],gen_finn_dt_tensor:[9,1,1,""],get_by_name:[9,1,1,""],get_finn_root:[9,1,1,""],interleave_matrix_outer_dim_from_partitions:[9,1,1,""],make_build_dir:[9,1,1,""],pad_tensor_to_multiple_of:[9,1,1,""],random_string:[9,1,1,""],remove_by_name:[9,1,1,""],roundup_to_integer_multiple:[9,1,1,""]},"finn.util.basic.CppBuilder":{append_includes:[9,4,1,""],append_sources:[9,4,1,""],build:[9,4,1,""],set_executable_path:[9,4,1,""]},"finn.util.data_packing":{array2hexstring:[9,1,1,""],finnpy_to_packed_bytearray:[9,1,1,""],hexstring2npbytearray:[9,1,1,""],npbytearray2hexstring:[9,1,1,""],npy_to_rtlsim_input:[9,1,1,""],numpy_to_hls_code:[9,1,1,""],pack_innermost_dim_as_hex_string:[9,1,1,""],packed_bytearray_to_finnpy:[9,1,1,""],rtlsim_output_to_npy:[9,1,1,""],unpack_innermost_dim_from_hex_string:[9,1,1,""]},"finn.util.fpgadataflow":{IPGenBuilder:[9,2,1,""],pyverilate_stitched_ip:[9,1,1,""]},"finn.util.fpgadataflow.IPGenBuilder":{append_tcl:[9,4,1,""],build:[9,4,1,""],set_ipgen_path:[9,4,1,""]},"finn.util.onnx":{valueinfo_to_tensor:[9,1,1,""]},"finn.util.test":{get_test_model_def_fxn:[9,1,1,""],get_test_model_trained:[9,1,1,""],get_test_model_untrained:[9,1,1,""],get_trained_checkpoint:[9,1,1,""]},finn:{analysis:[1,0,0,"-"],core:[3,0,0,"-"],custom_op:[4,0,0,"-"],transformation:[6,0,0,"-"],util:[9,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":9,"0x07":9,"0x0e":9,"0x0f01":9,"0xb":9,"0xe":9,"600px":[],"abstract":[4,5,6],"boolean":3,"class":[3,4,5,6,7,8,9],"const":6,"default":[4,5,6],"enum":3,"final":3,"float":9,"function":[3,6,9],"new":3,"return":[1,2,3,4,5,6,8,9],"static":1,"true":[3,9],"var":5,For:8,HLS:[3,10],IPs:7,PEs:5,The:[1,3,6,7,8,9,10],Use:9,abc:[4,6],abit:9,about:[1,7],absorb1bitmulintomatmul:8,absorb:[0,6,7],absorbaddintomultithreshold:8,absorbmulintomultithreshold:8,acceler:[7,10],account:3,action:7,activ:3,add:[6,8],addition:8,address:7,after:9,aim:8,align:[],all:[1,3,4,5,6,7,9],all_tensors_f32:1,allow:3,alreadi:7,also:[4,5,7],amount:9,analysi:[0,3],analysis_fxn:3,anaylsis_fxn:3,ani:[3,6,7,9],annot:[1,4,5],anoth:7,append_includ:9,append_sourc:9,append_tcl:9,appli:[3,6,7,8],apply_rep:6,appropri:6,arbitrari:9,architectur:10,around:3,arrai:9,array2hexstr:9,arxiv:8,assign:3,associ:[3,6],assum:9,attribut:[1,4,5,7],attribute_nam:[4,5],attributeproto:[4,5],backend:7,base:[3,4,5,6,7,8,9],basic:0,batchnorm:6,batchnorm_to_affin:0,batchnormtoaffin:6,been:7,befor:9,between:[5,9],binari:[3,5,7,8,9],bipolar:[3,5,6,8,9],bipolar_to_xnor:0,bit:[3,9],bitwidth:3,blackboxfunct:5,block:7,blott:5,board:7,bool:[1,6],both:9,bram_estim:5,brevita:10,brien:5,build:9,built:1,calc_tmem:5,calc_wmem:5,calcul:5,calculate_signed_dot_prod_rang:9,call:[3,5,6,7],can:[3,6,7,8,9,10],cannot:6,center:[],centerpiec:10,certain:1,chang:[3,6],check:[1,3,4,5],check_all_tensor_shapes_specifi:3,check_compat:3,cleanup:[0,6],clk:[5,7],clone:9,code:[7,9],code_gen_dir:9,code_generation_ipgen:5,code_generation_npysim:5,codegen_ipgen:[0,6],codegen_ipstitch:[0,6],codegen_npysim:[0,6],collaps:8,collapse_rep:[0,6],collapserepeatedadd:8,collapserepeatedmul:8,collapserepeatedop:8,collect:7,colloqui:10,come:1,compar:[3,4],compare_execut:3,compare_fxn:3,compat:[3,4,5],compil:[0,6,10],compile_singlenode_cod:5,compon:10,comput:3,consecut:8,constant:[1,3,8],consum:3,contain:[3,4,7,9],content:[],context:[3,4,5],convent:1,convert:[5,6,7,8,9],convert_to_hls_lay:[0,6],convertbipolarmatmultoxnorpopcount:6,convertsigntothr:8,convertsubtoadd:6,convolutioninputgener:[0,4],copi:[3,6,7],core:0,corner:10,correct:6,correctli:[1,4,5,7],correspond:[3,4,5,10],count:5,cpp_file:9,cppbuilder:9,creat:[3,7,9],create_dataflow_partit:[0,6],createdataflowpartit:7,current:3,custom:[1,3,10],custom_op:0,customop:[4,5],data:[4,7,9],data_pack:0,dataflow:[3,7,10],dataoutstrm:5,datatyp:[0,4,5,6,9],debug:3,declar:6,deep:[3,5,6,10],default_v:[4,5],default_valu:[4,5],defin:5,deploy:7,deploytopynq:7,design:[7,10],detail:10,dict:[3,4,5],dictionari:[1,3],digit:9,dimens:9,dimension:9,dir:[7,9],directori:[7,9],distr_pad:9,divis:9,dnn:10,doc:10,docker:9,docomput:5,don:6,done:1,dot:9,driver:7,dt_a:9,dt_b:9,dtype:[1,3,4,5,9],dynam:1,dynamic_input_to_npi:5,each:[1,3,6,8,9,10],effect:6,element:9,embed:3,emit:9,emphasi:10,empti:3,end:5,ensur:[5,6,7,9],enumer:[3,6],equal:[4,5],equival:8,estim:2,even:6,evenli:9,everi:6,exampl:9,exec_precompiled_singlenode_model:5,execut:[3,4,5],execute_custom_nod:0,execute_nod:[3,4,5],execute_onnx:3,execute_onnx_and_make_model:3,exist:[4,9],exit:9,expect:[1,3,4,5,7],experiment:10,explor:[3,5,10],expos:3,extra:[1,9],extract:[1,2],factor:9,factoroutmulsignmagnitud:8,fals:[3,6,9],fan:1,fast:5,fewest:3,field:[7,9],file:[3,7,9],filenam:[3,7],find:3,find_consum:3,find_produc:3,finn:[],finn_dt:9,finnpy_to_packed_bytearrai:9,first:[1,8],fix:[6,9],flatten:9,float32:[1,3],flow:[],fold_const:0,foldconst:6,folder:[7,9],follow:[1,7,10],form:5,found:7,four:9,fpga:10,fpgadataflow:[0,1,4,6],fpgapart:[5,7],framework:[5,10],fraser:5,from:[2,3,7,9,10],full:3,further:6,gambardella:5,gen_finn_dt_tensor:9,gener:[0,7,9,10],generate_param:5,get:[3,4],get_all_tensor_nam:3,get_by_nam:9,get_finn_root:9,get_folded_input_shap:5,get_folded_output_shap:5,get_hls_compatible_threshold_tensor:5,get_hls_compatible_weight_tensor:5,get_hls_datatype_str:3,get_initi:3,get_input_datatyp:5,get_instream_width:5,get_metadata_prop:3,get_nodeattr:4,get_nodeattr_typ:[4,5],get_num_possible_valu:3,get_number_output_valu:5,get_output_datatyp:5,get_outstream_width:5,get_per_tensor_fanout:1,get_smallest_poss:3,get_stream_width:5,get_template_param_valu:5,get_tensor_datatyp:3,get_tensor_fanout:3,get_tensor_shap:3,get_tensor_valueinfo:3,get_test_model_def_fxn:9,get_test_model_train:9,get_test_model_untrain:9,get_trained_checkpoint:9,get_weight_datatyp:5,getcustomop:4,github:10,give:[6,8],give_unique_node_nam:6,given:[1,2,3,4,5,9],giverandomtensornam:6,givereadabletensornam:6,giveuniquenodenam:6,global_includ:5,graph:[1,3,4,5,6,7],graphic:10,guarante:6,guid:0,has:[1,3,6,7,9],have:[1,3,6,7,8],height:[],hex:9,hexstr:9,hexstring2npbytearrai:9,highli:10,hls_synth_res_estim:[0,1],hls_var_nam:9,hlscustomop:5,hlslib:[5,10],hlssynth_ipgen:[0,6],homepag:10,host:9,how:[0,9],human:6,imag:[],img:[],immedi:7,implement:3,includ:[3,7,10],index:10,indic:[3,4,5,6,7],infer:[3,4,5,6,9,10],infer_datatyp:0,infer_node_datatyp:[4,5],infer_shap:0,inferbinarystreamingfclay:7,inferdatatyp:6,infershap:6,infinit:6,info:[6,9],info_messag:1,inform:[1,7],infrastructur:7,inherit:6,initi:[1,3],innermost:9,inp0:4,inp1:4,inp:5,input:[1,3,4,5,6,8,9],input_dict:3,input_dtyp:9,input_fil:9,insert:[7,9],insert_tlastmark:[0,6],inserttlastmark:7,insid:4,instanc:[3,4,5,8],instanti:7,instead:9,int16:3,int2:3,int32:3,int3:3,int4:3,int8:3,integ:[3,8,9],intend:10,interfac:7,interleav:5,interleave_matrix_outer_dim_from_partit:9,intermedi:[3,6],intern:6,ipgen_singlenode_cod:5,ipgenbuild:9,is_integ:3,is_linear:1,item:9,kei:3,know:6,lab:10,lambda:3,largest:3,layer:[6,7],lead:9,learn:5,leeser:5,len:9,let:6,letter:9,librari:10,library_path:9,like:10,linear:[1,3],link:10,list:[1,3],look:1,loop:6,lut_estim:5,made:[3,6],magnitud:8,make:[6,7],make_build_dir:9,make_collapsed_param_fxn:8,make_deepcopi:3,make_deploy:[0,6],make_empty_exec_context:3,make_new_valueinfo_nam:3,make_project:7,make_pynq_driv:[0,6],make_pynq_proj:[0,6],make_shape_compatible_op:[4,5],makepynqdriv:7,makepynqproject:7,manipul:3,manual:6,matmul:[6,8],matrix:[5,8,9],max:[3,9],mean:9,meant:6,member:[4,5],metadata_prop:[3,7],min:[3,9],minimum:9,mixtur:1,mkdtemp:9,mode:[],model:[1,2,3,4,5,6,7,8,9],model_a:3,model_b:3,model_was_chang:6,modelproto:[3,7],modelwrapp:[0,1,6],modul:10,more:[3,6,9],move:8,moveaddpastmul:8,movescalaraddpastmatmul:8,movescalarmulpastmatmul:8,mul:[6,8],multidimension:9,multipl:[6,8,9],multipli:8,multithreshold:[0,7,8],must:[4,6,7,8,9],mvtu:7,n_partit:9,n_thres_step:5,name:[1,2,3,4,6,9],name_field:9,ndarrai:9,nearest:[8,9],necessari:7,need:[2,4,5,6],neg:[3,8],netnam:9,network:[5,10],neural:[5,10],new_nam:3,next:8,no_decl:9,node:[1,2,3,4,5,6,7,8],node_inputs_in_expected_ord:1,node_res_estim:5,non:7,none:[3,4,9],notwithstand:1,now:[1,3],npbytearrai:9,npbytearray2hexstr:9,npy:9,npy_to_dynamic_output:5,npy_to_rtlsim_input:9,number:[3,4,5,9],numpi:[5,9],numpy_to_hls_cod:9,object:[3,9],old_nam:3,onc:6,one:[1,3,7,9],onli:[1,3,6,7,8],onnx:[0,3,4,5,7],onnx_exec:0,onnx_model_proto:3,onnx_nod:[4,5],onnxruntim:3,op_nam:8,op_typ:1,oper:[3,8],ops:[1,8],order:1,orig_thres_matrix:5,orig_weight_matrix:5,origin:5,other:[3,8],otherwis:[3,6,9],out:1,out_bia:4,out_scal:4,out_shap:9,outcom:7,output:[3,4,5,6,9],output_shap:9,overlai:7,overview:10,pack:[7,9],pack_innermost_dim:9,pack_innermost_dim_as_hex_str:9,packag:[],packed_bytearrai:9,packed_bytearray_to_finnpi:9,packedbit:9,pad:9,pad_tensor_to_multiple_of:9,pad_to_dim:9,pad_to_nbit:9,page:10,pair:7,paramet:8,part:[4,9],particular:[4,5,9],partit:3,pass:[0,5],password:7,past:8,path:[5,9],per:7,perform:[4,5],permit:[4,5],place:7,platform:7,png:[],point:6,posit:[5,8,9],possibl:[3,7],pragma:5,preced:8,precid:8,precis:9,precomput:6,prefer:3,prefix:9,prepend:9,preusser:5,previous:7,prior:[6,7,9],produc:[1,3],product:9,project:[7,10],properti:[1,3],provid:3,pynq:7,pynq_driver_dir:7,python:[7,9],pyveril:9,pyverilate_stitched_ip:9,qnn:10,quantiz:[1,5,10],random:[6,9],random_str:9,randomli:9,rather:10,reach:6,read:10,read_npy_data:5,readabl:6,readthedoc:[],recommend:6,refer:10,registri:0,relat:10,remot:3,remov:[7,9],remove_by_nam:9,remove_prefix:9,renam:3,rename_tensor:3,reorder:[0,6],repeat:[6,8],repeatedli:3,replac:6,repositori:10,repositroi:[],repres:[3,9],represent:9,requir:[3,4,5],res_estim:[0,1],research:10,reset_rtlsim:5,reshap:5,resourc:2,respect:9,result:[1,2,3,6,7,8,9],return_full_exec_context:3,returned_dict:[4,5],revers:9,reverse_endian:9,reverse_inn:9,right:10,root:9,round:[8,9],round_threshold:[0,6],roundandclipthreshold:8,roundup_to_integer_multipl:9,row:5,rtlsim:[3,5],rtlsim_output_to_npi:9,run:[3,7],same:[7,9],save:[3,9],save_as_npi:5,scalar:8,scale:[],scp:7,script:7,search:10,second:[7,8],see:[8,9],seen:10,sep:5,separ:10,sequenc:9,set:[3,4,5,7,8,9],set_attribut:[],set_executable_path:9,set_initi:3,set_ipgen_path:9,set_metadata_prop:3,set_nodeattr:4,set_sim_mod:[0,6],set_tensor_datatyp:3,set_tensor_shap:3,setsimmod:[],shape:[3,4,5,6,9],shell:7,should:[1,3,6],sign:[3,6,8,9],sign_to_thr:[0,6],sim:[5,9],sim_mod:[],simd:5,sinc:[3,9],singl:[3,8,9],small:1,smallest:3,some:[3,6],space:10,specif:10,specifi:[3,6,9],split:[7,8,9],standard:[3,4,5],stitch:[7,9],store:[4,7,9],streamingdataflowpartit:[0,7],streamingfclayer_batch:[0,4,7],streamingmaxpool_batch:[0,4],streamlin:[0,6],string:[1,9],stringlength:9,strm_decl:5,structur:1,style:10,sub:6,subdirectori:7,subgraph:3,submodul:0,subpackag:[],subset:1,success:7,suitabl:5,surviv:9,synth_pynq_proj:[0,6],synthesi:[2,7],synthpynqproject:7,take:[1,3,6,8,9],taken:[3,7,10],target:[7,10],target_dir:7,targetbit:9,tcl:7,tcl_script:9,tempfil:9,templat:[0,4,6],temporari:9,tensor:[1,3,6,8,9],tensor_fanout:1,tensor_nam:[1,3],tensor_shap:[3,9],tensor_valu:3,termin:7,ternari:3,test:[0,6],thei:8,them:[1,7,8],thi:[1,3,4,5,6,7,9,10],thing:10,threshold:[4,5,8],time:6,tlastmark:[0,4,7],tmem:5,togeth:7,toggle_clk:5,tool:10,topolog:0,train:10,transform:[0,3],transformed_model:6,travers:1,tupl:6,two:[3,7,8,9,10],type:[3,6,9],uint16:3,uint2:[3,9],uint32:3,uint3:3,uint4:3,uint8:[3,9],umuroglu:5,under:7,uniqu:6,unpack:[7,9],unpack_innermost_dim_from_hex_str:9,unsign:[3,8],until:3,updat:8,upper:10,used:[3,4,5,9,10],useful:3,user:6,usernam:7,using:[3,6,8,9,10],util:[0,3,4,5],val:9,valu:[3,4,5,7,8,9],value_info:3,valueinfo:[3,6],valueinfo_to_tensor:9,valueinfoproto:[3,9],variabl:9,vector:[8,9],verif:1,verifi:[1,4,5],verify_custom_nod:0,verify_nod:[1,4,5],via:3,view:10,visser:5,vivado:[2,3,7,10],vivado_pynq_proj:7,vivado_stitch_proj:7,wai:1,want:8,wbit:9,websit:10,weight:[3,5],when:[1,6],where:[3,4,5,7,8],whether:[1,3,4,5,6],which:[3,4,5,7,8,9,10],width:9,wmem:5,work:[3,9],wrapper:3,write:0,xdnn:10,xilinx:10,xnorpopcount:0,xnorpopcountmatmul:[4,6,7],you:6,your:6,zero:[3,8,9]},titles:["finn package","finn.analysis package","finn.analysis.fpgadataflow package","finn.core package","finn.custom_op package","finn.custom_op.fpgadataflow package","finn.transformation package","finn.transformation.fpgadataflow package","finn.transformation.streamline package","finn.util package","FINN","src"],titleterms:{absorb:8,analysi:[1,2],basic:9,batchnorm_to_affin:6,bipolar_to_xnor:6,cleanup:7,codegen_ipgen:7,codegen_ipstitch:7,codegen_npysim:7,collapse_rep:8,compil:7,content:[0,1,2,3,4,5,6,7,8,9],convert_to_hls_lay:7,convolutioninputgener:5,core:3,create_dataflow_partit:7,custom_op:[4,5],data_pack:9,datatyp:3,document:[],execute_custom_nod:3,finn:[0,1,2,3,4,5,6,7,8,9,10],fold_const:6,fpgadataflow:[2,5,7,9],gener:6,guid:6,hls_synth_res_estim:2,hlssynth_ipgen:7,how:1,indic:10,infer_datatyp:6,infer_shap:6,insert_tlastmark:7,make_deploy:7,make_pynq_driv:7,make_pynq_proj:7,modelwrapp:3,modul:[0,1,2,3,4,5,6,7,8,9],multithreshold:4,onnx:9,onnx_exec:3,packag:[0,1,2,3,4,5,6,7,8,9],pass:1,registri:4,reorder:8,res_estim:2,round_threshold:8,set_sim_mod:7,sign_to_thr:8,src:11,streamingdataflowpartit:4,streamingfclayer_batch:5,streamingmaxpool_batch:5,streamlin:8,submodul:[1,2,3,4,5,6,7,8,9],subpackag:[0,1,4,6],synth_pynq_proj:7,tabl:10,templat:[5,7],test:9,tlastmark:5,topolog:1,transform:[6,7,8],util:9,verify_custom_nod:1,welcom:[],what:10,write:[1,6],xnorpopcount:4}}) \ No newline at end of file +Search.setIndex({docnames:["end_to_end_flow","finn","finn.analysis","finn.analysis.fpgadataflow","finn.core","finn.custom_op","finn.custom_op.fpgadataflow","finn.transformation","finn.transformation.fpgadataflow","finn.transformation.streamline","finn.util","getting_started","index","modules","source_code"],envversion:{"sphinx.domains.c":1,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":1,"sphinx.domains.javascript":1,"sphinx.domains.math":2,"sphinx.domains.python":1,"sphinx.domains.rst":1,"sphinx.domains.std":1,sphinx:56},filenames:["end_to_end_flow.rst","finn.rst","finn.analysis.rst","finn.analysis.fpgadataflow.rst","finn.core.rst","finn.custom_op.rst","finn.custom_op.fpgadataflow.rst","finn.transformation.rst","finn.transformation.fpgadataflow.rst","finn.transformation.streamline.rst","finn.util.rst","getting_started.rst","index.rst","modules.rst","source_code.rst"],objects:{"":{finn:[1,0,0,"-"]},"finn.analysis":{fpgadataflow:[3,0,0,"-"],topology:[2,0,0,"-"],verify_custom_nodes:[2,0,0,"-"]},"finn.analysis.fpgadataflow":{hls_synth_res_estimation:[3,0,0,"-"],res_estimation:[3,0,0,"-"]},"finn.analysis.fpgadataflow.hls_synth_res_estimation":{hls_synth_res_estimation:[3,1,1,""]},"finn.analysis.fpgadataflow.res_estimation":{res_estimation:[3,1,1,""]},"finn.analysis.topology":{all_tensors_f32:[2,1,1,""],get_per_tensor_fanouts:[2,1,1,""],is_linear:[2,1,1,""],node_inputs_in_expected_order:[2,1,1,""]},"finn.analysis.verify_custom_nodes":{verify_nodes:[2,1,1,""]},"finn.core":{datatype:[4,0,0,"-"],execute_custom_node:[4,0,0,"-"],modelwrapper:[4,0,0,"-"],onnx_exec:[4,0,0,"-"]},"finn.core.datatype":{DataType:[4,2,1,""]},"finn.core.datatype.DataType":{BINARY:[4,3,1,""],BIPOLAR:[4,3,1,""],FLOAT32:[4,3,1,""],INT16:[4,3,1,""],INT2:[4,3,1,""],INT32:[4,3,1,""],INT3:[4,3,1,""],INT4:[4,3,1,""],INT8:[4,3,1,""],TERNARY:[4,3,1,""],UINT16:[4,3,1,""],UINT2:[4,3,1,""],UINT32:[4,3,1,""],UINT3:[4,3,1,""],UINT4:[4,3,1,""],UINT8:[4,3,1,""],allowed:[4,4,1,""],bitwidth:[4,4,1,""],get_hls_datatype_str:[4,4,1,""],get_num_possible_values:[4,4,1,""],get_smallest_possible:[4,4,1,""],is_integer:[4,4,1,""],max:[4,4,1,""],min:[4,4,1,""],signed:[4,4,1,""]},"finn.core.execute_custom_node":{execute_custom_node:[4,1,1,""]},"finn.core.modelwrapper":{ModelWrapper:[4,2,1,""]},"finn.core.modelwrapper.ModelWrapper":{analysis:[4,4,1,""],check_all_tensor_shapes_specified:[4,4,1,""],check_compatibility:[4,4,1,""],find_consumer:[4,4,1,""],find_producer:[4,4,1,""],get_all_tensor_names:[4,4,1,""],get_initializer:[4,4,1,""],get_metadata_prop:[4,4,1,""],get_tensor_datatype:[4,4,1,""],get_tensor_fanout:[4,4,1,""],get_tensor_shape:[4,4,1,""],get_tensor_valueinfo:[4,4,1,""],graph:[4,4,1,""],make_empty_exec_context:[4,4,1,""],make_new_valueinfo_name:[4,4,1,""],model:[4,4,1,""],rename_tensor:[4,4,1,""],save:[4,4,1,""],set_initializer:[4,4,1,""],set_metadata_prop:[4,4,1,""],set_tensor_datatype:[4,4,1,""],set_tensor_shape:[4,4,1,""],transform:[4,4,1,""]},"finn.core.onnx_exec":{compare_execution:[4,1,1,""],execute_node:[4,1,1,""],execute_onnx:[4,1,1,""],execute_onnx_and_make_model:[4,1,1,""]},"finn.custom_op":{CustomOp:[5,2,1,""],fpgadataflow:[6,0,0,"-"],multithreshold:[5,0,0,"-"],registry:[5,0,0,"-"],streamingdataflowpartition:[5,0,0,"-"],xnorpopcount:[5,0,0,"-"]},"finn.custom_op.CustomOp":{execute_node:[5,4,1,""],get_nodeattr:[5,4,1,""],get_nodeattr_types:[5,4,1,""],infer_node_datatype:[5,4,1,""],make_shape_compatible_op:[5,4,1,""],set_nodeattr:[5,4,1,""],verify_node:[5,4,1,""]},"finn.custom_op.fpgadataflow":{HLSCustomOp:[6,2,1,""],convolutioninputgenerator:[6,0,0,"-"],streamingfclayer_batch:[6,0,0,"-"],streamingmaxpool_batch:[6,0,0,"-"],templates:[6,0,0,"-"],tlastmarker:[6,0,0,"-"]},"finn.custom_op.fpgadataflow.HLSCustomOp":{blackboxfunction:[6,4,1,""],bram_estimation:[6,4,1,""],code_generation_ipgen:[6,4,1,""],code_generation_npysim:[6,4,1,""],compile_singlenode_code:[6,4,1,""],dataoutstrm:[6,4,1,""],defines:[6,4,1,""],docompute:[6,4,1,""],dynamic_input_to_npy:[6,4,1,""],exec_precompiled_singlenode_model:[6,4,1,""],execute_node:[6,4,1,""],generate_params:[6,4,1,""],get_folded_input_shape:[6,4,1,""],get_folded_output_shape:[6,4,1,""],get_instream_width:[6,4,1,""],get_nodeattr_types:[6,4,1,""],get_number_output_values:[6,4,1,""],get_outstream_width:[6,4,1,""],global_includes:[6,4,1,""],ipgen_singlenode_code:[6,4,1,""],lut_estimation:[6,4,1,""],node_res_estimation:[6,4,1,""],npy_to_dynamic_output:[6,4,1,""],pragmas:[6,4,1,""],read_npy_data:[6,4,1,""],reset_rtlsim:[6,4,1,""],rtlsim:[6,4,1,""],save_as_npy:[6,4,1,""],strm_decl:[6,4,1,""],toggle_clk:[6,4,1,""]},"finn.custom_op.fpgadataflow.convolutioninputgenerator":{ConvolutionInputGenerator:[6,2,1,""]},"finn.custom_op.fpgadataflow.convolutioninputgenerator.ConvolutionInputGenerator":{blackboxfunction:[6,4,1,""],bram_estimation:[6,4,1,""],dataoutstrm:[6,4,1,""],defines:[6,4,1,""],docompute:[6,4,1,""],execute_node:[6,4,1,""],get_input_datatype:[6,4,1,""],get_nodeattr_types:[6,4,1,""],get_number_output_values:[6,4,1,""],get_output_datatype:[6,4,1,""],get_stream_width:[6,4,1,""],global_includes:[6,4,1,""],infer_node_datatype:[6,4,1,""],lut_estimation:[6,4,1,""],make_shape_compatible_op:[6,4,1,""],pragmas:[6,4,1,""],read_npy_data:[6,4,1,""],save_as_npy:[6,4,1,""],strm_decl:[6,4,1,""],verify_node:[6,4,1,""]},"finn.custom_op.fpgadataflow.streamingfclayer_batch":{StreamingFCLayer_Batch:[6,2,1,""]},"finn.custom_op.fpgadataflow.streamingfclayer_batch.StreamingFCLayer_Batch":{blackboxfunction:[6,4,1,""],bram_estimation:[6,4,1,""],calc_tmem:[6,4,1,""],calc_wmem:[6,4,1,""],dataoutstrm:[6,4,1,""],defines:[6,4,1,""],docompute:[6,4,1,""],execute_node:[6,4,1,""],generate_params:[6,4,1,""],get_folded_input_shape:[6,4,1,""],get_folded_output_shape:[6,4,1,""],get_hls_compatible_threshold_tensor:[6,4,1,""],get_hls_compatible_weight_tensor:[6,4,1,""],get_input_datatype:[6,4,1,""],get_instream_width:[6,4,1,""],get_nodeattr_types:[6,4,1,""],get_number_output_values:[6,4,1,""],get_output_datatype:[6,4,1,""],get_outstream_width:[6,4,1,""],get_template_param_values:[6,4,1,""],get_weight_datatype:[6,4,1,""],global_includes:[6,4,1,""],infer_node_datatype:[6,4,1,""],lut_estimation:[6,4,1,""],make_shape_compatible_op:[6,4,1,""],pragmas:[6,4,1,""],read_npy_data:[6,4,1,""],save_as_npy:[6,4,1,""],strm_decl:[6,4,1,""],verify_node:[6,4,1,""]},"finn.custom_op.fpgadataflow.streamingmaxpool_batch":{StreamingMaxPool_Batch:[6,2,1,""]},"finn.custom_op.fpgadataflow.streamingmaxpool_batch.StreamingMaxPool_Batch":{blackboxfunction:[6,4,1,""],bram_estimation:[6,4,1,""],dataoutstrm:[6,4,1,""],defines:[6,4,1,""],docompute:[6,4,1,""],get_nodeattr_types:[6,4,1,""],get_number_output_values:[6,4,1,""],global_includes:[6,4,1,""],infer_node_datatype:[6,4,1,""],lut_estimation:[6,4,1,""],make_shape_compatible_op:[6,4,1,""],pragmas:[6,4,1,""],read_npy_data:[6,4,1,""],save_as_npy:[6,4,1,""],strm_decl:[6,4,1,""],verify_node:[6,4,1,""]},"finn.custom_op.fpgadataflow.tlastmarker":{TLastMarker:[6,2,1,""]},"finn.custom_op.fpgadataflow.tlastmarker.TLastMarker":{blackboxfunction:[6,4,1,""],dataoutstrm:[6,4,1,""],defines:[6,4,1,""],docompute:[6,4,1,""],execute_node:[6,4,1,""],get_folded_input_shape:[6,4,1,""],get_folded_output_shape:[6,4,1,""],get_instream_width:[6,4,1,""],get_nodeattr_types:[6,4,1,""],get_number_output_values:[6,4,1,""],get_outstream_width:[6,4,1,""],global_includes:[6,4,1,""],infer_node_datatype:[6,4,1,""],make_shape_compatible_op:[6,4,1,""],pragmas:[6,4,1,""],read_npy_data:[6,4,1,""],save_as_npy:[6,4,1,""],strm_decl:[6,4,1,""],verify_node:[6,4,1,""]},"finn.custom_op.multithreshold":{MultiThreshold:[5,2,1,""],compare:[5,1,1,""],multithreshold:[5,1,1,""]},"finn.custom_op.multithreshold.MultiThreshold":{execute_node:[5,4,1,""],get_nodeattr_types:[5,4,1,""],infer_node_datatype:[5,4,1,""],make_shape_compatible_op:[5,4,1,""],verify_node:[5,4,1,""]},"finn.custom_op.registry":{getCustomOp:[5,1,1,""]},"finn.custom_op.streamingdataflowpartition":{StreamingDataflowPartition:[5,2,1,""]},"finn.custom_op.streamingdataflowpartition.StreamingDataflowPartition":{execute_node:[5,4,1,""],get_nodeattr_types:[5,4,1,""],infer_node_datatype:[5,4,1,""],make_shape_compatible_op:[5,4,1,""],verify_node:[5,4,1,""]},"finn.custom_op.xnorpopcount":{XnorPopcountMatMul:[5,2,1,""],xnorpopcountmatmul:[5,1,1,""]},"finn.custom_op.xnorpopcount.XnorPopcountMatMul":{execute_node:[5,4,1,""],get_nodeattr_types:[5,4,1,""],infer_node_datatype:[5,4,1,""],make_shape_compatible_op:[5,4,1,""],verify_node:[5,4,1,""]},"finn.transformation":{Transformation:[7,2,1,""],batchnorm_to_affine:[7,0,0,"-"],bipolar_to_xnor:[7,0,0,"-"],fold_constants:[7,0,0,"-"],fpgadataflow:[8,0,0,"-"],general:[7,0,0,"-"],infer_datatypes:[7,0,0,"-"],infer_shapes:[7,0,0,"-"],streamline:[9,0,0,"-"]},"finn.transformation.Transformation":{apply:[7,4,1,""]},"finn.transformation.batchnorm_to_affine":{BatchNormToAffine:[7,2,1,""]},"finn.transformation.batchnorm_to_affine.BatchNormToAffine":{apply:[7,4,1,""]},"finn.transformation.bipolar_to_xnor":{ConvertBipolarMatMulToXnorPopcount:[7,2,1,""]},"finn.transformation.bipolar_to_xnor.ConvertBipolarMatMulToXnorPopcount":{apply:[7,4,1,""]},"finn.transformation.fold_constants":{FoldConstants:[7,2,1,""]},"finn.transformation.fold_constants.FoldConstants":{apply:[7,4,1,""]},"finn.transformation.fpgadataflow":{cleanup:[8,0,0,"-"],codegen_ipgen:[8,0,0,"-"],codegen_ipstitch:[8,0,0,"-"],codegen_npysim:[8,0,0,"-"],compile:[8,0,0,"-"],convert_to_hls_layers:[8,0,0,"-"],create_dataflow_partition:[8,0,0,"-"],hlssynth_ipgen:[8,0,0,"-"],insert_tlastmarker:[8,0,0,"-"],make_deployment:[8,0,0,"-"],make_pynq_driver:[8,0,0,"-"],make_pynq_proj:[8,0,0,"-"],synth_pynq_proj:[8,0,0,"-"],templates:[8,0,0,"-"]},"finn.transformation.fpgadataflow.cleanup":{CleanUp:[8,2,1,""]},"finn.transformation.fpgadataflow.cleanup.CleanUp":{apply:[8,4,1,""]},"finn.transformation.fpgadataflow.codegen_ipgen":{CodeGen_ipgen:[8,2,1,""]},"finn.transformation.fpgadataflow.codegen_ipgen.CodeGen_ipgen":{apply:[8,4,1,""]},"finn.transformation.fpgadataflow.codegen_ipstitch":{CodeGen_ipstitch:[8,2,1,""]},"finn.transformation.fpgadataflow.codegen_ipstitch.CodeGen_ipstitch":{apply:[8,4,1,""]},"finn.transformation.fpgadataflow.codegen_npysim":{CodeGen_npysim:[8,2,1,""]},"finn.transformation.fpgadataflow.codegen_npysim.CodeGen_npysim":{apply:[8,4,1,""]},"finn.transformation.fpgadataflow.compile":{Compile:[8,2,1,""]},"finn.transformation.fpgadataflow.compile.Compile":{apply:[8,4,1,""]},"finn.transformation.fpgadataflow.convert_to_hls_layers":{InferBinaryStreamingFCLayer:[8,2,1,""]},"finn.transformation.fpgadataflow.convert_to_hls_layers.InferBinaryStreamingFCLayer":{apply:[8,4,1,""]},"finn.transformation.fpgadataflow.create_dataflow_partition":{CreateDataflowPartition:[8,2,1,""]},"finn.transformation.fpgadataflow.create_dataflow_partition.CreateDataflowPartition":{apply:[8,4,1,""]},"finn.transformation.fpgadataflow.hlssynth_ipgen":{HLSSynth_IPGen:[8,2,1,""]},"finn.transformation.fpgadataflow.hlssynth_ipgen.HLSSynth_IPGen":{apply:[8,4,1,""]},"finn.transformation.fpgadataflow.insert_tlastmarker":{InsertTLastMarker:[8,2,1,""]},"finn.transformation.fpgadataflow.insert_tlastmarker.InsertTLastMarker":{apply:[8,4,1,""]},"finn.transformation.fpgadataflow.make_deployment":{DeployToPYNQ:[8,2,1,""]},"finn.transformation.fpgadataflow.make_deployment.DeployToPYNQ":{apply:[8,4,1,""]},"finn.transformation.fpgadataflow.make_pynq_driver":{MakePYNQDriver:[8,2,1,""]},"finn.transformation.fpgadataflow.make_pynq_driver.MakePYNQDriver":{apply:[8,4,1,""]},"finn.transformation.fpgadataflow.make_pynq_proj":{MakePYNQProject:[8,2,1,""]},"finn.transformation.fpgadataflow.make_pynq_proj.MakePYNQProject":{apply:[8,4,1,""]},"finn.transformation.fpgadataflow.synth_pynq_proj":{SynthPYNQProject:[8,2,1,""]},"finn.transformation.fpgadataflow.synth_pynq_proj.SynthPYNQProject":{apply:[8,4,1,""]},"finn.transformation.general":{ConvertSubToAdd:[7,2,1,""],GiveRandomTensorNames:[7,2,1,""],GiveReadableTensorNames:[7,2,1,""],GiveUniqueNodeNames:[7,2,1,""]},"finn.transformation.general.ConvertSubToAdd":{apply:[7,4,1,""]},"finn.transformation.general.GiveRandomTensorNames":{apply:[7,4,1,""]},"finn.transformation.general.GiveReadableTensorNames":{apply:[7,4,1,""]},"finn.transformation.general.GiveUniqueNodeNames":{apply:[7,4,1,""]},"finn.transformation.infer_datatypes":{InferDataTypes:[7,2,1,""]},"finn.transformation.infer_datatypes.InferDataTypes":{apply:[7,4,1,""]},"finn.transformation.infer_shapes":{InferShapes:[7,2,1,""]},"finn.transformation.infer_shapes.InferShapes":{apply:[7,4,1,""]},"finn.transformation.streamline":{Streamline:[9,2,1,""],absorb:[9,0,0,"-"],collapse_repeated:[9,0,0,"-"],reorder:[9,0,0,"-"],round_thresholds:[9,0,0,"-"],sign_to_thres:[9,0,0,"-"]},"finn.transformation.streamline.Streamline":{apply:[9,4,1,""]},"finn.transformation.streamline.absorb":{Absorb1BitMulIntoMatMul:[9,2,1,""],AbsorbAddIntoMultiThreshold:[9,2,1,""],AbsorbMulIntoMultiThreshold:[9,2,1,""],FactorOutMulSignMagnitude:[9,2,1,""]},"finn.transformation.streamline.absorb.Absorb1BitMulIntoMatMul":{apply:[9,4,1,""]},"finn.transformation.streamline.absorb.AbsorbAddIntoMultiThreshold":{apply:[9,4,1,""]},"finn.transformation.streamline.absorb.AbsorbMulIntoMultiThreshold":{apply:[9,4,1,""]},"finn.transformation.streamline.absorb.FactorOutMulSignMagnitude":{apply:[9,4,1,""]},"finn.transformation.streamline.collapse_repeated":{CollapseRepeatedAdd:[9,2,1,""],CollapseRepeatedMul:[9,2,1,""],CollapseRepeatedOp:[9,2,1,""]},"finn.transformation.streamline.collapse_repeated.CollapseRepeatedOp":{apply:[9,4,1,""]},"finn.transformation.streamline.reorder":{MoveAddPastMul:[9,2,1,""],MoveScalarAddPastMatMul:[9,2,1,""],MoveScalarMulPastMatMul:[9,2,1,""]},"finn.transformation.streamline.reorder.MoveAddPastMul":{apply:[9,4,1,""]},"finn.transformation.streamline.reorder.MoveScalarAddPastMatMul":{apply:[9,4,1,""]},"finn.transformation.streamline.reorder.MoveScalarMulPastMatMul":{apply:[9,4,1,""]},"finn.transformation.streamline.round_thresholds":{RoundAndClipThresholds:[9,2,1,""]},"finn.transformation.streamline.round_thresholds.RoundAndClipThresholds":{apply:[9,4,1,""]},"finn.transformation.streamline.sign_to_thres":{ConvertSignToThres:[9,2,1,""]},"finn.transformation.streamline.sign_to_thres.ConvertSignToThres":{apply:[9,4,1,""]},"finn.util":{basic:[10,0,0,"-"],data_packing:[10,0,0,"-"],fpgadataflow:[10,0,0,"-"],onnx:[10,0,0,"-"],test:[10,0,0,"-"]},"finn.util.basic":{CppBuilder:[10,2,1,""],calculate_signed_dot_prod_range:[10,1,1,""],gen_finn_dt_tensor:[10,1,1,""],get_by_name:[10,1,1,""],get_finn_root:[10,1,1,""],interleave_matrix_outer_dim_from_partitions:[10,1,1,""],make_build_dir:[10,1,1,""],pad_tensor_to_multiple_of:[10,1,1,""],random_string:[10,1,1,""],remove_by_name:[10,1,1,""],roundup_to_integer_multiple:[10,1,1,""]},"finn.util.basic.CppBuilder":{append_includes:[10,4,1,""],append_sources:[10,4,1,""],build:[10,4,1,""],set_executable_path:[10,4,1,""]},"finn.util.data_packing":{array2hexstring:[10,1,1,""],finnpy_to_packed_bytearray:[10,1,1,""],hexstring2npbytearray:[10,1,1,""],npbytearray2hexstring:[10,1,1,""],npy_to_rtlsim_input:[10,1,1,""],numpy_to_hls_code:[10,1,1,""],pack_innermost_dim_as_hex_string:[10,1,1,""],packed_bytearray_to_finnpy:[10,1,1,""],rtlsim_output_to_npy:[10,1,1,""],unpack_innermost_dim_from_hex_string:[10,1,1,""]},"finn.util.fpgadataflow":{IPGenBuilder:[10,2,1,""],pyverilate_stitched_ip:[10,1,1,""]},"finn.util.fpgadataflow.IPGenBuilder":{append_tcl:[10,4,1,""],build:[10,4,1,""],set_ipgen_path:[10,4,1,""]},"finn.util.onnx":{valueinfo_to_tensor:[10,1,1,""]},"finn.util.test":{get_test_model_def_fxn:[10,1,1,""],get_test_model_trained:[10,1,1,""],get_test_model_untrained:[10,1,1,""],get_trained_checkpoint:[10,1,1,""]},finn:{analysis:[2,0,0,"-"],core:[4,0,0,"-"],custom_op:[5,0,0,"-"],transformation:[7,0,0,"-"],util:[10,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":10,"0x07":10,"0x0e":10,"0x0f01":10,"0xb":10,"0xe":10,"600px":[],"abstract":[5,6,7],"boolean":4,"class":[4,5,6,7,8,9,10],"const":7,"default":[5,6,7],"enum":4,"final":4,"float":10,"function":[4,7,10],"new":4,"return":[2,3,4,5,6,7,9,10],"static":2,"true":[4,10],"var":6,For:9,HLS:[4,12],IPs:8,PEs:6,The:[2,4,7,8,9,10,12],Use:10,abc:[5,7],abit:10,about:[2,8,12],absorb1bitmulintomatmul:9,absorb:[1,7,8],absorbaddintomultithreshold:9,absorbmulintomultithreshold:9,acceler:[8,12],account:4,action:8,activ:4,add:[7,9],addition:9,address:8,after:10,aim:9,align:[],all:[2,4,5,6,7,8,10],all_tensors_f32:2,allow:4,alreadi:8,also:[5,6,8],amount:10,analysi:[1,4],analysis_fxn:4,anaylsis_fxn:4,ani:[4,7,8,10],annot:[2,5,6],anoth:8,append_includ:10,append_sourc:10,append_tcl:10,appli:[4,7,8,9],apply_rep:7,appropri:7,arbitrari:10,architectur:12,around:4,arrai:10,array2hexstr:10,arxiv:9,assign:4,associ:[4,7],assum:10,attribut:[2,5,6,8],attribute_nam:[5,6],attributeproto:[5,6],backend:8,base:[4,5,6,7,8,9,10],basic:1,batchnorm:7,batchnorm_to_affin:1,batchnormtoaffin:7,been:8,befor:10,between:[6,10],binari:[4,6,8,9,10],bipolar:[4,6,7,9,10],bipolar_to_xnor:1,bit:[4,10],bitwidth:4,blackboxfunct:6,block:8,blott:6,board:8,bool:[2,7],both:10,bram_estim:6,brevita:12,brien:6,build:10,built:2,calc_tmem:6,calc_wmem:6,calcul:6,calculate_signed_dot_prod_rang:10,call:[4,6,7,8],can:[4,7,8,9,10,12],cannot:7,center:[],centerpiec:12,certain:2,chang:[4,7],check:[2,4,5,6],check_all_tensor_shapes_specifi:4,check_compat:4,cleanup:[1,7],clk:[6,8],clone:10,code:[8,10],code_gen_dir:10,code_generation_ipgen:6,code_generation_npysim:6,codegen_ipgen:[1,7],codegen_ipstitch:[1,7],codegen_npysim:[1,7],collaps:9,collapse_rep:[1,7],collapserepeatedadd:9,collapserepeatedmul:9,collapserepeatedop:9,collect:8,colloqui:12,come:2,compar:[4,5],compare_execut:4,compare_fxn:4,compat:[4,5,6],compil:[1,7,12],compile_singlenode_cod:6,compon:12,comput:4,consecut:9,constant:[2,4,9],construct:12,consum:4,contain:[4,5,8,10,12],content:[],context:[4,5,6],convent:2,convert:[6,7,8,9,10],convert_to_hls_lay:[1,7],convertbipolarmatmultoxnorpopcount:7,convertsigntothr:9,convertsubtoadd:7,convolutioninputgener:[1,5],copi:[4,7,8],core:1,corner:12,correct:7,correctli:[2,5,6,8],correspond:[4,5,6,12],count:6,cpp_file:10,cppbuilder:10,creat:[4,8,10],create_dataflow_partit:[1,7],createdataflowpartit:8,current:[4,12],custom:[2,4,12],custom_op:1,customop:[5,6],data:[5,8,10],data_pack:1,dataflow:[4,8,12],dataoutstrm:6,datatyp:[1,5,6,7,10],debug:4,declar:7,deep:[4,6,7,12],default_v:[5,6],default_valu:[5,6],defin:6,deploy:8,deploytopynq:8,design:[8,12],detail:12,dict:[4,5,6],dictionari:[2,4],digit:10,dimens:10,dimension:10,dir:[8,10],directori:[8,10],distr_pad:10,divis:10,dnn:12,doc:12,docker:10,docomput:6,don:7,done:2,dot:10,driver:8,dt_a:10,dt_b:10,dtype:[2,4,5,6,10],dynam:2,dynamic_input_to_npi:6,each:[2,4,7,9,10,12],effect:7,element:10,embed:4,emit:10,emphasi:12,empti:4,end:6,ensur:[6,7,8,10],enumer:[4,7],equal:[5,6],equival:9,estim:3,even:7,evenli:10,everi:7,exampl:10,exec_precompiled_singlenode_model:6,execut:[4,5,6],execute_custom_nod:1,execute_nod:[4,5,6],execute_onnx:4,execute_onnx_and_make_model:4,exist:[5,10],exit:10,expect:[2,4,5,6,8],experi:12,experiment:12,explor:[4,6,12],expos:4,extra:[2,10],extract:[2,3],factor:10,factoroutmulsignmagnitud:9,fals:[4,7,10],fan:2,fast:6,fewest:4,field:[8,10],file:[4,8,10],filenam:[4,8],find:4,find_consum:4,find_produc:4,finn:[],finn_dt:10,finnpy_to_packed_bytearrai:10,first:[2,9],fix:[7,10],flatten:10,float32:[2,4],flow:[],fold_const:1,foldconst:7,folder:[8,10],follow:[2,8,12],form:6,found:[8,12],four:10,fpga:12,fpgadataflow:[1,2,5,7],fpgapart:[6,8],framework:[6,12],fraser:6,from:[3,4,8,10,12],full:4,further:7,gambardella:6,gen_finn_dt_tensor:10,gener:[1,8,10,12],generate_param:6,get:[4,5],get_all_tensor_nam:4,get_by_nam:10,get_finn_root:10,get_folded_input_shap:6,get_folded_output_shap:6,get_hls_compatible_threshold_tensor:6,get_hls_compatible_weight_tensor:6,get_hls_datatype_str:4,get_initi:4,get_input_datatyp:6,get_instream_width:6,get_metadata_prop:4,get_nodeattr:5,get_nodeattr_typ:[5,6],get_num_possible_valu:4,get_number_output_valu:6,get_output_datatyp:6,get_outstream_width:6,get_per_tensor_fanout:2,get_smallest_poss:4,get_stream_width:6,get_template_param_valu:6,get_tensor_datatyp:4,get_tensor_fanout:4,get_tensor_shap:4,get_tensor_valueinfo:4,get_test_model_def_fxn:10,get_test_model_train:10,get_test_model_untrain:10,get_trained_checkpoint:10,get_weight_datatyp:6,getcustomop:5,github:12,give:[7,9],give_unique_node_nam:7,given:[2,3,4,5,6,10],giverandomtensornam:7,givereadabletensornam:7,giveuniquenodenam:7,global_includ:6,graph:[2,4,5,6,7,8],graphic:12,guarante:7,guid:1,hand:12,has:[2,4,7,8,10],have:[2,4,7,8,9],height:[],hex:10,hexstr:10,hexstring2npbytearrai:10,highli:12,hls_synth_res_estim:[1,2],hls_var_nam:10,hlscustomop:6,hlslib:[6,12],hlssynth_ipgen:[1,7],homepag:12,host:10,how:[1,10],human:7,imag:[],img:[],immedi:8,implement:4,includ:[4,8,12],index:[],indic:[4,5,6,7,8],infer:[4,5,6,7,10,12],infer_datatyp:1,infer_node_datatyp:[5,6],infer_shap:1,inferbinarystreamingfclay:8,inferdatatyp:7,infershap:7,infinit:7,info:[7,10],info_messag:2,inform:[2,8],infrastructur:8,inherit:7,initi:[2,4],innermost:10,inp0:5,inp1:5,inp:6,input:[2,4,5,6,7,9,10],input_dict:4,input_dtyp:10,input_fil:10,insert:[8,10],insert_tlastmark:[1,7],inserttlastmark:8,insid:5,instanc:[4,5,6,9],instanti:8,instead:10,int16:4,int2:4,int32:4,int3:4,int4:4,int8:4,integ:[4,9,10],intend:12,interfac:8,interleav:6,interleave_matrix_outer_dim_from_partit:10,intermedi:[4,7],intern:7,ipgen_singlenode_cod:6,ipgenbuild:10,is_integ:4,is_linear:2,item:10,jupyt:12,kei:4,know:7,lab:12,lambda:4,largest:4,layer:[7,8],lead:10,learn:[6,12],leeser:6,len:10,let:7,letter:10,librari:12,library_path:10,like:12,linear:[2,4],link:12,list:[2,4],look:2,loop:7,lut_estim:6,made:[4,7],magnitud:9,make:[7,8],make_build_dir:10,make_collapsed_param_fxn:9,make_deepcopi:4,make_deploy:[1,7],make_empty_exec_context:4,make_new_valueinfo_nam:4,make_project:8,make_pynq_driv:[1,7],make_pynq_proj:[1,7],make_shape_compatible_op:[5,6],makepynqdriv:8,makepynqproject:8,manipul:4,manual:7,matmul:[7,9],matrix:[6,9,10],max:[4,10],mean:10,meant:7,member:[5,6],metadata_prop:[4,8],min:[4,10],minimum:10,mixtur:2,mkdtemp:10,mode:[],model:[2,3,4,5,6,7,8,9,10],model_a:4,model_b:4,model_was_chang:7,modelproto:[4,8],modelwrapp:[1,2,7],modul:[],more:[4,7,10,12],move:9,moveaddpastmul:9,movescalaraddpastmatmul:9,movescalarmulpastmatmul:9,mul:[7,9],multidimension:10,multipl:[7,9,10],multipli:9,multithreshold:[1,8,9],must:[5,7,8,9,10],mvtu:8,n_partit:10,n_thres_step:6,name:[2,3,4,5,7,10],name_field:10,ndarrai:10,nearest:[9,10],necessari:8,need:[3,5,6,7],neg:[4,9],netnam:10,network:[6,12],neural:[6,12],new_nam:4,next:9,no_decl:10,node:[2,3,4,5,6,7,8,9],node_inputs_in_expected_ord:2,node_res_estim:6,non:8,none:[4,5,10],notebook:12,notwithstand:2,now:[2,4],npbytearrai:10,npbytearray2hexstr:10,npy:10,npy_to_dynamic_output:6,npy_to_rtlsim_input:10,number:[4,5,6,10],numpi:[6,10],numpy_to_hls_cod:10,object:[4,10],old_nam:4,onc:7,one:[2,4,8,10],onli:[2,4,7,8,9],onnx:[1,4,5,6,8],onnx_exec:1,onnx_model_proto:4,onnx_nod:[5,6],onnxruntim:4,op_nam:9,op_typ:2,oper:[4,9],ops:[2,9],order:2,orig_thres_matrix:6,orig_weight_matrix:6,origin:6,other:[4,9],otherwis:[4,7,10],out:2,out_bia:5,out_scal:5,out_shap:10,outcom:8,output:[4,5,6,7,10],output_shap:10,overlai:8,overview:12,pack:[8,10],pack_innermost_dim:10,pack_innermost_dim_as_hex_str:10,packag:[],packed_bytearrai:10,packed_bytearray_to_finnpi:10,packedbit:10,pad:10,pad_tensor_to_multiple_of:10,pad_to_dim:10,pad_to_nbit:10,page:[],pair:8,paramet:9,part:[5,10],particular:[5,6,10],partit:4,pass:[1,6],password:8,past:9,path:[6,10],per:8,perform:[5,6],permit:[5,6],place:8,platform:8,png:[],point:7,posit:[6,9,10],possibl:[4,8],pragma:6,preced:9,precid:9,precis:10,precomput:7,prefer:4,prefix:10,prepend:10,preusser:6,previous:8,prior:[7,8,10],produc:[2,4],product:10,project:[8,12],properti:[2,4],provid:4,pynq:8,pynq_driver_dir:8,python:[8,10],pyveril:10,pyverilate_stitched_ip:10,qnn:12,quantiz:[2,6,12],random:[7,10],random_str:10,randomli:10,rather:12,reach:7,read:12,read_npy_data:6,readabl:7,readthedoc:[],recommend:7,refer:12,registri:1,relat:12,remot:4,remov:[8,10],remove_by_nam:10,remove_prefix:10,renam:4,rename_tensor:4,reorder:[1,7],repeat:[7,9],repeatedli:4,replac:7,repositori:12,repositroi:[],repres:[4,10],represent:10,requir:[4,5,6],res_estim:[1,2],research:12,reset_rtlsim:6,reshap:6,resourc:3,respect:10,result:[2,3,4,7,8,9,10],return_full_exec_context:4,returned_dict:[5,6],revers:10,reverse_endian:10,reverse_inn:10,right:12,root:10,round:[9,10],round_threshold:[1,7],roundandclipthreshold:9,roundup_to_integer_multipl:10,row:6,rtlsim:[4,6],rtlsim_output_to_npi:10,run:[4,8],same:[8,10],save:[4,10],save_as_npi:6,scalar:9,scale:[],scp:8,script:8,search:[],second:[8,9],see:[9,10],seen:12,sep:6,separ:12,sequenc:10,set:[4,5,6,8,9,10],set_attribut:[],set_executable_path:10,set_initi:4,set_ipgen_path:10,set_metadata_prop:4,set_nodeattr:5,set_sim_mod:[1,7],set_tensor_datatyp:4,set_tensor_shap:4,setsimmod:[],shape:[4,5,6,7,10],shell:8,should:[2,4,7],sign:[4,7,9,10],sign_to_thr:[1,7],sim:[6,10],sim_mod:[],simd:6,sinc:[4,10],singl:[4,9,10],small:2,smallest:4,some:[4,7,12],space:12,specif:12,specifi:[4,7,10],split:[8,9,10],standard:[4,5,6],stitch:[8,10],store:[5,8,10],streamingdataflowpartit:[1,8],streamingfclayer_batch:[1,5,8],streamingmaxpool_batch:[1,5],streamlin:[1,7],string:[2,10],stringlength:10,strm_decl:6,structur:2,style:12,sub:7,subdirectori:8,subgraph:4,submodul:1,subpackag:[],subset:2,success:8,suitabl:6,surviv:10,synth_pynq_proj:[1,7],synthesi:[3,8],synthpynqproject:8,take:[2,4,7,9,10],taken:[4,8,12],target:[8,12],target_dir:8,targetbit:10,tcl:8,tcl_script:10,tempfil:10,templat:[1,5,7],temporari:10,tensor:[2,4,7,9,10],tensor_fanout:2,tensor_nam:[2,4],tensor_shap:[4,10],tensor_valu:4,termin:8,ternari:4,test:[1,7],thei:9,them:[2,8,9],thi:[2,4,5,6,7,8,10,12],thing:12,threshold:[5,6,9],time:7,tlastmark:[1,5,8],tmem:6,togeth:8,toggle_clk:6,tool:12,topolog:1,train:12,transform:[1,4],transformed_model:7,travers:2,tupl:7,two:[4,8,9,10,12],type:[4,7,10],uint16:4,uint2:[4,10],uint32:4,uint3:4,uint4:4,uint8:[4,10],umuroglu:6,under:[8,12],uniqu:7,unpack:[8,10],unpack_innermost_dim_from_hex_str:10,unsign:[4,9],until:4,updat:9,upper:12,use:12,used:[4,5,6,10,12],useful:4,user:7,usernam:8,using:[4,7,9,10,12],util:[1,4,5,6],val:10,valu:[4,5,6,8,9,10],value_info:4,valueinfo:[4,7],valueinfo_to_tensor:10,valueinfoproto:[4,10],variabl:10,vector:[9,10],verif:2,verifi:[2,5,6],verify_custom_nod:1,verify_nod:[2,5,6],via:4,view:12,visser:6,vivado:[3,4,8,12],vivado_pynq_proj:8,vivado_stitch_proj:8,wai:2,want:9,wbit:10,websit:12,weight:[4,6],when:[2,7],where:[4,5,6,8,9],whether:[2,4,5,6,7],which:[4,5,6,8,9,10,12],width:10,wmem:6,work:[4,10],wrapper:4,write:1,xdnn:12,xilinx:12,xnorpopcount:1,xnorpopcountmatmul:[5,7,8],you:7,your:7,zero:[4,9,10]},titles:["FINN - End-to-End Flow","finn package","finn.analysis package","finn.analysis.fpgadataflow package","finn.core package","finn.custom_op package","finn.custom_op.fpgadataflow package","finn.transformation package","finn.transformation.fpgadataflow package","finn.transformation.streamline package","finn.util package","Getting Started","FINN","src","Source Code"],titleterms:{absorb:9,analysi:[2,3],basic:10,batchnorm_to_affin:7,bipolar_to_xnor:7,cleanup:8,code:14,codegen_ipgen:8,codegen_ipstitch:8,codegen_npysim:8,collapse_rep:9,compil:8,content:[1,2,3,4,5,6,7,8,9,10],convert_to_hls_lay:8,convolutioninputgener:6,core:4,create_dataflow_partit:8,custom_op:[5,6],data_pack:10,datatyp:4,document:[],end:0,execute_custom_nod:4,finn:[0,1,2,3,4,5,6,7,8,9,10,12],flow:0,fold_const:7,fpgadataflow:[3,6,8,10],gener:7,get:11,guid:7,hls_synth_res_estim:3,hlssynth_ipgen:8,how:2,indic:[],infer_datatyp:7,infer_shap:7,insert_tlastmark:8,make_deploy:8,make_pynq_driv:8,make_pynq_proj:8,modelwrapp:4,modul:[1,2,3,4,5,6,7,8,9,10],multithreshold:5,onnx:10,onnx_exec:4,packag:[1,2,3,4,5,6,7,8,9,10],pass:2,registri:5,reorder:9,res_estim:3,round_threshold:9,set_sim_mod:8,sign_to_thr:9,sourc:14,src:13,start:11,streamingdataflowpartit:5,streamingfclayer_batch:6,streamingmaxpool_batch:6,streamlin:9,submodul:[2,3,4,5,6,7,8,9,10],subpackag:[1,2,5,7],synth_pynq_proj:8,tabl:[],templat:[6,8],test:10,tlastmark:6,topolog:2,transform:[7,8,9],util:10,verify_custom_nod:2,welcom:[],what:12,write:[2,7],xnorpopcount:5}}) \ No newline at end of file diff --git a/docs/finn/_build/html/source_code.html b/docs/finn/_build/html/source_code.html new file mode 100644 index 000000000..ba8da8634 --- /dev/null +++ b/docs/finn/_build/html/source_code.html @@ -0,0 +1,201 @@ + + +<!DOCTYPE html> +<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]--> +<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]--> +<head> + <meta charset="utf-8"> + + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + + <title>Source Code — FINN documentation</title> + + + + + + + + + <script type="text/javascript" src="_static/js/modernizr.min.js"></script> + + + <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script> + <script type="text/javascript" src="_static/jquery.js"></script> + <script type="text/javascript" src="_static/underscore.js"></script> + <script type="text/javascript" src="_static/doctools.js"></script> + <script type="text/javascript" src="_static/language_data.js"></script> + + <script type="text/javascript" src="_static/js/theme.js"></script> + + + + + <link rel="stylesheet" href="_static/css/theme.css" type="text/css" /> + <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="prev" title="Getting Started" href="getting_started.html" /> +</head> + +<body class="wy-body-for-nav"> + + + <div class="wy-grid-for-nav"> + + <nav data-toggle="wy-nav-shift" class="wy-nav-side"> + <div class="wy-side-scroll"> + <div class="wy-side-nav-search" > + + + + <a href="index.html" class="icon icon-home"> FINN + + + + </a> + + + + + + + +<div role="search"> + <form id="rtd-search-form" class="wy-form" action="search.html" method="get"> + <input type="text" name="q" placeholder="Search docs" /> + <input type="hidden" name="check_keywords" value="yes" /> + <input type="hidden" name="area" value="default" /> + </form> +</div> + + + </div> + + <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation"> + + + + + + + <ul class="current"> +<li class="toctree-l1"><a class="reference internal" href="end_to_end_flow.html">FINN - End-to-End Flow</a></li> +<li class="toctree-l1"><a class="reference internal" href="getting_started.html">Getting Started</a></li> +<li class="toctree-l1 current"><a class="current reference internal" href="#">Source Code</a></li> +</ul> + + + + </div> + </div> + </nav> + + <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"> + + + <nav class="wy-nav-top" aria-label="top navigation"> + + <i data-toggle="wy-nav-top" class="fa fa-bars"></i> + <a href="index.html">FINN</a> + + </nav> + + + <div class="wy-nav-content"> + + <div class="rst-content"> + + + + + + + + + + + + + + + + + +<div role="navigation" aria-label="breadcrumbs navigation"> + + <ul class="wy-breadcrumbs"> + + <li><a href="index.html">Docs</a> »</li> + + <li>Source Code</li> + + + <li class="wy-breadcrumbs-aside"> + + + <a href="_sources/source_code.rst.txt" rel="nofollow"> View page source</a> + + + </li> + + </ul> + + + <hr/> +</div> + <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article"> + <div itemprop="articleBody"> + + <div class="section" id="source-code"> +<h1>Source Code<a class="headerlink" href="#source-code" title="Permalink to this headline">¶</a></h1> +</div> + + + </div> + + </div> + <footer> + + <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation"> + + + <a href="getting_started.html" class="btn btn-neutral float-left" title="Getting Started" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a> + + </div> + + + <hr/> + + <div role="contentinfo"> + <p> + © Copyright 2020, Y. Umuroglu, J. Petri-Koenig + + </p> + </div> + Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>. + +</footer> + + </div> + </div> + + </section> + + </div> + + + + <script type="text/javascript"> + jQuery(function () { + SphinxRtdTheme.Navigation.enable(true); + }); + </script> + + + + + + +</body> +</html> \ No newline at end of file diff --git a/docs/finn/end_to_end_flow.rst b/docs/finn/end_to_end_flow.rst new file mode 100644 index 000000000..482ced084 --- /dev/null +++ b/docs/finn/end_to_end_flow.rst @@ -0,0 +1,3 @@ +********************** +FINN - End-to-End Flow +********************** diff --git a/docs/finn/getting_started.rst b/docs/finn/getting_started.rst new file mode 100644 index 000000000..41173f451 --- /dev/null +++ b/docs/finn/getting_started.rst @@ -0,0 +1,3 @@ +*************** +Getting Started +*************** diff --git a/docs/finn/index.rst b/docs/finn/index.rst index 9a6a63725..26813ae1d 100644 --- a/docs/finn/index.rst +++ b/docs/finn/index.rst @@ -6,30 +6,28 @@ **** FINN **** +**This website is currently under construction.** + FINN is an experimental framework from Xilinx Research Labs to explore deep neural network inference on FPGAs. It specifically targets quantized neural networks, with emphasis on generating dataflow-style architectures customized for each network. It is not intended to be a generic DNN accelerator like xDNN, but rather a tool for exploring the design space of DNN inference accelerators on FPGAs. What is FINN? ============= 'FINN' is colloquially used to refer to two separate but highly related things: -* The FINN project, which includes tools for training quantized neural networks such as Brevitas, the FINN compiler, and the finn-hlslib Vivado HLS library of FPGA components for QNNs. An overview of the project can be taken from the following graphic and details can be seen on the project homepage. +* The FINN project, which includes tools for training quantized neural networks such as Brevitas, the FINN compiler, and the finn-hlslib Vivado HLS library of FPGA components for QNNs. An overview of the project can be taken from the following graphic and details can be seen on the `FINN project homepage <https://xilinx.github.io/finn/>`_. .. image:: ../img/finn-stack.png - :height: 600px :scale: 75% :align: center -* The repository, this Read the Docs website corresponds to. This is the FINN compiler, which is the centerpiece of the FINN project. The GitHub repository can be viewed using the link in the upper right corner. +* The repository, this Read the Docs website corresponds to. It is about the FINN compiler, which is the centerpiece of the FINN project. The GitHub repository can be viewed using the link in the upper right corner. To learn more about the FINN compiler, use this website and for a hands-on experience the repository contains some Jupyter notebooks which can be found under this `link <https://github.com/Xilinx/finn/tree/dev/notebooks>`_. .. toctree:: :maxdepth: 2 - :caption: Contents: - + :hidden: + end_to_end_flow + getting_started + source_code -Indices and tables -================== -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` diff --git a/docs/finn/source_code.rst b/docs/finn/source_code.rst new file mode 100644 index 000000000..99d708a16 --- /dev/null +++ b/docs/finn/source_code.rst @@ -0,0 +1,3 @@ +*********** +Source Code +*********** -- GitLab