From c99b050df6c21addd2deccabb51bef5a051eb81e Mon Sep 17 00:00:00 2001
From: auphelia <jakobapk@web.de>
Date: Thu, 20 Feb 2020 16:51:19 +0000
Subject: [PATCH] [Sphinx documentation] Extend section about FINN docker
 container modes

---
 docs/finn/_build/doctrees/environment.pickle  | Bin 127729 -> 129696 bytes
 .../_build/doctrees/getting_started.doctree   | Bin 7375 -> 18598 bytes
 docs/finn/_build/doctrees/index.doctree       | Bin 10019 -> 10019 bytes
 .../html/_sources/getting_started.rst.txt     |  36 ++++++++++++
 docs/finn/_build/html/_sources/index.rst.txt  |   2 +-
 docs/finn/_build/html/getting_started.html    |  52 +++++++++++++++++-
 docs/finn/_build/html/index.html              |   2 +-
 docs/finn/_build/html/searchindex.js          |   2 +-
 docs/finn/getting_started.rst                 |  36 ++++++++++++
 docs/finn/index.rst                           |   2 +-
 10 files changed, 127 insertions(+), 5 deletions(-)

diff --git a/docs/finn/_build/doctrees/environment.pickle b/docs/finn/_build/doctrees/environment.pickle
index d367a416f25d3ee469fcb47faa5c769be1df6ce0..79d9f222e2222338874171e94c8344a1fe0b5010 100644
GIT binary patch
literal 129696
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

literal 127729
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
bR--a0F~z^u_F(=E_Wck1g#r9MoGtzT&3Et6

diff --git a/docs/finn/_build/doctrees/getting_started.doctree b/docs/finn/_build/doctrees/getting_started.doctree
index 8a69249340c1a219a80914f5cc00759c100f2a7b..63c6fff2c9d151e3d4d2a70f4e1f9743b17ad180 100644
GIT binary patch
literal 18598
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
Jb<Vh1|6ebT%rpQ1

delta 133
zcmZ2Bk@37GYXi&FBQhIVcZh7}G`_;b$hi5Q=?Z2gMh1qg2q2LWnBkZ4Hse)RFi0c-
zL}-Bsb;ijTEJdt<Ouvjkpb9^*0za^1M`?z9?Gz1&er}+C?Tl9$Az;lJAAmZ6+7%fm
M$639aob6!^04|OuDgXcg

diff --git a/docs/finn/_build/doctrees/index.doctree b/docs/finn/_build/doctrees/index.doctree
index 28f33b690ff987ac2d3bf8191ff239dab998782d..85ea545f0d1de74c2305e3e13ed541c6f5529084 100644
GIT binary patch
delta 20
bcmZ4Nx7cq(iU_00<WvzGMvcvjL>h$vOw<Og

delta 20
bcmZ4Nx7cq(iU_0W<WvzGMx)J(L>h$vO&kWe

diff --git a/docs/finn/_build/html/_sources/getting_started.rst.txt b/docs/finn/_build/html/_sources/getting_started.rst.txt
index 3cb4b7755..3c89cb247 100644
--- a/docs/finn/_build/html/_sources/getting_started.rst.txt
+++ b/docs/finn/_build/html/_sources/getting_started.rst.txt
@@ -17,3 +17,39 @@ Requirements
 Running FINN in Docker
 ======================
 We use Docker extensively for developing and deploying FINN. If you are not familiar with Docker, there are many excellent `online resources <https://docker-curriculum.com/>`_ to get started. There is a Dockerfile in the root of the repository, as well as a `run-docker.sh` script that can be launched in the following modes:
+
+Getting an interactive shell for development or experimentation
+***************************************************************
+::
+  sh run_docker.sh
+   
+Simply running sh run-docker.sh without any additional arguments will clone the dependency repos, create a Docker container and give you a terminal with you can use for development for experimentation.
+
+.. warning:: the Docker container is spawned with the `--rm` option, so make sure that any important files you created inside the container are either in the /workspace/finn folder (which is mounted from the host computer) or otherwise backed up.
+
+.. note:: **Develop from host, run inside container:** The FINN repository directory will be mounted from the host, so that you can use a text editor on your host computer to develop and the changes will be reflected directly inside the container.
+
+Running the Jupyter notebooks
+*****************************
+::
+  sh run-docker.sh notebook
+
+This will launch the Jupyter notebook server inside a Docker container, and print a link on the terminal that you can open in your browser to run the FINN notebooks or create new ones. 
+.. note:: The link will look something like this (the token you get will be different):
+          http://127.0.0.1:8888/?token=f5c6bd32ae93ec103a88152214baedff4ce1850d81065bfc
+
+The run-docker.sh script forwards ports 8888 for Jupyter and 8081 for Netron, and launches the notebook server with appropriate arguments.
+
+Running the test suite directly
+*******************************
+::
+  sh run-docker.sh test
+
+FINN comes with a set of tests which can be launched using the command above. Note that some of the tests involve extra compilation and the entire test suite may take some time to complete.  
+
+Running the test suite using Jenkins
+************************************
+::
+  sh run-docker.sh jenkins
+       
+
diff --git a/docs/finn/_build/html/_sources/index.rst.txt b/docs/finn/_build/html/_sources/index.rst.txt
index c647b4d1d..0b49bd89f 100644
--- a/docs/finn/_build/html/_sources/index.rst.txt
+++ b/docs/finn/_build/html/_sources/index.rst.txt
@@ -17,7 +17,7 @@ What is 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%
+   :scale: 40%
    :align: center
 
 * The repository, this Read the Docs website corresponds to. It is about the FINN compiler, which is the centerpiece of the FINN project. The GitHub repository can be viewed using the link in the upper right corner. To learn more about the FINN compiler, use this website and for a hands-on experience the repository contains some Jupyter notebooks which can be found under this `link <https://github.com/Xilinx/finn/tree/dev/notebooks>`_.
diff --git a/docs/finn/_build/html/getting_started.html b/docs/finn/_build/html/getting_started.html
index a890a0238..71d15b513 100644
--- a/docs/finn/_build/html/getting_started.html
+++ b/docs/finn/_build/html/getting_started.html
@@ -85,7 +85,13 @@
 <li class="toctree-l1 current"><a class="current reference internal" href="#">Getting Started</a><ul>
 <li class="toctree-l2"><a class="reference internal" href="#how-to-use-the-finn-compiler">How to use the FINN compiler</a></li>
 <li class="toctree-l2"><a class="reference internal" href="#requirements">Requirements</a></li>
-<li class="toctree-l2"><a class="reference internal" href="#running-finn-in-docker">Running FINN in Docker</a></li>
+<li class="toctree-l2"><a class="reference internal" href="#running-finn-in-docker">Running FINN in Docker</a><ul>
+<li class="toctree-l3"><a class="reference internal" href="#getting-an-interactive-shell-for-development-or-experimentation">Getting an interactive shell for development or experimentation</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#running-the-jupyter-notebooks">Running the Jupyter notebooks</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#running-the-test-suite-directly">Running the test suite directly</a></li>
+<li class="toctree-l3"><a class="reference internal" href="#running-the-test-suite-using-jenkins">Running the test suite using Jenkins</a></li>
+</ul>
+</li>
 </ul>
 </li>
 <li class="toctree-l1"><a class="reference internal" href="source_code.html">Source Code</a></li>
@@ -171,6 +177,50 @@
 <div class="section" id="running-finn-in-docker">
 <h2>Running FINN in Docker<a class="headerlink" href="#running-finn-in-docker" title="Permalink to this headline">¶</a></h2>
 <p>We use Docker extensively for developing and deploying FINN. If you are not familiar with Docker, there are many excellent <a class="reference external" href="https://docker-curriculum.com/">online resources</a> to get started. There is a Dockerfile in the root of the repository, as well as a <cite>run-docker.sh</cite> script that can be launched in the following modes:</p>
+<div class="section" id="getting-an-interactive-shell-for-development-or-experimentation">
+<h3>Getting an interactive shell for development or experimentation<a class="headerlink" href="#getting-an-interactive-shell-for-development-or-experimentation" title="Permalink to this headline">¶</a></h3>
+<dl class="simple">
+<dt>::</dt><dd><p>sh run_docker.sh</p>
+</dd>
+</dl>
+<p>Simply running sh run-docker.sh without any additional arguments will clone the dependency repos, create a Docker container and give you a terminal with you can use for development for experimentation.</p>
+<div class="admonition warning">
+<p class="admonition-title">Warning</p>
+<p>the Docker container is spawned with the <cite>–rm</cite> option, so make sure that any important files you created inside the container are either in the /workspace/finn folder (which is mounted from the host computer) or otherwise backed up.</p>
+</div>
+<div class="admonition note">
+<p class="admonition-title">Note</p>
+<p><strong>Develop from host, run inside container:</strong> The FINN repository directory will be mounted from the host, so that you can use a text editor on your host computer to develop and the changes will be reflected directly inside the container.</p>
+</div>
+</div>
+<div class="section" id="running-the-jupyter-notebooks">
+<h3>Running the Jupyter notebooks<a class="headerlink" href="#running-the-jupyter-notebooks" title="Permalink to this headline">¶</a></h3>
+<dl class="simple">
+<dt>::</dt><dd><p>sh run-docker.sh notebook</p>
+</dd>
+</dl>
+<p>This will launch the Jupyter notebook server inside a Docker container, and print a link on the terminal that you can open in your browser to run the FINN notebooks or create new ones.
+.. note:: The link will look something like this (the token you get will be different):</p>
+<blockquote>
+<div><p><a class="reference external" href="http://127.0.0.1:8888/?token=f5c6bd32ae93ec103a88152214baedff4ce1850d81065bfc">http://127.0.0.1:8888/?token=f5c6bd32ae93ec103a88152214baedff4ce1850d81065bfc</a></p>
+</div></blockquote>
+<p>The run-docker.sh script forwards ports 8888 for Jupyter and 8081 for Netron, and launches the notebook server with appropriate arguments.</p>
+</div>
+<div class="section" id="running-the-test-suite-directly">
+<h3>Running the test suite directly<a class="headerlink" href="#running-the-test-suite-directly" title="Permalink to this headline">¶</a></h3>
+<dl class="simple">
+<dt>::</dt><dd><p>sh run-docker.sh test</p>
+</dd>
+</dl>
+<p>FINN comes with a set of tests which can be launched using the command above. Note that some of the tests involve extra compilation and the entire test suite may take some time to complete.</p>
+</div>
+<div class="section" id="running-the-test-suite-using-jenkins">
+<h3>Running the test suite using Jenkins<a class="headerlink" href="#running-the-test-suite-using-jenkins" title="Permalink to this headline">¶</a></h3>
+<dl class="simple">
+<dt>::</dt><dd><p>sh run-docker.sh jenkins</p>
+</dd>
+</dl>
+</div>
 </div>
 </div>
 
diff --git a/docs/finn/_build/html/index.html b/docs/finn/_build/html/index.html
index eabd2d3b5..00d4abfd1 100644
--- a/docs/finn/_build/html/index.html
+++ b/docs/finn/_build/html/index.html
@@ -160,7 +160,7 @@
 <ul class="simple">
 <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>
+<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: 256.40000000000003px; height: 250.0px;" /></a>
 <ul class="simple">
 <li><p>The repository, this Read the Docs website corresponds to. It is about the FINN compiler, which is the centerpiece of the FINN project. The GitHub repository can be viewed using the link in the upper right corner. To learn more about the FINN compiler, use this website and for a hands-on experience the repository contains some Jupyter notebooks which can be found under this <a class="reference external" href="https://github.com/Xilinx/finn/tree/dev/notebooks">link</a>.</p></li>
 </ul>
diff --git a/docs/finn/_build/html/searchindex.js b/docs/finn/_build/html/searchindex.js
index 205390df5..67bf76e6d 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,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
+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],"import":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],abov:11,absorb1bitmulintomatmul:9,absorb:[1,7,8],absorbaddintomultithreshold:9,absorbmulintomultithreshold:9,acceler:[8,11],account:4,action:8,activ:4,add:[7,9],adding:11,addit: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,11],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,argument:11,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],back:11,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,browser:11,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,11],check:[2,4,5,6],check_all_tensor_shapes_specifi:4,check_compat:4,cleanup:[1,7],clk:[6,8],clone:[10,11],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,11],command:11,commun:12,compar:[4,5],compare_execut:4,compare_fxn:4,compat:[4,5,6],compil:[1,7,12],compile_singlenode_cod:6,complet:11,compon:12,comput:[4,11],consecut:9,constant:[2,4,9],construct:12,consum:4,contain:[4,5,8,10,11,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,11],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,depend:11,deploi:11,deploy:8,deploytopynq:8,design:[8,11],detail:12,develop:12,dict:[4,5,6],dictionari:[2,4],differ:11,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],editor:11,effect:7,either:11,element:10,embed:4,emit:10,emphasi:12,empti:4,end:6,ensur:[6,7,8,10],entir:11,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,11],extract:[2,3],f5c6bd32ae93ec103a88152214baedff4ce1850d81065bfc:11,factor:10,factoroutmulsignmagnitud:9,fals:[4,7,10],familiar:11,fan:2,fast:6,fewest:4,field:[8,10],file:[4,8,10,11],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,11],follow:[2,8,11,12],form:6,forward:11,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,11,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,11],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,11],how:[1,10],http:11,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,11],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,involv:11,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:11,linear:[2,4],link:[11,12],list:[2,4],locat:11,look:[2,11],loop:7,lut_estim:6,made:[4,7],magnitud:9,mai:11,make:[7,8,11],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],mount:11,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,netron:11,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],note:11,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],ones:11,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,open:11,oper:[4,9],ops:[2,9],option:11,order:2,orig_thres_matrix:6,orig_weight_matrix:6,origin:6,other:[4,9],otherwis:[4,7,10,11],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],port: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,print:11,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,reflect:11,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,repo:11,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],run_dock:11,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,server:11,set:[4,5,6,8,9,10,11],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,simpli:11,sinc:[4,10],singl:[4,9,10,11],small:2,smallest:4,some:[4,7,11,12],someth:11,space:[],spawn:11,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,sure:11,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,11],ternari:4,test:[1,7],text:11,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,11],tlastmark:[1,5,8],tmem:6,togeth:8,toggle_clk:6,token:11,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,11,12],width:10,without:11,wmem:6,work:[4,10,11],workspac: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,develop:11,directli:11,docker:11,document:[],end:0,execute_custom_nod:4,experiment:11,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,interact:11,jenkin:11,jupyt:11,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,notebook:11,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,shell:11,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],suit:11,synth_pynq_proj:8,tabl:[],templat:[6,8],test:[10,11],tlastmark:6,topolog:2,transform:[7,8,9],use:11,using: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/getting_started.rst b/docs/finn/getting_started.rst
index 3cb4b7755..3c89cb247 100644
--- a/docs/finn/getting_started.rst
+++ b/docs/finn/getting_started.rst
@@ -17,3 +17,39 @@ Requirements
 Running FINN in Docker
 ======================
 We use Docker extensively for developing and deploying FINN. If you are not familiar with Docker, there are many excellent `online resources <https://docker-curriculum.com/>`_ to get started. There is a Dockerfile in the root of the repository, as well as a `run-docker.sh` script that can be launched in the following modes:
+
+Getting an interactive shell for development or experimentation
+***************************************************************
+::
+  sh run_docker.sh
+   
+Simply running sh run-docker.sh without any additional arguments will clone the dependency repos, create a Docker container and give you a terminal with you can use for development for experimentation.
+
+.. warning:: the Docker container is spawned with the `--rm` option, so make sure that any important files you created inside the container are either in the /workspace/finn folder (which is mounted from the host computer) or otherwise backed up.
+
+.. note:: **Develop from host, run inside container:** The FINN repository directory will be mounted from the host, so that you can use a text editor on your host computer to develop and the changes will be reflected directly inside the container.
+
+Running the Jupyter notebooks
+*****************************
+::
+  sh run-docker.sh notebook
+
+This will launch the Jupyter notebook server inside a Docker container, and print a link on the terminal that you can open in your browser to run the FINN notebooks or create new ones. 
+.. note:: The link will look something like this (the token you get will be different):
+          http://127.0.0.1:8888/?token=f5c6bd32ae93ec103a88152214baedff4ce1850d81065bfc
+
+The run-docker.sh script forwards ports 8888 for Jupyter and 8081 for Netron, and launches the notebook server with appropriate arguments.
+
+Running the test suite directly
+*******************************
+::
+  sh run-docker.sh test
+
+FINN comes with a set of tests which can be launched using the command above. Note that some of the tests involve extra compilation and the entire test suite may take some time to complete.  
+
+Running the test suite using Jenkins
+************************************
+::
+  sh run-docker.sh jenkins
+       
+
diff --git a/docs/finn/index.rst b/docs/finn/index.rst
index c647b4d1d..0b49bd89f 100644
--- a/docs/finn/index.rst
+++ b/docs/finn/index.rst
@@ -17,7 +17,7 @@ What is 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%
+   :scale: 40%
    :align: center
 
 * The repository, this Read the Docs website corresponds to. It is about the FINN compiler, which is the centerpiece of the FINN project. The GitHub repository can be viewed using the link in the upper right corner. To learn more about the FINN compiler, use this website and for a hands-on experience the repository contains some Jupyter notebooks which can be found under this `link <https://github.com/Xilinx/finn/tree/dev/notebooks>`_.
-- 
GitLab