From e83210ab3ef8fc3f05a40901af2b6ff0747861c0 Mon Sep 17 00:00:00 2001 From: auphelia <jakobapk@web.de> Date: Thu, 20 Feb 2020 16:19:44 +0000 Subject: [PATCH] [Sphinx documentation] Change front page --- docs/finn/_build/doctrees/environment.pickle | Bin 127625 -> 127729 bytes docs/finn/_build/doctrees/index.doctree | Bin 9307 -> 10019 bytes docs/finn/_build/html/_sources/index.rst.txt | 6 +++--- docs/finn/_build/html/index.html | 7 +++++-- docs/finn/_build/html/searchindex.js | 2 +- docs/finn/index.rst | 6 +++--- 6 files changed, 12 insertions(+), 9 deletions(-) diff --git a/docs/finn/_build/doctrees/environment.pickle b/docs/finn/_build/doctrees/environment.pickle index 7fe6d2faa7ed7128ce1d3bcc18b3f80e6c17eafd..d367a416f25d3ee469fcb47faa5c769be1df6ce0 100644 GIT binary patch literal 127729 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 bR--a0F~z^u_F(=E_Wck1g#r9MoGtzT&3Et6 literal 127625 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 diff --git a/docs/finn/_build/doctrees/index.doctree b/docs/finn/_build/doctrees/index.doctree index 8c96910b3a13f1171e6b0b9944c31234bcd11c10..28f33b690ff987ac2d3bf8191ff239dab998782d 100644 GIT binary patch delta 1293 zcmcgs&1(}u6z?S6n%JaCs-a0+bc!F1CHByR_*F{nhiL;TTA{tvl4K`NVzL`IyA1&~ ziWGW?2c1=W=s^^#7f}h~Cs>L-^wN_zL9pVf;H6MdP@K0(lj<K(SRU`=_uiY|&U^DY z@GvA?tG(lCe<4hog<45g36so&Of<Vqw3j_K-$cXgk_8I^>ZSvr+56}LdXTmUt=!WC zo_sggIw+#%QY55BX#b(>`W4+rg~InSl8nkJf>jx-l;FXkPzawTVbQSq<!A<HNhA|j zNhdx>;}r{YH5`#O)xb$4>&GcsAzX-BGOXY!qGaN-gymS?sOiU98jn&)i)xBOBsH1C znj{hhi)4x<<#dYsFwZz0R|8takHeD4Tl24UzNjpzN<5;eylMu=6gg#d=4Vf7Qe4fo z;ZZf5!>T3`5yxbubQ~=$=EEw<bn0}+gif8?!1sT;`EBM~qC2gZZ<q=(e*Yr7Xzf6K zOt4G{S#E1!yAN|ssZK_)0Y-z(TNZ?A9=QRS$~-v$%N|&JOv5G?tZ!kb>Nbjhti8xq z8K&`}t&!u1-M3jyj;im69U)ugVB`NpY7v@a>kYH$F`wC1CV4IFxnn?h#JkS1Uk<(N zjYjv=w}qVwi4i_NQ6lO=1W|rwX90EUmBL^cX$#KkI=HxJ)>xIhTx0B6b2~fca@lW{ z*9GDV8*?rBSLu2NdVK>=_2<Ca+}>OpT4#*Yy<(to8P!*Rz{}zn_hrOZcAYGKayOcV z-#lrat$B!$s6#b1Woi!enqBoCwE{Unykj4{Q@$n+FgVg>gBV2qB}P{ufo-ML#63SN zv^F>`-|nw;73yp<1Bk-bnpf&ac!$Ip5Top4%Xw!nSIhLh)Sc*NU9CqfC&0-wis{x@ zCNx|0?R{d-E083ENPxHim?gTHXaj2x7h1t8g;PY$rAY=}mIP#k40MPt%^1KLjd~yi mb!bPah(Z_Xd!s_aW0bMSWLbrGZjxU#lq%Sx@#4rn8~O`o*0uxy delta 1048 zcmd5*-Afcv6!-4z=xVO5u4{@P-Ac{OBzq7kR3bA&7>s%_%49#Tb7tFSWM;N3i0UB~ zS_`=oL?2JS^inGGVEE7n(L)bKL9{{tKoCUu6h+WI<L+AjK`&?SIltfe-Scs0LHRr+ zU-jP}X<nAcCB7&{xGf#vZ=`8*n7=RHE=8bUd}(Vhv_LED94>_jv;zSt9fQ7I*PP2v z8_1(KNm0?@QAObof<LZUR5xs@={D07EJ1C9#u$xKmFdjX;&eb!Xfz&YDP~4(!=x$g zETdB*+CgJ!n~ESXQ}AuWNYM#FU{jMR!_;(@3WO$@rKvi#CZlmijR{Xq(<hk8bP*83 zJMzjFHFP>Sa^#@Z=|IVt1EK%F&g)KYq;N_M`XnC>w3A-GRy-!Bgr7t|vPYa$TtRLn z6}Sq{OP<S@1Tux3V18Yjk;`ud`h6z|e;24<a6^Rm2lt1|)<?3j!sCDAhkSLO>k2w4 zFBCOei24bc=T9o{ko){tl_uX6*Ua;0RZiXGG&I9vrp#oyl_Z>D;-RT<t$#ipW4udh zEYw#ipgDYC@(ppC<=Jpga5~o)Vk&Q_e$|nMFBa;4!pKJFifDW${|2Gh+i}JXMqU%r z=Vog@_~kXhxW||3nGb%6LYsMCLy7b#)5TxZcU3qjiIpR3iO)2g-(4==vDW}R^{PfB zlp&o?VFd7UJ>lOrwus=jLK|QCg~qn(kB~*Fd^bo@x!d@5(}1`nIf!P6XPVB0y2UZq zavemH`}ohM?!aCQiVU}B>xz%ex!<=vl$eT12{hwqP9tX(R+2U7g@s9HO7-YDW?!6S n7XF$^%uqbG0;{tgaW)OL2%!$NuZyU#0?VF4GU)zpX(fLETW4C< diff --git a/docs/finn/_build/html/_sources/index.rst.txt b/docs/finn/_build/html/_sources/index.rst.txt index a5bbf8e05..c647b4d1d 100644 --- a/docs/finn/_build/html/_sources/index.rst.txt +++ b/docs/finn/_build/html/_sources/index.rst.txt @@ -6,15 +6,15 @@ **** FINN **** -**This website is currently under construction.** +.. note:: **This website is currently under construction.** -FINN is an experimental framework from Xilinx Research Labs to explore deep neural network inference on FPGAs. It specifically targets quantized neural networks, with emphasis on generating dataflow-style architectures customized for each network. It is not intended to be a generic DNN accelerator like xDNN, but rather a tool for exploring the design space of DNN inference accelerators on FPGAs. +Welcome to the FINN Read the Docs website. This website is about the new, more modular version of FINN, which is currently under development on GitHub, and we welcome contributions from the community! Stay tuned for more updates. What is FINN? ============= 'FINN' is colloquially used to refer to two separate but highly related things: -* The FINN project, which includes tools for training quantized neural networks such as Brevitas, the FINN compiler, and the finn-hlslib Vivado HLS library of FPGA components for QNNs. An overview of the project can be taken from the following graphic and details can be seen on the `FINN project homepage <https://xilinx.github.io/finn/>`_. +* The FINN project, which is an experimental framework from Xilinx Research Labs to explore deep neural network inference on FPGAs. It specifically targets quantized neural networks, with emphasis on generating dataflow-style architectures customized for each network. It includes tools for training quantized neural networks such as Brevitas, the FINN compiler, and the finn-hlslib Vivado HLS library of FPGA components for QNNs. An overview of the project can be taken from the following graphic and details can be seen on the `FINN project homepage <https://xilinx.github.io/finn/>`_. .. image:: ../img/finn-stack.png :scale: 50% diff --git a/docs/finn/_build/html/index.html b/docs/finn/_build/html/index.html index 088d15296..eabd2d3b5 100644 --- a/docs/finn/_build/html/index.html +++ b/docs/finn/_build/html/index.html @@ -149,13 +149,16 @@ <div class="section" id="finn"> <h1>FINN<a class="headerlink" href="#finn" title="Permalink to this headline">¶</a></h1> +<div class="admonition note"> +<p class="admonition-title">Note</p> <p><strong>This website is currently under construction.</strong></p> -<p>FINN is an experimental framework from Xilinx Research Labs to explore deep neural network inference on FPGAs. It specifically targets quantized neural networks, with emphasis on generating dataflow-style architectures customized for each network. It is not intended to be a generic DNN accelerator like xDNN, but rather a tool for exploring the design space of DNN inference accelerators on FPGAs.</p> +</div> +<p>Welcome to the FINN Read the Docs website. This website is about the new, more modular version of FINN, which is currently under development on GitHub, and we welcome contributions from the community! Stay tuned for more updates.</p> <div class="section" id="what-is-finn"> <h2>What is FINN?<a class="headerlink" href="#what-is-finn" title="Permalink to this headline">¶</a></h2> <p>‘FINN’ is colloquially used to refer to two separate but highly related things:</p> <ul class="simple"> -<li><p>The FINN project, which includes tools for training quantized neural networks such as Brevitas, the FINN compiler, and the finn-hlslib Vivado HLS library of FPGA components for QNNs. An overview of the project can be taken from the following graphic and details can be seen on the <a class="reference external" href="https://xilinx.github.io/finn/">FINN project homepage</a>.</p></li> +<li><p>The FINN project, which is an experimental framework from Xilinx Research Labs to explore deep neural network inference on FPGAs. It specifically targets quantized neural networks, with emphasis on generating dataflow-style architectures customized for each network. It includes tools for training quantized neural networks such as Brevitas, the FINN compiler, and the finn-hlslib Vivado HLS library of FPGA components for QNNs. An overview of the project can be taken from the following graphic and details can be seen on the <a class="reference external" href="https://xilinx.github.io/finn/">FINN project homepage</a>.</p></li> </ul> <a class="reference internal image-reference" href="_images/finn-stack.png"><img alt="_images/finn-stack.png" class="align-center" src="_images/finn-stack.png" style="width: 320.5px; height: 312.5px;" /></a> <ul class="simple"> diff --git a/docs/finn/_build/html/searchindex.js b/docs/finn/_build/html/searchindex.js index 8de405085..205390df5 100644 --- a/docs/finn/_build/html/searchindex.js +++ b/docs/finn/_build/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({docnames:["end_to_end_flow","finn","finn.analysis","finn.analysis.fpgadataflow","finn.core","finn.custom_op","finn.custom_op.fpgadataflow","finn.transformation","finn.transformation.fpgadataflow","finn.transformation.streamline","finn.util","getting_started","index","modules","source_code"],envversion:{"sphinx.domains.c":1,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":1,"sphinx.domains.javascript":1,"sphinx.domains.math":2,"sphinx.domains.python":1,"sphinx.domains.rst":1,"sphinx.domains.std":1,sphinx:56},filenames:["end_to_end_flow.rst","finn.rst","finn.analysis.rst","finn.analysis.fpgadataflow.rst","finn.core.rst","finn.custom_op.rst","finn.custom_op.fpgadataflow.rst","finn.transformation.rst","finn.transformation.fpgadataflow.rst","finn.transformation.streamline.rst","finn.util.rst","getting_started.rst","index.rst","modules.rst","source_code.rst"],objects:{"":{finn:[1,0,0,"-"]},"finn.analysis":{fpgadataflow:[3,0,0,"-"],topology:[2,0,0,"-"],verify_custom_nodes:[2,0,0,"-"]},"finn.analysis.fpgadataflow":{hls_synth_res_estimation:[3,0,0,"-"],res_estimation:[3,0,0,"-"]},"finn.analysis.fpgadataflow.hls_synth_res_estimation":{hls_synth_res_estimation:[3,1,1,""]},"finn.analysis.fpgadataflow.res_estimation":{res_estimation:[3,1,1,""]},"finn.analysis.topology":{all_tensors_f32:[2,1,1,""],get_per_tensor_fanouts:[2,1,1,""],is_linear:[2,1,1,""],node_inputs_in_expected_order:[2,1,1,""]},"finn.analysis.verify_custom_nodes":{verify_nodes:[2,1,1,""]},"finn.core":{datatype:[4,0,0,"-"],execute_custom_node:[4,0,0,"-"],modelwrapper:[4,0,0,"-"],onnx_exec:[4,0,0,"-"]},"finn.core.datatype":{DataType:[4,2,1,""]},"finn.core.datatype.DataType":{BINARY:[4,3,1,""],BIPOLAR:[4,3,1,""],FLOAT32:[4,3,1,""],INT16:[4,3,1,""],INT2:[4,3,1,""],INT32:[4,3,1,""],INT3:[4,3,1,""],INT4:[4,3,1,""],INT8:[4,3,1,""],TERNARY:[4,3,1,""],UINT16:[4,3,1,""],UINT2:[4,3,1,""],UINT32:[4,3,1,""],UINT3:[4,3,1,""],UINT4:[4,3,1,""],UINT8:[4,3,1,""],allowed:[4,4,1,""],bitwidth:[4,4,1,""],get_hls_datatype_str:[4,4,1,""],get_num_possible_values:[4,4,1,""],get_smallest_possible:[4,4,1,""],is_integer:[4,4,1,""],max:[4,4,1,""],min:[4,4,1,""],signed:[4,4,1,""]},"finn.core.execute_custom_node":{execute_custom_node:[4,1,1,""]},"finn.core.modelwrapper":{ModelWrapper:[4,2,1,""]},"finn.core.modelwrapper.ModelWrapper":{analysis:[4,4,1,""],check_all_tensor_shapes_specified:[4,4,1,""],check_compatibility:[4,4,1,""],find_consumer:[4,4,1,""],find_producer:[4,4,1,""],get_all_tensor_names:[4,4,1,""],get_initializer:[4,4,1,""],get_metadata_prop:[4,4,1,""],get_tensor_datatype:[4,4,1,""],get_tensor_fanout:[4,4,1,""],get_tensor_shape:[4,4,1,""],get_tensor_valueinfo:[4,4,1,""],graph:[4,4,1,""],make_empty_exec_context:[4,4,1,""],make_new_valueinfo_name:[4,4,1,""],model:[4,4,1,""],rename_tensor:[4,4,1,""],save:[4,4,1,""],set_initializer:[4,4,1,""],set_metadata_prop:[4,4,1,""],set_tensor_datatype:[4,4,1,""],set_tensor_shape:[4,4,1,""],transform:[4,4,1,""]},"finn.core.onnx_exec":{compare_execution:[4,1,1,""],execute_node:[4,1,1,""],execute_onnx:[4,1,1,""],execute_onnx_and_make_model:[4,1,1,""]},"finn.custom_op":{CustomOp:[5,2,1,""],fpgadataflow:[6,0,0,"-"],multithreshold:[5,0,0,"-"],registry:[5,0,0,"-"],streamingdataflowpartition:[5,0,0,"-"],xnorpopcount:[5,0,0,"-"]},"finn.custom_op.CustomOp":{execute_node:[5,4,1,""],get_nodeattr:[5,4,1,""],get_nodeattr_types:[5,4,1,""],infer_node_datatype:[5,4,1,""],make_shape_compatible_op:[5,4,1,""],set_nodeattr:[5,4,1,""],verify_node:[5,4,1,""]},"finn.custom_op.fpgadataflow":{HLSCustomOp:[6,2,1,""],convolutioninputgenerator:[6,0,0,"-"],streamingfclayer_batch:[6,0,0,"-"],streamingmaxpool_batch:[6,0,0,"-"],templates:[6,0,0,"-"],tlastmarker:[6,0,0,"-"]},"finn.custom_op.fpgadataflow.HLSCustomOp":{blackboxfunction:[6,4,1,""],bram_estimation:[6,4,1,""],code_generation_ipgen:[6,4,1,""],code_generation_npysim:[6,4,1,""],compile_singlenode_code:[6,4,1,""],dataoutstrm:[6,4,1,""],defines:[6,4,1,""],docompute:[6,4,1,""],dynamic_input_to_npy:[6,4,1,""],exec_precompiled_singlenode_model:[6,4,1,""],execute_node:[6,4,1,""],generate_params:[6,4,1,""],get_folded_input_shape:[6,4,1,""],get_folded_output_shape:[6,4,1,""],get_instream_width:[6,4,1,""],get_nodeattr_types:[6,4,1,""],get_number_output_values:[6,4,1,""],get_outstream_width:[6,4,1,""],global_includes:[6,4,1,""],ipgen_singlenode_code:[6,4,1,""],lut_estimation:[6,4,1,""],node_res_estimation:[6,4,1,""],npy_to_dynamic_output:[6,4,1,""],pragmas:[6,4,1,""],read_npy_data:[6,4,1,""],reset_rtlsim:[6,4,1,""],rtlsim:[6,4,1,""],save_as_npy:[6,4,1,""],strm_decl:[6,4,1,""],toggle_clk:[6,4,1,""]},"finn.custom_op.fpgadataflow.convolutioninputgenerator":{ConvolutionInputGenerator:[6,2,1,""]},"finn.custom_op.fpgadataflow.convolutioninputgenerator.ConvolutionInputGenerator":{blackboxfunction:[6,4,1,""],bram_estimation:[6,4,1,""],dataoutstrm:[6,4,1,""],defines:[6,4,1,""],docompute:[6,4,1,""],execute_node:[6,4,1,""],get_input_datatype:[6,4,1,""],get_nodeattr_types:[6,4,1,""],get_number_output_values:[6,4,1,""],get_output_datatype:[6,4,1,""],get_stream_width:[6,4,1,""],global_includes:[6,4,1,""],infer_node_datatype:[6,4,1,""],lut_estimation:[6,4,1,""],make_shape_compatible_op:[6,4,1,""],pragmas:[6,4,1,""],read_npy_data:[6,4,1,""],save_as_npy:[6,4,1,""],strm_decl:[6,4,1,""],verify_node:[6,4,1,""]},"finn.custom_op.fpgadataflow.streamingfclayer_batch":{StreamingFCLayer_Batch:[6,2,1,""]},"finn.custom_op.fpgadataflow.streamingfclayer_batch.StreamingFCLayer_Batch":{blackboxfunction:[6,4,1,""],bram_estimation:[6,4,1,""],calc_tmem:[6,4,1,""],calc_wmem:[6,4,1,""],dataoutstrm:[6,4,1,""],defines:[6,4,1,""],docompute:[6,4,1,""],execute_node:[6,4,1,""],generate_params:[6,4,1,""],get_folded_input_shape:[6,4,1,""],get_folded_output_shape:[6,4,1,""],get_hls_compatible_threshold_tensor:[6,4,1,""],get_hls_compatible_weight_tensor:[6,4,1,""],get_input_datatype:[6,4,1,""],get_instream_width:[6,4,1,""],get_nodeattr_types:[6,4,1,""],get_number_output_values:[6,4,1,""],get_output_datatype:[6,4,1,""],get_outstream_width:[6,4,1,""],get_template_param_values:[6,4,1,""],get_weight_datatype:[6,4,1,""],global_includes:[6,4,1,""],infer_node_datatype:[6,4,1,""],lut_estimation:[6,4,1,""],make_shape_compatible_op:[6,4,1,""],pragmas:[6,4,1,""],read_npy_data:[6,4,1,""],save_as_npy:[6,4,1,""],strm_decl:[6,4,1,""],verify_node:[6,4,1,""]},"finn.custom_op.fpgadataflow.streamingmaxpool_batch":{StreamingMaxPool_Batch:[6,2,1,""]},"finn.custom_op.fpgadataflow.streamingmaxpool_batch.StreamingMaxPool_Batch":{blackboxfunction:[6,4,1,""],bram_estimation:[6,4,1,""],dataoutstrm:[6,4,1,""],defines:[6,4,1,""],docompute:[6,4,1,""],get_nodeattr_types:[6,4,1,""],get_number_output_values:[6,4,1,""],global_includes:[6,4,1,""],infer_node_datatype:[6,4,1,""],lut_estimation:[6,4,1,""],make_shape_compatible_op:[6,4,1,""],pragmas:[6,4,1,""],read_npy_data:[6,4,1,""],save_as_npy:[6,4,1,""],strm_decl:[6,4,1,""],verify_node:[6,4,1,""]},"finn.custom_op.fpgadataflow.tlastmarker":{TLastMarker:[6,2,1,""]},"finn.custom_op.fpgadataflow.tlastmarker.TLastMarker":{blackboxfunction:[6,4,1,""],dataoutstrm:[6,4,1,""],defines:[6,4,1,""],docompute:[6,4,1,""],execute_node:[6,4,1,""],get_folded_input_shape:[6,4,1,""],get_folded_output_shape:[6,4,1,""],get_instream_width:[6,4,1,""],get_nodeattr_types:[6,4,1,""],get_number_output_values:[6,4,1,""],get_outstream_width:[6,4,1,""],global_includes:[6,4,1,""],infer_node_datatype:[6,4,1,""],make_shape_compatible_op:[6,4,1,""],pragmas:[6,4,1,""],read_npy_data:[6,4,1,""],save_as_npy:[6,4,1,""],strm_decl:[6,4,1,""],verify_node:[6,4,1,""]},"finn.custom_op.multithreshold":{MultiThreshold:[5,2,1,""],compare:[5,1,1,""],multithreshold:[5,1,1,""]},"finn.custom_op.multithreshold.MultiThreshold":{execute_node:[5,4,1,""],get_nodeattr_types:[5,4,1,""],infer_node_datatype:[5,4,1,""],make_shape_compatible_op:[5,4,1,""],verify_node:[5,4,1,""]},"finn.custom_op.registry":{getCustomOp:[5,1,1,""]},"finn.custom_op.streamingdataflowpartition":{StreamingDataflowPartition:[5,2,1,""]},"finn.custom_op.streamingdataflowpartition.StreamingDataflowPartition":{execute_node:[5,4,1,""],get_nodeattr_types:[5,4,1,""],infer_node_datatype:[5,4,1,""],make_shape_compatible_op:[5,4,1,""],verify_node:[5,4,1,""]},"finn.custom_op.xnorpopcount":{XnorPopcountMatMul:[5,2,1,""],xnorpopcountmatmul:[5,1,1,""]},"finn.custom_op.xnorpopcount.XnorPopcountMatMul":{execute_node:[5,4,1,""],get_nodeattr_types:[5,4,1,""],infer_node_datatype:[5,4,1,""],make_shape_compatible_op:[5,4,1,""],verify_node:[5,4,1,""]},"finn.transformation":{Transformation:[7,2,1,""],batchnorm_to_affine:[7,0,0,"-"],bipolar_to_xnor:[7,0,0,"-"],fold_constants:[7,0,0,"-"],fpgadataflow:[8,0,0,"-"],general:[7,0,0,"-"],infer_datatypes:[7,0,0,"-"],infer_shapes:[7,0,0,"-"],streamline:[9,0,0,"-"]},"finn.transformation.Transformation":{apply:[7,4,1,""]},"finn.transformation.batchnorm_to_affine":{BatchNormToAffine:[7,2,1,""]},"finn.transformation.batchnorm_to_affine.BatchNormToAffine":{apply:[7,4,1,""]},"finn.transformation.bipolar_to_xnor":{ConvertBipolarMatMulToXnorPopcount:[7,2,1,""]},"finn.transformation.bipolar_to_xnor.ConvertBipolarMatMulToXnorPopcount":{apply:[7,4,1,""]},"finn.transformation.fold_constants":{FoldConstants:[7,2,1,""]},"finn.transformation.fold_constants.FoldConstants":{apply:[7,4,1,""]},"finn.transformation.fpgadataflow":{cleanup:[8,0,0,"-"],codegen_ipgen:[8,0,0,"-"],codegen_ipstitch:[8,0,0,"-"],codegen_npysim:[8,0,0,"-"],compile:[8,0,0,"-"],convert_to_hls_layers:[8,0,0,"-"],create_dataflow_partition:[8,0,0,"-"],hlssynth_ipgen:[8,0,0,"-"],insert_tlastmarker:[8,0,0,"-"],make_deployment:[8,0,0,"-"],make_pynq_driver:[8,0,0,"-"],make_pynq_proj:[8,0,0,"-"],synth_pynq_proj:[8,0,0,"-"],templates:[8,0,0,"-"]},"finn.transformation.fpgadataflow.cleanup":{CleanUp:[8,2,1,""]},"finn.transformation.fpgadataflow.cleanup.CleanUp":{apply:[8,4,1,""]},"finn.transformation.fpgadataflow.codegen_ipgen":{CodeGen_ipgen:[8,2,1,""]},"finn.transformation.fpgadataflow.codegen_ipgen.CodeGen_ipgen":{apply:[8,4,1,""]},"finn.transformation.fpgadataflow.codegen_ipstitch":{CodeGen_ipstitch:[8,2,1,""]},"finn.transformation.fpgadataflow.codegen_ipstitch.CodeGen_ipstitch":{apply:[8,4,1,""]},"finn.transformation.fpgadataflow.codegen_npysim":{CodeGen_npysim:[8,2,1,""]},"finn.transformation.fpgadataflow.codegen_npysim.CodeGen_npysim":{apply:[8,4,1,""]},"finn.transformation.fpgadataflow.compile":{Compile:[8,2,1,""]},"finn.transformation.fpgadataflow.compile.Compile":{apply:[8,4,1,""]},"finn.transformation.fpgadataflow.convert_to_hls_layers":{InferBinaryStreamingFCLayer:[8,2,1,""]},"finn.transformation.fpgadataflow.convert_to_hls_layers.InferBinaryStreamingFCLayer":{apply:[8,4,1,""]},"finn.transformation.fpgadataflow.create_dataflow_partition":{CreateDataflowPartition:[8,2,1,""]},"finn.transformation.fpgadataflow.create_dataflow_partition.CreateDataflowPartition":{apply:[8,4,1,""]},"finn.transformation.fpgadataflow.hlssynth_ipgen":{HLSSynth_IPGen:[8,2,1,""]},"finn.transformation.fpgadataflow.hlssynth_ipgen.HLSSynth_IPGen":{apply:[8,4,1,""]},"finn.transformation.fpgadataflow.insert_tlastmarker":{InsertTLastMarker:[8,2,1,""]},"finn.transformation.fpgadataflow.insert_tlastmarker.InsertTLastMarker":{apply:[8,4,1,""]},"finn.transformation.fpgadataflow.make_deployment":{DeployToPYNQ:[8,2,1,""]},"finn.transformation.fpgadataflow.make_deployment.DeployToPYNQ":{apply:[8,4,1,""]},"finn.transformation.fpgadataflow.make_pynq_driver":{MakePYNQDriver:[8,2,1,""]},"finn.transformation.fpgadataflow.make_pynq_driver.MakePYNQDriver":{apply:[8,4,1,""]},"finn.transformation.fpgadataflow.make_pynq_proj":{MakePYNQProject:[8,2,1,""]},"finn.transformation.fpgadataflow.make_pynq_proj.MakePYNQProject":{apply:[8,4,1,""]},"finn.transformation.fpgadataflow.synth_pynq_proj":{SynthPYNQProject:[8,2,1,""]},"finn.transformation.fpgadataflow.synth_pynq_proj.SynthPYNQProject":{apply:[8,4,1,""]},"finn.transformation.general":{ConvertSubToAdd:[7,2,1,""],GiveRandomTensorNames:[7,2,1,""],GiveReadableTensorNames:[7,2,1,""],GiveUniqueNodeNames:[7,2,1,""]},"finn.transformation.general.ConvertSubToAdd":{apply:[7,4,1,""]},"finn.transformation.general.GiveRandomTensorNames":{apply:[7,4,1,""]},"finn.transformation.general.GiveReadableTensorNames":{apply:[7,4,1,""]},"finn.transformation.general.GiveUniqueNodeNames":{apply:[7,4,1,""]},"finn.transformation.infer_datatypes":{InferDataTypes:[7,2,1,""]},"finn.transformation.infer_datatypes.InferDataTypes":{apply:[7,4,1,""]},"finn.transformation.infer_shapes":{InferShapes:[7,2,1,""]},"finn.transformation.infer_shapes.InferShapes":{apply:[7,4,1,""]},"finn.transformation.streamline":{Streamline:[9,2,1,""],absorb:[9,0,0,"-"],collapse_repeated:[9,0,0,"-"],reorder:[9,0,0,"-"],round_thresholds:[9,0,0,"-"],sign_to_thres:[9,0,0,"-"]},"finn.transformation.streamline.Streamline":{apply:[9,4,1,""]},"finn.transformation.streamline.absorb":{Absorb1BitMulIntoMatMul:[9,2,1,""],AbsorbAddIntoMultiThreshold:[9,2,1,""],AbsorbMulIntoMultiThreshold:[9,2,1,""],FactorOutMulSignMagnitude:[9,2,1,""]},"finn.transformation.streamline.absorb.Absorb1BitMulIntoMatMul":{apply:[9,4,1,""]},"finn.transformation.streamline.absorb.AbsorbAddIntoMultiThreshold":{apply:[9,4,1,""]},"finn.transformation.streamline.absorb.AbsorbMulIntoMultiThreshold":{apply:[9,4,1,""]},"finn.transformation.streamline.absorb.FactorOutMulSignMagnitude":{apply:[9,4,1,""]},"finn.transformation.streamline.collapse_repeated":{CollapseRepeatedAdd:[9,2,1,""],CollapseRepeatedMul:[9,2,1,""],CollapseRepeatedOp:[9,2,1,""]},"finn.transformation.streamline.collapse_repeated.CollapseRepeatedOp":{apply:[9,4,1,""]},"finn.transformation.streamline.reorder":{MoveAddPastMul:[9,2,1,""],MoveScalarAddPastMatMul:[9,2,1,""],MoveScalarMulPastMatMul:[9,2,1,""]},"finn.transformation.streamline.reorder.MoveAddPastMul":{apply:[9,4,1,""]},"finn.transformation.streamline.reorder.MoveScalarAddPastMatMul":{apply:[9,4,1,""]},"finn.transformation.streamline.reorder.MoveScalarMulPastMatMul":{apply:[9,4,1,""]},"finn.transformation.streamline.round_thresholds":{RoundAndClipThresholds:[9,2,1,""]},"finn.transformation.streamline.round_thresholds.RoundAndClipThresholds":{apply:[9,4,1,""]},"finn.transformation.streamline.sign_to_thres":{ConvertSignToThres:[9,2,1,""]},"finn.transformation.streamline.sign_to_thres.ConvertSignToThres":{apply:[9,4,1,""]},"finn.util":{basic:[10,0,0,"-"],data_packing:[10,0,0,"-"],fpgadataflow:[10,0,0,"-"],onnx:[10,0,0,"-"],test:[10,0,0,"-"]},"finn.util.basic":{CppBuilder:[10,2,1,""],calculate_signed_dot_prod_range:[10,1,1,""],gen_finn_dt_tensor:[10,1,1,""],get_by_name:[10,1,1,""],get_finn_root:[10,1,1,""],interleave_matrix_outer_dim_from_partitions:[10,1,1,""],make_build_dir:[10,1,1,""],pad_tensor_to_multiple_of:[10,1,1,""],random_string:[10,1,1,""],remove_by_name:[10,1,1,""],roundup_to_integer_multiple:[10,1,1,""]},"finn.util.basic.CppBuilder":{append_includes:[10,4,1,""],append_sources:[10,4,1,""],build:[10,4,1,""],set_executable_path:[10,4,1,""]},"finn.util.data_packing":{array2hexstring:[10,1,1,""],finnpy_to_packed_bytearray:[10,1,1,""],hexstring2npbytearray:[10,1,1,""],npbytearray2hexstring:[10,1,1,""],npy_to_rtlsim_input:[10,1,1,""],numpy_to_hls_code:[10,1,1,""],pack_innermost_dim_as_hex_string:[10,1,1,""],packed_bytearray_to_finnpy:[10,1,1,""],rtlsim_output_to_npy:[10,1,1,""],unpack_innermost_dim_from_hex_string:[10,1,1,""]},"finn.util.fpgadataflow":{IPGenBuilder:[10,2,1,""],pyverilate_stitched_ip:[10,1,1,""]},"finn.util.fpgadataflow.IPGenBuilder":{append_tcl:[10,4,1,""],build:[10,4,1,""],set_ipgen_path:[10,4,1,""]},"finn.util.onnx":{valueinfo_to_tensor:[10,1,1,""]},"finn.util.test":{get_test_model_def_fxn:[10,1,1,""],get_test_model_trained:[10,1,1,""],get_test_model_untrained:[10,1,1,""],get_trained_checkpoint:[10,1,1,""]},finn:{analysis:[2,0,0,"-"],core:[4,0,0,"-"],custom_op:[5,0,0,"-"],transformation:[7,0,0,"-"],util:[10,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","function","Python function"],"2":["py","class","Python class"],"3":["py","attribute","Python attribute"],"4":["py","method","Python method"]},objtypes:{"0":"py:module","1":"py:function","2":"py:class","3":"py:attribute","4":"py:method"},terms:{"0f01":10,"0x07":10,"0x0e":10,"0x0f01":10,"0xb":10,"0xe":10,"600px":[],"abstract":[5,6,7],"boolean":4,"class":[4,5,6,7,8,9,10],"const":7,"default":[5,6,7],"enum":4,"final":4,"float":10,"function":[4,7,10,11],"new":[4,11],"return":[2,3,4,5,6,7,9,10],"static":2,"true":[4,10],"try":11,"var":6,For:9,HLS:[4,12],IPs:8,PEs:6,The:[2,4,7,8,9,10,11,12],There:11,Use:10,abc:[5,7],abit:10,about:[2,8,12],absorb1bitmulintomatmul:9,absorb:[1,7,8],absorbaddintomultithreshold:9,absorbmulintomultithreshold:9,acceler:[8,11,12],account:4,action:8,activ:4,add:[7,9],adding:11,addition:9,address:8,after:10,aim:9,align:[],all:[2,4,5,6,7,8,10,11],all_tensors_f32:2,allow:4,alreadi:8,also:[5,6,8],amount:10,analysi:[1,4],analysis_fxn:4,anaylsis_fxn:4,ani:[4,7,8,10],annot:[2,5,6],anoth:8,append_includ:10,append_sourc:10,append_tcl:10,appli:[4,7,8,9],apply_rep:7,appropri:[7,11],arbitrari:10,architectur:12,around:4,arrai:10,array2hexstr:10,arxiv:9,assign:4,associ:[4,7],assum:10,attribut:[2,5,6,8],attribute_nam:[5,6],attributeproto:[5,6],backend:8,base:[4,5,6,7,8,9,10],basic:1,batchnorm:7,batchnorm_to_affin:1,batchnormtoaffin:7,been:8,befor:10,between:[6,10],binari:[4,6,8,9,10],bipolar:[4,6,7,9,10],bipolar_to_xnor:1,bit:[4,10],bitfil:11,bitwidth:4,blackboxfunct:6,block:8,blott:6,board:8,bool:[2,7],both:10,bram_estim:6,brevita:12,brien:6,build:10,built:2,calc_tmem:6,calc_wmem:6,calcul:6,calculate_signed_dot_prod_rang:10,call:[4,6,7,8,11],can:[4,7,8,9,10,11,12],cannot:7,center:[],centerpiec:12,certain:2,chang:[4,7],check:[2,4,5,6],check_all_tensor_shapes_specifi:4,check_compat:4,cleanup:[1,7],clk:[6,8],clone:10,code:[8,10],code_gen_dir:10,code_generation_ipgen:6,code_generation_npysim:6,codegen_ipgen:[1,7],codegen_ipstitch:[1,7],codegen_npysim:[1,7],collaps:9,collapse_rep:[1,7],collapserepeatedadd:9,collapserepeatedmul:9,collapserepeatedop:9,collect:[8,11],colloqui:12,come:2,compar:[4,5],compare_execut:4,compare_fxn:4,compat:[4,5,6],compil:[1,7,12],compile_singlenode_cod:6,compon:12,comput:4,consecut:9,constant:[2,4,9],construct:12,consum:4,contain:[4,5,8,10,12],content:[],context:[4,5,6],convent:2,convert:[6,7,8,9,10,11],convert_to_hls_lay:[1,7],convertbipolarmatmultoxnorpopcount:7,convertsigntothr:9,convertsubtoadd:7,convolutioninputgener:[1,5],copi:[4,7,8],core:1,corner:12,correct:7,correctli:[2,5,6,8,11],correspond:[4,5,6,12],count:6,cpp_file:10,cppbuilder:10,creat:[4,8,10],create_dataflow_partit:[1,7],createdataflowpartit:8,current:[4,12],custom:[2,4,11,12],custom_op:1,customop:[5,6],data:[5,8,10],data_pack:1,dataflow:[4,8,12],dataoutstrm:6,datatyp:[1,5,6,7,10],debug:4,declar:7,deep:[4,6,7,12],default_v:[5,6],default_valu:[5,6],defin:6,deploi:11,deploy:8,deploytopynq:8,design:[8,11,12],detail:12,develop:11,dict:[4,5,6],dictionari:[2,4],digit:10,dimens:10,dimension:10,dir:[8,10],directori:[8,10,11],distr_pad:10,divis:10,dnn:12,doc:12,docker:10,dockerfil:11,docomput:6,doe:11,don:7,done:2,dot:10,down:11,driver:8,dt_a:10,dt_b:10,dtype:[2,4,5,6,10],dynam:2,dynamic_input_to_npi:6,each:[2,4,7,9,10,12],effect:7,element:10,embed:4,emit:10,emphasi:12,empti:4,end:6,ensur:[6,7,8,10],enumer:[4,7],environ:11,equal:[5,6],equival:9,estim:3,even:7,evenli:10,everi:7,everyth:11,exampl:[10,11],excel:11,exec_precompiled_singlenode_model:6,execut:[4,5,6],execute_custom_nod:1,execute_nod:[4,5,6],execute_onnx:4,execute_onnx_and_make_model:4,exist:[5,10],exit:10,expect:[2,4,5,6,8],experi:12,experiment:12,explor:[4,6,12],expos:4,extens:11,extra:[2,10],extract:[2,3],factor:10,factoroutmulsignmagnitud:9,fals:[4,7,10],familiar:11,fan:2,fast:6,fewest:4,field:[8,10],file:[4,8,10],filenam:[4,8],find:4,find_consum:4,find_produc:4,finn:[],finn_dt:10,finnpy_to_packed_bytearrai:10,first:[2,9],fix:[7,10],flatten:10,float32:[2,4],flow:[],fold_const:1,foldconst:7,folder:[8,10],follow:[2,8,11,12],form:6,found:[8,12],four:10,fpga:[11,12],fpgadataflow:[1,2,5,7],fpgapart:[6,8],framework:[6,12],fraser:6,from:[3,4,8,10,12],full:4,further:7,gambardella:6,gen_finn_dt_tensor:10,gener:[1,8,10,12],generate_param:6,get:[4,5],get_all_tensor_nam:4,get_by_nam:10,get_finn_root:10,get_folded_input_shap:6,get_folded_output_shap:6,get_hls_compatible_threshold_tensor:6,get_hls_compatible_weight_tensor:6,get_hls_datatype_str:4,get_initi:4,get_input_datatyp:6,get_instream_width:6,get_metadata_prop:4,get_nodeattr:5,get_nodeattr_typ:[5,6],get_num_possible_valu:4,get_number_output_valu:6,get_output_datatyp:6,get_outstream_width:6,get_per_tensor_fanout:2,get_smallest_poss:4,get_stream_width:6,get_template_param_valu:6,get_tensor_datatyp:4,get_tensor_fanout:4,get_tensor_shap:4,get_tensor_valueinfo:4,get_test_model_def_fxn:10,get_test_model_train:10,get_test_model_untrain:10,get_trained_checkpoint:10,get_weight_datatyp:6,getcustomop:5,github:12,give:[7,9],give_unique_node_nam:7,given:[2,3,4,5,6,10],giverandomtensornam:7,givereadabletensornam:7,giveuniquenodenam:7,global_includ:6,graph:[2,4,5,6,7,8],graphic:12,guarante:7,guid:1,hand:12,has:[2,4,7,8,10],have:[2,4,7,8,9,11],height:[],help:11,hex:10,hexstr:10,hexstring2npbytearrai:10,high:11,highli:12,hls_synth_res_estim:[1,2],hls_var_nam:10,hlscustomop:6,hlslib:[6,12],hlssynth_ipgen:[1,7],homepag:12,host:10,how:[1,10],human:7,imag:[],img:[],immedi:8,implement:4,includ:[4,8,12],index:[],indic:[4,5,6,7,8],infer:[4,5,6,7,10,11,12],infer_datatyp:1,infer_node_datatyp:[5,6],infer_shap:1,inferbinarystreamingfclay:8,inferdatatyp:7,infershap:7,infinit:7,info:[7,10],info_messag:2,inform:[2,8],infrastructur:8,inherit:7,initi:[2,4],innermost:10,inp0:5,inp1:5,inp:6,input:[2,4,5,6,7,9,10],input_dict:4,input_dtyp:10,input_fil:10,insert:[8,10],insert_tlastmark:[1,7],inserttlastmark:8,insid:5,instal:11,instanc:[4,5,6,9],instanti:8,instead:10,int16:4,int2:4,int32:4,int3:4,int4:4,int8:4,integ:[4,9,10],intend:12,interfac:8,interleav:6,interleave_matrix_outer_dim_from_partit:10,intermedi:[4,7],intern:7,ipgen_singlenode_cod:6,ipgenbuild:10,is_integ:4,is_linear:2,item:10,jupyt:12,kei:4,know:7,lab:12,lambda:4,largest:4,launch:11,layer:[7,8],lead:10,learn:[6,12],leeser:6,len:10,let:7,letter:10,librari:12,library_path:10,like:12,linear:[2,4],link:12,list:[2,4],locat:11,look:2,loop:7,lut_estim:6,made:[4,7],magnitud:9,make:[7,8],make_build_dir:10,make_collapsed_param_fxn:9,make_deepcopi:4,make_deploy:[1,7],make_empty_exec_context:4,make_new_valueinfo_nam:4,make_project:8,make_pynq_driv:[1,7],make_pynq_proj:[1,7],make_shape_compatible_op:[5,6],makepynqdriv:8,makepynqproject:8,mani:11,manipul:4,manual:7,matmul:[7,9],matrix:[6,9,10],max:[4,10],mean:10,meant:7,member:[5,6],metadata_prop:[4,8],min:[4,10],minimum:10,mixtur:2,mkdtemp:10,mode:11,model:[2,3,4,5,6,7,8,9,10],model_a:4,model_b:4,model_was_chang:7,modelproto:[4,8],modelwrapp:[1,2,7],modul:[],more:[4,7,10,12],move:9,moveaddpastmul:9,movescalaraddpastmatmul:9,movescalarmulpastmatmul:9,mul:[7,9],multidimension:10,multipl:[7,9,10],multipli:9,multithreshold:[1,8,9],must:[5,7,8,9,10],mvtu:8,n_partit:10,n_thres_step:6,name:[2,3,4,5,7,10],name_field:10,ndarrai:10,nearest:[9,10],necessari:8,need:[3,5,6,7],neg:[4,9],netnam:10,network:[6,11,12],neural:[6,12],new_nam:4,next:9,no_decl:10,node:[2,3,4,5,6,7,8,9],node_inputs_in_expected_ord:2,node_res_estim:6,non:8,none:[4,5,10],notebook:12,notwithstand:2,now:[2,4],npbytearrai:10,npbytearray2hexstr:10,npy:10,npy_to_dynamic_output:6,npy_to_rtlsim_input:10,number:[4,5,6,10],numpi:[6,10],numpy_to_hls_cod:10,object:[4,10],old_nam:4,onc:7,one:[2,4,8,10],onli:[2,4,7,8,9],onlin:11,onnx:[1,4,5,6,8],onnx_exec:1,onnx_model_proto:4,onnx_nod:[5,6],onnxruntim:4,op_nam:9,op_typ:2,oper:[4,9],ops:[2,9],order:2,orig_thres_matrix:6,orig_weight_matrix:6,origin:6,other:[4,9],otherwis:[4,7,10],out:2,out_bia:5,out_scal:5,out_shap:10,outcom:8,output:[4,5,6,7,10],output_shap:10,overlai:8,overview:12,own:11,pack:[8,10],pack_innermost_dim:10,pack_innermost_dim_as_hex_str:10,packag:[],packed_bytearrai:10,packed_bytearray_to_finnpi:10,packedbit:10,pad:10,pad_tensor_to_multiple_of:10,pad_to_dim:10,pad_to_nbit:10,page:[],pair:8,paramet:9,part:[5,10],particular:[5,6,10],partit:4,pass:[1,6],password:8,past:9,path:[6,10],per:8,perform:[5,6,11],permit:[5,6],place:8,platform:8,png:[],point:[7,11],posit:[6,9,10],possibl:[4,8],pragma:6,preced:9,precid:9,precis:10,precomput:7,prefer:4,prefix:10,prepend:10,preusser:6,previous:8,prior:[7,8,10],process:11,produc:[2,4],product:10,project:[8,12],properti:[2,4],provid:[4,11],pushbutton:11,pynq:8,pynq_driver_dir:8,python:[8,10,11],pyveril:10,pyverilate_stitched_ip:10,qnn:[11,12],quantiz:[2,6,12],random:[7,10],random_str:10,randomli:10,rather:[11,12],reach:7,read:12,read_npy_data:6,readabl:7,readthedoc:[],recommend:7,refer:12,registri:1,relat:12,remot:4,remov:[8,10],remove_by_nam:10,remove_prefix:10,renam:4,rename_tensor:4,reorder:[1,7],repeat:[7,9],repeatedli:4,replac:7,repositori:[11,12],repositroi:[],repres:[4,10],represent:10,requir:[4,5,6],res_estim:[1,2],research:12,reset_rtlsim:6,reshap:6,resourc:[3,11],respect:10,result:[2,3,4,7,8,9,10],return_full_exec_context:4,returned_dict:[5,6],revers:10,reverse_endian:10,reverse_inn:10,right:12,root:[10,11],round:[9,10],round_threshold:[1,7],roundandclipthreshold:9,roundup_to_integer_multipl:10,row:6,rtlsim:[4,6],rtlsim_output_to_npi:10,run:[4,8],same:[8,10],save:[4,10],save_as_npi:6,scalar:9,scale:[],scp:8,script:[8,11],search:[],second:[8,9],see:[9,10],seen:12,sep:6,separ:12,sequenc:10,set:[4,5,6,8,9,10],set_attribut:[],set_executable_path:10,set_initi:4,set_ipgen_path:10,set_metadata_prop:4,set_nodeattr:5,set_sim_mod:[1,7],set_tensor_datatyp:4,set_tensor_shap:4,setsimmod:[],settings64:11,sever:11,shape:[4,5,6,7,10],shell:8,should:[2,4,7,11],sign:[4,7,9,10],sign_to_thr:[1,7],sim:[6,10],sim_mod:[],simd:6,sinc:[4,10],singl:[4,9,10,11],small:2,smallest:4,some:[4,7,12],space:12,specif:12,specifi:[4,7,10],split:[8,9,10],standard:[4,5,6],stitch:[8,10],store:[5,8,10],streamingdataflowpartit:[1,8],streamingfclayer_batch:[1,5,8],streamingmaxpool_batch:[1,5],streamlin:[1,7],string:[2,10],stringlength:10,strm_decl:6,structur:2,style:12,sub:7,subdirectori:8,subgraph:4,submodul:1,subpackag:[],subset:2,success:8,suitabl:6,surviv:10,synth_pynq_proj:[1,7],synthesi:[3,8],synthpynqproject:8,take:[2,4,7,9,10,11],taken:[4,8,12],target:[8,12],target_dir:8,targetbit:10,tcl:8,tcl_script:10,tempfil:10,templat:[1,5,7],temporari:10,tensor:[2,4,7,9,10],tensor_fanout:2,tensor_nam:[2,4],tensor_shap:[4,10],tensor_valu:4,termin:8,ternari:4,test:[1,7],thei:9,them:[2,8,9],thi:[2,4,5,6,7,8,10,11,12],thing:12,thought:11,threshold:[5,6,9],time:7,tlastmark:[1,5,8],tmem:6,togeth:8,toggle_clk:6,tool:[11,12],topolog:1,train:[11,12],transform:[1,4],transformed_model:7,travers:2,tupl:7,two:[4,8,9,10,12],type:[4,7,10],ubuntu:11,uint16:4,uint2:[4,10],uint32:4,uint3:4,uint4:4,uint8:[4,10],umuroglu:6,under:[8,12],uniqu:7,unpack:[8,10],unpack_innermost_dim_from_hex_str:10,unsign:[4,9],until:4,updat:9,upper:12,use:12,used:[4,5,6,10,12],useful:4,user:7,usernam:8,using:[4,7,9,10,12],util:[1,4,5,6],val:10,valu:[4,5,6,8,9,10],value_info:4,valueinfo:[4,7],valueinfo_to_tensor:10,valueinfoproto:[4,10],variabl:[10,11],vector:[9,10],verif:2,verifi:[2,5,6],verify_custom_nod:1,verify_nod:[2,5,6],via:4,view:12,visser:6,vivado:[3,4,8,11,12],vivado_path:11,vivado_pynq_proj:8,vivado_stitch_proj:8,wai:[2,11],want:9,wbit:10,websit:12,weight:[4,6],well:11,when:[2,7],where:[4,5,6,8,9,11],whether:[2,4,5,6,7],which:[4,5,6,8,9,10,12],width:10,wmem:6,work:[4,10,11],wrapper:4,write:[1,11],xdnn:12,xilinx:12,xnorpopcount:1,xnorpopcountmatmul:[5,7,8],you:[7,11],your:[7,11],zero:[4,9,10]},titles:["FINN - End-to-End Flow","finn package","finn.analysis package","finn.analysis.fpgadataflow package","finn.core package","finn.custom_op package","finn.custom_op.fpgadataflow package","finn.transformation package","finn.transformation.fpgadataflow package","finn.transformation.streamline package","finn.util package","Getting Started","FINN","src","Source Code"],titleterms:{absorb:9,analysi:[2,3],basic:10,batchnorm_to_affin:7,bipolar_to_xnor:7,cleanup:8,code:14,codegen_ipgen:8,codegen_ipstitch:8,codegen_npysim:8,collapse_rep:9,compil:[8,11],content:[1,2,3,4,5,6,7,8,9,10],convert_to_hls_lay:8,convolutioninputgener:6,core:4,create_dataflow_partit:8,custom_op:[5,6],data_pack:10,datatyp:4,docker:11,document:[],end:0,execute_custom_nod:4,finn:[0,1,2,3,4,5,6,7,8,9,10,11,12],flow:0,fold_const:7,fpgadataflow:[3,6,8,10],gener:7,get:11,guid:7,hls_synth_res_estim:3,hlssynth_ipgen:8,how:[2,11],indic:[],infer_datatyp:7,infer_shap:7,insert_tlastmark:8,make_deploy:8,make_pynq_driv:8,make_pynq_proj:8,modelwrapp:4,modul:[1,2,3,4,5,6,7,8,9,10],multithreshold:5,onnx:10,onnx_exec:4,packag:[1,2,3,4,5,6,7,8,9,10],pass:2,registri:5,reorder:9,requir:11,res_estim:3,round_threshold:9,run:11,set_sim_mod:8,sign_to_thr:9,sourc:14,src:13,start:11,streamingdataflowpartit:5,streamingfclayer_batch:6,streamingmaxpool_batch:6,streamlin:9,submodul:[2,3,4,5,6,7,8,9,10],subpackag:[1,2,5,7],synth_pynq_proj:8,tabl:[],templat:[6,8],test:10,tlastmark:6,topolog:2,transform:[7,8,9],use:11,util:10,verify_custom_nod:2,welcom:[],what:12,write:[2,7],xnorpopcount:5}}) \ No newline at end of file +Search.setIndex({docnames:["end_to_end_flow","finn","finn.analysis","finn.analysis.fpgadataflow","finn.core","finn.custom_op","finn.custom_op.fpgadataflow","finn.transformation","finn.transformation.fpgadataflow","finn.transformation.streamline","finn.util","getting_started","index","modules","source_code"],envversion:{"sphinx.domains.c":1,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":1,"sphinx.domains.javascript":1,"sphinx.domains.math":2,"sphinx.domains.python":1,"sphinx.domains.rst":1,"sphinx.domains.std":1,sphinx:56},filenames:["end_to_end_flow.rst","finn.rst","finn.analysis.rst","finn.analysis.fpgadataflow.rst","finn.core.rst","finn.custom_op.rst","finn.custom_op.fpgadataflow.rst","finn.transformation.rst","finn.transformation.fpgadataflow.rst","finn.transformation.streamline.rst","finn.util.rst","getting_started.rst","index.rst","modules.rst","source_code.rst"],objects:{"":{finn:[1,0,0,"-"]},"finn.analysis":{fpgadataflow:[3,0,0,"-"],topology:[2,0,0,"-"],verify_custom_nodes:[2,0,0,"-"]},"finn.analysis.fpgadataflow":{hls_synth_res_estimation:[3,0,0,"-"],res_estimation:[3,0,0,"-"]},"finn.analysis.fpgadataflow.hls_synth_res_estimation":{hls_synth_res_estimation:[3,1,1,""]},"finn.analysis.fpgadataflow.res_estimation":{res_estimation:[3,1,1,""]},"finn.analysis.topology":{all_tensors_f32:[2,1,1,""],get_per_tensor_fanouts:[2,1,1,""],is_linear:[2,1,1,""],node_inputs_in_expected_order:[2,1,1,""]},"finn.analysis.verify_custom_nodes":{verify_nodes:[2,1,1,""]},"finn.core":{datatype:[4,0,0,"-"],execute_custom_node:[4,0,0,"-"],modelwrapper:[4,0,0,"-"],onnx_exec:[4,0,0,"-"]},"finn.core.datatype":{DataType:[4,2,1,""]},"finn.core.datatype.DataType":{BINARY:[4,3,1,""],BIPOLAR:[4,3,1,""],FLOAT32:[4,3,1,""],INT16:[4,3,1,""],INT2:[4,3,1,""],INT32:[4,3,1,""],INT3:[4,3,1,""],INT4:[4,3,1,""],INT8:[4,3,1,""],TERNARY:[4,3,1,""],UINT16:[4,3,1,""],UINT2:[4,3,1,""],UINT32:[4,3,1,""],UINT3:[4,3,1,""],UINT4:[4,3,1,""],UINT8:[4,3,1,""],allowed:[4,4,1,""],bitwidth:[4,4,1,""],get_hls_datatype_str:[4,4,1,""],get_num_possible_values:[4,4,1,""],get_smallest_possible:[4,4,1,""],is_integer:[4,4,1,""],max:[4,4,1,""],min:[4,4,1,""],signed:[4,4,1,""]},"finn.core.execute_custom_node":{execute_custom_node:[4,1,1,""]},"finn.core.modelwrapper":{ModelWrapper:[4,2,1,""]},"finn.core.modelwrapper.ModelWrapper":{analysis:[4,4,1,""],check_all_tensor_shapes_specified:[4,4,1,""],check_compatibility:[4,4,1,""],find_consumer:[4,4,1,""],find_producer:[4,4,1,""],get_all_tensor_names:[4,4,1,""],get_initializer:[4,4,1,""],get_metadata_prop:[4,4,1,""],get_tensor_datatype:[4,4,1,""],get_tensor_fanout:[4,4,1,""],get_tensor_shape:[4,4,1,""],get_tensor_valueinfo:[4,4,1,""],graph:[4,4,1,""],make_empty_exec_context:[4,4,1,""],make_new_valueinfo_name:[4,4,1,""],model:[4,4,1,""],rename_tensor:[4,4,1,""],save:[4,4,1,""],set_initializer:[4,4,1,""],set_metadata_prop:[4,4,1,""],set_tensor_datatype:[4,4,1,""],set_tensor_shape:[4,4,1,""],transform:[4,4,1,""]},"finn.core.onnx_exec":{compare_execution:[4,1,1,""],execute_node:[4,1,1,""],execute_onnx:[4,1,1,""],execute_onnx_and_make_model:[4,1,1,""]},"finn.custom_op":{CustomOp:[5,2,1,""],fpgadataflow:[6,0,0,"-"],multithreshold:[5,0,0,"-"],registry:[5,0,0,"-"],streamingdataflowpartition:[5,0,0,"-"],xnorpopcount:[5,0,0,"-"]},"finn.custom_op.CustomOp":{execute_node:[5,4,1,""],get_nodeattr:[5,4,1,""],get_nodeattr_types:[5,4,1,""],infer_node_datatype:[5,4,1,""],make_shape_compatible_op:[5,4,1,""],set_nodeattr:[5,4,1,""],verify_node:[5,4,1,""]},"finn.custom_op.fpgadataflow":{HLSCustomOp:[6,2,1,""],convolutioninputgenerator:[6,0,0,"-"],streamingfclayer_batch:[6,0,0,"-"],streamingmaxpool_batch:[6,0,0,"-"],templates:[6,0,0,"-"],tlastmarker:[6,0,0,"-"]},"finn.custom_op.fpgadataflow.HLSCustomOp":{blackboxfunction:[6,4,1,""],bram_estimation:[6,4,1,""],code_generation_ipgen:[6,4,1,""],code_generation_npysim:[6,4,1,""],compile_singlenode_code:[6,4,1,""],dataoutstrm:[6,4,1,""],defines:[6,4,1,""],docompute:[6,4,1,""],dynamic_input_to_npy:[6,4,1,""],exec_precompiled_singlenode_model:[6,4,1,""],execute_node:[6,4,1,""],generate_params:[6,4,1,""],get_folded_input_shape:[6,4,1,""],get_folded_output_shape:[6,4,1,""],get_instream_width:[6,4,1,""],get_nodeattr_types:[6,4,1,""],get_number_output_values:[6,4,1,""],get_outstream_width:[6,4,1,""],global_includes:[6,4,1,""],ipgen_singlenode_code:[6,4,1,""],lut_estimation:[6,4,1,""],node_res_estimation:[6,4,1,""],npy_to_dynamic_output:[6,4,1,""],pragmas:[6,4,1,""],read_npy_data:[6,4,1,""],reset_rtlsim:[6,4,1,""],rtlsim:[6,4,1,""],save_as_npy:[6,4,1,""],strm_decl:[6,4,1,""],toggle_clk:[6,4,1,""]},"finn.custom_op.fpgadataflow.convolutioninputgenerator":{ConvolutionInputGenerator:[6,2,1,""]},"finn.custom_op.fpgadataflow.convolutioninputgenerator.ConvolutionInputGenerator":{blackboxfunction:[6,4,1,""],bram_estimation:[6,4,1,""],dataoutstrm:[6,4,1,""],defines:[6,4,1,""],docompute:[6,4,1,""],execute_node:[6,4,1,""],get_input_datatype:[6,4,1,""],get_nodeattr_types:[6,4,1,""],get_number_output_values:[6,4,1,""],get_output_datatype:[6,4,1,""],get_stream_width:[6,4,1,""],global_includes:[6,4,1,""],infer_node_datatype:[6,4,1,""],lut_estimation:[6,4,1,""],make_shape_compatible_op:[6,4,1,""],pragmas:[6,4,1,""],read_npy_data:[6,4,1,""],save_as_npy:[6,4,1,""],strm_decl:[6,4,1,""],verify_node:[6,4,1,""]},"finn.custom_op.fpgadataflow.streamingfclayer_batch":{StreamingFCLayer_Batch:[6,2,1,""]},"finn.custom_op.fpgadataflow.streamingfclayer_batch.StreamingFCLayer_Batch":{blackboxfunction:[6,4,1,""],bram_estimation:[6,4,1,""],calc_tmem:[6,4,1,""],calc_wmem:[6,4,1,""],dataoutstrm:[6,4,1,""],defines:[6,4,1,""],docompute:[6,4,1,""],execute_node:[6,4,1,""],generate_params:[6,4,1,""],get_folded_input_shape:[6,4,1,""],get_folded_output_shape:[6,4,1,""],get_hls_compatible_threshold_tensor:[6,4,1,""],get_hls_compatible_weight_tensor:[6,4,1,""],get_input_datatype:[6,4,1,""],get_instream_width:[6,4,1,""],get_nodeattr_types:[6,4,1,""],get_number_output_values:[6,4,1,""],get_output_datatype:[6,4,1,""],get_outstream_width:[6,4,1,""],get_template_param_values:[6,4,1,""],get_weight_datatype:[6,4,1,""],global_includes:[6,4,1,""],infer_node_datatype:[6,4,1,""],lut_estimation:[6,4,1,""],make_shape_compatible_op:[6,4,1,""],pragmas:[6,4,1,""],read_npy_data:[6,4,1,""],save_as_npy:[6,4,1,""],strm_decl:[6,4,1,""],verify_node:[6,4,1,""]},"finn.custom_op.fpgadataflow.streamingmaxpool_batch":{StreamingMaxPool_Batch:[6,2,1,""]},"finn.custom_op.fpgadataflow.streamingmaxpool_batch.StreamingMaxPool_Batch":{blackboxfunction:[6,4,1,""],bram_estimation:[6,4,1,""],dataoutstrm:[6,4,1,""],defines:[6,4,1,""],docompute:[6,4,1,""],get_nodeattr_types:[6,4,1,""],get_number_output_values:[6,4,1,""],global_includes:[6,4,1,""],infer_node_datatype:[6,4,1,""],lut_estimation:[6,4,1,""],make_shape_compatible_op:[6,4,1,""],pragmas:[6,4,1,""],read_npy_data:[6,4,1,""],save_as_npy:[6,4,1,""],strm_decl:[6,4,1,""],verify_node:[6,4,1,""]},"finn.custom_op.fpgadataflow.tlastmarker":{TLastMarker:[6,2,1,""]},"finn.custom_op.fpgadataflow.tlastmarker.TLastMarker":{blackboxfunction:[6,4,1,""],dataoutstrm:[6,4,1,""],defines:[6,4,1,""],docompute:[6,4,1,""],execute_node:[6,4,1,""],get_folded_input_shape:[6,4,1,""],get_folded_output_shape:[6,4,1,""],get_instream_width:[6,4,1,""],get_nodeattr_types:[6,4,1,""],get_number_output_values:[6,4,1,""],get_outstream_width:[6,4,1,""],global_includes:[6,4,1,""],infer_node_datatype:[6,4,1,""],make_shape_compatible_op:[6,4,1,""],pragmas:[6,4,1,""],read_npy_data:[6,4,1,""],save_as_npy:[6,4,1,""],strm_decl:[6,4,1,""],verify_node:[6,4,1,""]},"finn.custom_op.multithreshold":{MultiThreshold:[5,2,1,""],compare:[5,1,1,""],multithreshold:[5,1,1,""]},"finn.custom_op.multithreshold.MultiThreshold":{execute_node:[5,4,1,""],get_nodeattr_types:[5,4,1,""],infer_node_datatype:[5,4,1,""],make_shape_compatible_op:[5,4,1,""],verify_node:[5,4,1,""]},"finn.custom_op.registry":{getCustomOp:[5,1,1,""]},"finn.custom_op.streamingdataflowpartition":{StreamingDataflowPartition:[5,2,1,""]},"finn.custom_op.streamingdataflowpartition.StreamingDataflowPartition":{execute_node:[5,4,1,""],get_nodeattr_types:[5,4,1,""],infer_node_datatype:[5,4,1,""],make_shape_compatible_op:[5,4,1,""],verify_node:[5,4,1,""]},"finn.custom_op.xnorpopcount":{XnorPopcountMatMul:[5,2,1,""],xnorpopcountmatmul:[5,1,1,""]},"finn.custom_op.xnorpopcount.XnorPopcountMatMul":{execute_node:[5,4,1,""],get_nodeattr_types:[5,4,1,""],infer_node_datatype:[5,4,1,""],make_shape_compatible_op:[5,4,1,""],verify_node:[5,4,1,""]},"finn.transformation":{Transformation:[7,2,1,""],batchnorm_to_affine:[7,0,0,"-"],bipolar_to_xnor:[7,0,0,"-"],fold_constants:[7,0,0,"-"],fpgadataflow:[8,0,0,"-"],general:[7,0,0,"-"],infer_datatypes:[7,0,0,"-"],infer_shapes:[7,0,0,"-"],streamline:[9,0,0,"-"]},"finn.transformation.Transformation":{apply:[7,4,1,""]},"finn.transformation.batchnorm_to_affine":{BatchNormToAffine:[7,2,1,""]},"finn.transformation.batchnorm_to_affine.BatchNormToAffine":{apply:[7,4,1,""]},"finn.transformation.bipolar_to_xnor":{ConvertBipolarMatMulToXnorPopcount:[7,2,1,""]},"finn.transformation.bipolar_to_xnor.ConvertBipolarMatMulToXnorPopcount":{apply:[7,4,1,""]},"finn.transformation.fold_constants":{FoldConstants:[7,2,1,""]},"finn.transformation.fold_constants.FoldConstants":{apply:[7,4,1,""]},"finn.transformation.fpgadataflow":{cleanup:[8,0,0,"-"],codegen_ipgen:[8,0,0,"-"],codegen_ipstitch:[8,0,0,"-"],codegen_npysim:[8,0,0,"-"],compile:[8,0,0,"-"],convert_to_hls_layers:[8,0,0,"-"],create_dataflow_partition:[8,0,0,"-"],hlssynth_ipgen:[8,0,0,"-"],insert_tlastmarker:[8,0,0,"-"],make_deployment:[8,0,0,"-"],make_pynq_driver:[8,0,0,"-"],make_pynq_proj:[8,0,0,"-"],synth_pynq_proj:[8,0,0,"-"],templates:[8,0,0,"-"]},"finn.transformation.fpgadataflow.cleanup":{CleanUp:[8,2,1,""]},"finn.transformation.fpgadataflow.cleanup.CleanUp":{apply:[8,4,1,""]},"finn.transformation.fpgadataflow.codegen_ipgen":{CodeGen_ipgen:[8,2,1,""]},"finn.transformation.fpgadataflow.codegen_ipgen.CodeGen_ipgen":{apply:[8,4,1,""]},"finn.transformation.fpgadataflow.codegen_ipstitch":{CodeGen_ipstitch:[8,2,1,""]},"finn.transformation.fpgadataflow.codegen_ipstitch.CodeGen_ipstitch":{apply:[8,4,1,""]},"finn.transformation.fpgadataflow.codegen_npysim":{CodeGen_npysim:[8,2,1,""]},"finn.transformation.fpgadataflow.codegen_npysim.CodeGen_npysim":{apply:[8,4,1,""]},"finn.transformation.fpgadataflow.compile":{Compile:[8,2,1,""]},"finn.transformation.fpgadataflow.compile.Compile":{apply:[8,4,1,""]},"finn.transformation.fpgadataflow.convert_to_hls_layers":{InferBinaryStreamingFCLayer:[8,2,1,""]},"finn.transformation.fpgadataflow.convert_to_hls_layers.InferBinaryStreamingFCLayer":{apply:[8,4,1,""]},"finn.transformation.fpgadataflow.create_dataflow_partition":{CreateDataflowPartition:[8,2,1,""]},"finn.transformation.fpgadataflow.create_dataflow_partition.CreateDataflowPartition":{apply:[8,4,1,""]},"finn.transformation.fpgadataflow.hlssynth_ipgen":{HLSSynth_IPGen:[8,2,1,""]},"finn.transformation.fpgadataflow.hlssynth_ipgen.HLSSynth_IPGen":{apply:[8,4,1,""]},"finn.transformation.fpgadataflow.insert_tlastmarker":{InsertTLastMarker:[8,2,1,""]},"finn.transformation.fpgadataflow.insert_tlastmarker.InsertTLastMarker":{apply:[8,4,1,""]},"finn.transformation.fpgadataflow.make_deployment":{DeployToPYNQ:[8,2,1,""]},"finn.transformation.fpgadataflow.make_deployment.DeployToPYNQ":{apply:[8,4,1,""]},"finn.transformation.fpgadataflow.make_pynq_driver":{MakePYNQDriver:[8,2,1,""]},"finn.transformation.fpgadataflow.make_pynq_driver.MakePYNQDriver":{apply:[8,4,1,""]},"finn.transformation.fpgadataflow.make_pynq_proj":{MakePYNQProject:[8,2,1,""]},"finn.transformation.fpgadataflow.make_pynq_proj.MakePYNQProject":{apply:[8,4,1,""]},"finn.transformation.fpgadataflow.synth_pynq_proj":{SynthPYNQProject:[8,2,1,""]},"finn.transformation.fpgadataflow.synth_pynq_proj.SynthPYNQProject":{apply:[8,4,1,""]},"finn.transformation.general":{ConvertSubToAdd:[7,2,1,""],GiveRandomTensorNames:[7,2,1,""],GiveReadableTensorNames:[7,2,1,""],GiveUniqueNodeNames:[7,2,1,""]},"finn.transformation.general.ConvertSubToAdd":{apply:[7,4,1,""]},"finn.transformation.general.GiveRandomTensorNames":{apply:[7,4,1,""]},"finn.transformation.general.GiveReadableTensorNames":{apply:[7,4,1,""]},"finn.transformation.general.GiveUniqueNodeNames":{apply:[7,4,1,""]},"finn.transformation.infer_datatypes":{InferDataTypes:[7,2,1,""]},"finn.transformation.infer_datatypes.InferDataTypes":{apply:[7,4,1,""]},"finn.transformation.infer_shapes":{InferShapes:[7,2,1,""]},"finn.transformation.infer_shapes.InferShapes":{apply:[7,4,1,""]},"finn.transformation.streamline":{Streamline:[9,2,1,""],absorb:[9,0,0,"-"],collapse_repeated:[9,0,0,"-"],reorder:[9,0,0,"-"],round_thresholds:[9,0,0,"-"],sign_to_thres:[9,0,0,"-"]},"finn.transformation.streamline.Streamline":{apply:[9,4,1,""]},"finn.transformation.streamline.absorb":{Absorb1BitMulIntoMatMul:[9,2,1,""],AbsorbAddIntoMultiThreshold:[9,2,1,""],AbsorbMulIntoMultiThreshold:[9,2,1,""],FactorOutMulSignMagnitude:[9,2,1,""]},"finn.transformation.streamline.absorb.Absorb1BitMulIntoMatMul":{apply:[9,4,1,""]},"finn.transformation.streamline.absorb.AbsorbAddIntoMultiThreshold":{apply:[9,4,1,""]},"finn.transformation.streamline.absorb.AbsorbMulIntoMultiThreshold":{apply:[9,4,1,""]},"finn.transformation.streamline.absorb.FactorOutMulSignMagnitude":{apply:[9,4,1,""]},"finn.transformation.streamline.collapse_repeated":{CollapseRepeatedAdd:[9,2,1,""],CollapseRepeatedMul:[9,2,1,""],CollapseRepeatedOp:[9,2,1,""]},"finn.transformation.streamline.collapse_repeated.CollapseRepeatedOp":{apply:[9,4,1,""]},"finn.transformation.streamline.reorder":{MoveAddPastMul:[9,2,1,""],MoveScalarAddPastMatMul:[9,2,1,""],MoveScalarMulPastMatMul:[9,2,1,""]},"finn.transformation.streamline.reorder.MoveAddPastMul":{apply:[9,4,1,""]},"finn.transformation.streamline.reorder.MoveScalarAddPastMatMul":{apply:[9,4,1,""]},"finn.transformation.streamline.reorder.MoveScalarMulPastMatMul":{apply:[9,4,1,""]},"finn.transformation.streamline.round_thresholds":{RoundAndClipThresholds:[9,2,1,""]},"finn.transformation.streamline.round_thresholds.RoundAndClipThresholds":{apply:[9,4,1,""]},"finn.transformation.streamline.sign_to_thres":{ConvertSignToThres:[9,2,1,""]},"finn.transformation.streamline.sign_to_thres.ConvertSignToThres":{apply:[9,4,1,""]},"finn.util":{basic:[10,0,0,"-"],data_packing:[10,0,0,"-"],fpgadataflow:[10,0,0,"-"],onnx:[10,0,0,"-"],test:[10,0,0,"-"]},"finn.util.basic":{CppBuilder:[10,2,1,""],calculate_signed_dot_prod_range:[10,1,1,""],gen_finn_dt_tensor:[10,1,1,""],get_by_name:[10,1,1,""],get_finn_root:[10,1,1,""],interleave_matrix_outer_dim_from_partitions:[10,1,1,""],make_build_dir:[10,1,1,""],pad_tensor_to_multiple_of:[10,1,1,""],random_string:[10,1,1,""],remove_by_name:[10,1,1,""],roundup_to_integer_multiple:[10,1,1,""]},"finn.util.basic.CppBuilder":{append_includes:[10,4,1,""],append_sources:[10,4,1,""],build:[10,4,1,""],set_executable_path:[10,4,1,""]},"finn.util.data_packing":{array2hexstring:[10,1,1,""],finnpy_to_packed_bytearray:[10,1,1,""],hexstring2npbytearray:[10,1,1,""],npbytearray2hexstring:[10,1,1,""],npy_to_rtlsim_input:[10,1,1,""],numpy_to_hls_code:[10,1,1,""],pack_innermost_dim_as_hex_string:[10,1,1,""],packed_bytearray_to_finnpy:[10,1,1,""],rtlsim_output_to_npy:[10,1,1,""],unpack_innermost_dim_from_hex_string:[10,1,1,""]},"finn.util.fpgadataflow":{IPGenBuilder:[10,2,1,""],pyverilate_stitched_ip:[10,1,1,""]},"finn.util.fpgadataflow.IPGenBuilder":{append_tcl:[10,4,1,""],build:[10,4,1,""],set_ipgen_path:[10,4,1,""]},"finn.util.onnx":{valueinfo_to_tensor:[10,1,1,""]},"finn.util.test":{get_test_model_def_fxn:[10,1,1,""],get_test_model_trained:[10,1,1,""],get_test_model_untrained:[10,1,1,""],get_trained_checkpoint:[10,1,1,""]},finn:{analysis:[2,0,0,"-"],core:[4,0,0,"-"],custom_op:[5,0,0,"-"],transformation:[7,0,0,"-"],util:[10,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","function","Python function"],"2":["py","class","Python class"],"3":["py","attribute","Python attribute"],"4":["py","method","Python method"]},objtypes:{"0":"py:module","1":"py:function","2":"py:class","3":"py:attribute","4":"py:method"},terms:{"0f01":10,"0x07":10,"0x0e":10,"0x0f01":10,"0xb":10,"0xe":10,"600px":[],"abstract":[5,6,7],"boolean":4,"class":[4,5,6,7,8,9,10],"const":7,"default":[5,6,7],"enum":4,"final":4,"float":10,"function":[4,7,10,11],"new":[4,11,12],"return":[2,3,4,5,6,7,9,10],"static":2,"true":[4,10],"try":11,"var":6,For:9,HLS:[4,12],IPs:8,PEs:6,The:[2,4,7,8,9,10,11,12],There:11,Use:10,abc:[5,7],abit:10,about:[2,8,12],absorb1bitmulintomatmul:9,absorb:[1,7,8],absorbaddintomultithreshold:9,absorbmulintomultithreshold:9,acceler:[8,11],account:4,action:8,activ:4,add:[7,9],adding:11,addition:9,address:8,after:10,aim:9,align:[],all:[2,4,5,6,7,8,10,11],all_tensors_f32:2,allow:4,alreadi:8,also:[5,6,8],amount:10,analysi:[1,4],analysis_fxn:4,anaylsis_fxn:4,ani:[4,7,8,10],annot:[2,5,6],anoth:8,append_includ:10,append_sourc:10,append_tcl:10,appli:[4,7,8,9],apply_rep:7,appropri:[7,11],arbitrari:10,architectur:12,around:4,arrai:10,array2hexstr:10,arxiv:9,assign:4,associ:[4,7],assum:10,attribut:[2,5,6,8],attribute_nam:[5,6],attributeproto:[5,6],backend:8,base:[4,5,6,7,8,9,10],basic:1,batchnorm:7,batchnorm_to_affin:1,batchnormtoaffin:7,been:8,befor:10,between:[6,10],binari:[4,6,8,9,10],bipolar:[4,6,7,9,10],bipolar_to_xnor:1,bit:[4,10],bitfil:11,bitwidth:4,blackboxfunct:6,block:8,blott:6,board:8,bool:[2,7],both:10,bram_estim:6,brevita:12,brien:6,build:10,built:2,calc_tmem:6,calc_wmem:6,calcul:6,calculate_signed_dot_prod_rang:10,call:[4,6,7,8,11],can:[4,7,8,9,10,11,12],cannot:7,center:[],centerpiec:12,certain:2,chang:[4,7],check:[2,4,5,6],check_all_tensor_shapes_specifi:4,check_compat:4,cleanup:[1,7],clk:[6,8],clone:10,code:[8,10],code_gen_dir:10,code_generation_ipgen:6,code_generation_npysim:6,codegen_ipgen:[1,7],codegen_ipstitch:[1,7],codegen_npysim:[1,7],collaps:9,collapse_rep:[1,7],collapserepeatedadd:9,collapserepeatedmul:9,collapserepeatedop:9,collect:[8,11],colloqui:12,come:2,commun:12,compar:[4,5],compare_execut:4,compare_fxn:4,compat:[4,5,6],compil:[1,7,12],compile_singlenode_cod:6,compon:12,comput:4,consecut:9,constant:[2,4,9],construct:12,consum:4,contain:[4,5,8,10,12],content:[],context:[4,5,6],contribut:12,convent:2,convert:[6,7,8,9,10,11],convert_to_hls_lay:[1,7],convertbipolarmatmultoxnorpopcount:7,convertsigntothr:9,convertsubtoadd:7,convolutioninputgener:[1,5],copi:[4,7,8],core:1,corner:12,correct:7,correctli:[2,5,6,8,11],correspond:[4,5,6,12],count:6,cpp_file:10,cppbuilder:10,creat:[4,8,10],create_dataflow_partit:[1,7],createdataflowpartit:8,current:[4,12],custom:[2,4,11,12],custom_op:1,customop:[5,6],data:[5,8,10],data_pack:1,dataflow:[4,8,12],dataoutstrm:6,datatyp:[1,5,6,7,10],debug:4,declar:7,deep:[4,6,7,12],default_v:[5,6],default_valu:[5,6],defin:6,deploi:11,deploy:8,deploytopynq:8,design:[8,11],detail:12,develop:[11,12],dict:[4,5,6],dictionari:[2,4],digit:10,dimens:10,dimension:10,dir:[8,10],directori:[8,10,11],distr_pad:10,divis:10,dnn:[],doc:12,docker:10,dockerfil:11,docomput:6,doe:11,don:7,done:2,dot:10,down:11,driver:8,dt_a:10,dt_b:10,dtype:[2,4,5,6,10],dynam:2,dynamic_input_to_npi:6,each:[2,4,7,9,10,12],effect:7,element:10,embed:4,emit:10,emphasi:12,empti:4,end:6,ensur:[6,7,8,10],enumer:[4,7],environ:11,equal:[5,6],equival:9,estim:3,even:7,evenli:10,everi:7,everyth:11,exampl:[10,11],excel:11,exec_precompiled_singlenode_model:6,execut:[4,5,6],execute_custom_nod:1,execute_nod:[4,5,6],execute_onnx:4,execute_onnx_and_make_model:4,exist:[5,10],exit:10,expect:[2,4,5,6,8],experi:12,experiment:12,explor:[4,6,12],expos:4,extens:11,extra:[2,10],extract:[2,3],factor:10,factoroutmulsignmagnitud:9,fals:[4,7,10],familiar:11,fan:2,fast:6,fewest:4,field:[8,10],file:[4,8,10],filenam:[4,8],find:4,find_consum:4,find_produc:4,finn:[],finn_dt:10,finnpy_to_packed_bytearrai:10,first:[2,9],fix:[7,10],flatten:10,float32:[2,4],flow:[],fold_const:1,foldconst:7,folder:[8,10],follow:[2,8,11,12],form:6,found:[8,12],four:10,fpga:[11,12],fpgadataflow:[1,2,5,7],fpgapart:[6,8],framework:[6,12],fraser:6,from:[3,4,8,10,12],full:4,further:7,gambardella:6,gen_finn_dt_tensor:10,gener:[1,8,10,12],generate_param:6,get:[4,5],get_all_tensor_nam:4,get_by_nam:10,get_finn_root:10,get_folded_input_shap:6,get_folded_output_shap:6,get_hls_compatible_threshold_tensor:6,get_hls_compatible_weight_tensor:6,get_hls_datatype_str:4,get_initi:4,get_input_datatyp:6,get_instream_width:6,get_metadata_prop:4,get_nodeattr:5,get_nodeattr_typ:[5,6],get_num_possible_valu:4,get_number_output_valu:6,get_output_datatyp:6,get_outstream_width:6,get_per_tensor_fanout:2,get_smallest_poss:4,get_stream_width:6,get_template_param_valu:6,get_tensor_datatyp:4,get_tensor_fanout:4,get_tensor_shap:4,get_tensor_valueinfo:4,get_test_model_def_fxn:10,get_test_model_train:10,get_test_model_untrain:10,get_trained_checkpoint:10,get_weight_datatyp:6,getcustomop:5,github:12,give:[7,9],give_unique_node_nam:7,given:[2,3,4,5,6,10],giverandomtensornam:7,givereadabletensornam:7,giveuniquenodenam:7,global_includ:6,graph:[2,4,5,6,7,8],graphic:12,guarante:7,guid:1,hand:12,has:[2,4,7,8,10],have:[2,4,7,8,9,11],height:[],help:11,hex:10,hexstr:10,hexstring2npbytearrai:10,high:11,highli:12,hls_synth_res_estim:[1,2],hls_var_nam:10,hlscustomop:6,hlslib:[6,12],hlssynth_ipgen:[1,7],homepag:12,host:10,how:[1,10],human:7,imag:[],img:[],immedi:8,implement:4,includ:[4,8,12],index:[],indic:[4,5,6,7,8],infer:[4,5,6,7,10,11,12],infer_datatyp:1,infer_node_datatyp:[5,6],infer_shap:1,inferbinarystreamingfclay:8,inferdatatyp:7,infershap:7,infinit:7,info:[7,10],info_messag:2,inform:[2,8],infrastructur:8,inherit:7,initi:[2,4],innermost:10,inp0:5,inp1:5,inp:6,input:[2,4,5,6,7,9,10],input_dict:4,input_dtyp:10,input_fil:10,insert:[8,10],insert_tlastmark:[1,7],inserttlastmark:8,insid:5,instal:11,instanc:[4,5,6,9],instanti:8,instead:10,int16:4,int2:4,int32:4,int3:4,int4:4,int8:4,integ:[4,9,10],intend:[],interfac:8,interleav:6,interleave_matrix_outer_dim_from_partit:10,intermedi:[4,7],intern:7,ipgen_singlenode_cod:6,ipgenbuild:10,is_integ:4,is_linear:2,item:10,jupyt:12,kei:4,know:7,lab:12,lambda:4,largest:4,launch:11,layer:[7,8],lead:10,learn:[6,12],leeser:6,len:10,let:7,letter:10,librari:12,library_path:10,like:[],linear:[2,4],link:12,list:[2,4],locat:11,look:2,loop:7,lut_estim:6,made:[4,7],magnitud:9,make:[7,8],make_build_dir:10,make_collapsed_param_fxn:9,make_deepcopi:4,make_deploy:[1,7],make_empty_exec_context:4,make_new_valueinfo_nam:4,make_project:8,make_pynq_driv:[1,7],make_pynq_proj:[1,7],make_shape_compatible_op:[5,6],makepynqdriv:8,makepynqproject:8,mani:11,manipul:4,manual:7,matmul:[7,9],matrix:[6,9,10],max:[4,10],mean:10,meant:7,member:[5,6],metadata_prop:[4,8],min:[4,10],minimum:10,mixtur:2,mkdtemp:10,mode:11,model:[2,3,4,5,6,7,8,9,10],model_a:4,model_b:4,model_was_chang:7,modelproto:[4,8],modelwrapp:[1,2,7],modul:[],modular:12,more:[4,7,10,12],move:9,moveaddpastmul:9,movescalaraddpastmatmul:9,movescalarmulpastmatmul:9,mul:[7,9],multidimension:10,multipl:[7,9,10],multipli:9,multithreshold:[1,8,9],must:[5,7,8,9,10],mvtu:8,n_partit:10,n_thres_step:6,name:[2,3,4,5,7,10],name_field:10,ndarrai:10,nearest:[9,10],necessari:8,need:[3,5,6,7],neg:[4,9],netnam:10,network:[6,11,12],neural:[6,12],new_nam:4,next:9,no_decl:10,node:[2,3,4,5,6,7,8,9],node_inputs_in_expected_ord:2,node_res_estim:6,non:8,none:[4,5,10],notebook:12,notwithstand:2,now:[2,4],npbytearrai:10,npbytearray2hexstr:10,npy:10,npy_to_dynamic_output:6,npy_to_rtlsim_input:10,number:[4,5,6,10],numpi:[6,10],numpy_to_hls_cod:10,object:[4,10],old_nam:4,onc:7,one:[2,4,8,10],onli:[2,4,7,8,9],onlin:11,onnx:[1,4,5,6,8],onnx_exec:1,onnx_model_proto:4,onnx_nod:[5,6],onnxruntim:4,op_nam:9,op_typ:2,oper:[4,9],ops:[2,9],order:2,orig_thres_matrix:6,orig_weight_matrix:6,origin:6,other:[4,9],otherwis:[4,7,10],out:2,out_bia:5,out_scal:5,out_shap:10,outcom:8,output:[4,5,6,7,10],output_shap:10,overlai:8,overview:12,own:11,pack:[8,10],pack_innermost_dim:10,pack_innermost_dim_as_hex_str:10,packag:[],packed_bytearrai:10,packed_bytearray_to_finnpi:10,packedbit:10,pad:10,pad_tensor_to_multiple_of:10,pad_to_dim:10,pad_to_nbit:10,page:[],pair:8,paramet:9,part:[5,10],particular:[5,6,10],partit:4,pass:[1,6],password:8,past:9,path:[6,10],per:8,perform:[5,6,11],permit:[5,6],place:8,platform:8,png:[],point:[7,11],posit:[6,9,10],possibl:[4,8],pragma:6,preced:9,precid:9,precis:10,precomput:7,prefer:4,prefix:10,prepend:10,preusser:6,previous:8,prior:[7,8,10],process:11,produc:[2,4],product:10,project:[8,12],properti:[2,4],provid:[4,11],pushbutton:11,pynq:8,pynq_driver_dir:8,python:[8,10,11],pyveril:10,pyverilate_stitched_ip:10,qnn:[11,12],quantiz:[2,6,12],random:[7,10],random_str:10,randomli:10,rather:11,reach:7,read:12,read_npy_data:6,readabl:7,readthedoc:[],recommend:7,refer:12,registri:1,relat:12,remot:4,remov:[8,10],remove_by_nam:10,remove_prefix:10,renam:4,rename_tensor:4,reorder:[1,7],repeat:[7,9],repeatedli:4,replac:7,repositori:[11,12],repositroi:[],repres:[4,10],represent:10,requir:[4,5,6],res_estim:[1,2],research:12,reset_rtlsim:6,reshap:6,resourc:[3,11],respect:10,result:[2,3,4,7,8,9,10],return_full_exec_context:4,returned_dict:[5,6],revers:10,reverse_endian:10,reverse_inn:10,right:12,root:[10,11],round:[9,10],round_threshold:[1,7],roundandclipthreshold:9,roundup_to_integer_multipl:10,row:6,rtlsim:[4,6],rtlsim_output_to_npi:10,run:[4,8],same:[8,10],save:[4,10],save_as_npi:6,scalar:9,scale:[],scp:8,script:[8,11],search:[],second:[8,9],see:[9,10],seen:12,sep:6,separ:12,sequenc:10,set:[4,5,6,8,9,10],set_attribut:[],set_executable_path:10,set_initi:4,set_ipgen_path:10,set_metadata_prop:4,set_nodeattr:5,set_sim_mod:[1,7],set_tensor_datatyp:4,set_tensor_shap:4,setsimmod:[],settings64:11,sever:11,shape:[4,5,6,7,10],shell:8,should:[2,4,7,11],sign:[4,7,9,10],sign_to_thr:[1,7],sim:[6,10],sim_mod:[],simd:6,sinc:[4,10],singl:[4,9,10,11],small:2,smallest:4,some:[4,7,12],space:[],specif:12,specifi:[4,7,10],split:[8,9,10],stai:12,standard:[4,5,6],stitch:[8,10],store:[5,8,10],streamingdataflowpartit:[1,8],streamingfclayer_batch:[1,5,8],streamingmaxpool_batch:[1,5],streamlin:[1,7],string:[2,10],stringlength:10,strm_decl:6,structur:2,style:12,sub:7,subdirectori:8,subgraph:4,submodul:1,subpackag:[],subset:2,success:8,suitabl:6,surviv:10,synth_pynq_proj:[1,7],synthesi:[3,8],synthpynqproject:8,take:[2,4,7,9,10,11],taken:[4,8,12],target:[8,12],target_dir:8,targetbit:10,tcl:8,tcl_script:10,tempfil:10,templat:[1,5,7],temporari:10,tensor:[2,4,7,9,10],tensor_fanout:2,tensor_nam:[2,4],tensor_shap:[4,10],tensor_valu:4,termin:8,ternari:4,test:[1,7],thei:9,them:[2,8,9],thi:[2,4,5,6,7,8,10,11,12],thing:12,thought:11,threshold:[5,6,9],time:7,tlastmark:[1,5,8],tmem:6,togeth:8,toggle_clk:6,tool:[11,12],topolog:1,train:[11,12],transform:[1,4],transformed_model:7,travers:2,tune:12,tupl:7,two:[4,8,9,10,12],type:[4,7,10],ubuntu:11,uint16:4,uint2:[4,10],uint32:4,uint3:4,uint4:4,uint8:[4,10],umuroglu:6,under:[8,12],uniqu:7,unpack:[8,10],unpack_innermost_dim_from_hex_str:10,unsign:[4,9],until:4,updat:[9,12],upper:12,use:12,used:[4,5,6,10,12],useful:4,user:7,usernam:8,using:[4,7,9,10,12],util:[1,4,5,6],val:10,valu:[4,5,6,8,9,10],value_info:4,valueinfo:[4,7],valueinfo_to_tensor:10,valueinfoproto:[4,10],variabl:[10,11],vector:[9,10],verif:2,verifi:[2,5,6],verify_custom_nod:1,verify_nod:[2,5,6],version:12,via:4,view:12,visser:6,vivado:[3,4,8,11,12],vivado_path:11,vivado_pynq_proj:8,vivado_stitch_proj:8,wai:[2,11],want:9,wbit:10,websit:12,weight:[4,6],welcom:12,well:11,when:[2,7],where:[4,5,6,8,9,11],whether:[2,4,5,6,7],which:[4,5,6,8,9,10,12],width:10,wmem:6,work:[4,10,11],wrapper:4,write:[1,11],xdnn:[],xilinx:12,xnorpopcount:1,xnorpopcountmatmul:[5,7,8],you:[7,11],your:[7,11],zero:[4,9,10]},titles:["FINN - End-to-End Flow","finn package","finn.analysis package","finn.analysis.fpgadataflow package","finn.core package","finn.custom_op package","finn.custom_op.fpgadataflow package","finn.transformation package","finn.transformation.fpgadataflow package","finn.transformation.streamline package","finn.util package","Getting Started","FINN","src","Source Code"],titleterms:{absorb:9,analysi:[2,3],basic:10,batchnorm_to_affin:7,bipolar_to_xnor:7,cleanup:8,code:14,codegen_ipgen:8,codegen_ipstitch:8,codegen_npysim:8,collapse_rep:9,compil:[8,11],content:[1,2,3,4,5,6,7,8,9,10],convert_to_hls_lay:8,convolutioninputgener:6,core:4,create_dataflow_partit:8,custom_op:[5,6],data_pack:10,datatyp:4,docker:11,document:[],end:0,execute_custom_nod:4,finn:[0,1,2,3,4,5,6,7,8,9,10,11,12],flow:0,fold_const:7,fpgadataflow:[3,6,8,10],gener:7,get:11,guid:7,hls_synth_res_estim:3,hlssynth_ipgen:8,how:[2,11],indic:[],infer_datatyp:7,infer_shap:7,insert_tlastmark:8,make_deploy:8,make_pynq_driv:8,make_pynq_proj:8,modelwrapp:4,modul:[1,2,3,4,5,6,7,8,9,10],multithreshold:5,onnx:10,onnx_exec:4,packag:[1,2,3,4,5,6,7,8,9,10],pass:2,registri:5,reorder:9,requir:11,res_estim:3,round_threshold:9,run:11,set_sim_mod:8,sign_to_thr:9,sourc:14,src:13,start:11,streamingdataflowpartit:5,streamingfclayer_batch:6,streamingmaxpool_batch:6,streamlin:9,submodul:[2,3,4,5,6,7,8,9,10],subpackag:[1,2,5,7],synth_pynq_proj:8,tabl:[],templat:[6,8],test:10,tlastmark:6,topolog:2,transform:[7,8,9],use:11,util:10,verify_custom_nod:2,welcom:[],what:12,write:[2,7],xnorpopcount:5}}) \ No newline at end of file diff --git a/docs/finn/index.rst b/docs/finn/index.rst index a5bbf8e05..c647b4d1d 100644 --- a/docs/finn/index.rst +++ b/docs/finn/index.rst @@ -6,15 +6,15 @@ **** FINN **** -**This website is currently under construction.** +.. note:: **This website is currently under construction.** -FINN is an experimental framework from Xilinx Research Labs to explore deep neural network inference on FPGAs. It specifically targets quantized neural networks, with emphasis on generating dataflow-style architectures customized for each network. It is not intended to be a generic DNN accelerator like xDNN, but rather a tool for exploring the design space of DNN inference accelerators on FPGAs. +Welcome to the FINN Read the Docs website. This website is about the new, more modular version of FINN, which is currently under development on GitHub, and we welcome contributions from the community! Stay tuned for more updates. What is FINN? ============= 'FINN' is colloquially used to refer to two separate but highly related things: -* The FINN project, which includes tools for training quantized neural networks such as Brevitas, the FINN compiler, and the finn-hlslib Vivado HLS library of FPGA components for QNNs. An overview of the project can be taken from the following graphic and details can be seen on the `FINN project homepage <https://xilinx.github.io/finn/>`_. +* The FINN project, which is an experimental framework from Xilinx Research Labs to explore deep neural network inference on FPGAs. It specifically targets quantized neural networks, with emphasis on generating dataflow-style architectures customized for each network. It includes tools for training quantized neural networks such as Brevitas, the FINN compiler, and the finn-hlslib Vivado HLS library of FPGA components for QNNs. An overview of the project can be taken from the following graphic and details can be seen on the `FINN project homepage <https://xilinx.github.io/finn/>`_. .. image:: ../img/finn-stack.png :scale: 50% -- GitLab