From fc3b2a85cec892c27193f68af6af5b655a282d43 Mon Sep 17 00:00:00 2001
From: auphelia <jakobapk@web.de>
Date: Thu, 20 Feb 2020 15:27:58 +0000
Subject: [PATCH] [Sphinx documentation] Add section about what finn is

---
 docs/finn/_build/doctrees/environment.pickle | Bin 123615 -> 124308 bytes
 docs/finn/_build/doctrees/index.doctree      | Bin 4670 -> 9473 bytes
 docs/finn/_build/html/_sources/index.rst.txt |  14 ++++++++-
 docs/finn/_build/html/index.html             |  30 +++++++++++++++++--
 docs/finn/_build/html/searchindex.js         |   2 +-
 docs/finn/index.rst                          |  14 ++++++++-
 6 files changed, 55 insertions(+), 5 deletions(-)

diff --git a/docs/finn/_build/doctrees/environment.pickle b/docs/finn/_build/doctrees/environment.pickle
index 51102cfba3c356cd3936575a2574bd5c2a9a5387..16b82a01f39f26608790004b11de5961bc6f9652 100644
GIT binary patch
literal 124308
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

literal 123615
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
a;1U3Br@&w9dSJq82YUVs1Nc3xl>RrsTxJRY

diff --git a/docs/finn/_build/doctrees/index.doctree b/docs/finn/_build/doctrees/index.doctree
index eab45babeaeb78d57a0c3d40fa0c91c2cd37860b..b1c15bd5ccb7be66cd46bbb132b0a933a2c189ca 100644
GIT binary patch
literal 9473
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
aDJ;lX>b??eg2KE@i7w9xbg@f1t^Wa|l~LaS

delta 769
zcmZql+NZ+Wz%tcXXd`PRGb8)tH$p#!GeS!<R5F}1R5R2v)V(<~L^JFsGm03oW!M6l
zT9a)=Bqn=G8v_-8WRsh`UBrSdqW~z8H~F`SE?-7=24e;@RI9+`Y<?w1jmf?IlA`=p
zMX7043F)bMnRzLx6$w)^*kh+mPGpu)&S(WOGn{&O3R3e@GV{{oD}YL;OrE0IIHh)q
zMh0s}>*N)pPD~k-C%+d3S~d}AS>NQ3Tr!jW#W)2r{CYTn%2V=l6EpLsWXzwOC+5PJ
z(F1jX5KwI=P^|)QJCaB<NF<~YC|8GYtzT(UMib1+9;kD3^MMY6J2#^PCZBNt?B-rH
z{-nwE;)bFbCrXnNGsHk{mjHT9Di+9?H~F-<0>te{ak>36(Cu1s85?>yVAf6nMFh+*
z!a(;PLh%boWFJUG1e;$be~^$>M7a1fnu{U)Nt3N4bwx9N<8|>594^jco2)OPD+6>f
zTXAY)QE~=~dqse*`-<XTkjO`nh%lymQzvhfl%9N2h>tI$1}UntC*PI|nOq>v!y-_c
z1Xi<ow)AgCrf|m1Gh~-BTV!Npq-Gg1GB9N60g2Kc&b-9j)RM}A)M9Yj$?yY9`juu#
XfTANcLkp}fBYW~3#TS#0saOL578VOw

diff --git a/docs/finn/_build/html/_sources/index.rst.txt b/docs/finn/_build/html/_sources/index.rst.txt
index 962456c63..98f256481 100644
--- a/docs/finn/_build/html/_sources/index.rst.txt
+++ b/docs/finn/_build/html/_sources/index.rst.txt
@@ -3,8 +3,20 @@
    You can adapt this file completely to your liking, but it should at least
    contain the root `toctree` directive.
 
+****
 FINN
-================================
+****
+FINN is an experimental framework from Xilinx Research Labs to explore deep neural network inference on FPGAs. It specifically targets quantized neural networks, with emphasis on generating dataflow-style architectures customized for each network. It is not intended to be a generic DNN accelerator like xDNN, but rather a tool for exploring the design space of DNN inference accelerators on FPGAs.
+
+What is FINN?
+=============
+'FINN' is colloquially used to refer to two separate but highly related things:
+* The FINN project, which includes tools for training quantized neural networks such as Brevitas, the FINN compiler, and the finn-hlslib Vivado HLS library of FPGA components for QNNs. An overview of the project can be taken from the following graphic and details can be seen on the project homepage.
+.. image:: ../img/finn-flow.png
+    :height: 600px
+    :scale: 75%
+    :align: center
+* The repository, this readthedocs website corresponds to. This is the FINN compiler, which is the centerpiece of the FINN project. The GitHub repositroy can be viewed using the link in the upper right corner.
 
 .. toctree::
    :maxdepth: 2
diff --git a/docs/finn/_build/html/index.html b/docs/finn/_build/html/index.html
index ad803eee9..d91397a24 100644
--- a/docs/finn/_build/html/index.html
+++ b/docs/finn/_build/html/index.html
@@ -80,9 +80,12 @@
             
               <!-- Local TOC -->
               <div class="local-toc"><ul>
-<li><a class="reference internal" href="#">FINN</a></li>
+<li><a class="reference internal" href="#">FINN</a><ul>
+<li><a class="reference internal" href="#what-is-finn">What is FINN?</a></li>
 <li><a class="reference internal" href="#indices-and-tables">Indices and tables</a></li>
 </ul>
+</li>
+</ul>
 </div>
             
           
@@ -148,16 +151,39 @@
             
   <div class="section" id="finn">
 <h1>FINN<a class="headerlink" href="#finn" title="Permalink to this headline">¶</a></h1>
+<p>FINN is an experimental framework from Xilinx Research Labs to explore deep neural network inference on FPGAs. It specifically targets quantized neural networks, with emphasis on generating dataflow-style architectures customized for each network. It is not intended to be a generic DNN accelerator like xDNN, but rather a tool for exploring the design space of DNN inference accelerators on FPGAs.</p>
+<div class="section" id="what-is-finn">
+<h2>What is FINN?<a class="headerlink" href="#what-is-finn" title="Permalink to this headline">¶</a></h2>
+<p>‘FINN’ is colloquially used to refer to two separate but highly related things:
+* The FINN project, which includes tools for training quantized neural networks such as Brevitas, the FINN compiler, and the finn-hlslib Vivado HLS library of FPGA components for QNNs. An overview of the project can be taken from the following graphic and details can be seen on the project homepage.
+.. image:: ../img/finn-flow.png</p>
+<blockquote>
+<div><dl class="field-list simple">
+<dt class="field-odd">height</dt>
+<dd class="field-odd"><p>600px</p>
+</dd>
+<dt class="field-even">scale</dt>
+<dd class="field-even"><p>75%</p>
+</dd>
+<dt class="field-odd">align</dt>
+<dd class="field-odd"><p>center</p>
+</dd>
+</dl>
+</div></blockquote>
+<ul class="simple">
+<li><p>The repository, this readthedocs website corresponds to. This is the FINN compiler, which is the centerpiece of the FINN project. The GitHub repositroy can be viewed using the link in the upper right corner.</p></li>
+</ul>
 <div class="toctree-wrapper compound">
 </div>
 </div>
 <div class="section" id="indices-and-tables">
-<h1>Indices and tables<a class="headerlink" href="#indices-and-tables" title="Permalink to this headline">¶</a></h1>
+<h2>Indices and tables<a class="headerlink" href="#indices-and-tables" title="Permalink to this headline">¶</a></h2>
 <ul class="simple">
 <li><p><a class="reference internal" href="genindex.html"><span class="std std-ref">Index</span></a></p></li>
 <li><p><a class="reference internal" href="py-modindex.html"><span class="std std-ref">Module Index</span></a></p></li>
 <li><p><a class="reference internal" href="search.html"><span class="std std-ref">Search Page</span></a></p></li>
 </ul>
+</div>
 </div>
 
 
diff --git a/docs/finn/_build/html/searchindex.js b/docs/finn/_build/html/searchindex.js
index 673dc500d..af5d22cb7 100644
--- a/docs/finn/_build/html/searchindex.js
+++ b/docs/finn/_build/html/searchindex.js
@@ -1 +1 @@
-Search.setIndex({docnames:["finn","finn.analysis","finn.analysis.fpgadataflow","finn.core","finn.custom_op","finn.custom_op.fpgadataflow","finn.transformation","finn.transformation.fpgadataflow","finn.transformation.streamline","finn.util","index","modules"],envversion:{"sphinx.domains.c":1,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":1,"sphinx.domains.javascript":1,"sphinx.domains.math":2,"sphinx.domains.python":1,"sphinx.domains.rst":1,"sphinx.domains.std":1,sphinx:56},filenames:["finn.rst","finn.analysis.rst","finn.analysis.fpgadataflow.rst","finn.core.rst","finn.custom_op.rst","finn.custom_op.fpgadataflow.rst","finn.transformation.rst","finn.transformation.fpgadataflow.rst","finn.transformation.streamline.rst","finn.util.rst","index.rst","modules.rst"],objects:{"":{finn:[0,0,0,"-"]},"finn.analysis":{fpgadataflow:[2,0,0,"-"],topology:[1,0,0,"-"],verify_custom_nodes:[1,0,0,"-"]},"finn.analysis.fpgadataflow":{hls_synth_res_estimation:[2,0,0,"-"],res_estimation:[2,0,0,"-"]},"finn.analysis.fpgadataflow.hls_synth_res_estimation":{hls_synth_res_estimation:[2,1,1,""]},"finn.analysis.fpgadataflow.res_estimation":{res_estimation:[2,1,1,""]},"finn.analysis.topology":{all_tensors_f32:[1,1,1,""],get_per_tensor_fanouts:[1,1,1,""],is_linear:[1,1,1,""],node_inputs_in_expected_order:[1,1,1,""]},"finn.analysis.verify_custom_nodes":{verify_nodes:[1,1,1,""]},"finn.core":{datatype:[3,0,0,"-"],execute_custom_node:[3,0,0,"-"],modelwrapper:[3,0,0,"-"],onnx_exec:[3,0,0,"-"]},"finn.core.datatype":{DataType:[3,2,1,""]},"finn.core.datatype.DataType":{BINARY:[3,3,1,""],BIPOLAR:[3,3,1,""],FLOAT32:[3,3,1,""],INT16:[3,3,1,""],INT2:[3,3,1,""],INT32:[3,3,1,""],INT3:[3,3,1,""],INT4:[3,3,1,""],INT8:[3,3,1,""],TERNARY:[3,3,1,""],UINT16:[3,3,1,""],UINT2:[3,3,1,""],UINT32:[3,3,1,""],UINT3:[3,3,1,""],UINT4:[3,3,1,""],UINT8:[3,3,1,""],allowed:[3,4,1,""],bitwidth:[3,4,1,""],get_hls_datatype_str:[3,4,1,""],get_num_possible_values:[3,4,1,""],get_smallest_possible:[3,4,1,""],is_integer:[3,4,1,""],max:[3,4,1,""],min:[3,4,1,""],signed:[3,4,1,""]},"finn.core.execute_custom_node":{execute_custom_node:[3,1,1,""]},"finn.core.modelwrapper":{ModelWrapper:[3,2,1,""]},"finn.core.modelwrapper.ModelWrapper":{analysis:[3,4,1,""],check_all_tensor_shapes_specified:[3,4,1,""],check_compatibility:[3,4,1,""],find_consumer:[3,4,1,""],find_producer:[3,4,1,""],get_all_tensor_names:[3,4,1,""],get_initializer:[3,4,1,""],get_metadata_prop:[3,4,1,""],get_tensor_datatype:[3,4,1,""],get_tensor_fanout:[3,4,1,""],get_tensor_shape:[3,4,1,""],get_tensor_valueinfo:[3,4,1,""],graph:[3,4,1,""],make_empty_exec_context:[3,4,1,""],make_new_valueinfo_name:[3,4,1,""],model:[3,4,1,""],rename_tensor:[3,4,1,""],save:[3,4,1,""],set_initializer:[3,4,1,""],set_metadata_prop:[3,4,1,""],set_tensor_datatype:[3,4,1,""],set_tensor_shape:[3,4,1,""],transform:[3,4,1,""]},"finn.core.onnx_exec":{compare_execution:[3,1,1,""],execute_node:[3,1,1,""],execute_onnx:[3,1,1,""],execute_onnx_and_make_model:[3,1,1,""]},"finn.custom_op":{CustomOp:[4,2,1,""],fpgadataflow:[5,0,0,"-"],multithreshold:[4,0,0,"-"],registry:[4,0,0,"-"],streamingdataflowpartition:[4,0,0,"-"],xnorpopcount:[4,0,0,"-"]},"finn.custom_op.CustomOp":{execute_node:[4,4,1,""],get_nodeattr:[4,4,1,""],get_nodeattr_types:[4,4,1,""],infer_node_datatype:[4,4,1,""],make_shape_compatible_op:[4,4,1,""],set_nodeattr:[4,4,1,""],verify_node:[4,4,1,""]},"finn.custom_op.fpgadataflow":{HLSCustomOp:[5,2,1,""],convolutioninputgenerator:[5,0,0,"-"],streamingfclayer_batch:[5,0,0,"-"],streamingmaxpool_batch:[5,0,0,"-"],templates:[5,0,0,"-"],tlastmarker:[5,0,0,"-"]},"finn.custom_op.fpgadataflow.HLSCustomOp":{blackboxfunction:[5,4,1,""],bram_estimation:[5,4,1,""],code_generation_ipgen:[5,4,1,""],code_generation_npysim:[5,4,1,""],compile_singlenode_code:[5,4,1,""],dataoutstrm:[5,4,1,""],defines:[5,4,1,""],docompute:[5,4,1,""],dynamic_input_to_npy:[5,4,1,""],exec_precompiled_singlenode_model:[5,4,1,""],execute_node:[5,4,1,""],generate_params:[5,4,1,""],get_folded_input_shape:[5,4,1,""],get_folded_output_shape:[5,4,1,""],get_instream_width:[5,4,1,""],get_nodeattr_types:[5,4,1,""],get_number_output_values:[5,4,1,""],get_outstream_width:[5,4,1,""],global_includes:[5,4,1,""],ipgen_singlenode_code:[5,4,1,""],lut_estimation:[5,4,1,""],node_res_estimation:[5,4,1,""],npy_to_dynamic_output:[5,4,1,""],pragmas:[5,4,1,""],read_npy_data:[5,4,1,""],reset_rtlsim:[5,4,1,""],rtlsim:[5,4,1,""],save_as_npy:[5,4,1,""],strm_decl:[5,4,1,""],toggle_clk:[5,4,1,""]},"finn.custom_op.fpgadataflow.convolutioninputgenerator":{ConvolutionInputGenerator:[5,2,1,""]},"finn.custom_op.fpgadataflow.convolutioninputgenerator.ConvolutionInputGenerator":{blackboxfunction:[5,4,1,""],bram_estimation:[5,4,1,""],dataoutstrm:[5,4,1,""],defines:[5,4,1,""],docompute:[5,4,1,""],execute_node:[5,4,1,""],get_input_datatype:[5,4,1,""],get_nodeattr_types:[5,4,1,""],get_number_output_values:[5,4,1,""],get_output_datatype:[5,4,1,""],get_stream_width:[5,4,1,""],global_includes:[5,4,1,""],infer_node_datatype:[5,4,1,""],lut_estimation:[5,4,1,""],make_shape_compatible_op:[5,4,1,""],pragmas:[5,4,1,""],read_npy_data:[5,4,1,""],save_as_npy:[5,4,1,""],strm_decl:[5,4,1,""],verify_node:[5,4,1,""]},"finn.custom_op.fpgadataflow.streamingfclayer_batch":{StreamingFCLayer_Batch:[5,2,1,""]},"finn.custom_op.fpgadataflow.streamingfclayer_batch.StreamingFCLayer_Batch":{blackboxfunction:[5,4,1,""],bram_estimation:[5,4,1,""],calc_tmem:[5,4,1,""],calc_wmem:[5,4,1,""],dataoutstrm:[5,4,1,""],defines:[5,4,1,""],docompute:[5,4,1,""],execute_node:[5,4,1,""],generate_params:[5,4,1,""],get_folded_input_shape:[5,4,1,""],get_folded_output_shape:[5,4,1,""],get_hls_compatible_threshold_tensor:[5,4,1,""],get_hls_compatible_weight_tensor:[5,4,1,""],get_input_datatype:[5,4,1,""],get_instream_width:[5,4,1,""],get_nodeattr_types:[5,4,1,""],get_number_output_values:[5,4,1,""],get_output_datatype:[5,4,1,""],get_outstream_width:[5,4,1,""],get_template_param_values:[5,4,1,""],get_weight_datatype:[5,4,1,""],global_includes:[5,4,1,""],infer_node_datatype:[5,4,1,""],lut_estimation:[5,4,1,""],make_shape_compatible_op:[5,4,1,""],pragmas:[5,4,1,""],read_npy_data:[5,4,1,""],save_as_npy:[5,4,1,""],strm_decl:[5,4,1,""],verify_node:[5,4,1,""]},"finn.custom_op.fpgadataflow.streamingmaxpool_batch":{StreamingMaxPool_Batch:[5,2,1,""]},"finn.custom_op.fpgadataflow.streamingmaxpool_batch.StreamingMaxPool_Batch":{blackboxfunction:[5,4,1,""],bram_estimation:[5,4,1,""],dataoutstrm:[5,4,1,""],defines:[5,4,1,""],docompute:[5,4,1,""],get_nodeattr_types:[5,4,1,""],get_number_output_values:[5,4,1,""],global_includes:[5,4,1,""],infer_node_datatype:[5,4,1,""],lut_estimation:[5,4,1,""],make_shape_compatible_op:[5,4,1,""],pragmas:[5,4,1,""],read_npy_data:[5,4,1,""],save_as_npy:[5,4,1,""],strm_decl:[5,4,1,""],verify_node:[5,4,1,""]},"finn.custom_op.fpgadataflow.tlastmarker":{TLastMarker:[5,2,1,""]},"finn.custom_op.fpgadataflow.tlastmarker.TLastMarker":{blackboxfunction:[5,4,1,""],dataoutstrm:[5,4,1,""],defines:[5,4,1,""],docompute:[5,4,1,""],execute_node:[5,4,1,""],get_folded_input_shape:[5,4,1,""],get_folded_output_shape:[5,4,1,""],get_instream_width:[5,4,1,""],get_nodeattr_types:[5,4,1,""],get_number_output_values:[5,4,1,""],get_outstream_width:[5,4,1,""],global_includes:[5,4,1,""],infer_node_datatype:[5,4,1,""],make_shape_compatible_op:[5,4,1,""],pragmas:[5,4,1,""],read_npy_data:[5,4,1,""],save_as_npy:[5,4,1,""],strm_decl:[5,4,1,""],verify_node:[5,4,1,""]},"finn.custom_op.multithreshold":{MultiThreshold:[4,2,1,""],compare:[4,1,1,""],multithreshold:[4,1,1,""]},"finn.custom_op.multithreshold.MultiThreshold":{execute_node:[4,4,1,""],get_nodeattr_types:[4,4,1,""],infer_node_datatype:[4,4,1,""],make_shape_compatible_op:[4,4,1,""],verify_node:[4,4,1,""]},"finn.custom_op.registry":{getCustomOp:[4,1,1,""]},"finn.custom_op.streamingdataflowpartition":{StreamingDataflowPartition:[4,2,1,""]},"finn.custom_op.streamingdataflowpartition.StreamingDataflowPartition":{execute_node:[4,4,1,""],get_nodeattr_types:[4,4,1,""],infer_node_datatype:[4,4,1,""],make_shape_compatible_op:[4,4,1,""],verify_node:[4,4,1,""]},"finn.custom_op.xnorpopcount":{XnorPopcountMatMul:[4,2,1,""],xnorpopcountmatmul:[4,1,1,""]},"finn.custom_op.xnorpopcount.XnorPopcountMatMul":{execute_node:[4,4,1,""],get_nodeattr_types:[4,4,1,""],infer_node_datatype:[4,4,1,""],make_shape_compatible_op:[4,4,1,""],verify_node:[4,4,1,""]},"finn.transformation":{Transformation:[6,2,1,""],batchnorm_to_affine:[6,0,0,"-"],bipolar_to_xnor:[6,0,0,"-"],fold_constants:[6,0,0,"-"],fpgadataflow:[7,0,0,"-"],general:[6,0,0,"-"],infer_datatypes:[6,0,0,"-"],infer_shapes:[6,0,0,"-"],streamline:[8,0,0,"-"]},"finn.transformation.Transformation":{apply:[6,4,1,""]},"finn.transformation.batchnorm_to_affine":{BatchNormToAffine:[6,2,1,""]},"finn.transformation.batchnorm_to_affine.BatchNormToAffine":{apply:[6,4,1,""]},"finn.transformation.bipolar_to_xnor":{ConvertBipolarMatMulToXnorPopcount:[6,2,1,""]},"finn.transformation.bipolar_to_xnor.ConvertBipolarMatMulToXnorPopcount":{apply:[6,4,1,""]},"finn.transformation.fold_constants":{FoldConstants:[6,2,1,""]},"finn.transformation.fold_constants.FoldConstants":{apply:[6,4,1,""]},"finn.transformation.fpgadataflow":{cleanup:[7,0,0,"-"],codegen_ipgen:[7,0,0,"-"],codegen_ipstitch:[7,0,0,"-"],codegen_npysim:[7,0,0,"-"],compile:[7,0,0,"-"],convert_to_hls_layers:[7,0,0,"-"],create_dataflow_partition:[7,0,0,"-"],hlssynth_ipgen:[7,0,0,"-"],insert_tlastmarker:[7,0,0,"-"],make_deployment:[7,0,0,"-"],make_pynq_driver:[7,0,0,"-"],make_pynq_proj:[7,0,0,"-"],synth_pynq_proj:[7,0,0,"-"],templates:[7,0,0,"-"]},"finn.transformation.fpgadataflow.cleanup":{CleanUp:[7,2,1,""]},"finn.transformation.fpgadataflow.cleanup.CleanUp":{apply:[7,4,1,""]},"finn.transformation.fpgadataflow.codegen_ipgen":{CodeGen_ipgen:[7,2,1,""]},"finn.transformation.fpgadataflow.codegen_ipgen.CodeGen_ipgen":{apply:[7,4,1,""]},"finn.transformation.fpgadataflow.codegen_ipstitch":{CodeGen_ipstitch:[7,2,1,""]},"finn.transformation.fpgadataflow.codegen_ipstitch.CodeGen_ipstitch":{apply:[7,4,1,""]},"finn.transformation.fpgadataflow.codegen_npysim":{CodeGen_npysim:[7,2,1,""]},"finn.transformation.fpgadataflow.codegen_npysim.CodeGen_npysim":{apply:[7,4,1,""]},"finn.transformation.fpgadataflow.compile":{Compile:[7,2,1,""]},"finn.transformation.fpgadataflow.compile.Compile":{apply:[7,4,1,""]},"finn.transformation.fpgadataflow.convert_to_hls_layers":{InferBinaryStreamingFCLayer:[7,2,1,""]},"finn.transformation.fpgadataflow.convert_to_hls_layers.InferBinaryStreamingFCLayer":{apply:[7,4,1,""]},"finn.transformation.fpgadataflow.create_dataflow_partition":{CreateDataflowPartition:[7,2,1,""]},"finn.transformation.fpgadataflow.create_dataflow_partition.CreateDataflowPartition":{apply:[7,4,1,""]},"finn.transformation.fpgadataflow.hlssynth_ipgen":{HLSSynth_IPGen:[7,2,1,""]},"finn.transformation.fpgadataflow.hlssynth_ipgen.HLSSynth_IPGen":{apply:[7,4,1,""]},"finn.transformation.fpgadataflow.insert_tlastmarker":{InsertTLastMarker:[7,2,1,""]},"finn.transformation.fpgadataflow.insert_tlastmarker.InsertTLastMarker":{apply:[7,4,1,""]},"finn.transformation.fpgadataflow.make_deployment":{DeployToPYNQ:[7,2,1,""]},"finn.transformation.fpgadataflow.make_deployment.DeployToPYNQ":{apply:[7,4,1,""]},"finn.transformation.fpgadataflow.make_pynq_driver":{MakePYNQDriver:[7,2,1,""]},"finn.transformation.fpgadataflow.make_pynq_driver.MakePYNQDriver":{apply:[7,4,1,""]},"finn.transformation.fpgadataflow.make_pynq_proj":{MakePYNQProject:[7,2,1,""]},"finn.transformation.fpgadataflow.make_pynq_proj.MakePYNQProject":{apply:[7,4,1,""]},"finn.transformation.fpgadataflow.synth_pynq_proj":{SynthPYNQProject:[7,2,1,""]},"finn.transformation.fpgadataflow.synth_pynq_proj.SynthPYNQProject":{apply:[7,4,1,""]},"finn.transformation.general":{ConvertSubToAdd:[6,2,1,""],GiveRandomTensorNames:[6,2,1,""],GiveReadableTensorNames:[6,2,1,""],GiveUniqueNodeNames:[6,2,1,""]},"finn.transformation.general.ConvertSubToAdd":{apply:[6,4,1,""]},"finn.transformation.general.GiveRandomTensorNames":{apply:[6,4,1,""]},"finn.transformation.general.GiveReadableTensorNames":{apply:[6,4,1,""]},"finn.transformation.general.GiveUniqueNodeNames":{apply:[6,4,1,""]},"finn.transformation.infer_datatypes":{InferDataTypes:[6,2,1,""]},"finn.transformation.infer_datatypes.InferDataTypes":{apply:[6,4,1,""]},"finn.transformation.infer_shapes":{InferShapes:[6,2,1,""]},"finn.transformation.infer_shapes.InferShapes":{apply:[6,4,1,""]},"finn.transformation.streamline":{Streamline:[8,2,1,""],absorb:[8,0,0,"-"],collapse_repeated:[8,0,0,"-"],reorder:[8,0,0,"-"],round_thresholds:[8,0,0,"-"],sign_to_thres:[8,0,0,"-"]},"finn.transformation.streamline.Streamline":{apply:[8,4,1,""]},"finn.transformation.streamline.absorb":{Absorb1BitMulIntoMatMul:[8,2,1,""],AbsorbAddIntoMultiThreshold:[8,2,1,""],AbsorbMulIntoMultiThreshold:[8,2,1,""],FactorOutMulSignMagnitude:[8,2,1,""]},"finn.transformation.streamline.absorb.Absorb1BitMulIntoMatMul":{apply:[8,4,1,""]},"finn.transformation.streamline.absorb.AbsorbAddIntoMultiThreshold":{apply:[8,4,1,""]},"finn.transformation.streamline.absorb.AbsorbMulIntoMultiThreshold":{apply:[8,4,1,""]},"finn.transformation.streamline.absorb.FactorOutMulSignMagnitude":{apply:[8,4,1,""]},"finn.transformation.streamline.collapse_repeated":{CollapseRepeatedAdd:[8,2,1,""],CollapseRepeatedMul:[8,2,1,""],CollapseRepeatedOp:[8,2,1,""]},"finn.transformation.streamline.collapse_repeated.CollapseRepeatedOp":{apply:[8,4,1,""]},"finn.transformation.streamline.reorder":{MoveAddPastMul:[8,2,1,""],MoveScalarAddPastMatMul:[8,2,1,""],MoveScalarMulPastMatMul:[8,2,1,""]},"finn.transformation.streamline.reorder.MoveAddPastMul":{apply:[8,4,1,""]},"finn.transformation.streamline.reorder.MoveScalarAddPastMatMul":{apply:[8,4,1,""]},"finn.transformation.streamline.reorder.MoveScalarMulPastMatMul":{apply:[8,4,1,""]},"finn.transformation.streamline.round_thresholds":{RoundAndClipThresholds:[8,2,1,""]},"finn.transformation.streamline.round_thresholds.RoundAndClipThresholds":{apply:[8,4,1,""]},"finn.transformation.streamline.sign_to_thres":{ConvertSignToThres:[8,2,1,""]},"finn.transformation.streamline.sign_to_thres.ConvertSignToThres":{apply:[8,4,1,""]},"finn.util":{basic:[9,0,0,"-"],data_packing:[9,0,0,"-"],fpgadataflow:[9,0,0,"-"],onnx:[9,0,0,"-"],test:[9,0,0,"-"]},"finn.util.basic":{CppBuilder:[9,2,1,""],calculate_signed_dot_prod_range:[9,1,1,""],gen_finn_dt_tensor:[9,1,1,""],get_by_name:[9,1,1,""],get_finn_root:[9,1,1,""],interleave_matrix_outer_dim_from_partitions:[9,1,1,""],make_build_dir:[9,1,1,""],pad_tensor_to_multiple_of:[9,1,1,""],random_string:[9,1,1,""],remove_by_name:[9,1,1,""],roundup_to_integer_multiple:[9,1,1,""]},"finn.util.basic.CppBuilder":{append_includes:[9,4,1,""],append_sources:[9,4,1,""],build:[9,4,1,""],set_executable_path:[9,4,1,""]},"finn.util.data_packing":{array2hexstring:[9,1,1,""],finnpy_to_packed_bytearray:[9,1,1,""],hexstring2npbytearray:[9,1,1,""],npbytearray2hexstring:[9,1,1,""],npy_to_rtlsim_input:[9,1,1,""],numpy_to_hls_code:[9,1,1,""],pack_innermost_dim_as_hex_string:[9,1,1,""],packed_bytearray_to_finnpy:[9,1,1,""],rtlsim_output_to_npy:[9,1,1,""],unpack_innermost_dim_from_hex_string:[9,1,1,""]},"finn.util.fpgadataflow":{IPGenBuilder:[9,2,1,""],pyverilate_stitched_ip:[9,1,1,""]},"finn.util.fpgadataflow.IPGenBuilder":{append_tcl:[9,4,1,""],build:[9,4,1,""],set_ipgen_path:[9,4,1,""]},"finn.util.onnx":{valueinfo_to_tensor:[9,1,1,""]},"finn.util.test":{get_test_model_def_fxn:[9,1,1,""],get_test_model_trained:[9,1,1,""],get_test_model_untrained:[9,1,1,""],get_trained_checkpoint:[9,1,1,""]},finn:{analysis:[1,0,0,"-"],core:[3,0,0,"-"],custom_op:[4,0,0,"-"],transformation:[6,0,0,"-"],util:[9,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","function","Python function"],"2":["py","class","Python class"],"3":["py","attribute","Python attribute"],"4":["py","method","Python method"]},objtypes:{"0":"py:module","1":"py:function","2":"py:class","3":"py:attribute","4":"py:method"},terms:{"0f01":9,"0x07":9,"0x0e":9,"0x0f01":9,"0xb":9,"0xe":9,"abstract":[4,5,6],"boolean":3,"class":[3,4,5,6,7,8,9],"const":6,"default":[4,5,6],"enum":3,"final":3,"float":9,"function":[3,6,9],"new":3,"return":[1,2,3,4,5,6,8,9],"static":1,"true":[3,9],"var":5,For:8,HLS:3,IPs:7,PEs:5,The:[1,3,6,7,8,9],Use:9,abc:[4,6],abit:9,about:[1,7],absorb1bitmulintomatmul:8,absorb:[0,6,7],absorbaddintomultithreshold:8,absorbmulintomultithreshold:8,acceler:7,account:3,action:7,activ:3,add:[6,8],addition:8,address:7,after:9,aim:8,all:[1,3,4,5,6,7,9],all_tensors_f32:1,allow:3,alreadi:7,also:[4,5,7],amount:9,analysi:[0,3],analysis_fxn:3,anaylsis_fxn:3,ani:[3,6,7,9],annot:[1,4,5],anoth:7,append_includ:9,append_sourc:9,append_tcl:9,appli:[3,6,7,8],apply_rep:6,appropri:6,arbitrari:9,around:3,arrai:9,array2hexstr:9,arxiv:8,assign:3,associ:[3,6],assum:9,attribut:[1,4,5,7],attribute_nam:[4,5],attributeproto:[4,5],backend:7,base:[3,4,5,6,7,8,9],basic:0,batchnorm:6,batchnorm_to_affin:0,batchnormtoaffin:6,been:7,befor:9,between:[5,9],binari:[3,5,7,8,9],bipolar:[3,5,6,8,9],bipolar_to_xnor:0,bit:[3,9],bitwidth:3,blackboxfunct:5,block:7,blott:5,board:7,bool:[1,6],both:9,bram_estim:5,brien:5,build:9,built:1,calc_tmem:5,calc_wmem:5,calcul:5,calculate_signed_dot_prod_rang:9,call:[3,5,6,7],can:[3,6,7,8,9],cannot:6,certain:1,chang:[3,6],check:[1,3,4,5],check_all_tensor_shapes_specifi:3,check_compat:3,cleanup:[0,6],clk:[5,7],clone:9,code:[7,9],code_gen_dir:9,code_generation_ipgen:5,code_generation_npysim:5,codegen_ipgen:[0,6],codegen_ipstitch:[0,6],codegen_npysim:[0,6],collaps:8,collapse_rep:[0,6],collapserepeatedadd:8,collapserepeatedmul:8,collapserepeatedop:8,collect:7,come:1,compar:[3,4],compare_execut:3,compare_fxn:3,compat:[3,4,5],compil:[0,6],compile_singlenode_cod:5,comput:3,consecut:8,constant:[1,3,8],consum:3,contain:[3,4,7,9],content:[],context:[3,4,5],convent:1,convert:[5,6,7,8,9],convert_to_hls_lay:[0,6],convertbipolarmatmultoxnorpopcount:6,convertsigntothr:8,convertsubtoadd:6,convolutioninputgener:[0,4],copi:[3,6,7],core:0,correct:6,correctli:[1,4,5,7],correspond:[3,4,5],count:5,cpp_file:9,cppbuilder:9,creat:[3,7,9],create_dataflow_partit:[0,6],createdataflowpartit:7,current:3,custom:[1,3],custom_op:0,customop:[4,5],data:[4,7,9],data_pack:0,dataflow:[3,7],dataoutstrm:5,datatyp:[0,4,5,6,9],debug:3,declar:6,deep:[3,5,6],default_v:[4,5],default_valu:[4,5],defin:5,deploy:7,deploytopynq:7,design:7,dict:[3,4,5],dictionari:[1,3],digit:9,dimens:9,dimension:9,dir:[7,9],directori:[7,9],distr_pad:9,divis:9,docker:9,docomput:5,don:6,done:1,dot:9,driver:7,dt_a:9,dt_b:9,dtype:[1,3,4,5,9],dynam:1,dynamic_input_to_npi:5,each:[1,3,6,8,9],effect:6,element:9,embed:3,emit:9,empti:3,end:5,ensur:[5,6,7,9],enumer:[3,6],equal:[4,5],equival:8,estim:2,even:6,evenli:9,everi:6,exampl:9,exec_precompiled_singlenode_model:5,execut:[3,4,5],execute_custom_nod:0,execute_nod:[3,4,5],execute_onnx:3,execute_onnx_and_make_model:3,exist:[4,9],exit:9,expect:[1,3,4,5,7],explor:[3,5],expos:3,extra:[1,9],extract:[1,2],factor:9,factoroutmulsignmagnitud:8,fals:[3,6,9],fan:1,fast:5,fewest:3,field:[7,9],file:[3,7,9],filenam:[3,7],find:3,find_consum:3,find_produc:3,finn:[],finn_dt:9,finnpy_to_packed_bytearrai:9,first:[1,8],fix:[6,9],flatten:9,float32:[1,3],fold_const:0,foldconst:6,folder:[7,9],follow:[1,7],form:5,found:7,four:9,fpgadataflow:[0,1,4,6],fpgapart:[5,7],framework:5,fraser:5,from:[2,3,7,9],full:3,further:6,gambardella:5,gen_finn_dt_tensor:9,gener:[0,7,9],generate_param:5,get:[3,4],get_all_tensor_nam:3,get_by_nam:9,get_finn_root:9,get_folded_input_shap:5,get_folded_output_shap:5,get_hls_compatible_threshold_tensor:5,get_hls_compatible_weight_tensor:5,get_hls_datatype_str:3,get_initi:3,get_input_datatyp:5,get_instream_width:5,get_metadata_prop:3,get_nodeattr:4,get_nodeattr_typ:[4,5],get_num_possible_valu:3,get_number_output_valu:5,get_output_datatyp:5,get_outstream_width:5,get_per_tensor_fanout:1,get_smallest_poss:3,get_stream_width:5,get_template_param_valu:5,get_tensor_datatyp:3,get_tensor_fanout:3,get_tensor_shap:3,get_tensor_valueinfo:3,get_test_model_def_fxn:9,get_test_model_train:9,get_test_model_untrain:9,get_trained_checkpoint:9,get_weight_datatyp:5,getcustomop:4,give:[6,8],give_unique_node_nam:6,given:[1,2,3,4,5,9],giverandomtensornam:6,givereadabletensornam:6,giveuniquenodenam:6,global_includ:5,graph:[1,3,4,5,6,7],guarante:6,guid:0,has:[1,3,6,7,9],have:[1,3,6,7,8],hex:9,hexstr:9,hexstring2npbytearrai:9,hls_synth_res_estim:[0,1],hls_var_nam:9,hlscustomop:5,hlslib:5,hlssynth_ipgen:[0,6],host:9,how:[0,9],human:6,immedi:7,implement:3,includ:[3,7],index:10,indic:[3,4,5,6,7],infer:[3,4,5,6,9],infer_datatyp:0,infer_node_datatyp:[4,5],infer_shap:0,inferbinarystreamingfclay:7,inferdatatyp:6,infershap:6,infinit:6,info:[6,9],info_messag:1,inform:[1,7],infrastructur:7,inherit:6,initi:[1,3],innermost:9,inp0:4,inp1:4,inp:5,input:[1,3,4,5,6,8,9],input_dict:3,input_dtyp:9,input_fil:9,insert:[7,9],insert_tlastmark:[0,6],inserttlastmark:7,insid:4,instanc:[3,4,5,8],instanti:7,instead:9,int16:3,int2:3,int32:3,int3:3,int4:3,int8:3,integ:[3,8,9],interfac:7,interleav:5,interleave_matrix_outer_dim_from_partit:9,intermedi:[3,6],intern:6,ipgen_singlenode_cod:5,ipgenbuild:9,is_integ:3,is_linear:1,item:9,kei:3,know:6,lambda:3,largest:3,layer:[6,7],lead:9,learn:5,leeser:5,len:9,let:6,letter:9,library_path:9,linear:[1,3],list:[1,3],look:1,loop:6,lut_estim:5,made:[3,6],magnitud:8,make:[6,7],make_build_dir:9,make_collapsed_param_fxn:8,make_deepcopi:3,make_deploy:[0,6],make_empty_exec_context:3,make_new_valueinfo_nam:3,make_project:7,make_pynq_driv:[0,6],make_pynq_proj:[0,6],make_shape_compatible_op:[4,5],makepynqdriv:7,makepynqproject:7,manipul:3,manual:6,matmul:[6,8],matrix:[5,8,9],max:[3,9],mean:9,meant:6,member:[4,5],metadata_prop:[3,7],min:[3,9],minimum:9,mixtur:1,mkdtemp:9,mode:[],model:[1,2,3,4,5,6,7,8,9],model_a:3,model_b:3,model_was_chang:6,modelproto:[3,7],modelwrapp:[0,1,6],modul:10,more:[3,6,9],move:8,moveaddpastmul:8,movescalaraddpastmatmul:8,movescalarmulpastmatmul:8,mul:[6,8],multidimension:9,multipl:[6,8,9],multipli:8,multithreshold:[0,7,8],must:[4,6,7,8,9],mvtu:7,n_partit:9,n_thres_step:5,name:[1,2,3,4,6,9],name_field:9,ndarrai:9,nearest:[8,9],necessari:7,need:[2,4,5,6],neg:[3,8],netnam:9,network:5,neural:5,new_nam:3,next:8,no_decl:9,node:[1,2,3,4,5,6,7,8],node_inputs_in_expected_ord:1,node_res_estim:5,non:7,none:[3,4,9],notwithstand:1,now:[1,3],npbytearrai:9,npbytearray2hexstr:9,npy:9,npy_to_dynamic_output:5,npy_to_rtlsim_input:9,number:[3,4,5,9],numpi:[5,9],numpy_to_hls_cod:9,object:[3,9],old_nam:3,onc:6,one:[1,3,7,9],onli:[1,3,6,7,8],onnx:[0,3,4,5,7],onnx_exec:0,onnx_model_proto:3,onnx_nod:[4,5],onnxruntim:3,op_nam:8,op_typ:1,oper:[3,8],ops:[1,8],order:1,orig_thres_matrix:5,orig_weight_matrix:5,origin:5,other:[3,8],otherwis:[3,6,9],out:1,out_bia:4,out_scal:4,out_shap:9,outcom:7,output:[3,4,5,6,9],output_shap:9,overlai:7,pack:[7,9],pack_innermost_dim:9,pack_innermost_dim_as_hex_str:9,packag:[],packed_bytearrai:9,packed_bytearray_to_finnpi:9,packedbit:9,pad:9,pad_tensor_to_multiple_of:9,pad_to_dim:9,pad_to_nbit:9,page:10,pair:7,paramet:8,part:[4,9],particular:[4,5,9],partit:3,pass:[0,5],password:7,past:8,path:[5,9],per:7,perform:[4,5],permit:[4,5],place:7,platform:7,point:6,posit:[5,8,9],possibl:[3,7],pragma:5,preced:8,precid:8,precis:9,precomput:6,prefer:3,prefix:9,prepend:9,preusser:5,previous:7,prior:[6,7,9],produc:[1,3],product:9,project:7,properti:[1,3],provid:3,pynq:7,pynq_driver_dir:7,python:[7,9],pyveril:9,pyverilate_stitched_ip:9,quantiz:[1,5],random:[6,9],random_str:9,randomli:9,reach:6,read_npy_data:5,readabl:6,recommend:6,registri:0,remot:3,remov:[7,9],remove_by_nam:9,remove_prefix:9,renam:3,rename_tensor:3,reorder:[0,6],repeat:[6,8],repeatedli:3,replac:6,repres:[3,9],represent:9,requir:[3,4,5],res_estim:[0,1],reset_rtlsim:5,reshap:5,resourc:2,respect:9,result:[1,2,3,6,7,8,9],return_full_exec_context:3,returned_dict:[4,5],revers:9,reverse_endian:9,reverse_inn:9,root:9,round:[8,9],round_threshold:[0,6],roundandclipthreshold:8,roundup_to_integer_multipl:9,row:5,rtlsim:[3,5],rtlsim_output_to_npi:9,run:[3,7],same:[7,9],save:[3,9],save_as_npi:5,scalar:8,scp:7,script:7,search:10,second:[7,8],see:[8,9],sep:5,sequenc:9,set:[3,4,5,7,8,9],set_attribut:[],set_executable_path:9,set_initi:3,set_ipgen_path:9,set_metadata_prop:3,set_nodeattr:4,set_sim_mod:[0,6],set_tensor_datatyp:3,set_tensor_shap:3,setsimmod:[],shape:[3,4,5,6,9],shell:7,should:[1,3,6],sign:[3,6,8,9],sign_to_thr:[0,6],sim:[5,9],sim_mod:[],simd:5,sinc:[3,9],singl:[3,8,9],small:1,smallest:3,some:[3,6],specifi:[3,6,9],split:[7,8,9],standard:[3,4,5],stitch:[7,9],store:[4,7,9],streamingdataflowpartit:[0,7],streamingfclayer_batch:[0,4,7],streamingmaxpool_batch:[0,4],streamlin:[0,6],string:[1,9],stringlength:9,strm_decl:5,structur:1,sub:6,subdirectori:7,subgraph:3,submodul:0,subpackag:[],subset:1,success:7,suitabl:5,surviv:9,synth_pynq_proj:[0,6],synthesi:[2,7],synthpynqproject:7,take:[1,3,6,8,9],taken:[3,7],target:7,target_dir:7,targetbit:9,tcl:7,tcl_script:9,tempfil:9,templat:[0,4,6],temporari:9,tensor:[1,3,6,8,9],tensor_fanout:1,tensor_nam:[1,3],tensor_shap:[3,9],tensor_valu:3,termin:7,ternari:3,test:[0,6],thei:8,them:[1,7,8],thi:[1,3,4,5,6,7,9],threshold:[4,5,8],time:6,tlastmark:[0,4,7],tmem:5,togeth:7,toggle_clk:5,topolog:0,transform:[0,3],transformed_model:6,travers:1,tupl:6,two:[3,7,8,9],type:[3,6,9],uint16:3,uint2:[3,9],uint32:3,uint3:3,uint4:3,uint8:[3,9],umuroglu:5,under:7,uniqu:6,unpack:[7,9],unpack_innermost_dim_from_hex_str:9,unsign:[3,8],until:3,updat:8,used:[3,4,5,9],useful:3,user:6,usernam:7,using:[3,6,8,9],util:[0,3,4,5],val:9,valu:[3,4,5,7,8,9],value_info:3,valueinfo:[3,6],valueinfo_to_tensor:9,valueinfoproto:[3,9],variabl:9,vector:[8,9],verif:1,verifi:[1,4,5],verify_custom_nod:0,verify_nod:[1,4,5],via:3,visser:5,vivado:[2,3,7],vivado_pynq_proj:7,vivado_stitch_proj:7,wai:1,want:8,wbit:9,weight:[3,5],when:[1,6],where:[3,4,5,7,8],whether:[1,3,4,5,6],which:[3,4,5,7,8,9],width:9,wmem:5,work:[3,9],wrapper:3,write:0,xnorpopcount:0,xnorpopcountmatmul:[4,6,7],you:6,your:6,zero:[3,8,9]},titles:["finn package","finn.analysis package","finn.analysis.fpgadataflow package","finn.core package","finn.custom_op package","finn.custom_op.fpgadataflow package","finn.transformation package","finn.transformation.fpgadataflow package","finn.transformation.streamline package","finn.util package","FINN","src"],titleterms:{absorb:8,analysi:[1,2],basic:9,batchnorm_to_affin:6,bipolar_to_xnor:6,cleanup:7,codegen_ipgen:7,codegen_ipstitch:7,codegen_npysim:7,collapse_rep:8,compil:7,content:[0,1,2,3,4,5,6,7,8,9],convert_to_hls_lay:7,convolutioninputgener:5,core:3,create_dataflow_partit:7,custom_op:[4,5],data_pack:9,datatyp:3,document:[],execute_custom_nod:3,finn:[0,1,2,3,4,5,6,7,8,9,10],fold_const:6,fpgadataflow:[2,5,7,9],gener:6,guid:6,hls_synth_res_estim:2,hlssynth_ipgen:7,how:1,indic:10,infer_datatyp:6,infer_shap:6,insert_tlastmark:7,make_deploy:7,make_pynq_driv:7,make_pynq_proj:7,modelwrapp:3,modul:[0,1,2,3,4,5,6,7,8,9],multithreshold:4,onnx:9,onnx_exec:3,packag:[0,1,2,3,4,5,6,7,8,9],pass:1,registri:4,reorder:8,res_estim:2,round_threshold:8,set_sim_mod:7,sign_to_thr:8,src:11,streamingdataflowpartit:4,streamingfclayer_batch:5,streamingmaxpool_batch:5,streamlin:8,submodul:[1,2,3,4,5,6,7,8,9],subpackag:[0,1,4,6],synth_pynq_proj:7,tabl:10,templat:[5,7],test:9,tlastmark:5,topolog:1,transform:[6,7,8],util:9,verify_custom_nod:1,welcom:[],write:[1,6],xnorpopcount:4}})
\ No newline at end of file
+Search.setIndex({docnames:["finn","finn.analysis","finn.analysis.fpgadataflow","finn.core","finn.custom_op","finn.custom_op.fpgadataflow","finn.transformation","finn.transformation.fpgadataflow","finn.transformation.streamline","finn.util","index","modules"],envversion:{"sphinx.domains.c":1,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":1,"sphinx.domains.javascript":1,"sphinx.domains.math":2,"sphinx.domains.python":1,"sphinx.domains.rst":1,"sphinx.domains.std":1,sphinx:56},filenames:["finn.rst","finn.analysis.rst","finn.analysis.fpgadataflow.rst","finn.core.rst","finn.custom_op.rst","finn.custom_op.fpgadataflow.rst","finn.transformation.rst","finn.transformation.fpgadataflow.rst","finn.transformation.streamline.rst","finn.util.rst","index.rst","modules.rst"],objects:{"":{finn:[0,0,0,"-"]},"finn.analysis":{fpgadataflow:[2,0,0,"-"],topology:[1,0,0,"-"],verify_custom_nodes:[1,0,0,"-"]},"finn.analysis.fpgadataflow":{hls_synth_res_estimation:[2,0,0,"-"],res_estimation:[2,0,0,"-"]},"finn.analysis.fpgadataflow.hls_synth_res_estimation":{hls_synth_res_estimation:[2,1,1,""]},"finn.analysis.fpgadataflow.res_estimation":{res_estimation:[2,1,1,""]},"finn.analysis.topology":{all_tensors_f32:[1,1,1,""],get_per_tensor_fanouts:[1,1,1,""],is_linear:[1,1,1,""],node_inputs_in_expected_order:[1,1,1,""]},"finn.analysis.verify_custom_nodes":{verify_nodes:[1,1,1,""]},"finn.core":{datatype:[3,0,0,"-"],execute_custom_node:[3,0,0,"-"],modelwrapper:[3,0,0,"-"],onnx_exec:[3,0,0,"-"]},"finn.core.datatype":{DataType:[3,2,1,""]},"finn.core.datatype.DataType":{BINARY:[3,3,1,""],BIPOLAR:[3,3,1,""],FLOAT32:[3,3,1,""],INT16:[3,3,1,""],INT2:[3,3,1,""],INT32:[3,3,1,""],INT3:[3,3,1,""],INT4:[3,3,1,""],INT8:[3,3,1,""],TERNARY:[3,3,1,""],UINT16:[3,3,1,""],UINT2:[3,3,1,""],UINT32:[3,3,1,""],UINT3:[3,3,1,""],UINT4:[3,3,1,""],UINT8:[3,3,1,""],allowed:[3,4,1,""],bitwidth:[3,4,1,""],get_hls_datatype_str:[3,4,1,""],get_num_possible_values:[3,4,1,""],get_smallest_possible:[3,4,1,""],is_integer:[3,4,1,""],max:[3,4,1,""],min:[3,4,1,""],signed:[3,4,1,""]},"finn.core.execute_custom_node":{execute_custom_node:[3,1,1,""]},"finn.core.modelwrapper":{ModelWrapper:[3,2,1,""]},"finn.core.modelwrapper.ModelWrapper":{analysis:[3,4,1,""],check_all_tensor_shapes_specified:[3,4,1,""],check_compatibility:[3,4,1,""],find_consumer:[3,4,1,""],find_producer:[3,4,1,""],get_all_tensor_names:[3,4,1,""],get_initializer:[3,4,1,""],get_metadata_prop:[3,4,1,""],get_tensor_datatype:[3,4,1,""],get_tensor_fanout:[3,4,1,""],get_tensor_shape:[3,4,1,""],get_tensor_valueinfo:[3,4,1,""],graph:[3,4,1,""],make_empty_exec_context:[3,4,1,""],make_new_valueinfo_name:[3,4,1,""],model:[3,4,1,""],rename_tensor:[3,4,1,""],save:[3,4,1,""],set_initializer:[3,4,1,""],set_metadata_prop:[3,4,1,""],set_tensor_datatype:[3,4,1,""],set_tensor_shape:[3,4,1,""],transform:[3,4,1,""]},"finn.core.onnx_exec":{compare_execution:[3,1,1,""],execute_node:[3,1,1,""],execute_onnx:[3,1,1,""],execute_onnx_and_make_model:[3,1,1,""]},"finn.custom_op":{CustomOp:[4,2,1,""],fpgadataflow:[5,0,0,"-"],multithreshold:[4,0,0,"-"],registry:[4,0,0,"-"],streamingdataflowpartition:[4,0,0,"-"],xnorpopcount:[4,0,0,"-"]},"finn.custom_op.CustomOp":{execute_node:[4,4,1,""],get_nodeattr:[4,4,1,""],get_nodeattr_types:[4,4,1,""],infer_node_datatype:[4,4,1,""],make_shape_compatible_op:[4,4,1,""],set_nodeattr:[4,4,1,""],verify_node:[4,4,1,""]},"finn.custom_op.fpgadataflow":{HLSCustomOp:[5,2,1,""],convolutioninputgenerator:[5,0,0,"-"],streamingfclayer_batch:[5,0,0,"-"],streamingmaxpool_batch:[5,0,0,"-"],templates:[5,0,0,"-"],tlastmarker:[5,0,0,"-"]},"finn.custom_op.fpgadataflow.HLSCustomOp":{blackboxfunction:[5,4,1,""],bram_estimation:[5,4,1,""],code_generation_ipgen:[5,4,1,""],code_generation_npysim:[5,4,1,""],compile_singlenode_code:[5,4,1,""],dataoutstrm:[5,4,1,""],defines:[5,4,1,""],docompute:[5,4,1,""],dynamic_input_to_npy:[5,4,1,""],exec_precompiled_singlenode_model:[5,4,1,""],execute_node:[5,4,1,""],generate_params:[5,4,1,""],get_folded_input_shape:[5,4,1,""],get_folded_output_shape:[5,4,1,""],get_instream_width:[5,4,1,""],get_nodeattr_types:[5,4,1,""],get_number_output_values:[5,4,1,""],get_outstream_width:[5,4,1,""],global_includes:[5,4,1,""],ipgen_singlenode_code:[5,4,1,""],lut_estimation:[5,4,1,""],node_res_estimation:[5,4,1,""],npy_to_dynamic_output:[5,4,1,""],pragmas:[5,4,1,""],read_npy_data:[5,4,1,""],reset_rtlsim:[5,4,1,""],rtlsim:[5,4,1,""],save_as_npy:[5,4,1,""],strm_decl:[5,4,1,""],toggle_clk:[5,4,1,""]},"finn.custom_op.fpgadataflow.convolutioninputgenerator":{ConvolutionInputGenerator:[5,2,1,""]},"finn.custom_op.fpgadataflow.convolutioninputgenerator.ConvolutionInputGenerator":{blackboxfunction:[5,4,1,""],bram_estimation:[5,4,1,""],dataoutstrm:[5,4,1,""],defines:[5,4,1,""],docompute:[5,4,1,""],execute_node:[5,4,1,""],get_input_datatype:[5,4,1,""],get_nodeattr_types:[5,4,1,""],get_number_output_values:[5,4,1,""],get_output_datatype:[5,4,1,""],get_stream_width:[5,4,1,""],global_includes:[5,4,1,""],infer_node_datatype:[5,4,1,""],lut_estimation:[5,4,1,""],make_shape_compatible_op:[5,4,1,""],pragmas:[5,4,1,""],read_npy_data:[5,4,1,""],save_as_npy:[5,4,1,""],strm_decl:[5,4,1,""],verify_node:[5,4,1,""]},"finn.custom_op.fpgadataflow.streamingfclayer_batch":{StreamingFCLayer_Batch:[5,2,1,""]},"finn.custom_op.fpgadataflow.streamingfclayer_batch.StreamingFCLayer_Batch":{blackboxfunction:[5,4,1,""],bram_estimation:[5,4,1,""],calc_tmem:[5,4,1,""],calc_wmem:[5,4,1,""],dataoutstrm:[5,4,1,""],defines:[5,4,1,""],docompute:[5,4,1,""],execute_node:[5,4,1,""],generate_params:[5,4,1,""],get_folded_input_shape:[5,4,1,""],get_folded_output_shape:[5,4,1,""],get_hls_compatible_threshold_tensor:[5,4,1,""],get_hls_compatible_weight_tensor:[5,4,1,""],get_input_datatype:[5,4,1,""],get_instream_width:[5,4,1,""],get_nodeattr_types:[5,4,1,""],get_number_output_values:[5,4,1,""],get_output_datatype:[5,4,1,""],get_outstream_width:[5,4,1,""],get_template_param_values:[5,4,1,""],get_weight_datatype:[5,4,1,""],global_includes:[5,4,1,""],infer_node_datatype:[5,4,1,""],lut_estimation:[5,4,1,""],make_shape_compatible_op:[5,4,1,""],pragmas:[5,4,1,""],read_npy_data:[5,4,1,""],save_as_npy:[5,4,1,""],strm_decl:[5,4,1,""],verify_node:[5,4,1,""]},"finn.custom_op.fpgadataflow.streamingmaxpool_batch":{StreamingMaxPool_Batch:[5,2,1,""]},"finn.custom_op.fpgadataflow.streamingmaxpool_batch.StreamingMaxPool_Batch":{blackboxfunction:[5,4,1,""],bram_estimation:[5,4,1,""],dataoutstrm:[5,4,1,""],defines:[5,4,1,""],docompute:[5,4,1,""],get_nodeattr_types:[5,4,1,""],get_number_output_values:[5,4,1,""],global_includes:[5,4,1,""],infer_node_datatype:[5,4,1,""],lut_estimation:[5,4,1,""],make_shape_compatible_op:[5,4,1,""],pragmas:[5,4,1,""],read_npy_data:[5,4,1,""],save_as_npy:[5,4,1,""],strm_decl:[5,4,1,""],verify_node:[5,4,1,""]},"finn.custom_op.fpgadataflow.tlastmarker":{TLastMarker:[5,2,1,""]},"finn.custom_op.fpgadataflow.tlastmarker.TLastMarker":{blackboxfunction:[5,4,1,""],dataoutstrm:[5,4,1,""],defines:[5,4,1,""],docompute:[5,4,1,""],execute_node:[5,4,1,""],get_folded_input_shape:[5,4,1,""],get_folded_output_shape:[5,4,1,""],get_instream_width:[5,4,1,""],get_nodeattr_types:[5,4,1,""],get_number_output_values:[5,4,1,""],get_outstream_width:[5,4,1,""],global_includes:[5,4,1,""],infer_node_datatype:[5,4,1,""],make_shape_compatible_op:[5,4,1,""],pragmas:[5,4,1,""],read_npy_data:[5,4,1,""],save_as_npy:[5,4,1,""],strm_decl:[5,4,1,""],verify_node:[5,4,1,""]},"finn.custom_op.multithreshold":{MultiThreshold:[4,2,1,""],compare:[4,1,1,""],multithreshold:[4,1,1,""]},"finn.custom_op.multithreshold.MultiThreshold":{execute_node:[4,4,1,""],get_nodeattr_types:[4,4,1,""],infer_node_datatype:[4,4,1,""],make_shape_compatible_op:[4,4,1,""],verify_node:[4,4,1,""]},"finn.custom_op.registry":{getCustomOp:[4,1,1,""]},"finn.custom_op.streamingdataflowpartition":{StreamingDataflowPartition:[4,2,1,""]},"finn.custom_op.streamingdataflowpartition.StreamingDataflowPartition":{execute_node:[4,4,1,""],get_nodeattr_types:[4,4,1,""],infer_node_datatype:[4,4,1,""],make_shape_compatible_op:[4,4,1,""],verify_node:[4,4,1,""]},"finn.custom_op.xnorpopcount":{XnorPopcountMatMul:[4,2,1,""],xnorpopcountmatmul:[4,1,1,""]},"finn.custom_op.xnorpopcount.XnorPopcountMatMul":{execute_node:[4,4,1,""],get_nodeattr_types:[4,4,1,""],infer_node_datatype:[4,4,1,""],make_shape_compatible_op:[4,4,1,""],verify_node:[4,4,1,""]},"finn.transformation":{Transformation:[6,2,1,""],batchnorm_to_affine:[6,0,0,"-"],bipolar_to_xnor:[6,0,0,"-"],fold_constants:[6,0,0,"-"],fpgadataflow:[7,0,0,"-"],general:[6,0,0,"-"],infer_datatypes:[6,0,0,"-"],infer_shapes:[6,0,0,"-"],streamline:[8,0,0,"-"]},"finn.transformation.Transformation":{apply:[6,4,1,""]},"finn.transformation.batchnorm_to_affine":{BatchNormToAffine:[6,2,1,""]},"finn.transformation.batchnorm_to_affine.BatchNormToAffine":{apply:[6,4,1,""]},"finn.transformation.bipolar_to_xnor":{ConvertBipolarMatMulToXnorPopcount:[6,2,1,""]},"finn.transformation.bipolar_to_xnor.ConvertBipolarMatMulToXnorPopcount":{apply:[6,4,1,""]},"finn.transformation.fold_constants":{FoldConstants:[6,2,1,""]},"finn.transformation.fold_constants.FoldConstants":{apply:[6,4,1,""]},"finn.transformation.fpgadataflow":{cleanup:[7,0,0,"-"],codegen_ipgen:[7,0,0,"-"],codegen_ipstitch:[7,0,0,"-"],codegen_npysim:[7,0,0,"-"],compile:[7,0,0,"-"],convert_to_hls_layers:[7,0,0,"-"],create_dataflow_partition:[7,0,0,"-"],hlssynth_ipgen:[7,0,0,"-"],insert_tlastmarker:[7,0,0,"-"],make_deployment:[7,0,0,"-"],make_pynq_driver:[7,0,0,"-"],make_pynq_proj:[7,0,0,"-"],synth_pynq_proj:[7,0,0,"-"],templates:[7,0,0,"-"]},"finn.transformation.fpgadataflow.cleanup":{CleanUp:[7,2,1,""]},"finn.transformation.fpgadataflow.cleanup.CleanUp":{apply:[7,4,1,""]},"finn.transformation.fpgadataflow.codegen_ipgen":{CodeGen_ipgen:[7,2,1,""]},"finn.transformation.fpgadataflow.codegen_ipgen.CodeGen_ipgen":{apply:[7,4,1,""]},"finn.transformation.fpgadataflow.codegen_ipstitch":{CodeGen_ipstitch:[7,2,1,""]},"finn.transformation.fpgadataflow.codegen_ipstitch.CodeGen_ipstitch":{apply:[7,4,1,""]},"finn.transformation.fpgadataflow.codegen_npysim":{CodeGen_npysim:[7,2,1,""]},"finn.transformation.fpgadataflow.codegen_npysim.CodeGen_npysim":{apply:[7,4,1,""]},"finn.transformation.fpgadataflow.compile":{Compile:[7,2,1,""]},"finn.transformation.fpgadataflow.compile.Compile":{apply:[7,4,1,""]},"finn.transformation.fpgadataflow.convert_to_hls_layers":{InferBinaryStreamingFCLayer:[7,2,1,""]},"finn.transformation.fpgadataflow.convert_to_hls_layers.InferBinaryStreamingFCLayer":{apply:[7,4,1,""]},"finn.transformation.fpgadataflow.create_dataflow_partition":{CreateDataflowPartition:[7,2,1,""]},"finn.transformation.fpgadataflow.create_dataflow_partition.CreateDataflowPartition":{apply:[7,4,1,""]},"finn.transformation.fpgadataflow.hlssynth_ipgen":{HLSSynth_IPGen:[7,2,1,""]},"finn.transformation.fpgadataflow.hlssynth_ipgen.HLSSynth_IPGen":{apply:[7,4,1,""]},"finn.transformation.fpgadataflow.insert_tlastmarker":{InsertTLastMarker:[7,2,1,""]},"finn.transformation.fpgadataflow.insert_tlastmarker.InsertTLastMarker":{apply:[7,4,1,""]},"finn.transformation.fpgadataflow.make_deployment":{DeployToPYNQ:[7,2,1,""]},"finn.transformation.fpgadataflow.make_deployment.DeployToPYNQ":{apply:[7,4,1,""]},"finn.transformation.fpgadataflow.make_pynq_driver":{MakePYNQDriver:[7,2,1,""]},"finn.transformation.fpgadataflow.make_pynq_driver.MakePYNQDriver":{apply:[7,4,1,""]},"finn.transformation.fpgadataflow.make_pynq_proj":{MakePYNQProject:[7,2,1,""]},"finn.transformation.fpgadataflow.make_pynq_proj.MakePYNQProject":{apply:[7,4,1,""]},"finn.transformation.fpgadataflow.synth_pynq_proj":{SynthPYNQProject:[7,2,1,""]},"finn.transformation.fpgadataflow.synth_pynq_proj.SynthPYNQProject":{apply:[7,4,1,""]},"finn.transformation.general":{ConvertSubToAdd:[6,2,1,""],GiveRandomTensorNames:[6,2,1,""],GiveReadableTensorNames:[6,2,1,""],GiveUniqueNodeNames:[6,2,1,""]},"finn.transformation.general.ConvertSubToAdd":{apply:[6,4,1,""]},"finn.transformation.general.GiveRandomTensorNames":{apply:[6,4,1,""]},"finn.transformation.general.GiveReadableTensorNames":{apply:[6,4,1,""]},"finn.transformation.general.GiveUniqueNodeNames":{apply:[6,4,1,""]},"finn.transformation.infer_datatypes":{InferDataTypes:[6,2,1,""]},"finn.transformation.infer_datatypes.InferDataTypes":{apply:[6,4,1,""]},"finn.transformation.infer_shapes":{InferShapes:[6,2,1,""]},"finn.transformation.infer_shapes.InferShapes":{apply:[6,4,1,""]},"finn.transformation.streamline":{Streamline:[8,2,1,""],absorb:[8,0,0,"-"],collapse_repeated:[8,0,0,"-"],reorder:[8,0,0,"-"],round_thresholds:[8,0,0,"-"],sign_to_thres:[8,0,0,"-"]},"finn.transformation.streamline.Streamline":{apply:[8,4,1,""]},"finn.transformation.streamline.absorb":{Absorb1BitMulIntoMatMul:[8,2,1,""],AbsorbAddIntoMultiThreshold:[8,2,1,""],AbsorbMulIntoMultiThreshold:[8,2,1,""],FactorOutMulSignMagnitude:[8,2,1,""]},"finn.transformation.streamline.absorb.Absorb1BitMulIntoMatMul":{apply:[8,4,1,""]},"finn.transformation.streamline.absorb.AbsorbAddIntoMultiThreshold":{apply:[8,4,1,""]},"finn.transformation.streamline.absorb.AbsorbMulIntoMultiThreshold":{apply:[8,4,1,""]},"finn.transformation.streamline.absorb.FactorOutMulSignMagnitude":{apply:[8,4,1,""]},"finn.transformation.streamline.collapse_repeated":{CollapseRepeatedAdd:[8,2,1,""],CollapseRepeatedMul:[8,2,1,""],CollapseRepeatedOp:[8,2,1,""]},"finn.transformation.streamline.collapse_repeated.CollapseRepeatedOp":{apply:[8,4,1,""]},"finn.transformation.streamline.reorder":{MoveAddPastMul:[8,2,1,""],MoveScalarAddPastMatMul:[8,2,1,""],MoveScalarMulPastMatMul:[8,2,1,""]},"finn.transformation.streamline.reorder.MoveAddPastMul":{apply:[8,4,1,""]},"finn.transformation.streamline.reorder.MoveScalarAddPastMatMul":{apply:[8,4,1,""]},"finn.transformation.streamline.reorder.MoveScalarMulPastMatMul":{apply:[8,4,1,""]},"finn.transformation.streamline.round_thresholds":{RoundAndClipThresholds:[8,2,1,""]},"finn.transformation.streamline.round_thresholds.RoundAndClipThresholds":{apply:[8,4,1,""]},"finn.transformation.streamline.sign_to_thres":{ConvertSignToThres:[8,2,1,""]},"finn.transformation.streamline.sign_to_thres.ConvertSignToThres":{apply:[8,4,1,""]},"finn.util":{basic:[9,0,0,"-"],data_packing:[9,0,0,"-"],fpgadataflow:[9,0,0,"-"],onnx:[9,0,0,"-"],test:[9,0,0,"-"]},"finn.util.basic":{CppBuilder:[9,2,1,""],calculate_signed_dot_prod_range:[9,1,1,""],gen_finn_dt_tensor:[9,1,1,""],get_by_name:[9,1,1,""],get_finn_root:[9,1,1,""],interleave_matrix_outer_dim_from_partitions:[9,1,1,""],make_build_dir:[9,1,1,""],pad_tensor_to_multiple_of:[9,1,1,""],random_string:[9,1,1,""],remove_by_name:[9,1,1,""],roundup_to_integer_multiple:[9,1,1,""]},"finn.util.basic.CppBuilder":{append_includes:[9,4,1,""],append_sources:[9,4,1,""],build:[9,4,1,""],set_executable_path:[9,4,1,""]},"finn.util.data_packing":{array2hexstring:[9,1,1,""],finnpy_to_packed_bytearray:[9,1,1,""],hexstring2npbytearray:[9,1,1,""],npbytearray2hexstring:[9,1,1,""],npy_to_rtlsim_input:[9,1,1,""],numpy_to_hls_code:[9,1,1,""],pack_innermost_dim_as_hex_string:[9,1,1,""],packed_bytearray_to_finnpy:[9,1,1,""],rtlsim_output_to_npy:[9,1,1,""],unpack_innermost_dim_from_hex_string:[9,1,1,""]},"finn.util.fpgadataflow":{IPGenBuilder:[9,2,1,""],pyverilate_stitched_ip:[9,1,1,""]},"finn.util.fpgadataflow.IPGenBuilder":{append_tcl:[9,4,1,""],build:[9,4,1,""],set_ipgen_path:[9,4,1,""]},"finn.util.onnx":{valueinfo_to_tensor:[9,1,1,""]},"finn.util.test":{get_test_model_def_fxn:[9,1,1,""],get_test_model_trained:[9,1,1,""],get_test_model_untrained:[9,1,1,""],get_trained_checkpoint:[9,1,1,""]},finn:{analysis:[1,0,0,"-"],core:[3,0,0,"-"],custom_op:[4,0,0,"-"],transformation:[6,0,0,"-"],util:[9,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","function","Python function"],"2":["py","class","Python class"],"3":["py","attribute","Python attribute"],"4":["py","method","Python method"]},objtypes:{"0":"py:module","1":"py:function","2":"py:class","3":"py:attribute","4":"py:method"},terms:{"0f01":9,"0x07":9,"0x0e":9,"0x0f01":9,"0xb":9,"0xe":9,"600px":10,"abstract":[4,5,6],"boolean":3,"class":[3,4,5,6,7,8,9],"const":6,"default":[4,5,6],"enum":3,"final":3,"float":9,"function":[3,6,9],"new":3,"return":[1,2,3,4,5,6,8,9],"static":1,"true":[3,9],"var":5,For:8,HLS:[3,10],IPs:7,PEs:5,The:[1,3,6,7,8,9,10],Use:9,abc:[4,6],abit:9,about:[1,7],absorb1bitmulintomatmul:8,absorb:[0,6,7],absorbaddintomultithreshold:8,absorbmulintomultithreshold:8,acceler:[7,10],account:3,action:7,activ:3,add:[6,8],addition:8,address:7,after:9,aim:8,align:10,all:[1,3,4,5,6,7,9],all_tensors_f32:1,allow:3,alreadi:7,also:[4,5,7],amount:9,analysi:[0,3],analysis_fxn:3,anaylsis_fxn:3,ani:[3,6,7,9],annot:[1,4,5],anoth:7,append_includ:9,append_sourc:9,append_tcl:9,appli:[3,6,7,8],apply_rep:6,appropri:6,arbitrari:9,architectur:10,around:3,arrai:9,array2hexstr:9,arxiv:8,assign:3,associ:[3,6],assum:9,attribut:[1,4,5,7],attribute_nam:[4,5],attributeproto:[4,5],backend:7,base:[3,4,5,6,7,8,9],basic:0,batchnorm:6,batchnorm_to_affin:0,batchnormtoaffin:6,been:7,befor:9,between:[5,9],binari:[3,5,7,8,9],bipolar:[3,5,6,8,9],bipolar_to_xnor:0,bit:[3,9],bitwidth:3,blackboxfunct:5,block:7,blott:5,board:7,bool:[1,6],both:9,bram_estim:5,brevita:10,brien:5,build:9,built:1,calc_tmem:5,calc_wmem:5,calcul:5,calculate_signed_dot_prod_rang:9,call:[3,5,6,7],can:[3,6,7,8,9,10],cannot:6,center:10,centerpiec:10,certain:1,chang:[3,6],check:[1,3,4,5],check_all_tensor_shapes_specifi:3,check_compat:3,cleanup:[0,6],clk:[5,7],clone:9,code:[7,9],code_gen_dir:9,code_generation_ipgen:5,code_generation_npysim:5,codegen_ipgen:[0,6],codegen_ipstitch:[0,6],codegen_npysim:[0,6],collaps:8,collapse_rep:[0,6],collapserepeatedadd:8,collapserepeatedmul:8,collapserepeatedop:8,collect:7,colloqui:10,come:1,compar:[3,4],compare_execut:3,compare_fxn:3,compat:[3,4,5],compil:[0,6,10],compile_singlenode_cod:5,compon:10,comput:3,consecut:8,constant:[1,3,8],consum:3,contain:[3,4,7,9],content:[],context:[3,4,5],convent:1,convert:[5,6,7,8,9],convert_to_hls_lay:[0,6],convertbipolarmatmultoxnorpopcount:6,convertsigntothr:8,convertsubtoadd:6,convolutioninputgener:[0,4],copi:[3,6,7],core:0,corner:10,correct:6,correctli:[1,4,5,7],correspond:[3,4,5,10],count:5,cpp_file:9,cppbuilder:9,creat:[3,7,9],create_dataflow_partit:[0,6],createdataflowpartit:7,current:3,custom:[1,3,10],custom_op:0,customop:[4,5],data:[4,7,9],data_pack:0,dataflow:[3,7,10],dataoutstrm:5,datatyp:[0,4,5,6,9],debug:3,declar:6,deep:[3,5,6,10],default_v:[4,5],default_valu:[4,5],defin:5,deploy:7,deploytopynq:7,design:[7,10],detail:10,dict:[3,4,5],dictionari:[1,3],digit:9,dimens:9,dimension:9,dir:[7,9],directori:[7,9],distr_pad:9,divis:9,dnn:10,docker:9,docomput:5,don:6,done:1,dot:9,driver:7,dt_a:9,dt_b:9,dtype:[1,3,4,5,9],dynam:1,dynamic_input_to_npi:5,each:[1,3,6,8,9,10],effect:6,element:9,embed:3,emit:9,emphasi:10,empti:3,end:5,ensur:[5,6,7,9],enumer:[3,6],equal:[4,5],equival:8,estim:2,even:6,evenli:9,everi:6,exampl:9,exec_precompiled_singlenode_model:5,execut:[3,4,5],execute_custom_nod:0,execute_nod:[3,4,5],execute_onnx:3,execute_onnx_and_make_model:3,exist:[4,9],exit:9,expect:[1,3,4,5,7],experiment:10,explor:[3,5,10],expos:3,extra:[1,9],extract:[1,2],factor:9,factoroutmulsignmagnitud:8,fals:[3,6,9],fan:1,fast:5,fewest:3,field:[7,9],file:[3,7,9],filenam:[3,7],find:3,find_consum:3,find_produc:3,finn:[],finn_dt:9,finnpy_to_packed_bytearrai:9,first:[1,8],fix:[6,9],flatten:9,float32:[1,3],flow:10,fold_const:0,foldconst:6,folder:[7,9],follow:[1,7,10],form:5,found:7,four:9,fpga:10,fpgadataflow:[0,1,4,6],fpgapart:[5,7],framework:[5,10],fraser:5,from:[2,3,7,9,10],full:3,further:6,gambardella:5,gen_finn_dt_tensor:9,gener:[0,7,9,10],generate_param:5,get:[3,4],get_all_tensor_nam:3,get_by_nam:9,get_finn_root:9,get_folded_input_shap:5,get_folded_output_shap:5,get_hls_compatible_threshold_tensor:5,get_hls_compatible_weight_tensor:5,get_hls_datatype_str:3,get_initi:3,get_input_datatyp:5,get_instream_width:5,get_metadata_prop:3,get_nodeattr:4,get_nodeattr_typ:[4,5],get_num_possible_valu:3,get_number_output_valu:5,get_output_datatyp:5,get_outstream_width:5,get_per_tensor_fanout:1,get_smallest_poss:3,get_stream_width:5,get_template_param_valu:5,get_tensor_datatyp:3,get_tensor_fanout:3,get_tensor_shap:3,get_tensor_valueinfo:3,get_test_model_def_fxn:9,get_test_model_train:9,get_test_model_untrain:9,get_trained_checkpoint:9,get_weight_datatyp:5,getcustomop:4,github:10,give:[6,8],give_unique_node_nam:6,given:[1,2,3,4,5,9],giverandomtensornam:6,givereadabletensornam:6,giveuniquenodenam:6,global_includ:5,graph:[1,3,4,5,6,7],graphic:10,guarante:6,guid:0,has:[1,3,6,7,9],have:[1,3,6,7,8],height:10,hex:9,hexstr:9,hexstring2npbytearrai:9,highli:10,hls_synth_res_estim:[0,1],hls_var_nam:9,hlscustomop:5,hlslib:[5,10],hlssynth_ipgen:[0,6],homepag:10,host:9,how:[0,9],human:6,imag:10,img:10,immedi:7,implement:3,includ:[3,7,10],index:10,indic:[3,4,5,6,7],infer:[3,4,5,6,9,10],infer_datatyp:0,infer_node_datatyp:[4,5],infer_shap:0,inferbinarystreamingfclay:7,inferdatatyp:6,infershap:6,infinit:6,info:[6,9],info_messag:1,inform:[1,7],infrastructur:7,inherit:6,initi:[1,3],innermost:9,inp0:4,inp1:4,inp:5,input:[1,3,4,5,6,8,9],input_dict:3,input_dtyp:9,input_fil:9,insert:[7,9],insert_tlastmark:[0,6],inserttlastmark:7,insid:4,instanc:[3,4,5,8],instanti:7,instead:9,int16:3,int2:3,int32:3,int3:3,int4:3,int8:3,integ:[3,8,9],intend:10,interfac:7,interleav:5,interleave_matrix_outer_dim_from_partit:9,intermedi:[3,6],intern:6,ipgen_singlenode_cod:5,ipgenbuild:9,is_integ:3,is_linear:1,item:9,kei:3,know:6,lab:10,lambda:3,largest:3,layer:[6,7],lead:9,learn:5,leeser:5,len:9,let:6,letter:9,librari:10,library_path:9,like:10,linear:[1,3],link:10,list:[1,3],look:1,loop:6,lut_estim:5,made:[3,6],magnitud:8,make:[6,7],make_build_dir:9,make_collapsed_param_fxn:8,make_deepcopi:3,make_deploy:[0,6],make_empty_exec_context:3,make_new_valueinfo_nam:3,make_project:7,make_pynq_driv:[0,6],make_pynq_proj:[0,6],make_shape_compatible_op:[4,5],makepynqdriv:7,makepynqproject:7,manipul:3,manual:6,matmul:[6,8],matrix:[5,8,9],max:[3,9],mean:9,meant:6,member:[4,5],metadata_prop:[3,7],min:[3,9],minimum:9,mixtur:1,mkdtemp:9,mode:[],model:[1,2,3,4,5,6,7,8,9],model_a:3,model_b:3,model_was_chang:6,modelproto:[3,7],modelwrapp:[0,1,6],modul:10,more:[3,6,9],move:8,moveaddpastmul:8,movescalaraddpastmatmul:8,movescalarmulpastmatmul:8,mul:[6,8],multidimension:9,multipl:[6,8,9],multipli:8,multithreshold:[0,7,8],must:[4,6,7,8,9],mvtu:7,n_partit:9,n_thres_step:5,name:[1,2,3,4,6,9],name_field:9,ndarrai:9,nearest:[8,9],necessari:7,need:[2,4,5,6],neg:[3,8],netnam:9,network:[5,10],neural:[5,10],new_nam:3,next:8,no_decl:9,node:[1,2,3,4,5,6,7,8],node_inputs_in_expected_ord:1,node_res_estim:5,non:7,none:[3,4,9],notwithstand:1,now:[1,3],npbytearrai:9,npbytearray2hexstr:9,npy:9,npy_to_dynamic_output:5,npy_to_rtlsim_input:9,number:[3,4,5,9],numpi:[5,9],numpy_to_hls_cod:9,object:[3,9],old_nam:3,onc:6,one:[1,3,7,9],onli:[1,3,6,7,8],onnx:[0,3,4,5,7],onnx_exec:0,onnx_model_proto:3,onnx_nod:[4,5],onnxruntim:3,op_nam:8,op_typ:1,oper:[3,8],ops:[1,8],order:1,orig_thres_matrix:5,orig_weight_matrix:5,origin:5,other:[3,8],otherwis:[3,6,9],out:1,out_bia:4,out_scal:4,out_shap:9,outcom:7,output:[3,4,5,6,9],output_shap:9,overlai:7,overview:10,pack:[7,9],pack_innermost_dim:9,pack_innermost_dim_as_hex_str:9,packag:[],packed_bytearrai:9,packed_bytearray_to_finnpi:9,packedbit:9,pad:9,pad_tensor_to_multiple_of:9,pad_to_dim:9,pad_to_nbit:9,page:10,pair:7,paramet:8,part:[4,9],particular:[4,5,9],partit:3,pass:[0,5],password:7,past:8,path:[5,9],per:7,perform:[4,5],permit:[4,5],place:7,platform:7,png:10,point:6,posit:[5,8,9],possibl:[3,7],pragma:5,preced:8,precid:8,precis:9,precomput:6,prefer:3,prefix:9,prepend:9,preusser:5,previous:7,prior:[6,7,9],produc:[1,3],product:9,project:[7,10],properti:[1,3],provid:3,pynq:7,pynq_driver_dir:7,python:[7,9],pyveril:9,pyverilate_stitched_ip:9,qnn:10,quantiz:[1,5,10],random:[6,9],random_str:9,randomli:9,rather:10,reach:6,read_npy_data:5,readabl:6,readthedoc:10,recommend:6,refer:10,registri:0,relat:10,remot:3,remov:[7,9],remove_by_nam:9,remove_prefix:9,renam:3,rename_tensor:3,reorder:[0,6],repeat:[6,8],repeatedli:3,replac:6,repositori:10,repositroi:10,repres:[3,9],represent:9,requir:[3,4,5],res_estim:[0,1],research:10,reset_rtlsim:5,reshap:5,resourc:2,respect:9,result:[1,2,3,6,7,8,9],return_full_exec_context:3,returned_dict:[4,5],revers:9,reverse_endian:9,reverse_inn:9,right:10,root:9,round:[8,9],round_threshold:[0,6],roundandclipthreshold:8,roundup_to_integer_multipl:9,row:5,rtlsim:[3,5],rtlsim_output_to_npi:9,run:[3,7],same:[7,9],save:[3,9],save_as_npi:5,scalar:8,scale:10,scp:7,script:7,search:10,second:[7,8],see:[8,9],seen:10,sep:5,separ:10,sequenc:9,set:[3,4,5,7,8,9],set_attribut:[],set_executable_path:9,set_initi:3,set_ipgen_path:9,set_metadata_prop:3,set_nodeattr:4,set_sim_mod:[0,6],set_tensor_datatyp:3,set_tensor_shap:3,setsimmod:[],shape:[3,4,5,6,9],shell:7,should:[1,3,6],sign:[3,6,8,9],sign_to_thr:[0,6],sim:[5,9],sim_mod:[],simd:5,sinc:[3,9],singl:[3,8,9],small:1,smallest:3,some:[3,6],space:10,specif:10,specifi:[3,6,9],split:[7,8,9],standard:[3,4,5],stitch:[7,9],store:[4,7,9],streamingdataflowpartit:[0,7],streamingfclayer_batch:[0,4,7],streamingmaxpool_batch:[0,4],streamlin:[0,6],string:[1,9],stringlength:9,strm_decl:5,structur:1,style:10,sub:6,subdirectori:7,subgraph:3,submodul:0,subpackag:[],subset:1,success:7,suitabl:5,surviv:9,synth_pynq_proj:[0,6],synthesi:[2,7],synthpynqproject:7,take:[1,3,6,8,9],taken:[3,7,10],target:[7,10],target_dir:7,targetbit:9,tcl:7,tcl_script:9,tempfil:9,templat:[0,4,6],temporari:9,tensor:[1,3,6,8,9],tensor_fanout:1,tensor_nam:[1,3],tensor_shap:[3,9],tensor_valu:3,termin:7,ternari:3,test:[0,6],thei:8,them:[1,7,8],thi:[1,3,4,5,6,7,9,10],thing:10,threshold:[4,5,8],time:6,tlastmark:[0,4,7],tmem:5,togeth:7,toggle_clk:5,tool:10,topolog:0,train:10,transform:[0,3],transformed_model:6,travers:1,tupl:6,two:[3,7,8,9,10],type:[3,6,9],uint16:3,uint2:[3,9],uint32:3,uint3:3,uint4:3,uint8:[3,9],umuroglu:5,under:7,uniqu:6,unpack:[7,9],unpack_innermost_dim_from_hex_str:9,unsign:[3,8],until:3,updat:8,upper:10,used:[3,4,5,9,10],useful:3,user:6,usernam:7,using:[3,6,8,9,10],util:[0,3,4,5],val:9,valu:[3,4,5,7,8,9],value_info:3,valueinfo:[3,6],valueinfo_to_tensor:9,valueinfoproto:[3,9],variabl:9,vector:[8,9],verif:1,verifi:[1,4,5],verify_custom_nod:0,verify_nod:[1,4,5],via:3,view:10,visser:5,vivado:[2,3,7,10],vivado_pynq_proj:7,vivado_stitch_proj:7,wai:1,want:8,wbit:9,websit:10,weight:[3,5],when:[1,6],where:[3,4,5,7,8],whether:[1,3,4,5,6],which:[3,4,5,7,8,9,10],width:9,wmem:5,work:[3,9],wrapper:3,write:0,xdnn:10,xilinx:10,xnorpopcount:0,xnorpopcountmatmul:[4,6,7],you:6,your:6,zero:[3,8,9]},titles:["finn package","finn.analysis package","finn.analysis.fpgadataflow package","finn.core package","finn.custom_op package","finn.custom_op.fpgadataflow package","finn.transformation package","finn.transformation.fpgadataflow package","finn.transformation.streamline package","finn.util package","FINN","src"],titleterms:{absorb:8,analysi:[1,2],basic:9,batchnorm_to_affin:6,bipolar_to_xnor:6,cleanup:7,codegen_ipgen:7,codegen_ipstitch:7,codegen_npysim:7,collapse_rep:8,compil:7,content:[0,1,2,3,4,5,6,7,8,9],convert_to_hls_lay:7,convolutioninputgener:5,core:3,create_dataflow_partit:7,custom_op:[4,5],data_pack:9,datatyp:3,document:[],execute_custom_nod:3,finn:[0,1,2,3,4,5,6,7,8,9,10],fold_const:6,fpgadataflow:[2,5,7,9],gener:6,guid:6,hls_synth_res_estim:2,hlssynth_ipgen:7,how:1,indic:10,infer_datatyp:6,infer_shap:6,insert_tlastmark:7,make_deploy:7,make_pynq_driv:7,make_pynq_proj:7,modelwrapp:3,modul:[0,1,2,3,4,5,6,7,8,9],multithreshold:4,onnx:9,onnx_exec:3,packag:[0,1,2,3,4,5,6,7,8,9],pass:1,registri:4,reorder:8,res_estim:2,round_threshold:8,set_sim_mod:7,sign_to_thr:8,src:11,streamingdataflowpartit:4,streamingfclayer_batch:5,streamingmaxpool_batch:5,streamlin:8,submodul:[1,2,3,4,5,6,7,8,9],subpackag:[0,1,4,6],synth_pynq_proj:7,tabl:10,templat:[5,7],test:9,tlastmark:5,topolog:1,transform:[6,7,8],util:9,verify_custom_nod:1,welcom:[],what:10,write:[1,6],xnorpopcount:4}})
\ No newline at end of file
diff --git a/docs/finn/index.rst b/docs/finn/index.rst
index 962456c63..98f256481 100644
--- a/docs/finn/index.rst
+++ b/docs/finn/index.rst
@@ -3,8 +3,20 @@
    You can adapt this file completely to your liking, but it should at least
    contain the root `toctree` directive.
 
+****
 FINN
-================================
+****
+FINN is an experimental framework from Xilinx Research Labs to explore deep neural network inference on FPGAs. It specifically targets quantized neural networks, with emphasis on generating dataflow-style architectures customized for each network. It is not intended to be a generic DNN accelerator like xDNN, but rather a tool for exploring the design space of DNN inference accelerators on FPGAs.
+
+What is FINN?
+=============
+'FINN' is colloquially used to refer to two separate but highly related things:
+* The FINN project, which includes tools for training quantized neural networks such as Brevitas, the FINN compiler, and the finn-hlslib Vivado HLS library of FPGA components for QNNs. An overview of the project can be taken from the following graphic and details can be seen on the project homepage.
+.. image:: ../img/finn-flow.png
+    :height: 600px
+    :scale: 75%
+    :align: center
+* The repository, this readthedocs website corresponds to. This is the FINN compiler, which is the centerpiece of the FINN project. The GitHub repositroy can be viewed using the link in the upper right corner.
 
 .. toctree::
    :maxdepth: 2
-- 
GitLab