From 68827546becf77d0bb2130b8a46c56a4a00a73f5 Mon Sep 17 00:00:00 2001
From: auphelia <jakobapk@web.de>
Date: Wed, 26 Feb 2020 12:10:34 +0000
Subject: [PATCH] [Sphinx Documentation] Edit source code section and section
 about internals

---
 docs/finn/_build/doctrees/environment.pickle  | Bin 134065 -> 134314 bytes
 docs/finn/_build/doctrees/internals.doctree   | Bin 2626 -> 3684 bytes
 .../source_code/finn.analysis.doctree         | Bin 15589 -> 14161 bytes
 .../finn.analysis.fpgadataflow.doctree        | Bin 8422 -> 8352 bytes
 .../source_code/finn.transformation.doctree   | Bin 46556 -> 37474 bytes
 .../finn.transformation.fpgadataflow.doctree  | Bin 78930 -> 78930 bytes
 .../_build/html/_sources/internals.rst.txt    |  12 ++++
 .../finn.analysis.fpgadataflow.rst.txt        |  12 ++--
 .../source_code/finn.analysis.rst.txt         |   5 --
 .../finn.transformation.fpgadataflow.rst.txt  |   4 +-
 .../source_code/finn.transformation.rst.txt   |   5 --
 docs/finn/_build/html/genindex.html           |  12 +---
 docs/finn/_build/html/internals.html          |  20 +++++-
 docs/finn/_build/html/objects.inv             | Bin 3804 -> 3785 bytes
 docs/finn/_build/html/py-modindex.html        |  10 ---
 docs/finn/_build/html/searchindex.js          |   2 +-
 .../finn.analysis.fpgadataflow.html           |  13 ++--
 .../html/source_code/finn.analysis.html       |  19 ++----
 .../_build/html/source_code/finn.core.html    |   4 +-
 .../finn.transformation.fpgadataflow.html     |  39 ++++++-----
 .../html/source_code/finn.transformation.html |  64 ++++--------------
 .../finn.transformation.streamline.html       |  27 ++++----
 .../finn/_build/html/source_code/modules.html |   2 -
 docs/finn/internals.rst                       |  12 ++++
 .../finn.analysis.fpgadataflow.rst            |  12 ++--
 docs/finn/source_code/finn.analysis.rst       |   5 --
 .../finn.transformation.fpgadataflow.rst      |   4 +-
 docs/finn/source_code/finn.transformation.rst |   5 --
 28 files changed, 123 insertions(+), 165 deletions(-)

diff --git a/docs/finn/_build/doctrees/environment.pickle b/docs/finn/_build/doctrees/environment.pickle
index b5c70b7e187c6716b679b6cd48e85d68061d42b3..6907a584f84aa14c161fa0cefbd657fd4c13a184 100644
GIT binary patch
literal 134314
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
TwhueWVX@h_FQESn>(&1s41((m

literal 134065
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

diff --git a/docs/finn/_build/doctrees/internals.doctree b/docs/finn/_build/doctrees/internals.doctree
index 7868da2c0af74986e0d5f24c83975dec7865c55d..f3962cc63fd2cf21dc0acd8b2cca96fd75391037 100644
GIT binary patch
delta 1047
zcma)*&q^Cn6voNu)J9{pXg4+`Q;Hgec>%#fyC_K8>mO2W7g^krn|u?TJH!0JN(o7k
zmV&c$DhPsz4<Jnz0hhi*_bvoq!#go?W<m@u=bZbU@BGf3b2)vTk?X^Mzo!4m|D_s6
z7k>IxKL;64FjDX_(f#)3R=C3~ofS3eFlB?87PA?5sG}KtNqN6Qh`LJ17r!lg{^;kw
z{I209W>Ux_fg!vg$dH2{l2S`!2J3e*EF$yasr!xMWzb=^;Cr)Lq$kyi^`w?G&Q*i+
z?>@yVf$~}i=Ar^6E?82cidmtUFVuV&3rLD4#^Oy37*y($QDoa&7Bx*~b;l78hR}v6
zt%uA}x}fQUeQB~igG$7HEc(hz>4Du&$1X(ejo$(F<q-u3@Vps+%jx#6t=Y;Nwe2oZ
zPc%gOBanWFNcX>SFM^PcA&k?GfocW@A;Wz_=_Cd~h>{ONe3ZSZyhXWPGAzBlu`!gs
zxe(}70G;#!I*tH6ivdkJF|%H*p7bN&M0pmjeNt=QNS~#|RdZQB8(Pib0xgtLL>*Ne
z;Sdd+yIzu0ojJQEv)dPaK~N^B6C4pVh>L7+L@lw`MR8zNRD^5~=Qws7$#;ocN*Hw%

delta 64
zcmaDNb4Y}>fn};W*GAT>Oq<WLB{4D9Y&PIr%&d?RmJwXs!<m<un_5y?kXk&Yc1lK=
TUvY*!kPgn^F5axf>%<5E=4=+V

diff --git a/docs/finn/_build/doctrees/source_code/finn.analysis.doctree b/docs/finn/_build/doctrees/source_code/finn.analysis.doctree
index 7c7281c3b5e3d62a60759e0ef664d58b17c8044c..4eec028a00625ac2e1bb78c23fc315168f73de45 100644
GIT binary patch
delta 3191
zcma)8Z%|ZK6z4tI<*m5DA}K5j3#_uhB7a20fl@Ik1KnVpbf&~u1-#s$WfdvWA;Fm@
ztWB-6^+jiLsu@j5V=%MwL-nyg7}JOPqQQ`p_FboDEIa4k_m;QpI`(1j-h1vjzkA;O
z{m#Aj*3fj&GLrJ{Q}q)TuD~|U1s-derJ6ZeCA3>B?LMZkWR}OunXA<bVXHeUoG}n$
zy}^T(fv&D#e^>WF1U|8zR@$H?mD@M!t{MWYgKtu6EstZ*2Y;vTP^{3dwOjV#xL-i`
znV{2guHYS8ljSH*kI=MZ*fi}J+|8O`RN1V!L9s1`pKYrx$I){b-d@~iZB=mk1Y9bu
zQ%=F<MLaqc%4-UzV1|1l5Gfmt3`a_tg;`l@2X>m^Vp@aJ1b5N`$~9cD1okb?vwVr5
zR}eIWGpc>7%C6Iti+#twA7o|hN1E32`hmIpBCQYX73h84zD{MgU_x`*4evSh{*5d(
zhUG?Fd^gLdwA>vLHXdL__~)T6oJoJi$);(|%NR4Ua7|lAQASeO77FYS?A;#-G5kRA
zW!%*4N>UPY@-%Q{R=By1MtSTaa;KoxN<*Y`a5rCsUD%%4qvgqfTnccQ15zje{>}7e
zrU;k$9H6Se4LclF-ZeN8P7U_=2D`csMvhUkmqemSj9ivB$RK9UaZo3wGwYSCPZ#p>
z8QjULRK5adVVm+SwA;%vjZH&Ncq`?Lamo~Uvi-^~aws+&kQLz|H;H#pzJi;ZFjJJR
zvft?sPC9eckOJ*B1?fg062$w2snswcLkY3wdE(88AEinktw7Se_<L}SC&6@a{w9@@
zu<~U5<DJ;(O!CcS7bP{HC%2$6c0VLRIZHp%PEvrAA18vcb%OZQWR#@73Cc3>63I~v
zI*g_-f%OHMn`+THtcHdnypDQW&tP!Rf!_XLgxBMke@x9<Y!(uzuVUu#*JZnO4jXfL
zA`U;#DbhLoI*!9@xCUSxa`;Q`Y6UB60f*$E@68l-6LUBl&*6=D4ijOSIJ|=R^Bl_2
zLJqf@Ih@7-gTpTp<e7lOQbD4@D|EO{!w%QDrl^9@2SjMGLFiTSy`oC*>*z+6Zp(k(
zmLX&8D$G{-qAJjXEGUorRH=pv%=!Ia6_nx%iB%w1iK-y^RCps)mE^<ig1x#H&KC~n
zv-pBGzC65K_@@=7OKGU<=`%{B$0XHvBb+T9QP~t!6zx>~Vm_w48)*Y%*=(h5Vrg`$
zapk>Jm}1I15td0Bb%;MN4LMpUjb^hn+AzS7#@YmVK2#c$)t*k(HbNmz{;J?MDu{Zr
z$_hWMV;X{(S#i{MTn2?j&|`**^dKw39aiB%W{IH)b6PN4;%RuqnQ#{26RV*f)_ITE
z%~!XBu5P&P9aS$=HWfMPxcr2kv;G{&HSPgaPdQv)RRmhudQuOcfGuUOE5;qMsQi#u
zSfk;7Np-xs;6nLw)YDJpJ?bAqFEM(WL)fDh673ZH<7-gw36~g2%|+MXcd46DQi=v`
zHSQ=hT^K23i4jyHB$J?SBKo|b<S0f^BP&Z|1oamN7=oHfkmW-K1%IymRx3>wdMbgL
zstTK~jPL>2ms<>He9vWzGsZ(crk6mlifi>Uu8!iON6cz6x?1Tm;DP+=6B#jQ8s7p}
zt2?wUGSZJ5<5?o#99$11DYlS(>1OHFOn<VF$pxBxZa7!t$bORSdFC)rvRT3AeINy|
zd4z&rM!Yx$quO3v^<j*9b0MR4dv5yR?s>w(S|Awc8ye^xhy*6zt8G!0$;sKebIC{E
zBFr}^(O%ZWU!&1cYAzy2`~nd*&c?-qKsI!(aM92y!bLMo0f(p|A&6!$Yzqcn>OL?O
z!nZU&205+cXT5&0gkQk>+4$H7fjTA-#{}9KCpf=A85?A73KsdLu^#3V$+13}*)Tt^
z!V?W%75{cN7Pj2QKzvvlkL>s9tifs-XIEtI^x%@Y(@iRKr-M`GPUX#q=qv6e!-htu
dG6XL)7A=>crsC(*=qRD(_s*%4XBwN8{{Y<UslxyO

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

diff --git a/docs/finn/_build/doctrees/source_code/finn.analysis.fpgadataflow.doctree b/docs/finn/_build/doctrees/source_code/finn.analysis.fpgadataflow.doctree
index e3e1b426070c54cad6e32e44f5969c37df0bed96..f3a43330175f494ae4a3d768522216ac77091f75 100644
GIT binary patch
delta 252
zcmaFnxWJL6fo1B{i7c&?(<OL?GT39MWH9uwgrruKOqo2TN8E98tc3W+{hW-PX$9$t
zDTyVCX_GH9$|3Q7Fy=CvP5!_uJ(-tTnsW-+1koO2u*d}#37#pfQyQn#PSMC<?SU)X
ztk2BE#b`WPUtD^!FE3C{YK9`vV&&K=2#u3xi_1;Ez$?$F1vE+vZm=ehCpTGEh#T2p
kuoBiO8B$qnljX&9H=pE7<zUnV8n20LG+gWE+2Y=u04-8gl>h($

delta 340
zcmZ4B_{@=|fo1CLi7c%~ZUOF&E{P?HZaMkoQ!?0Nr(`hnu!N*mluVgCrAOQ`FEOXG
zII~zmR{^eY<8EF?PB?G!MMgO!-VerHM%&4TTym3Jm?Q)ga`RJ4b5bGZiuPCmC5(k(
zf~`{;r_@f-$YAY(YhZ`UZI)tY;$pO#EX!*wtP3?GHA4~TIOW(W5My9UC-?K(G8#^P
z$R{`XH7^gkjRrsoEg`502n*rrVWw=3=bO&KXaKZOTCpg#SU0t}Br`X$Br`t`(|WL(
QY!EYnw##iU7T4tj0QiY@<NyEw

diff --git a/docs/finn/_build/doctrees/source_code/finn.transformation.doctree b/docs/finn/_build/doctrees/source_code/finn.transformation.doctree
index bc6d983c0745235c9089b1d31e22eef0eb682527..abf2d9014985cf6ca4d1c5d0ed1eebdd24730c03 100644
GIT binary patch
literal 37474
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%0AIkfyuX*g@K&&74Rn$
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

literal 46556
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

diff --git a/docs/finn/_build/doctrees/source_code/finn.transformation.fpgadataflow.doctree b/docs/finn/_build/doctrees/source_code/finn.transformation.fpgadataflow.doctree
index 2d501995c702e856c07b2e074a115714b01aa7df..646172e2786851902ce5c38b62c00dd0cbd957da 100644
GIT binary patch
delta 73
zcmccgg5}Z+mI?iwX$9$tDTyVCX%lCtAvhb43p0wtrE>DiHK$~-$4<!*?U4(aeo&E7
Ou9=@{J3kYnvk?GR&Kk}D

delta 93
zcmccgg5}Z+mI?iwZUOF&E{P?HZWCvyAvhb43o{zPrE>DiHK$~-$4<!*?U4&9O3W)x
b%P-1JEXmBzD^}2eD{JOr+Rnwq=wSo^Q@$W3

diff --git a/docs/finn/_build/html/_sources/internals.rst.txt b/docs/finn/_build/html/_sources/internals.rst.txt
index 0423e63d3..6b8faea09 100644
--- a/docs/finn/_build/html/_sources/internals.rst.txt
+++ b/docs/finn/_build/html/_sources/internals.rst.txt
@@ -3,3 +3,15 @@ Internals
 *********
 
 .. note:: **Here will be soon an overview of the internals that are used in FINN.**
+
+Intermediate Representation: FINN-ONNX
+======================================
+
+ModelWrapper
+============
+
+Analysis Pass
+=============
+
+Transformation Pass
+===================
diff --git a/docs/finn/_build/html/_sources/source_code/finn.analysis.fpgadataflow.rst.txt b/docs/finn/_build/html/_sources/source_code/finn.analysis.fpgadataflow.rst.txt
index 54befd447..e31723ca3 100644
--- a/docs/finn/_build/html/_sources/source_code/finn.analysis.fpgadataflow.rst.txt
+++ b/docs/finn/_build/html/_sources/source_code/finn.analysis.fpgadataflow.rst.txt
@@ -1,20 +1,20 @@
 ***********************
-Analysis - FPGADataFlow
+Analysis - fpgadataflow 
 ***********************
 
-Analysis Passes (FPGADataFlow)
+Analysis Passes (fpgadataflow)
 ==============================
 
-finn.analysis.fpgadataflow.hls\_synth\_res\_estimation module
--------------------------------------------------------------
+finn.analysis.fpgadataflow.hls\_synth\_res\_estimation
+------------------------------------------------------
 
 .. automodule:: finn.analysis.fpgadataflow.hls_synth_res_estimation
    :members:
    :undoc-members:
    :show-inheritance:
 
-finn.analysis.fpgadataflow.res\_estimation module
--------------------------------------------------
+finn.analysis.fpgadataflow.res\_estimation
+------------------------------------------
 
 .. automodule:: finn.analysis.fpgadataflow.res_estimation
    :members:
diff --git a/docs/finn/_build/html/_sources/source_code/finn.analysis.rst.txt b/docs/finn/_build/html/_sources/source_code/finn.analysis.rst.txt
index 99ebb7ef4..2a66199d0 100644
--- a/docs/finn/_build/html/_sources/source_code/finn.analysis.rst.txt
+++ b/docs/finn/_build/html/_sources/source_code/finn.analysis.rst.txt
@@ -2,11 +2,6 @@
 Analysis 
 ********
 
-.. automodule:: finn.analysis
-   :members:
-   :undoc-members:
-   :show-inheritance:
-
 Submodules
 ==========
 
diff --git a/docs/finn/_build/html/_sources/source_code/finn.transformation.fpgadataflow.rst.txt b/docs/finn/_build/html/_sources/source_code/finn.transformation.fpgadataflow.rst.txt
index 7dbca7844..ba850d8fd 100644
--- a/docs/finn/_build/html/_sources/source_code/finn.transformation.fpgadataflow.rst.txt
+++ b/docs/finn/_build/html/_sources/source_code/finn.transformation.fpgadataflow.rst.txt
@@ -1,8 +1,8 @@
 *****************************
-Transformation - FPGADataFlow
+Transformation - fpgadataflow 
 *****************************
 
-Transformations (FPGADataFlow)
+Transformations (fpgadataflow)
 ==============================
 
 finn.transformation.fpgadataflow.cleanup
diff --git a/docs/finn/_build/html/_sources/source_code/finn.transformation.rst.txt b/docs/finn/_build/html/_sources/source_code/finn.transformation.rst.txt
index 6819785c2..6a5fcf29c 100644
--- a/docs/finn/_build/html/_sources/source_code/finn.transformation.rst.txt
+++ b/docs/finn/_build/html/_sources/source_code/finn.transformation.rst.txt
@@ -2,11 +2,6 @@
 Transformation
 **************
 
-.. automodule:: finn.transformation
-   :members:
-   :undoc-members:
-   :show-inheritance:
-
 Submodules
 ==========
 
diff --git a/docs/finn/_build/html/genindex.html b/docs/finn/_build/html/genindex.html
index 9c3bc921b..003bbe3ee 100644
--- a/docs/finn/_build/html/genindex.html
+++ b/docs/finn/_build/html/genindex.html
@@ -269,8 +269,6 @@
         <li><a href="source_code/finn.transformation.streamline.html#finn.transformation.streamline.sign_to_thres.ConvertSignToThres.apply">(finn.transformation.streamline.sign_to_thres.ConvertSignToThres method)</a>
 </li>
         <li><a href="source_code/finn.transformation.streamline.html#finn.transformation.streamline.Streamline.apply">(finn.transformation.streamline.Streamline method)</a>
-</li>
-        <li><a href="source_code/finn.transformation.html#finn.transformation.Transformation.apply">(finn.transformation.Transformation method)</a>
 </li>
       </ul></li>
   </ul></td>
@@ -476,8 +474,6 @@
       <li><a href="source_code/finn.core.html#finn.core.modelwrapper.ModelWrapper.find_consumer">find_consumer() (finn.core.modelwrapper.ModelWrapper method)</a>
 </li>
       <li><a href="source_code/finn.core.html#finn.core.modelwrapper.ModelWrapper.find_producer">find_producer() (finn.core.modelwrapper.ModelWrapper method)</a>
-</li>
-      <li><a href="source_code/finn.analysis.html#module-finn.analysis">finn.analysis (module)</a>
 </li>
       <li><a href="source_code/finn.analysis.fpgadataflow.html#module-finn.analysis.fpgadataflow.hls_synth_res_estimation">finn.analysis.fpgadataflow.hls_synth_res_estimation (module)</a>
 </li>
@@ -520,8 +516,6 @@
       <li><a href="source_code/finn.custom_op.html#module-finn.custom_op.streamingdataflowpartition">finn.custom_op.streamingdataflowpartition (module)</a>
 </li>
       <li><a href="source_code/finn.custom_op.html#module-finn.custom_op.xnorpopcount">finn.custom_op.xnorpopcount (module)</a>
-</li>
-      <li><a href="source_code/finn.transformation.html#module-finn.transformation">finn.transformation (module)</a>
 </li>
       <li><a href="source_code/finn.transformation.html#module-finn.transformation.batchnorm_to_affine">finn.transformation.batchnorm_to_affine (module)</a>
 </li>
@@ -533,10 +527,10 @@
 </li>
       <li><a href="source_code/finn.transformation.fpgadataflow.html#module-finn.transformation.fpgadataflow.codegen_ipgen">finn.transformation.fpgadataflow.codegen_ipgen (module)</a>
 </li>
-  </ul></td>
-  <td style="width: 33%; vertical-align: top;"><ul>
       <li><a href="source_code/finn.transformation.fpgadataflow.html#module-finn.transformation.fpgadataflow.codegen_ipstitch">finn.transformation.fpgadataflow.codegen_ipstitch (module)</a>
 </li>
+  </ul></td>
+  <td style="width: 33%; vertical-align: top;"><ul>
       <li><a href="source_code/finn.transformation.fpgadataflow.html#module-finn.transformation.fpgadataflow.codegen_npysim">finn.transformation.fpgadataflow.codegen_npysim (module)</a>
 </li>
       <li><a href="source_code/finn.transformation.fpgadataflow.html#module-finn.transformation.fpgadataflow.compile">finn.transformation.fpgadataflow.compile (module)</a>
@@ -1070,8 +1064,6 @@
       <li><a href="source_code/finn.custom_op.fpgadataflow.html#finn.custom_op.fpgadataflow.HLSCustomOp.toggle_clk">toggle_clk() (finn.custom_op.fpgadataflow.HLSCustomOp method)</a>
 </li>
       <li><a href="source_code/finn.core.html#finn.core.modelwrapper.ModelWrapper.transform">transform() (finn.core.modelwrapper.ModelWrapper method)</a>
-</li>
-      <li><a href="source_code/finn.transformation.html#finn.transformation.Transformation">Transformation (class in finn.transformation)</a>
 </li>
   </ul></td>
 </tr></table>
diff --git a/docs/finn/_build/html/internals.html b/docs/finn/_build/html/internals.html
index 5d669ebcc..4fb99c3e9 100644
--- a/docs/finn/_build/html/internals.html
+++ b/docs/finn/_build/html/internals.html
@@ -84,7 +84,13 @@
 <li class="toctree-l1"><a class="reference internal" href="getting_started.html">Getting Started</a></li>
 <li class="toctree-l1"><a class="reference internal" href="tutorials.html">Tutorials</a></li>
 <li class="toctree-l1"><a class="reference internal" href="end_to_end_flow.html">End-to-End Flow</a></li>
-<li class="toctree-l1 current"><a class="current reference internal" href="#">Internals</a></li>
+<li class="toctree-l1 current"><a class="current reference internal" href="#">Internals</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="#intermediate-representation-finn-onnx">Intermediate Representation: FINN-ONNX</a></li>
+<li class="toctree-l2"><a class="reference internal" href="#modelwrapper">ModelWrapper</a></li>
+<li class="toctree-l2"><a class="reference internal" href="#analysis-pass">Analysis Pass</a></li>
+<li class="toctree-l2"><a class="reference internal" href="#transformation-pass">Transformation Pass</a></li>
+</ul>
+</li>
 <li class="toctree-l1"><a class="reference internal" href="brevitas_export.html">Brevitas Export</a></li>
 <li class="toctree-l1"><a class="reference internal" href="nw_prep.html">Network Preparation</a></li>
 <li class="toctree-l1"><a class="reference internal" href="vivado_synth.html">Vivado HLS and Vivado Synthesis</a></li>
@@ -162,6 +168,18 @@
 <p class="admonition-title">Note</p>
 <p><strong>Here will be soon an overview of the internals that are used in FINN.</strong></p>
 </div>
+<div class="section" id="intermediate-representation-finn-onnx">
+<h2>Intermediate Representation: FINN-ONNX<a class="headerlink" href="#intermediate-representation-finn-onnx" title="Permalink to this headline">¶</a></h2>
+</div>
+<div class="section" id="modelwrapper">
+<h2>ModelWrapper<a class="headerlink" href="#modelwrapper" title="Permalink to this headline">¶</a></h2>
+</div>
+<div class="section" id="analysis-pass">
+<h2>Analysis Pass<a class="headerlink" href="#analysis-pass" title="Permalink to this headline">¶</a></h2>
+</div>
+<div class="section" id="transformation-pass">
+<h2>Transformation Pass<a class="headerlink" href="#transformation-pass" title="Permalink to this headline">¶</a></h2>
+</div>
 </div>
 
 
diff --git a/docs/finn/_build/html/objects.inv b/docs/finn/_build/html/objects.inv
index ebe8f5a3baa2a445cb81f7e3b8cf995fcdfec4c2..daf072a775d9bef7a87e35b7168dc384adfc12e2 100644
GIT binary patch
delta 2860
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
KLHr+k8UyAriHCy#

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

diff --git a/docs/finn/_build/html/py-modindex.html b/docs/finn/_build/html/py-modindex.html
index f94442696..7402105af 100644
--- a/docs/finn/_build/html/py-modindex.html
+++ b/docs/finn/_build/html/py-modindex.html
@@ -170,11 +170,6 @@
        <td>
        <code class="xref">finn</code></td><td>
        <em></em></td></tr>
-     <tr class="cg-1">
-       <td></td>
-       <td>&#160;&#160;&#160;
-       <a href="source_code/finn.analysis.html#module-finn.analysis"><code class="xref">finn.analysis</code></a></td><td>
-       <em></em></td></tr>
      <tr class="cg-1">
        <td></td>
        <td>&#160;&#160;&#160;
@@ -280,11 +275,6 @@
        <td>&#160;&#160;&#160;
        <a href="source_code/finn.custom_op.html#module-finn.custom_op.xnorpopcount"><code class="xref">finn.custom_op.xnorpopcount</code></a></td><td>
        <em></em></td></tr>
-     <tr class="cg-1">
-       <td></td>
-       <td>&#160;&#160;&#160;
-       <a href="source_code/finn.transformation.html#module-finn.transformation"><code class="xref">finn.transformation</code></a></td><td>
-       <em></em></td></tr>
      <tr class="cg-1">
        <td></td>
        <td>&#160;&#160;&#160;
diff --git a/docs/finn/_build/html/searchindex.js b/docs/finn/_build/html/searchindex.js
index 9e1f5508b..f4eedb5af 100644
--- a/docs/finn/_build/html/searchindex.js
+++ b/docs/finn/_build/html/searchindex.js
@@ -1 +1 @@
-Search.setIndex({docnames:["brevitas_export","end_to_end_flow","genindex","getting_started","index","internals","nw_prep","pynq_deploy","source_code/finn","source_code/finn.analysis","source_code/finn.analysis.fpgadataflow","source_code/finn.core","source_code/finn.custom_op","source_code/finn.custom_op.fpgadataflow","source_code/finn.transformation","source_code/finn.transformation.fpgadataflow","source_code/finn.transformation.streamline","source_code/finn.util","source_code/modules","tutorials","verification","vivado_synth"],envversion:{"sphinx.domains.c":1,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":1,"sphinx.domains.index":1,"sphinx.domains.javascript":1,"sphinx.domains.math":2,"sphinx.domains.python":1,"sphinx.domains.rst":1,"sphinx.domains.std":1,sphinx:56},filenames:["brevitas_export.rst","end_to_end_flow.rst","genindex.rst","getting_started.rst","index.rst","internals.rst","nw_prep.rst","pynq_deploy.rst","source_code/finn.rst","source_code/finn.analysis.rst","source_code/finn.analysis.fpgadataflow.rst","source_code/finn.core.rst","source_code/finn.custom_op.rst","source_code/finn.custom_op.fpgadataflow.rst","source_code/finn.transformation.rst","source_code/finn.transformation.fpgadataflow.rst","source_code/finn.transformation.streamline.rst","source_code/finn.util.rst","source_code/modules.rst","tutorials.rst","verification.rst","vivado_synth.rst"],objects:{"finn.analysis":{topology:[9,0,0,"-"],verify_custom_nodes:[9,0,0,"-"]},"finn.analysis.fpgadataflow":{hls_synth_res_estimation:[10,0,0,"-"],res_estimation:[10,0,0,"-"]},"finn.analysis.fpgadataflow.hls_synth_res_estimation":{hls_synth_res_estimation:[10,1,1,""]},"finn.analysis.fpgadataflow.res_estimation":{res_estimation:[10,1,1,""]},"finn.analysis.topology":{all_tensors_f32:[9,1,1,""],get_per_tensor_fanouts:[9,1,1,""],is_linear:[9,1,1,""],node_inputs_in_expected_order:[9,1,1,""]},"finn.analysis.verify_custom_nodes":{verify_nodes:[9,1,1,""]},"finn.core":{datatype:[11,0,0,"-"],execute_custom_node:[11,0,0,"-"],modelwrapper:[11,0,0,"-"],onnx_exec:[11,0,0,"-"],remote_exec:[11,0,0,"-"],rtlsim_exec:[11,0,0,"-"]},"finn.core.datatype":{DataType:[11,2,1,""]},"finn.core.datatype.DataType":{BINARY:[11,3,1,""],BIPOLAR:[11,3,1,""],FLOAT32:[11,3,1,""],INT16:[11,3,1,""],INT2:[11,3,1,""],INT32:[11,3,1,""],INT3:[11,3,1,""],INT4:[11,3,1,""],INT8:[11,3,1,""],TERNARY:[11,3,1,""],UINT16:[11,3,1,""],UINT2:[11,3,1,""],UINT32:[11,3,1,""],UINT3:[11,3,1,""],UINT4:[11,3,1,""],UINT8:[11,3,1,""],allowed:[11,4,1,""],bitwidth:[11,4,1,""],get_hls_datatype_str:[11,4,1,""],get_num_possible_values:[11,4,1,""],get_smallest_possible:[11,4,1,""],is_integer:[11,4,1,""],max:[11,4,1,""],min:[11,4,1,""],signed:[11,4,1,""]},"finn.core.execute_custom_node":{execute_custom_node:[11,1,1,""]},"finn.core.modelwrapper":{ModelWrapper:[11,2,1,""]},"finn.core.modelwrapper.ModelWrapper":{analysis:[11,4,1,""],check_all_tensor_shapes_specified:[11,4,1,""],check_compatibility:[11,4,1,""],find_consumer:[11,4,1,""],find_producer:[11,4,1,""],get_all_tensor_names:[11,4,1,""],get_initializer:[11,4,1,""],get_metadata_prop:[11,4,1,""],get_tensor_datatype:[11,4,1,""],get_tensor_fanout:[11,4,1,""],get_tensor_shape:[11,4,1,""],get_tensor_valueinfo:[11,4,1,""],graph:[11,4,1,""],make_empty_exec_context:[11,4,1,""],make_new_valueinfo_name:[11,4,1,""],model:[11,4,1,""],rename_tensor:[11,4,1,""],save:[11,4,1,""],set_initializer:[11,4,1,""],set_metadata_prop:[11,4,1,""],set_tensor_datatype:[11,4,1,""],set_tensor_shape:[11,4,1,""],transform:[11,4,1,""]},"finn.core.onnx_exec":{compare_execution:[11,1,1,""],execute_node:[11,1,1,""],execute_onnx:[11,1,1,""],execute_onnx_and_make_model:[11,1,1,""]},"finn.core.remote_exec":{remote_exec:[11,1,1,""]},"finn.core.rtlsim_exec":{rtlsim_exec:[11,1,1,""]},"finn.custom_op":{CustomOp:[12,2,1,""],fpgadataflow:[13,0,0,"-"],multithreshold:[12,0,0,"-"],registry:[12,0,0,"-"],streamingdataflowpartition:[12,0,0,"-"],xnorpopcount:[12,0,0,"-"]},"finn.custom_op.CustomOp":{execute_node:[12,4,1,""],get_nodeattr:[12,4,1,""],get_nodeattr_types:[12,4,1,""],infer_node_datatype:[12,4,1,""],make_shape_compatible_op:[12,4,1,""],set_nodeattr:[12,4,1,""],verify_node:[12,4,1,""]},"finn.custom_op.fpgadataflow":{HLSCustomOp:[13,2,1,""],convolutioninputgenerator:[13,0,0,"-"],streamingfclayer_batch:[13,0,0,"-"],streamingmaxpool_batch:[13,0,0,"-"],templates:[13,0,0,"-"],tlastmarker:[13,0,0,"-"]},"finn.custom_op.fpgadataflow.HLSCustomOp":{blackboxfunction:[13,4,1,""],bram_estimation:[13,4,1,""],code_generation_ipgen:[13,4,1,""],code_generation_npysim:[13,4,1,""],compile_singlenode_code:[13,4,1,""],dataoutstrm:[13,4,1,""],defines:[13,4,1,""],docompute:[13,4,1,""],dynamic_input_to_npy:[13,4,1,""],exec_precompiled_singlenode_model:[13,4,1,""],execute_node:[13,4,1,""],generate_params:[13,4,1,""],get_folded_input_shape:[13,4,1,""],get_folded_output_shape:[13,4,1,""],get_instream_width:[13,4,1,""],get_nodeattr_types:[13,4,1,""],get_number_output_values:[13,4,1,""],get_outstream_width:[13,4,1,""],global_includes:[13,4,1,""],ipgen_singlenode_code:[13,4,1,""],lut_estimation:[13,4,1,""],node_res_estimation:[13,4,1,""],npy_to_dynamic_output:[13,4,1,""],pragmas:[13,4,1,""],read_npy_data:[13,4,1,""],reset_rtlsim:[13,4,1,""],rtlsim:[13,4,1,""],save_as_npy:[13,4,1,""],strm_decl:[13,4,1,""],toggle_clk:[13,4,1,""]},"finn.custom_op.fpgadataflow.convolutioninputgenerator":{ConvolutionInputGenerator:[13,2,1,""]},"finn.custom_op.fpgadataflow.convolutioninputgenerator.ConvolutionInputGenerator":{blackboxfunction:[13,4,1,""],bram_estimation:[13,4,1,""],dataoutstrm:[13,4,1,""],defines:[13,4,1,""],docompute:[13,4,1,""],execute_node:[13,4,1,""],get_input_datatype:[13,4,1,""],get_nodeattr_types:[13,4,1,""],get_number_output_values:[13,4,1,""],get_output_datatype:[13,4,1,""],get_stream_width:[13,4,1,""],global_includes:[13,4,1,""],infer_node_datatype:[13,4,1,""],lut_estimation:[13,4,1,""],make_shape_compatible_op:[13,4,1,""],pragmas:[13,4,1,""],read_npy_data:[13,4,1,""],save_as_npy:[13,4,1,""],strm_decl:[13,4,1,""],verify_node:[13,4,1,""]},"finn.custom_op.fpgadataflow.streamingfclayer_batch":{StreamingFCLayer_Batch:[13,2,1,""]},"finn.custom_op.fpgadataflow.streamingfclayer_batch.StreamingFCLayer_Batch":{blackboxfunction:[13,4,1,""],bram_estimation:[13,4,1,""],calc_tmem:[13,4,1,""],calc_wmem:[13,4,1,""],dataoutstrm:[13,4,1,""],defines:[13,4,1,""],docompute:[13,4,1,""],execute_node:[13,4,1,""],generate_params:[13,4,1,""],get_folded_input_shape:[13,4,1,""],get_folded_output_shape:[13,4,1,""],get_hls_compatible_threshold_tensor:[13,4,1,""],get_hls_compatible_weight_tensor:[13,4,1,""],get_input_datatype:[13,4,1,""],get_instream_width:[13,4,1,""],get_nodeattr_types:[13,4,1,""],get_number_output_values:[13,4,1,""],get_output_datatype:[13,4,1,""],get_outstream_width:[13,4,1,""],get_template_param_values:[13,4,1,""],get_weight_datatype:[13,4,1,""],global_includes:[13,4,1,""],infer_node_datatype:[13,4,1,""],lut_estimation:[13,4,1,""],make_shape_compatible_op:[13,4,1,""],pragmas:[13,4,1,""],read_npy_data:[13,4,1,""],save_as_npy:[13,4,1,""],strm_decl:[13,4,1,""],verify_node:[13,4,1,""]},"finn.custom_op.fpgadataflow.streamingmaxpool_batch":{StreamingMaxPool_Batch:[13,2,1,""]},"finn.custom_op.fpgadataflow.streamingmaxpool_batch.StreamingMaxPool_Batch":{blackboxfunction:[13,4,1,""],bram_estimation:[13,4,1,""],dataoutstrm:[13,4,1,""],defines:[13,4,1,""],docompute:[13,4,1,""],get_nodeattr_types:[13,4,1,""],get_number_output_values:[13,4,1,""],global_includes:[13,4,1,""],infer_node_datatype:[13,4,1,""],lut_estimation:[13,4,1,""],make_shape_compatible_op:[13,4,1,""],pragmas:[13,4,1,""],read_npy_data:[13,4,1,""],save_as_npy:[13,4,1,""],strm_decl:[13,4,1,""],verify_node:[13,4,1,""]},"finn.custom_op.fpgadataflow.tlastmarker":{TLastMarker:[13,2,1,""]},"finn.custom_op.fpgadataflow.tlastmarker.TLastMarker":{blackboxfunction:[13,4,1,""],dataoutstrm:[13,4,1,""],defines:[13,4,1,""],docompute:[13,4,1,""],execute_node:[13,4,1,""],get_folded_input_shape:[13,4,1,""],get_folded_output_shape:[13,4,1,""],get_instream_width:[13,4,1,""],get_nodeattr_types:[13,4,1,""],get_number_output_values:[13,4,1,""],get_outstream_width:[13,4,1,""],global_includes:[13,4,1,""],infer_node_datatype:[13,4,1,""],make_shape_compatible_op:[13,4,1,""],pragmas:[13,4,1,""],read_npy_data:[13,4,1,""],save_as_npy:[13,4,1,""],strm_decl:[13,4,1,""],verify_node:[13,4,1,""]},"finn.custom_op.multithreshold":{MultiThreshold:[12,2,1,""],compare:[12,1,1,""],multithreshold:[12,1,1,""]},"finn.custom_op.multithreshold.MultiThreshold":{execute_node:[12,4,1,""],get_nodeattr_types:[12,4,1,""],infer_node_datatype:[12,4,1,""],make_shape_compatible_op:[12,4,1,""],verify_node:[12,4,1,""]},"finn.custom_op.registry":{getCustomOp:[12,1,1,""]},"finn.custom_op.streamingdataflowpartition":{StreamingDataflowPartition:[12,2,1,""]},"finn.custom_op.streamingdataflowpartition.StreamingDataflowPartition":{execute_node:[12,4,1,""],get_nodeattr_types:[12,4,1,""],infer_node_datatype:[12,4,1,""],make_shape_compatible_op:[12,4,1,""],verify_node:[12,4,1,""]},"finn.custom_op.xnorpopcount":{XnorPopcountMatMul:[12,2,1,""],xnorpopcountmatmul:[12,1,1,""]},"finn.custom_op.xnorpopcount.XnorPopcountMatMul":{execute_node:[12,4,1,""],get_nodeattr_types:[12,4,1,""],infer_node_datatype:[12,4,1,""],make_shape_compatible_op:[12,4,1,""],verify_node:[12,4,1,""]},"finn.transformation":{Transformation:[14,2,1,""],batchnorm_to_affine:[14,0,0,"-"],bipolar_to_xnor:[14,0,0,"-"],fold_constants:[14,0,0,"-"],general:[14,0,0,"-"],infer_datatypes:[14,0,0,"-"],infer_shapes:[14,0,0,"-"],streamline:[16,0,0,"-"]},"finn.transformation.Transformation":{apply:[14,4,1,""]},"finn.transformation.batchnorm_to_affine":{BatchNormToAffine:[14,2,1,""]},"finn.transformation.batchnorm_to_affine.BatchNormToAffine":{apply:[14,4,1,""]},"finn.transformation.bipolar_to_xnor":{ConvertBipolarMatMulToXnorPopcount:[14,2,1,""]},"finn.transformation.bipolar_to_xnor.ConvertBipolarMatMulToXnorPopcount":{apply:[14,4,1,""]},"finn.transformation.fold_constants":{FoldConstants:[14,2,1,""]},"finn.transformation.fold_constants.FoldConstants":{apply:[14,4,1,""]},"finn.transformation.fpgadataflow":{cleanup:[15,0,0,"-"],codegen_ipgen:[15,0,0,"-"],codegen_ipstitch:[15,0,0,"-"],codegen_npysim:[15,0,0,"-"],compile:[15,0,0,"-"],convert_to_hls_layers:[15,0,0,"-"],create_dataflow_partition:[15,0,0,"-"],hlssynth_ipgen:[15,0,0,"-"],insert_tlastmarker:[15,0,0,"-"],make_deployment:[15,0,0,"-"],make_pynq_driver:[15,0,0,"-"],make_pynq_proj:[15,0,0,"-"],replace_verilog_relpaths:[15,0,0,"-"],set_exec_mode:[15,0,0,"-"],synth_pynq_proj:[15,0,0,"-"],templates:[15,0,0,"-"]},"finn.transformation.fpgadataflow.cleanup":{CleanUp:[15,2,1,""]},"finn.transformation.fpgadataflow.cleanup.CleanUp":{apply:[15,4,1,""]},"finn.transformation.fpgadataflow.codegen_ipgen":{CodeGen_ipgen:[15,2,1,""]},"finn.transformation.fpgadataflow.codegen_ipgen.CodeGen_ipgen":{apply:[15,4,1,""]},"finn.transformation.fpgadataflow.codegen_ipstitch":{CodeGen_ipstitch:[15,2,1,""]},"finn.transformation.fpgadataflow.codegen_ipstitch.CodeGen_ipstitch":{apply:[15,4,1,""]},"finn.transformation.fpgadataflow.codegen_npysim":{CodeGen_npysim:[15,2,1,""]},"finn.transformation.fpgadataflow.codegen_npysim.CodeGen_npysim":{apply:[15,4,1,""]},"finn.transformation.fpgadataflow.compile":{Compile:[15,2,1,""]},"finn.transformation.fpgadataflow.compile.Compile":{apply:[15,4,1,""]},"finn.transformation.fpgadataflow.convert_to_hls_layers":{InferBinaryStreamingFCLayer:[15,2,1,""]},"finn.transformation.fpgadataflow.convert_to_hls_layers.InferBinaryStreamingFCLayer":{apply:[15,4,1,""]},"finn.transformation.fpgadataflow.create_dataflow_partition":{CreateDataflowPartition:[15,2,1,""]},"finn.transformation.fpgadataflow.create_dataflow_partition.CreateDataflowPartition":{apply:[15,4,1,""]},"finn.transformation.fpgadataflow.hlssynth_ipgen":{HLSSynth_IPGen:[15,2,1,""]},"finn.transformation.fpgadataflow.hlssynth_ipgen.HLSSynth_IPGen":{apply:[15,4,1,""]},"finn.transformation.fpgadataflow.insert_tlastmarker":{InsertTLastMarker:[15,2,1,""]},"finn.transformation.fpgadataflow.insert_tlastmarker.InsertTLastMarker":{apply:[15,4,1,""]},"finn.transformation.fpgadataflow.make_deployment":{DeployToPYNQ:[15,2,1,""]},"finn.transformation.fpgadataflow.make_deployment.DeployToPYNQ":{apply:[15,4,1,""]},"finn.transformation.fpgadataflow.make_pynq_driver":{MakePYNQDriver:[15,2,1,""]},"finn.transformation.fpgadataflow.make_pynq_driver.MakePYNQDriver":{apply:[15,4,1,""]},"finn.transformation.fpgadataflow.make_pynq_proj":{MakePYNQProject:[15,2,1,""]},"finn.transformation.fpgadataflow.make_pynq_proj.MakePYNQProject":{apply:[15,4,1,""]},"finn.transformation.fpgadataflow.replace_verilog_relpaths":{ReplaceVerilogRelPaths:[15,2,1,""]},"finn.transformation.fpgadataflow.replace_verilog_relpaths.ReplaceVerilogRelPaths":{apply:[15,4,1,""]},"finn.transformation.fpgadataflow.set_exec_mode":{SetExecMode:[15,2,1,""]},"finn.transformation.fpgadataflow.set_exec_mode.SetExecMode":{apply:[15,4,1,""]},"finn.transformation.fpgadataflow.synth_pynq_proj":{SynthPYNQProject:[15,2,1,""]},"finn.transformation.fpgadataflow.synth_pynq_proj.SynthPYNQProject":{apply:[15,4,1,""]},"finn.transformation.general":{ConvertSubToAdd:[14,2,1,""],GiveRandomTensorNames:[14,2,1,""],GiveReadableTensorNames:[14,2,1,""],GiveUniqueNodeNames:[14,2,1,""]},"finn.transformation.general.ConvertSubToAdd":{apply:[14,4,1,""]},"finn.transformation.general.GiveRandomTensorNames":{apply:[14,4,1,""]},"finn.transformation.general.GiveReadableTensorNames":{apply:[14,4,1,""]},"finn.transformation.general.GiveUniqueNodeNames":{apply:[14,4,1,""]},"finn.transformation.infer_datatypes":{InferDataTypes:[14,2,1,""]},"finn.transformation.infer_datatypes.InferDataTypes":{apply:[14,4,1,""]},"finn.transformation.infer_shapes":{InferShapes:[14,2,1,""]},"finn.transformation.infer_shapes.InferShapes":{apply:[14,4,1,""]},"finn.transformation.streamline":{Streamline:[16,2,1,""],absorb:[16,0,0,"-"],collapse_repeated:[16,0,0,"-"],reorder:[16,0,0,"-"],round_thresholds:[16,0,0,"-"],sign_to_thres:[16,0,0,"-"]},"finn.transformation.streamline.Streamline":{apply:[16,4,1,""]},"finn.transformation.streamline.absorb":{Absorb1BitMulIntoMatMul:[16,2,1,""],AbsorbAddIntoMultiThreshold:[16,2,1,""],AbsorbMulIntoMultiThreshold:[16,2,1,""],FactorOutMulSignMagnitude:[16,2,1,""]},"finn.transformation.streamline.absorb.Absorb1BitMulIntoMatMul":{apply:[16,4,1,""]},"finn.transformation.streamline.absorb.AbsorbAddIntoMultiThreshold":{apply:[16,4,1,""]},"finn.transformation.streamline.absorb.AbsorbMulIntoMultiThreshold":{apply:[16,4,1,""]},"finn.transformation.streamline.absorb.FactorOutMulSignMagnitude":{apply:[16,4,1,""]},"finn.transformation.streamline.collapse_repeated":{CollapseRepeatedAdd:[16,2,1,""],CollapseRepeatedMul:[16,2,1,""],CollapseRepeatedOp:[16,2,1,""]},"finn.transformation.streamline.collapse_repeated.CollapseRepeatedOp":{apply:[16,4,1,""]},"finn.transformation.streamline.reorder":{MoveAddPastMul:[16,2,1,""],MoveScalarAddPastMatMul:[16,2,1,""],MoveScalarMulPastMatMul:[16,2,1,""]},"finn.transformation.streamline.reorder.MoveAddPastMul":{apply:[16,4,1,""]},"finn.transformation.streamline.reorder.MoveScalarAddPastMatMul":{apply:[16,4,1,""]},"finn.transformation.streamline.reorder.MoveScalarMulPastMatMul":{apply:[16,4,1,""]},"finn.transformation.streamline.round_thresholds":{RoundAndClipThresholds:[16,2,1,""]},"finn.transformation.streamline.round_thresholds.RoundAndClipThresholds":{apply:[16,4,1,""]},"finn.transformation.streamline.sign_to_thres":{ConvertSignToThres:[16,2,1,""]},"finn.transformation.streamline.sign_to_thres.ConvertSignToThres":{apply:[16,4,1,""]},"finn.util":{basic:[17,0,0,"-"],data_packing:[17,0,0,"-"],fpgadataflow:[17,0,0,"-"],onnx:[17,0,0,"-"],test:[17,0,0,"-"]},"finn.util.basic":{CppBuilder:[17,2,1,""],calculate_signed_dot_prod_range:[17,1,1,""],gen_finn_dt_tensor:[17,1,1,""],get_by_name:[17,1,1,""],get_finn_root:[17,1,1,""],interleave_matrix_outer_dim_from_partitions:[17,1,1,""],make_build_dir:[17,1,1,""],pad_tensor_to_multiple_of:[17,1,1,""],random_string:[17,1,1,""],remove_by_name:[17,1,1,""],roundup_to_integer_multiple:[17,1,1,""]},"finn.util.basic.CppBuilder":{append_includes:[17,4,1,""],append_sources:[17,4,1,""],build:[17,4,1,""],set_executable_path:[17,4,1,""]},"finn.util.data_packing":{array2hexstring:[17,1,1,""],finnpy_to_packed_bytearray:[17,1,1,""],hexstring2npbytearray:[17,1,1,""],npbytearray2hexstring:[17,1,1,""],npy_to_rtlsim_input:[17,1,1,""],numpy_to_hls_code:[17,1,1,""],pack_innermost_dim_as_hex_string:[17,1,1,""],packed_bytearray_to_finnpy:[17,1,1,""],rtlsim_output_to_npy:[17,1,1,""],unpack_innermost_dim_from_hex_string:[17,1,1,""]},"finn.util.fpgadataflow":{IPGenBuilder:[17,2,1,""],pyverilate_get_liveness_threshold_cycles:[17,1,1,""],pyverilate_stitched_ip:[17,1,1,""]},"finn.util.fpgadataflow.IPGenBuilder":{append_tcl:[17,4,1,""],build:[17,4,1,""],set_ipgen_path:[17,4,1,""]},"finn.util.onnx":{valueinfo_to_tensor:[17,1,1,""]},"finn.util.test":{get_test_model_def_fxn:[17,1,1,""],get_test_model_trained:[17,1,1,""],get_test_model_untrained:[17,1,1,""],get_trained_checkpoint:[17,1,1,""]},finn:{analysis:[9,0,0,"-"],custom_op:[12,0,0,"-"],transformation:[14,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":17,"0x07":17,"0x0e":17,"0x0f01":17,"0xb":17,"0xe":17,"abstract":[12,13,14],"boolean":11,"class":[11,14,15,16,17],"const":14,"default":[12,13,14],"enum":11,"final":11,"float":17,"function":[3,11,12,13,14,17],"import":3,"int":15,"new":[3,4,11,12,13],"return":[9,10,11,12,13,14,16,17],"static":9,"throw":17,"true":[11,17],"try":3,"var":13,For:[15,16],HLS:[4,11,12,15,17],IPs:15,PEs:13,The:[3,4,8,9,11,12,14,15,16,17],There:3,Use:[11,17],abc:[12,14],abit:17,abort:13,about:[4,7,9,15],abov:3,absolut:15,absorb1bitmulintomatmul:16,absorb:15,absorbaddintomultithreshold:16,absorbmulintomultithreshold:16,acceler:[3,15],access:3,accord:[13,17],account:11,action:15,activ:[11,17],add:[14,16,17],added:13,adder:16,adding:3,addit:[3,13,15],addition:16,address:15,admin:3,after:[13,17],aim:16,all:[3,9,11,12,13,14,15,17],all_tensors_f32:9,allow:11,alreadi:[15,19],also:[3,12,13,15],amount:17,analysi:[8,11,18],analysis_fxn:11,anaylsis_fxn:11,ani:[3,11,12,14,15,17],annot:[9,11,12,13],anoth:15,append_includ:17,append_sourc:17,append_tcl:17,appli:[11,14,15,16],apply_rep:14,appropri:[3,14],arbitrari:17,architectur:4,argument:[3,15,17],around:11,arrai:17,array2hexstr:17,arxiv:16,assign:11,associ:[11,14],assum:17,attribut:[9,12,13,15],attribute_nam:[12,13],attributeproto:[12,13],avail:19,back:[3,13],backend:15,base:[11,14,15,16,17],bash:[13,17],basic:13,batchnorm:14,batchnormtoaffin:14,been:[12,15],befor:17,below:8,between:[13,17],bias:12,binari:[11,13,15,16,17],bipolar:[11,12,13,14,16,17],bit:[11,17],bitfil:[3,12],bitwidth:11,blackbock:13,blackboxfunct:13,block:[13,15,17],blott:13,board:[11,15],bool:[9,14],both:17,bram:13,bram_estim:13,brevita:[4,17],brien:13,browser:3,build:[13,17],built:9,calc_tmem:13,calc_wmem:13,calcul:13,calculate_signed_dot_prod_rang:17,call:[3,11,13,14,15],can:[3,4,7,11,13,14,15,16,17],cannot:14,centerpiec:4,certain:9,chang:[3,11,14],check:[9,11,12,13],check_all_tensor_shapes_specifi:11,check_compat:11,client:3,clk:[13,15],clock:13,clone:[3,17],code:[13,15,17,18],code_gen_dir:17,code_gen_dir_ipgen:15,code_gen_dir_npysim:15,code_generation_ipgen:13,code_generation_npysim:13,collaps:16,collapserepeatedadd:16,collapserepeatedmul:16,collapserepeatedop:16,collect:[3,15],colloqui:4,come:[3,9],command:[3,13,17],commun:4,compar:[11,12],compare_execut:11,compare_fxn:11,comparison:12,compat:[11,12,13],compil:[4,13,17],compile_singlenode_cod:13,complet:3,compon:4,comput:[3,11,13],configur:3,consecut:16,constant:[9,11,16],construct:4,consum:11,contain:[3,4,11,12,13,14,15,17],context:[11,12,13],contribut:4,convent:9,convert:[3,13,14,15,16,17],convertbipolarmatmultoxnorpopcount:14,convertsigntothr:16,convertsubtoadd:14,copi:[11,14,15],core:[8,15,18],correct:[14,17],correctli:[3,9,12,13,15],correspond:[4,11,12,13],count:13,cpp_file:17,cppbuilder:[13,17],creat:[3,11,15,17],createdataflowpartit:15,current:[4,11,13],custom:[3,4,8,9,11,15,18],customop:[12,13],cycl:[13,17],data:[11,12,13,15,17],dataflow:[4,11,15],dataoutstrm:13,datatyp:[12,13,14,17],debug:11,declar:[13,14],deep:[4,11,13,14],default_v:[12,13],default_valu:[12,13],defin:13,deliveri:3,depend:3,deploi:3,deploy:15,deploytopynq:15,descript:[0,6,20,21],design:[3,15],detail:[0,4,6,7,20,21],develop:4,dict:[11,12,13],dictionari:[9,11,13],differ:[3,8,12,13],digit:17,dimens:17,dimension:17,dir:[15,17],directli:4,directori:[3,15,17],distr_pad:17,divid:8,divis:17,doc:4,docker:17,dockerfil:3,docomput:13,doe:[3,11,12],don:14,done:9,dot:17,down:[3,11],driver:15,dt_a:17,dt_b:17,dtype:[9,11,12,13,17],dynam:9,dynamic_input_to_npi:13,each:[4,9,11,14,15,16,17],editor:3,effect:14,either:3,element:17,embed:11,emit:17,emphasi:4,empti:11,end:13,ensur:[13,14,15,17],entir:3,entri:17,enumer:14,environ:3,equal:[12,13],equival:16,estim:[10,13],even:14,evenli:17,event:3,everi:[3,12,13,14,15],everyth:3,exampl:[3,17],excel:3,except:17,exec_mod:15,exec_precompiled_singlenode_model:13,execut:[11,12,13,15,17],executable_path:[15,17],execute_nod:[11,12,13],execute_onnx:[11,15],execute_onnx_and_make_model:11,execution_context:11,exist:[12,13,17],exit:17,expect:[9,11,12,13,15],experi:4,experiment:4,explor:[4,11,13],expos:11,extens:3,extra:[3,9,17],extract:[9,10],f5c6bd32ae93ec103a88152214baedff4ce1850d81065bfc:3,factor:17,factoroutmulsignmagnitud:16,fals:[11,14,17],familiar:3,fan:9,fast:13,feel:19,fewer:11,fewest:11,field:[15,17],file:[3,11,13,15,17],filenam:[11,15],fill:[12,13,14],find:[7,11],find_consum:11,find_produc:11,finish:17,finn:[0,5,6,7,8,19,20,21],finn_dt:17,finnpy_to_packed_bytearrai:17,first:[9,16],fix:[14,17],flatten:17,float32:[9,11],fold:13,foldconst:14,folder:[3,15,17],follow:[3,4,9,11,12,15],form:13,format:13,forward:3,found:[4,15],four:17,fpga:[3,4],fpgadataflow:[9,12,14],fpgapart:[13,15],framework:[4,13],fraser:13,free:19,from:[3,4,10,11,13,15,17],full:11,further:14,gambardella:13,gen_finn_dt_tensor:17,gener:[4,13,15,17],generate_param:13,get:[11,12,13,15],get_all_tensor_nam:11,get_by_nam:17,get_finn_root:17,get_folded_input_shap:13,get_folded_output_shap:13,get_hls_compatible_threshold_tensor:13,get_hls_compatible_weight_tensor:13,get_hls_datatype_str:11,get_initi:11,get_input_datatyp:13,get_instream_width:13,get_metadata_prop:11,get_nodeattr:12,get_nodeattr_typ:[12,13],get_num_possible_valu:11,get_number_output_valu:13,get_output_datatyp:13,get_outstream_width:13,get_per_tensor_fanout:9,get_smallest_poss:11,get_stream_width:13,get_template_param_valu:13,get_tensor_datatyp:11,get_tensor_fanout:11,get_tensor_shap:11,get_tensor_valueinfo:11,get_test_model_def_fxn:17,get_test_model_train:17,get_test_model_untrain:17,get_trained_checkpoint:17,get_weight_datatyp:13,getcustomop:12,github:[3,4],give:[3,14,16],give_unique_node_nam:14,given:[9,10,11,12,13,17],giverandomtensornam:14,givereadabletensornam:14,giveuniquenodenam:14,global:13,global_includ:13,graph:[9,11,12,13,14,15],graphic:4,greater:12,group:12,guarante:[14,17],guid:[18,19],hand:4,happen:3,has:[3,9,11,13,14,15,17],have:[3,9,11,12,13,14,15,16],help:3,helper:12,here:[0,5,6,20,21],hex:17,hexstr:17,hexstring2npbytearrai:17,high:3,highli:4,hls:13,hls_var_nam:17,hlscustomop:13,hlslib:[4,13],homepag:4,host:[3,17],how:[6,17,18,21],http:3,human:14,imag:13,immedi:15,implement:[11,13,15],includ:[4,11,13,15],include_path:17,indic:[11,12,13,14,15],infer:[3,4,11,12,13,14,17],infer_node_datatyp:[12,13],inferbinarystreamingfclay:15,inferdatatyp:14,infershap:14,infinit:14,info:[14,17],info_messag:9,inform:[9,15],infrastructur:15,inherit:14,initi:[3,9,11],innermost:17,inp0:12,inp1:12,inp:13,input:[9,11,12,13,14,16,17],input_dict:11,input_dtyp:17,input_fil:17,insert:[13,15,17],inserttlastmark:15,insid:[3,12],instal:3,instanc:[11,12,16],instant:17,instanti:15,instead:17,int16:11,int2:11,int32:11,int3:11,int4:11,int8:11,integ:[11,12,16,17],interest:11,interfac:15,interleav:[13,17],interleave_matrix_outer_dim_from_partit:17,intermedi:[11,14],intern:14,interv:12,involv:3,ipgen:13,ipgen_path:[15,17],ipgen_singlenode_cod:13,ipgenbuild:[13,17],is_integ:11,is_linear:9,item:17,its:12,itself:12,jupyt:[4,19],kei:11,kind:15,know:14,lab:4,lambda:11,largest:11,launch:3,layer:[14,15],lead:17,learn:[4,13],leeser:13,len:17,let:14,letter:17,librari:[4,17],library_path:17,like:3,linear:[9,11],link:[3,4,19],list:[8,9,11,17],load:17,locat:3,look:[3,4,9,19],loop:[13,14],lut:13,lut_estim:13,made:[11,14],magnitud:16,mai:3,make:[3,13,14,15],make_build_dir:17,make_collapsed_param_fxn:16,make_deepcopi:11,make_empty_exec_context:11,make_new_valueinfo_nam:11,make_project:15,make_shape_compatible_op:[12,13],makepynqdriv:15,makepynqproject:15,mani:3,manipul:11,manual:14,map:12,mark:13,matmul:[14,16],matrix:[12,13,16,17],max:[11,17],mean:17,meant:14,member:[12,13,17],meta:12,metadata:11,metadata_prop:[11,15],method:[12,13,14,20],min:[11,17],minimum:17,minut:15,mixtur:9,mkdtemp:17,mode:[3,15],model:[9,10,11,12,13,14,15,16,17,20],model_a:11,model_b:11,model_was_chang:14,modelproto:[11,15],modelwrapp:[9,14],modul:18,modular:4,more:[4,7,11,14,17],mount:3,move:16,moveaddpastmul:16,movescalaraddpastmatmul:16,movescalarmulpastmatmul:16,mul:[14,16],multidimension:17,multipl:[12,14,16,17],multipli:16,multithreshold:[15,16],must:[12,14,15,16,17],mvtu:15,n_partit:17,n_thres_step:13,name:[9,10,11,12,14,17],name_field:17,ndarrai:17,nearest:[16,17],necessari:15,need:[10,12,13,14],neg:[11,16],netnam:17,netron:3,network:[3,4,13,17],neural:[4,13],neuron:13,new_nam:11,next:16,no_decl:17,node:[9,10,11,14,15,16,18],node_inputs_in_expected_ord:9,node_res_estim:13,non:15,none:[11,12,17],note:[3,12],notebook:[4,19],notwithstand:9,now:[9,11],npbytearrai:17,npbytearray2hexstr:17,npy:[13,17],npy_to_dynamic_output:13,npy_to_rtlsim_input:17,npysim:[13,15],number:[11,12,13,17],numpi:[13,17],numpy_to_hls_cod:17,object:[11,17],observ:13,old_nam:11,onc:[13,14],one:[9,11,13,15,17],ones:[3,15],onli:[9,11,14,15,16],onlin:3,onnx:[11,12,13,15],onnx_exec:15,onnx_model_proto:11,onnx_nod:[12,13],onnxruntim:11,op_nam:16,op_typ:9,open:3,oper:[11,16],ops:[9,13,16],option:3,order:[9,11],orig_thres_matrix:13,orig_weight_matrix:13,origin:13,other:[11,16],otherwis:[3,11,12,14,17],out:[9,12,13],out_bia:12,out_scal:12,out_shap:17,outcom:15,outermost:17,output:[11,12,13,14,17],output_shap:17,overlai:15,overview:[4,5],own:[3,12],pack:[15,17],pack_innermost_dim:17,pack_innermost_dim_as_hex_str:17,packag:15,packed_bytearrai:17,packed_bytearray_to_finnpi:17,packedbit:17,pad:17,pad_tensor_to_multiple_of:17,pad_to_dim:17,pad_to_nbit:17,page:[7,19],pair:15,param:13,paramet:[13,16,17],part:[12,13,17],particular:[12,13,17],partit:[11,17],pass:[13,17,18],password:[3,15],past:16,path:[13,15,17],payload:3,per:15,perform:[3,12,13],permit:[12,13],place:[13,15],placehold:12,platform:15,pleas:19,point:[3,14],popcount:12,port:3,posit:[13,16,17],possibl:[11,13,15],post:12,pragma:13,preced:16,precid:16,precis:17,precompil:13,precomput:14,prefer:11,prefix:17,prepend:17,pretrain:17,preusser:13,previous:15,print:3,prior:[14,15,17],process:[3,12],produc:[9,11,12,13,17],product:17,project:[4,15],properti:[9,11],provid:[3,11],push:3,pushbutton:3,pynq:[11,15],pynq_driver_dir:15,python:[3,15,17],pytorch:17,pyveril:[11,13,17],pyverilate_get_liveness_threshold_cycl:17,pyverilate_stitched_ip:17,qnn:[3,4],quantiz:[4,9,11,13],random:[14,17],random_str:17,randomli:17,rather:3,reach:14,read:[4,13],read_npy_data:13,readabl:14,real:12,recommend:14,refer:4,referenc:15,reflect:3,regular:12,rel:15,relat:[4,11,17],remot:11,remov:[15,17],remove_by_nam:17,remove_prefix:17,renam:11,rename_tensor:11,repeat:[14,16],repeatedli:11,replac:14,replaceverilogrelpath:15,repo:[3,19],repositori:[3,4],repres:[11,17],represent:17,requir:[11,12,13],research:4,reset:13,reset_rtlsim:13,reshap:13,resourc:[3,10,13],respect:17,result:[9,10,11,14,15,16,17],return_full_exec_context:11,returned_dict:[12,13],reus:13,revers:17,reverse_endian:17,reverse_inn:17,right:13,root:[3,17],round:[16,17],roundandclipthreshold:16,roundup_to_integer_multipl:17,row:13,rtlsim:[11,13,15,17],rtlsim_output_to_npi:17,run:[11,13,15],run_dock:3,same:[15,17],sampl:13,save:[11,13,15,17],save_as_npi:13,scalar:16,scale:12,scp:15,script:[3,13,15,17],second:[15,16],see:[16,17],seen:4,sep:13,separ:[4,12],sequenc:17,server:3,servic:3,set:[3,11,12,13,15,16,17],set_executable_path:17,set_initi:11,set_ipgen_path:17,set_metadata_prop:11,set_nodeattr:12,set_tensor_datatyp:11,set_tensor_shap:11,setexecmod:15,settings64:3,sever:[3,15],shape:[11,12,13,14,17],shell:15,shortli:19,should:[3,9,11,12,13,14,15],sign:[11,14,16,17],sim:[13,17],simd:13,simpli:3,simul:[12,13,15,17],sinc:[11,17],singl:[3,11,13,15,16,17],slide:13,small:9,smaller:11,smallest:11,smee:3,some:[3,4,11,12,13,14,15],someth:3,soon:[0,5,6,7,20,21],sourc:18,spawn:3,specif:4,specifi:[11,14,15,17],split:[15,16,17],stai:4,standard:[11,12,13],stitch:[11,13,15,17],store:[12,15,17],stream:13,streamingdataflowpartit:15,streamingfclayer_batch:15,streamlin:14,string:[9,15,17],stringlength:17,strm_decl:13,structur:9,style:4,sub:14,subdirectori:15,subgraph:11,submodul:18,subsequ:15,subset:9,succes:15,success:[12,15],suitabl:13,summar:13,support:11,sure:3,surviv:17,synaps:13,synthesi:[10,15],synthpynqproject:15,t_0:12,t_1:12,t_n:12,take:[3,9,11,14,16,17,19],taken:[4,11,15],target:[4,15],target_dir:15,targetbit:17,tcl:[13,15,17],tcl_script:17,tempfil:17,temporari:17,tensor:[9,11,12,14,16,17],tensor_fanout:9,tensor_nam:[9,11],tensor_shap:[11,17],tensor_valu:11,termin:[3,15],ternari:11,test:14,text:3,than:[11,12],thei:[8,16],them:[9,15,16],thi:[3,4,7,9,11,12,13,14,15,17,19],thing:4,thought:3,thresh:13,threshold:[12,13,16],through:3,time:[3,13,14,15],tlastmark:15,tmem:13,togeth:[3,15],toggl:13,toggle_clk:13,token:3,tool:[3,4],train:[3,4],transform:[8,11,18],transformed_model:14,travers:9,trigger:3,tune:4,tupl:14,two:[4,11,12,15,16,17],type:[11,13,14,17],ubuntu:3,uint16:11,uint2:[11,17],uint32:11,uint3:11,uint4:11,uint8:[11,17],umuroglu:13,under:[4,15],uniqu:14,unpack:[15,17],unpack_innermost_dim_from_hex_str:17,unsign:[11,16],until:11,untrain:17,updat:[4,16],use:[4,15],used:[4,5,11,12,13,15,17,20,21],useful:11,user:[3,14],usernam:[3,15],using:[11,13,14,15,16,17,19],util:[8,11,12,13,18],val:17,valu:[11,12,13,15,16,17],value_info:11,valueinfo:[11,14],valueinfo_to_tensor:17,valueinfoproto:[11,17],variabl:[3,17],vector:[16,17],verif:9,verifi:[9,12,13,20],verify_nod:[9,12,13],verilog:15,version:4,via:11,visser:13,vivado:[3,4,10,11,15,17],vivado_path:3,vivado_pynq_proj:15,vivado_stitch_proj:15,wai:[3,9],wait:17,want:16,wbit:17,webbrows:3,webhook:3,websit:4,weight:[11,13,17],welcom:4,well:3,when:[3,9,12,13,14],where:[3,11,12,13,15,16],wherea:11,whether:[9,11,12,13,14],which:[3,4,11,12,13,15,16,17],width:[13,17],window:13,without:3,wmem:13,work:[3,6,11,17],workspac:3,wrapper:11,write:[3,12,13,18],xilinx:4,xnor:12,xnorpopcountmatmul:[12,14,15],you:[3,7,14],your:[3,14],zero:[11,13,16,17]},titles:["Brevitas Export","End-to-End Flow","Index","Getting Started","FINN","Internals","Network Preparation","PYNQ Deployment","Source Code","Analysis","Analysis - FPGADataFlow","Core","Custom Op","Custom Op - FPGADataFlow","Transformation","Transformation - FPGADataFlow","Transformation - Streamline","Util","finn","Tutorials","Functional Verification","Vivado HLS and Vivado Synthesis"],titleterms:{"class":[12,13],"export":0,"function":20,HLS:[13,21],absorb:16,analysi:[9,10],base:[12,13],basic:17,batchnorm_to_affin:14,bipolar_to_xnor:14,brevita:0,cleanup:15,code:8,codegen_ipgen:15,codegen_ipstitch:15,codegen_npysim:15,collapse_rep:16,compil:[3,15],convert_to_hls_lay:15,convolutioninputgener:13,core:11,create_dataflow_partit:15,custom:[12,13],custom_op:[12,13],data_pack:17,datatyp:11,deploy:7,develop:3,directli:3,docker:3,end:1,execute_custom_nod:11,experiment:3,finn:[3,4,9,10,11,12,13,14,15,16,17,18],flow:1,fold_const:14,fpgadataflow:[10,13,15,17],gener:14,get:3,guid:14,hls_synth_res_estim:10,hlssynth_ipgen:15,how:[3,9],index:2,infer_datatyp:14,infer_shap:14,insert_tlastmark:15,interact:3,intern:5,jenkin:3,jupyt:3,make_deploy:15,make_pynq_driv:15,make_pynq_proj:15,modelwrapp:11,modul:[8,10,11,17],multithreshold:12,network:6,node:[12,13],notebook:3,onnx:17,onnx_exec:11,pass:[9,10,14],prepar:6,pynq:7,registri:12,remote_exec:11,reorder:16,replace_verilog_relpath:15,requir:3,res_estim:10,round_threshold:16,rtlsim_exec:11,run:3,set_exec_mod:15,shell:3,sign_to_thr:16,sourc:8,start:3,streamingdataflowpartit:12,streamingfclayer_batch:13,streamingmaxpool_batch:13,streamlin:16,submodul:[9,12,14],suit:3,synth_pynq_proj:15,synthesi:21,templat:[13,15],test:[3,17],tlastmark:13,topolog:9,transform:[14,15,16],tutori:19,use:3,using:3,util:17,verif:20,verify_custom_nod:9,vivado:21,what:4,write:[9,14],xnorpopcount:12}})
\ No newline at end of file
+Search.setIndex({docnames:["brevitas_export","end_to_end_flow","genindex","getting_started","index","internals","nw_prep","pynq_deploy","source_code/finn","source_code/finn.analysis","source_code/finn.analysis.fpgadataflow","source_code/finn.core","source_code/finn.custom_op","source_code/finn.custom_op.fpgadataflow","source_code/finn.transformation","source_code/finn.transformation.fpgadataflow","source_code/finn.transformation.streamline","source_code/finn.util","source_code/modules","tutorials","verification","vivado_synth"],envversion:{"sphinx.domains.c":1,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":1,"sphinx.domains.index":1,"sphinx.domains.javascript":1,"sphinx.domains.math":2,"sphinx.domains.python":1,"sphinx.domains.rst":1,"sphinx.domains.std":1,sphinx:56},filenames:["brevitas_export.rst","end_to_end_flow.rst","genindex.rst","getting_started.rst","index.rst","internals.rst","nw_prep.rst","pynq_deploy.rst","source_code/finn.rst","source_code/finn.analysis.rst","source_code/finn.analysis.fpgadataflow.rst","source_code/finn.core.rst","source_code/finn.custom_op.rst","source_code/finn.custom_op.fpgadataflow.rst","source_code/finn.transformation.rst","source_code/finn.transformation.fpgadataflow.rst","source_code/finn.transformation.streamline.rst","source_code/finn.util.rst","source_code/modules.rst","tutorials.rst","verification.rst","vivado_synth.rst"],objects:{"finn.analysis":{topology:[9,0,0,"-"],verify_custom_nodes:[9,0,0,"-"]},"finn.analysis.fpgadataflow":{hls_synth_res_estimation:[10,0,0,"-"],res_estimation:[10,0,0,"-"]},"finn.analysis.fpgadataflow.hls_synth_res_estimation":{hls_synth_res_estimation:[10,1,1,""]},"finn.analysis.fpgadataflow.res_estimation":{res_estimation:[10,1,1,""]},"finn.analysis.topology":{all_tensors_f32:[9,1,1,""],get_per_tensor_fanouts:[9,1,1,""],is_linear:[9,1,1,""],node_inputs_in_expected_order:[9,1,1,""]},"finn.analysis.verify_custom_nodes":{verify_nodes:[9,1,1,""]},"finn.core":{datatype:[11,0,0,"-"],execute_custom_node:[11,0,0,"-"],modelwrapper:[11,0,0,"-"],onnx_exec:[11,0,0,"-"],remote_exec:[11,0,0,"-"],rtlsim_exec:[11,0,0,"-"]},"finn.core.datatype":{DataType:[11,2,1,""]},"finn.core.datatype.DataType":{BINARY:[11,3,1,""],BIPOLAR:[11,3,1,""],FLOAT32:[11,3,1,""],INT16:[11,3,1,""],INT2:[11,3,1,""],INT32:[11,3,1,""],INT3:[11,3,1,""],INT4:[11,3,1,""],INT8:[11,3,1,""],TERNARY:[11,3,1,""],UINT16:[11,3,1,""],UINT2:[11,3,1,""],UINT32:[11,3,1,""],UINT3:[11,3,1,""],UINT4:[11,3,1,""],UINT8:[11,3,1,""],allowed:[11,4,1,""],bitwidth:[11,4,1,""],get_hls_datatype_str:[11,4,1,""],get_num_possible_values:[11,4,1,""],get_smallest_possible:[11,4,1,""],is_integer:[11,4,1,""],max:[11,4,1,""],min:[11,4,1,""],signed:[11,4,1,""]},"finn.core.execute_custom_node":{execute_custom_node:[11,1,1,""]},"finn.core.modelwrapper":{ModelWrapper:[11,2,1,""]},"finn.core.modelwrapper.ModelWrapper":{analysis:[11,4,1,""],check_all_tensor_shapes_specified:[11,4,1,""],check_compatibility:[11,4,1,""],find_consumer:[11,4,1,""],find_producer:[11,4,1,""],get_all_tensor_names:[11,4,1,""],get_initializer:[11,4,1,""],get_metadata_prop:[11,4,1,""],get_tensor_datatype:[11,4,1,""],get_tensor_fanout:[11,4,1,""],get_tensor_shape:[11,4,1,""],get_tensor_valueinfo:[11,4,1,""],graph:[11,4,1,""],make_empty_exec_context:[11,4,1,""],make_new_valueinfo_name:[11,4,1,""],model:[11,4,1,""],rename_tensor:[11,4,1,""],save:[11,4,1,""],set_initializer:[11,4,1,""],set_metadata_prop:[11,4,1,""],set_tensor_datatype:[11,4,1,""],set_tensor_shape:[11,4,1,""],transform:[11,4,1,""]},"finn.core.onnx_exec":{compare_execution:[11,1,1,""],execute_node:[11,1,1,""],execute_onnx:[11,1,1,""],execute_onnx_and_make_model:[11,1,1,""]},"finn.core.remote_exec":{remote_exec:[11,1,1,""]},"finn.core.rtlsim_exec":{rtlsim_exec:[11,1,1,""]},"finn.custom_op":{CustomOp:[12,2,1,""],fpgadataflow:[13,0,0,"-"],multithreshold:[12,0,0,"-"],registry:[12,0,0,"-"],streamingdataflowpartition:[12,0,0,"-"],xnorpopcount:[12,0,0,"-"]},"finn.custom_op.CustomOp":{execute_node:[12,4,1,""],get_nodeattr:[12,4,1,""],get_nodeattr_types:[12,4,1,""],infer_node_datatype:[12,4,1,""],make_shape_compatible_op:[12,4,1,""],set_nodeattr:[12,4,1,""],verify_node:[12,4,1,""]},"finn.custom_op.fpgadataflow":{HLSCustomOp:[13,2,1,""],convolutioninputgenerator:[13,0,0,"-"],streamingfclayer_batch:[13,0,0,"-"],streamingmaxpool_batch:[13,0,0,"-"],templates:[13,0,0,"-"],tlastmarker:[13,0,0,"-"]},"finn.custom_op.fpgadataflow.HLSCustomOp":{blackboxfunction:[13,4,1,""],bram_estimation:[13,4,1,""],code_generation_ipgen:[13,4,1,""],code_generation_npysim:[13,4,1,""],compile_singlenode_code:[13,4,1,""],dataoutstrm:[13,4,1,""],defines:[13,4,1,""],docompute:[13,4,1,""],dynamic_input_to_npy:[13,4,1,""],exec_precompiled_singlenode_model:[13,4,1,""],execute_node:[13,4,1,""],generate_params:[13,4,1,""],get_folded_input_shape:[13,4,1,""],get_folded_output_shape:[13,4,1,""],get_instream_width:[13,4,1,""],get_nodeattr_types:[13,4,1,""],get_number_output_values:[13,4,1,""],get_outstream_width:[13,4,1,""],global_includes:[13,4,1,""],ipgen_singlenode_code:[13,4,1,""],lut_estimation:[13,4,1,""],node_res_estimation:[13,4,1,""],npy_to_dynamic_output:[13,4,1,""],pragmas:[13,4,1,""],read_npy_data:[13,4,1,""],reset_rtlsim:[13,4,1,""],rtlsim:[13,4,1,""],save_as_npy:[13,4,1,""],strm_decl:[13,4,1,""],toggle_clk:[13,4,1,""]},"finn.custom_op.fpgadataflow.convolutioninputgenerator":{ConvolutionInputGenerator:[13,2,1,""]},"finn.custom_op.fpgadataflow.convolutioninputgenerator.ConvolutionInputGenerator":{blackboxfunction:[13,4,1,""],bram_estimation:[13,4,1,""],dataoutstrm:[13,4,1,""],defines:[13,4,1,""],docompute:[13,4,1,""],execute_node:[13,4,1,""],get_input_datatype:[13,4,1,""],get_nodeattr_types:[13,4,1,""],get_number_output_values:[13,4,1,""],get_output_datatype:[13,4,1,""],get_stream_width:[13,4,1,""],global_includes:[13,4,1,""],infer_node_datatype:[13,4,1,""],lut_estimation:[13,4,1,""],make_shape_compatible_op:[13,4,1,""],pragmas:[13,4,1,""],read_npy_data:[13,4,1,""],save_as_npy:[13,4,1,""],strm_decl:[13,4,1,""],verify_node:[13,4,1,""]},"finn.custom_op.fpgadataflow.streamingfclayer_batch":{StreamingFCLayer_Batch:[13,2,1,""]},"finn.custom_op.fpgadataflow.streamingfclayer_batch.StreamingFCLayer_Batch":{blackboxfunction:[13,4,1,""],bram_estimation:[13,4,1,""],calc_tmem:[13,4,1,""],calc_wmem:[13,4,1,""],dataoutstrm:[13,4,1,""],defines:[13,4,1,""],docompute:[13,4,1,""],execute_node:[13,4,1,""],generate_params:[13,4,1,""],get_folded_input_shape:[13,4,1,""],get_folded_output_shape:[13,4,1,""],get_hls_compatible_threshold_tensor:[13,4,1,""],get_hls_compatible_weight_tensor:[13,4,1,""],get_input_datatype:[13,4,1,""],get_instream_width:[13,4,1,""],get_nodeattr_types:[13,4,1,""],get_number_output_values:[13,4,1,""],get_output_datatype:[13,4,1,""],get_outstream_width:[13,4,1,""],get_template_param_values:[13,4,1,""],get_weight_datatype:[13,4,1,""],global_includes:[13,4,1,""],infer_node_datatype:[13,4,1,""],lut_estimation:[13,4,1,""],make_shape_compatible_op:[13,4,1,""],pragmas:[13,4,1,""],read_npy_data:[13,4,1,""],save_as_npy:[13,4,1,""],strm_decl:[13,4,1,""],verify_node:[13,4,1,""]},"finn.custom_op.fpgadataflow.streamingmaxpool_batch":{StreamingMaxPool_Batch:[13,2,1,""]},"finn.custom_op.fpgadataflow.streamingmaxpool_batch.StreamingMaxPool_Batch":{blackboxfunction:[13,4,1,""],bram_estimation:[13,4,1,""],dataoutstrm:[13,4,1,""],defines:[13,4,1,""],docompute:[13,4,1,""],get_nodeattr_types:[13,4,1,""],get_number_output_values:[13,4,1,""],global_includes:[13,4,1,""],infer_node_datatype:[13,4,1,""],lut_estimation:[13,4,1,""],make_shape_compatible_op:[13,4,1,""],pragmas:[13,4,1,""],read_npy_data:[13,4,1,""],save_as_npy:[13,4,1,""],strm_decl:[13,4,1,""],verify_node:[13,4,1,""]},"finn.custom_op.fpgadataflow.tlastmarker":{TLastMarker:[13,2,1,""]},"finn.custom_op.fpgadataflow.tlastmarker.TLastMarker":{blackboxfunction:[13,4,1,""],dataoutstrm:[13,4,1,""],defines:[13,4,1,""],docompute:[13,4,1,""],execute_node:[13,4,1,""],get_folded_input_shape:[13,4,1,""],get_folded_output_shape:[13,4,1,""],get_instream_width:[13,4,1,""],get_nodeattr_types:[13,4,1,""],get_number_output_values:[13,4,1,""],get_outstream_width:[13,4,1,""],global_includes:[13,4,1,""],infer_node_datatype:[13,4,1,""],make_shape_compatible_op:[13,4,1,""],pragmas:[13,4,1,""],read_npy_data:[13,4,1,""],save_as_npy:[13,4,1,""],strm_decl:[13,4,1,""],verify_node:[13,4,1,""]},"finn.custom_op.multithreshold":{MultiThreshold:[12,2,1,""],compare:[12,1,1,""],multithreshold:[12,1,1,""]},"finn.custom_op.multithreshold.MultiThreshold":{execute_node:[12,4,1,""],get_nodeattr_types:[12,4,1,""],infer_node_datatype:[12,4,1,""],make_shape_compatible_op:[12,4,1,""],verify_node:[12,4,1,""]},"finn.custom_op.registry":{getCustomOp:[12,1,1,""]},"finn.custom_op.streamingdataflowpartition":{StreamingDataflowPartition:[12,2,1,""]},"finn.custom_op.streamingdataflowpartition.StreamingDataflowPartition":{execute_node:[12,4,1,""],get_nodeattr_types:[12,4,1,""],infer_node_datatype:[12,4,1,""],make_shape_compatible_op:[12,4,1,""],verify_node:[12,4,1,""]},"finn.custom_op.xnorpopcount":{XnorPopcountMatMul:[12,2,1,""],xnorpopcountmatmul:[12,1,1,""]},"finn.custom_op.xnorpopcount.XnorPopcountMatMul":{execute_node:[12,4,1,""],get_nodeattr_types:[12,4,1,""],infer_node_datatype:[12,4,1,""],make_shape_compatible_op:[12,4,1,""],verify_node:[12,4,1,""]},"finn.transformation":{batchnorm_to_affine:[14,0,0,"-"],bipolar_to_xnor:[14,0,0,"-"],fold_constants:[14,0,0,"-"],general:[14,0,0,"-"],infer_datatypes:[14,0,0,"-"],infer_shapes:[14,0,0,"-"],streamline:[16,0,0,"-"]},"finn.transformation.batchnorm_to_affine":{BatchNormToAffine:[14,2,1,""]},"finn.transformation.batchnorm_to_affine.BatchNormToAffine":{apply:[14,4,1,""]},"finn.transformation.bipolar_to_xnor":{ConvertBipolarMatMulToXnorPopcount:[14,2,1,""]},"finn.transformation.bipolar_to_xnor.ConvertBipolarMatMulToXnorPopcount":{apply:[14,4,1,""]},"finn.transformation.fold_constants":{FoldConstants:[14,2,1,""]},"finn.transformation.fold_constants.FoldConstants":{apply:[14,4,1,""]},"finn.transformation.fpgadataflow":{cleanup:[15,0,0,"-"],codegen_ipgen:[15,0,0,"-"],codegen_ipstitch:[15,0,0,"-"],codegen_npysim:[15,0,0,"-"],compile:[15,0,0,"-"],convert_to_hls_layers:[15,0,0,"-"],create_dataflow_partition:[15,0,0,"-"],hlssynth_ipgen:[15,0,0,"-"],insert_tlastmarker:[15,0,0,"-"],make_deployment:[15,0,0,"-"],make_pynq_driver:[15,0,0,"-"],make_pynq_proj:[15,0,0,"-"],replace_verilog_relpaths:[15,0,0,"-"],set_exec_mode:[15,0,0,"-"],synth_pynq_proj:[15,0,0,"-"],templates:[15,0,0,"-"]},"finn.transformation.fpgadataflow.cleanup":{CleanUp:[15,2,1,""]},"finn.transformation.fpgadataflow.cleanup.CleanUp":{apply:[15,4,1,""]},"finn.transformation.fpgadataflow.codegen_ipgen":{CodeGen_ipgen:[15,2,1,""]},"finn.transformation.fpgadataflow.codegen_ipgen.CodeGen_ipgen":{apply:[15,4,1,""]},"finn.transformation.fpgadataflow.codegen_ipstitch":{CodeGen_ipstitch:[15,2,1,""]},"finn.transformation.fpgadataflow.codegen_ipstitch.CodeGen_ipstitch":{apply:[15,4,1,""]},"finn.transformation.fpgadataflow.codegen_npysim":{CodeGen_npysim:[15,2,1,""]},"finn.transformation.fpgadataflow.codegen_npysim.CodeGen_npysim":{apply:[15,4,1,""]},"finn.transformation.fpgadataflow.compile":{Compile:[15,2,1,""]},"finn.transformation.fpgadataflow.compile.Compile":{apply:[15,4,1,""]},"finn.transformation.fpgadataflow.convert_to_hls_layers":{InferBinaryStreamingFCLayer:[15,2,1,""]},"finn.transformation.fpgadataflow.convert_to_hls_layers.InferBinaryStreamingFCLayer":{apply:[15,4,1,""]},"finn.transformation.fpgadataflow.create_dataflow_partition":{CreateDataflowPartition:[15,2,1,""]},"finn.transformation.fpgadataflow.create_dataflow_partition.CreateDataflowPartition":{apply:[15,4,1,""]},"finn.transformation.fpgadataflow.hlssynth_ipgen":{HLSSynth_IPGen:[15,2,1,""]},"finn.transformation.fpgadataflow.hlssynth_ipgen.HLSSynth_IPGen":{apply:[15,4,1,""]},"finn.transformation.fpgadataflow.insert_tlastmarker":{InsertTLastMarker:[15,2,1,""]},"finn.transformation.fpgadataflow.insert_tlastmarker.InsertTLastMarker":{apply:[15,4,1,""]},"finn.transformation.fpgadataflow.make_deployment":{DeployToPYNQ:[15,2,1,""]},"finn.transformation.fpgadataflow.make_deployment.DeployToPYNQ":{apply:[15,4,1,""]},"finn.transformation.fpgadataflow.make_pynq_driver":{MakePYNQDriver:[15,2,1,""]},"finn.transformation.fpgadataflow.make_pynq_driver.MakePYNQDriver":{apply:[15,4,1,""]},"finn.transformation.fpgadataflow.make_pynq_proj":{MakePYNQProject:[15,2,1,""]},"finn.transformation.fpgadataflow.make_pynq_proj.MakePYNQProject":{apply:[15,4,1,""]},"finn.transformation.fpgadataflow.replace_verilog_relpaths":{ReplaceVerilogRelPaths:[15,2,1,""]},"finn.transformation.fpgadataflow.replace_verilog_relpaths.ReplaceVerilogRelPaths":{apply:[15,4,1,""]},"finn.transformation.fpgadataflow.set_exec_mode":{SetExecMode:[15,2,1,""]},"finn.transformation.fpgadataflow.set_exec_mode.SetExecMode":{apply:[15,4,1,""]},"finn.transformation.fpgadataflow.synth_pynq_proj":{SynthPYNQProject:[15,2,1,""]},"finn.transformation.fpgadataflow.synth_pynq_proj.SynthPYNQProject":{apply:[15,4,1,""]},"finn.transformation.general":{ConvertSubToAdd:[14,2,1,""],GiveRandomTensorNames:[14,2,1,""],GiveReadableTensorNames:[14,2,1,""],GiveUniqueNodeNames:[14,2,1,""]},"finn.transformation.general.ConvertSubToAdd":{apply:[14,4,1,""]},"finn.transformation.general.GiveRandomTensorNames":{apply:[14,4,1,""]},"finn.transformation.general.GiveReadableTensorNames":{apply:[14,4,1,""]},"finn.transformation.general.GiveUniqueNodeNames":{apply:[14,4,1,""]},"finn.transformation.infer_datatypes":{InferDataTypes:[14,2,1,""]},"finn.transformation.infer_datatypes.InferDataTypes":{apply:[14,4,1,""]},"finn.transformation.infer_shapes":{InferShapes:[14,2,1,""]},"finn.transformation.infer_shapes.InferShapes":{apply:[14,4,1,""]},"finn.transformation.streamline":{Streamline:[16,2,1,""],absorb:[16,0,0,"-"],collapse_repeated:[16,0,0,"-"],reorder:[16,0,0,"-"],round_thresholds:[16,0,0,"-"],sign_to_thres:[16,0,0,"-"]},"finn.transformation.streamline.Streamline":{apply:[16,4,1,""]},"finn.transformation.streamline.absorb":{Absorb1BitMulIntoMatMul:[16,2,1,""],AbsorbAddIntoMultiThreshold:[16,2,1,""],AbsorbMulIntoMultiThreshold:[16,2,1,""],FactorOutMulSignMagnitude:[16,2,1,""]},"finn.transformation.streamline.absorb.Absorb1BitMulIntoMatMul":{apply:[16,4,1,""]},"finn.transformation.streamline.absorb.AbsorbAddIntoMultiThreshold":{apply:[16,4,1,""]},"finn.transformation.streamline.absorb.AbsorbMulIntoMultiThreshold":{apply:[16,4,1,""]},"finn.transformation.streamline.absorb.FactorOutMulSignMagnitude":{apply:[16,4,1,""]},"finn.transformation.streamline.collapse_repeated":{CollapseRepeatedAdd:[16,2,1,""],CollapseRepeatedMul:[16,2,1,""],CollapseRepeatedOp:[16,2,1,""]},"finn.transformation.streamline.collapse_repeated.CollapseRepeatedOp":{apply:[16,4,1,""]},"finn.transformation.streamline.reorder":{MoveAddPastMul:[16,2,1,""],MoveScalarAddPastMatMul:[16,2,1,""],MoveScalarMulPastMatMul:[16,2,1,""]},"finn.transformation.streamline.reorder.MoveAddPastMul":{apply:[16,4,1,""]},"finn.transformation.streamline.reorder.MoveScalarAddPastMatMul":{apply:[16,4,1,""]},"finn.transformation.streamline.reorder.MoveScalarMulPastMatMul":{apply:[16,4,1,""]},"finn.transformation.streamline.round_thresholds":{RoundAndClipThresholds:[16,2,1,""]},"finn.transformation.streamline.round_thresholds.RoundAndClipThresholds":{apply:[16,4,1,""]},"finn.transformation.streamline.sign_to_thres":{ConvertSignToThres:[16,2,1,""]},"finn.transformation.streamline.sign_to_thres.ConvertSignToThres":{apply:[16,4,1,""]},"finn.util":{basic:[17,0,0,"-"],data_packing:[17,0,0,"-"],fpgadataflow:[17,0,0,"-"],onnx:[17,0,0,"-"],test:[17,0,0,"-"]},"finn.util.basic":{CppBuilder:[17,2,1,""],calculate_signed_dot_prod_range:[17,1,1,""],gen_finn_dt_tensor:[17,1,1,""],get_by_name:[17,1,1,""],get_finn_root:[17,1,1,""],interleave_matrix_outer_dim_from_partitions:[17,1,1,""],make_build_dir:[17,1,1,""],pad_tensor_to_multiple_of:[17,1,1,""],random_string:[17,1,1,""],remove_by_name:[17,1,1,""],roundup_to_integer_multiple:[17,1,1,""]},"finn.util.basic.CppBuilder":{append_includes:[17,4,1,""],append_sources:[17,4,1,""],build:[17,4,1,""],set_executable_path:[17,4,1,""]},"finn.util.data_packing":{array2hexstring:[17,1,1,""],finnpy_to_packed_bytearray:[17,1,1,""],hexstring2npbytearray:[17,1,1,""],npbytearray2hexstring:[17,1,1,""],npy_to_rtlsim_input:[17,1,1,""],numpy_to_hls_code:[17,1,1,""],pack_innermost_dim_as_hex_string:[17,1,1,""],packed_bytearray_to_finnpy:[17,1,1,""],rtlsim_output_to_npy:[17,1,1,""],unpack_innermost_dim_from_hex_string:[17,1,1,""]},"finn.util.fpgadataflow":{IPGenBuilder:[17,2,1,""],pyverilate_get_liveness_threshold_cycles:[17,1,1,""],pyverilate_stitched_ip:[17,1,1,""]},"finn.util.fpgadataflow.IPGenBuilder":{append_tcl:[17,4,1,""],build:[17,4,1,""],set_ipgen_path:[17,4,1,""]},"finn.util.onnx":{valueinfo_to_tensor:[17,1,1,""]},"finn.util.test":{get_test_model_def_fxn:[17,1,1,""],get_test_model_trained:[17,1,1,""],get_test_model_untrained:[17,1,1,""],get_trained_checkpoint:[17,1,1,""]},finn:{custom_op:[12,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","function","Python function"],"2":["py","class","Python class"],"3":["py","attribute","Python attribute"],"4":["py","method","Python method"]},objtypes:{"0":"py:module","1":"py:function","2":"py:class","3":"py:attribute","4":"py:method"},terms:{"0f01":17,"0x07":17,"0x0e":17,"0x0f01":17,"0xb":17,"0xe":17,"abstract":[12,13],"boolean":11,"class":[11,14,15,16,17],"const":14,"default":[12,13],"enum":11,"final":11,"float":17,"function":[3,11,12,13,17],"import":3,"int":15,"new":[3,4,11,12,13],"return":[9,10,11,12,13,16,17],"static":9,"throw":17,"true":[11,17],"try":3,"var":13,For:[15,16],HLS:[4,11,12,15,17],IPs:15,PEs:13,The:[3,4,8,11,12,15,16,17],There:3,Use:[11,17],abc:12,abit:17,abort:13,about:[4,7,9,15],abov:3,absolut:15,absorb1bitmulintomatmul:16,absorb:15,absorbaddintomultithreshold:16,absorbmulintomultithreshold:16,acceler:[3,15],access:3,accord:[13,17],account:11,action:15,activ:[11,17],add:[14,16,17],added:13,adder:16,adding:3,addit:[3,13,15],addition:16,address:15,admin:3,after:[13,17],aim:16,all:[3,9,11,12,13,14,15,17],all_tensors_f32:9,allow:11,alreadi:[15,19],also:[3,12,13,15],amount:17,analysi:[8,11,18],analysis_fxn:11,anaylsis_fxn:11,ani:[3,11,12,14,15,17],annot:[9,11,12,13],anoth:15,append_includ:17,append_sourc:17,append_tcl:17,appli:[11,14,15,16],appropri:[3,14],arbitrari:17,architectur:4,argument:[3,15,17],around:11,arrai:17,array2hexstr:17,arxiv:16,assign:11,associ:[11,14],assum:17,attribut:[9,12,13,15],attribute_nam:[12,13],attributeproto:[12,13],avail:19,back:[3,13],backend:15,base:[11,14,15,16,17],bash:[13,17],basic:13,batchnorm:14,batchnormtoaffin:14,been:[12,15],befor:17,below:8,between:[13,17],bias:12,binari:[11,13,15,16,17],bipolar:[11,12,13,14,16,17],bit:[11,17],bitfil:[3,12],bitwidth:11,blackbock:13,blackboxfunct:13,block:[13,15,17],blott:13,board:[11,15],bool:9,both:17,bram:13,bram_estim:13,brevita:[4,17],brien:13,browser:3,build:[13,17],built:9,calc_tmem:13,calc_wmem:13,calcul:13,calculate_signed_dot_prod_rang:17,call:[3,11,13,15],can:[3,4,7,11,13,15,16,17],centerpiec:4,chang:[3,11],check:[9,11,12,13],check_all_tensor_shapes_specifi:11,check_compat:11,client:3,clk:[13,15],clock:13,clone:[3,17],code:[13,15,17,18],code_gen_dir:17,code_gen_dir_ipgen:15,code_gen_dir_npysim:15,code_generation_ipgen:13,code_generation_npysim:13,collaps:16,collapserepeatedadd:16,collapserepeatedmul:16,collapserepeatedop:16,collect:[3,15],colloqui:4,come:[3,9],command:[3,13,17],commun:4,compar:[11,12],compare_execut:11,compare_fxn:11,comparison:12,compat:[11,12,13],compil:[4,13,17],compile_singlenode_cod:13,complet:3,compon:4,comput:[3,11,13],configur:3,consecut:16,constant:[9,11,16],construct:4,consum:11,contain:[3,4,11,12,13,15,17],context:[11,12,13],contribut:4,convert:[3,13,14,15,16,17],convertbipolarmatmultoxnorpopcount:14,convertsigntothr:16,convertsubtoadd:14,copi:[11,15],core:[8,15,18],correct:[14,17],correctli:[3,9,12,13,15],correspond:[4,11,12,13],count:13,cpp_file:17,cppbuilder:[13,17],creat:[3,11,15,17],createdataflowpartit:15,current:[4,11,13],custom:[3,4,8,9,11,15,18],customop:[12,13],cycl:[13,17],data:[11,12,13,15,17],dataflow:[4,11,15],dataoutstrm:13,datatyp:[12,13,14,17],debug:11,declar:13,deep:[4,11,13],default_v:[12,13],default_valu:[12,13],defin:13,deliveri:3,depend:3,deploi:3,deploy:15,deploytopynq:15,descript:[0,6,20,21],design:[3,15],detail:[0,4,6,7,20,21],develop:4,dict:[11,12,13],dictionari:[9,11,13],differ:[3,8,12,13],digit:17,dimens:17,dimension:17,dir:[15,17],directli:4,directori:[3,15,17],distr_pad:17,divid:8,divis:17,doc:4,docker:17,dockerfil:3,docomput:13,doe:[3,11,12],done:9,dot:17,down:[3,11],driver:15,dt_a:17,dt_b:17,dtype:[9,11,12,13,17],dynam:9,dynamic_input_to_npi:13,each:[4,9,11,14,15,16,17],editor:3,either:3,element:17,embed:11,emit:17,emphasi:4,empti:11,end:13,ensur:[13,14,15,17],entir:3,entri:17,enumer:14,environ:3,equal:[12,13],equival:16,estim:[10,13],evenli:17,event:3,everi:[3,12,13,14,15],everyth:3,exampl:[3,17],excel:3,except:17,exec_mod:15,exec_precompiled_singlenode_model:13,execut:[11,12,13,15,17],executable_path:[15,17],execute_nod:[11,12,13],execute_onnx:[11,15],execute_onnx_and_make_model:11,execution_context:11,exist:[12,13,17],exit:17,expect:[9,11,12,13,15],experi:4,experiment:4,explor:[4,11,13],expos:11,extens:3,extra:[3,9,17],extract:10,f5c6bd32ae93ec103a88152214baedff4ce1850d81065bfc:3,factor:17,factoroutmulsignmagnitud:16,fals:[11,17],familiar:3,fan:9,fast:13,feel:19,fewer:11,fewest:11,field:[15,17],file:[3,11,13,15,17],filenam:[11,15],fill:[12,13],find:[7,11],find_consum:11,find_produc:11,finish:17,finn:[0,6,7,8,19,20,21],finn_dt:17,finnpy_to_packed_bytearrai:17,first:[9,16],fix:17,flatten:17,float32:[9,11],fold:13,foldconst:14,folder:[3,15,17],follow:[3,4,9,11,12,15],form:13,format:13,forward:3,found:[4,15],four:17,fpga:[3,4],fpgadataflow:[9,12,14],fpgapart:[13,15],framework:[4,13],fraser:13,free:19,from:[3,4,10,11,13,15,17],full:11,gambardella:13,gen_finn_dt_tensor:17,gener:[4,13,15,17],generate_param:13,get:[11,12,13,15],get_all_tensor_nam:11,get_by_nam:17,get_finn_root:17,get_folded_input_shap:13,get_folded_output_shap:13,get_hls_compatible_threshold_tensor:13,get_hls_compatible_weight_tensor:13,get_hls_datatype_str:11,get_initi:11,get_input_datatyp:13,get_instream_width:13,get_metadata_prop:11,get_nodeattr:12,get_nodeattr_typ:[12,13],get_num_possible_valu:11,get_number_output_valu:13,get_output_datatyp:13,get_outstream_width:13,get_per_tensor_fanout:9,get_smallest_poss:11,get_stream_width:13,get_template_param_valu:13,get_tensor_datatyp:11,get_tensor_fanout:11,get_tensor_shap:11,get_tensor_valueinfo:11,get_test_model_def_fxn:17,get_test_model_train:17,get_test_model_untrain:17,get_trained_checkpoint:17,get_weight_datatyp:13,getcustomop:12,github:[3,4],give:[3,14,16],give_unique_node_nam:14,given:[9,10,11,12,13,17],giverandomtensornam:14,givereadabletensornam:14,giveuniquenodenam:14,global:13,global_includ:13,graph:[9,11,12,13,14,15],graphic:4,greater:12,group:12,guarante:17,guid:19,hand:4,happen:3,has:[3,9,11,13,14,15,17],have:[3,9,11,12,13,15,16],help:3,helper:12,here:[0,5,6,20,21],hex:17,hexstr:17,hexstring2npbytearrai:17,high:3,highli:4,hls:13,hls_var_nam:17,hlscustomop:13,hlslib:[4,13],homepag:4,host:[3,17],how:[6,17,21],http:3,human:14,imag:13,immedi:15,implement:[11,13,15],includ:[4,11,13,15],include_path:17,indic:[11,12,13,15],infer:[3,4,11,12,13,14,17],infer_node_datatyp:[12,13],inferbinarystreamingfclay:15,inferdatatyp:14,infershap:14,info:[14,17],info_messag:9,inform:15,infrastructur:15,initi:[3,9,11],innermost:17,inp0:12,inp1:12,inp:13,input:[9,11,12,13,14,16,17],input_dict:11,input_dtyp:17,input_fil:17,insert:[13,15,17],inserttlastmark:15,insid:[3,12],instal:3,instanc:[11,12,16],instant:17,instanti:15,instead:17,int16:11,int2:11,int32:11,int3:11,int4:11,int8:11,integ:[11,12,16,17],interest:11,interfac:15,interleav:[13,17],interleave_matrix_outer_dim_from_partit:17,intermedi:[11,14],intern:14,interv:12,involv:3,ipgen:13,ipgen_path:[15,17],ipgen_singlenode_cod:13,ipgenbuild:[13,17],is_integ:11,is_linear:9,item:17,its:12,itself:12,jupyt:[4,19],kei:11,kind:15,lab:4,lambda:11,largest:11,launch:3,layer:[14,15],lead:17,learn:[4,13],leeser:13,len:17,letter:17,librari:[4,17],library_path:17,like:3,linear:[9,11],link:[3,4,19],list:[8,9,11,17],load:17,locat:3,look:[3,4,9,19],loop:13,lut:13,lut_estim:13,made:11,magnitud:16,mai:3,make:[3,13,15],make_build_dir:17,make_collapsed_param_fxn:16,make_deepcopi:11,make_empty_exec_context:11,make_new_valueinfo_nam:11,make_project:15,make_shape_compatible_op:[12,13],makepynqdriv:15,makepynqproject:15,mani:3,manipul:11,map:12,mark:13,matmul:[14,16],matrix:[12,13,16,17],max:[11,17],mean:17,member:[12,13,17],meta:12,metadata:11,metadata_prop:[11,15],method:[12,13,20],min:[11,17],minimum:17,minut:15,mixtur:9,mkdtemp:17,mode:[3,15],model:[9,10,11,12,13,14,15,16,17,20],model_a:11,model_b:11,modelproto:[11,15],modul:18,modular:4,more:[4,7,11,14,17],mount:3,move:16,moveaddpastmul:16,movescalaraddpastmatmul:16,movescalarmulpastmatmul:16,mul:[14,16],multidimension:17,multipl:[12,16,17],multipli:16,multithreshold:[15,16],must:[12,15,16,17],mvtu:15,n_partit:17,n_thres_step:13,name:[10,11,12,14,17],name_field:17,ndarrai:17,nearest:[16,17],necessari:15,need:[10,12,13],neg:[11,16],netnam:17,netron:3,network:[3,4,13,17],neural:[4,13],neuron:13,new_nam:11,next:16,no_decl:17,node:[9,10,11,14,15,16,18],node_inputs_in_expected_ord:9,node_res_estim:13,non:15,none:[11,12,17],note:[3,12],notebook:[4,19],notwithstand:9,now:[9,11],npbytearrai:17,npbytearray2hexstr:17,npy:[13,17],npy_to_dynamic_output:13,npy_to_rtlsim_input:17,npysim:[13,15],number:[11,12,13,17],numpi:[13,17],numpy_to_hls_cod:17,object:[11,17],observ:13,old_nam:11,onc:13,one:[9,11,13,15,17],ones:[3,15],onli:[9,11,14,15,16],onlin:3,onnx:[11,12,13,15],onnx_exec:15,onnx_model_proto:11,onnx_nod:[12,13],onnxruntim:11,op_nam:16,op_typ:9,open:3,oper:[11,16],ops:[9,13,16],option:3,order:[9,11],orig_thres_matrix:13,orig_weight_matrix:13,origin:13,other:[11,16],otherwis:[3,11,12,17],out:[9,12,13],out_bia:12,out_scal:12,out_shap:17,outcom:15,outermost:17,output:[11,12,13,14,17],output_shap:17,overlai:15,overview:[4,5],own:[3,12],pack:[15,17],pack_innermost_dim:17,pack_innermost_dim_as_hex_str:17,packag:15,packed_bytearrai:17,packed_bytearray_to_finnpi:17,packedbit:17,pad:17,pad_tensor_to_multiple_of:17,pad_to_dim:17,pad_to_nbit:17,page:[7,19],pair:15,param:13,paramet:[13,16,17],part:[12,13,17],particular:[12,13,17],partit:[11,17],pass:[13,17,18],password:[3,15],past:16,path:[13,15,17],payload:3,per:15,perform:[3,12,13],permit:[12,13],place:[13,15],placehold:12,platform:15,pleas:19,point:3,popcount:12,port:3,posit:[13,16,17],possibl:[11,13,15],post:12,pragma:13,preced:16,precid:16,precis:17,precompil:13,precomput:14,prefer:11,prefix:17,prepend:17,pretrain:17,preusser:13,previous:15,print:3,prior:[14,15,17],process:[3,12],produc:[11,12,13,17],product:17,project:[4,15],properti:11,provid:[3,11],push:3,pushbutton:3,pynq:[11,15],pynq_driver_dir:15,python:[3,15,17],pytorch:17,pyveril:[11,13,17],pyverilate_get_liveness_threshold_cycl:17,pyverilate_stitched_ip:17,qnn:[3,4],quantiz:[4,9,11,13],random:[14,17],random_str:17,randomli:17,rather:3,read:[4,13],read_npy_data:13,readabl:14,real:12,recommend:14,refer:4,referenc:15,reflect:3,regular:12,rel:15,relat:[4,11,17],remot:11,remov:[15,17],remove_by_nam:17,remove_prefix:17,renam:11,rename_tensor:11,repeat:16,repeatedli:11,replac:14,replaceverilogrelpath:15,repo:[3,19],repositori:[3,4],repres:[11,17],represent:17,requir:[11,12,13],research:4,reset:13,reset_rtlsim:13,reshap:13,resourc:[3,10,13],respect:17,result:[9,10,11,14,15,16,17],return_full_exec_context:11,returned_dict:[12,13],reus:13,revers:17,reverse_endian:17,reverse_inn:17,right:13,root:[3,17],round:[16,17],roundandclipthreshold:16,roundup_to_integer_multipl:17,row:13,rtlsim:[11,13,15,17],rtlsim_output_to_npi:17,run:[11,13,15],run_dock:3,same:[15,17],sampl:13,save:[11,13,15,17],save_as_npi:13,scalar:16,scale:12,scp:15,script:[3,13,15,17],second:[15,16],see:[16,17],seen:4,sep:13,separ:[4,12],sequenc:17,server:3,servic:3,set:[3,11,12,13,15,16,17],set_executable_path:17,set_initi:11,set_ipgen_path:17,set_metadata_prop:11,set_nodeattr:12,set_tensor_datatyp:11,set_tensor_shap:11,setexecmod:15,settings64:3,sever:[3,15],shape:[11,12,13,14,17],shell:15,shortli:19,should:[3,9,11,12,13,15],sign:[11,14,16,17],sim:[13,17],simd:13,simpli:3,simul:[12,13,15,17],sinc:[11,17],singl:[3,11,13,15,16,17],slide:13,small:9,smaller:11,smallest:11,smee:3,some:[3,4,11,12,13,15],someth:3,soon:[0,5,6,7,20,21],sourc:18,spawn:3,specif:4,specifi:[11,14,15,17],split:[15,16,17],stai:4,standard:[11,12,13],stitch:[11,13,15,17],store:[12,15,17],stream:13,streamingdataflowpartit:15,streamingfclayer_batch:15,streamlin:14,string:[9,15,17],stringlength:17,strm_decl:13,style:4,sub:14,subdirectori:15,subgraph:11,submodul:18,subsequ:15,subset:9,succes:15,success:[12,15],suitabl:13,summar:13,support:11,sure:3,surviv:17,synaps:13,synthesi:[10,15],synthpynqproject:15,t_0:12,t_1:12,t_n:12,take:[3,11,16,17,19],taken:[4,11,15],target:[4,15],target_dir:15,targetbit:17,tcl:[13,15,17],tcl_script:17,tempfil:17,temporari:17,tensor:[9,11,12,14,16,17],tensor_fanout:9,tensor_nam:[9,11],tensor_shap:[11,17],tensor_valu:11,termin:[3,15],ternari:11,test:14,text:3,than:[11,12],thei:[8,16],them:[9,15,16],thi:[3,4,7,9,11,12,13,14,15,17,19],thing:4,thought:3,thresh:13,threshold:[12,13,16],through:3,time:[3,13,14,15],tlastmark:15,tmem:13,togeth:[3,15],toggl:13,toggle_clk:13,token:3,tool:[3,4],train:[3,4],transform:[8,11,18],trigger:3,tune:4,two:[4,11,12,15,16,17],type:[11,13,14,17],ubuntu:3,uint16:11,uint2:[11,17],uint32:11,uint3:11,uint4:11,uint8:[11,17],umuroglu:13,under:[4,15],uniqu:14,unpack:[15,17],unpack_innermost_dim_from_hex_str:17,unsign:[11,16],until:11,untrain:17,updat:[4,16],use:[4,15],used:[4,5,11,12,13,15,17,20,21],useful:11,user:3,usernam:[3,15],using:[11,13,14,15,16,17,19],util:[8,11,12,13,18],val:17,valu:[11,12,13,15,16,17],value_info:11,valueinfo:[11,14],valueinfo_to_tensor:17,valueinfoproto:[11,17],variabl:[3,17],vector:[16,17],verif:9,verifi:[9,12,13,20],verify_nod:[9,12,13],verilog:15,version:4,via:11,visser:13,vivado:[3,4,10,11,15,17],vivado_path:3,vivado_pynq_proj:15,vivado_stitch_proj:15,wai:[3,9],wait:17,want:16,wbit:17,webbrows:3,webhook:3,websit:4,weight:[11,13,17],welcom:4,well:3,when:[3,9,12,13],where:[3,11,12,13,15,16],wherea:11,whether:[9,11,12,13],which:[3,4,11,12,13,15,16,17],width:[13,17],window:13,without:3,wmem:13,work:[3,6,11,17],workspac:3,wrapper:11,write:[3,12,13],xilinx:4,xnor:12,xnorpopcountmatmul:[12,14,15],you:[3,7],your:3,zero:[11,13,16,17]},titles:["Brevitas Export","End-to-End Flow","Index","Getting Started","FINN","Internals","Network Preparation","PYNQ Deployment","Source Code","Analysis","Analysis - fpgadataflow","Core","Custom Op","Custom Op - FPGADataFlow","Transformation","Transformation - fpgadataflow","Transformation - Streamline","Util","finn","Tutorials","Functional Verification","Vivado HLS and Vivado Synthesis"],titleterms:{"class":[12,13],"export":0,"function":20,HLS:[13,21],absorb:16,analysi:[5,9,10],base:[12,13],basic:17,batchnorm_to_affin:14,bipolar_to_xnor:14,brevita:0,cleanup:15,code:8,codegen_ipgen:15,codegen_ipstitch:15,codegen_npysim:15,collapse_rep:16,compil:[3,15],convert_to_hls_lay:15,convolutioninputgener:13,core:11,create_dataflow_partit:15,custom:[12,13],custom_op:[12,13],data_pack:17,datatyp:11,deploy:7,develop:3,directli:3,docker:3,end:1,execute_custom_nod:11,experiment:3,finn:[3,4,5,9,10,11,12,13,14,15,16,17,18],flow:1,fold_const:14,fpgadataflow:[10,13,15,17],gener:14,get:3,hls_synth_res_estim:10,hlssynth_ipgen:15,how:3,index:2,infer_datatyp:14,infer_shap:14,insert_tlastmark:15,interact:3,intermedi:5,intern:5,jenkin:3,jupyt:3,make_deploy:15,make_pynq_driv:15,make_pynq_proj:15,modelwrapp:[5,11],modul:[8,11,17],multithreshold:12,network:6,node:[12,13],notebook:3,onnx:[5,17],onnx_exec:11,pass:[5,9,10,14],prepar:6,pynq:7,registri:12,remote_exec:11,reorder:16,replace_verilog_relpath:15,represent:5,requir:3,res_estim:10,round_threshold:16,rtlsim_exec:11,run:3,set_exec_mod:15,shell:3,sign_to_thr:16,sourc:8,start:3,streamingdataflowpartit:12,streamingfclayer_batch:13,streamingmaxpool_batch:13,streamlin:16,submodul:[9,12,14],suit:3,synth_pynq_proj:15,synthesi:21,templat:[13,15],test:[3,17],tlastmark:13,topolog:9,transform:[5,14,15,16],tutori:19,use:3,using:3,util:17,verif:20,verify_custom_nod:9,vivado:21,what:4,xnorpopcount:12}})
\ No newline at end of file
diff --git a/docs/finn/_build/html/source_code/finn.analysis.fpgadataflow.html b/docs/finn/_build/html/source_code/finn.analysis.fpgadataflow.html
index aed9e8c60..6949bee40 100644
--- a/docs/finn/_build/html/source_code/finn.analysis.fpgadataflow.html
+++ b/docs/finn/_build/html/source_code/finn.analysis.fpgadataflow.html
@@ -8,7 +8,7 @@
   
   <meta name="viewport" content="width=device-width, initial-scale=1.0">
   
-  <title>Analysis - FPGADataFlow &mdash; FINN  documentation</title>
+  <title>Analysis - fpgadataflow &mdash; FINN  documentation</title>
   
 
   
@@ -93,7 +93,6 @@
 <li class="toctree-l1 current"><a class="reference internal" href="finn.html">Source Code</a><ul class="current">
 <li class="toctree-l2 current"><a class="reference internal" href="finn.html#modules">Modules</a><ul class="current">
 <li class="toctree-l3 current"><a class="reference internal" href="finn.analysis.html">Analysis</a><ul class="current">
-<li class="toctree-l4"><a class="reference internal" href="finn.analysis.html#how-to-write-an-analysis-pass-for-finn">How to write an analysis pass for FINN</a></li>
 <li class="toctree-l4 current"><a class="reference internal" href="finn.analysis.html#submodules">Submodules</a></li>
 <li class="toctree-l4"><a class="reference internal" href="finn.analysis.html#analysis-passes">Analysis Passes</a></li>
 </ul>
@@ -156,7 +155,7 @@
         
           <li><a href="finn.analysis.html">Analysis</a> &raquo;</li>
         
-      <li>Analysis - FPGADataFlow</li>
+      <li>Analysis - fpgadataflow</li>
     
     
       <li class="wy-breadcrumbs-aside">
@@ -176,11 +175,11 @@
            <div itemprop="articleBody">
             
   <div class="section" id="analysis-fpgadataflow">
-<h1>Analysis - FPGADataFlow<a class="headerlink" href="#analysis-fpgadataflow" title="Permalink to this headline">¶</a></h1>
+<h1>Analysis - fpgadataflow<a class="headerlink" href="#analysis-fpgadataflow" title="Permalink to this headline">¶</a></h1>
 <div class="section" id="analysis-passes-fpgadataflow">
-<h2>Analysis Passes (FPGADataFlow)<a class="headerlink" href="#analysis-passes-fpgadataflow" title="Permalink to this headline">¶</a></h2>
+<h2>Analysis Passes (fpgadataflow)<a class="headerlink" href="#analysis-passes-fpgadataflow" title="Permalink to this headline">¶</a></h2>
 <div class="section" id="module-finn.analysis.fpgadataflow.hls_synth_res_estimation">
-<span id="finn-analysis-fpgadataflow-hls-synth-res-estimation-module"></span><h3>finn.analysis.fpgadataflow.hls_synth_res_estimation module<a class="headerlink" href="#module-finn.analysis.fpgadataflow.hls_synth_res_estimation" title="Permalink to this headline">¶</a></h3>
+<span id="finn-analysis-fpgadataflow-hls-synth-res-estimation"></span><h3>finn.analysis.fpgadataflow.hls_synth_res_estimation<a class="headerlink" href="#module-finn.analysis.fpgadataflow.hls_synth_res_estimation" title="Permalink to this headline">¶</a></h3>
 <dl class="function">
 <dt id="finn.analysis.fpgadataflow.hls_synth_res_estimation.hls_synth_res_estimation">
 <code class="sig-prename descclassname">finn.analysis.fpgadataflow.hls_synth_res_estimation.</code><code class="sig-name descname">hls_synth_res_estimation</code><span class="sig-paren">(</span><em class="sig-param">model</em><span class="sig-paren">)</span><a class="headerlink" href="#finn.analysis.fpgadataflow.hls_synth_res_estimation.hls_synth_res_estimation" title="Permalink to this definition">¶</a></dt>
@@ -190,7 +189,7 @@
 
 </div>
 <div class="section" id="module-finn.analysis.fpgadataflow.res_estimation">
-<span id="finn-analysis-fpgadataflow-res-estimation-module"></span><h3>finn.analysis.fpgadataflow.res_estimation module<a class="headerlink" href="#module-finn.analysis.fpgadataflow.res_estimation" title="Permalink to this headline">¶</a></h3>
+<span id="finn-analysis-fpgadataflow-res-estimation"></span><h3>finn.analysis.fpgadataflow.res_estimation<a class="headerlink" href="#module-finn.analysis.fpgadataflow.res_estimation" title="Permalink to this headline">¶</a></h3>
 <dl class="function">
 <dt id="finn.analysis.fpgadataflow.res_estimation.res_estimation">
 <code class="sig-prename descclassname">finn.analysis.fpgadataflow.res_estimation.</code><code class="sig-name descname">res_estimation</code><span class="sig-paren">(</span><em class="sig-param">model</em><span class="sig-paren">)</span><a class="headerlink" href="#finn.analysis.fpgadataflow.res_estimation.res_estimation" title="Permalink to this definition">¶</a></dt>
diff --git a/docs/finn/_build/html/source_code/finn.analysis.html b/docs/finn/_build/html/source_code/finn.analysis.html
index 70811fefc..9574fc358 100644
--- a/docs/finn/_build/html/source_code/finn.analysis.html
+++ b/docs/finn/_build/html/source_code/finn.analysis.html
@@ -35,7 +35,7 @@
   <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
     <link rel="index" title="Index" href="../genindex.html" />
     <link rel="search" title="Search" href="../search.html" />
-    <link rel="next" title="Analysis - FPGADataFlow" href="finn.analysis.fpgadataflow.html" />
+    <link rel="next" title="Analysis - fpgadataflow" href="finn.analysis.fpgadataflow.html" />
     <link rel="prev" title="Source Code" href="finn.html" /> 
 </head>
 
@@ -93,7 +93,6 @@
 <li class="toctree-l1 current"><a class="reference internal" href="finn.html">Source Code</a><ul class="current">
 <li class="toctree-l2 current"><a class="reference internal" href="finn.html#modules">Modules</a><ul class="current">
 <li class="toctree-l3 current"><a class="current reference internal" href="#">Analysis</a><ul>
-<li class="toctree-l4"><a class="reference internal" href="#how-to-write-an-analysis-pass-for-finn">How to write an analysis pass for FINN</a></li>
 <li class="toctree-l4"><a class="reference internal" href="#submodules">Submodules</a></li>
 <li class="toctree-l4"><a class="reference internal" href="#analysis-passes">Analysis Passes</a></li>
 </ul>
@@ -173,20 +172,14 @@
           <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
            <div itemprop="articleBody">
             
-  <div class="section" id="module-finn.analysis">
-<span id="analysis"></span><h1>Analysis<a class="headerlink" href="#module-finn.analysis" title="Permalink to this headline">¶</a></h1>
-<div class="section" id="how-to-write-an-analysis-pass-for-finn">
-<h2>How to write an analysis pass for FINN<a class="headerlink" href="#how-to-write-an-analysis-pass-for-finn" title="Permalink to this headline">¶</a></h2>
-<p>An analysis pass traverses the graph structure and produces information about
-certain properties. The convention is to take in a ModelWrapper, and return
-a dictionary of named properties that the analysis extracts.</p>
-</div>
+  <div class="section" id="analysis">
+<h1>Analysis<a class="headerlink" href="#analysis" title="Permalink to this headline">¶</a></h1>
 <div class="section" id="submodules">
 <h2>Submodules<a class="headerlink" href="#submodules" title="Permalink to this headline">¶</a></h2>
 <div class="toctree-wrapper compound">
 <ul>
-<li class="toctree-l1"><a class="reference internal" href="finn.analysis.fpgadataflow.html">Analysis - FPGADataFlow</a><ul>
-<li class="toctree-l2"><a class="reference internal" href="finn.analysis.fpgadataflow.html#analysis-passes-fpgadataflow">Analysis Passes (FPGADataFlow)</a></li>
+<li class="toctree-l1"><a class="reference internal" href="finn.analysis.fpgadataflow.html">Analysis - fpgadataflow</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="finn.analysis.fpgadataflow.html#analysis-passes-fpgadataflow">Analysis Passes (fpgadataflow)</a></li>
 </ul>
 </li>
 </ul>
@@ -255,7 +248,7 @@ and inputs.</p>
   
     <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
       
-        <a href="finn.analysis.fpgadataflow.html" class="btn btn-neutral float-right" title="Analysis - FPGADataFlow" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a>
+        <a href="finn.analysis.fpgadataflow.html" class="btn btn-neutral float-right" title="Analysis - fpgadataflow" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a>
       
       
         <a href="finn.html" class="btn btn-neutral float-left" title="Source Code" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a>
diff --git a/docs/finn/_build/html/source_code/finn.core.html b/docs/finn/_build/html/source_code/finn.core.html
index df897750e..01fd53e80 100644
--- a/docs/finn/_build/html/source_code/finn.core.html
+++ b/docs/finn/_build/html/source_code/finn.core.html
@@ -36,7 +36,7 @@
     <link rel="index" title="Index" href="../genindex.html" />
     <link rel="search" title="Search" href="../search.html" />
     <link rel="next" title="Custom Op" href="finn.custom_op.html" />
-    <link rel="prev" title="Analysis - FPGADataFlow" href="finn.analysis.fpgadataflow.html" /> 
+    <link rel="prev" title="Analysis - fpgadataflow" href="finn.analysis.fpgadataflow.html" /> 
 </head>
 
 <body class="wy-body-for-nav">
@@ -581,7 +581,7 @@ context contains the input values.</p>
         <a href="finn.custom_op.html" class="btn btn-neutral float-right" title="Custom Op" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a>
       
       
-        <a href="finn.analysis.fpgadataflow.html" class="btn btn-neutral float-left" title="Analysis - FPGADataFlow" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a>
+        <a href="finn.analysis.fpgadataflow.html" class="btn btn-neutral float-left" title="Analysis - fpgadataflow" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a>
       
     </div>
   
diff --git a/docs/finn/_build/html/source_code/finn.transformation.fpgadataflow.html b/docs/finn/_build/html/source_code/finn.transformation.fpgadataflow.html
index 45cfe3151..2c2c278da 100644
--- a/docs/finn/_build/html/source_code/finn.transformation.fpgadataflow.html
+++ b/docs/finn/_build/html/source_code/finn.transformation.fpgadataflow.html
@@ -8,7 +8,7 @@
   
   <meta name="viewport" content="width=device-width, initial-scale=1.0">
   
-  <title>Transformation - FPGADataFlow &mdash; FINN  documentation</title>
+  <title>Transformation - fpgadataflow &mdash; FINN  documentation</title>
   
 
   
@@ -96,7 +96,6 @@
 <li class="toctree-l3"><a class="reference internal" href="finn.core.html">Core</a></li>
 <li class="toctree-l3"><a class="reference internal" href="finn.custom_op.html">Custom Op</a></li>
 <li class="toctree-l3 current"><a class="reference internal" href="finn.transformation.html">Transformation</a><ul class="current">
-<li class="toctree-l4"><a class="reference internal" href="finn.transformation.html#guide-to-writing-finn-transformations">Guide to writing FINN transformations</a></li>
 <li class="toctree-l4 current"><a class="reference internal" href="finn.transformation.html#submodules">Submodules</a></li>
 <li class="toctree-l4"><a class="reference internal" href="finn.transformation.html#transformation-passes">Transformation Passes</a></li>
 </ul>
@@ -156,7 +155,7 @@
         
           <li><a href="finn.transformation.html">Transformation</a> &raquo;</li>
         
-      <li>Transformation - FPGADataFlow</li>
+      <li>Transformation - fpgadataflow</li>
     
     
       <li class="wy-breadcrumbs-aside">
@@ -176,15 +175,15 @@
            <div itemprop="articleBody">
             
   <div class="section" id="transformation-fpgadataflow">
-<h1>Transformation - FPGADataFlow<a class="headerlink" href="#transformation-fpgadataflow" title="Permalink to this headline">¶</a></h1>
+<h1>Transformation - fpgadataflow<a class="headerlink" href="#transformation-fpgadataflow" title="Permalink to this headline">¶</a></h1>
 <div class="section" id="transformations-fpgadataflow">
-<h2>Transformations (FPGADataFlow)<a class="headerlink" href="#transformations-fpgadataflow" title="Permalink to this headline">¶</a></h2>
+<h2>Transformations (fpgadataflow)<a class="headerlink" href="#transformations-fpgadataflow" title="Permalink to this headline">¶</a></h2>
 <div class="section" id="module-finn.transformation.fpgadataflow.cleanup">
 <span id="finn-transformation-fpgadataflow-cleanup"></span><h3>finn.transformation.fpgadataflow.cleanup<a class="headerlink" href="#module-finn.transformation.fpgadataflow.cleanup" title="Permalink to this headline">¶</a></h3>
 <dl class="class">
 <dt id="finn.transformation.fpgadataflow.cleanup.CleanUp">
 <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.fpgadataflow.cleanup.</code><code class="sig-name descname">CleanUp</code><a class="headerlink" href="#finn.transformation.fpgadataflow.cleanup.CleanUp" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <a class="reference internal" href="finn.transformation.html#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p>
 <p>Remove any generated files for fpgadataflow nodes.</p>
 <dl class="method">
 <dt id="finn.transformation.fpgadataflow.cleanup.CleanUp.apply">
@@ -199,7 +198,7 @@
 <dl class="class">
 <dt id="finn.transformation.fpgadataflow.codegen_ipgen.CodeGen_ipgen">
 <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.fpgadataflow.codegen_ipgen.</code><code class="sig-name descname">CodeGen_ipgen</code><span class="sig-paren">(</span><em class="sig-param">fpgapart</em>, <em class="sig-param">clk</em><span class="sig-paren">)</span><a class="headerlink" href="#finn.transformation.fpgadataflow.codegen_ipgen.CodeGen_ipgen" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <a class="reference internal" href="finn.transformation.html#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p>
 <p>Call custom implementation to generate code for single custom node
 and create folder that contains all the generated files.
 All nodes in the graph must have the fpgadataflow backend attribute and 
@@ -224,7 +223,7 @@ The subsequent transformation is HLSSynth_IPGen</p>
 <dl class="class">
 <dt id="finn.transformation.fpgadataflow.codegen_ipstitch.CodeGen_ipstitch">
 <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.fpgadataflow.codegen_ipstitch.</code><code class="sig-name descname">CodeGen_ipstitch</code><span class="sig-paren">(</span><em class="sig-param">fpgapart</em><span class="sig-paren">)</span><a class="headerlink" href="#finn.transformation.fpgadataflow.codegen_ipstitch.CodeGen_ipstitch" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <a class="reference internal" href="finn.transformation.html#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p>
 <p>Create a Vivado IP Block Design project from all the generated IPs of a
 graph. All nodes in the graph must have the fpgadataflow backend attribute,
 and the CodeGen_ipgen transformation must have been previously run on
@@ -248,7 +247,7 @@ The packaged block design IP can be found under the ip subdirectory.</p>
 <dl class="class">
 <dt id="finn.transformation.fpgadataflow.codegen_npysim.CodeGen_npysim">
 <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.fpgadataflow.codegen_npysim.</code><code class="sig-name descname">CodeGen_npysim</code><a class="headerlink" href="#finn.transformation.fpgadataflow.codegen_npysim.CodeGen_npysim" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <a class="reference internal" href="finn.transformation.html#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p>
 <p>Call custom implementation to generate code for single custom node
 and create folder that contains all the generated files.
 All nodes in the graph must have the fpgadataflow backend attribute.</p>
@@ -268,7 +267,7 @@ The subsequent transformation is Compile</p>
 <dl class="class">
 <dt id="finn.transformation.fpgadataflow.compile.Compile">
 <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.fpgadataflow.compile.</code><code class="sig-name descname">Compile</code><a class="headerlink" href="#finn.transformation.fpgadataflow.compile.Compile" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <a class="reference internal" href="finn.transformation.html#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p>
 <p>For every node: compile C++ code in node attribute “code_gen_dir_npysim” 
 and save path to executables in node attribute “executable_path”.
 All nodes in the graph must have the fpgadataflow backend attribute.</p>
@@ -288,7 +287,7 @@ finn.core.onnx_exec</p>
 <dl class="class">
 <dt id="finn.transformation.fpgadataflow.convert_to_hls_layers.InferBinaryStreamingFCLayer">
 <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.fpgadataflow.convert_to_hls_layers.</code><code class="sig-name descname">InferBinaryStreamingFCLayer</code><a class="headerlink" href="#finn.transformation.fpgadataflow.convert_to_hls_layers.InferBinaryStreamingFCLayer" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <a class="reference internal" href="finn.transformation.html#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p>
 <p>Convert pairs of binary XnorPopcountMatMul layers to
 StreamingFCLayer_Batch layers. Any immediately following MultiThreshold
 layers will also be absorbed into the MVTU.</p>
@@ -305,7 +304,7 @@ layers will also be absorbed into the MVTU.</p>
 <dl class="class">
 <dt id="finn.transformation.fpgadataflow.create_dataflow_partition.CreateDataflowPartition">
 <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.fpgadataflow.create_dataflow_partition.</code><code class="sig-name descname">CreateDataflowPartition</code><a class="headerlink" href="#finn.transformation.fpgadataflow.create_dataflow_partition.CreateDataflowPartition" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <a class="reference internal" href="finn.transformation.html#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p>
 <p>Split a graph into two graphs; one which contains non-FINN-dataflow nodes
 and a StreamingDataflowPartition node, and another which only contains
 FINN dataflow nodes. The StreamingDataflowPartition has a model attribute
@@ -324,7 +323,7 @@ dataflow nodes. No action is taken if there are no dataflow nodes.</p>
 <dl class="class">
 <dt id="finn.transformation.fpgadataflow.hlssynth_ipgen.HLSSynth_IPGen">
 <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.fpgadataflow.hlssynth_ipgen.</code><code class="sig-name descname">HLSSynth_IPGen</code><a class="headerlink" href="#finn.transformation.fpgadataflow.hlssynth_ipgen.HLSSynth_IPGen" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <a class="reference internal" href="finn.transformation.html#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p>
 <p>For each node: generate IP block from code in folder
 that is referenced in node attribute “code_gen_dir_ipgen”
 and save path of generated project in node attribute “ipgen_path”.
@@ -344,7 +343,7 @@ some time (several minutes)</p>
 <dl class="class">
 <dt id="finn.transformation.fpgadataflow.insert_tlastmarker.InsertTLastMarker">
 <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.fpgadataflow.insert_tlastmarker.</code><code class="sig-name descname">InsertTLastMarker</code><a class="headerlink" href="#finn.transformation.fpgadataflow.insert_tlastmarker.InsertTLastMarker" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <a class="reference internal" href="finn.transformation.html#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p>
 <p>Ensure that the graph is terminated with a TLastMarker node, inserting
 one if necessary.</p>
 <dl class="method">
@@ -360,7 +359,7 @@ one if necessary.</p>
 <dl class="class">
 <dt id="finn.transformation.fpgadataflow.make_deployment.DeployToPYNQ">
 <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.fpgadataflow.make_deployment.</code><code class="sig-name descname">DeployToPYNQ</code><span class="sig-paren">(</span><em class="sig-param">ip</em>, <em class="sig-param">username</em>, <em class="sig-param">password</em>, <em class="sig-param">target_dir</em><span class="sig-paren">)</span><a class="headerlink" href="#finn.transformation.fpgadataflow.make_deployment.DeployToPYNQ" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <a class="reference internal" href="finn.transformation.html#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p>
 <p>Collects all necessary files for deployment and copies them to the PYNQ board.
 Expects information about PYNQ board to make scp possible:</p>
 <p>IP address of board, username and password for board and target directory where 
@@ -378,7 +377,7 @@ the files are stored on the board</p>
 <dl class="class">
 <dt id="finn.transformation.fpgadataflow.make_pynq_driver.MakePYNQDriver">
 <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.fpgadataflow.make_pynq_driver.</code><code class="sig-name descname">MakePYNQDriver</code><a class="headerlink" href="#finn.transformation.fpgadataflow.make_pynq_driver.MakePYNQDriver" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <a class="reference internal" href="finn.transformation.html#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p>
 <p>Create PYNQ Python code to correctly interface the generated
 accelerator, including data packing/unpacking. The MakePYNQProject
 transformation must have been already applied.</p>
@@ -398,7 +397,7 @@ value.</p>
 <dl class="class">
 <dt id="finn.transformation.fpgadataflow.make_pynq_proj.MakePYNQProject">
 <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.fpgadataflow.make_pynq_proj.</code><code class="sig-name descname">MakePYNQProject</code><span class="sig-paren">(</span><em class="sig-param">platform</em><span class="sig-paren">)</span><a class="headerlink" href="#finn.transformation.fpgadataflow.make_pynq_proj.MakePYNQProject" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <a class="reference internal" href="finn.transformation.html#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p>
 <p>Create a Vivado PYNQ overlay project (including the shell infrastructure)
 from the already-stitched IP block for this graph.
 All nodes in the graph must have the fpgadataflow backend attribute,
@@ -420,7 +419,7 @@ value.</p>
 <dl class="class">
 <dt id="finn.transformation.fpgadataflow.replace_verilog_relpaths.ReplaceVerilogRelPaths">
 <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.fpgadataflow.replace_verilog_relpaths.</code><code class="sig-name descname">ReplaceVerilogRelPaths</code><a class="headerlink" href="#finn.transformation.fpgadataflow.replace_verilog_relpaths.ReplaceVerilogRelPaths" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <a class="reference internal" href="finn.transformation.html#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p>
 <p>Convert ./ relative file paths to absolute ones for generated Verilog</p>
 <dl class="method">
 <dt id="finn.transformation.fpgadataflow.replace_verilog_relpaths.ReplaceVerilogRelPaths.apply">
@@ -435,7 +434,7 @@ value.</p>
 <dl class="class">
 <dt id="finn.transformation.fpgadataflow.set_exec_mode.SetExecMode">
 <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.fpgadataflow.set_exec_mode.</code><code class="sig-name descname">SetExecMode</code><span class="sig-paren">(</span><em class="sig-param">mode</em><span class="sig-paren">)</span><a class="headerlink" href="#finn.transformation.fpgadataflow.set_exec_mode.SetExecMode" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <a class="reference internal" href="finn.transformation.html#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p>
 <p>Set attribute exec_mode in all fpgadataflow nodes to specify which 
 kind of execution should be used (“npysim” or “rtlsim”)</p>
 <dl class="method">
@@ -451,7 +450,7 @@ kind of execution should be used (“npysim” or “rtlsim”)</p>
 <dl class="class">
 <dt id="finn.transformation.fpgadataflow.synth_pynq_proj.SynthPYNQProject">
 <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.fpgadataflow.synth_pynq_proj.</code><code class="sig-name descname">SynthPYNQProject</code><a class="headerlink" href="#finn.transformation.fpgadataflow.synth_pynq_proj.SynthPYNQProject" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <a class="reference internal" href="finn.transformation.html#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p>
 <p>Run synthesis for the PYNQ project for this graph. The MakePYNQProject
 transformation must be applied prior to this transformation.</p>
 <dl class="method">
diff --git a/docs/finn/_build/html/source_code/finn.transformation.html b/docs/finn/_build/html/source_code/finn.transformation.html
index 6c7614b3e..ff5c738d9 100644
--- a/docs/finn/_build/html/source_code/finn.transformation.html
+++ b/docs/finn/_build/html/source_code/finn.transformation.html
@@ -35,7 +35,7 @@
   <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
     <link rel="index" title="Index" href="../genindex.html" />
     <link rel="search" title="Search" href="../search.html" />
-    <link rel="next" title="Transformation - FPGADataFlow" href="finn.transformation.fpgadataflow.html" />
+    <link rel="next" title="Transformation - fpgadataflow" href="finn.transformation.fpgadataflow.html" />
     <link rel="prev" title="Custom Op - FPGADataFlow" href="finn.custom_op.fpgadataflow.html" /> 
 </head>
 
@@ -96,7 +96,6 @@
 <li class="toctree-l3"><a class="reference internal" href="finn.core.html">Core</a></li>
 <li class="toctree-l3"><a class="reference internal" href="finn.custom_op.html">Custom Op</a></li>
 <li class="toctree-l3 current"><a class="current reference internal" href="#">Transformation</a><ul>
-<li class="toctree-l4"><a class="reference internal" href="#guide-to-writing-finn-transformations">Guide to writing FINN transformations</a></li>
 <li class="toctree-l4"><a class="reference internal" href="#submodules">Submodules</a></li>
 <li class="toctree-l4"><a class="reference internal" href="#transformation-passes">Transformation Passes</a></li>
 </ul>
@@ -173,47 +172,14 @@
           <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
            <div itemprop="articleBody">
             
-  <div class="section" id="module-finn.transformation">
-<span id="transformation"></span><h1>Transformation<a class="headerlink" href="#module-finn.transformation" title="Permalink to this headline">¶</a></h1>
-<div class="section" id="guide-to-writing-finn-transformations">
-<h2>Guide to writing FINN transformations<a class="headerlink" href="#guide-to-writing-finn-transformations" title="Permalink to this headline">¶</a></h2>
-<ul class="simple">
-<li><p>Your transformation must inherit the Transformation abstract base class.</p></li>
-<li><p>Your transformation’s apply function should take in a ModelWrapper, and return
-a tuple with (transformed_model: ModelWrapper, model_was_changed: Bool)</p></li>
-<li><p>The transformations are meant to be applied using the .transform function
-in ModelWrapper. This makes a deep copy of the input model by default, so
-you don’t have to.</p></li>
-<li><p>model_was_changed indicates whether your transformation made any changes to
-the model. If you know your transformation needs to be called only once and
-repeated calls have no further effect, you can return False even if the model
-was changed.</p></li>
-<li><p>You MUST return model_was_changed=False at some point when your transformation
-is called multiple times, otherwise apply_repeated() will loop infinitely.</p></li>
-<li><p>If you cannot guarantee that the transformation will reach a fixed point,
-you must declare this, return model_was_changed = False and let the user
-manually re-apply the transform.</p></li>
-</ul>
-<dl class="class">
-<dt id="finn.transformation.Transformation">
-<em class="property">class </em><code class="sig-prename descclassname">finn.transformation.</code><code class="sig-name descname">Transformation</code><a class="headerlink" href="#finn.transformation.Transformation" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">abc.ABC</span></code></p>
-<p>Transformation class all transformations are based on. Contains only 
-abstract method apply() every transformation has to fill.</p>
-<dl class="method">
-<dt id="finn.transformation.Transformation.apply">
-<em class="property">abstract </em><code class="sig-name descname">apply</code><span class="sig-paren">(</span><em class="sig-param">model</em><span class="sig-paren">)</span><a class="headerlink" href="#finn.transformation.Transformation.apply" title="Permalink to this definition">¶</a></dt>
-<dd></dd></dl>
-
-</dd></dl>
-
-</div>
+  <div class="section" id="transformation">
+<h1>Transformation<a class="headerlink" href="#transformation" title="Permalink to this headline">¶</a></h1>
 <div class="section" id="submodules">
 <h2>Submodules<a class="headerlink" href="#submodules" title="Permalink to this headline">¶</a></h2>
 <div class="toctree-wrapper compound">
 <ul>
-<li class="toctree-l1"><a class="reference internal" href="finn.transformation.fpgadataflow.html">Transformation - FPGADataFlow</a><ul>
-<li class="toctree-l2"><a class="reference internal" href="finn.transformation.fpgadataflow.html#transformations-fpgadataflow">Transformations (FPGADataFlow)</a></li>
+<li class="toctree-l1"><a class="reference internal" href="finn.transformation.fpgadataflow.html">Transformation - fpgadataflow</a><ul>
+<li class="toctree-l2"><a class="reference internal" href="finn.transformation.fpgadataflow.html#transformations-fpgadataflow">Transformations (fpgadataflow)</a></li>
 </ul>
 </li>
 <li class="toctree-l1"><a class="reference internal" href="finn.transformation.streamline.html">Transformation - Streamline</a><ul>
@@ -230,7 +196,7 @@ abstract method apply() every transformation has to fill.</p>
 <dl class="class">
 <dt id="finn.transformation.batchnorm_to_affine.BatchNormToAffine">
 <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.batchnorm_to_affine.</code><code class="sig-name descname">BatchNormToAffine</code><a class="headerlink" href="#finn.transformation.batchnorm_to_affine.BatchNormToAffine" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <a class="reference internal" href="#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p>
 <p>Replaces any test-time BatchNorm layers with Mul-Add layers.</p>
 <dl class="method">
 <dt id="finn.transformation.batchnorm_to_affine.BatchNormToAffine.apply">
@@ -245,7 +211,7 @@ abstract method apply() every transformation has to fill.</p>
 <dl class="class">
 <dt id="finn.transformation.bipolar_to_xnor.ConvertBipolarMatMulToXnorPopcount">
 <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.bipolar_to_xnor.</code><code class="sig-name descname">ConvertBipolarMatMulToXnorPopcount</code><a class="headerlink" href="#finn.transformation.bipolar_to_xnor.ConvertBipolarMatMulToXnorPopcount" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <a class="reference internal" href="#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p>
 <p>Convert MatMul nodes with all-bipolar inputs to XnorPopcountMatMul
 and associated result correction.</p>
 <dl class="method">
@@ -261,7 +227,7 @@ and associated result correction.</p>
 <dl class="class">
 <dt id="finn.transformation.fold_constants.FoldConstants">
 <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.fold_constants.</code><code class="sig-name descname">FoldConstants</code><a class="headerlink" href="#finn.transformation.fold_constants.FoldConstants" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <a class="reference internal" href="#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p>
 <p>Replace the output of a node with const-only inputs with a precomputed
 result.</p>
 <dl class="method">
@@ -277,7 +243,7 @@ result.</p>
 <dl class="class">
 <dt id="finn.transformation.general.ConvertSubToAdd">
 <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.general.</code><code class="sig-name descname">ConvertSubToAdd</code><a class="headerlink" href="#finn.transformation.general.ConvertSubToAdd" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <a class="reference internal" href="#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p>
 <p>Convert sub nodes to add nodes of appropriate sign.</p>
 <dl class="method">
 <dt id="finn.transformation.general.ConvertSubToAdd.apply">
@@ -289,7 +255,7 @@ result.</p>
 <dl class="class">
 <dt id="finn.transformation.general.GiveRandomTensorNames">
 <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.general.</code><code class="sig-name descname">GiveRandomTensorNames</code><a class="headerlink" href="#finn.transformation.general.GiveRandomTensorNames" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <a class="reference internal" href="#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p>
 <p>Give random tensor names to all tensors.</p>
 <dl class="method">
 <dt id="finn.transformation.general.GiveRandomTensorNames.apply">
@@ -301,7 +267,7 @@ result.</p>
 <dl class="class">
 <dt id="finn.transformation.general.GiveReadableTensorNames">
 <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.general.</code><code class="sig-name descname">GiveReadableTensorNames</code><a class="headerlink" href="#finn.transformation.general.GiveReadableTensorNames" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <a class="reference internal" href="#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p>
 <p>Give more human-readable names to all internal tensors. It’s recommended
 to apply give_unique_node_names prior to this transform.</p>
 <dl class="method">
@@ -314,7 +280,7 @@ to apply give_unique_node_names prior to this transform.</p>
 <dl class="class">
 <dt id="finn.transformation.general.GiveUniqueNodeNames">
 <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.general.</code><code class="sig-name descname">GiveUniqueNodeNames</code><a class="headerlink" href="#finn.transformation.general.GiveUniqueNodeNames" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <a class="reference internal" href="#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p>
 <p>Give unique names to each node in the graph using enumeration.</p>
 <dl class="method">
 <dt id="finn.transformation.general.GiveUniqueNodeNames.apply">
@@ -329,7 +295,7 @@ to apply give_unique_node_names prior to this transform.</p>
 <dl class="class">
 <dt id="finn.transformation.infer_datatypes.InferDataTypes">
 <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.infer_datatypes.</code><code class="sig-name descname">InferDataTypes</code><a class="headerlink" href="#finn.transformation.infer_datatypes.InferDataTypes" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <a class="reference internal" href="#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p>
 <p>Infer FINN DataType info for all intermediate/output tensors based on
 inputs and node type.</p>
 <dl class="method">
@@ -345,7 +311,7 @@ inputs and node type.</p>
 <dl class="class">
 <dt id="finn.transformation.infer_shapes.InferShapes">
 <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.infer_shapes.</code><code class="sig-name descname">InferShapes</code><a class="headerlink" href="#finn.transformation.infer_shapes.InferShapes" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <a class="reference internal" href="#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p>
 <p>Ensure every tensor in the model has a specified shape (ValueInfo).</p>
 <dl class="method">
 <dt id="finn.transformation.infer_shapes.InferShapes.apply">
@@ -366,7 +332,7 @@ inputs and node type.</p>
   
     <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
       
-        <a href="finn.transformation.fpgadataflow.html" class="btn btn-neutral float-right" title="Transformation - FPGADataFlow" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a>
+        <a href="finn.transformation.fpgadataflow.html" class="btn btn-neutral float-right" title="Transformation - fpgadataflow" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a>
       
       
         <a href="finn.custom_op.fpgadataflow.html" class="btn btn-neutral float-left" title="Custom Op - FPGADataFlow" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a>
diff --git a/docs/finn/_build/html/source_code/finn.transformation.streamline.html b/docs/finn/_build/html/source_code/finn.transformation.streamline.html
index d5423099b..d8199d94b 100644
--- a/docs/finn/_build/html/source_code/finn.transformation.streamline.html
+++ b/docs/finn/_build/html/source_code/finn.transformation.streamline.html
@@ -36,7 +36,7 @@
     <link rel="index" title="Index" href="../genindex.html" />
     <link rel="search" title="Search" href="../search.html" />
     <link rel="next" title="Util" href="finn.util.html" />
-    <link rel="prev" title="Transformation - FPGADataFlow" href="finn.transformation.fpgadataflow.html" /> 
+    <link rel="prev" title="Transformation - fpgadataflow" href="finn.transformation.fpgadataflow.html" /> 
 </head>
 
 <body class="wy-body-for-nav">
@@ -96,7 +96,6 @@
 <li class="toctree-l3"><a class="reference internal" href="finn.core.html">Core</a></li>
 <li class="toctree-l3"><a class="reference internal" href="finn.custom_op.html">Custom Op</a></li>
 <li class="toctree-l3 current"><a class="reference internal" href="finn.transformation.html">Transformation</a><ul class="current">
-<li class="toctree-l4"><a class="reference internal" href="finn.transformation.html#guide-to-writing-finn-transformations">Guide to writing FINN transformations</a></li>
 <li class="toctree-l4 current"><a class="reference internal" href="finn.transformation.html#submodules">Submodules</a></li>
 <li class="toctree-l4"><a class="reference internal" href="finn.transformation.html#transformation-passes">Transformation Passes</a></li>
 </ul>
@@ -182,7 +181,7 @@
 <dl class="class">
 <dt id="finn.transformation.streamline.Streamline">
 <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.streamline.</code><code class="sig-name descname">Streamline</code><a class="headerlink" href="#finn.transformation.streamline.Streamline" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <a class="reference internal" href="finn.transformation.html#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p>
 <p>Apply the streamlining transform, see arXiv:1709.04060.</p>
 <dl class="method">
 <dt id="finn.transformation.streamline.Streamline.apply">
@@ -196,7 +195,7 @@
 <dl class="class">
 <dt id="finn.transformation.streamline.absorb.Absorb1BitMulIntoMatMul">
 <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.streamline.absorb.</code><code class="sig-name descname">Absorb1BitMulIntoMatMul</code><a class="headerlink" href="#finn.transformation.streamline.absorb.Absorb1BitMulIntoMatMul" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <a class="reference internal" href="finn.transformation.html#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p>
 <p>Absorb bipolar or binary multiplications into the preciding matrix
 multiply.</p>
 <dl class="method">
@@ -209,7 +208,7 @@ multiply.</p>
 <dl class="class">
 <dt id="finn.transformation.streamline.absorb.AbsorbAddIntoMultiThreshold">
 <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.streamline.absorb.</code><code class="sig-name descname">AbsorbAddIntoMultiThreshold</code><a class="headerlink" href="#finn.transformation.streamline.absorb.AbsorbAddIntoMultiThreshold" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <a class="reference internal" href="finn.transformation.html#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p>
 <p>Absorb preceding Add ops into MultiThreshold by updating the threshold
 values. Only scalar/1D add vectors can be absorbed.</p>
 <dl class="method">
@@ -222,7 +221,7 @@ values. Only scalar/1D add vectors can be absorbed.</p>
 <dl class="class">
 <dt id="finn.transformation.streamline.absorb.AbsorbMulIntoMultiThreshold">
 <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.streamline.absorb.</code><code class="sig-name descname">AbsorbMulIntoMultiThreshold</code><a class="headerlink" href="#finn.transformation.streamline.absorb.AbsorbMulIntoMultiThreshold" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <a class="reference internal" href="finn.transformation.html#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p>
 <p>Absorb preceding Mul ops into MultiThreshold by updating the threshold
 values. Only <em>positive</em> scalar/1D mul vectors can be absorbed.</p>
 <dl class="method">
@@ -235,7 +234,7 @@ values. Only <em>positive</em> scalar/1D mul vectors can be absorbed.</p>
 <dl class="class">
 <dt id="finn.transformation.streamline.absorb.FactorOutMulSignMagnitude">
 <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.streamline.absorb.</code><code class="sig-name descname">FactorOutMulSignMagnitude</code><a class="headerlink" href="#finn.transformation.streamline.absorb.FactorOutMulSignMagnitude" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <a class="reference internal" href="finn.transformation.html#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p>
 <p>Split multiply-by-constant nodes into two multiply-by-constant nodes,
 where the first node is a bipolar vector (of signs) and the second is a
 vector of magnitudes.</p>
@@ -266,7 +265,7 @@ vector of magnitudes.</p>
 <dl class="class">
 <dt id="finn.transformation.streamline.collapse_repeated.CollapseRepeatedOp">
 <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.streamline.collapse_repeated.</code><code class="sig-name descname">CollapseRepeatedOp</code><span class="sig-paren">(</span><em class="sig-param">op_name</em>, <em class="sig-param">make_collapsed_param_fxn</em><span class="sig-paren">)</span><a class="headerlink" href="#finn.transformation.streamline.collapse_repeated.CollapseRepeatedOp" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <a class="reference internal" href="finn.transformation.html#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p>
 <p>Collapse repeated consecutive operations with constant parameters into
 a single operation. make_collapsed_param_fxn must take two tensors and
 return a tensor which gives the equivalent result using a single op.</p>
@@ -283,7 +282,7 @@ return a tensor which gives the equivalent result using a single op.</p>
 <dl class="class">
 <dt id="finn.transformation.streamline.reorder.MoveAddPastMul">
 <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.streamline.reorder.</code><code class="sig-name descname">MoveAddPastMul</code><a class="headerlink" href="#finn.transformation.streamline.reorder.MoveAddPastMul" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <a class="reference internal" href="finn.transformation.html#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p>
 <p>Move add operations past multiply operations. The aim is to have them
 next to each other such that they can be collapsed into a single add.</p>
 <dl class="method">
@@ -296,7 +295,7 @@ next to each other such that they can be collapsed into a single add.</p>
 <dl class="class">
 <dt id="finn.transformation.streamline.reorder.MoveScalarAddPastMatMul">
 <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.streamline.reorder.</code><code class="sig-name descname">MoveScalarAddPastMatMul</code><a class="headerlink" href="#finn.transformation.streamline.reorder.MoveScalarAddPastMatMul" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <a class="reference internal" href="finn.transformation.html#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p>
 <p>Move scalar add operations past matmul operations. We want to have adds
 next to each other such that they can be collapsed into a single add.</p>
 <dl class="method">
@@ -309,7 +308,7 @@ next to each other such that they can be collapsed into a single add.</p>
 <dl class="class">
 <dt id="finn.transformation.streamline.reorder.MoveScalarMulPastMatMul">
 <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.streamline.reorder.</code><code class="sig-name descname">MoveScalarMulPastMatMul</code><a class="headerlink" href="#finn.transformation.streamline.reorder.MoveScalarMulPastMatMul" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <a class="reference internal" href="finn.transformation.html#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p>
 <p>Move scalar mul operations past matmul operations. We want to have muls
 next to each other such that they can be collapsed into a single mul.</p>
 <dl class="method">
@@ -325,7 +324,7 @@ next to each other such that they can be collapsed into a single mul.</p>
 <dl class="class">
 <dt id="finn.transformation.streamline.round_thresholds.RoundAndClipThresholds">
 <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.streamline.round_thresholds.</code><code class="sig-name descname">RoundAndClipThresholds</code><a class="headerlink" href="#finn.transformation.streamline.round_thresholds.RoundAndClipThresholds" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <a class="reference internal" href="finn.transformation.html#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p>
 <p>For MultiThreshold nodes operating on integer inputs, round up
 thresholds values to the nearest integer. Additionally, if the input
 is unsigned, sets negative thresholds to zero.</p>
@@ -342,7 +341,7 @@ is unsigned, sets negative thresholds to zero.</p>
 <dl class="class">
 <dt id="finn.transformation.streamline.sign_to_thres.ConvertSignToThres">
 <em class="property">class </em><code class="sig-prename descclassname">finn.transformation.streamline.sign_to_thres.</code><code class="sig-name descname">ConvertSignToThres</code><a class="headerlink" href="#finn.transformation.streamline.sign_to_thres.ConvertSignToThres" title="Permalink to this definition">¶</a></dt>
-<dd><p>Bases: <a class="reference internal" href="finn.transformation.html#finn.transformation.Transformation" title="finn.transformation.Transformation"><code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></a></p>
+<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">finn.transformation.Transformation</span></code></p>
 <p>Convert Sign node instances to MultiThreshold with threshold at 0.</p>
 <dl class="method">
 <dt id="finn.transformation.streamline.sign_to_thres.ConvertSignToThres.apply">
@@ -366,7 +365,7 @@ is unsigned, sets negative thresholds to zero.</p>
         <a href="finn.util.html" class="btn btn-neutral float-right" title="Util" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a>
       
       
-        <a href="finn.transformation.fpgadataflow.html" class="btn btn-neutral float-left" title="Transformation - FPGADataFlow" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a>
+        <a href="finn.transformation.fpgadataflow.html" class="btn btn-neutral float-left" title="Transformation - fpgadataflow" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a>
       
     </div>
   
diff --git a/docs/finn/_build/html/source_code/modules.html b/docs/finn/_build/html/source_code/modules.html
index e15c1a51a..4d65b4270 100644
--- a/docs/finn/_build/html/source_code/modules.html
+++ b/docs/finn/_build/html/source_code/modules.html
@@ -161,7 +161,6 @@
 <li class="toctree-l1"><a class="reference internal" href="finn.html">Source Code</a><ul>
 <li class="toctree-l2"><a class="reference internal" href="finn.html#modules">Modules</a><ul>
 <li class="toctree-l3"><a class="reference internal" href="finn.analysis.html">Analysis</a><ul>
-<li class="toctree-l4"><a class="reference internal" href="finn.analysis.html#how-to-write-an-analysis-pass-for-finn">How to write an analysis pass for FINN</a></li>
 <li class="toctree-l4"><a class="reference internal" href="finn.analysis.html#submodules">Submodules</a></li>
 <li class="toctree-l4"><a class="reference internal" href="finn.analysis.html#analysis-passes">Analysis Passes</a></li>
 </ul>
@@ -176,7 +175,6 @@
 </ul>
 </li>
 <li class="toctree-l3"><a class="reference internal" href="finn.transformation.html">Transformation</a><ul>
-<li class="toctree-l4"><a class="reference internal" href="finn.transformation.html#guide-to-writing-finn-transformations">Guide to writing FINN transformations</a></li>
 <li class="toctree-l4"><a class="reference internal" href="finn.transformation.html#submodules">Submodules</a></li>
 <li class="toctree-l4"><a class="reference internal" href="finn.transformation.html#transformation-passes">Transformation Passes</a></li>
 </ul>
diff --git a/docs/finn/internals.rst b/docs/finn/internals.rst
index 0423e63d3..6b8faea09 100644
--- a/docs/finn/internals.rst
+++ b/docs/finn/internals.rst
@@ -3,3 +3,15 @@ Internals
 *********
 
 .. note:: **Here will be soon an overview of the internals that are used in FINN.**
+
+Intermediate Representation: FINN-ONNX
+======================================
+
+ModelWrapper
+============
+
+Analysis Pass
+=============
+
+Transformation Pass
+===================
diff --git a/docs/finn/source_code/finn.analysis.fpgadataflow.rst b/docs/finn/source_code/finn.analysis.fpgadataflow.rst
index 54befd447..e31723ca3 100644
--- a/docs/finn/source_code/finn.analysis.fpgadataflow.rst
+++ b/docs/finn/source_code/finn.analysis.fpgadataflow.rst
@@ -1,20 +1,20 @@
 ***********************
-Analysis - FPGADataFlow
+Analysis - fpgadataflow 
 ***********************
 
-Analysis Passes (FPGADataFlow)
+Analysis Passes (fpgadataflow)
 ==============================
 
-finn.analysis.fpgadataflow.hls\_synth\_res\_estimation module
--------------------------------------------------------------
+finn.analysis.fpgadataflow.hls\_synth\_res\_estimation
+------------------------------------------------------
 
 .. automodule:: finn.analysis.fpgadataflow.hls_synth_res_estimation
    :members:
    :undoc-members:
    :show-inheritance:
 
-finn.analysis.fpgadataflow.res\_estimation module
--------------------------------------------------
+finn.analysis.fpgadataflow.res\_estimation
+------------------------------------------
 
 .. automodule:: finn.analysis.fpgadataflow.res_estimation
    :members:
diff --git a/docs/finn/source_code/finn.analysis.rst b/docs/finn/source_code/finn.analysis.rst
index 99ebb7ef4..2a66199d0 100644
--- a/docs/finn/source_code/finn.analysis.rst
+++ b/docs/finn/source_code/finn.analysis.rst
@@ -2,11 +2,6 @@
 Analysis 
 ********
 
-.. automodule:: finn.analysis
-   :members:
-   :undoc-members:
-   :show-inheritance:
-
 Submodules
 ==========
 
diff --git a/docs/finn/source_code/finn.transformation.fpgadataflow.rst b/docs/finn/source_code/finn.transformation.fpgadataflow.rst
index 7dbca7844..ba850d8fd 100644
--- a/docs/finn/source_code/finn.transformation.fpgadataflow.rst
+++ b/docs/finn/source_code/finn.transformation.fpgadataflow.rst
@@ -1,8 +1,8 @@
 *****************************
-Transformation - FPGADataFlow
+Transformation - fpgadataflow 
 *****************************
 
-Transformations (FPGADataFlow)
+Transformations (fpgadataflow)
 ==============================
 
 finn.transformation.fpgadataflow.cleanup
diff --git a/docs/finn/source_code/finn.transformation.rst b/docs/finn/source_code/finn.transformation.rst
index 6819785c2..6a5fcf29c 100644
--- a/docs/finn/source_code/finn.transformation.rst
+++ b/docs/finn/source_code/finn.transformation.rst
@@ -2,11 +2,6 @@
 Transformation
 **************
 
-.. automodule:: finn.transformation
-   :members:
-   :undoc-members:
-   :show-inheritance:
-
 Submodules
 ==========
 
-- 
GitLab