From 6e316d6955ef161c0ff95ded871d40a45c942902 Mon Sep 17 00:00:00 2001
From: auphelia <jakobapk@web.de>
Date: Tue, 25 Feb 2020 14:36:52 +0000
Subject: [PATCH] [Sphinx Documentation] Add newly generated files with
 comments without bullet lists

---
 docs/finn/_build/doctrees/environment.pickle  | Bin 132739 -> 132739 bytes
 .../source_code/finn.analysis.doctree         | Bin 15387 -> 15841 bytes
 .../finn.analysis.fpgadataflow.doctree        | Bin 8808 -> 9056 bytes
 .../doctrees/source_code/finn.core.doctree    | Bin 83672 -> 86134 bytes
 .../source_code/finn.custom_op.doctree        | Bin 59797 -> 60601 bytes
 .../finn.custom_op.fpgadataflow.doctree       | Bin 171614 -> 209219 bytes
 docs/finn/_build/html/searchindex.js          |   2 +-
 .../finn.analysis.fpgadataflow.html           |   8 +-
 .../html/source_code/finn.analysis.html       |  13 +-
 .../_build/html/source_code/finn.core.html    |  78 +++--
 .../finn.custom_op.fpgadataflow.html          | 331 +++++++++++++-----
 .../html/source_code/finn.custom_op.html      |   5 +-
 12 files changed, 311 insertions(+), 126 deletions(-)

diff --git a/docs/finn/_build/doctrees/environment.pickle b/docs/finn/_build/doctrees/environment.pickle
index 514b0d9424d1f5a1bd10354404412a83a8bba92d..a437c94366946db799f8e66225a5e1aa8c099adf 100644
GIT binary patch
delta 9159
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

delta 9140
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
Z!b_8i%uBsBk9qHj!gu6nqTX9m_J7NYKO6u6

diff --git a/docs/finn/_build/doctrees/source_code/finn.analysis.doctree b/docs/finn/_build/doctrees/source_code/finn.analysis.doctree
index 9d3b2e63f531c9aed8c284cfc20387c62ad1f437..34dd19455e8073f7a7e2f2c3e397ac8b31eaec11 100644
GIT binary patch
delta 2189
zcma)7YiL|m5YD;TZFjSGlh$^(c{Ryqx6MBCT8XdJH4BASiQR^zwh;|>qlqVnxP~+<
zjm73sqbo*CnQO6VK>U+HDW%;|Ne#hDeyHf5iYcWKjbKp&S_S<fD$d+<_tgaIpSgGD
z%zSg^`_4W0z2mDV%%i4vmO~fKzZ8^tdETUTAUYU*elR+~HPC!x+AErun<tNg-FDQf
z@y%TtcSsMa)F+F?JuELTomCAno1g85zidH^8y9$~a6!c3gJ*&THh!6xx0*0i$l!FK
z7N*rs_DJ$ib(OIrm=rXBifbKESoAsTMgKmvgAf?c=VhV?-gZ2$9B1&YzXHMqmQ8Dz
zJCt&54I(?2%E}}0?jF9AHecDLi31pmau;siO&&y@p<<4)IQQ`dglfxf72djJd6xpE
z;*7C-n|hD}<*f{Z00U}WVNMMLyQ@092XiKsfniOA=*`j_k3Boo_hL*FE$EAjWWs3P
zptc|Bqm}Xr98ZErpu)2!>DkuC*k@@%mf+m>57~8{kR_}&2wBz%`6<PKB;<#bi-ct7
zQrR7ZEMhD}$RZI^asy*2Lat`DV(?pykDZ0@oM+P~K=-z56Pj^AgjLZA+pNGrhZps>
zc|OtG>WrCa5tWR0=bo2xczK5h9xSf4?vUk<bh+IqHzVOD1rJP}J$Fz4gYZTK-I#C*
zE(w3N<O8Pcr^b!?5!?$;m8~d;DbQr!YwR3FdP0FIN2|h>oJ06r%0<p|lGk${LaYqu
zA(*NuhGFNf;!cdGcn@dwgWEMerL!XW<xUq%5pTHJ%qOU%RJ@j^uD*pL@~oaR@a|;3
zvAt&~J{UVzb)p(pOLl^@a!cW4Q#$zl==*wjsLE+QBk{E~zTLpzgk4YR(x^GxR$cDq
zyL<{45OZT?T9SRP2vZhhx4-KxY#x5DzJT`QUE@&hxq@%kJ?E8QDM1RhhD%qKe<{#p
zUo!?q!T!+&V_RUwUrCpSnJx|0@KCOt)b(=RLZpmbw@|J}i}Ug`QvI0K38nJ0c9{0I
zr-Yi+y=<Ktu@*N_pO5>bFQfpT_MI#VP;`S&V>jIP)>w@DmYkrqMFNCU05<huipWbf
z05^Tp><|q5yDW!f;$a-spUNSz+A-jEw#n54^pLkJ!9X}z3H^bs+gd4JCJbmQ3&2#M
zUd<U7CBFYI5}!nzbrOsDq`S6=S>K{2rQ%IF3aOlc{<_!Enj4NlYyGJ8yv#V4$(T)=
z8+?j&K`va$urN;%$-*qW6dX|#6p*9MC)vHfD~idK{G(|me`Ez$#7$c6<Gp;GkBG~3
z5|bq59G}zw6VlKHDRe`ht<cQ`RgaUQvmwngxnGm{ip&>i;*-``^o5?G;enoG^!pUl
zHNyKMykk6~H;nMPgx)5hw@B#l2|@S~9X25dH=<)k;=Gbj^ljU4+W|hp`{kY|#3hJ5
z<W(*yP|;lV*gg}^LBAAzcs@gyK)f3#Ta-i5Us4W5zXv%KU0QOed3qbezG6SH<}x-0
yr<+|5NK8SC2B$aZRY#T-(03#$AmYWf48k=+a2p6&s?1=Dfk1?b+2l9P``CX?<7x2#

delta 1847
zcma)-T}+!*7{`0w!q%340OPZCK!L3-g|)z3;$Xv>xHy@w-KH5aK`90}oJ?qdCX&VR
zp=6zDLc-HsY^a$o(JQmg5=@YpU|igSiCO%*FfoBd6K{<1LbGV1&vQ;`U$%>Rb9&DI
zJm>#B=l7m-x_N%-wZfT#%f($c3xBh@xhZLlMaQGV<IxyTK`JntdOhXmg~>O-S=7(!
zq1)cfE@u0}-UeGmI@~U80*9lQg)>8rO{Se-z(Rg_!e%M_oV&$SaKUv~>&=P9-;u~n
zCeFB-*NC(5Z}~}0FzEL;YeV$2zy0S2LMYm!#|H-aUMi=qFD1HBi*j#YiZ{{-?o}MA
zdJ(la5AZcy{-iNOy5tM%TO_zef(i-3*Y@2Gaf~ES4?}q#)=CdJjEfjV8yfbtVn|Yp
zO{GMLdX}O1=qr;WW1}h2hGTJ^nsz90m+e+&IvfjiW>R}1Ok2%uS#nr`n)3IxyE##E
zSi$vK4tFGn9~Flm@*IpI6#W2)G-`PcX~|&&wQUX=V}^7|fUUr($}9LK|Eg+YtJH^@
z>K5zY6y_H94Rk&xNzwUJ(lJ{7FFIvfj*c=@bcWs67z@HZUz-HugQK3G*kK$$=J4T)
zERV;v#fl#7q$bbB)AXax#g34Nd3ezw&%+Dh+9TCnsBQCTGG>6AB|fb;l1bNknXUfx
z;ADJ!bfVq{qu!9#`@EE$dHMX-%-it0XD{6GR#?uFk6Q>VI{>bRB1a<$3fHg(w@O>>
z##GSX(D<msG>;DIFtNtWtp=U3MRK=N=}yeG07si{umy1W<{-9j6??(`AF<mxkn1?J
z&c2l(*Yn%_MuPlBf!xZ2+!69H$Tf7xgIq(9Rq&5LT>U-j+b};fW<i*4xK``bl2b4i
zIE_c_e)9pA@B84npv|(&EV&gxG}r+H%@-Jh_k!;*4|KQmSv+d87GCz(5mb9A37(z;
z+`XH`O3W;(R8%?rs5hh(id#F%_K;8`3~QJfHtj7AVXTwB#GyxA>*MGo+VT8fqMd#s
zvmpP>udOa-c|oN=gF9&1B|l6A+Cvvv1UABFp(H$GiK~c-d_*j>5e{gUH`T-(P8_t)
z(m?Gk23;M~_6P}TL$jGLJO0qLugsZG4}EB!{s3phb($XGLwt@;izJd4mk9qdUzU%d
zYUnu-vZ0G0Wb-Voeuf(QrmA_DhD+33re+bFc+xr=eRXhhDmFMlufCwHIv>&bnK@l1
z)cJBkrb);Y32C1Y<gZKHgdksCdg^grM=rALA}l+|r};Tm^SnsF!A?I*KwqbqIbpif
z-9`_({9jPz)3c|_rwgyjU!dLz%phC^CKH@$sx;#eUh1qr>_maC2u5TP-k>ht$M}HS
jF&%fcW8y5X?zFioZ5p#ShA%OOaakLJBx0GRuH)=Kw%haX

diff --git a/docs/finn/_build/doctrees/source_code/finn.analysis.fpgadataflow.doctree b/docs/finn/_build/doctrees/source_code/finn.analysis.fpgadataflow.doctree
index 40046ab359e9fb05a16d197598265e98387d37b7..4db9f3eacdcb4e49c2e6c1a29c70b2b581c683b1 100644
GIT binary patch
delta 929
zcmZWn-)j>=5YAriOyb4Tnzm{ZNkc293AShzi_+6duwd(95kVhHNlSEGFoxPg`%q)4
zLWO|JuHd6SNI|TnBp~9y;19IYqAyDEp>O&J_-p1isfWJI&dh%E&Fr_cp8ay%xS`)a
z)4pW<+#E}RuN*4oCUO@haz&6rcFxFYnF6ESElOs0NJ3ylLW_#TNAqMDmNy`2v1n$3
zH3S6*jIR)dHBs=Vo8LnWu0nj!kD0f?!0(LZ#rMDtaWp*2epeobKQO(4`Fsf8V{nta
z`G%JoH^q^yQdmZx*w=Vhg%8BJrbYc2L99@hF$+;{A!=10R;j&PxP=}yffzp}&PImV
zxOf-YZ9GNjD0-PLFMzOd8|Q(Y^wz|P<h_{7K@#8EPLW7AXZucL&Vf#tMv}uG{(3pQ
zsVf1SNQ9I}njX>A(zBtS8@0+?vL-H{C5|Yc!Gpxwg<|nTF7F`2{B?3&$vl+*sl7kU
z?<t-;HJ+%42X*)G)TIwJ{`(X$98UDYkFr*rlJKh>Jnt07Cof(uNbW;c{)7xebDN~N
z=4u>uzl%n$477GI^95dGx951!Z)&_M9&dZZs+EE5H~m^rtGtfQ`%7!Y^qHXjVDTVD
z21O1ye2JoGWauN5`9$6-8mAm8<SykWr;7P2w49unZ0NUL5*wU3x88Qk<~Y^a4kQTa
zwll$k3^(0oS+3)?_?GC<xGvV)l9>}44G&qhJpj0}%o)R}N@^h5Ouj&7P`ql3u?4C+
psH&6>YV9%zQMGD(S~z!nUL|kkFT)BkL~0ClSzFxYN<2Bl{s8zy1HS+O

delta 762
zcmZva!D|yi6vi`~tR_vg2}$ajCT+GA(wH`_njWpBMlZ_J9=s?KQ;9wYOqaF;_E6fQ
zLWQ8lw}ps!@Sr_;kUa=3NI~${ll}qKlLwKiP@xcT-X_{AUf#}p@BQYz{bn}LelDmB
zp5<cCE49%U16S2&mZnPAr%EPRXr&jeIjaxU>P1ZW2U!~i0~s&uFIo`YBMsvN|0qsq
zUHCk3iG8!#fe(zia50=lGvHAVLJS({Z(md7CmX8ah<Xwq2Or9<oedQj%gNGX>TQVe
zA<Ts8m=B*~r=>RBF~nRhVBm&MK1$2DAtqo2*L_j^7#?63usxDt<1(g>zaacS<z-0F
zFLW0zepIGQpv&odX@^#%pq-JLfHcfWd|(fbTM;b)@BbKZ8ONh1{x)D&%K5k;HpZu&
zzg~}e!~G=0&oL>Qt#k2;mJDwE+i0VsH~Y1!n6nmaRlV0l<?76h$%+Nv`F-Mk+@tYs
zIW9;ar4#*j>d+D9ecJ5!<hRebpm|sw?`qFj-A*08<5s>f`(=E^J^xNt^0!o;hY{F;
zpCCZ+Wl|qeAYYo{4XxH>5LI8LbhA7&YnG?!32-{YfV=@a28bmGHXLS&6J!YJrZT6C
zUv|mJE(O?@4{9HNN+uQ9#!0=aFRPGEGUHq-068SDRKUD53N(0)Mi|5~y_3~&Q`d7X
mq|tf@37KzF&5`NOosoH+R;#=CD&gTK?j&0$ytX4f=h-jbz1{Et

diff --git a/docs/finn/_build/doctrees/source_code/finn.core.doctree b/docs/finn/_build/doctrees/source_code/finn.core.doctree
index 39231c57fd65b3985763db4268c1168b9bbf5a7b..0e2039edb781e6a41c110dee8579bad2a6f6d666 100644
GIT binary patch
literal 86134
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

literal 83672
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
V&B+wpPFC=RO}*P7D0Sv${y(7qhe-ec

diff --git a/docs/finn/_build/doctrees/source_code/finn.custom_op.doctree b/docs/finn/_build/doctrees/source_code/finn.custom_op.doctree
index 4dd8727a8f8773fb3517a47ea30939cdc7eff650..91ba44d6d84a601f5e5e38d788715cca490c0df1 100644
GIT binary patch
delta 7334
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
AH2?qr

delta 6788
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

diff --git a/docs/finn/_build/doctrees/source_code/finn.custom_op.fpgadataflow.doctree b/docs/finn/_build/doctrees/source_code/finn.custom_op.fpgadataflow.doctree
index d4f061c2d76d3b1e83e10228793b507160032647..6d8cefe578e42817e8e8fbef2ed683c4e51667ad 100644
GIT binary patch
literal 209219
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
WCNgI0<LaLDY4u>qMccdiuKxgaj_0`m

literal 171614
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
Ae*gdg

diff --git a/docs/finn/_build/html/searchindex.js b/docs/finn/_build/html/searchindex.js
index bfb5ebc01..4dca5720a 100644
--- a/docs/finn/_build/html/searchindex.js
+++ b/docs/finn/_build/html/searchindex.js
@@ -1 +1 @@
-Search.setIndex({docnames:["end_to_end_flow","getting_started","index","source_code/finn","source_code/finn.analysis","source_code/finn.analysis.fpgadataflow","source_code/finn.core","source_code/finn.custom_op","source_code/finn.custom_op.fpgadataflow","source_code/finn.transformation","source_code/finn.transformation.fpgadataflow","source_code/finn.transformation.streamline","source_code/finn.util","source_code/modules"],envversion:{"sphinx.domains.c":1,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":1,"sphinx.domains.index":1,"sphinx.domains.javascript":1,"sphinx.domains.math":2,"sphinx.domains.python":1,"sphinx.domains.rst":1,"sphinx.domains.std":1,sphinx:56},filenames:["end_to_end_flow.rst","getting_started.rst","index.rst","source_code/finn.rst","source_code/finn.analysis.rst","source_code/finn.analysis.fpgadataflow.rst","source_code/finn.core.rst","source_code/finn.custom_op.rst","source_code/finn.custom_op.fpgadataflow.rst","source_code/finn.transformation.rst","source_code/finn.transformation.fpgadataflow.rst","source_code/finn.transformation.streamline.rst","source_code/finn.util.rst","source_code/modules.rst"],objects:{"":{finn:[3,0,0,"-"]},"finn.analysis":{fpgadataflow:[5,0,0,"-"],topology:[4,0,0,"-"],verify_custom_nodes:[4,0,0,"-"]},"finn.analysis.fpgadataflow":{hls_synth_res_estimation:[5,0,0,"-"],res_estimation:[5,0,0,"-"]},"finn.analysis.fpgadataflow.hls_synth_res_estimation":{hls_synth_res_estimation:[5,1,1,""]},"finn.analysis.fpgadataflow.res_estimation":{res_estimation:[5,1,1,""]},"finn.analysis.topology":{all_tensors_f32:[4,1,1,""],get_per_tensor_fanouts:[4,1,1,""],is_linear:[4,1,1,""],node_inputs_in_expected_order:[4,1,1,""]},"finn.analysis.verify_custom_nodes":{verify_nodes:[4,1,1,""]},"finn.core":{datatype:[6,0,0,"-"],execute_custom_node:[6,0,0,"-"],modelwrapper:[6,0,0,"-"],onnx_exec:[6,0,0,"-"],remote_exec:[6,0,0,"-"],rtlsim_exec:[6,0,0,"-"]},"finn.core.datatype":{DataType:[6,2,1,""]},"finn.core.datatype.DataType":{BINARY:[6,3,1,""],BIPOLAR:[6,3,1,""],FLOAT32:[6,3,1,""],INT16:[6,3,1,""],INT2:[6,3,1,""],INT32:[6,3,1,""],INT3:[6,3,1,""],INT4:[6,3,1,""],INT8:[6,3,1,""],TERNARY:[6,3,1,""],UINT16:[6,3,1,""],UINT2:[6,3,1,""],UINT32:[6,3,1,""],UINT3:[6,3,1,""],UINT4:[6,3,1,""],UINT8:[6,3,1,""],allowed:[6,4,1,""],bitwidth:[6,4,1,""],get_hls_datatype_str:[6,4,1,""],get_num_possible_values:[6,4,1,""],get_smallest_possible:[6,4,1,""],is_integer:[6,4,1,""],max:[6,4,1,""],min:[6,4,1,""],signed:[6,4,1,""]},"finn.core.execute_custom_node":{execute_custom_node:[6,1,1,""]},"finn.core.modelwrapper":{ModelWrapper:[6,2,1,""]},"finn.core.modelwrapper.ModelWrapper":{analysis:[6,4,1,""],check_all_tensor_shapes_specified:[6,4,1,""],check_compatibility:[6,4,1,""],find_consumer:[6,4,1,""],find_producer:[6,4,1,""],get_all_tensor_names:[6,4,1,""],get_initializer:[6,4,1,""],get_metadata_prop:[6,4,1,""],get_tensor_datatype:[6,4,1,""],get_tensor_fanout:[6,4,1,""],get_tensor_shape:[6,4,1,""],get_tensor_valueinfo:[6,4,1,""],graph:[6,4,1,""],make_empty_exec_context:[6,4,1,""],make_new_valueinfo_name:[6,4,1,""],model:[6,4,1,""],rename_tensor:[6,4,1,""],save:[6,4,1,""],set_initializer:[6,4,1,""],set_metadata_prop:[6,4,1,""],set_tensor_datatype:[6,4,1,""],set_tensor_shape:[6,4,1,""],transform:[6,4,1,""]},"finn.core.onnx_exec":{compare_execution:[6,1,1,""],execute_node:[6,1,1,""],execute_onnx:[6,1,1,""],execute_onnx_and_make_model:[6,1,1,""]},"finn.core.remote_exec":{remote_exec:[6,1,1,""]},"finn.core.rtlsim_exec":{rtlsim_exec:[6,1,1,""]},"finn.custom_op":{CustomOp:[7,2,1,""],fpgadataflow:[8,0,0,"-"],multithreshold:[7,0,0,"-"],registry:[7,0,0,"-"],streamingdataflowpartition:[7,0,0,"-"],xnorpopcount:[7,0,0,"-"]},"finn.custom_op.CustomOp":{execute_node:[7,4,1,""],get_nodeattr:[7,4,1,""],get_nodeattr_types:[7,4,1,""],infer_node_datatype:[7,4,1,""],make_shape_compatible_op:[7,4,1,""],set_nodeattr:[7,4,1,""],verify_node:[7,4,1,""]},"finn.custom_op.fpgadataflow":{HLSCustomOp:[8,2,1,""],convolutioninputgenerator:[8,0,0,"-"],streamingfclayer_batch:[8,0,0,"-"],streamingmaxpool_batch:[8,0,0,"-"],templates:[8,0,0,"-"],tlastmarker:[8,0,0,"-"]},"finn.custom_op.fpgadataflow.HLSCustomOp":{blackboxfunction:[8,4,1,""],bram_estimation:[8,4,1,""],code_generation_ipgen:[8,4,1,""],code_generation_npysim:[8,4,1,""],compile_singlenode_code:[8,4,1,""],dataoutstrm:[8,4,1,""],defines:[8,4,1,""],docompute:[8,4,1,""],dynamic_input_to_npy:[8,4,1,""],exec_precompiled_singlenode_model:[8,4,1,""],execute_node:[8,4,1,""],generate_params:[8,4,1,""],get_folded_input_shape:[8,4,1,""],get_folded_output_shape:[8,4,1,""],get_instream_width:[8,4,1,""],get_nodeattr_types:[8,4,1,""],get_number_output_values:[8,4,1,""],get_outstream_width:[8,4,1,""],global_includes:[8,4,1,""],ipgen_singlenode_code:[8,4,1,""],lut_estimation:[8,4,1,""],node_res_estimation:[8,4,1,""],npy_to_dynamic_output:[8,4,1,""],pragmas:[8,4,1,""],read_npy_data:[8,4,1,""],reset_rtlsim:[8,4,1,""],rtlsim:[8,4,1,""],save_as_npy:[8,4,1,""],strm_decl:[8,4,1,""],toggle_clk:[8,4,1,""]},"finn.custom_op.fpgadataflow.convolutioninputgenerator":{ConvolutionInputGenerator:[8,2,1,""]},"finn.custom_op.fpgadataflow.convolutioninputgenerator.ConvolutionInputGenerator":{blackboxfunction:[8,4,1,""],bram_estimation:[8,4,1,""],dataoutstrm:[8,4,1,""],defines:[8,4,1,""],docompute:[8,4,1,""],execute_node:[8,4,1,""],get_input_datatype:[8,4,1,""],get_nodeattr_types:[8,4,1,""],get_number_output_values:[8,4,1,""],get_output_datatype:[8,4,1,""],get_stream_width:[8,4,1,""],global_includes:[8,4,1,""],infer_node_datatype:[8,4,1,""],lut_estimation:[8,4,1,""],make_shape_compatible_op:[8,4,1,""],pragmas:[8,4,1,""],read_npy_data:[8,4,1,""],save_as_npy:[8,4,1,""],strm_decl:[8,4,1,""],verify_node:[8,4,1,""]},"finn.custom_op.fpgadataflow.streamingfclayer_batch":{StreamingFCLayer_Batch:[8,2,1,""]},"finn.custom_op.fpgadataflow.streamingfclayer_batch.StreamingFCLayer_Batch":{blackboxfunction:[8,4,1,""],bram_estimation:[8,4,1,""],calc_tmem:[8,4,1,""],calc_wmem:[8,4,1,""],dataoutstrm:[8,4,1,""],defines:[8,4,1,""],docompute:[8,4,1,""],execute_node:[8,4,1,""],generate_params:[8,4,1,""],get_folded_input_shape:[8,4,1,""],get_folded_output_shape:[8,4,1,""],get_hls_compatible_threshold_tensor:[8,4,1,""],get_hls_compatible_weight_tensor:[8,4,1,""],get_input_datatype:[8,4,1,""],get_instream_width:[8,4,1,""],get_nodeattr_types:[8,4,1,""],get_number_output_values:[8,4,1,""],get_output_datatype:[8,4,1,""],get_outstream_width:[8,4,1,""],get_template_param_values:[8,4,1,""],get_weight_datatype:[8,4,1,""],global_includes:[8,4,1,""],infer_node_datatype:[8,4,1,""],lut_estimation:[8,4,1,""],make_shape_compatible_op:[8,4,1,""],pragmas:[8,4,1,""],read_npy_data:[8,4,1,""],save_as_npy:[8,4,1,""],strm_decl:[8,4,1,""],verify_node:[8,4,1,""]},"finn.custom_op.fpgadataflow.streamingmaxpool_batch":{StreamingMaxPool_Batch:[8,2,1,""]},"finn.custom_op.fpgadataflow.streamingmaxpool_batch.StreamingMaxPool_Batch":{blackboxfunction:[8,4,1,""],bram_estimation:[8,4,1,""],dataoutstrm:[8,4,1,""],defines:[8,4,1,""],docompute:[8,4,1,""],get_nodeattr_types:[8,4,1,""],get_number_output_values:[8,4,1,""],global_includes:[8,4,1,""],infer_node_datatype:[8,4,1,""],lut_estimation:[8,4,1,""],make_shape_compatible_op:[8,4,1,""],pragmas:[8,4,1,""],read_npy_data:[8,4,1,""],save_as_npy:[8,4,1,""],strm_decl:[8,4,1,""],verify_node:[8,4,1,""]},"finn.custom_op.fpgadataflow.tlastmarker":{TLastMarker:[8,2,1,""]},"finn.custom_op.fpgadataflow.tlastmarker.TLastMarker":{blackboxfunction:[8,4,1,""],dataoutstrm:[8,4,1,""],defines:[8,4,1,""],docompute:[8,4,1,""],execute_node:[8,4,1,""],get_folded_input_shape:[8,4,1,""],get_folded_output_shape:[8,4,1,""],get_instream_width:[8,4,1,""],get_nodeattr_types:[8,4,1,""],get_number_output_values:[8,4,1,""],get_outstream_width:[8,4,1,""],global_includes:[8,4,1,""],infer_node_datatype:[8,4,1,""],make_shape_compatible_op:[8,4,1,""],pragmas:[8,4,1,""],read_npy_data:[8,4,1,""],save_as_npy:[8,4,1,""],strm_decl:[8,4,1,""],verify_node:[8,4,1,""]},"finn.custom_op.multithreshold":{MultiThreshold:[7,2,1,""],compare:[7,1,1,""],multithreshold:[7,1,1,""]},"finn.custom_op.multithreshold.MultiThreshold":{execute_node:[7,4,1,""],get_nodeattr_types:[7,4,1,""],infer_node_datatype:[7,4,1,""],make_shape_compatible_op:[7,4,1,""],verify_node:[7,4,1,""]},"finn.custom_op.registry":{getCustomOp:[7,1,1,""]},"finn.custom_op.streamingdataflowpartition":{StreamingDataflowPartition:[7,2,1,""]},"finn.custom_op.streamingdataflowpartition.StreamingDataflowPartition":{execute_node:[7,4,1,""],get_nodeattr_types:[7,4,1,""],infer_node_datatype:[7,4,1,""],make_shape_compatible_op:[7,4,1,""],verify_node:[7,4,1,""]},"finn.custom_op.xnorpopcount":{XnorPopcountMatMul:[7,2,1,""],xnorpopcountmatmul:[7,1,1,""]},"finn.custom_op.xnorpopcount.XnorPopcountMatMul":{execute_node:[7,4,1,""],get_nodeattr_types:[7,4,1,""],infer_node_datatype:[7,4,1,""],make_shape_compatible_op:[7,4,1,""],verify_node:[7,4,1,""]},"finn.transformation":{Transformation:[9,2,1,""],batchnorm_to_affine:[9,0,0,"-"],bipolar_to_xnor:[9,0,0,"-"],fold_constants:[9,0,0,"-"],fpgadataflow:[10,0,0,"-"],general:[9,0,0,"-"],infer_datatypes:[9,0,0,"-"],infer_shapes:[9,0,0,"-"],streamline:[11,0,0,"-"]},"finn.transformation.Transformation":{apply:[9,4,1,""]},"finn.transformation.batchnorm_to_affine":{BatchNormToAffine:[9,2,1,""]},"finn.transformation.batchnorm_to_affine.BatchNormToAffine":{apply:[9,4,1,""]},"finn.transformation.bipolar_to_xnor":{ConvertBipolarMatMulToXnorPopcount:[9,2,1,""]},"finn.transformation.bipolar_to_xnor.ConvertBipolarMatMulToXnorPopcount":{apply:[9,4,1,""]},"finn.transformation.fold_constants":{FoldConstants:[9,2,1,""]},"finn.transformation.fold_constants.FoldConstants":{apply:[9,4,1,""]},"finn.transformation.fpgadataflow":{cleanup:[10,0,0,"-"],codegen_ipgen:[10,0,0,"-"],codegen_ipstitch:[10,0,0,"-"],codegen_npysim:[10,0,0,"-"],compile:[10,0,0,"-"],convert_to_hls_layers:[10,0,0,"-"],create_dataflow_partition:[10,0,0,"-"],hlssynth_ipgen:[10,0,0,"-"],insert_tlastmarker:[10,0,0,"-"],make_deployment:[10,0,0,"-"],make_pynq_driver:[10,0,0,"-"],make_pynq_proj:[10,0,0,"-"],replace_verilog_relpaths:[10,0,0,"-"],set_exec_mode:[10,0,0,"-"],synth_pynq_proj:[10,0,0,"-"],templates:[10,0,0,"-"]},"finn.transformation.fpgadataflow.cleanup":{CleanUp:[10,2,1,""]},"finn.transformation.fpgadataflow.cleanup.CleanUp":{apply:[10,4,1,""]},"finn.transformation.fpgadataflow.codegen_ipgen":{CodeGen_ipgen:[10,2,1,""]},"finn.transformation.fpgadataflow.codegen_ipgen.CodeGen_ipgen":{apply:[10,4,1,""]},"finn.transformation.fpgadataflow.codegen_ipstitch":{CodeGen_ipstitch:[10,2,1,""]},"finn.transformation.fpgadataflow.codegen_ipstitch.CodeGen_ipstitch":{apply:[10,4,1,""]},"finn.transformation.fpgadataflow.codegen_npysim":{CodeGen_npysim:[10,2,1,""]},"finn.transformation.fpgadataflow.codegen_npysim.CodeGen_npysim":{apply:[10,4,1,""]},"finn.transformation.fpgadataflow.compile":{Compile:[10,2,1,""]},"finn.transformation.fpgadataflow.compile.Compile":{apply:[10,4,1,""]},"finn.transformation.fpgadataflow.convert_to_hls_layers":{InferBinaryStreamingFCLayer:[10,2,1,""]},"finn.transformation.fpgadataflow.convert_to_hls_layers.InferBinaryStreamingFCLayer":{apply:[10,4,1,""]},"finn.transformation.fpgadataflow.create_dataflow_partition":{CreateDataflowPartition:[10,2,1,""]},"finn.transformation.fpgadataflow.create_dataflow_partition.CreateDataflowPartition":{apply:[10,4,1,""]},"finn.transformation.fpgadataflow.hlssynth_ipgen":{HLSSynth_IPGen:[10,2,1,""]},"finn.transformation.fpgadataflow.hlssynth_ipgen.HLSSynth_IPGen":{apply:[10,4,1,""]},"finn.transformation.fpgadataflow.insert_tlastmarker":{InsertTLastMarker:[10,2,1,""]},"finn.transformation.fpgadataflow.insert_tlastmarker.InsertTLastMarker":{apply:[10,4,1,""]},"finn.transformation.fpgadataflow.make_deployment":{DeployToPYNQ:[10,2,1,""]},"finn.transformation.fpgadataflow.make_deployment.DeployToPYNQ":{apply:[10,4,1,""]},"finn.transformation.fpgadataflow.make_pynq_driver":{MakePYNQDriver:[10,2,1,""]},"finn.transformation.fpgadataflow.make_pynq_driver.MakePYNQDriver":{apply:[10,4,1,""]},"finn.transformation.fpgadataflow.make_pynq_proj":{MakePYNQProject:[10,2,1,""]},"finn.transformation.fpgadataflow.make_pynq_proj.MakePYNQProject":{apply:[10,4,1,""]},"finn.transformation.fpgadataflow.replace_verilog_relpaths":{ReplaceVerilogRelPaths:[10,2,1,""]},"finn.transformation.fpgadataflow.replace_verilog_relpaths.ReplaceVerilogRelPaths":{apply:[10,4,1,""]},"finn.transformation.fpgadataflow.set_exec_mode":{SetExecMode:[10,2,1,""]},"finn.transformation.fpgadataflow.set_exec_mode.SetExecMode":{apply:[10,4,1,""]},"finn.transformation.fpgadataflow.synth_pynq_proj":{SynthPYNQProject:[10,2,1,""]},"finn.transformation.fpgadataflow.synth_pynq_proj.SynthPYNQProject":{apply:[10,4,1,""]},"finn.transformation.general":{ConvertSubToAdd:[9,2,1,""],GiveRandomTensorNames:[9,2,1,""],GiveReadableTensorNames:[9,2,1,""],GiveUniqueNodeNames:[9,2,1,""]},"finn.transformation.general.ConvertSubToAdd":{apply:[9,4,1,""]},"finn.transformation.general.GiveRandomTensorNames":{apply:[9,4,1,""]},"finn.transformation.general.GiveReadableTensorNames":{apply:[9,4,1,""]},"finn.transformation.general.GiveUniqueNodeNames":{apply:[9,4,1,""]},"finn.transformation.infer_datatypes":{InferDataTypes:[9,2,1,""]},"finn.transformation.infer_datatypes.InferDataTypes":{apply:[9,4,1,""]},"finn.transformation.infer_shapes":{InferShapes:[9,2,1,""]},"finn.transformation.infer_shapes.InferShapes":{apply:[9,4,1,""]},"finn.transformation.streamline":{Streamline:[11,2,1,""],absorb:[11,0,0,"-"],collapse_repeated:[11,0,0,"-"],reorder:[11,0,0,"-"],round_thresholds:[11,0,0,"-"],sign_to_thres:[11,0,0,"-"]},"finn.transformation.streamline.Streamline":{apply:[11,4,1,""]},"finn.transformation.streamline.absorb":{Absorb1BitMulIntoMatMul:[11,2,1,""],AbsorbAddIntoMultiThreshold:[11,2,1,""],AbsorbMulIntoMultiThreshold:[11,2,1,""],FactorOutMulSignMagnitude:[11,2,1,""]},"finn.transformation.streamline.absorb.Absorb1BitMulIntoMatMul":{apply:[11,4,1,""]},"finn.transformation.streamline.absorb.AbsorbAddIntoMultiThreshold":{apply:[11,4,1,""]},"finn.transformation.streamline.absorb.AbsorbMulIntoMultiThreshold":{apply:[11,4,1,""]},"finn.transformation.streamline.absorb.FactorOutMulSignMagnitude":{apply:[11,4,1,""]},"finn.transformation.streamline.collapse_repeated":{CollapseRepeatedAdd:[11,2,1,""],CollapseRepeatedMul:[11,2,1,""],CollapseRepeatedOp:[11,2,1,""]},"finn.transformation.streamline.collapse_repeated.CollapseRepeatedOp":{apply:[11,4,1,""]},"finn.transformation.streamline.reorder":{MoveAddPastMul:[11,2,1,""],MoveScalarAddPastMatMul:[11,2,1,""],MoveScalarMulPastMatMul:[11,2,1,""]},"finn.transformation.streamline.reorder.MoveAddPastMul":{apply:[11,4,1,""]},"finn.transformation.streamline.reorder.MoveScalarAddPastMatMul":{apply:[11,4,1,""]},"finn.transformation.streamline.reorder.MoveScalarMulPastMatMul":{apply:[11,4,1,""]},"finn.transformation.streamline.round_thresholds":{RoundAndClipThresholds:[11,2,1,""]},"finn.transformation.streamline.round_thresholds.RoundAndClipThresholds":{apply:[11,4,1,""]},"finn.transformation.streamline.sign_to_thres":{ConvertSignToThres:[11,2,1,""]},"finn.transformation.streamline.sign_to_thres.ConvertSignToThres":{apply:[11,4,1,""]},"finn.util":{basic:[12,0,0,"-"],data_packing:[12,0,0,"-"],fpgadataflow:[12,0,0,"-"],onnx:[12,0,0,"-"],test:[12,0,0,"-"]},"finn.util.basic":{CppBuilder:[12,2,1,""],calculate_signed_dot_prod_range:[12,1,1,""],gen_finn_dt_tensor:[12,1,1,""],get_by_name:[12,1,1,""],get_finn_root:[12,1,1,""],interleave_matrix_outer_dim_from_partitions:[12,1,1,""],make_build_dir:[12,1,1,""],pad_tensor_to_multiple_of:[12,1,1,""],random_string:[12,1,1,""],remove_by_name:[12,1,1,""],roundup_to_integer_multiple:[12,1,1,""]},"finn.util.basic.CppBuilder":{append_includes:[12,4,1,""],append_sources:[12,4,1,""],build:[12,4,1,""],set_executable_path:[12,4,1,""]},"finn.util.data_packing":{array2hexstring:[12,1,1,""],finnpy_to_packed_bytearray:[12,1,1,""],hexstring2npbytearray:[12,1,1,""],npbytearray2hexstring:[12,1,1,""],npy_to_rtlsim_input:[12,1,1,""],numpy_to_hls_code:[12,1,1,""],pack_innermost_dim_as_hex_string:[12,1,1,""],packed_bytearray_to_finnpy:[12,1,1,""],rtlsim_output_to_npy:[12,1,1,""],unpack_innermost_dim_from_hex_string:[12,1,1,""]},"finn.util.fpgadataflow":{IPGenBuilder:[12,2,1,""],pyverilate_get_liveness_threshold_cycles:[12,1,1,""],pyverilate_stitched_ip:[12,1,1,""]},"finn.util.fpgadataflow.IPGenBuilder":{append_tcl:[12,4,1,""],build:[12,4,1,""],set_ipgen_path:[12,4,1,""]},"finn.util.onnx":{valueinfo_to_tensor:[12,1,1,""]},"finn.util.test":{get_test_model_def_fxn:[12,1,1,""],get_test_model_trained:[12,1,1,""],get_test_model_untrained:[12,1,1,""],get_trained_checkpoint:[12,1,1,""]},finn:{analysis:[4,0,0,"-"],core:[6,0,0,"-"],custom_op:[7,0,0,"-"],transformation:[9,0,0,"-"],util:[12,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","function","Python function"],"2":["py","class","Python class"],"3":["py","attribute","Python attribute"],"4":["py","method","Python method"]},objtypes:{"0":"py:module","1":"py:function","2":"py:class","3":"py:attribute","4":"py:method"},terms:{"0f01":12,"0x07":12,"0x0e":12,"0x0f01":12,"0xb":12,"0xe":12,"abstract":[7,8,9],"boolean":6,"class":[6,7,8,9,10,11,12],"const":9,"default":[7,8,9],"enum":6,"final":6,"float":12,"function":[1,6,7,8,9,12],"import":1,"int":10,"new":[1,2,6,7,8],"return":[4,5,6,7,8,9,11,12],"static":4,"throw":12,"true":[6,12],"try":1,"var":8,For:[10,11],HLS:[2,6,7,10,12],IPs:10,PEs:8,The:[1,2,4,6,9,10,11,12],There:1,Use:[6,12],abc:[7,9],abit:12,abort:8,about:[2,4,10],abov:1,absolut:10,absorb1bitmulintomatmul:11,absorb:[3,9,10],absorbaddintomultithreshold:11,absorbmulintomultithreshold:11,acceler:[1,10],accord:[8,12],account:6,action:10,activ:[6,12],add:[9,11,12],adder:11,adding:1,addit:[1,10],addition:11,address:10,after:[8,12],aim:11,all:[1,4,6,7,8,9,10,12],all_tensors_f32:4,allow:6,alreadi:10,also:[7,8,10],amount:12,analysi:[3,6,13],analysis_fxn:6,anaylsis_fxn:6,ani:[1,6,7,9,10,12],annot:[4,6,7,8],anoth:10,append_includ:12,append_sourc:12,append_tcl:12,appli:[6,9,10,11],apply_rep:9,appropri:[1,9],arbitrari:12,architectur:2,argument:[1,10,12],around:6,arrai:12,array2hexstr:12,arxiv:11,assign:6,associ:[6,9],assum:12,attribut:[4,7,8,10],attribute_nam:[7,8],attributeproto:[7,8],back:[1,8],backend:10,base:[6,7,8,9,10,11,12],bash:[8,12],basic:[3,8,13],batchnorm:9,batchnorm_to_affin:[3,13],batchnormtoaffin:9,been:[7,10],befor:12,between:[8,12],binari:[6,8,10,11,12],bipolar:[6,7,8,9,11,12],bipolar_to_xnor:[3,13],bit:[6,12],bitfil:[1,7],bitwidth:6,blackboxfunct:8,block:[10,12],blott:8,board:[6,10],bool:[4,9],both:12,bram:8,bram_estim:8,brevita:[2,12],brien:8,browser:1,build:[8,12],built:4,calc_tmem:8,calc_wmem:8,calcul:8,calculate_signed_dot_prod_rang:12,call:[1,6,8,9,10],can:[1,2,6,8,9,10,11,12],cannot:9,centerpiec:2,certain:4,chang:[1,6,9],check:[4,6,7,8],check_all_tensor_shapes_specifi:6,check_compat:6,cleanup:[3,9],clk:[8,10],clock:8,clone:[1,12],code:[8,10,12],code_gen_dir:12,code_gen_dir_ipgen:10,code_gen_dir_npysim:10,code_generation_ipgen:8,code_generation_npysim:8,codegen_ipgen:[3,9],codegen_ipstitch:[3,9],codegen_npysim:[3,9],collaps:11,collapse_rep:[3,9],collapserepeatedadd:11,collapserepeatedmul:11,collapserepeatedop:11,collect:[1,10],colloqui:2,come:[1,4],command:[1,12],commun:2,compar:[6,7],compare_execut:6,compare_fxn:6,compat:[6,7,8],compil:[2,3,8,9,12],compile_singlenode_cod:8,complet:1,compon:2,comput:[1,6],consecut:11,constant:[4,6,11],construct:2,consum:6,contain:[1,2,6,7,8,10,12],content:13,context:[6,7,8],contribut:2,convent:4,convert:[1,8,9,10,11,12],convert_to_hls_lay:[3,9],convertbipolarmatmultoxnorpopcount:9,convertsigntothr:11,convertsubtoadd:9,convolutioninputgener:[3,7],copi:[6,9,10],core:[3,10,13],corner:2,correct:[9,12],correctli:[1,4,7,8,10],correspond:[2,6,7,8],count:8,cpp_file:12,cppbuilder:[8,12],creat:[1,6,10,12],create_dataflow_partit:[3,9],createdataflowpartit:10,current:[2,6,8],custom:[1,2,4,6,7,8,10],custom_op:[3,13],customop:[7,8],cycl:[8,12],data:[6,7,8,10,12],data_pack:[3,13],dataflow:[2,6,10],dataoutstrm:8,datatyp:[3,7,8,9,12,13],debug:6,declar:9,deep:[2,6,8,9],default_v:[7,8],default_valu:[7,8],defin:8,depend:1,deploi:1,deploy:10,deploytopynq:10,design:[1,10],detail:2,develop:2,dict:[6,7,8],dictionari:[4,6,8],differ:[1,7,8],digit:12,dimens:12,dimension:12,dir:[10,12],directori:[1,10,12],distr_pad:12,divis:12,doc:2,docker:12,dockerfil:1,docomput:8,doe:[1,6,7],don:9,done:4,dot:12,down:[1,6],driver:10,dt_a:12,dt_b:12,dtype:[4,6,7,8,12],dynam:4,dynamic_input_to_npi:8,each:[2,4,6,9,10,11,12],editor:1,effect:9,either:1,element:12,embed:6,emit:12,emphasi:2,empti:6,end:8,ensur:[8,9,10,12],entir:1,entri:12,enumer:9,environ:1,equal:[7,8],equival:11,estim:[5,8],even:9,evenli:12,everi:[7,8,9,10],everyth:1,exampl:[1,12],excel:1,except:12,exec_mod:10,exec_precompiled_singlenode_model:8,execut:[6,7,8,10,12],executable_path:[10,12],execute_custom_nod:[3,13],execute_nod:[6,7,8],execute_onnx:[6,10],execute_onnx_and_make_model:6,execution_context:6,exist:[7,8,12],exit:12,expect:[4,6,7,8,10],experi:2,experiment:2,explor:[2,6,8],expos:6,extens:1,extra:[1,4,12],extract:[4,5],f5c6bd32ae93ec103a88152214baedff4ce1850d81065bfc:1,factor:12,factoroutmulsignmagnitud:11,fals:[6,9,12],familiar:1,fan:4,fast:8,fewest:6,field:[10,12],file:[1,6,8,10,12],filenam:[6,10],fill:[7,8],find:6,find_consum:6,find_produc:6,finish:12,finn_dt:12,finnpy_to_packed_bytearrai:12,first:[4,11],fix:[9,12],flatten:12,float32:[4,6],fold:8,fold_const:[3,13],foldconst:9,folder:[1,10,12],follow:[1,2,4,7,10],form:8,forward:1,found:[2,10],four:12,fpga:[1,2],fpgadataflow:[3,4,7,9,13],fpgapart:[8,10],framework:[2,8],fraser:8,from:[1,2,5,6,8,10,12],full:6,further:9,gambardella:8,gen_finn_dt_tensor:12,gener:[2,3,8,10,12,13],generate_param:8,get:[6,7,10],get_all_tensor_nam:6,get_by_nam:12,get_finn_root:12,get_folded_input_shap:8,get_folded_output_shap:8,get_hls_compatible_threshold_tensor:8,get_hls_compatible_weight_tensor:8,get_hls_datatype_str:6,get_initi:6,get_input_datatyp:8,get_instream_width:8,get_metadata_prop:6,get_nodeattr:7,get_nodeattr_typ:[7,8],get_num_possible_valu:6,get_number_output_valu:8,get_output_datatyp:8,get_outstream_width:8,get_per_tensor_fanout:4,get_smallest_poss:6,get_stream_width:8,get_template_param_valu:8,get_tensor_datatyp:6,get_tensor_fanout:6,get_tensor_shap:6,get_tensor_valueinfo:6,get_test_model_def_fxn:12,get_test_model_train:12,get_test_model_untrain:12,get_trained_checkpoint:12,get_weight_datatyp:8,getcustomop:7,github:2,give:[1,9,11],give_unique_node_nam:9,given:[4,5,6,7,8,12],giverandomtensornam:9,givereadabletensornam:9,giveuniquenodenam:9,global_includ:8,graph:[4,6,7,8,9,10],graphic:2,greater:7,group:7,guarante:[9,12],guid:3,hand:2,has:[4,6,9,10,12],have:[1,4,6,7,8,9,10,11],help:1,hex:12,hexstr:12,hexstring2npbytearrai:12,high:1,highli:2,hls:8,hls_synth_res_estim:[3,4],hls_var_nam:12,hlscustomop:8,hlslib:[2,8],hlssynth_ipgen:[3,9],homepag:2,host:[1,12],how:[3,12],http:1,human:9,imag:8,immedi:10,implement:[6,10],includ:[2,6,10],include_path:12,indic:[6,7,8,9,10],infer:[1,2,6,7,8,9,12],infer_datatyp:[3,13],infer_node_datatyp:[7,8],infer_shap:[3,13],inferbinarystreamingfclay:10,inferdatatyp:9,infershap:9,infinit:9,info:[9,12],info_messag:4,inform:[4,10],infrastructur:10,inherit:9,initi:[4,6],innermost:12,inp0:7,inp1:7,inp:8,input:[4,6,7,8,9,11,12],input_dict:6,input_dtyp:12,input_fil:12,insert:[8,10,12],insert_tlastmark:[3,9],inserttlastmark:10,insid:[1,7],instal:1,instanc:[6,7,8,11],instant:12,instanti:10,instead:12,int16:6,int2:6,int32:6,int3:6,int4:6,int8:6,integ:[6,7,11,12],interest:6,interfac:10,interleav:[8,12],interleave_matrix_outer_dim_from_partit:12,intermedi:[6,9],intern:9,interv:7,involv:1,ipgen_path:[10,12],ipgen_singlenode_cod:8,ipgenbuild:[8,12],is_integ:6,is_linear:4,item:12,its:7,itself:7,jupyt:2,kei:6,kind:10,know:9,lab:2,lambda:6,largest:6,launch:1,layer:[9,10],lead:12,learn:[2,8],leeser:8,len:12,let:9,letter:12,librari:[2,12],library_path:12,like:1,linear:[4,6],link:[1,2],list:[4,6,12],load:12,locat:1,look:[1,4],loop:[8,9],lut:8,lut_estim:8,made:[6,9],magnitud:11,mai:1,make:[1,9,10],make_build_dir:12,make_collapsed_param_fxn:11,make_deepcopi:6,make_deploy:[3,9],make_empty_exec_context:6,make_new_valueinfo_nam:6,make_project:10,make_pynq_driv:[3,9],make_pynq_proj:[3,9],make_shape_compatible_op:[7,8],makepynqdriv:10,makepynqproject:10,mani:1,manipul:6,manual:9,map:7,mark:8,matmul:[9,11],matrix:[7,8,11,12],max:[6,12],mean:12,meant:9,member:[7,8,12],meta:7,metadata:6,metadata_prop:[6,10],method:[7,8],min:[6,12],minimum:12,minut:10,mixtur:4,mkdtemp:12,mode:[1,10],model:[4,5,6,7,8,9,10,11,12],model_a:6,model_b:6,model_was_chang:9,modelproto:[6,10],modelwrapp:[3,4,9,13],modul:13,modular:2,more:[2,6,9,12],mount:1,move:11,moveaddpastmul:11,movescalaraddpastmatmul:11,movescalarmulpastmatmul:11,mul:[9,11],multidimension:12,multipl:[7,9,11,12],multipli:11,multithreshold:[3,10,11,13],must:[7,9,10,11,12],mvtu:10,n_partit:12,n_thres_step:8,name:[4,5,6,7,9,12],name_field:12,ndarrai:12,nearest:[11,12],necessari:10,need:[5,7,8,9],neg:[6,11],netnam:12,netron:1,network:[1,2,8,12],neural:[2,8],neuron:8,new_nam:6,next:11,no_decl:12,node:[4,5,6,7,8,9,10,11],node_inputs_in_expected_ord:4,node_res_estim:8,non:10,none:[6,7,12],note:[1,7],notebook:2,notwithstand:4,now:[4,6],npbytearrai:12,npbytearray2hexstr:12,npy:[8,12],npy_to_dynamic_output:8,npy_to_rtlsim_input:12,npysim:[8,10],number:[6,7,8,12],numpi:[8,12],numpy_to_hls_cod:12,object:[6,12],observ:8,old_nam:6,onc:[8,9],one:[4,6,8,10,12],ones:[1,10],onli:[4,6,9,10,11],onlin:1,onnx:[3,6,7,8,10,13],onnx_exec:[3,10,13],onnx_model_proto:6,onnx_nod:[7,8],onnxruntim:6,op_nam:11,op_typ:4,open:1,oper:[6,11],ops:[4,8,11],option:1,order:4,orig_thres_matrix:8,orig_weight_matrix:8,origin:8,other:[6,11],otherwis:[1,6,9,12],out:[4,7],out_bia:7,out_scal:7,out_shap:12,outcom:10,outermost:12,output:[6,7,8,9,12],output_shap:12,overlai:10,overview:2,own:[1,7],pack:[10,12],pack_innermost_dim:12,pack_innermost_dim_as_hex_str:12,packag:13,packed_bytearrai:12,packed_bytearray_to_finnpi:12,packedbit:12,pad:12,pad_tensor_to_multiple_of:12,pad_to_dim:12,pad_to_nbit:12,pair:10,param:8,paramet:[8,11,12],part:[7,12],particular:[7,8,12],partit:[6,12],pass:[3,8,12],password:10,past:11,path:[8,10,12],per:10,perform:[1,7,8],permit:[7,8],place:[8,10],placehold:7,platform:10,point:[1,9],popcount:7,port:1,posit:[8,11,12],possibl:[6,10],post:7,pragma:8,preced:11,precid:11,precis:12,precompil:8,precomput:9,prefer:6,prefix:12,prepend:12,pretrain:12,preusser:8,previous:10,print:1,prior:[9,10,12],process:[1,7],produc:[4,6,7,8,12],product:12,project:[2,10],properti:[4,6],provid:[1,6],pushbutton:1,pynq:[6,10],pynq_driver_dir:10,python:[1,10,12],pytorch:12,pyveril:[6,8,12],pyverilate_get_liveness_threshold_cycl:12,pyverilate_stitched_ip:12,qnn:[1,2],quantiz:[2,4,6,8],random:[9,12],random_str:12,randomli:12,rather:1,reach:9,read:[2,8],read_npy_data:8,readabl:9,real:7,recommend:9,refer:2,referenc:10,reflect:1,registri:[3,13],regular:7,rel:10,relat:[2,6,12],remot:6,remote_exec:[3,13],remov:[10,12],remove_by_nam:12,remove_prefix:12,renam:6,rename_tensor:6,reorder:[3,9],repeat:[9,11],repeatedli:6,replac:9,replace_verilog_relpath:[3,9],replaceverilogrelpath:10,repo:1,repositori:[1,2],repres:[6,12],represent:12,requir:[6,7,8],res_estim:[3,4],research:2,reset:8,reset_rtlsim:8,reshap:8,resourc:[1,5,8],respect:12,result:[4,5,6,9,10,11,12],return_full_exec_context:6,returned_dict:[7,8],revers:12,reverse_endian:12,reverse_inn:12,right:[2,8],root:[1,12],round:[11,12],round_threshold:[3,9],roundandclipthreshold:11,roundup_to_integer_multipl:12,row:8,rtlsim:[6,8,10,12],rtlsim_exec:[3,13],rtlsim_output_to_npi:12,run:[6,8,10],run_dock:1,same:[10,12],sampl:8,save:[6,8,10,12],save_as_npi:8,scalar:11,scp:10,script:[1,8,10,12],second:[10,11],see:[11,12],seen:2,sep:8,separ:[2,7],sequenc:12,server:1,set:[1,6,7,8,10,11,12],set_exec_mod:[3,9],set_executable_path:12,set_initi:6,set_ipgen_path:12,set_metadata_prop:6,set_nodeattr:7,set_tensor_datatyp:6,set_tensor_shap:6,setexecmod:10,settings64:1,sever:[1,10],shape:[6,7,8,9,12],shell:10,should:[1,4,6,7,8,9,10],sign:[6,9,11,12],sign_to_thr:[3,9],sim:[8,12],simd:8,simpli:1,simul:[7,8,10,12],sinc:[6,12],singl:[1,6,10,11,12],slide:8,small:4,smaller:6,smallest:6,some:[1,2,6,7,8,9,10],someth:1,spawn:1,specif:2,specifi:[6,9,10,12],split:[10,11,12],stai:2,standard:[6,7,8],stitch:[6,8,10,12],store:[7,10,12],stream:8,streamingdataflowpartit:[3,10,13],streamingfclayer_batch:[3,7,10],streamingmaxpool_batch:[3,7],streamlin:[3,9],string:[4,10,12],stringlength:12,strm_decl:8,structur:4,style:2,sub:9,subdirectori:10,subgraph:6,submodul:[3,13],subpackag:13,subsequ:10,subset:4,succes:10,success:[7,10],suitabl:8,support:6,sure:1,surviv:12,synaps:8,synth_pynq_proj:[3,9],synthesi:[5,10],synthpynqproject:10,t_0:7,t_1:7,t_n:7,take:[1,4,6,9,11,12],taken:[2,6,10],target:[2,10],target_dir:10,targetbit:12,tcl:[8,10,12],tcl_script:12,tempfil:12,templat:[3,7,9],temporari:12,tensor:[4,6,9,11,12],tensor_fanout:4,tensor_nam:[4,6],tensor_shap:[6,12],tensor_valu:6,termin:[1,10],ternari:6,test:[3,9,13],text:1,than:[6,7],thei:11,them:[4,10,11],thi:[1,2,4,6,7,8,9,10,12],thing:2,thought:1,thresh:8,threshold:[7,8,11],time:[1,8,9,10],tlastmark:[3,7,10],tmem:8,togeth:10,toggl:8,toggle_clk:8,token:1,tool:[1,2],topolog:[3,13],train:[1,2],transform:[3,6,13],transformed_model:9,travers:4,tune:2,tupl:9,two:[2,6,10,11,12],type:[6,8,9,12],ubuntu:1,uint16:6,uint2:[6,12],uint32:6,uint3:6,uint4:6,uint8:[6,12],umuroglu:8,under:[2,10],uniqu:9,unpack:[10,12],unpack_innermost_dim_from_hex_str:12,unsign:[6,11],until:6,untrain:12,updat:[2,11],upper:2,use:[2,10],used:[2,6,7,8,10,12],useful:6,user:9,usernam:10,using:[2,6,8,9,10,11,12],util:[3,6,7,8,13],val:12,valu:[6,7,8,10,11,12],value_info:6,valueinfo:[6,9],valueinfo_to_tensor:12,valueinfoproto:[6,12],variabl:[1,12],vector:[11,12],verif:4,verifi:[4,7,8],verify_custom_nod:[3,13],verify_nod:[4,7,8],verilog:10,version:2,via:6,view:2,visser:8,vivado:[1,2,5,6,10,12],vivado_path:1,vivado_pynq_proj:10,vivado_stitch_proj:10,wai:[1,4],wait:12,want:11,wbit:12,websit:2,weight:[6,8,12],welcom:2,well:1,when:[4,7,8,9],where:[1,6,7,8,10,11],wherea:6,whether:[4,6,7,8,9],which:[1,2,6,7,8,10,11,12],width:[8,12],window:8,without:1,wmem:8,work:[1,6,12],workspac:1,wrapper:6,write:[1,3,7,8],xilinx:2,xnor:7,xnorpopcount:[3,13],xnorpopcountmatmul:[7,9,10],you:[1,9],your:[1,9],zero:[6,8,11,12]},titles:["FINN - End-to-End Flow","Getting Started","FINN","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"],titleterms:{absorb:11,analysi:[4,5],basic:12,batchnorm_to_affin:9,bipolar_to_xnor:9,cleanup:10,codegen_ipgen:10,codegen_ipstitch:10,codegen_npysim:10,collapse_rep:11,compil:[1,10],content:[3,4,5,6,7,8,9,10,11,12],convert_to_hls_lay:10,convolutioninputgener:8,core:6,create_dataflow_partit:10,custom_op:[7,8],data_pack:12,datatyp:6,develop:1,directli:1,docker:1,end:0,execute_custom_nod:6,experiment:1,finn:[0,1,2,3,4,5,6,7,8,9,10,11,12,13],flow:0,fold_const:9,fpgadataflow:[5,8,10,12],gener:9,get:1,guid:9,hls_synth_res_estim:5,hlssynth_ipgen:10,how:[1,4],infer_datatyp:9,infer_shap:9,insert_tlastmark:10,interact:1,jenkin:1,jupyt:1,make_deploy:10,make_pynq_driv:10,make_pynq_proj:10,modelwrapp:6,modul:[3,4,5,6,7,8,9,10,11,12],multithreshold:7,notebook:1,onnx:12,onnx_exec:6,packag:[3,4,5,6,7,8,9,10,11,12],pass:4,registri:7,remote_exec:6,reorder:11,replace_verilog_relpath:10,requir:1,res_estim:5,round_threshold:11,rtlsim_exec:6,run:1,set_exec_mod:10,shell:1,sign_to_thr:11,start:1,streamingdataflowpartit:7,streamingfclayer_batch:8,streamingmaxpool_batch:8,streamlin:11,submodul:[4,5,6,7,8,9,10,11,12],subpackag:[3,4,7,9],suit:1,synth_pynq_proj:10,templat:[8,10],test:[1,12],tlastmark:8,topolog:4,transform:[9,10,11],use:1,using:1,util:12,verify_custom_nod:4,what:2,write:[4,9],xnorpopcount:7}})
\ No newline at end of file
+Search.setIndex({docnames:["end_to_end_flow","getting_started","index","source_code/finn","source_code/finn.analysis","source_code/finn.analysis.fpgadataflow","source_code/finn.core","source_code/finn.custom_op","source_code/finn.custom_op.fpgadataflow","source_code/finn.transformation","source_code/finn.transformation.fpgadataflow","source_code/finn.transformation.streamline","source_code/finn.util","source_code/modules"],envversion:{"sphinx.domains.c":1,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":1,"sphinx.domains.index":1,"sphinx.domains.javascript":1,"sphinx.domains.math":2,"sphinx.domains.python":1,"sphinx.domains.rst":1,"sphinx.domains.std":1,sphinx:56},filenames:["end_to_end_flow.rst","getting_started.rst","index.rst","source_code/finn.rst","source_code/finn.analysis.rst","source_code/finn.analysis.fpgadataflow.rst","source_code/finn.core.rst","source_code/finn.custom_op.rst","source_code/finn.custom_op.fpgadataflow.rst","source_code/finn.transformation.rst","source_code/finn.transformation.fpgadataflow.rst","source_code/finn.transformation.streamline.rst","source_code/finn.util.rst","source_code/modules.rst"],objects:{"":{finn:[3,0,0,"-"]},"finn.analysis":{fpgadataflow:[5,0,0,"-"],topology:[4,0,0,"-"],verify_custom_nodes:[4,0,0,"-"]},"finn.analysis.fpgadataflow":{hls_synth_res_estimation:[5,0,0,"-"],res_estimation:[5,0,0,"-"]},"finn.analysis.fpgadataflow.hls_synth_res_estimation":{hls_synth_res_estimation:[5,1,1,""]},"finn.analysis.fpgadataflow.res_estimation":{res_estimation:[5,1,1,""]},"finn.analysis.topology":{all_tensors_f32:[4,1,1,""],get_per_tensor_fanouts:[4,1,1,""],is_linear:[4,1,1,""],node_inputs_in_expected_order:[4,1,1,""]},"finn.analysis.verify_custom_nodes":{verify_nodes:[4,1,1,""]},"finn.core":{datatype:[6,0,0,"-"],execute_custom_node:[6,0,0,"-"],modelwrapper:[6,0,0,"-"],onnx_exec:[6,0,0,"-"],remote_exec:[6,0,0,"-"],rtlsim_exec:[6,0,0,"-"]},"finn.core.datatype":{DataType:[6,2,1,""]},"finn.core.datatype.DataType":{BINARY:[6,3,1,""],BIPOLAR:[6,3,1,""],FLOAT32:[6,3,1,""],INT16:[6,3,1,""],INT2:[6,3,1,""],INT32:[6,3,1,""],INT3:[6,3,1,""],INT4:[6,3,1,""],INT8:[6,3,1,""],TERNARY:[6,3,1,""],UINT16:[6,3,1,""],UINT2:[6,3,1,""],UINT32:[6,3,1,""],UINT3:[6,3,1,""],UINT4:[6,3,1,""],UINT8:[6,3,1,""],allowed:[6,4,1,""],bitwidth:[6,4,1,""],get_hls_datatype_str:[6,4,1,""],get_num_possible_values:[6,4,1,""],get_smallest_possible:[6,4,1,""],is_integer:[6,4,1,""],max:[6,4,1,""],min:[6,4,1,""],signed:[6,4,1,""]},"finn.core.execute_custom_node":{execute_custom_node:[6,1,1,""]},"finn.core.modelwrapper":{ModelWrapper:[6,2,1,""]},"finn.core.modelwrapper.ModelWrapper":{analysis:[6,4,1,""],check_all_tensor_shapes_specified:[6,4,1,""],check_compatibility:[6,4,1,""],find_consumer:[6,4,1,""],find_producer:[6,4,1,""],get_all_tensor_names:[6,4,1,""],get_initializer:[6,4,1,""],get_metadata_prop:[6,4,1,""],get_tensor_datatype:[6,4,1,""],get_tensor_fanout:[6,4,1,""],get_tensor_shape:[6,4,1,""],get_tensor_valueinfo:[6,4,1,""],graph:[6,4,1,""],make_empty_exec_context:[6,4,1,""],make_new_valueinfo_name:[6,4,1,""],model:[6,4,1,""],rename_tensor:[6,4,1,""],save:[6,4,1,""],set_initializer:[6,4,1,""],set_metadata_prop:[6,4,1,""],set_tensor_datatype:[6,4,1,""],set_tensor_shape:[6,4,1,""],transform:[6,4,1,""]},"finn.core.onnx_exec":{compare_execution:[6,1,1,""],execute_node:[6,1,1,""],execute_onnx:[6,1,1,""],execute_onnx_and_make_model:[6,1,1,""]},"finn.core.remote_exec":{remote_exec:[6,1,1,""]},"finn.core.rtlsim_exec":{rtlsim_exec:[6,1,1,""]},"finn.custom_op":{CustomOp:[7,2,1,""],fpgadataflow:[8,0,0,"-"],multithreshold:[7,0,0,"-"],registry:[7,0,0,"-"],streamingdataflowpartition:[7,0,0,"-"],xnorpopcount:[7,0,0,"-"]},"finn.custom_op.CustomOp":{execute_node:[7,4,1,""],get_nodeattr:[7,4,1,""],get_nodeattr_types:[7,4,1,""],infer_node_datatype:[7,4,1,""],make_shape_compatible_op:[7,4,1,""],set_nodeattr:[7,4,1,""],verify_node:[7,4,1,""]},"finn.custom_op.fpgadataflow":{HLSCustomOp:[8,2,1,""],convolutioninputgenerator:[8,0,0,"-"],streamingfclayer_batch:[8,0,0,"-"],streamingmaxpool_batch:[8,0,0,"-"],templates:[8,0,0,"-"],tlastmarker:[8,0,0,"-"]},"finn.custom_op.fpgadataflow.HLSCustomOp":{blackboxfunction:[8,4,1,""],bram_estimation:[8,4,1,""],code_generation_ipgen:[8,4,1,""],code_generation_npysim:[8,4,1,""],compile_singlenode_code:[8,4,1,""],dataoutstrm:[8,4,1,""],defines:[8,4,1,""],docompute:[8,4,1,""],dynamic_input_to_npy:[8,4,1,""],exec_precompiled_singlenode_model:[8,4,1,""],execute_node:[8,4,1,""],generate_params:[8,4,1,""],get_folded_input_shape:[8,4,1,""],get_folded_output_shape:[8,4,1,""],get_instream_width:[8,4,1,""],get_nodeattr_types:[8,4,1,""],get_number_output_values:[8,4,1,""],get_outstream_width:[8,4,1,""],global_includes:[8,4,1,""],ipgen_singlenode_code:[8,4,1,""],lut_estimation:[8,4,1,""],node_res_estimation:[8,4,1,""],npy_to_dynamic_output:[8,4,1,""],pragmas:[8,4,1,""],read_npy_data:[8,4,1,""],reset_rtlsim:[8,4,1,""],rtlsim:[8,4,1,""],save_as_npy:[8,4,1,""],strm_decl:[8,4,1,""],toggle_clk:[8,4,1,""]},"finn.custom_op.fpgadataflow.convolutioninputgenerator":{ConvolutionInputGenerator:[8,2,1,""]},"finn.custom_op.fpgadataflow.convolutioninputgenerator.ConvolutionInputGenerator":{blackboxfunction:[8,4,1,""],bram_estimation:[8,4,1,""],dataoutstrm:[8,4,1,""],defines:[8,4,1,""],docompute:[8,4,1,""],execute_node:[8,4,1,""],get_input_datatype:[8,4,1,""],get_nodeattr_types:[8,4,1,""],get_number_output_values:[8,4,1,""],get_output_datatype:[8,4,1,""],get_stream_width:[8,4,1,""],global_includes:[8,4,1,""],infer_node_datatype:[8,4,1,""],lut_estimation:[8,4,1,""],make_shape_compatible_op:[8,4,1,""],pragmas:[8,4,1,""],read_npy_data:[8,4,1,""],save_as_npy:[8,4,1,""],strm_decl:[8,4,1,""],verify_node:[8,4,1,""]},"finn.custom_op.fpgadataflow.streamingfclayer_batch":{StreamingFCLayer_Batch:[8,2,1,""]},"finn.custom_op.fpgadataflow.streamingfclayer_batch.StreamingFCLayer_Batch":{blackboxfunction:[8,4,1,""],bram_estimation:[8,4,1,""],calc_tmem:[8,4,1,""],calc_wmem:[8,4,1,""],dataoutstrm:[8,4,1,""],defines:[8,4,1,""],docompute:[8,4,1,""],execute_node:[8,4,1,""],generate_params:[8,4,1,""],get_folded_input_shape:[8,4,1,""],get_folded_output_shape:[8,4,1,""],get_hls_compatible_threshold_tensor:[8,4,1,""],get_hls_compatible_weight_tensor:[8,4,1,""],get_input_datatype:[8,4,1,""],get_instream_width:[8,4,1,""],get_nodeattr_types:[8,4,1,""],get_number_output_values:[8,4,1,""],get_output_datatype:[8,4,1,""],get_outstream_width:[8,4,1,""],get_template_param_values:[8,4,1,""],get_weight_datatype:[8,4,1,""],global_includes:[8,4,1,""],infer_node_datatype:[8,4,1,""],lut_estimation:[8,4,1,""],make_shape_compatible_op:[8,4,1,""],pragmas:[8,4,1,""],read_npy_data:[8,4,1,""],save_as_npy:[8,4,1,""],strm_decl:[8,4,1,""],verify_node:[8,4,1,""]},"finn.custom_op.fpgadataflow.streamingmaxpool_batch":{StreamingMaxPool_Batch:[8,2,1,""]},"finn.custom_op.fpgadataflow.streamingmaxpool_batch.StreamingMaxPool_Batch":{blackboxfunction:[8,4,1,""],bram_estimation:[8,4,1,""],dataoutstrm:[8,4,1,""],defines:[8,4,1,""],docompute:[8,4,1,""],get_nodeattr_types:[8,4,1,""],get_number_output_values:[8,4,1,""],global_includes:[8,4,1,""],infer_node_datatype:[8,4,1,""],lut_estimation:[8,4,1,""],make_shape_compatible_op:[8,4,1,""],pragmas:[8,4,1,""],read_npy_data:[8,4,1,""],save_as_npy:[8,4,1,""],strm_decl:[8,4,1,""],verify_node:[8,4,1,""]},"finn.custom_op.fpgadataflow.tlastmarker":{TLastMarker:[8,2,1,""]},"finn.custom_op.fpgadataflow.tlastmarker.TLastMarker":{blackboxfunction:[8,4,1,""],dataoutstrm:[8,4,1,""],defines:[8,4,1,""],docompute:[8,4,1,""],execute_node:[8,4,1,""],get_folded_input_shape:[8,4,1,""],get_folded_output_shape:[8,4,1,""],get_instream_width:[8,4,1,""],get_nodeattr_types:[8,4,1,""],get_number_output_values:[8,4,1,""],get_outstream_width:[8,4,1,""],global_includes:[8,4,1,""],infer_node_datatype:[8,4,1,""],make_shape_compatible_op:[8,4,1,""],pragmas:[8,4,1,""],read_npy_data:[8,4,1,""],save_as_npy:[8,4,1,""],strm_decl:[8,4,1,""],verify_node:[8,4,1,""]},"finn.custom_op.multithreshold":{MultiThreshold:[7,2,1,""],compare:[7,1,1,""],multithreshold:[7,1,1,""]},"finn.custom_op.multithreshold.MultiThreshold":{execute_node:[7,4,1,""],get_nodeattr_types:[7,4,1,""],infer_node_datatype:[7,4,1,""],make_shape_compatible_op:[7,4,1,""],verify_node:[7,4,1,""]},"finn.custom_op.registry":{getCustomOp:[7,1,1,""]},"finn.custom_op.streamingdataflowpartition":{StreamingDataflowPartition:[7,2,1,""]},"finn.custom_op.streamingdataflowpartition.StreamingDataflowPartition":{execute_node:[7,4,1,""],get_nodeattr_types:[7,4,1,""],infer_node_datatype:[7,4,1,""],make_shape_compatible_op:[7,4,1,""],verify_node:[7,4,1,""]},"finn.custom_op.xnorpopcount":{XnorPopcountMatMul:[7,2,1,""],xnorpopcountmatmul:[7,1,1,""]},"finn.custom_op.xnorpopcount.XnorPopcountMatMul":{execute_node:[7,4,1,""],get_nodeattr_types:[7,4,1,""],infer_node_datatype:[7,4,1,""],make_shape_compatible_op:[7,4,1,""],verify_node:[7,4,1,""]},"finn.transformation":{Transformation:[9,2,1,""],batchnorm_to_affine:[9,0,0,"-"],bipolar_to_xnor:[9,0,0,"-"],fold_constants:[9,0,0,"-"],fpgadataflow:[10,0,0,"-"],general:[9,0,0,"-"],infer_datatypes:[9,0,0,"-"],infer_shapes:[9,0,0,"-"],streamline:[11,0,0,"-"]},"finn.transformation.Transformation":{apply:[9,4,1,""]},"finn.transformation.batchnorm_to_affine":{BatchNormToAffine:[9,2,1,""]},"finn.transformation.batchnorm_to_affine.BatchNormToAffine":{apply:[9,4,1,""]},"finn.transformation.bipolar_to_xnor":{ConvertBipolarMatMulToXnorPopcount:[9,2,1,""]},"finn.transformation.bipolar_to_xnor.ConvertBipolarMatMulToXnorPopcount":{apply:[9,4,1,""]},"finn.transformation.fold_constants":{FoldConstants:[9,2,1,""]},"finn.transformation.fold_constants.FoldConstants":{apply:[9,4,1,""]},"finn.transformation.fpgadataflow":{cleanup:[10,0,0,"-"],codegen_ipgen:[10,0,0,"-"],codegen_ipstitch:[10,0,0,"-"],codegen_npysim:[10,0,0,"-"],compile:[10,0,0,"-"],convert_to_hls_layers:[10,0,0,"-"],create_dataflow_partition:[10,0,0,"-"],hlssynth_ipgen:[10,0,0,"-"],insert_tlastmarker:[10,0,0,"-"],make_deployment:[10,0,0,"-"],make_pynq_driver:[10,0,0,"-"],make_pynq_proj:[10,0,0,"-"],replace_verilog_relpaths:[10,0,0,"-"],set_exec_mode:[10,0,0,"-"],synth_pynq_proj:[10,0,0,"-"],templates:[10,0,0,"-"]},"finn.transformation.fpgadataflow.cleanup":{CleanUp:[10,2,1,""]},"finn.transformation.fpgadataflow.cleanup.CleanUp":{apply:[10,4,1,""]},"finn.transformation.fpgadataflow.codegen_ipgen":{CodeGen_ipgen:[10,2,1,""]},"finn.transformation.fpgadataflow.codegen_ipgen.CodeGen_ipgen":{apply:[10,4,1,""]},"finn.transformation.fpgadataflow.codegen_ipstitch":{CodeGen_ipstitch:[10,2,1,""]},"finn.transformation.fpgadataflow.codegen_ipstitch.CodeGen_ipstitch":{apply:[10,4,1,""]},"finn.transformation.fpgadataflow.codegen_npysim":{CodeGen_npysim:[10,2,1,""]},"finn.transformation.fpgadataflow.codegen_npysim.CodeGen_npysim":{apply:[10,4,1,""]},"finn.transformation.fpgadataflow.compile":{Compile:[10,2,1,""]},"finn.transformation.fpgadataflow.compile.Compile":{apply:[10,4,1,""]},"finn.transformation.fpgadataflow.convert_to_hls_layers":{InferBinaryStreamingFCLayer:[10,2,1,""]},"finn.transformation.fpgadataflow.convert_to_hls_layers.InferBinaryStreamingFCLayer":{apply:[10,4,1,""]},"finn.transformation.fpgadataflow.create_dataflow_partition":{CreateDataflowPartition:[10,2,1,""]},"finn.transformation.fpgadataflow.create_dataflow_partition.CreateDataflowPartition":{apply:[10,4,1,""]},"finn.transformation.fpgadataflow.hlssynth_ipgen":{HLSSynth_IPGen:[10,2,1,""]},"finn.transformation.fpgadataflow.hlssynth_ipgen.HLSSynth_IPGen":{apply:[10,4,1,""]},"finn.transformation.fpgadataflow.insert_tlastmarker":{InsertTLastMarker:[10,2,1,""]},"finn.transformation.fpgadataflow.insert_tlastmarker.InsertTLastMarker":{apply:[10,4,1,""]},"finn.transformation.fpgadataflow.make_deployment":{DeployToPYNQ:[10,2,1,""]},"finn.transformation.fpgadataflow.make_deployment.DeployToPYNQ":{apply:[10,4,1,""]},"finn.transformation.fpgadataflow.make_pynq_driver":{MakePYNQDriver:[10,2,1,""]},"finn.transformation.fpgadataflow.make_pynq_driver.MakePYNQDriver":{apply:[10,4,1,""]},"finn.transformation.fpgadataflow.make_pynq_proj":{MakePYNQProject:[10,2,1,""]},"finn.transformation.fpgadataflow.make_pynq_proj.MakePYNQProject":{apply:[10,4,1,""]},"finn.transformation.fpgadataflow.replace_verilog_relpaths":{ReplaceVerilogRelPaths:[10,2,1,""]},"finn.transformation.fpgadataflow.replace_verilog_relpaths.ReplaceVerilogRelPaths":{apply:[10,4,1,""]},"finn.transformation.fpgadataflow.set_exec_mode":{SetExecMode:[10,2,1,""]},"finn.transformation.fpgadataflow.set_exec_mode.SetExecMode":{apply:[10,4,1,""]},"finn.transformation.fpgadataflow.synth_pynq_proj":{SynthPYNQProject:[10,2,1,""]},"finn.transformation.fpgadataflow.synth_pynq_proj.SynthPYNQProject":{apply:[10,4,1,""]},"finn.transformation.general":{ConvertSubToAdd:[9,2,1,""],GiveRandomTensorNames:[9,2,1,""],GiveReadableTensorNames:[9,2,1,""],GiveUniqueNodeNames:[9,2,1,""]},"finn.transformation.general.ConvertSubToAdd":{apply:[9,4,1,""]},"finn.transformation.general.GiveRandomTensorNames":{apply:[9,4,1,""]},"finn.transformation.general.GiveReadableTensorNames":{apply:[9,4,1,""]},"finn.transformation.general.GiveUniqueNodeNames":{apply:[9,4,1,""]},"finn.transformation.infer_datatypes":{InferDataTypes:[9,2,1,""]},"finn.transformation.infer_datatypes.InferDataTypes":{apply:[9,4,1,""]},"finn.transformation.infer_shapes":{InferShapes:[9,2,1,""]},"finn.transformation.infer_shapes.InferShapes":{apply:[9,4,1,""]},"finn.transformation.streamline":{Streamline:[11,2,1,""],absorb:[11,0,0,"-"],collapse_repeated:[11,0,0,"-"],reorder:[11,0,0,"-"],round_thresholds:[11,0,0,"-"],sign_to_thres:[11,0,0,"-"]},"finn.transformation.streamline.Streamline":{apply:[11,4,1,""]},"finn.transformation.streamline.absorb":{Absorb1BitMulIntoMatMul:[11,2,1,""],AbsorbAddIntoMultiThreshold:[11,2,1,""],AbsorbMulIntoMultiThreshold:[11,2,1,""],FactorOutMulSignMagnitude:[11,2,1,""]},"finn.transformation.streamline.absorb.Absorb1BitMulIntoMatMul":{apply:[11,4,1,""]},"finn.transformation.streamline.absorb.AbsorbAddIntoMultiThreshold":{apply:[11,4,1,""]},"finn.transformation.streamline.absorb.AbsorbMulIntoMultiThreshold":{apply:[11,4,1,""]},"finn.transformation.streamline.absorb.FactorOutMulSignMagnitude":{apply:[11,4,1,""]},"finn.transformation.streamline.collapse_repeated":{CollapseRepeatedAdd:[11,2,1,""],CollapseRepeatedMul:[11,2,1,""],CollapseRepeatedOp:[11,2,1,""]},"finn.transformation.streamline.collapse_repeated.CollapseRepeatedOp":{apply:[11,4,1,""]},"finn.transformation.streamline.reorder":{MoveAddPastMul:[11,2,1,""],MoveScalarAddPastMatMul:[11,2,1,""],MoveScalarMulPastMatMul:[11,2,1,""]},"finn.transformation.streamline.reorder.MoveAddPastMul":{apply:[11,4,1,""]},"finn.transformation.streamline.reorder.MoveScalarAddPastMatMul":{apply:[11,4,1,""]},"finn.transformation.streamline.reorder.MoveScalarMulPastMatMul":{apply:[11,4,1,""]},"finn.transformation.streamline.round_thresholds":{RoundAndClipThresholds:[11,2,1,""]},"finn.transformation.streamline.round_thresholds.RoundAndClipThresholds":{apply:[11,4,1,""]},"finn.transformation.streamline.sign_to_thres":{ConvertSignToThres:[11,2,1,""]},"finn.transformation.streamline.sign_to_thres.ConvertSignToThres":{apply:[11,4,1,""]},"finn.util":{basic:[12,0,0,"-"],data_packing:[12,0,0,"-"],fpgadataflow:[12,0,0,"-"],onnx:[12,0,0,"-"],test:[12,0,0,"-"]},"finn.util.basic":{CppBuilder:[12,2,1,""],calculate_signed_dot_prod_range:[12,1,1,""],gen_finn_dt_tensor:[12,1,1,""],get_by_name:[12,1,1,""],get_finn_root:[12,1,1,""],interleave_matrix_outer_dim_from_partitions:[12,1,1,""],make_build_dir:[12,1,1,""],pad_tensor_to_multiple_of:[12,1,1,""],random_string:[12,1,1,""],remove_by_name:[12,1,1,""],roundup_to_integer_multiple:[12,1,1,""]},"finn.util.basic.CppBuilder":{append_includes:[12,4,1,""],append_sources:[12,4,1,""],build:[12,4,1,""],set_executable_path:[12,4,1,""]},"finn.util.data_packing":{array2hexstring:[12,1,1,""],finnpy_to_packed_bytearray:[12,1,1,""],hexstring2npbytearray:[12,1,1,""],npbytearray2hexstring:[12,1,1,""],npy_to_rtlsim_input:[12,1,1,""],numpy_to_hls_code:[12,1,1,""],pack_innermost_dim_as_hex_string:[12,1,1,""],packed_bytearray_to_finnpy:[12,1,1,""],rtlsim_output_to_npy:[12,1,1,""],unpack_innermost_dim_from_hex_string:[12,1,1,""]},"finn.util.fpgadataflow":{IPGenBuilder:[12,2,1,""],pyverilate_get_liveness_threshold_cycles:[12,1,1,""],pyverilate_stitched_ip:[12,1,1,""]},"finn.util.fpgadataflow.IPGenBuilder":{append_tcl:[12,4,1,""],build:[12,4,1,""],set_ipgen_path:[12,4,1,""]},"finn.util.onnx":{valueinfo_to_tensor:[12,1,1,""]},"finn.util.test":{get_test_model_def_fxn:[12,1,1,""],get_test_model_trained:[12,1,1,""],get_test_model_untrained:[12,1,1,""],get_trained_checkpoint:[12,1,1,""]},finn:{analysis:[4,0,0,"-"],core:[6,0,0,"-"],custom_op:[7,0,0,"-"],transformation:[9,0,0,"-"],util:[12,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","function","Python function"],"2":["py","class","Python class"],"3":["py","attribute","Python attribute"],"4":["py","method","Python method"]},objtypes:{"0":"py:module","1":"py:function","2":"py:class","3":"py:attribute","4":"py:method"},terms:{"0f01":12,"0x07":12,"0x0e":12,"0x0f01":12,"0xb":12,"0xe":12,"abstract":[7,8,9],"boolean":6,"class":[6,7,8,9,10,11,12],"const":9,"default":[7,8,9],"enum":6,"final":6,"float":12,"function":[1,6,7,8,9,12],"import":1,"int":10,"new":[1,2,6,7,8],"return":[4,5,6,7,8,9,11,12],"static":4,"throw":12,"true":[6,12],"try":1,"var":8,For:[10,11],HLS:[2,6,7,10,12],IPs:10,PEs:8,The:[1,2,4,6,7,9,10,11,12],There:1,Use:[6,12],abc:[7,9],abit:12,abort:8,about:[2,4,10],abov:1,absolut:10,absorb1bitmulintomatmul:11,absorb:[3,9,10],absorbaddintomultithreshold:11,absorbmulintomultithreshold:11,acceler:[1,10],accord:[8,12],account:6,action:10,activ:[6,12],add:[9,11,12],added:8,adder:11,adding:1,addit:[1,8,10],addition:11,address:10,after:[8,12],aim:11,all:[1,4,6,7,8,9,10,12],all_tensors_f32:4,allow:6,alreadi:10,also:[7,8,10],amount:12,analysi:[3,6,13],analysis_fxn:6,anaylsis_fxn:6,ani:[1,6,7,9,10,12],annot:[4,6,7,8],anoth:10,append_includ:12,append_sourc:12,append_tcl:12,appli:[6,9,10,11],apply_rep:9,appropri:[1,9],arbitrari:12,architectur:2,argument:[1,10,12],around:6,arrai:12,array2hexstr:12,arxiv:11,assign:6,associ:[6,9],assum:12,attribut:[4,7,8,10],attribute_nam:[7,8],attributeproto:[7,8],back:[1,8],backend:10,base:[6,7,8,9,10,11,12],bash:[8,12],basic:[3,8,13],batchnorm:9,batchnorm_to_affin:[3,13],batchnormtoaffin:9,been:[7,10],befor:12,between:[8,12],bias:7,binari:[6,8,10,11,12],bipolar:[6,7,8,9,11,12],bipolar_to_xnor:[3,13],bit:[6,12],bitfil:[1,7],bitwidth:6,blackbock:8,blackboxfunct:8,block:[8,10,12],blott:8,board:[6,10],bool:[4,9],both:12,bram:8,bram_estim:8,brevita:[2,12],brien:8,browser:1,build:[8,12],built:4,calc_tmem:8,calc_wmem:8,calcul:8,calculate_signed_dot_prod_rang:12,call:[1,6,8,9,10],can:[1,2,6,8,9,10,11,12],cannot:9,centerpiec:2,certain:4,chang:[1,6,9],check:[4,6,7,8],check_all_tensor_shapes_specifi:6,check_compat:6,cleanup:[3,9],clk:[8,10],clock:8,clone:[1,12],code:[8,10,12],code_gen_dir:12,code_gen_dir_ipgen:10,code_gen_dir_npysim:10,code_generation_ipgen:8,code_generation_npysim:8,codegen_ipgen:[3,9],codegen_ipstitch:[3,9],codegen_npysim:[3,9],collaps:11,collapse_rep:[3,9],collapserepeatedadd:11,collapserepeatedmul:11,collapserepeatedop:11,collect:[1,10],colloqui:2,come:[1,4],command:[1,8,12],commun:2,compar:[6,7],compare_execut:6,compare_fxn:6,comparison:7,compat:[6,7,8],compil:[2,3,8,9,12],compile_singlenode_cod:8,complet:1,compon:2,comput:[1,6,8],consecut:11,constant:[4,6,11],construct:2,consum:6,contain:[1,2,6,7,8,10,12],content:13,context:[6,7,8],contribut:2,convent:4,convert:[1,8,9,10,11,12],convert_to_hls_lay:[3,9],convertbipolarmatmultoxnorpopcount:9,convertsigntothr:11,convertsubtoadd:9,convolutioninputgener:[3,7],copi:[6,9,10],core:[3,10,13],corner:2,correct:[9,12],correctli:[1,4,7,8,10],correspond:[2,6,7,8],count:8,cpp_file:12,cppbuilder:[8,12],creat:[1,6,10,12],create_dataflow_partit:[3,9],createdataflowpartit:10,current:[2,6,8],custom:[1,2,4,6,7,8,10],custom_op:[3,13],customop:[7,8],cycl:[8,12],data:[6,7,8,10,12],data_pack:[3,13],dataflow:[2,6,10],dataoutstrm:8,datatyp:[3,7,8,9,12,13],debug:6,declar:[8,9],deep:[2,6,8,9],default_v:[7,8],default_valu:[7,8],defin:8,depend:1,deploi:1,deploy:10,deploytopynq:10,design:[1,10],detail:2,develop:2,dict:[6,7,8],dictionari:[4,6,8],differ:[1,7,8],digit:12,dimens:12,dimension:12,dir:[10,12],directori:[1,10,12],distr_pad:12,divis:12,doc:2,docker:12,dockerfil:1,docomput:8,doe:[1,6,7],don:9,done:4,dot:12,down:[1,6],driver:10,dt_a:12,dt_b:12,dtype:[4,6,7,8,12],dynam:4,dynamic_input_to_npi:8,each:[2,4,6,9,10,11,12],editor:1,effect:9,either:1,element:12,embed:6,emit:12,emphasi:2,empti:6,end:8,ensur:[8,9,10,12],entir:1,entri:12,enumer:9,environ:1,equal:[7,8],equival:11,estim:[5,8],even:9,evenli:12,everi:[7,8,9,10],everyth:1,exampl:[1,12],excel:1,except:12,exec_mod:10,exec_precompiled_singlenode_model:8,execut:[6,7,8,10,12],executable_path:[10,12],execute_custom_nod:[3,13],execute_nod:[6,7,8],execute_onnx:[6,10],execute_onnx_and_make_model:6,execution_context:6,exist:[7,8,12],exit:12,expect:[4,6,7,8,10],experi:2,experiment:2,explor:[2,6,8],expos:6,extens:1,extra:[1,4,12],extract:[4,5],f5c6bd32ae93ec103a88152214baedff4ce1850d81065bfc:1,factor:12,factoroutmulsignmagnitud:11,fals:[6,9,12],familiar:1,fan:4,fast:8,fewer:6,fewest:6,field:[10,12],file:[1,6,8,10,12],filenam:[6,10],fill:[7,8],find:6,find_consum:6,find_produc:6,finish:12,finn_dt:12,finnpy_to_packed_bytearrai:12,first:[4,11],fix:[9,12],flatten:12,float32:[4,6],fold:8,fold_const:[3,13],foldconst:9,folder:[1,10,12],follow:[1,2,4,6,7,10],form:8,format:8,forward:1,found:[2,10],four:12,fpga:[1,2],fpgadataflow:[3,4,7,9,13],fpgapart:[8,10],framework:[2,8],fraser:8,from:[1,2,5,6,8,10,12],full:6,further:9,gambardella:8,gen_finn_dt_tensor:12,gener:[2,3,8,10,12,13],generate_param:8,get:[6,7,8,10],get_all_tensor_nam:6,get_by_nam:12,get_finn_root:12,get_folded_input_shap:8,get_folded_output_shap:8,get_hls_compatible_threshold_tensor:8,get_hls_compatible_weight_tensor:8,get_hls_datatype_str:6,get_initi:6,get_input_datatyp:8,get_instream_width:8,get_metadata_prop:6,get_nodeattr:7,get_nodeattr_typ:[7,8],get_num_possible_valu:6,get_number_output_valu:8,get_output_datatyp:8,get_outstream_width:8,get_per_tensor_fanout:4,get_smallest_poss:6,get_stream_width:8,get_template_param_valu:8,get_tensor_datatyp:6,get_tensor_fanout:6,get_tensor_shap:6,get_tensor_valueinfo:6,get_test_model_def_fxn:12,get_test_model_train:12,get_test_model_untrain:12,get_trained_checkpoint:12,get_weight_datatyp:8,getcustomop:7,github:2,give:[1,9,11],give_unique_node_nam:9,given:[4,5,6,7,8,12],giverandomtensornam:9,givereadabletensornam:9,giveuniquenodenam:9,global:8,global_includ:8,graph:[4,6,7,8,9,10],graphic:2,greater:7,group:7,guarante:[9,12],guid:3,hand:2,has:[4,6,8,9,10,12],have:[1,4,6,7,8,9,10,11],help:1,helper:7,hex:12,hexstr:12,hexstring2npbytearrai:12,high:1,highli:2,hls:8,hls_synth_res_estim:[3,4],hls_var_nam:12,hlscustomop:8,hlslib:[2,8],hlssynth_ipgen:[3,9],homepag:2,host:[1,12],how:[3,12],http:1,human:9,imag:8,immedi:10,implement:[6,8,10],includ:[2,6,8,10],include_path:12,indic:[6,7,8,9,10],infer:[1,2,6,7,8,9,12],infer_datatyp:[3,13],infer_node_datatyp:[7,8],infer_shap:[3,13],inferbinarystreamingfclay:10,inferdatatyp:9,infershap:9,infinit:9,info:[9,12],info_messag:4,inform:[4,10],infrastructur:10,inherit:9,initi:[4,6],innermost:12,inp0:7,inp1:7,inp:8,input:[4,6,7,8,9,11,12],input_dict:6,input_dtyp:12,input_fil:12,insert:[8,10,12],insert_tlastmark:[3,9],inserttlastmark:10,insid:[1,7],instal:1,instanc:[6,7,11],instant:12,instanti:10,instead:12,int16:6,int2:6,int32:6,int3:6,int4:6,int8:6,integ:[6,7,11,12],interest:6,interfac:10,interleav:[8,12],interleave_matrix_outer_dim_from_partit:12,intermedi:[6,9],intern:9,interv:7,involv:1,ipgen:8,ipgen_path:[10,12],ipgen_singlenode_cod:8,ipgenbuild:[8,12],is_integ:6,is_linear:4,item:12,its:7,itself:7,jupyt:2,kei:6,kind:10,know:9,lab:2,lambda:6,largest:6,launch:1,layer:[9,10],lead:12,learn:[2,8],leeser:8,len:12,let:9,letter:12,librari:[2,12],library_path:12,like:1,linear:[4,6],link:[1,2],list:[4,6,12],load:12,locat:1,look:[1,4],loop:[8,9],lut:8,lut_estim:8,made:[6,9],magnitud:11,mai:1,make:[1,8,9,10],make_build_dir:12,make_collapsed_param_fxn:11,make_deepcopi:6,make_deploy:[3,9],make_empty_exec_context:6,make_new_valueinfo_nam:6,make_project:10,make_pynq_driv:[3,9],make_pynq_proj:[3,9],make_shape_compatible_op:[7,8],makepynqdriv:10,makepynqproject:10,mani:1,manipul:6,manual:9,map:7,mark:8,matmul:[9,11],matrix:[7,8,11,12],max:[6,12],mean:12,meant:9,member:[7,8,12],meta:7,metadata:6,metadata_prop:[6,10],method:[7,8],min:[6,12],minimum:12,minut:10,mixtur:4,mkdtemp:12,mode:[1,10],model:[4,5,6,7,8,9,10,11,12],model_a:6,model_b:6,model_was_chang:9,modelproto:[6,10],modelwrapp:[3,4,9,13],modul:13,modular:2,more:[2,6,9,12],mount:1,move:11,moveaddpastmul:11,movescalaraddpastmatmul:11,movescalarmulpastmatmul:11,mul:[9,11],multidimension:12,multipl:[7,9,11,12],multipli:11,multithreshold:[3,10,11,13],must:[7,9,10,11,12],mvtu:10,n_partit:12,n_thres_step:8,name:[4,5,6,7,9,12],name_field:12,ndarrai:12,nearest:[11,12],necessari:10,need:[5,7,8,9],neg:[6,11],netnam:12,netron:1,network:[1,2,8,12],neural:[2,8],neuron:8,new_nam:6,next:11,no_decl:12,node:[4,5,6,7,8,9,10,11],node_inputs_in_expected_ord:4,node_res_estim:8,non:10,none:[6,7,12],note:[1,7],notebook:2,notwithstand:4,now:[4,6],npbytearrai:12,npbytearray2hexstr:12,npy:[8,12],npy_to_dynamic_output:8,npy_to_rtlsim_input:12,npysim:[8,10],number:[6,7,8,12],numpi:[8,12],numpy_to_hls_cod:12,object:[6,12],observ:8,old_nam:6,onc:[8,9],one:[4,6,8,10,12],ones:[1,10],onli:[4,6,9,10,11],onlin:1,onnx:[3,6,7,8,10,13],onnx_exec:[3,10,13],onnx_model_proto:6,onnx_nod:[7,8],onnxruntim:6,op_nam:11,op_typ:4,open:1,oper:[6,11],ops:[4,8,11],option:1,order:[4,6],orig_thres_matrix:8,orig_weight_matrix:8,origin:8,other:[6,11],otherwis:[1,6,7,9,12],out:[4,7,8],out_bia:7,out_scal:7,out_shap:12,outcom:10,outermost:12,output:[6,7,8,9,12],output_shap:12,overlai:10,overview:2,own:[1,7],pack:[10,12],pack_innermost_dim:12,pack_innermost_dim_as_hex_str:12,packag:13,packed_bytearrai:12,packed_bytearray_to_finnpi:12,packedbit:12,pad:12,pad_tensor_to_multiple_of:12,pad_to_dim:12,pad_to_nbit:12,pair:10,param:8,paramet:[8,11,12],part:[7,8,12],particular:[7,8,12],partit:[6,12],pass:[3,8,12],password:10,past:11,path:[8,10,12],per:10,perform:[1,7,8],permit:[7,8],place:[8,10],placehold:7,platform:10,point:[1,9],popcount:7,port:1,posit:[8,11,12],possibl:[6,8,10],post:7,pragma:8,preced:11,precid:11,precis:12,precompil:8,precomput:9,prefer:6,prefix:12,prepend:12,pretrain:12,preusser:8,previous:10,print:1,prior:[9,10,12],process:[1,7],produc:[4,6,7,8,12],product:12,project:[2,10],properti:[4,6],provid:[1,6],pushbutton:1,pynq:[6,10],pynq_driver_dir:10,python:[1,10,12],pytorch:12,pyveril:[6,8,12],pyverilate_get_liveness_threshold_cycl:12,pyverilate_stitched_ip:12,qnn:[1,2],quantiz:[2,4,6,8],random:[9,12],random_str:12,randomli:12,rather:1,reach:9,read:[2,8],read_npy_data:8,readabl:9,real:7,recommend:9,refer:2,referenc:10,reflect:1,registri:[3,13],regular:7,rel:10,relat:[2,6,12],remot:6,remote_exec:[3,13],remov:[10,12],remove_by_nam:12,remove_prefix:12,renam:6,rename_tensor:6,reorder:[3,9],repeat:[9,11],repeatedli:6,replac:9,replace_verilog_relpath:[3,9],replaceverilogrelpath:10,repo:1,repositori:[1,2],repres:[6,12],represent:12,requir:[6,7,8],res_estim:[3,4],research:2,reset:8,reset_rtlsim:8,reshap:8,resourc:[1,5,8],respect:12,result:[4,5,6,9,10,11,12],return_full_exec_context:6,returned_dict:[7,8],reus:8,revers:12,reverse_endian:12,reverse_inn:12,right:[2,8],root:[1,12],round:[11,12],round_threshold:[3,9],roundandclipthreshold:11,roundup_to_integer_multipl:12,row:8,rtlsim:[6,8,10,12],rtlsim_exec:[3,13],rtlsim_output_to_npi:12,run:[6,8,10],run_dock:1,same:[10,12],sampl:8,save:[6,8,10,12],save_as_npi:8,scalar:11,scale:7,scp:10,script:[1,8,10,12],second:[10,11],see:[11,12],seen:2,sep:8,separ:[2,7],sequenc:12,server:1,set:[1,6,7,8,10,11,12],set_exec_mod:[3,9],set_executable_path:12,set_initi:6,set_ipgen_path:12,set_metadata_prop:6,set_nodeattr:7,set_tensor_datatyp:6,set_tensor_shap:6,setexecmod:10,settings64:1,sever:[1,10],shape:[6,7,8,9,12],shell:10,should:[1,4,6,7,8,9,10],sign:[6,9,11,12],sign_to_thr:[3,9],sim:[8,12],simd:8,simpli:1,simul:[7,8,10,12],sinc:[6,12],singl:[1,6,8,10,11,12],slide:8,small:4,smaller:6,smallest:6,some:[1,2,6,7,8,9,10],someth:1,spawn:1,specif:2,specifi:[6,9,10,12],split:[10,11,12],stai:2,standard:[6,7,8],stitch:[6,8,10,12],store:[7,10,12],stream:8,streamingdataflowpartit:[3,10,13],streamingfclayer_batch:[3,7,10],streamingmaxpool_batch:[3,7],streamlin:[3,9],string:[4,10,12],stringlength:12,strm_decl:8,structur:4,style:2,sub:9,subdirectori:10,subgraph:6,submodul:[3,13],subpackag:13,subsequ:10,subset:4,succes:10,success:[7,10],suitabl:8,summar:8,support:6,sure:1,surviv:12,synaps:8,synth_pynq_proj:[3,9],synthesi:[5,10],synthpynqproject:10,t_0:7,t_1:7,t_n:7,take:[1,4,6,9,11,12],taken:[2,6,10],target:[2,10],target_dir:10,targetbit:12,tcl:[8,10,12],tcl_script:12,tempfil:12,templat:[3,7,9],temporari:12,tensor:[4,6,7,9,11,12],tensor_fanout:4,tensor_nam:[4,6],tensor_shap:[6,12],tensor_valu:6,termin:[1,10],ternari:6,test:[3,9,13],text:1,than:[6,7],thei:11,them:[4,10,11],thi:[1,2,4,6,7,8,9,10,12],thing:2,thought:1,thresh:8,threshold:[7,8,11],time:[1,8,9,10],tlastmark:[3,7,10],tmem:8,togeth:10,toggl:8,toggle_clk:8,token:1,tool:[1,2],topolog:[3,13],train:[1,2],transform:[3,6,13],transformed_model:9,travers:4,tune:2,tupl:9,two:[2,6,7,10,11,12],type:[6,8,9,12],ubuntu:1,uint16:6,uint2:[6,12],uint32:6,uint3:6,uint4:6,uint8:[6,12],umuroglu:8,under:[2,10],uniqu:9,unpack:[10,12],unpack_innermost_dim_from_hex_str:12,unsign:[6,11],until:6,untrain:12,updat:[2,11],upper:2,use:[2,10],used:[2,6,7,8,10,12],useful:6,user:9,usernam:10,using:[2,6,8,9,10,11,12],util:[3,6,7,8,13],val:12,valu:[6,7,8,10,11,12],value_info:6,valueinfo:[6,9],valueinfo_to_tensor:12,valueinfoproto:[6,12],variabl:[1,12],vector:[11,12],verif:4,verifi:[4,7,8],verify_custom_nod:[3,13],verify_nod:[4,7,8],verilog:10,version:2,via:6,view:2,visser:8,vivado:[1,2,5,6,10,12],vivado_path:1,vivado_pynq_proj:10,vivado_stitch_proj:10,wai:[1,4],wait:12,want:11,wbit:12,websit:2,weight:[6,8,12],welcom:2,well:1,when:[4,7,8,9],where:[1,6,7,8,10,11],wherea:6,whether:[4,6,7,8,9],which:[1,2,6,7,8,10,11,12],width:[8,12],window:8,without:1,wmem:8,work:[1,6,12],workspac:1,wrapper:6,write:[1,3,7,8],xilinx:2,xnor:7,xnorpopcount:[3,13],xnorpopcountmatmul:[7,9,10],you:[1,9],your:[1,9],zero:[6,8,11,12]},titles:["FINN - End-to-End Flow","Getting Started","FINN","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"],titleterms:{absorb:11,analysi:[4,5],basic:12,batchnorm_to_affin:9,bipolar_to_xnor:9,cleanup:10,codegen_ipgen:10,codegen_ipstitch:10,codegen_npysim:10,collapse_rep:11,compil:[1,10],content:[3,4,5,6,7,8,9,10,11,12],convert_to_hls_lay:10,convolutioninputgener:8,core:6,create_dataflow_partit:10,custom_op:[7,8],data_pack:12,datatyp:6,develop:1,directli:1,docker:1,end:0,execute_custom_nod:6,experiment:1,finn:[0,1,2,3,4,5,6,7,8,9,10,11,12,13],flow:0,fold_const:9,fpgadataflow:[5,8,10,12],gener:9,get:1,guid:9,hls_synth_res_estim:5,hlssynth_ipgen:10,how:[1,4],infer_datatyp:9,infer_shap:9,insert_tlastmark:10,interact:1,jenkin:1,jupyt:1,make_deploy:10,make_pynq_driv:10,make_pynq_proj:10,modelwrapp:6,modul:[3,4,5,6,7,8,9,10,11,12],multithreshold:7,notebook:1,onnx:12,onnx_exec:6,packag:[3,4,5,6,7,8,9,10,11,12],pass:4,registri:7,remote_exec:6,reorder:11,replace_verilog_relpath:10,requir:1,res_estim:5,round_threshold:11,rtlsim_exec:6,run:1,set_exec_mod:10,shell:1,sign_to_thr:11,start:1,streamingdataflowpartit:7,streamingfclayer_batch:8,streamingmaxpool_batch:8,streamlin:11,submodul:[4,5,6,7,8,9,10,11,12],subpackag:[3,4,7,9],suit:1,synth_pynq_proj:10,templat:[8,10],test:[1,12],tlastmark:8,topolog:4,transform:[9,10,11],use:1,using:1,util:12,verify_custom_nod:4,what:2,write:[4,9],xnorpopcount:7}})
\ No newline at end of file
diff --git a/docs/finn/_build/html/source_code/finn.analysis.fpgadataflow.html b/docs/finn/_build/html/source_code/finn.analysis.fpgadataflow.html
index 6eb70fa03..a1f82b740 100644
--- a/docs/finn/_build/html/source_code/finn.analysis.fpgadataflow.html
+++ b/docs/finn/_build/html/source_code/finn.analysis.fpgadataflow.html
@@ -180,8 +180,8 @@
 <dl class="function">
 <dt id="finn.analysis.fpgadataflow.hls_synth_res_estimation.hls_synth_res_estimation">
 <code class="sig-prename descclassname">finn.analysis.fpgadataflow.hls_synth_res_estimation.</code><code class="sig-name descname">hls_synth_res_estimation</code><span class="sig-paren">(</span><em class="sig-param">model</em><span class="sig-paren">)</span><a class="headerlink" href="#finn.analysis.fpgadataflow.hls_synth_res_estimation.hls_synth_res_estimation" title="Permalink to this definition">¶</a></dt>
-<dd><p>Extracts the results from the vivado synthesis.
-Returns {node name : resource estimation}.</p>
+<dd><p>Extracts the results from the vivado synthesis.</p>
+<p>Returns {node name : resource estimation}.</p>
 </dd></dl>
 
 </div>
@@ -190,8 +190,8 @@ Returns {node name : resource estimation}.</p>
 <dl class="function">
 <dt id="finn.analysis.fpgadataflow.res_estimation.res_estimation">
 <code class="sig-prename descclassname">finn.analysis.fpgadataflow.res_estimation.</code><code class="sig-name descname">res_estimation</code><span class="sig-paren">(</span><em class="sig-param">model</em><span class="sig-paren">)</span><a class="headerlink" href="#finn.analysis.fpgadataflow.res_estimation.res_estimation" title="Permalink to this definition">¶</a></dt>
-<dd><p>Estimates the resources needed for the given model.
-Returns {node name : resource estimation}.</p>
+<dd><p>Estimates the resources needed for the given model.</p>
+<p>Returns {node name : resource estimation}.</p>
 </dd></dl>
 
 </div>
diff --git a/docs/finn/_build/html/source_code/finn.analysis.html b/docs/finn/_build/html/source_code/finn.analysis.html
index 0f6133de5..8ec8fac5f 100644
--- a/docs/finn/_build/html/source_code/finn.analysis.html
+++ b/docs/finn/_build/html/source_code/finn.analysis.html
@@ -193,7 +193,8 @@
 <dt id="finn.analysis.topology.all_tensors_f32">
 <code class="sig-prename descclassname">finn.analysis.topology.</code><code class="sig-name descname">all_tensors_f32</code><span class="sig-paren">(</span><em class="sig-param">model</em><span class="sig-paren">)</span><a class="headerlink" href="#finn.analysis.topology.all_tensors_f32" title="Permalink to this definition">¶</a></dt>
 <dd><p>Checks whether all tensors have a float32 dtype, extra quantization
-annotations notwithstanding. Returns {“all_tensors_f32”: Bool}.</p>
+annotations notwithstanding.</p>
+<p>Returns {“all_tensors_f32”: Bool}.</p>
 </dd></dl>
 
 <dl class="function">
@@ -207,7 +208,8 @@ annotations notwithstanding. Returns {“all_tensors_f32”: Bool}.</p>
 <code class="sig-prename descclassname">finn.analysis.topology.</code><code class="sig-name descname">is_linear</code><span class="sig-paren">(</span><em class="sig-param">model</em><span class="sig-paren">)</span><a class="headerlink" href="#finn.analysis.topology.is_linear" title="Permalink to this definition">¶</a></dt>
 <dd><p>Checks whether the given model graph is linear. This is done by looking
 at the fan-out of each tensor. All tensors have a fan-out &lt;= 1 in a linear
-graph. Returns {“is_linear”: Bool}.</p>
+graph.</p>
+<p>Returns {“is_linear”: Bool}.</p>
 </dd></dl>
 
 <dl class="function">
@@ -216,8 +218,8 @@ graph. Returns {“is_linear”: Bool}.</p>
 <dd><p>Verifies that the node inputs are ordered in the way that FINN expects
 them. When a node has a mixture of static (= constant, initialized) inputs
 and dynamic inputs, the dynamic input should come first, followed by the
-static one. Only verifiable for a small subset of op_types for now. Returns 
-{“node_inputs_in_expected_order”: Bool}.</p>
+static one. Only verifiable for a small subset of op_types for now.</p>
+<p>Returns {“node_inputs_in_expected_order”: Bool}.</p>
 </dd></dl>
 
 </div>
@@ -227,7 +229,8 @@ static one. Only verifiable for a small subset of op_types for now. Returns
 <dt id="finn.analysis.verify_custom_nodes.verify_nodes">
 <code class="sig-prename descclassname">finn.analysis.verify_custom_nodes.</code><code class="sig-name descname">verify_nodes</code><span class="sig-paren">(</span><em class="sig-param">model</em><span class="sig-paren">)</span><a class="headerlink" href="#finn.analysis.verify_custom_nodes.verify_nodes" title="Permalink to this definition">¶</a></dt>
 <dd><p>Checks if custom ops in graph are correctly built, with all attributes
-and inputs. Returns {node op_type : info_messages}</p>
+and inputs.</p>
+<p>Returns {node op_type : info_messages}</p>
 <ul class="simple">
 <li><p>info_messages: is list of strings about the result of the verification.</p></li>
 </ul>
diff --git a/docs/finn/_build/html/source_code/finn.core.html b/docs/finn/_build/html/source_code/finn.core.html
index f3497ef34..6c36d81dc 100644
--- a/docs/finn/_build/html/source_code/finn.core.html
+++ b/docs/finn/_build/html/source_code/finn.core.html
@@ -185,6 +185,12 @@
 <p>Enum class that contains FINN data types to set the quantization annotation. 
 ONNX does not support data types smaller than 8-bit integers, whereas in FINN we are
 interested in smaller integers down to ternary and bipolar.</p>
+<p>Assignment of DataTypes to indices based on following ordering:</p>
+<ul class="simple">
+<li><p>unsigned to signed</p></li>
+<li><p>fewer to more bits</p></li>
+</ul>
+<p>Currently supported DataTypes:</p>
 <dl class="attribute">
 <dt id="finn.core.datatype.DataType.BINARY">
 <code class="sig-name descname">BINARY</code><em class="property"> = 1</em><a class="headerlink" href="#finn.core.datatype.DataType.BINARY" title="Permalink to this definition">¶</a></dt>
@@ -269,7 +275,9 @@ interested in smaller integers down to ternary and bipolar.</p>
 <dt id="finn.core.datatype.DataType.allowed">
 <code class="sig-name descname">allowed</code><span class="sig-paren">(</span><em class="sig-param">value</em><span class="sig-paren">)</span><a class="headerlink" href="#finn.core.datatype.DataType.allowed" title="Permalink to this definition">¶</a></dt>
 <dd><p>Check whether given value is allowed for this DataType.</p>
-<p>value (float32): value to be checked</p>
+<ul class="simple">
+<li><p>value (float32): value to be checked</p></li>
+</ul>
 </dd></dl>
 
 <dl class="method">
@@ -281,27 +289,27 @@ interested in smaller integers down to ternary and bipolar.</p>
 <dl class="method">
 <dt id="finn.core.datatype.DataType.get_hls_datatype_str">
 <code class="sig-name descname">get_hls_datatype_str</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.core.datatype.DataType.get_hls_datatype_str" title="Permalink to this definition">¶</a></dt>
-<dd><p>Return the corresponding Vivado HLS datatype name.</p>
+<dd><p>Returns the corresponding Vivado HLS datatype name.</p>
 </dd></dl>
 
 <dl class="method">
 <dt id="finn.core.datatype.DataType.get_num_possible_values">
 <code class="sig-name descname">get_num_possible_values</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.core.datatype.DataType.get_num_possible_values" title="Permalink to this definition">¶</a></dt>
-<dd><p>Return the number of possible values this DataType can take. Only
+<dd><p>Returns the number of possible values this DataType can take. Only
 implemented for integer types for now.</p>
 </dd></dl>
 
 <dl class="method">
 <dt id="finn.core.datatype.DataType.get_smallest_possible">
 <code class="sig-name descname">get_smallest_possible</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.core.datatype.DataType.get_smallest_possible" title="Permalink to this definition">¶</a></dt>
-<dd><p>Return smallest (fewest bits) possible DataType that can represent
+<dd><p>Returns smallest (fewest bits) possible DataType that can represent
 value. Prefers unsigned integers where possible.</p>
 </dd></dl>
 
 <dl class="method">
 <dt id="finn.core.datatype.DataType.is_integer">
 <code class="sig-name descname">is_integer</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.core.datatype.DataType.is_integer" title="Permalink to this definition">¶</a></dt>
-<dd><p>Return whether this DataType represents integer values only.</p>
+<dd><p>Returns whether this DataType represents integer values only.</p>
 </dd></dl>
 
 <dl class="method">
@@ -319,7 +327,7 @@ value. Prefers unsigned integers where possible.</p>
 <dl class="method">
 <dt id="finn.core.datatype.DataType.signed">
 <code class="sig-name descname">signed</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.core.datatype.DataType.signed" title="Permalink to this definition">¶</a></dt>
-<dd><p>Return whether this DataType can represent negative numbers.</p>
+<dd><p>Returns whether this DataType can represent negative numbers.</p>
 </dd></dl>
 
 </dd></dl>
@@ -346,7 +354,7 @@ functions for graph manipulation and exploration.</p>
 <dl class="method">
 <dt id="finn.core.modelwrapper.ModelWrapper.analysis">
 <code class="sig-name descname">analysis</code><span class="sig-paren">(</span><em class="sig-param">analysis_fxn</em><span class="sig-paren">)</span><a class="headerlink" href="#finn.core.modelwrapper.ModelWrapper.analysis" title="Permalink to this definition">¶</a></dt>
-<dd><p>Run given anaylsis_fxn on this model and return resulting dict.</p>
+<dd><p>Runs given anaylsis_fxn on this model and return resulting dict.</p>
 </dd></dl>
 
 <dl class="method">
@@ -360,37 +368,39 @@ associated ValueInfo, but FINN expects this.</p>
 <dl class="method">
 <dt id="finn.core.modelwrapper.ModelWrapper.check_compatibility">
 <code class="sig-name descname">check_compatibility</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.core.modelwrapper.ModelWrapper.check_compatibility" title="Permalink to this definition">¶</a></dt>
-<dd><p>Checks this model for FINN compatibility:
-* no embedded subgraphs
-* all tensor shapes are specified, including activations
-* all constants are initializers</p>
+<dd><p>Checks this model for FINN compatibility:</p>
+<ul class="simple">
+<li><p>no embedded subgraphs</p></li>
+<li><p>all tensor shapes are specified, including activations</p></li>
+<li><p>all constants are initializers</p></li>
+</ul>
 </dd></dl>
 
 <dl class="method">
 <dt id="finn.core.modelwrapper.ModelWrapper.find_consumer">
 <code class="sig-name descname">find_consumer</code><span class="sig-paren">(</span><em class="sig-param">tensor_name</em><span class="sig-paren">)</span><a class="headerlink" href="#finn.core.modelwrapper.ModelWrapper.find_consumer" title="Permalink to this definition">¶</a></dt>
-<dd><p>Find and return the node that consumes the tensor with given name.
+<dd><p>Finds and returns the node that consumes the tensor with given name.
 Currently only works for linear graphs.</p>
 </dd></dl>
 
 <dl class="method">
 <dt id="finn.core.modelwrapper.ModelWrapper.find_producer">
 <code class="sig-name descname">find_producer</code><span class="sig-paren">(</span><em class="sig-param">tensor_name</em><span class="sig-paren">)</span><a class="headerlink" href="#finn.core.modelwrapper.ModelWrapper.find_producer" title="Permalink to this definition">¶</a></dt>
-<dd><p>Find and return the node that produces the tensor with given name.
+<dd><p>Finds and returns the node that produces the tensor with given name.
 Currently only works for linear graphs.</p>
 </dd></dl>
 
 <dl class="method">
 <dt id="finn.core.modelwrapper.ModelWrapper.get_all_tensor_names">
 <code class="sig-name descname">get_all_tensor_names</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.core.modelwrapper.ModelWrapper.get_all_tensor_names" title="Permalink to this definition">¶</a></dt>
-<dd><p>Return a list of all (input, output and value_info) tensor names
+<dd><p>Returns a list of all (input, output and value_info) tensor names
 in the graph.</p>
 </dd></dl>
 
 <dl class="method">
 <dt id="finn.core.modelwrapper.ModelWrapper.get_initializer">
 <code class="sig-name descname">get_initializer</code><span class="sig-paren">(</span><em class="sig-param">tensor_name</em><span class="sig-paren">)</span><a class="headerlink" href="#finn.core.modelwrapper.ModelWrapper.get_initializer" title="Permalink to this definition">¶</a></dt>
-<dd><p>Get the initializer value for tensor with given name, if any.</p>
+<dd><p>Gets the initializer value for tensor with given name, if any.</p>
 </dd></dl>
 
 <dl class="method">
@@ -409,7 +419,7 @@ or None otherwise.</p>
 <dl class="method">
 <dt id="finn.core.modelwrapper.ModelWrapper.get_tensor_fanout">
 <code class="sig-name descname">get_tensor_fanout</code><span class="sig-paren">(</span><em class="sig-param">tensor_name</em><span class="sig-paren">)</span><a class="headerlink" href="#finn.core.modelwrapper.ModelWrapper.get_tensor_fanout" title="Permalink to this definition">¶</a></dt>
-<dd><p>Return the number of nodes for which the tensor with given name is
+<dd><p>Returns the number of nodes for which the tensor with given name is
 as input.</p>
 </dd></dl>
 
@@ -434,8 +444,8 @@ as input.</p>
 <dl class="method">
 <dt id="finn.core.modelwrapper.ModelWrapper.make_empty_exec_context">
 <code class="sig-name descname">make_empty_exec_context</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.core.modelwrapper.ModelWrapper.make_empty_exec_context" title="Permalink to this definition">¶</a></dt>
-<dd><p>Creates an empty execution context for this model.
-The execution context is a dictionary of all tensors used for the
+<dd><p>Creates an empty execution context for this model.</p>
+<p>The execution context is a dictionary of all tensors used for the
 inference computation. Any initializer values will be taken into
 account, all other tensors will be zero.</p>
 </dd></dl>
@@ -455,19 +465,19 @@ account, all other tensors will be zero.</p>
 <dl class="method">
 <dt id="finn.core.modelwrapper.ModelWrapper.rename_tensor">
 <code class="sig-name descname">rename_tensor</code><span class="sig-paren">(</span><em class="sig-param">old_name</em>, <em class="sig-param">new_name</em><span class="sig-paren">)</span><a class="headerlink" href="#finn.core.modelwrapper.ModelWrapper.rename_tensor" title="Permalink to this definition">¶</a></dt>
-<dd><p>Rename a tensor from old_name to new_name.</p>
+<dd><p>Renames a tensor from old_name to new_name.</p>
 </dd></dl>
 
 <dl class="method">
 <dt id="finn.core.modelwrapper.ModelWrapper.save">
 <code class="sig-name descname">save</code><span class="sig-paren">(</span><em class="sig-param">filename</em><span class="sig-paren">)</span><a class="headerlink" href="#finn.core.modelwrapper.ModelWrapper.save" title="Permalink to this definition">¶</a></dt>
-<dd><p>Save the wrapper ONNX ModelProto into a file with given name.</p>
+<dd><p>Saves the wrapper ONNX ModelProto into a file with given name.</p>
 </dd></dl>
 
 <dl class="method">
 <dt id="finn.core.modelwrapper.ModelWrapper.set_initializer">
 <code class="sig-name descname">set_initializer</code><span class="sig-paren">(</span><em class="sig-param">tensor_name</em>, <em class="sig-param">tensor_value</em><span class="sig-paren">)</span><a class="headerlink" href="#finn.core.modelwrapper.ModelWrapper.set_initializer" title="Permalink to this definition">¶</a></dt>
-<dd><p>Set the initializer value for tensor with given name.</p>
+<dd><p>Sets the initializer value for tensor with given name.</p>
 </dd></dl>
 
 <dl class="method">
@@ -485,15 +495,15 @@ account, all other tensors will be zero.</p>
 <dl class="method">
 <dt id="finn.core.modelwrapper.ModelWrapper.set_tensor_shape">
 <code class="sig-name descname">set_tensor_shape</code><span class="sig-paren">(</span><em class="sig-param">tensor_name</em>, <em class="sig-param">tensor_shape</em>, <em class="sig-param">dtype=1</em><span class="sig-paren">)</span><a class="headerlink" href="#finn.core.modelwrapper.ModelWrapper.set_tensor_shape" title="Permalink to this definition">¶</a></dt>
-<dd><p>Assign shape in ValueInfoProto for tensor with given name.</p>
+<dd><p>Assigns shape in ValueInfoProto for tensor with given name.</p>
 </dd></dl>
 
 <dl class="method">
 <dt id="finn.core.modelwrapper.ModelWrapper.transform">
 <code class="sig-name descname">transform</code><span class="sig-paren">(</span><em class="sig-param">transformation</em>, <em class="sig-param">make_deepcopy=True</em><span class="sig-paren">)</span><a class="headerlink" href="#finn.core.modelwrapper.ModelWrapper.transform" title="Permalink to this definition">¶</a></dt>
 <dd><p>Applies given Transformation repeatedly until no more changes can be made
-and returns a transformed ModelWrapper instance.
-If make_deepcopy is specified, operates on a new (deep)copy of model.</p>
+and returns a transformed ModelWrapper instance.</p>
+<p>If make_deepcopy is specified, operates on a new (deep)copy of model.</p>
 </dd></dl>
 
 </dd></dl>
@@ -504,25 +514,25 @@ If make_deepcopy is specified, operates on a new (deep)copy of model.</p>
 <dl class="function">
 <dt id="finn.core.onnx_exec.compare_execution">
 <code class="sig-prename descclassname">finn.core.onnx_exec.</code><code class="sig-name descname">compare_execution</code><span class="sig-paren">(</span><em class="sig-param">model_a</em>, <em class="sig-param">model_b</em>, <em class="sig-param">input_dict</em>, <em class="sig-param">compare_fxn=&lt;function &lt;lambda&gt;&gt;</em><span class="sig-paren">)</span><a class="headerlink" href="#finn.core.onnx_exec.compare_execution" title="Permalink to this definition">¶</a></dt>
-<dd><p>Execute two ONNX models and compare their outputs using given function.
-compare_fxn should take in two tensors and return a Boolean</p>
+<dd><p>Executes two ONNX models and compare their outputs using given function.</p>
+<p>compare_fxn should take in two tensors and return a Boolean</p>
 </dd></dl>
 
 <dl class="function">
 <dt id="finn.core.onnx_exec.execute_node">
 <code class="sig-prename descclassname">finn.core.onnx_exec.</code><code class="sig-name descname">execute_node</code><span class="sig-paren">(</span><em class="sig-param">node</em>, <em class="sig-param">context</em>, <em class="sig-param">graph</em><span class="sig-paren">)</span><a class="headerlink" href="#finn.core.onnx_exec.execute_node" title="Permalink to this definition">¶</a></dt>
-<dd><p>Execute a single node by using onnxruntime, with custom function or
-if dataflow partition by using remote execution or rtlsim.
-Input/output provided via context.</p>
+<dd><p>Executes a single node by using onnxruntime, with custom function or
+if dataflow partition by using remote execution or rtlsim.</p>
+<p>Input/output provided via context.</p>
 </dd></dl>
 
 <dl class="function">
 <dt id="finn.core.onnx_exec.execute_onnx">
 <code class="sig-prename descclassname">finn.core.onnx_exec.</code><code class="sig-name descname">execute_onnx</code><span class="sig-paren">(</span><em class="sig-param">model</em>, <em class="sig-param">input_dict</em>, <em class="sig-param">return_full_exec_context=False</em><span class="sig-paren">)</span><a class="headerlink" href="#finn.core.onnx_exec.execute_onnx" title="Permalink to this definition">¶</a></dt>
-<dd><p>Execute given ONNX ModelWrapper with given named inputs.
-If return_full_exec_context is False, a dict of named outputs is returned
-as indicated by the model.graph.output.
-If return return_full_exec_context is True, the full set of tensors used by
+<dd><p>Executes given ONNX ModelWrapper with given named inputs.</p>
+<p>If return_full_exec_context is False, a dict of named outputs is returned
+as indicated by the model.graph.output.</p>
+<p>If return return_full_exec_context is True, the full set of tensors used by
 the execution (including inputs, weights, activations and final outputs)
 will be returned as a dict.</p>
 </dd></dl>
@@ -530,7 +540,7 @@ will be returned as a dict.</p>
 <dl class="function">
 <dt id="finn.core.onnx_exec.execute_onnx_and_make_model">
 <code class="sig-prename descclassname">finn.core.onnx_exec.</code><code class="sig-name descname">execute_onnx_and_make_model</code><span class="sig-paren">(</span><em class="sig-param">model</em>, <em class="sig-param">input_dict</em><span class="sig-paren">)</span><a class="headerlink" href="#finn.core.onnx_exec.execute_onnx_and_make_model" title="Permalink to this definition">¶</a></dt>
-<dd><p>Execute given ONNX ModelWrapper with given named inputs and return a new
+<dd><p>Executes given ONNX ModelWrapper with given named inputs and return a new
 ModelWrapper where an initializer is provided for each tensor as taken from
 the execution. This new model is useful for debugging, since it contains
 all the intermediate activation values.</p>
diff --git a/docs/finn/_build/html/source_code/finn.custom_op.fpgadataflow.html b/docs/finn/_build/html/source_code/finn.custom_op.fpgadataflow.html
index 3397e666a..ff1cb335c 100644
--- a/docs/finn/_build/html/source_code/finn.custom_op.fpgadataflow.html
+++ b/docs/finn/_build/html/source_code/finn.custom_op.fpgadataflow.html
@@ -188,33 +188,49 @@
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.convolutioninputgenerator.ConvolutionInputGenerator.blackboxfunction">
 <code class="sig-name descname">blackboxfunction</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.convolutioninputgenerator.ConvolutionInputGenerator.blackboxfunction" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Function to generate a blackbock function in c++ from which an IP block 
+will be generated, is member function of HLSCustomOp class but has to be filled 
+by every node.</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.convolutioninputgenerator.ConvolutionInputGenerator.bram_estimation">
 <code class="sig-name descname">bram_estimation</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.convolutioninputgenerator.ConvolutionInputGenerator.bram_estimation" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Function for BRAM resource estimation, is member function of 
+HLSCustomOp class but has to be filled by every node</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.convolutioninputgenerator.ConvolutionInputGenerator.dataoutstrm">
 <code class="sig-name descname">dataoutstrm</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.convolutioninputgenerator.ConvolutionInputGenerator.dataoutstrm" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Function to generate the commands for reading out data from c++ and convert 
+into npy format, is member function of HLSCustomOp class but has to be filled 
+by every node.</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.convolutioninputgenerator.ConvolutionInputGenerator.defines">
 <code class="sig-name descname">defines</code><span class="sig-paren">(</span><em class="sig-param">var</em><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.convolutioninputgenerator.ConvolutionInputGenerator.defines" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Function to set the define commands for c++ code that has to be generated
+for npysim or rtlsim, is member function of HLSCustomOp class but has to 
+be filled by every node.</p>
+<p>var: makes it possible to reuse the function for different c++ code generation.
+I.e. if set to “ipgen” in StreamingFCLayer_Batch additional PRAGMA defines are
+added.</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.convolutioninputgenerator.ConvolutionInputGenerator.docompute">
 <code class="sig-name descname">docompute</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.convolutioninputgenerator.ConvolutionInputGenerator.docompute" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Function to generate the commands for the computational part of the 
+c++ code, is member function of HLSCustomOp class but has to be filled
+by every node.</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.convolutioninputgenerator.ConvolutionInputGenerator.execute_node">
 <code class="sig-name descname">execute_node</code><span class="sig-paren">(</span><em class="sig-param">context</em>, <em class="sig-param">graph</em><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.convolutioninputgenerator.ConvolutionInputGenerator.execute_node" title="Permalink to this definition">¶</a></dt>
-<dd><p>Execute this CustomOp instance, given the execution context and
-ONNX graph.</p>
+<dd><p>Executes single node using npysim or rtlsim.</p>
 </dd></dl>
 
 <dl class="method">
@@ -237,7 +253,10 @@ attribute is not set</p>
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.convolutioninputgenerator.ConvolutionInputGenerator.get_number_output_values">
 <code class="sig-name descname">get_number_output_values</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.convolutioninputgenerator.ConvolutionInputGenerator.get_number_output_values" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Function to get the number of expected output values, 
+is member function of HLSCustomOp class but has to be filled 
+by every node.</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.convolutioninputgenerator.ConvolutionInputGenerator.get_output_datatype">
@@ -252,7 +271,10 @@ attribute is not set</p>
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.convolutioninputgenerator.ConvolutionInputGenerator.global_includes">
 <code class="sig-name descname">global_includes</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.convolutioninputgenerator.ConvolutionInputGenerator.global_includes" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Function to set the global includes for c++ code that has to be generated
+for npysim or rtlsim, is member function of HLSCustomOp class but has to 
+be filled by every node.</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.convolutioninputgenerator.ConvolutionInputGenerator.infer_node_datatype">
@@ -264,7 +286,9 @@ node.</p>
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.convolutioninputgenerator.ConvolutionInputGenerator.lut_estimation">
 <code class="sig-name descname">lut_estimation</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.convolutioninputgenerator.ConvolutionInputGenerator.lut_estimation" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Function for LUT resource estimation, is member function of
+HLSCustomOp class but has to be filled by every node</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.convolutioninputgenerator.ConvolutionInputGenerator.make_shape_compatible_op">
@@ -276,22 +300,31 @@ for performing shape inference.</p>
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.convolutioninputgenerator.ConvolutionInputGenerator.pragmas">
 <code class="sig-name descname">pragmas</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.convolutioninputgenerator.ConvolutionInputGenerator.pragmas" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Function to generate the pragma commands in c++, is member function of 
+HLSCustomOp class but has to be filled by every node.</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.convolutioninputgenerator.ConvolutionInputGenerator.read_npy_data">
 <code class="sig-name descname">read_npy_data</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.convolutioninputgenerator.ConvolutionInputGenerator.read_npy_data" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Function to generate the commands for reading data from .npy file in c++, 
+is member function of HLSCustomOp class but has to be filled by every node.</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.convolutioninputgenerator.ConvolutionInputGenerator.save_as_npy">
 <code class="sig-name descname">save_as_npy</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.convolutioninputgenerator.ConvolutionInputGenerator.save_as_npy" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Function to generate the commands for saving data in .npy file in c++,
+is member function of HLSCustomOp class but has to be filled by every node.</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.convolutioninputgenerator.ConvolutionInputGenerator.strm_decl">
 <code class="sig-name descname">strm_decl</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.convolutioninputgenerator.ConvolutionInputGenerator.strm_decl" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Function to generate the commands for the stream declaration in c++,
+is member function of HLSCustomOp class but has to be filled
+by every node.</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.convolutioninputgenerator.ConvolutionInputGenerator.verify_node">
@@ -314,7 +347,10 @@ the number of inputs is equal to the expected number</p>
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.streamingfclayer_batch.StreamingFCLayer_Batch.blackboxfunction">
 <code class="sig-name descname">blackboxfunction</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.streamingfclayer_batch.StreamingFCLayer_Batch.blackboxfunction" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Function to generate a blackbock function in c++ from which an IP block 
+will be generated, is member function of HLSCustomOp class but has to be filled 
+by every node.</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.streamingfclayer_batch.StreamingFCLayer_Batch.bram_estimation">
@@ -342,23 +378,34 @@ Y. Umuroglu, M. Leeser and K. Vissers
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.streamingfclayer_batch.StreamingFCLayer_Batch.dataoutstrm">
 <code class="sig-name descname">dataoutstrm</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.streamingfclayer_batch.StreamingFCLayer_Batch.dataoutstrm" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Function to generate the commands for reading out data from c++ and convert 
+into npy format, is member function of HLSCustomOp class but has to be filled 
+by every node.</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.streamingfclayer_batch.StreamingFCLayer_Batch.defines">
 <code class="sig-name descname">defines</code><span class="sig-paren">(</span><em class="sig-param">var</em><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.streamingfclayer_batch.StreamingFCLayer_Batch.defines" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Function to set the define commands for c++ code that has to be generated
+for npysim or rtlsim, is member function of HLSCustomOp class but has to 
+be filled by every node.</p>
+<p>var: makes it possible to reuse the function for different c++ code generation.
+I.e. if set to “ipgen” in StreamingFCLayer_Batch additional PRAGMA defines are
+added.</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.streamingfclayer_batch.StreamingFCLayer_Batch.docompute">
 <code class="sig-name descname">docompute</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.streamingfclayer_batch.StreamingFCLayer_Batch.docompute" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Function to generate the commands for the computational part of the 
+c++ code, is member function of HLSCustomOp class but has to be filled
+by every node.</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.streamingfclayer_batch.StreamingFCLayer_Batch.execute_node">
 <code class="sig-name descname">execute_node</code><span class="sig-paren">(</span><em class="sig-param">context</em>, <em class="sig-param">graph</em><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.streamingfclayer_batch.StreamingFCLayer_Batch.execute_node" title="Permalink to this definition">¶</a></dt>
-<dd><p>Execute this CustomOp instance, given the execution context and
-ONNX graph.</p>
+<dd><p>Executes single node using npysim or rtlsim.</p>
 </dd></dl>
 
 <dl class="method">
@@ -370,13 +417,13 @@ ONNX graph.</p>
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.streamingfclayer_batch.StreamingFCLayer_Batch.get_folded_input_shape">
 <code class="sig-name descname">get_folded_input_shape</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.streamingfclayer_batch.StreamingFCLayer_Batch.get_folded_input_shape" title="Permalink to this definition">¶</a></dt>
-<dd><p>Returns folded input shape (according to synapse folding).</p>
+<dd><p>Returns folded input shape (according to synapse folding), if implemented.</p>
 </dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.streamingfclayer_batch.StreamingFCLayer_Batch.get_folded_output_shape">
 <code class="sig-name descname">get_folded_output_shape</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.streamingfclayer_batch.StreamingFCLayer_Batch.get_folded_output_shape" title="Permalink to this definition">¶</a></dt>
-<dd><p>Returns folded output shape (according to neuron folding).</p>
+<dd><p>Returns folded output shape (according to neuron folding), if implemented.</p>
 </dd></dl>
 
 <dl class="method">
@@ -409,7 +456,7 @@ a form suitable for passing to the hlslib call:
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.streamingfclayer_batch.StreamingFCLayer_Batch.get_instream_width">
 <code class="sig-name descname">get_instream_width</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.streamingfclayer_batch.StreamingFCLayer_Batch.get_instream_width" title="Permalink to this definition">¶</a></dt>
-<dd><p>Returns input stream width.</p>
+<dd><p>Returns input stream width, if implemented.</p>
 </dd></dl>
 
 <dl class="method">
@@ -427,7 +474,9 @@ attribute is not set</p>
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.streamingfclayer_batch.StreamingFCLayer_Batch.get_number_output_values">
 <code class="sig-name descname">get_number_output_values</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.streamingfclayer_batch.StreamingFCLayer_Batch.get_number_output_values" title="Permalink to this definition">¶</a></dt>
-<dd><p>Returns the number of output values.</p>
+<dd><p>Function to get the number of expected output values, 
+is member function of HLSCustomOp class but has to be filled 
+by every node.</p>
 </dd></dl>
 
 <dl class="method">
@@ -438,7 +487,7 @@ attribute is not set</p>
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.streamingfclayer_batch.StreamingFCLayer_Batch.get_outstream_width">
 <code class="sig-name descname">get_outstream_width</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.streamingfclayer_batch.StreamingFCLayer_Batch.get_outstream_width" title="Permalink to this definition">¶</a></dt>
-<dd><p>Returns output stream width.</p>
+<dd><p>Returns output stream width, if implemented.</p>
 </dd></dl>
 
 <dl class="method">
@@ -456,7 +505,10 @@ data types.</p>
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.streamingfclayer_batch.StreamingFCLayer_Batch.global_includes">
 <code class="sig-name descname">global_includes</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.streamingfclayer_batch.StreamingFCLayer_Batch.global_includes" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Function to set the global includes for c++ code that has to be generated
+for npysim or rtlsim, is member function of HLSCustomOp class but has to 
+be filled by every node.</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.streamingfclayer_batch.StreamingFCLayer_Batch.infer_node_datatype">
@@ -486,22 +538,31 @@ for performing shape inference.</p>
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.streamingfclayer_batch.StreamingFCLayer_Batch.pragmas">
 <code class="sig-name descname">pragmas</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.streamingfclayer_batch.StreamingFCLayer_Batch.pragmas" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Function to generate the pragma commands in c++, is member function of 
+HLSCustomOp class but has to be filled by every node.</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.streamingfclayer_batch.StreamingFCLayer_Batch.read_npy_data">
 <code class="sig-name descname">read_npy_data</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.streamingfclayer_batch.StreamingFCLayer_Batch.read_npy_data" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Function to generate the commands for reading data from .npy file in c++, 
+is member function of HLSCustomOp class but has to be filled by every node.</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.streamingfclayer_batch.StreamingFCLayer_Batch.save_as_npy">
 <code class="sig-name descname">save_as_npy</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.streamingfclayer_batch.StreamingFCLayer_Batch.save_as_npy" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Function to generate the commands for saving data in .npy file in c++,
+is member function of HLSCustomOp class but has to be filled by every node.</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.streamingfclayer_batch.StreamingFCLayer_Batch.strm_decl">
 <code class="sig-name descname">strm_decl</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.streamingfclayer_batch.StreamingFCLayer_Batch.strm_decl" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Function to generate the commands for the stream declaration in c++,
+is member function of HLSCustomOp class but has to be filled
+by every node.</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.streamingfclayer_batch.StreamingFCLayer_Batch.verify_node">
@@ -524,27 +585,44 @@ the number of inputs is equal to the expected number</p>
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.streamingmaxpool_batch.StreamingMaxPool_Batch.blackboxfunction">
 <code class="sig-name descname">blackboxfunction</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.streamingmaxpool_batch.StreamingMaxPool_Batch.blackboxfunction" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Function to generate a blackbock function in c++ from which an IP block 
+will be generated, is member function of HLSCustomOp class but has to be filled 
+by every node.</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.streamingmaxpool_batch.StreamingMaxPool_Batch.bram_estimation">
 <code class="sig-name descname">bram_estimation</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.streamingmaxpool_batch.StreamingMaxPool_Batch.bram_estimation" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Function for BRAM resource estimation, is member function of 
+HLSCustomOp class but has to be filled by every node</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.streamingmaxpool_batch.StreamingMaxPool_Batch.dataoutstrm">
 <code class="sig-name descname">dataoutstrm</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.streamingmaxpool_batch.StreamingMaxPool_Batch.dataoutstrm" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Function to generate the commands for reading out data from c++ and convert 
+into npy format, is member function of HLSCustomOp class but has to be filled 
+by every node.</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.streamingmaxpool_batch.StreamingMaxPool_Batch.defines">
 <code class="sig-name descname">defines</code><span class="sig-paren">(</span><em class="sig-param">var</em><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.streamingmaxpool_batch.StreamingMaxPool_Batch.defines" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Function to set the define commands for c++ code that has to be generated
+for npysim or rtlsim, is member function of HLSCustomOp class but has to 
+be filled by every node.</p>
+<p>var: makes it possible to reuse the function for different c++ code generation.
+I.e. if set to “ipgen” in StreamingFCLayer_Batch additional PRAGMA defines are
+added.</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.streamingmaxpool_batch.StreamingMaxPool_Batch.docompute">
 <code class="sig-name descname">docompute</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.streamingmaxpool_batch.StreamingMaxPool_Batch.docompute" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Function to generate the commands for the computational part of the 
+c++ code, is member function of HLSCustomOp class but has to be filled
+by every node.</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.streamingmaxpool_batch.StreamingMaxPool_Batch.get_nodeattr_types">
@@ -561,12 +639,18 @@ attribute is not set</p>
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.streamingmaxpool_batch.StreamingMaxPool_Batch.get_number_output_values">
 <code class="sig-name descname">get_number_output_values</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.streamingmaxpool_batch.StreamingMaxPool_Batch.get_number_output_values" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Function to get the number of expected output values, 
+is member function of HLSCustomOp class but has to be filled 
+by every node.</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.streamingmaxpool_batch.StreamingMaxPool_Batch.global_includes">
 <code class="sig-name descname">global_includes</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.streamingmaxpool_batch.StreamingMaxPool_Batch.global_includes" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Function to set the global includes for c++ code that has to be generated
+for npysim or rtlsim, is member function of HLSCustomOp class but has to 
+be filled by every node.</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.streamingmaxpool_batch.StreamingMaxPool_Batch.infer_node_datatype">
@@ -578,7 +662,9 @@ node.</p>
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.streamingmaxpool_batch.StreamingMaxPool_Batch.lut_estimation">
 <code class="sig-name descname">lut_estimation</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.streamingmaxpool_batch.StreamingMaxPool_Batch.lut_estimation" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Function for LUT resource estimation, is member function of
+HLSCustomOp class but has to be filled by every node</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.streamingmaxpool_batch.StreamingMaxPool_Batch.make_shape_compatible_op">
@@ -590,22 +676,31 @@ for performing shape inference.</p>
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.streamingmaxpool_batch.StreamingMaxPool_Batch.pragmas">
 <code class="sig-name descname">pragmas</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.streamingmaxpool_batch.StreamingMaxPool_Batch.pragmas" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Function to generate the pragma commands in c++, is member function of 
+HLSCustomOp class but has to be filled by every node.</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.streamingmaxpool_batch.StreamingMaxPool_Batch.read_npy_data">
 <code class="sig-name descname">read_npy_data</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.streamingmaxpool_batch.StreamingMaxPool_Batch.read_npy_data" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Function to generate the commands for reading data from .npy file in c++, 
+is member function of HLSCustomOp class but has to be filled by every node.</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.streamingmaxpool_batch.StreamingMaxPool_Batch.save_as_npy">
 <code class="sig-name descname">save_as_npy</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.streamingmaxpool_batch.StreamingMaxPool_Batch.save_as_npy" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Function to generate the commands for saving data in .npy file in c++,
+is member function of HLSCustomOp class but has to be filled by every node.</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.streamingmaxpool_batch.StreamingMaxPool_Batch.strm_decl">
 <code class="sig-name descname">strm_decl</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.streamingmaxpool_batch.StreamingMaxPool_Batch.strm_decl" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Function to generate the commands for the stream declaration in c++,
+is member function of HLSCustomOp class but has to be filled
+by every node.</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.streamingmaxpool_batch.StreamingMaxPool_Batch.verify_node">
@@ -633,44 +728,61 @@ It marks the end of the current image/input sample.</p>
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.tlastmarker.TLastMarker.blackboxfunction">
 <code class="sig-name descname">blackboxfunction</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.tlastmarker.TLastMarker.blackboxfunction" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Function to generate a blackbock function in c++ from which an IP block 
+will be generated, is member function of HLSCustomOp class but has to be filled 
+by every node.</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.tlastmarker.TLastMarker.dataoutstrm">
 <code class="sig-name descname">dataoutstrm</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.tlastmarker.TLastMarker.dataoutstrm" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Function to generate the commands for reading out data from c++ and convert 
+into npy format, is member function of HLSCustomOp class but has to be filled 
+by every node.</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.tlastmarker.TLastMarker.defines">
 <code class="sig-name descname">defines</code><span class="sig-paren">(</span><em class="sig-param">var</em><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.tlastmarker.TLastMarker.defines" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Function to set the define commands for c++ code that has to be generated
+for npysim or rtlsim, is member function of HLSCustomOp class but has to 
+be filled by every node.</p>
+<p>var: makes it possible to reuse the function for different c++ code generation.
+I.e. if set to “ipgen” in StreamingFCLayer_Batch additional PRAGMA defines are
+added.</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.tlastmarker.TLastMarker.docompute">
 <code class="sig-name descname">docompute</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.tlastmarker.TLastMarker.docompute" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Function to generate the commands for the computational part of the 
+c++ code, is member function of HLSCustomOp class but has to be filled
+by every node.</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.tlastmarker.TLastMarker.execute_node">
 <code class="sig-name descname">execute_node</code><span class="sig-paren">(</span><em class="sig-param">context</em>, <em class="sig-param">graph</em><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.tlastmarker.TLastMarker.execute_node" title="Permalink to this definition">¶</a></dt>
-<dd><p>Execute this CustomOp instance, given the execution context and
-ONNX graph.</p>
+<dd><p>Executes single node using npysim or rtlsim.</p>
 </dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.tlastmarker.TLastMarker.get_folded_input_shape">
 <code class="sig-name descname">get_folded_input_shape</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.tlastmarker.TLastMarker.get_folded_input_shape" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Returns folded input shape (according to synapse folding), if implemented.</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.tlastmarker.TLastMarker.get_folded_output_shape">
 <code class="sig-name descname">get_folded_output_shape</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.tlastmarker.TLastMarker.get_folded_output_shape" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Returns folded output shape (according to neuron folding), if implemented.</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.tlastmarker.TLastMarker.get_instream_width">
 <code class="sig-name descname">get_instream_width</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.tlastmarker.TLastMarker.get_instream_width" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Returns input stream width, if implemented.</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.tlastmarker.TLastMarker.get_nodeattr_types">
@@ -687,17 +799,24 @@ attribute is not set</p>
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.tlastmarker.TLastMarker.get_number_output_values">
 <code class="sig-name descname">get_number_output_values</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.tlastmarker.TLastMarker.get_number_output_values" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Function to get the number of expected output values, 
+is member function of HLSCustomOp class but has to be filled 
+by every node.</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.tlastmarker.TLastMarker.get_outstream_width">
 <code class="sig-name descname">get_outstream_width</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.tlastmarker.TLastMarker.get_outstream_width" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Returns output stream width, if implemented.</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.tlastmarker.TLastMarker.global_includes">
 <code class="sig-name descname">global_includes</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.tlastmarker.TLastMarker.global_includes" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Function to set the global includes for c++ code that has to be generated
+for npysim or rtlsim, is member function of HLSCustomOp class but has to 
+be filled by every node.</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.tlastmarker.TLastMarker.infer_node_datatype">
@@ -716,22 +835,31 @@ for performing shape inference.</p>
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.tlastmarker.TLastMarker.pragmas">
 <code class="sig-name descname">pragmas</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.tlastmarker.TLastMarker.pragmas" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Function to generate the pragma commands in c++, is member function of 
+HLSCustomOp class but has to be filled by every node.</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.tlastmarker.TLastMarker.read_npy_data">
 <code class="sig-name descname">read_npy_data</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.tlastmarker.TLastMarker.read_npy_data" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Function to generate the commands for reading data from .npy file in c++, 
+is member function of HLSCustomOp class but has to be filled by every node.</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.tlastmarker.TLastMarker.save_as_npy">
 <code class="sig-name descname">save_as_npy</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.tlastmarker.TLastMarker.save_as_npy" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Function to generate the commands for saving data in .npy file in c++,
+is member function of HLSCustomOp class but has to be filled by every node.</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.tlastmarker.TLastMarker.strm_decl">
 <code class="sig-name descname">strm_decl</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.tlastmarker.TLastMarker.strm_decl" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Function to generate the commands for the stream declaration in c++,
+is member function of HLSCustomOp class but has to be filled
+by every node.</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.tlastmarker.TLastMarker.verify_node">
@@ -757,12 +885,17 @@ when writing a new fpgadataflow custom op node.</p>
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.HLSCustomOp.blackboxfunction">
 <em class="property">abstract </em><code class="sig-name descname">blackboxfunction</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.HLSCustomOp.blackboxfunction" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Function to generate a blackbock function in c++ from which an IP block 
+will be generated, is member function of HLSCustomOp class but has to be filled 
+by every node.</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.HLSCustomOp.bram_estimation">
 <code class="sig-name descname">bram_estimation</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.HLSCustomOp.bram_estimation" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Function for BRAM resource estimation, is member function of 
+HLSCustomOp class but has to be filled by every node</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.HLSCustomOp.code_generation_ipgen">
@@ -786,57 +919,74 @@ finn.util.basic and executes the script to produce the executable.</p>
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.HLSCustomOp.dataoutstrm">
 <em class="property">abstract </em><code class="sig-name descname">dataoutstrm</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.HLSCustomOp.dataoutstrm" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Function to generate the commands for reading out data from c++ and convert 
+into npy format, is member function of HLSCustomOp class but has to be filled 
+by every node.</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.HLSCustomOp.defines">
 <em class="property">abstract </em><code class="sig-name descname">defines</code><span class="sig-paren">(</span><em class="sig-param">var</em><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.HLSCustomOp.defines" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Function to set the define commands for c++ code that has to be generated
+for npysim or rtlsim, is member function of HLSCustomOp class but has to 
+be filled by every node.</p>
+<p>var: makes it possible to reuse the function for different c++ code generation.
+I.e. if set to “ipgen” in StreamingFCLayer_Batch additional PRAGMA defines are
+added.</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.HLSCustomOp.docompute">
 <em class="property">abstract </em><code class="sig-name descname">docompute</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.HLSCustomOp.docompute" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Function to generate the commands for the computational part of the 
+c++ code, is member function of HLSCustomOp class but has to be filled
+by every node.</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.HLSCustomOp.dynamic_input_to_npy">
 <code class="sig-name descname">dynamic_input_to_npy</code><span class="sig-paren">(</span><em class="sig-param">context</em>, <em class="sig-param">count</em><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.HLSCustomOp.dynamic_input_to_npy" title="Permalink to this definition">¶</a></dt>
-<dd><p>Saves input (given context) into .npy files. Count indicates the number 
-of inputs that have to be saved.</p>
+<dd><p>Saves input (given context) into .npy files.</p>
+<p>Count indicates the number of inputs that have to be saved.</p>
 </dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.HLSCustomOp.exec_precompiled_singlenode_model">
 <code class="sig-name descname">exec_precompiled_singlenode_model</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.HLSCustomOp.exec_precompiled_singlenode_model" title="Permalink to this definition">¶</a></dt>
-<dd><p>Execute precompiled executable.</p>
+<dd><p>Executes precompiled executable.</p>
 </dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.HLSCustomOp.execute_node">
 <code class="sig-name descname">execute_node</code><span class="sig-paren">(</span><em class="sig-param">context</em>, <em class="sig-param">graph</em><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.HLSCustomOp.execute_node" title="Permalink to this definition">¶</a></dt>
-<dd><p>Execute this CustomOp instance, given the execution context and
-ONNX graph.</p>
+<dd><p>Executes single node using npysim or rtlsim.</p>
 </dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.HLSCustomOp.generate_params">
 <code class="sig-name descname">generate_params</code><span class="sig-paren">(</span><em class="sig-param">model</em>, <em class="sig-param">path</em><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.HLSCustomOp.generate_params" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Function to generate parameters (i.e. weights and thresholds), 
+is member function of HLSCustomOp class but has to be filled 
+by every node.</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.HLSCustomOp.get_folded_input_shape">
 <code class="sig-name descname">get_folded_input_shape</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.HLSCustomOp.get_folded_input_shape" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Returns folded input shape (according to synapse folding), if implemented.</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.HLSCustomOp.get_folded_output_shape">
 <code class="sig-name descname">get_folded_output_shape</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.HLSCustomOp.get_folded_output_shape" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Returns folded output shape (according to neuron folding), if implemented.</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.HLSCustomOp.get_instream_width">
 <code class="sig-name descname">get_instream_width</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.HLSCustomOp.get_instream_width" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Returns input stream width, if implemented.</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.HLSCustomOp.get_nodeattr_types">
@@ -853,17 +1003,24 @@ attribute is not set</p>
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.HLSCustomOp.get_number_output_values">
 <em class="property">abstract </em><code class="sig-name descname">get_number_output_values</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.HLSCustomOp.get_number_output_values" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Function to get the number of expected output values, 
+is member function of HLSCustomOp class but has to be filled 
+by every node.</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.HLSCustomOp.get_outstream_width">
 <code class="sig-name descname">get_outstream_width</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.HLSCustomOp.get_outstream_width" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Returns output stream width, if implemented.</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.HLSCustomOp.global_includes">
 <em class="property">abstract </em><code class="sig-name descname">global_includes</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.HLSCustomOp.global_includes" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Function to set the global includes for c++ code that has to be generated
+for npysim or rtlsim, is member function of HLSCustomOp class but has to 
+be filled by every node.</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.HLSCustomOp.ipgen_singlenode_code">
@@ -875,12 +1032,15 @@ finn.util.fpgadataflow.</p>
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.HLSCustomOp.lut_estimation">
 <code class="sig-name descname">lut_estimation</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.HLSCustomOp.lut_estimation" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Function for LUT resource estimation, is member function of
+HLSCustomOp class but has to be filled by every node</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.HLSCustomOp.node_res_estimation">
 <code class="sig-name descname">node_res_estimation</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.HLSCustomOp.node_res_estimation" title="Permalink to this definition">¶</a></dt>
-<dd><p>Returns resource estimation.</p>
+<dd><p>Returns summarized resource estimation of BRAMs and LUTs 
+of the node.</p>
 </dd></dl>
 
 <dl class="method">
@@ -893,12 +1053,16 @@ the context dictionary.</p>
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.HLSCustomOp.pragmas">
 <em class="property">abstract </em><code class="sig-name descname">pragmas</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.HLSCustomOp.pragmas" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Function to generate the pragma commands in c++, is member function of 
+HLSCustomOp class but has to be filled by every node.</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.HLSCustomOp.read_npy_data">
 <em class="property">abstract </em><code class="sig-name descname">read_npy_data</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.HLSCustomOp.read_npy_data" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Function to generate the commands for reading data from .npy file in c++, 
+is member function of HLSCustomOp class but has to be filled by every node.</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.HLSCustomOp.reset_rtlsim">
@@ -919,12 +1083,17 @@ after 100 cycles.</p>
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.HLSCustomOp.save_as_npy">
 <em class="property">abstract </em><code class="sig-name descname">save_as_npy</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.HLSCustomOp.save_as_npy" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Function to generate the commands for saving data in .npy file in c++,
+is member function of HLSCustomOp class but has to be filled by every node.</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.HLSCustomOp.strm_decl">
 <em class="property">abstract </em><code class="sig-name descname">strm_decl</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.fpgadataflow.HLSCustomOp.strm_decl" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Function to generate the commands for the stream declaration in c++,
+is member function of HLSCustomOp class but has to be filled
+by every node.</p>
+</dd></dl>
 
 <dl class="method">
 <dt id="finn.custom_op.fpgadataflow.HLSCustomOp.toggle_clk">
diff --git a/docs/finn/_build/html/source_code/finn.custom_op.html b/docs/finn/_build/html/source_code/finn.custom_op.html
index 76679f1dc..574dd4b74 100644
--- a/docs/finn/_build/html/source_code/finn.custom_op.html
+++ b/docs/finn/_build/html/source_code/finn.custom_op.html
@@ -245,7 +245,9 @@ the number of inputs is equal to the expected number</p>
 <dl class="function">
 <dt id="finn.custom_op.multithreshold.compare">
 <code class="sig-prename descclassname">finn.custom_op.multithreshold.</code><code class="sig-name descname">compare</code><span class="sig-paren">(</span><em class="sig-param">x</em>, <em class="sig-param">y</em><span class="sig-paren">)</span><a class="headerlink" href="#finn.custom_op.multithreshold.compare" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
+<dd><p>Comparison helper function for multithresholding.</p>
+<p>Gets two values and returns 1.0 if x&gt;=y otherwise 0.0.</p>
+</dd></dl>
 
 <dl class="function">
 <dt id="finn.custom_op.multithreshold.multithreshold">
@@ -254,6 +256,7 @@ the number of inputs is equal to the expected number</p>
 thresholding maps any real number x to an integer in the interval [0, n],
 where the returned integer is the number of thresholds x is greater than 
 or equal to.</p>
+<p>The output tensor will be scaled by out_scale and biased by out_bias.</p>
 </dd></dl>
 
 </div>
-- 
GitLab