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