diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml new file mode 100644 index 0000000000000000000000000000000000000000..2fbb9265beb49644f08a2c6e916ab9c23d4bd339 --- /dev/null +++ b/.github/workflows/pre-commit.yml @@ -0,0 +1,22 @@ +name: Pre-commit + +on: + pull_request: + branches: [ main, dev ] + push: + branches: [ main, dev ] + +jobs: + lint: + name: Lint PR or Push to DEV + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v2 + + - name: Setup Python + uses: actions/setup-python@v2 + + - name: Run Lint + uses: pre-commit/action@v2.0.0 diff --git a/.isort.cfg b/.isort.cfg new file mode 100644 index 0000000000000000000000000000000000000000..6cfe1c8919fd8488c5e6f00a816e500b1f88a784 --- /dev/null +++ b/.isort.cfg @@ -0,0 +1,11 @@ +[settings] +line_length=88 +indent=' ' +skip=.tox,.venv,build,dist +known_standard_library=setuptools,pkg_resources +known_test=pytest +known_first_party=finn +sections=FUTURE,STDLIB,TEST,THIRDPARTY,FIRSTPARTY,LOCALFOLDER +default_section=THIRDPARTY +multi_line_output=3 +profile=black diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index c513c5493d674b067b82fdae9e675d7f9b6eb024..143514b36ba31cb2b292f3a1961187709798efbf 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -27,28 +27,44 @@ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. exclude: '^docs/conf.py' + default_language_version: python: python3 + repos: -# black -- repo: https://github.com/ambv/black - rev: stable - hooks: - - id: black - language_version: python3 - repo: git://github.com/pre-commit/pre-commit-hooks - rev: v2.2.3 + rev: v3.2.0 hooks: - id: trailing-whitespace + exclude: '\.dat$' + - id: check-added-large-files - id: check-ast - id: check-json - id: check-merge-conflict - id: check-xml - id: check-yaml - id: debug-statements + exclude: '^src/finn/builder/build_dataflow.py$' - id: end-of-file-fixer - id: requirements-txt-fixer - id: mixed-line-ending args: ['--fix=no'] + +- repo: git://github.com/PyCQA/isort + rev: 5.5.3 + hooks: + - id: isort + +- repo: git://github.com/psf/black + rev: stable + hooks: + - id: black + language_version: python3 + +- repo: https://gitlab.com/pycqa/flake8 + rev: 3.8.3 + hooks: - id: flake8 - args: ['--max-line-length=88'] # default of Black + # black-compatible flake-8 config + args: ['--max-line-length=88', # black default + '--extend-ignore=E203'] # E203 is not PEP8 compliant diff --git a/docs/finn/conf.py b/docs/finn/conf.py index 1bd179c3f7904ba102f7a9b4f2edc2739ba58183..6f9f9156b906da3675ab745c7ff427112cac762a 100644 --- a/docs/finn/conf.py +++ b/docs/finn/conf.py @@ -12,14 +12,15 @@ # import os import sys -sys.path.insert(0, os.path.abspath('../../src/')) + +sys.path.insert(0, os.path.abspath("../../src/")) # -- Project information ----------------------------------------------------- -project = 'FINN' -copyright = '2020, Xilinx' -author = 'Y. Umuroglu and J. Petri-Koenig' +project = "FINN" +copyright = "2020, Xilinx" +author = "Y. Umuroglu and J. Petri-Koenig" # -- General configuration --------------------------------------------------- @@ -27,17 +28,16 @@ author = 'Y. Umuroglu and J. Petri-Koenig' # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. -extensions = [ -] -extensions.append('sphinx.ext.autodoc') +extensions = [] +extensions.append("sphinx.ext.autodoc") # Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] +templates_path = ["_templates"] # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. # This pattern also affects html_static_path and html_extra_path. -exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] +exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] # -- Options for HTML output ------------------------------------------------- @@ -45,11 +45,11 @@ exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # -html_theme = 'sphinx_rtd_theme' +html_theme = "sphinx_rtd_theme" # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] +html_static_path = ["_static"] -master_doc = 'index' +master_doc = "index" diff --git a/docs/finn/faq.rst b/docs/finn/faq.rst index 093344e70331572a425a09d34c5a68d7313bc521..87e36e0722e4db6b2efd5de5df343b7bdf68a719 100644 --- a/docs/finn/faq.rst +++ b/docs/finn/faq.rst @@ -9,25 +9,25 @@ Frequently Asked Questions Can I install FINN out of the Docker container? =============================================== -We do not support out of the Docker implementations at the moment. This is due +We do not support out of the Docker implementations at the moment. This is due to the high complexity of the FINN project dependencies. Since FINN uses ONNX, can I compile any model from the ONNX Model Zoo to an FPGA accelerator? ============================================================================================= -The short answer is no. FINN uses ONNX in a specific (non-standard) way, including custom layer +The short answer is no. FINN uses ONNX in a specific (non-standard) way, including custom layer types and quantization annotations. Networks must be first quantized using Brevitas and exported to FINN-ONNX to be converted to FPGA accelerators. -Can I deploy custom NNs with arbitrary precisions and layers using FINN? +Can I deploy custom NNs with arbitrary precisions and layers using FINN? ========================================================================= Yes, though the effort required and quality of results will vary. -Although we do support arbitrary -precision, the way we create the hardware isn't typically practical for more than -4 bits, or very large networks for a single FPGA. -In terms of layers, only a subset of quantized layers covered by the various FINN examples +Although we do support arbitrary +precision, the way we create the hardware isn't typically practical for more than +4 bits, or very large networks for a single FPGA. +In terms of layers, only a subset of quantized layers covered by the various FINN examples are currently supported. It is possible to add support for new layers, though we don't have tutorials for this in place just yet. @@ -35,16 +35,16 @@ just yet. Does FINN only work with the example networks? ============================================== -FINN isn't restricted to the example networks; -rather, it's restricted to certain patterns (e.g. certain layer types and their combinations). -The current best practice for custom networks is to take a working network and gradually modify it. +FINN isn't restricted to the example networks; +rather, it's restricted to certain patterns (e.g. certain layer types and their combinations). +The current best practice for custom networks is to take a working network and gradually modify it. What is the expected background for using FINN? =============================================== Some general knowledge of Python, Docker, machine learning with neural networks and Jupyter notebooks is expected. -Our goal is to make the tool in a shape and form so that no hardware/FPGA background +Our goal is to make the tool in a shape and form so that no hardware/FPGA background should be necessary, although having some knowledge would give better results. What operating systems are supported by FINN? @@ -66,6 +66,6 @@ What board do you recommend to start working with FINN? Our preferred target platforms are those supported by `PYNQ <http://www.pynq.io/board.html>`_. For those boards we can offer end-to-end (DNN-to-bitstream) deployment, see the `finn-examples <https://github.com/Xilinx/finn-examples>`_ repository for some examples. -However, FINN also supports Vivado IP Integrator designs. The IPs connect using AXI stream (FIFO) +However, FINN also supports Vivado IP Integrator designs. The IPs connect using AXI stream (FIFO) in-and-out interfaces. This means that it can be integrated onto any Xilinx FPGA board, though you will have to do the system integration manually. diff --git a/finn-rtllib/memstream/hdl/mux.v b/finn-rtllib/memstream/hdl/mux.v index c5b89aeb4e7eb7b2858d062c18b693d9bd685fb2..f7087f9735771a73aa532ae19baf18569e9de663 100644 --- a/finn-rtllib/memstream/hdl/mux.v +++ b/finn-rtllib/memstream/hdl/mux.v @@ -1,44 +1,44 @@ -/* - Copyright (c) 2020, Xilinx - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of FINN nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -module mux -#( - parameter NINPUTS = 1, - parameter WIDTH = 16 -) -( - input [NINPUTS*WIDTH-1:0] in, - output [WIDTH-1:0] out, - input [$clog2(NINPUTS)-1:0] sel -); - -assign out = in >> (sel*WIDTH); - -endmodule \ No newline at end of file +/* + Copyright (c) 2020, Xilinx + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of FINN nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +module mux +#( + parameter NINPUTS = 1, + parameter WIDTH = 16 +) +( + input [NINPUTS*WIDTH-1:0] in, + output [WIDTH-1:0] out, + input [$clog2(NINPUTS)-1:0] sel +); + +assign out = in >> (sel*WIDTH); + +endmodule diff --git a/finn-rtllib/memstream/sim/gen_memblocks.sh b/finn-rtllib/memstream/sim/gen_memblocks.sh index 05962f7be8fe4afd7790640cf4d280600dcf43d1..b6e6b656ad1ea7846666108a1d4b79eae295490f 100644 --- a/finn-rtllib/memstream/sim/gen_memblocks.sh +++ b/finn-rtllib/memstream/sim/gen_memblocks.sh @@ -36,4 +36,4 @@ for (( i=0; i<$NBLOCKS; i++ )) do START=$(( 1 + $i * 1024 )) tail -n +$START $1 | head -n 1024 >> memblock_$i.dat -done \ No newline at end of file +done diff --git a/finn-rtllib/memstream/sim/tb_memstream.v b/finn-rtllib/memstream/sim/tb_memstream.v index d63fa30046d7c5f2c50f509174b4937374e70c13..ad3efad5bd70c37a860ddb0ec5bff1c2e72c15f0 100644 --- a/finn-rtllib/memstream/sim/tb_memstream.v +++ b/finn-rtllib/memstream/sim/tb_memstream.v @@ -1,369 +1,369 @@ -/* - Copyright (c) 2020, Xilinx - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of FINN nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -`timescale 1ns/10ps - -module tb_memstream; - -//parameters to enable/disable axi-mm, set number of streams, set readmemh for memory, set per-stream offsets in memory, set per-stream widths -parameter CONFIG_EN = 1; -parameter NSTREAMS = 4;//1 up to 6 - -parameter MEM_DEPTH = 9216; -parameter MEM_WIDTH = 32; -parameter MEM_INIT = "./"; -parameter MEM_CHECK = "golden.dat"; - -//widths per stream -parameter STRM0_WIDTH = 32; -parameter STRM1_WIDTH = 32; -parameter STRM2_WIDTH = 32; -parameter STRM3_WIDTH = 32; -parameter STRM4_WIDTH = 1; -parameter STRM5_WIDTH = 1; - -//depths per stream -parameter STRM0_DEPTH = 2304; -parameter STRM1_DEPTH = 2304; -parameter STRM2_DEPTH = 2304; -parameter STRM3_DEPTH = 2304; -parameter STRM4_DEPTH = 1; -parameter STRM5_DEPTH = 1; - -//offsets for each stream -parameter STRM0_OFFSET = 0; -parameter STRM1_OFFSET = 2304; -parameter STRM2_OFFSET = 4608; -parameter STRM3_OFFSET = 6912; -parameter STRM4_OFFSET = 0; -parameter STRM5_OFFSET = 0; - - -reg clk; -reg rst; - -reg [31:0] config_address = 0; -reg config_ce = 0; -reg config_we = 0; -reg [31:0] config_d0 = 0; -wire [31:0] config_q0; - -//multiple wire AXI Streams -reg m_axis_0_afull; -reg m_axis_0_tready; -wire m_axis_0_tvalid; -wire [STRM0_WIDTH-1:0] m_axis_0_tdata; - -reg m_axis_1_afull; -reg m_axis_1_tready; -wire m_axis_1_tvalid; -wire [STRM1_WIDTH-1:0] m_axis_1_tdata; - -reg m_axis_2_afull; -reg m_axis_2_tready; -wire m_axis_2_tvalid; -wire [STRM2_WIDTH-1:0] m_axis_2_tdata; - -reg m_axis_3_afull; -reg m_axis_3_tready; -wire m_axis_3_tvalid; -wire [STRM3_WIDTH-1:0] m_axis_3_tdata; - -reg m_axis_4_afull; -reg m_axis_4_tready; -wire m_axis_4_tvalid; -wire [STRM4_WIDTH-1:0] m_axis_4_tdata; - -reg m_axis_5_afull; -reg m_axis_5_tready; -wire m_axis_5_tvalid; -wire [STRM5_WIDTH-1:0] m_axis_5_tdata; - -reg [MEM_WIDTH-1:0] golden[MEM_DEPTH-1:0]; -integer ptr0, ptr1, ptr2, ptr3, ptr4, ptr5; -integer done = 0; -reg [5:0] rng; - -//clock -initial begin - clk = 0; - forever #5 clk = ~clk; -end - -initial begin - rst = 1; - config_ce = 0; - m_axis_0_afull = 0; - m_axis_1_afull = 0; - m_axis_2_afull = 0; - m_axis_3_afull = 0; - m_axis_4_afull = 0; - m_axis_5_afull = 0; - m_axis_0_tready = 1; - m_axis_1_tready = 1; - m_axis_2_tready = 1; - m_axis_3_tready = 1; - m_axis_4_tready = 1; - m_axis_5_tready = 1; - repeat(100) @(negedge clk); - rst = 0; - #100 - fork - begin - $display("Starting to generate random AFULL"); - while(~done) begin - rng = $random; - m_axis_0_afull = rng[0]; - m_axis_1_afull = rng[1]; - m_axis_2_afull = rng[2]; - m_axis_3_afull = rng[3]; - m_axis_4_afull = rng[4]; - m_axis_5_afull = rng[5]; - @(negedge clk); - end - end - join -end - - -//DUT -memstream -#( - CONFIG_EN, - NSTREAMS, - MEM_DEPTH, - MEM_WIDTH, - MEM_INIT, - - //widths per stream - STRM0_WIDTH, - STRM1_WIDTH, - STRM2_WIDTH, - STRM3_WIDTH, - STRM4_WIDTH, - STRM5_WIDTH, - - //depths per stream - STRM0_DEPTH, - STRM1_DEPTH, - STRM2_DEPTH, - STRM3_DEPTH, - STRM4_DEPTH, - STRM5_DEPTH, - - //offsets for each stream - STRM0_OFFSET, - STRM1_OFFSET, - STRM2_OFFSET, - STRM3_OFFSET, - STRM4_OFFSET, - STRM5_OFFSET -) -dut -( - clk, - ~rst, - - //optional AXI-Lite interface - config_address, - config_ce, - config_we, - config_d0, - config_q0, - - //multiple output AXI Streams - m_axis_0_afull, - m_axis_0_tready, - m_axis_0_tvalid, - m_axis_0_tdata, - - m_axis_1_afull, - m_axis_1_tready, - m_axis_1_tvalid, - m_axis_1_tdata, - - m_axis_2_afull, - m_axis_2_tready, - m_axis_2_tvalid, - m_axis_2_tdata, - - m_axis_3_afull, - m_axis_3_tready, - m_axis_3_tvalid, - m_axis_3_tdata, - - m_axis_4_afull, - m_axis_4_tready, - m_axis_4_tvalid, - m_axis_4_tdata, - - m_axis_5_afull, - m_axis_5_tready, - m_axis_5_tvalid, - m_axis_5_tdata - - -); - -//stream checkers -initial begin - ptr0 = STRM0_OFFSET; - ptr1 = STRM1_OFFSET; - ptr2 = STRM2_OFFSET; - ptr3 = STRM3_OFFSET; - ptr4 = STRM4_OFFSET; - ptr5 = STRM5_OFFSET; - fork - //check stream 0 - begin - $display("Starting stream 0 checker"); - while(~done & (NSTREAMS > 0)) begin - @(negedge clk); - if(m_axis_0_tvalid) begin - if(m_axis_0_tdata != golden[ptr0]) begin - $display("Mismatch on stream 0"); - $stop(); - end - //increment pointer - ptr0 = ptr0 + 1; - //rewind pointer if it's reached end - if(ptr0 == (STRM0_OFFSET + STRM0_DEPTH)) - ptr0 = STRM0_OFFSET; - end - end - end - //check stream 1 - begin - $display("Starting stream 1 checker"); - while(~done & (NSTREAMS > 1)) begin - @(negedge clk); - if(m_axis_1_tvalid) begin - if(m_axis_1_tdata != golden[ptr1]) begin - $display("Mismatch on stream 1"); - $stop(); - end - //increment pointer - ptr1 = ptr1 + 1; - //rewind pointer if it's reached end - if(ptr1 == (STRM1_OFFSET + STRM1_DEPTH)) - ptr1 = STRM1_OFFSET; - end - end - end - - //check stream 2 - begin - $display("Starting stream 2 checker"); - while(~done & (NSTREAMS > 2)) begin - @(negedge clk); - if(m_axis_2_tvalid) begin - if(m_axis_2_tdata != golden[ptr2]) begin - $display("Mismatch on stream 2"); - $stop(); - end - //increment pointer - ptr2 = ptr2 + 1; - //rewind pointer if it's reached end - if(ptr2 == (STRM2_OFFSET + STRM2_DEPTH)) - ptr2 = STRM2_OFFSET; - end - end - end - //check stream 3 - begin - $display("Starting stream 3 checker"); - while(~done & (NSTREAMS > 3)) begin - @(negedge clk); - if(m_axis_3_tvalid) begin - if(m_axis_3_tdata != golden[ptr3]) begin - $display("Mismatch on stream 3"); - $stop(); - end - //increment pointer - ptr3 = ptr3 + 1; - //rewind pointer if it's reached end - if(ptr3 == (STRM3_OFFSET + STRM3_DEPTH)) - ptr3 = STRM3_OFFSET; - end - end - end - //check stream 4 - begin - $display("Starting stream 4 checker"); - while(~done & (NSTREAMS > 4)) begin - @(negedge clk); - if(m_axis_4_tvalid) begin - if(m_axis_4_tdata != golden[ptr4]) begin - $display("Mismatch on stream 4"); - $stop(); - end - //increment pointer - ptr4 = ptr4 + 1; - //rewind pointer if it's reached end - if(ptr4 == (STRM4_OFFSET + STRM4_DEPTH)) - ptr4 = STRM4_OFFSET; - end - end - end - //check stream 5 - begin - $display("Starting stream 5 checker"); - while(~done & (NSTREAMS > 5)) begin - @(negedge clk); - if(m_axis_5_tvalid) begin - if(m_axis_5_tdata != golden[ptr5]) begin - $display("Mismatch on stream 5"); - $stop(); - end - //increment pointer - ptr5 = ptr5 + 1; - //rewind pointer if it's reached end - if(ptr5 == (STRM5_OFFSET + STRM5_DEPTH)) - ptr5 = STRM5_OFFSET; - end - end - end - join -end - -initial begin - done = 0; - $readmemh(MEM_CHECK,golden); -// $dumpfile("wave.vcd"); -// $dumpvars(0,tb_memstream); - @(negedge rst); - #10000000 - $display("Test done!"); - done = 1; - #1000 - $finish(); -end - -endmodule +/* + Copyright (c) 2020, Xilinx + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of FINN nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +`timescale 1ns/10ps + +module tb_memstream; + +//parameters to enable/disable axi-mm, set number of streams, set readmemh for memory, set per-stream offsets in memory, set per-stream widths +parameter CONFIG_EN = 1; +parameter NSTREAMS = 4;//1 up to 6 + +parameter MEM_DEPTH = 9216; +parameter MEM_WIDTH = 32; +parameter MEM_INIT = "./"; +parameter MEM_CHECK = "golden.dat"; + +//widths per stream +parameter STRM0_WIDTH = 32; +parameter STRM1_WIDTH = 32; +parameter STRM2_WIDTH = 32; +parameter STRM3_WIDTH = 32; +parameter STRM4_WIDTH = 1; +parameter STRM5_WIDTH = 1; + +//depths per stream +parameter STRM0_DEPTH = 2304; +parameter STRM1_DEPTH = 2304; +parameter STRM2_DEPTH = 2304; +parameter STRM3_DEPTH = 2304; +parameter STRM4_DEPTH = 1; +parameter STRM5_DEPTH = 1; + +//offsets for each stream +parameter STRM0_OFFSET = 0; +parameter STRM1_OFFSET = 2304; +parameter STRM2_OFFSET = 4608; +parameter STRM3_OFFSET = 6912; +parameter STRM4_OFFSET = 0; +parameter STRM5_OFFSET = 0; + + +reg clk; +reg rst; + +reg [31:0] config_address = 0; +reg config_ce = 0; +reg config_we = 0; +reg [31:0] config_d0 = 0; +wire [31:0] config_q0; + +//multiple wire AXI Streams +reg m_axis_0_afull; +reg m_axis_0_tready; +wire m_axis_0_tvalid; +wire [STRM0_WIDTH-1:0] m_axis_0_tdata; + +reg m_axis_1_afull; +reg m_axis_1_tready; +wire m_axis_1_tvalid; +wire [STRM1_WIDTH-1:0] m_axis_1_tdata; + +reg m_axis_2_afull; +reg m_axis_2_tready; +wire m_axis_2_tvalid; +wire [STRM2_WIDTH-1:0] m_axis_2_tdata; + +reg m_axis_3_afull; +reg m_axis_3_tready; +wire m_axis_3_tvalid; +wire [STRM3_WIDTH-1:0] m_axis_3_tdata; + +reg m_axis_4_afull; +reg m_axis_4_tready; +wire m_axis_4_tvalid; +wire [STRM4_WIDTH-1:0] m_axis_4_tdata; + +reg m_axis_5_afull; +reg m_axis_5_tready; +wire m_axis_5_tvalid; +wire [STRM5_WIDTH-1:0] m_axis_5_tdata; + +reg [MEM_WIDTH-1:0] golden[MEM_DEPTH-1:0]; +integer ptr0, ptr1, ptr2, ptr3, ptr4, ptr5; +integer done = 0; +reg [5:0] rng; + +//clock +initial begin + clk = 0; + forever #5 clk = ~clk; +end + +initial begin + rst = 1; + config_ce = 0; + m_axis_0_afull = 0; + m_axis_1_afull = 0; + m_axis_2_afull = 0; + m_axis_3_afull = 0; + m_axis_4_afull = 0; + m_axis_5_afull = 0; + m_axis_0_tready = 1; + m_axis_1_tready = 1; + m_axis_2_tready = 1; + m_axis_3_tready = 1; + m_axis_4_tready = 1; + m_axis_5_tready = 1; + repeat(100) @(negedge clk); + rst = 0; + #100 + fork + begin + $display("Starting to generate random AFULL"); + while(~done) begin + rng = $random; + m_axis_0_afull = rng[0]; + m_axis_1_afull = rng[1]; + m_axis_2_afull = rng[2]; + m_axis_3_afull = rng[3]; + m_axis_4_afull = rng[4]; + m_axis_5_afull = rng[5]; + @(negedge clk); + end + end + join +end + + +//DUT +memstream +#( + CONFIG_EN, + NSTREAMS, + MEM_DEPTH, + MEM_WIDTH, + MEM_INIT, + + //widths per stream + STRM0_WIDTH, + STRM1_WIDTH, + STRM2_WIDTH, + STRM3_WIDTH, + STRM4_WIDTH, + STRM5_WIDTH, + + //depths per stream + STRM0_DEPTH, + STRM1_DEPTH, + STRM2_DEPTH, + STRM3_DEPTH, + STRM4_DEPTH, + STRM5_DEPTH, + + //offsets for each stream + STRM0_OFFSET, + STRM1_OFFSET, + STRM2_OFFSET, + STRM3_OFFSET, + STRM4_OFFSET, + STRM5_OFFSET +) +dut +( + clk, + ~rst, + + //optional AXI-Lite interface + config_address, + config_ce, + config_we, + config_d0, + config_q0, + + //multiple output AXI Streams + m_axis_0_afull, + m_axis_0_tready, + m_axis_0_tvalid, + m_axis_0_tdata, + + m_axis_1_afull, + m_axis_1_tready, + m_axis_1_tvalid, + m_axis_1_tdata, + + m_axis_2_afull, + m_axis_2_tready, + m_axis_2_tvalid, + m_axis_2_tdata, + + m_axis_3_afull, + m_axis_3_tready, + m_axis_3_tvalid, + m_axis_3_tdata, + + m_axis_4_afull, + m_axis_4_tready, + m_axis_4_tvalid, + m_axis_4_tdata, + + m_axis_5_afull, + m_axis_5_tready, + m_axis_5_tvalid, + m_axis_5_tdata + + +); + +//stream checkers +initial begin + ptr0 = STRM0_OFFSET; + ptr1 = STRM1_OFFSET; + ptr2 = STRM2_OFFSET; + ptr3 = STRM3_OFFSET; + ptr4 = STRM4_OFFSET; + ptr5 = STRM5_OFFSET; + fork + //check stream 0 + begin + $display("Starting stream 0 checker"); + while(~done & (NSTREAMS > 0)) begin + @(negedge clk); + if(m_axis_0_tvalid) begin + if(m_axis_0_tdata != golden[ptr0]) begin + $display("Mismatch on stream 0"); + $stop(); + end + //increment pointer + ptr0 = ptr0 + 1; + //rewind pointer if it's reached end + if(ptr0 == (STRM0_OFFSET + STRM0_DEPTH)) + ptr0 = STRM0_OFFSET; + end + end + end + //check stream 1 + begin + $display("Starting stream 1 checker"); + while(~done & (NSTREAMS > 1)) begin + @(negedge clk); + if(m_axis_1_tvalid) begin + if(m_axis_1_tdata != golden[ptr1]) begin + $display("Mismatch on stream 1"); + $stop(); + end + //increment pointer + ptr1 = ptr1 + 1; + //rewind pointer if it's reached end + if(ptr1 == (STRM1_OFFSET + STRM1_DEPTH)) + ptr1 = STRM1_OFFSET; + end + end + end + + //check stream 2 + begin + $display("Starting stream 2 checker"); + while(~done & (NSTREAMS > 2)) begin + @(negedge clk); + if(m_axis_2_tvalid) begin + if(m_axis_2_tdata != golden[ptr2]) begin + $display("Mismatch on stream 2"); + $stop(); + end + //increment pointer + ptr2 = ptr2 + 1; + //rewind pointer if it's reached end + if(ptr2 == (STRM2_OFFSET + STRM2_DEPTH)) + ptr2 = STRM2_OFFSET; + end + end + end + //check stream 3 + begin + $display("Starting stream 3 checker"); + while(~done & (NSTREAMS > 3)) begin + @(negedge clk); + if(m_axis_3_tvalid) begin + if(m_axis_3_tdata != golden[ptr3]) begin + $display("Mismatch on stream 3"); + $stop(); + end + //increment pointer + ptr3 = ptr3 + 1; + //rewind pointer if it's reached end + if(ptr3 == (STRM3_OFFSET + STRM3_DEPTH)) + ptr3 = STRM3_OFFSET; + end + end + end + //check stream 4 + begin + $display("Starting stream 4 checker"); + while(~done & (NSTREAMS > 4)) begin + @(negedge clk); + if(m_axis_4_tvalid) begin + if(m_axis_4_tdata != golden[ptr4]) begin + $display("Mismatch on stream 4"); + $stop(); + end + //increment pointer + ptr4 = ptr4 + 1; + //rewind pointer if it's reached end + if(ptr4 == (STRM4_OFFSET + STRM4_DEPTH)) + ptr4 = STRM4_OFFSET; + end + end + end + //check stream 5 + begin + $display("Starting stream 5 checker"); + while(~done & (NSTREAMS > 5)) begin + @(negedge clk); + if(m_axis_5_tvalid) begin + if(m_axis_5_tdata != golden[ptr5]) begin + $display("Mismatch on stream 5"); + $stop(); + end + //increment pointer + ptr5 = ptr5 + 1; + //rewind pointer if it's reached end + if(ptr5 == (STRM5_OFFSET + STRM5_DEPTH)) + ptr5 = STRM5_OFFSET; + end + end + end + join +end + +initial begin + done = 0; + $readmemh(MEM_CHECK,golden); +// $dumpfile("wave.vcd"); +// $dumpvars(0,tb_memstream); + @(negedge rst); + #10000000 + $display("Test done!"); + done = 1; + #1000 + $finish(); +end + +endmodule diff --git a/finn-rtllib/memstream/sim/tb_memstream_writes.v b/finn-rtllib/memstream/sim/tb_memstream_writes.v index a6ac747e967e594ac010f25a2827ebf7a7fcaa0f..c66807454b9a7f8ff7ab7008a504938740fb03a0 100644 --- a/finn-rtllib/memstream/sim/tb_memstream_writes.v +++ b/finn-rtllib/memstream/sim/tb_memstream_writes.v @@ -1,486 +1,486 @@ -/* - Copyright (c) 2020, Xilinx - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of FINN nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ - -`timescale 1ns/10ps - -module tb_memstream_writes; - -//parameters to enable/disable axi-mm, set number of streams, set readmemh for memory, set per-stream offsets in memory, set per-stream widths -parameter CONFIG_EN = 1; -parameter NSTREAMS = 2;//1 up to 6 - -parameter MEM_DEPTH = 40; -parameter MEM_WIDTH = 70; - -//widths per stream -parameter STRM0_WIDTH = 70; -parameter STRM1_WIDTH = 32; -parameter STRM2_WIDTH = 32; -parameter STRM3_WIDTH = 32; -parameter STRM4_WIDTH = 1; -parameter STRM5_WIDTH = 1; - -//depths per stream -parameter STRM0_DEPTH = 20; -parameter STRM1_DEPTH = 20; -parameter STRM2_DEPTH = 2304; -parameter STRM3_DEPTH = 2304; -parameter STRM4_DEPTH = 1; -parameter STRM5_DEPTH = 1; - -//offsets for each stream -parameter STRM0_OFFSET = 0; -parameter STRM1_OFFSET = 20; -parameter STRM2_OFFSET = 4608; -parameter STRM3_OFFSET = 6912; -parameter STRM4_OFFSET = 0; -parameter STRM5_OFFSET = 0; - - -reg clk; -reg rst; - -wire awready; -reg awvalid; -reg [31:0] awaddr; -reg [2:0] awprot; -//write data -wire wready; -reg wvalid; -reg [31:0] wdata; -reg [3:0] wstrb; -//burst response -reg bready; -wire bvalid; -wire [1:0] bresp; - -//Read channels -//read address -wire arready; -reg arvalid; -reg [31:0] araddr; -reg [2:0] arprot; -//read data -reg rready; -wire rvalid; -wire [1:0] rresp; -wire [31:0] rdata; - -//multiple wire AXI Streams -reg m_axis_0_afull; -reg m_axis_0_tready; -wire m_axis_0_tvalid; -wire [STRM0_WIDTH-1:0] m_axis_0_tdata; - -reg m_axis_1_afull; -reg m_axis_1_tready; -wire m_axis_1_tvalid; -wire [STRM1_WIDTH-1:0] m_axis_1_tdata; - -reg m_axis_2_afull; -reg m_axis_2_tready; -wire m_axis_2_tvalid; -wire [STRM2_WIDTH-1:0] m_axis_2_tdata; - -reg m_axis_3_afull; -reg m_axis_3_tready; -wire m_axis_3_tvalid; -wire [STRM3_WIDTH-1:0] m_axis_3_tdata; - -reg m_axis_4_afull; -reg m_axis_4_tready; -wire m_axis_4_tvalid; -wire [STRM4_WIDTH-1:0] m_axis_4_tdata; - -reg m_axis_5_afull; -reg m_axis_5_tready; -wire m_axis_5_tvalid; -wire [STRM5_WIDTH-1:0] m_axis_5_tdata; - -reg [MEM_WIDTH-1:0] golden[MEM_DEPTH-1:0]; -reg [MEM_WIDTH-1:0] gword; -integer ptr0, ptr1, ptr2, ptr3, ptr4, ptr5; -integer done = 0; -integer i, j; -reg [5:0] rng; - -parameter NFOLDS_PER_WORD = (MEM_WIDTH+31)/32; - -task axi_write; - input [MEM_WIDTH-1:0] data; - input [31:0] adr; - begin - for(j=0; j<(1<<$clog2(NFOLDS_PER_WORD)); j=j+1) begin - @(negedge clk); - awvalid = 1; - wvalid = 1; - wdata = data>>(j*32); - awaddr = (adr*(1<<$clog2(NFOLDS_PER_WORD))+j)*4; - fork - begin - @(posedge awready); - @(posedge clk) awvalid = 0; - end - begin - @(posedge wready); - @(posedge clk) wvalid = 0; - end - join - @(posedge clk); - end - end -endtask - -task axi_read; - input [31:0] adr; - output [MEM_WIDTH-1:0] data; - begin - data = 0; - for(j=0; j<NFOLDS_PER_WORD; j=j+1) begin - @(negedge clk); - arvalid = 1; - araddr = (adr*(1<<$clog2(NFOLDS_PER_WORD))+j)*4; - rready = 1; - fork - begin - @(posedge arready); - @(posedge clk) arvalid = 0; - end - begin - @(posedge rvalid); - @(posedge clk) rready = 0; - data = data | (rdata<<(32*j)); - end - join - @(posedge clk); - end - end -endtask - -//clock -initial begin - clk = 0; - forever #5 clk = ~clk; -end - -initial begin - rst = 1; - awvalid = 0; - arvalid = 0; - wvalid = 0; - rready = 1; - bready = 1; - m_axis_0_afull = 1; - m_axis_1_afull = 1; - m_axis_2_afull = 1; - m_axis_3_afull = 1; - m_axis_4_afull = 1; - m_axis_5_afull = 1; - m_axis_0_tready = 0; - m_axis_1_tready = 0; - m_axis_2_tready = 0; - m_axis_3_tready = 0; - m_axis_4_tready = 0; - m_axis_5_tready = 0; - repeat(100) @(negedge clk); - rst = 0; - #100 - //random initialization of golden data - for(i=0; i<MEM_DEPTH; i=i+1) begin - gword = 0; - repeat(NFOLDS_PER_WORD) - gword = (gword << 32) | $random; - golden[i] = gword; - axi_write(golden[i],i); - axi_read(i,gword); - end - //re-reset - repeat(100) @(negedge clk); - rst = 1; - #100 - repeat(100) @(negedge clk); - rst = 0; - #100 - @(negedge clk); - //start reads - m_axis_0_afull = 0; - m_axis_1_afull = 0; - m_axis_2_afull = 0; - m_axis_3_afull = 0; - m_axis_4_afull = 0; - m_axis_5_afull = 0; - m_axis_0_tready = 1; - m_axis_1_tready = 1; - m_axis_2_tready = 1; - m_axis_3_tready = 1; - m_axis_4_tready = 1; - m_axis_5_tready = 1; - fork - begin - $display("Starting to generate random AFULL"); - while(~done) begin - rng = $random; - m_axis_0_afull = rng[0]; - m_axis_1_afull = rng[1]; - m_axis_2_afull = rng[2]; - m_axis_3_afull = rng[3]; - m_axis_4_afull = rng[4]; - m_axis_5_afull = rng[5]; - @(negedge clk); - end - end - join -end - - -//DUT -memstream -#( - CONFIG_EN, - NSTREAMS, - MEM_DEPTH, - MEM_WIDTH, - ".", - "auto", - //widths per stream - STRM0_WIDTH, - STRM1_WIDTH, - STRM2_WIDTH, - STRM3_WIDTH, - STRM4_WIDTH, - STRM5_WIDTH, - //depths per stream - STRM0_DEPTH, - STRM1_DEPTH, - STRM2_DEPTH, - STRM3_DEPTH, - STRM4_DEPTH, - STRM5_DEPTH, - //offsets for each stream - STRM0_OFFSET, - STRM1_OFFSET, - STRM2_OFFSET, - STRM3_OFFSET, - STRM4_OFFSET, - STRM5_OFFSET -) -dut -( - clk, - ~rst, - - //optional AXI-Lite interface - awready, - awvalid, - awaddr, - awprot, - //write data - wready, - wvalid, - wdata, - wstrb, - //burst response - bready, - bvalid, - bresp, - - //Read channels - //read address - arready, - arvalid, - araddr, - arprot, - //read data - rready, - rvalid, - rresp, - rdata, - - //multiple output AXI Streams - m_axis_0_afull, - m_axis_0_tready, - m_axis_0_tvalid, - m_axis_0_tdata, - m_axis_1_afull, - m_axis_1_tready, - m_axis_1_tvalid, - m_axis_1_tdata, - m_axis_2_afull, - m_axis_2_tready, - m_axis_2_tvalid, - m_axis_2_tdata, - m_axis_3_afull, - m_axis_3_tready, - m_axis_3_tvalid, - m_axis_3_tdata, - m_axis_4_afull, - m_axis_4_tready, - m_axis_4_tvalid, - m_axis_4_tdata, - m_axis_5_afull, - m_axis_5_tready, - m_axis_5_tvalid, - m_axis_5_tdata - -); - -//stream checkers -initial begin - ptr0 = STRM0_OFFSET; - ptr1 = STRM1_OFFSET; - ptr2 = STRM2_OFFSET; - ptr3 = STRM3_OFFSET; - ptr4 = STRM4_OFFSET; - ptr5 = STRM5_OFFSET; - fork - //check stream 0 - begin - $display("Starting stream 0 checker"); - while(~done & (NSTREAMS > 0)) begin - @(negedge clk); - if(m_axis_0_tvalid & m_axis_0_tready) begin - if(m_axis_0_tdata != golden[ptr0]) begin - $display("Mismatch on stream 0"); - $stop(); - end - //increment pointer - ptr0 = ptr0 + 1; - //rewind pointer if it's reached end - if(ptr0 == (STRM0_OFFSET + STRM0_DEPTH)) - ptr0 = STRM0_OFFSET; - end - end - end - //check stream 1 - begin - $display("Starting stream 1 checker"); - while(~done & (NSTREAMS > 1)) begin - @(negedge clk); - if(m_axis_1_tvalid & m_axis_1_tready) begin - if(m_axis_1_tdata != golden[ptr1]) begin - $display("Mismatch on stream 1"); - $stop(); - end - //increment pointer - ptr1 = ptr1 + 1; - //rewind pointer if it's reached end - if(ptr1 == (STRM1_OFFSET + STRM1_DEPTH)) - ptr1 = STRM1_OFFSET; - end - end - end - //check stream 2 - begin - $display("Starting stream 2 checker"); - while(~done & (NSTREAMS > 2)) begin - @(negedge clk); - if(m_axis_2_tvalid & m_axis_2_tready) begin - if(m_axis_2_tdata != golden[ptr2]) begin - $display("Mismatch on stream 2"); - $stop(); - end - //increment pointer - ptr2 = ptr2 + 1; - //rewind pointer if it's reached end - if(ptr2 == (STRM2_OFFSET + STRM2_DEPTH)) - ptr2 = STRM2_OFFSET; - end - end - end - //check stream 3 - begin - $display("Starting stream 3 checker"); - while(~done & (NSTREAMS > 3)) begin - @(negedge clk); - if(m_axis_3_tvalid & m_axis_3_tready) begin - if(m_axis_3_tdata != golden[ptr3]) begin - $display("Mismatch on stream 3"); - $stop(); - end - //increment pointer - ptr3 = ptr3 + 1; - //rewind pointer if it's reached end - if(ptr3 == (STRM3_OFFSET + STRM3_DEPTH)) - ptr3 = STRM3_OFFSET; - end - end - end - //check stream 4 - begin - $display("Starting stream 4 checker"); - while(~done & (NSTREAMS > 4)) begin - @(negedge clk); - if(m_axis_4_tvalid & m_axis_4_tready) begin - if(m_axis_4_tdata != golden[ptr4]) begin - $display("Mismatch on stream 4"); - $stop(); - end - //increment pointer - ptr4 = ptr4 + 1; - //rewind pointer if it's reached end - if(ptr4 == (STRM4_OFFSET + STRM4_DEPTH)) - ptr4 = STRM4_OFFSET; - end - end - end - //check stream 5 - begin - $display("Starting stream 5 checker"); - while(~done & (NSTREAMS > 5)) begin - @(negedge clk); - if(m_axis_5_tvalid & m_axis_5_tready) begin - if(m_axis_5_tdata != golden[ptr5]) begin - $display("Mismatch on stream 5"); - $stop(); - end - //increment pointer - ptr5 = ptr5 + 1; - //rewind pointer if it's reached end - if(ptr5 == (STRM5_OFFSET + STRM5_DEPTH)) - ptr5 = STRM5_OFFSET; - end - end - end - join -end - -initial begin - done = 0; - @(negedge rst); - $dumpfile("wave.vcd"); - $dumpvars(0,tb_memstream_writes); - #50000 - $display("Test done!"); - done = 1; - #1000 - $finish(); -end - -endmodule +/* + Copyright (c) 2020, Xilinx + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of FINN nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +`timescale 1ns/10ps + +module tb_memstream_writes; + +//parameters to enable/disable axi-mm, set number of streams, set readmemh for memory, set per-stream offsets in memory, set per-stream widths +parameter CONFIG_EN = 1; +parameter NSTREAMS = 2;//1 up to 6 + +parameter MEM_DEPTH = 40; +parameter MEM_WIDTH = 70; + +//widths per stream +parameter STRM0_WIDTH = 70; +parameter STRM1_WIDTH = 32; +parameter STRM2_WIDTH = 32; +parameter STRM3_WIDTH = 32; +parameter STRM4_WIDTH = 1; +parameter STRM5_WIDTH = 1; + +//depths per stream +parameter STRM0_DEPTH = 20; +parameter STRM1_DEPTH = 20; +parameter STRM2_DEPTH = 2304; +parameter STRM3_DEPTH = 2304; +parameter STRM4_DEPTH = 1; +parameter STRM5_DEPTH = 1; + +//offsets for each stream +parameter STRM0_OFFSET = 0; +parameter STRM1_OFFSET = 20; +parameter STRM2_OFFSET = 4608; +parameter STRM3_OFFSET = 6912; +parameter STRM4_OFFSET = 0; +parameter STRM5_OFFSET = 0; + + +reg clk; +reg rst; + +wire awready; +reg awvalid; +reg [31:0] awaddr; +reg [2:0] awprot; +//write data +wire wready; +reg wvalid; +reg [31:0] wdata; +reg [3:0] wstrb; +//burst response +reg bready; +wire bvalid; +wire [1:0] bresp; + +//Read channels +//read address +wire arready; +reg arvalid; +reg [31:0] araddr; +reg [2:0] arprot; +//read data +reg rready; +wire rvalid; +wire [1:0] rresp; +wire [31:0] rdata; + +//multiple wire AXI Streams +reg m_axis_0_afull; +reg m_axis_0_tready; +wire m_axis_0_tvalid; +wire [STRM0_WIDTH-1:0] m_axis_0_tdata; + +reg m_axis_1_afull; +reg m_axis_1_tready; +wire m_axis_1_tvalid; +wire [STRM1_WIDTH-1:0] m_axis_1_tdata; + +reg m_axis_2_afull; +reg m_axis_2_tready; +wire m_axis_2_tvalid; +wire [STRM2_WIDTH-1:0] m_axis_2_tdata; + +reg m_axis_3_afull; +reg m_axis_3_tready; +wire m_axis_3_tvalid; +wire [STRM3_WIDTH-1:0] m_axis_3_tdata; + +reg m_axis_4_afull; +reg m_axis_4_tready; +wire m_axis_4_tvalid; +wire [STRM4_WIDTH-1:0] m_axis_4_tdata; + +reg m_axis_5_afull; +reg m_axis_5_tready; +wire m_axis_5_tvalid; +wire [STRM5_WIDTH-1:0] m_axis_5_tdata; + +reg [MEM_WIDTH-1:0] golden[MEM_DEPTH-1:0]; +reg [MEM_WIDTH-1:0] gword; +integer ptr0, ptr1, ptr2, ptr3, ptr4, ptr5; +integer done = 0; +integer i, j; +reg [5:0] rng; + +parameter NFOLDS_PER_WORD = (MEM_WIDTH+31)/32; + +task axi_write; + input [MEM_WIDTH-1:0] data; + input [31:0] adr; + begin + for(j=0; j<(1<<$clog2(NFOLDS_PER_WORD)); j=j+1) begin + @(negedge clk); + awvalid = 1; + wvalid = 1; + wdata = data>>(j*32); + awaddr = (adr*(1<<$clog2(NFOLDS_PER_WORD))+j)*4; + fork + begin + @(posedge awready); + @(posedge clk) awvalid = 0; + end + begin + @(posedge wready); + @(posedge clk) wvalid = 0; + end + join + @(posedge clk); + end + end +endtask + +task axi_read; + input [31:0] adr; + output [MEM_WIDTH-1:0] data; + begin + data = 0; + for(j=0; j<NFOLDS_PER_WORD; j=j+1) begin + @(negedge clk); + arvalid = 1; + araddr = (adr*(1<<$clog2(NFOLDS_PER_WORD))+j)*4; + rready = 1; + fork + begin + @(posedge arready); + @(posedge clk) arvalid = 0; + end + begin + @(posedge rvalid); + @(posedge clk) rready = 0; + data = data | (rdata<<(32*j)); + end + join + @(posedge clk); + end + end +endtask + +//clock +initial begin + clk = 0; + forever #5 clk = ~clk; +end + +initial begin + rst = 1; + awvalid = 0; + arvalid = 0; + wvalid = 0; + rready = 1; + bready = 1; + m_axis_0_afull = 1; + m_axis_1_afull = 1; + m_axis_2_afull = 1; + m_axis_3_afull = 1; + m_axis_4_afull = 1; + m_axis_5_afull = 1; + m_axis_0_tready = 0; + m_axis_1_tready = 0; + m_axis_2_tready = 0; + m_axis_3_tready = 0; + m_axis_4_tready = 0; + m_axis_5_tready = 0; + repeat(100) @(negedge clk); + rst = 0; + #100 + //random initialization of golden data + for(i=0; i<MEM_DEPTH; i=i+1) begin + gword = 0; + repeat(NFOLDS_PER_WORD) + gword = (gword << 32) | $random; + golden[i] = gword; + axi_write(golden[i],i); + axi_read(i,gword); + end + //re-reset + repeat(100) @(negedge clk); + rst = 1; + #100 + repeat(100) @(negedge clk); + rst = 0; + #100 + @(negedge clk); + //start reads + m_axis_0_afull = 0; + m_axis_1_afull = 0; + m_axis_2_afull = 0; + m_axis_3_afull = 0; + m_axis_4_afull = 0; + m_axis_5_afull = 0; + m_axis_0_tready = 1; + m_axis_1_tready = 1; + m_axis_2_tready = 1; + m_axis_3_tready = 1; + m_axis_4_tready = 1; + m_axis_5_tready = 1; + fork + begin + $display("Starting to generate random AFULL"); + while(~done) begin + rng = $random; + m_axis_0_afull = rng[0]; + m_axis_1_afull = rng[1]; + m_axis_2_afull = rng[2]; + m_axis_3_afull = rng[3]; + m_axis_4_afull = rng[4]; + m_axis_5_afull = rng[5]; + @(negedge clk); + end + end + join +end + + +//DUT +memstream +#( + CONFIG_EN, + NSTREAMS, + MEM_DEPTH, + MEM_WIDTH, + ".", + "auto", + //widths per stream + STRM0_WIDTH, + STRM1_WIDTH, + STRM2_WIDTH, + STRM3_WIDTH, + STRM4_WIDTH, + STRM5_WIDTH, + //depths per stream + STRM0_DEPTH, + STRM1_DEPTH, + STRM2_DEPTH, + STRM3_DEPTH, + STRM4_DEPTH, + STRM5_DEPTH, + //offsets for each stream + STRM0_OFFSET, + STRM1_OFFSET, + STRM2_OFFSET, + STRM3_OFFSET, + STRM4_OFFSET, + STRM5_OFFSET +) +dut +( + clk, + ~rst, + + //optional AXI-Lite interface + awready, + awvalid, + awaddr, + awprot, + //write data + wready, + wvalid, + wdata, + wstrb, + //burst response + bready, + bvalid, + bresp, + + //Read channels + //read address + arready, + arvalid, + araddr, + arprot, + //read data + rready, + rvalid, + rresp, + rdata, + + //multiple output AXI Streams + m_axis_0_afull, + m_axis_0_tready, + m_axis_0_tvalid, + m_axis_0_tdata, + m_axis_1_afull, + m_axis_1_tready, + m_axis_1_tvalid, + m_axis_1_tdata, + m_axis_2_afull, + m_axis_2_tready, + m_axis_2_tvalid, + m_axis_2_tdata, + m_axis_3_afull, + m_axis_3_tready, + m_axis_3_tvalid, + m_axis_3_tdata, + m_axis_4_afull, + m_axis_4_tready, + m_axis_4_tvalid, + m_axis_4_tdata, + m_axis_5_afull, + m_axis_5_tready, + m_axis_5_tvalid, + m_axis_5_tdata + +); + +//stream checkers +initial begin + ptr0 = STRM0_OFFSET; + ptr1 = STRM1_OFFSET; + ptr2 = STRM2_OFFSET; + ptr3 = STRM3_OFFSET; + ptr4 = STRM4_OFFSET; + ptr5 = STRM5_OFFSET; + fork + //check stream 0 + begin + $display("Starting stream 0 checker"); + while(~done & (NSTREAMS > 0)) begin + @(negedge clk); + if(m_axis_0_tvalid & m_axis_0_tready) begin + if(m_axis_0_tdata != golden[ptr0]) begin + $display("Mismatch on stream 0"); + $stop(); + end + //increment pointer + ptr0 = ptr0 + 1; + //rewind pointer if it's reached end + if(ptr0 == (STRM0_OFFSET + STRM0_DEPTH)) + ptr0 = STRM0_OFFSET; + end + end + end + //check stream 1 + begin + $display("Starting stream 1 checker"); + while(~done & (NSTREAMS > 1)) begin + @(negedge clk); + if(m_axis_1_tvalid & m_axis_1_tready) begin + if(m_axis_1_tdata != golden[ptr1]) begin + $display("Mismatch on stream 1"); + $stop(); + end + //increment pointer + ptr1 = ptr1 + 1; + //rewind pointer if it's reached end + if(ptr1 == (STRM1_OFFSET + STRM1_DEPTH)) + ptr1 = STRM1_OFFSET; + end + end + end + //check stream 2 + begin + $display("Starting stream 2 checker"); + while(~done & (NSTREAMS > 2)) begin + @(negedge clk); + if(m_axis_2_tvalid & m_axis_2_tready) begin + if(m_axis_2_tdata != golden[ptr2]) begin + $display("Mismatch on stream 2"); + $stop(); + end + //increment pointer + ptr2 = ptr2 + 1; + //rewind pointer if it's reached end + if(ptr2 == (STRM2_OFFSET + STRM2_DEPTH)) + ptr2 = STRM2_OFFSET; + end + end + end + //check stream 3 + begin + $display("Starting stream 3 checker"); + while(~done & (NSTREAMS > 3)) begin + @(negedge clk); + if(m_axis_3_tvalid & m_axis_3_tready) begin + if(m_axis_3_tdata != golden[ptr3]) begin + $display("Mismatch on stream 3"); + $stop(); + end + //increment pointer + ptr3 = ptr3 + 1; + //rewind pointer if it's reached end + if(ptr3 == (STRM3_OFFSET + STRM3_DEPTH)) + ptr3 = STRM3_OFFSET; + end + end + end + //check stream 4 + begin + $display("Starting stream 4 checker"); + while(~done & (NSTREAMS > 4)) begin + @(negedge clk); + if(m_axis_4_tvalid & m_axis_4_tready) begin + if(m_axis_4_tdata != golden[ptr4]) begin + $display("Mismatch on stream 4"); + $stop(); + end + //increment pointer + ptr4 = ptr4 + 1; + //rewind pointer if it's reached end + if(ptr4 == (STRM4_OFFSET + STRM4_DEPTH)) + ptr4 = STRM4_OFFSET; + end + end + end + //check stream 5 + begin + $display("Starting stream 5 checker"); + while(~done & (NSTREAMS > 5)) begin + @(negedge clk); + if(m_axis_5_tvalid & m_axis_5_tready) begin + if(m_axis_5_tdata != golden[ptr5]) begin + $display("Mismatch on stream 5"); + $stop(); + end + //increment pointer + ptr5 = ptr5 + 1; + //rewind pointer if it's reached end + if(ptr5 == (STRM5_OFFSET + STRM5_DEPTH)) + ptr5 = STRM5_OFFSET; + end + end + end + join +end + +initial begin + done = 0; + @(negedge rst); + $dumpfile("wave.vcd"); + $dumpvars(0,tb_memstream_writes); + #50000 + $display("Test done!"); + done = 1; + #1000 + $finish(); +end + +endmodule diff --git a/notebooks/end2end_example/cybersecurity/dataloader_quantized.py b/notebooks/end2end_example/cybersecurity/dataloader_quantized.py index 45651faa5a9a57e9a1d0d784b15ebe8945d9ddd7..738811fa72754f059ce7e62196deae8a824f03f6 100644 --- a/notebooks/end2end_example/cybersecurity/dataloader_quantized.py +++ b/notebooks/end2end_example/cybersecurity/dataloader_quantized.py @@ -26,12 +26,12 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -import torch -import pandas as pd +import math import numpy as np +import pandas as pd +import torch from sklearn import preprocessing from sklearn.preprocessing import OneHotEncoder -import math # quantize the UNSW_NB15 dataset and convert it to binary vectors # reimplementation @@ -112,7 +112,7 @@ class UNSW_NB15_quantized(torch.utils.data.Dataset): def round_like_matlab_number(self, n: np.float64) -> int: """Round the input "n" like matlab uint32(n) cast (which also rounds) e.g. - 0.5->1; 1.5->2; 2.3->2; 2.45->2 """ + 0.5->1; 1.5->2; 2.3->2; 2.45->2""" if n - math.floor(n) < 0.5: return math.floor(n) return math.ceil(n) diff --git a/notebooks/end2end_example/cybersecurity/validate-unsw-nb15.py b/notebooks/end2end_example/cybersecurity/validate-unsw-nb15.py index 622c69c8d0abdf8025b0486c63bf336e4f8675f5..0ffb525544845757c90f30799fbad472d389348f 100644 --- a/notebooks/end2end_example/cybersecurity/validate-unsw-nb15.py +++ b/notebooks/end2end_example/cybersecurity/validate-unsw-nb15.py @@ -27,9 +27,9 @@ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. import argparse +import numpy as np from driver import io_shape_dict from driver_base import FINNExampleOverlay -import numpy as np def make_unsw_nb15_test_batches(bsize, dataset_root): diff --git a/setup.py b/setup.py index d7e158b56010fbc9ba2fb9f143ea2fc8d8a901d9..8fd781462c22f029071ac441f2be33e2f525bd47 100644 --- a/setup.py +++ b/setup.py @@ -35,10 +35,11 @@ PyScaffold helps you to put up the scaffold of your new Python project. Learn more under: https://pyscaffold.org/ """ -import sys from pkg_resources import VersionConflict, require from setuptools import setup +import sys + try: require("setuptools>=38.3") except VersionConflict: diff --git a/src/finn/analysis/fpgadataflow/floorplan_params.py b/src/finn/analysis/fpgadataflow/floorplan_params.py index 4c8cbf53de1ae7dc951911678a3f118bd3506dfe..9ba99fb546587ba3c2f385c958ecb172f8903bf7 100644 --- a/src/finn/analysis/fpgadataflow/floorplan_params.py +++ b/src/finn/analysis/fpgadataflow/floorplan_params.py @@ -26,8 +26,8 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -from finn.util.fpgadataflow import is_fpgadataflow_node from finn.custom_op.registry import getCustomOp +from finn.util.fpgadataflow import is_fpgadataflow_node def floorplan_params(model): diff --git a/src/finn/analysis/fpgadataflow/hls_synth_res_estimation.py b/src/finn/analysis/fpgadataflow/hls_synth_res_estimation.py index 39d6332aa42594528fbd5a04dd5efad2c3237e77..aff99efd807d8b04dc6490b299d66c0be8d8fc44 100644 --- a/src/finn/analysis/fpgadataflow/hls_synth_res_estimation.py +++ b/src/finn/analysis/fpgadataflow/hls_synth_res_estimation.py @@ -25,8 +25,8 @@ # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -import warnings import os +import warnings import xml.etree.ElementTree as ET import finn.custom_op.registry as registry diff --git a/src/finn/analysis/fpgadataflow/post_synth_res.py b/src/finn/analysis/fpgadataflow/post_synth_res.py index 79204c54cdb8233fd7b65968c25af819fce91959..4b817910949fa750f34a53592413bb38c7557c08 100644 --- a/src/finn/analysis/fpgadataflow/post_synth_res.py +++ b/src/finn/analysis/fpgadataflow/post_synth_res.py @@ -29,9 +29,9 @@ import os import xml.etree.ElementTree as ET -from finn.transformation.move_reshape import _is_fpgadataflow_node from finn.core.modelwrapper import ModelWrapper from finn.custom_op.registry import getCustomOp +from finn.transformation.move_reshape import _is_fpgadataflow_node def post_synth_res(model, override_synth_report_filename=None): diff --git a/src/finn/builder/build_dataflow.py b/src/finn/builder/build_dataflow.py index c46bfa48dff289d37f2cb2a89cdbef8e2789317f..4aa1ad31e1ad73762ef46cc861b1a255ce57b926 100644 --- a/src/finn/builder/build_dataflow.py +++ b/src/finn/builder/build_dataflow.py @@ -26,20 +26,21 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -from finn.core.modelwrapper import ModelWrapper -import os -import json -import time import clize -import sys +import json import logging +import os import pdb # NOQA +import sys +import time import traceback -from finn.builder.build_dataflow_steps import build_dataflow_step_lookup + from finn.builder.build_dataflow_config import ( DataflowBuildConfig, default_build_dataflow_steps, ) +from finn.builder.build_dataflow_steps import build_dataflow_step_lookup +from finn.core.modelwrapper import ModelWrapper # adapted from https://stackoverflow.com/a/39215961 diff --git a/src/finn/builder/build_dataflow_config.py b/src/finn/builder/build_dataflow_config.py index bd938f17411ee42e94e95e02776ad8e973ea10fa..4a112699ec9bdf126f447fe2244eb01f6f4fa042 100644 --- a/src/finn/builder/build_dataflow_config.py +++ b/src/finn/builder/build_dataflow_config.py @@ -26,14 +26,15 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -from typing import List, Optional, Any -from finn.util.basic import pynq_part_map, alveo_part_map -from finn.transformation.fpgadataflow.vitis_build import VitisOptStrategy -from enum import Enum +import numpy as np +import os from dataclasses import dataclass from dataclasses_json import dataclass_json -import os -import numpy as np +from enum import Enum +from typing import Any, List, Optional + +from finn.transformation.fpgadataflow.vitis_build import VitisOptStrategy +from finn.util.basic import alveo_part_map, pynq_part_map class ShellFlowType(str, Enum): diff --git a/src/finn/builder/build_dataflow_steps.py b/src/finn/builder/build_dataflow_steps.py index 50cd9ed4ff663044433c5d8997f2fcd9337a0dd6..5bdccebb58ccb6f4906a05dda58da2494366739f 100644 --- a/src/finn/builder/build_dataflow_steps.py +++ b/src/finn/builder/build_dataflow_steps.py @@ -26,78 +26,78 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -from finn.core.modelwrapper import ModelWrapper -import os import json +import numpy as np +import os +from copy import deepcopy +from shutil import copy, copytree + import finn.transformation.fpgadataflow.convert_to_hls_layers as to_hls import finn.transformation.streamline.absorb as absorb -from finn.transformation.bipolar_to_xnor import ConvertBipolarMatMulToXnorPopcount -from finn.transformation.fold_constants import FoldConstants -from finn.transformation.general import ( - ApplyConfig, - GiveReadableTensorNames, - GiveUniqueNodeNames, - RemoveUnusedTensors, - RemoveStaticGraphInputs, -) -from finn.transformation.infer_datatypes import InferDataTypes -from finn.transformation.infer_shapes import InferShapes -from finn.transformation.streamline import Streamline -from finn.transformation.infer_data_layouts import InferDataLayouts -from finn.transformation.move_reshape import RemoveCNVtoFCFlatten -from finn.transformation.lower_convs_to_matmul import LowerConvsToMatMul -from finn.transformation.streamline.reorder import MakeMaxPoolNHWC - -from shutil import copy, copytree -from finn.transformation.fpgadataflow.insert_dwc import InsertDWC -from finn.transformation.fpgadataflow.insert_fifo import InsertFIFO -from finn.transformation.fpgadataflow.prepare_ip import PrepareIP -from finn.transformation.fpgadataflow.hlssynth_ip import HLSSynthIP -from finn.transformation.fpgadataflow.create_stitched_ip import CreateStitchedIP -from finn.transformation.fpgadataflow.set_fifo_depths import ( - InsertAndSetFIFODepths, - RemoveShallowFIFOs, -) -from finn.transformation.fpgadataflow.make_zynq_proj import ZynqBuild -from finn.transformation.fpgadataflow.vitis_build import VitisBuild -from finn.transformation.fpgadataflow.make_pynq_driver import MakePYNQDriver -from finn.transformation.fpgadataflow.set_folding import SetFolding -from finn.transformation.fpgadataflow.create_dataflow_partition import ( - CreateDataflowPartition, -) -from finn.transformation.fpgadataflow.replace_verilog_relpaths import ( - ReplaceVerilogRelPaths, -) -from finn.custom_op.registry import getCustomOp +from finn.analysis.fpgadataflow.dataflow_performance import dataflow_performance from finn.analysis.fpgadataflow.exp_cycles_per_layer import exp_cycles_per_layer -from finn.analysis.fpgadataflow.res_estimation import ( - res_estimation, - res_estimation_complete, -) +from finn.analysis.fpgadataflow.hls_synth_res_estimation import hls_synth_res_estimation from finn.analysis.fpgadataflow.op_and_param_counts import ( aggregate_dict_keys, op_and_param_counts, ) -from finn.analysis.fpgadataflow.dataflow_performance import dataflow_performance -from finn.analysis.fpgadataflow.hls_synth_res_estimation import hls_synth_res_estimation -from finn.util.config import extract_model_config_to_json -from finn.transformation.fpgadataflow.synth_ooc import SynthOutOfContext +from finn.analysis.fpgadataflow.res_estimation import ( + res_estimation, + res_estimation_complete, +) from finn.builder.build_dataflow_config import ( DataflowBuildConfig, DataflowOutputType, ShellFlowType, VerificationStepType, ) -from finn.transformation.fpgadataflow.annotate_cycles import AnnotateCycles +from finn.core.modelwrapper import ModelWrapper from finn.core.onnx_exec import execute_onnx -import numpy as np -from finn.util.test import execute_parent -from finn.transformation.fpgadataflow.prepare_cppsim import PrepareCppSim +from finn.core.throughput_test import throughput_test_rtlsim +from finn.custom_op.registry import getCustomOp +from finn.transformation.bipolar_to_xnor import ConvertBipolarMatMulToXnorPopcount +from finn.transformation.fold_constants import FoldConstants +from finn.transformation.fpgadataflow.annotate_cycles import AnnotateCycles from finn.transformation.fpgadataflow.compile_cppsim import CompileCppSim -from finn.transformation.fpgadataflow.set_exec_mode import SetExecMode +from finn.transformation.fpgadataflow.create_dataflow_partition import ( + CreateDataflowPartition, +) +from finn.transformation.fpgadataflow.create_stitched_ip import CreateStitchedIP +from finn.transformation.fpgadataflow.hlssynth_ip import HLSSynthIP +from finn.transformation.fpgadataflow.insert_dwc import InsertDWC +from finn.transformation.fpgadataflow.insert_fifo import InsertFIFO +from finn.transformation.fpgadataflow.make_pynq_driver import MakePYNQDriver +from finn.transformation.fpgadataflow.make_zynq_proj import ZynqBuild +from finn.transformation.fpgadataflow.prepare_cppsim import PrepareCppSim +from finn.transformation.fpgadataflow.prepare_ip import PrepareIP from finn.transformation.fpgadataflow.prepare_rtlsim import PrepareRTLSim -from finn.core.throughput_test import throughput_test_rtlsim -from copy import deepcopy +from finn.transformation.fpgadataflow.replace_verilog_relpaths import ( + ReplaceVerilogRelPaths, +) +from finn.transformation.fpgadataflow.set_exec_mode import SetExecMode +from finn.transformation.fpgadataflow.set_fifo_depths import ( + InsertAndSetFIFODepths, + RemoveShallowFIFOs, +) +from finn.transformation.fpgadataflow.set_folding import SetFolding +from finn.transformation.fpgadataflow.synth_ooc import SynthOutOfContext +from finn.transformation.fpgadataflow.vitis_build import VitisBuild +from finn.transformation.general import ( + ApplyConfig, + GiveReadableTensorNames, + GiveUniqueNodeNames, + RemoveStaticGraphInputs, + RemoveUnusedTensors, +) +from finn.transformation.infer_data_layouts import InferDataLayouts +from finn.transformation.infer_datatypes import InferDataTypes +from finn.transformation.infer_shapes import InferShapes +from finn.transformation.lower_convs_to_matmul import LowerConvsToMatMul +from finn.transformation.move_reshape import RemoveCNVtoFCFlatten +from finn.transformation.streamline import Streamline +from finn.transformation.streamline.reorder import MakeMaxPoolNHWC +from finn.util.config import extract_model_config_to_json +from finn.util.test import execute_parent def verify_step( diff --git a/src/finn/custom_op/fpgadataflow/__init__.py b/src/finn/custom_op/fpgadataflow/__init__.py index b20b652254028c4ee5dc2edd1f1302ea3359019b..320b947d0dd99b564da5775dfc8624993af57de2 100644 --- a/src/finn/custom_op/fpgadataflow/__init__.py +++ b/src/finn/custom_op/fpgadataflow/__init__.py @@ -26,6 +26,8 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +from finn.custom_op.fpgadataflow.addstreams_batch import AddStreams_Batch +from finn.custom_op.fpgadataflow.channelwise_op_batch import ChannelwiseOp_Batch from finn.custom_op.fpgadataflow.convolutioninputgenerator import ( ConvolutionInputGenerator, ) @@ -33,28 +35,26 @@ from finn.custom_op.fpgadataflow.convolutioninputgenerator1d import ( ConvolutionInputGenerator1D, ) from finn.custom_op.fpgadataflow.downsampler import DownSampler -from finn.custom_op.fpgadataflow.streamingfclayer_batch import StreamingFCLayer_Batch -from finn.custom_op.fpgadataflow.streamingmaxpool_batch import StreamingMaxPool_Batch -from finn.custom_op.fpgadataflow.streamingfifo import StreamingFIFO -from finn.custom_op.fpgadataflow.tlastmarker import TLastMarker +from finn.custom_op.fpgadataflow.duplicatestreams_batch import DuplicateStreams_Batch +from finn.custom_op.fpgadataflow.fmpadding_batch import FMPadding_Batch +from finn.custom_op.fpgadataflow.globalaccpool_batch import GlobalAccPool_Batch +from finn.custom_op.fpgadataflow.iodma import IODMA +from finn.custom_op.fpgadataflow.labelselect_batch import LabelSelect_Batch +from finn.custom_op.fpgadataflow.pool_batch import Pool_Batch +from finn.custom_op.fpgadataflow.streamingdataflowpartition import ( + StreamingDataflowPartition, +) from finn.custom_op.fpgadataflow.streamingdatawidthconverter_batch import ( StreamingDataWidthConverter_Batch, ) -from finn.custom_op.fpgadataflow.globalaccpool_batch import GlobalAccPool_Batch -from finn.custom_op.fpgadataflow.pool_batch import Pool_Batch -from finn.custom_op.fpgadataflow.fmpadding_batch import FMPadding_Batch +from finn.custom_op.fpgadataflow.streamingfclayer_batch import StreamingFCLayer_Batch +from finn.custom_op.fpgadataflow.streamingfifo import StreamingFIFO +from finn.custom_op.fpgadataflow.streamingmaxpool_batch import StreamingMaxPool_Batch from finn.custom_op.fpgadataflow.thresholding_batch import Thresholding_Batch -from finn.custom_op.fpgadataflow.addstreams_batch import AddStreams_Batch -from finn.custom_op.fpgadataflow.labelselect_batch import LabelSelect_Batch -from finn.custom_op.fpgadataflow.duplicatestreams_batch import DuplicateStreams_Batch +from finn.custom_op.fpgadataflow.tlastmarker import TLastMarker from finn.custom_op.fpgadataflow.vector_vector_activate_batch import ( Vector_Vector_Activate_Batch, ) -from finn.custom_op.fpgadataflow.channelwise_op_batch import ChannelwiseOp_Batch -from finn.custom_op.fpgadataflow.iodma import IODMA -from finn.custom_op.fpgadataflow.streamingdataflowpartition import ( - StreamingDataflowPartition, -) custom_op = dict() diff --git a/src/finn/custom_op/fpgadataflow/addstreams_batch.py b/src/finn/custom_op/fpgadataflow/addstreams_batch.py index 38940ccb94f11fe49af5f49ee020f150326a026c..856f84fae0cb90abcc08fc098d684872b1a6a6a1 100644 --- a/src/finn/custom_op/fpgadataflow/addstreams_batch.py +++ b/src/finn/custom_op/fpgadataflow/addstreams_batch.py @@ -26,13 +26,13 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -import os - import numpy as np +import os import warnings +from onnx import TensorProto, helper + from finn.core.datatype import DataType from finn.custom_op.fpgadataflow.hlscustomop import HLSCustomOp -from onnx import TensorProto, helper from finn.util.data_packing import npy_to_rtlsim_input, rtlsim_output_to_npy diff --git a/src/finn/custom_op/fpgadataflow/channelwise_op_batch.py b/src/finn/custom_op/fpgadataflow/channelwise_op_batch.py index 097ec336ff24cd826e6530c42b7cdb1108971fa1..b1dc02131e45b0a04acb25723e09847ee858ebdc 100644 --- a/src/finn/custom_op/fpgadataflow/channelwise_op_batch.py +++ b/src/finn/custom_op/fpgadataflow/channelwise_op_batch.py @@ -26,12 +26,12 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -from math import ceil -import os - import numpy as np - +import os +import warnings +from math import ceil from onnx import TensorProto, helper + from finn.core.datatype import DataType from finn.custom_op.fpgadataflow.hlscustomop import HLSCustomOp from finn.util.data_packing import ( @@ -39,9 +39,8 @@ from finn.util.data_packing import ( numpy_to_hls_code, rtlsim_output_to_npy, ) -from . import templates -import warnings +from . import templates # ONNX i/o tensor shape assumptions for channelwise ops: # input 0 is the input tensor, shape (..., NumChannels) @@ -217,7 +216,7 @@ class ChannelwiseOp_Batch(HLSCustomOp): return 0 def lut_estimation(self): - """Calculates LUT cost, taking memory resource type into account """ + """Calculates LUT cost, taking memory resource type into account""" # TODO add in/out FIFO contributions style = self.get_nodeattr("ram_style") P = self.get_nodeattr("PE") @@ -490,7 +489,9 @@ class ChannelwiseOp_Batch(HLSCustomOp): numReps = numInputVectors[0] self.code_gen_dict["$DEFINES$"] = [ """#define NumChannels1 {}\n#define PE1 {}\n#define numReps {}""".format( - self.get_nodeattr("NumChannels"), self.get_nodeattr("PE"), numReps, + self.get_nodeattr("NumChannels"), + self.get_nodeattr("PE"), + numReps, ) ] @@ -533,7 +534,9 @@ class ChannelwiseOp_Batch(HLSCustomOp): self.code_gen_dict["$DOCOMPUTE$"] = [ """Thresholding_Batch<{}, NumChannels1, PE1, {}, {}> (in0, out, threshs, numReps);""".format( - imgdim, tmpl_args["TSrcI"], tmpl_args["TDstI"], + imgdim, + tmpl_args["TSrcI"], + tmpl_args["TDstI"], ) ] diff --git a/src/finn/custom_op/fpgadataflow/convolutioninputgenerator.py b/src/finn/custom_op/fpgadataflow/convolutioninputgenerator.py index 6e77cd3da7328fd81dccc2ff171a9ae84723d165..9ec7bc662d95b1c94ca17bc3c9a1a7b6199cc18a 100644 --- a/src/finn/custom_op/fpgadataflow/convolutioninputgenerator.py +++ b/src/finn/custom_op/fpgadataflow/convolutioninputgenerator.py @@ -26,15 +26,14 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -import os - import math import numpy as np +import os +from onnx import TensorProto, helper from finn.core.datatype import DataType from finn.custom_op.fpgadataflow.hlscustomop import HLSCustomOp from finn.custom_op.general.im2col import compute_conv_output_dim -from onnx import TensorProto, helper from finn.util.data_packing import npy_to_rtlsim_input, rtlsim_output_to_npy # ONNX i/o tensor shape assumptions for ConvolutionInputGenerator: diff --git a/src/finn/custom_op/fpgadataflow/convolutioninputgenerator1d.py b/src/finn/custom_op/fpgadataflow/convolutioninputgenerator1d.py index 782655b31b7f4add4c886a46845506af875190bc..b428210acfd70186f68e7f1b35cfcd945d0a77d9 100644 --- a/src/finn/custom_op/fpgadataflow/convolutioninputgenerator1d.py +++ b/src/finn/custom_op/fpgadataflow/convolutioninputgenerator1d.py @@ -26,15 +26,14 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -import os - import math import numpy as np +import os +from onnx import TensorProto, helper from finn.core.datatype import DataType from finn.custom_op.fpgadataflow.hlscustomop import HLSCustomOp from finn.custom_op.general.im2col import compute_conv_output_dim -from onnx import TensorProto, helper from finn.util.data_packing import npy_to_rtlsim_input, rtlsim_output_to_npy # This operation should only be used for 1D convolutions. Either the diff --git a/src/finn/custom_op/fpgadataflow/downsampler.py b/src/finn/custom_op/fpgadataflow/downsampler.py index 002f71aa30b4cf94c63d572e536999327eb2a527..2313ab28b41668b93a55298aa2b589dac999070e 100644 --- a/src/finn/custom_op/fpgadataflow/downsampler.py +++ b/src/finn/custom_op/fpgadataflow/downsampler.py @@ -1,10 +1,11 @@ -import os import numpy as np +import os +import warnings from onnx import TensorProto, helper + from finn.core.datatype import DataType from finn.custom_op.fpgadataflow.hlscustomop import HLSCustomOp from finn.util.data_packing import npy_to_rtlsim_input, rtlsim_output_to_npy -import warnings class DownSampler(HLSCustomOp): diff --git a/src/finn/custom_op/fpgadataflow/duplicatestreams_batch.py b/src/finn/custom_op/fpgadataflow/duplicatestreams_batch.py index 73da77bd3f940cee5ffd10fcfc43571f1a612eb4..3b0fa55b0065e6ceeb8ad2eb7282a413adf443d7 100644 --- a/src/finn/custom_op/fpgadataflow/duplicatestreams_batch.py +++ b/src/finn/custom_op/fpgadataflow/duplicatestreams_batch.py @@ -26,13 +26,13 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -import os - import numpy as np +import os import warnings +from onnx import TensorProto, helper + from finn.core.datatype import DataType from finn.custom_op.fpgadataflow.hlscustomop import HLSCustomOp -from onnx import helper, TensorProto from finn.util.data_packing import npy_to_rtlsim_input, rtlsim_output_to_npy diff --git a/src/finn/custom_op/fpgadataflow/fmpadding_batch.py b/src/finn/custom_op/fpgadataflow/fmpadding_batch.py index 99f959bf59f06d6ab5b71dd7245d657f4964cca4..ca0b2f12ab6e84bab0b87e5a34917619c2ba289d 100644 --- a/src/finn/custom_op/fpgadataflow/fmpadding_batch.py +++ b/src/finn/custom_op/fpgadataflow/fmpadding_batch.py @@ -1,10 +1,11 @@ -import os import numpy as np +import os +import warnings from onnx import TensorProto, helper + from finn.core.datatype import DataType from finn.custom_op.fpgadataflow.hlscustomop import HLSCustomOp from finn.util.data_packing import npy_to_rtlsim_input, rtlsim_output_to_npy -import warnings class FMPadding_Batch(HLSCustomOp): diff --git a/src/finn/custom_op/fpgadataflow/globalaccpool_batch.py b/src/finn/custom_op/fpgadataflow/globalaccpool_batch.py index 8cc71ce9eb57c2dcf1f743a7b96e501ab833f6cd..eabdcf599d23d35ed13069cb81afa3ec4999e8e7 100644 --- a/src/finn/custom_op/fpgadataflow/globalaccpool_batch.py +++ b/src/finn/custom_op/fpgadataflow/globalaccpool_batch.py @@ -26,13 +26,13 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -import os - import numpy as np +import os import warnings +from onnx import TensorProto, helper + from finn.core.datatype import DataType from finn.custom_op.fpgadataflow.hlscustomop import HLSCustomOp -from onnx import TensorProto, helper from finn.util.data_packing import npy_to_rtlsim_input, rtlsim_output_to_npy diff --git a/src/finn/custom_op/fpgadataflow/hlscustomop.py b/src/finn/custom_op/fpgadataflow/hlscustomop.py index c07188430244b635ab6b1ec192337da74550d57d..db5286b17bded3b829d27fe546e91fb623ac0d0f 100644 --- a/src/finn/custom_op/fpgadataflow/hlscustomop.py +++ b/src/finn/custom_op/fpgadataflow/hlscustomop.py @@ -27,22 +27,24 @@ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # namespace package, extend path -from abc import abstractmethod import numpy as np import os import subprocess +from abc import abstractmethod + from finn.custom_op.base import CustomOp from finn.util.basic import ( CppBuilder, + get_rtlsim_trace_depth, make_build_dir, roundup_to_integer_multiple, - get_rtlsim_trace_depth, ) +from finn.util.hls import CallHLS from finn.util.pyverilator import ( pyverilate_get_liveness_threshold_cycles, rtlsim_multi_io, ) -from finn.util.hls import CallHLS + from . import templates try: diff --git a/src/finn/custom_op/fpgadataflow/iodma.py b/src/finn/custom_op/fpgadataflow/iodma.py index 857496a2614894588ebf065db3e384cf2cecf106..4fa74e35dbec902d6c4d980c48ffaa69cbd5ccd9 100644 --- a/src/finn/custom_op/fpgadataflow/iodma.py +++ b/src/finn/custom_op/fpgadataflow/iodma.py @@ -26,12 +26,13 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -import numpy as np import math +import numpy as np +import warnings from onnx import TensorProto, helper + from finn.core.datatype import DataType from finn.custom_op.fpgadataflow.hlscustomop import HLSCustomOp -import warnings # the IODMA inerfaces a memory-mapped AXI interface and an AXI stream # direction "in": pulls data from AXI-MM to AXI stream diff --git a/src/finn/custom_op/fpgadataflow/labelselect_batch.py b/src/finn/custom_op/fpgadataflow/labelselect_batch.py index 1640e2f27c4672449775fa1c6f2d9b9745e305c4..d70d0f6a9b0cacb491ce748b84c8c7c474605170 100644 --- a/src/finn/custom_op/fpgadataflow/labelselect_batch.py +++ b/src/finn/custom_op/fpgadataflow/labelselect_batch.py @@ -26,15 +26,14 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -import os - import numpy as np +import os +from onnx import TensorProto, helper from finn.core.datatype import DataType from finn.custom_op.fpgadataflow.hlscustomop import HLSCustomOp -from onnx import TensorProto, helper -from finn.util.data_packing import npy_to_rtlsim_input, rtlsim_output_to_npy from finn.util.basic import roundup_to_integer_multiple +from finn.util.data_packing import npy_to_rtlsim_input, rtlsim_output_to_npy class LabelSelect_Batch(HLSCustomOp): diff --git a/src/finn/custom_op/fpgadataflow/pool_batch.py b/src/finn/custom_op/fpgadataflow/pool_batch.py index edba084b5258de37198520257e438f90f8cc65e3..cef964acd5192ad254e1086dacead590b51e7ec1 100644 --- a/src/finn/custom_op/fpgadataflow/pool_batch.py +++ b/src/finn/custom_op/fpgadataflow/pool_batch.py @@ -26,12 +26,12 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -import os import numpy as np +import os +from onnx import TensorProto, helper -from finn.custom_op.fpgadataflow.hlscustomop import HLSCustomOp from finn.core.datatype import DataType -from onnx import TensorProto, helper +from finn.custom_op.fpgadataflow.hlscustomop import HLSCustomOp from finn.util.data_packing import npy_to_rtlsim_input, rtlsim_output_to_npy diff --git a/src/finn/custom_op/fpgadataflow/streamingdatawidthconverter_batch.py b/src/finn/custom_op/fpgadataflow/streamingdatawidthconverter_batch.py index 4d84b74dce001fca769ed2850a8f718ac942f14c..67e3cd36549d34cab55a931cc040fee5d14ca06f 100644 --- a/src/finn/custom_op/fpgadataflow/streamingdatawidthconverter_batch.py +++ b/src/finn/custom_op/fpgadataflow/streamingdatawidthconverter_batch.py @@ -26,13 +26,14 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -import os -import numpy as np import math +import numpy as np +import os import warnings -from finn.custom_op.fpgadataflow.hlscustomop import HLSCustomOp -from finn.core.datatype import DataType from onnx import TensorProto, helper + +from finn.core.datatype import DataType +from finn.custom_op.fpgadataflow.hlscustomop import HLSCustomOp from finn.util.data_packing import npy_to_rtlsim_input, rtlsim_output_to_npy # does not do anything at the ONNX node-by-node level, and input-output diff --git a/src/finn/custom_op/fpgadataflow/streamingfclayer_batch.py b/src/finn/custom_op/fpgadataflow/streamingfclayer_batch.py index 48b40f105c8cbcba1d82990d91c23e4e6614fc4d..48e0686e2580376dd1587088b941465ed9c566c2 100644 --- a/src/finn/custom_op/fpgadataflow/streamingfclayer_batch.py +++ b/src/finn/custom_op/fpgadataflow/streamingfclayer_batch.py @@ -26,27 +26,28 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -import warnings import math -import os import numpy as np - +import os +import textwrap +import warnings from onnx import TensorProto, helper + from finn.core.datatype import DataType from finn.custom_op.fpgadataflow.hlscustomop import HLSCustomOp from finn.util.basic import ( + calculate_matvec_accumulator_range, interleave_matrix_outer_dim_from_partitions, roundup_to_integer_multiple, - calculate_matvec_accumulator_range, ) from finn.util.data_packing import ( npy_to_rtlsim_input, numpy_to_hls_code, - rtlsim_output_to_npy, pack_innermost_dim_as_hex_string, + rtlsim_output_to_npy, ) + from . import templates -import textwrap # ONNX i/o tensor shape assumptions for StreamingFCLayer: # input 0 is the input tensor, shape (.., i_size) = (..., MW) @@ -238,9 +239,10 @@ class StreamingFCLayer_Batch(HLSCustomOp): mem_width = Q * W * P mmode = self.get_nodeattr("mem_mode") mstyle = self.get_nodeattr("ram_style") - if (mmode == "decoupled" and mstyle != "ultra") or ( - mmode == "const" and self.calc_wmem() <= 128) or ( - mmode == "external" + if ( + (mmode == "decoupled" and mstyle != "ultra") + or (mmode == "const" and self.calc_wmem() <= 128) + or (mmode == "external") ): return 0 width_multiplier = math.ceil(mem_width / 72) @@ -266,9 +268,10 @@ class StreamingFCLayer_Batch(HLSCustomOp): mem_width = Q * W * P mmode = self.get_nodeattr("mem_mode") mstyle = self.get_nodeattr("ram_style") - if (mmode == "decoupled" and mstyle in ["distributed", "ultra"]) or ( - mmode == "const" and self.calc_wmem() <= 128) or ( - mmode == "external" + if ( + (mmode == "decoupled" and mstyle in ["distributed", "ultra"]) + or (mmode == "const" and self.calc_wmem() <= 128) + or (mmode == "external") ): return 0 # assuming SDP mode RAMB18s (see UG573 Table 1-10) @@ -604,9 +607,11 @@ class StreamingFCLayer_Batch(HLSCustomOp): tdt = DataType.get_smallest_possible(0 - tdt_max) else: tdt = DataType.get_smallest_possible(tdt_max) - assert np.vectorize(tdt.allowed)(threshold_tensor).all(), ( - "Thresholds in %s can't be expressed with type %s" - % (self.onnx_node.name, str(tdt)) + assert np.vectorize(tdt.allowed)( + threshold_tensor + ).all(), "Thresholds in %s can't be expressed with type %s" % ( + self.onnx_node.name, + str(tdt), ) self.set_nodeattr("accDataType", tdt.name) else: @@ -843,9 +848,11 @@ class StreamingFCLayer_Batch(HLSCustomOp): # get computed threshold datatype from attribute tdt = DataType[self.get_nodeattr("accDataType")] - assert np.vectorize(tdt.allowed)(threshold_tensor).all(), ( - "Thresholds in %s can't be expressed with type %s" - % (self.onnx_node.name, str(tdt)) + assert np.vectorize(tdt.allowed)( + threshold_tensor + ).all(), "Thresholds in %s can't be expressed with type %s" % ( + self.onnx_node.name, + str(tdt), ) thresholds_hls_code = numpy_to_hls_code( threshold_tensor, tdt, "thresholds", False, True diff --git a/src/finn/custom_op/fpgadataflow/streamingfifo.py b/src/finn/custom_op/fpgadataflow/streamingfifo.py index 133a869b28cf9968a719e243a3266dfb25b637ba..9653d698f54e2b97c66bff62c0b3c11057b36aad 100644 --- a/src/finn/custom_op/fpgadataflow/streamingfifo.py +++ b/src/finn/custom_op/fpgadataflow/streamingfifo.py @@ -25,16 +25,16 @@ # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -import os +import math import numpy as np -from shutil import copy +import os import subprocess -import math import warnings +from onnx import TensorProto, helper +from shutil import copy -from finn.custom_op.fpgadataflow.hlscustomop import HLSCustomOp from finn.core.datatype import DataType -from onnx import TensorProto, helper +from finn.custom_op.fpgadataflow.hlscustomop import HLSCustomOp from finn.util.data_packing import npy_to_rtlsim_input, rtlsim_output_to_npy from . import templates diff --git a/src/finn/custom_op/fpgadataflow/streamingmaxpool_batch.py b/src/finn/custom_op/fpgadataflow/streamingmaxpool_batch.py index 07e1197af54fe5267995cf15424a02df8a5e1500..edbc07300c02c87b47a67297501163766c4cb0dc 100644 --- a/src/finn/custom_op/fpgadataflow/streamingmaxpool_batch.py +++ b/src/finn/custom_op/fpgadataflow/streamingmaxpool_batch.py @@ -26,13 +26,14 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -import os import numpy as np +import os import warnings +from onnx import TensorProto, helper + +from finn.core.datatype import DataType from finn.custom_op.fpgadataflow.hlscustomop import HLSCustomOp from finn.custom_op.general.im2col import compute_conv_output_dim -from finn.core.datatype import DataType -from onnx import TensorProto, helper from finn.util.data_packing import npy_to_rtlsim_input, rtlsim_output_to_npy diff --git a/src/finn/custom_op/fpgadataflow/thresholding_batch.py b/src/finn/custom_op/fpgadataflow/thresholding_batch.py index 0b248c15035a2b685ebfb024c8a944a6ea6c65bf..2944aeaa38157be6c74284829326917d7280fa36 100644 --- a/src/finn/custom_op/fpgadataflow/thresholding_batch.py +++ b/src/finn/custom_op/fpgadataflow/thresholding_batch.py @@ -26,13 +26,13 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -from math import ceil, log2 -import textwrap +import numpy as np import os +import textwrap import warnings -import numpy as np - +from math import ceil, log2 from onnx import TensorProto, helper + from finn.core.datatype import DataType from finn.custom_op.fpgadataflow.hlscustomop import HLSCustomOp from finn.util.basic import ( @@ -42,9 +42,10 @@ from finn.util.basic import ( from finn.util.data_packing import ( npy_to_rtlsim_input, numpy_to_hls_code, - rtlsim_output_to_npy, pack_innermost_dim_as_hex_string, + rtlsim_output_to_npy, ) + from . import templates # ONNX i/o tensor shape assumptions for Thresholding: @@ -180,7 +181,7 @@ class Thresholding_Batch(HLSCustomOp): return 0 def lut_estimation(self): - """Calculates LUT cost, taking memory resource type into account """ + """Calculates LUT cost, taking memory resource type into account""" # TODO add in/out FIFO contributions style = self.get_nodeattr("ram_style") P = self.get_nodeattr("PE") @@ -604,7 +605,9 @@ class Thresholding_Batch(HLSCustomOp): numReps = numInputVectors[0] self.code_gen_dict["$DEFINES$"] = [ """#define NumChannels1 {}\n #define PE1 {}\n #define numReps {}""".format( - self.get_nodeattr("NumChannels"), self.get_nodeattr("PE"), numReps, + self.get_nodeattr("NumChannels"), + self.get_nodeattr("PE"), + numReps, ) ] if self.get_nodeattr("mem_mode") == "decoupled": @@ -686,7 +689,10 @@ class Thresholding_Batch(HLSCustomOp): self.code_gen_dict["$DOCOMPUTE$"] = [ """{}<{}, NumChannels1, PE1, {}, {}> (in0, out, threshs, numReps);""".format( - node.op_type, imgdim, tmpl_args["TSrcI"], tmpl_args["TDstI"], + node.op_type, + imgdim, + tmpl_args["TSrcI"], + tmpl_args["TDstI"], ) ] elif mem_mode == "decoupled": diff --git a/src/finn/custom_op/fpgadataflow/vector_vector_activate_batch.py b/src/finn/custom_op/fpgadataflow/vector_vector_activate_batch.py index fead30650c60d38f9cd70de8f1515f847e15276f..921be6fdfa8839239bb6e746112ed30477b8f529 100644 --- a/src/finn/custom_op/fpgadataflow/vector_vector_activate_batch.py +++ b/src/finn/custom_op/fpgadataflow/vector_vector_activate_batch.py @@ -1,20 +1,21 @@ -import os -import numpy as np import math +import numpy as np +import os +import warnings from onnx import TensorProto, helper + from finn.core.datatype import DataType from finn.custom_op.fpgadataflow.hlscustomop import HLSCustomOp from finn.util.basic import ( + calculate_matvec_accumulator_range, interleave_matrix_outer_dim_from_partitions, roundup_to_integer_multiple, - calculate_matvec_accumulator_range, ) from finn.util.data_packing import ( npy_to_rtlsim_input, numpy_to_hls_code, rtlsim_output_to_npy, ) -import warnings class Vector_Vector_Activate_Batch(HLSCustomOp): diff --git a/src/finn/qnn-data/cybsec-mlp/validate-unsw-nb15.py b/src/finn/qnn-data/cybsec-mlp/validate-unsw-nb15.py index 2fabc716a66a3cc24697e49aa26ec3bbbb231b43..be09abad9c10b8b5e9a32e21233107421fdef95e 100644 --- a/src/finn/qnn-data/cybsec-mlp/validate-unsw-nb15.py +++ b/src/finn/qnn-data/cybsec-mlp/validate-unsw-nb15.py @@ -27,9 +27,9 @@ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. import argparse +import numpy as np from driver import io_shape_dict from driver_base import FINNExampleOverlay -import numpy as np def make_unsw_nb15_test_batches(bsize, dataset_root, limit_batches): diff --git a/src/finn/qnn-data/templates/driver/driver_base.py b/src/finn/qnn-data/templates/driver/driver_base.py index df3c9881372659a4d8f6fceb8a385e6055c161e1..4dd5a080e10e4a0ab5bd14381186e19144f6edb3 100644 --- a/src/finn/qnn-data/templates/driver/driver_base.py +++ b/src/finn/qnn-data/templates/driver/driver_base.py @@ -27,19 +27,18 @@ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. import numpy as np -import time import os +import time from pynq import Overlay, allocate from pynq.ps import Clocks +from finn.core.datatype import DataType +from finn.util.basic import gen_finn_dt_tensor from finn.util.data_packing import ( finnpy_to_packed_bytearray, packed_bytearray_to_finnpy, ) -from finn.util.basic import gen_finn_dt_tensor -from finn.core.datatype import DataType - # Driver base class for FINN-generated dataflow accelerators. # The particulars of the generated accelerator are specified via the # io_shape_dict (generated by the MakePYNQDriver transformation). diff --git a/src/finn/qnn-data/templates/driver/validate.py b/src/finn/qnn-data/templates/driver/validate.py index 4aa7d67aa162e91b878d387bee1457e4b477e635..001744cba2b59f6d1a0a67fca3e2ad9668a519c0 100644 --- a/src/finn/qnn-data/templates/driver/validate.py +++ b/src/finn/qnn-data/templates/driver/validate.py @@ -27,9 +27,9 @@ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. import argparse +import numpy as np from driver import io_shape_dict from driver_base import FINNExampleOverlay -import numpy as np if __name__ == "__main__": parser = argparse.ArgumentParser( diff --git a/src/finn/transformation/fpgadataflow/annotate_cycles.py b/src/finn/transformation/fpgadataflow/annotate_cycles.py index 2c547203df94308b929a7989f1a9102bd3002fed..5ab491dd1031cfec64308aee678edc9c94aa6da2 100644 --- a/src/finn/transformation/fpgadataflow/annotate_cycles.py +++ b/src/finn/transformation/fpgadataflow/annotate_cycles.py @@ -27,10 +27,10 @@ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. import finn.custom_op.registry as registry -from finn.transformation.base import Transformation -from finn.transformation.move_reshape import _is_fpgadataflow_node from finn.core.modelwrapper import ModelWrapper from finn.custom_op.registry import getCustomOp +from finn.transformation.base import Transformation +from finn.transformation.move_reshape import _is_fpgadataflow_node class AnnotateCycles(Transformation): diff --git a/src/finn/transformation/fpgadataflow/annotate_resources.py b/src/finn/transformation/fpgadataflow/annotate_resources.py index 4e501510110ef724c6a67f6214654b5454b30a77..d9089cbeba6e0791f6d8375e28b2c2d99b506eda 100644 --- a/src/finn/transformation/fpgadataflow/annotate_resources.py +++ b/src/finn/transformation/fpgadataflow/annotate_resources.py @@ -27,13 +27,13 @@ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. import finn.custom_op.registry as registry -from finn.transformation.base import Transformation -from finn.transformation.move_reshape import _is_fpgadataflow_node -from finn.analysis.fpgadataflow.res_estimation import res_estimation from finn.analysis.fpgadataflow.hls_synth_res_estimation import hls_synth_res_estimation from finn.analysis.fpgadataflow.post_synth_res import post_synth_res +from finn.analysis.fpgadataflow.res_estimation import res_estimation from finn.core.modelwrapper import ModelWrapper from finn.custom_op.registry import getCustomOp +from finn.transformation.base import Transformation +from finn.transformation.move_reshape import _is_fpgadataflow_node class AnnotateResources(Transformation): diff --git a/src/finn/transformation/fpgadataflow/cleanup.py b/src/finn/transformation/fpgadataflow/cleanup.py index 5dbe5f0517d07bef07e5ecff6e4c7afff0293d86..f59f4bdeab72a5af9615ecf308306e4fb4b69fb5 100644 --- a/src/finn/transformation/fpgadataflow/cleanup.py +++ b/src/finn/transformation/fpgadataflow/cleanup.py @@ -30,8 +30,8 @@ import os import shutil import finn.custom_op.registry as registry -from finn.util.fpgadataflow import is_fpgadataflow_node from finn.transformation.base import Transformation +from finn.util.fpgadataflow import is_fpgadataflow_node class CleanUp(Transformation): diff --git a/src/finn/transformation/fpgadataflow/compile_cppsim.py b/src/finn/transformation/fpgadataflow/compile_cppsim.py index 6321b3335907948fb49de966c80eb21637e0a6ec..5f7c534b4561ffc0fac0c8c2b6160279f4e34fbc 100644 --- a/src/finn/transformation/fpgadataflow/compile_cppsim.py +++ b/src/finn/transformation/fpgadataflow/compile_cppsim.py @@ -27,8 +27,8 @@ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. import finn.custom_op.registry as registry -from finn.util.fpgadataflow import is_fpgadataflow_node from finn.transformation.base import NodeLocalTransformation +from finn.util.fpgadataflow import is_fpgadataflow_node class CompileCppSim(NodeLocalTransformation): diff --git a/src/finn/transformation/fpgadataflow/convert_to_hls_layers.py b/src/finn/transformation/fpgadataflow/convert_to_hls_layers.py index 1f3d40e929e29d16790a491bbfd7a4a5033f866f..03d7b73a567ef8e87890d4ecfdc697ab3c6120fd 100644 --- a/src/finn/transformation/fpgadataflow/convert_to_hls_layers.py +++ b/src/finn/transformation/fpgadataflow/convert_to_hls_layers.py @@ -27,22 +27,22 @@ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -from onnx import helper, TensorProto import numpy as np import warnings +from onnx import TensorProto, helper +import finn.core.data_layout as DataLayout from finn.core.datatype import DataType -from finn.transformation.base import Transformation from finn.custom_op.registry import getCustomOp -from finn.transformation.infer_shapes import InferShapes -from finn.transformation.infer_datatypes import InferDataTypes -from finn.transformation.general import SortGraph -import finn.core.data_layout as DataLayout -from finn.util.onnx import nchw_to_nhwc -from finn.util.basic import get_by_name +from finn.transformation.base import Transformation from finn.transformation.fpgadataflow.minimize_accumulator_width import ( MinimizeAccumulatorWidth, ) +from finn.transformation.general import SortGraph +from finn.transformation.infer_datatypes import InferDataTypes +from finn.transformation.infer_shapes import InferShapes +from finn.util.basic import get_by_name +from finn.util.onnx import nchw_to_nhwc class InferConvInpGen(Transformation): @@ -1039,7 +1039,7 @@ class InferAddStreamsLayer(Transformation): class InferDuplicateStreamsLayer(Transformation): - """Insert a DuplicateStreams HLS layer for any tensor with fanout == 2 """ + """Insert a DuplicateStreams HLS layer for any tensor with fanout == 2""" def apply(self, model): graph = model.graph diff --git a/src/finn/transformation/fpgadataflow/create_dataflow_partition.py b/src/finn/transformation/fpgadataflow/create_dataflow_partition.py index 419a6d8c494651862f55e63e6829a61fe8040599..0aba60f9b6f08210c40f305694495b77f517f323 100644 --- a/src/finn/transformation/fpgadataflow/create_dataflow_partition.py +++ b/src/finn/transformation/fpgadataflow/create_dataflow_partition.py @@ -27,8 +27,8 @@ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. import copy - from onnx import helper + from finn.custom_op.registry import getCustomOp from finn.transformation.base import Transformation from finn.util.basic import get_by_name, make_build_dir diff --git a/src/finn/transformation/fpgadataflow/create_stitched_ip.py b/src/finn/transformation/fpgadataflow/create_stitched_ip.py index 738f2000a1929024d3808dd7bad0267338b51659..74bc7395512425e6b81defe5cec4afaa4b669e90 100644 --- a/src/finn/transformation/fpgadataflow/create_stitched_ip.py +++ b/src/finn/transformation/fpgadataflow/create_stitched_ip.py @@ -26,19 +26,19 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +import json +import multiprocessing as mp import os -import warnings import subprocess -import json +import warnings -from finn.transformation.base import Transformation -from finn.util.basic import make_build_dir, get_num_default_workers -from finn.util.fpgadataflow import is_fpgadataflow_node from finn.custom_op.registry import getCustomOp -import multiprocessing as mp +from finn.transformation.base import Transformation from finn.transformation.fpgadataflow.replace_verilog_relpaths import ( ReplaceVerilogRelPaths, ) +from finn.util.basic import get_num_default_workers, make_build_dir +from finn.util.fpgadataflow import is_fpgadataflow_node def is_external_input(model, node, i): diff --git a/src/finn/transformation/fpgadataflow/floorplan.py b/src/finn/transformation/fpgadataflow/floorplan.py index 3434183b1480eb38ee267328042aec33e87e0446..2bda7883130d0863b7f67943d19caa00b7290de5 100644 --- a/src/finn/transformation/fpgadataflow/floorplan.py +++ b/src/finn/transformation/fpgadataflow/floorplan.py @@ -26,14 +26,14 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +import json +import warnings + +from finn.analysis.fpgadataflow.floorplan_params import floorplan_params from finn.custom_op.registry import getCustomOp from finn.transformation.base import Transformation -from finn.util.basic import get_by_name -from finn.analysis.fpgadataflow.floorplan_params import floorplan_params -from finn.util.basic import make_build_dir from finn.transformation.general import ApplyConfig -import warnings -import json +from finn.util.basic import get_by_name, make_build_dir class Floorplan(Transformation): @@ -70,7 +70,7 @@ class Floorplan(Transformation): try: default_slr = self.user_floorplan["Defaults"]["slr"][0] - except: + except Exception: default_slr = -1 # perform DWC and FIFO specific adjustments @@ -107,7 +107,8 @@ class Floorplan(Transformation): warnings.warn( str(unassigned_nodes) + " nodes have no entry in the provided floorplan," - + " SLR was set to " + str(default_slr) + + " SLR was set to " + + str(default_slr) ) # partition id generation diff --git a/src/finn/transformation/fpgadataflow/hlssynth_ip.py b/src/finn/transformation/fpgadataflow/hlssynth_ip.py index bbd012a715e49b61c19daad65f8de889112f92a7..2a7d9e9066836ea0d4af004f01d88953e4adaeb7 100644 --- a/src/finn/transformation/fpgadataflow/hlssynth_ip.py +++ b/src/finn/transformation/fpgadataflow/hlssynth_ip.py @@ -27,10 +27,11 @@ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. import os +import warnings + import finn.custom_op.registry as registry -from finn.util.fpgadataflow import is_fpgadataflow_node from finn.transformation.base import NodeLocalTransformation -import warnings +from finn.util.fpgadataflow import is_fpgadataflow_node class HLSSynthIP(NodeLocalTransformation): diff --git a/src/finn/transformation/fpgadataflow/insert_dwc.py b/src/finn/transformation/fpgadataflow/insert_dwc.py index c8df80659d30e1855fc658bad83c3fe9bccb9bf9..58efe65eb5f9d96d74cdf40672703fabe76afb0d 100644 --- a/src/finn/transformation/fpgadataflow/insert_dwc.py +++ b/src/finn/transformation/fpgadataflow/insert_dwc.py @@ -1,10 +1,10 @@ +import warnings from onnx import TensorProto from onnx import helper as oh from finn.custom_op.registry import getCustomOp from finn.transformation.base import Transformation from finn.util.fpgadataflow import is_fpgadataflow_node -import warnings def _is_dwc_node(node): diff --git a/src/finn/transformation/fpgadataflow/insert_fifo.py b/src/finn/transformation/fpgadataflow/insert_fifo.py index 1ce936cd79c2257897e74430d00e5082c51c9320..ef56db6376703ce1eb0134c173de61a562bca6e6 100644 --- a/src/finn/transformation/fpgadataflow/insert_fifo.py +++ b/src/finn/transformation/fpgadataflow/insert_fifo.py @@ -1,11 +1,11 @@ +import numpy as np +import warnings from onnx import TensorProto from onnx import helper as oh from finn.custom_op.registry import getCustomOp from finn.transformation.base import Transformation from finn.util.fpgadataflow import is_fpgadataflow_node -import warnings -import numpy as np def _is_fifo_node(node): diff --git a/src/finn/transformation/fpgadataflow/insert_iodma.py b/src/finn/transformation/fpgadataflow/insert_iodma.py index 27055a4fd29dba3849c0e4a889f27802f8c36081..d4b2a1032aeb305c85ffb535ac821692ce747c18 100644 --- a/src/finn/transformation/fpgadataflow/insert_iodma.py +++ b/src/finn/transformation/fpgadataflow/insert_iodma.py @@ -26,15 +26,15 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +import math +import numpy as np from onnx import TensorProto from onnx import helper as oh -from finn.util.basic import get_by_name from finn.custom_op.registry import getCustomOp from finn.transformation.base import Transformation from finn.transformation.general import SortGraph -import math -import numpy as np +from finn.util.basic import get_by_name class InsertIODMA(Transformation): diff --git a/src/finn/transformation/fpgadataflow/insert_tlastmarker.py b/src/finn/transformation/fpgadataflow/insert_tlastmarker.py index 3ce9824b14a54f502c90650e7b3b75e9cdaab77f..34cb61346dcd5bcd6f41a4272748764cf385a524 100644 --- a/src/finn/transformation/fpgadataflow/insert_tlastmarker.py +++ b/src/finn/transformation/fpgadataflow/insert_tlastmarker.py @@ -26,6 +26,7 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +import numpy as np from onnx import TensorProto from onnx import helper as oh @@ -33,8 +34,6 @@ from finn.custom_op.registry import getCustomOp from finn.transformation.base import Transformation from finn.util.basic import get_by_name -import numpy as np - class InsertTLastMarker(Transformation): """Ensure that the graph is started/terminated with a TLastMarker node, inserting diff --git a/src/finn/transformation/fpgadataflow/make_deployment.py b/src/finn/transformation/fpgadataflow/make_deployment.py index 84d3f4cd94c9e0870b90941f7c46447da4cee631..d43d81716ac7a8b097fc7ec9e38bf5bcb954c7fb 100644 --- a/src/finn/transformation/fpgadataflow/make_deployment.py +++ b/src/finn/transformation/fpgadataflow/make_deployment.py @@ -31,9 +31,9 @@ import subprocess from distutils.dir_util import copy_tree from shutil import copy +import finn.transformation.fpgadataflow.templates as templates from finn.transformation.base import Transformation from finn.util.basic import make_build_dir -import finn.transformation.fpgadataflow.templates as templates class DeployToPYNQ(Transformation): diff --git a/src/finn/transformation/fpgadataflow/make_pynq_driver.py b/src/finn/transformation/fpgadataflow/make_pynq_driver.py index 6ab12548abbcbe00496101bd146b2c9b873204c8..be2176a34763fdb5521a0acdfc3137fb4b4a766e 100644 --- a/src/finn/transformation/fpgadataflow/make_pynq_driver.py +++ b/src/finn/transformation/fpgadataflow/make_pynq_driver.py @@ -27,24 +27,29 @@ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -import shutil -from finn.transformation.base import Transformation -from finn.util.basic import gen_finn_dt_tensor, make_build_dir -import finn.util.data_packing as dpk -import finn.core.datatype as dtp -from finn.custom_op.registry import getCustomOp -import os -import warnings import pkg_resources as pk -from . import template_driver -from finn.core.modelwrapper import ModelWrapper + import numpy as np +import os +import shutil +import warnings +import finn.core.datatype as dtp +import finn.util.data_packing as dpk +from finn.core.modelwrapper import ModelWrapper +from finn.custom_op.registry import getCustomOp +from finn.transformation.base import Transformation +from finn.util.basic import ( + gen_finn_dt_tensor, + make_build_dir, + roundup_to_integer_multiple, +) from finn.util.data_packing import ( - pack_innermost_dim_as_hex_string, hexstring2npbytearray, + pack_innermost_dim_as_hex_string, ) -from finn.util.basic import roundup_to_integer_multiple + +from . import template_driver def to_external_tensor(init, w_dtype): diff --git a/src/finn/transformation/fpgadataflow/make_zynq_proj.py b/src/finn/transformation/fpgadataflow/make_zynq_proj.py index f2f172139ed9144eccdfbe37d0ae1a0695d049e4..0f4dd2673c026f4e9179c2ab6e860ca04ced68eb 100644 --- a/src/finn/transformation/fpgadataflow/make_zynq_proj.py +++ b/src/finn/transformation/fpgadataflow/make_zynq_proj.py @@ -28,27 +28,25 @@ import os import subprocess +from shutil import copy +from finn.core.modelwrapper import ModelWrapper from finn.custom_op.registry import getCustomOp from finn.transformation.base import Transformation -from finn.core.modelwrapper import ModelWrapper -from finn.util.basic import get_by_name, make_build_dir -from finn.util.basic import pynq_part_map - from finn.transformation.fpgadataflow.create_dataflow_partition import ( CreateDataflowPartition, ) +from finn.transformation.fpgadataflow.create_stitched_ip import CreateStitchedIP +from finn.transformation.fpgadataflow.floorplan import Floorplan +from finn.transformation.fpgadataflow.hlssynth_ip import HLSSynthIP from finn.transformation.fpgadataflow.insert_dwc import InsertDWC from finn.transformation.fpgadataflow.insert_fifo import InsertFIFO from finn.transformation.fpgadataflow.insert_iodma import InsertIODMA +from finn.transformation.fpgadataflow.make_pynq_driver import MakePYNQDriver from finn.transformation.fpgadataflow.prepare_ip import PrepareIP -from finn.transformation.fpgadataflow.hlssynth_ip import HLSSynthIP -from finn.transformation.fpgadataflow.create_stitched_ip import CreateStitchedIP -from finn.transformation.fpgadataflow.floorplan import Floorplan from finn.transformation.general import GiveReadableTensorNames, GiveUniqueNodeNames from finn.transformation.infer_data_layouts import InferDataLayouts -from shutil import copy -from finn.transformation.fpgadataflow.make_pynq_driver import MakePYNQDriver +from finn.util.basic import get_by_name, make_build_dir, pynq_part_map from . import templates diff --git a/src/finn/transformation/fpgadataflow/prepare_cppsim.py b/src/finn/transformation/fpgadataflow/prepare_cppsim.py index 653ec02ff306bf35d5fd3f7265404e61641077ac..8b332972cac6bf001490c0c2396174be175d6d33 100644 --- a/src/finn/transformation/fpgadataflow/prepare_cppsim.py +++ b/src/finn/transformation/fpgadataflow/prepare_cppsim.py @@ -26,15 +26,14 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +import copy +import multiprocessing as mp import os import finn.custom_op.registry as registry -from finn.util.basic import make_build_dir -from finn.util.fpgadataflow import is_fpgadataflow_node from finn.transformation.base import Transformation -from finn.util.basic import get_num_default_workers -import multiprocessing as mp -import copy +from finn.util.basic import get_num_default_workers, make_build_dir +from finn.util.fpgadataflow import is_fpgadataflow_node def _codegen_single_node(node, model): diff --git a/src/finn/transformation/fpgadataflow/prepare_ip.py b/src/finn/transformation/fpgadataflow/prepare_ip.py index 4ed5e80aa7baa585f83314ec42233d5885dff32d..4fdcf3939fe6d879abe36907a1bf84a417cb9903 100644 --- a/src/finn/transformation/fpgadataflow/prepare_ip.py +++ b/src/finn/transformation/fpgadataflow/prepare_ip.py @@ -27,11 +27,12 @@ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. import os +import warnings + import finn.custom_op.registry as registry from finn.transformation.base import Transformation from finn.util.basic import make_build_dir from finn.util.fpgadataflow import is_fpgadataflow_node -import warnings def _codegen_single_node(node, model, fpgapart, clk): diff --git a/src/finn/transformation/fpgadataflow/prepare_rtlsim.py b/src/finn/transformation/fpgadataflow/prepare_rtlsim.py index eaa85b9102b55bf8ecdf3a9f284f87468581e113..66799ff4297ad0e2f8afa9261b0f3f983b27452d 100644 --- a/src/finn/transformation/fpgadataflow/prepare_rtlsim.py +++ b/src/finn/transformation/fpgadataflow/prepare_rtlsim.py @@ -27,11 +27,11 @@ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. import finn.custom_op.registry as registry -from finn.util.fpgadataflow import is_fpgadataflow_node +from finn.transformation.base import NodeLocalTransformation from finn.transformation.fpgadataflow.replace_verilog_relpaths import ( ReplaceVerilogRelPaths, ) -from finn.transformation.base import NodeLocalTransformation +from finn.util.fpgadataflow import is_fpgadataflow_node try: from pyverilator import PyVerilator diff --git a/src/finn/transformation/fpgadataflow/replace_verilog_relpaths.py b/src/finn/transformation/fpgadataflow/replace_verilog_relpaths.py index cc7c305b3ec94482e64235a1b1cf4eee543c46e1..7850d37423a9add0880e054c7b035b9e735c7f25 100644 --- a/src/finn/transformation/fpgadataflow/replace_verilog_relpaths.py +++ b/src/finn/transformation/fpgadataflow/replace_verilog_relpaths.py @@ -29,8 +29,8 @@ import os import finn.custom_op.registry as registry -from finn.util.fpgadataflow import is_fpgadataflow_node from finn.transformation.base import Transformation +from finn.util.fpgadataflow import is_fpgadataflow_node class ReplaceVerilogRelPaths(Transformation): diff --git a/src/finn/transformation/fpgadataflow/set_exec_mode.py b/src/finn/transformation/fpgadataflow/set_exec_mode.py index 4677e59f7b35fec38aeaae65485ed16ba1e18f06..caf891bc4444a65976103746685b2e79abdd708f 100644 --- a/src/finn/transformation/fpgadataflow/set_exec_mode.py +++ b/src/finn/transformation/fpgadataflow/set_exec_mode.py @@ -27,8 +27,8 @@ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. import finn.custom_op.registry as registry -from finn.util.fpgadataflow import is_fpgadataflow_node from finn.transformation.base import Transformation +from finn.util.fpgadataflow import is_fpgadataflow_node class SetExecMode(Transformation): diff --git a/src/finn/transformation/fpgadataflow/set_fifo_depths.py b/src/finn/transformation/fpgadataflow/set_fifo_depths.py index ea27eee04db6f90b50a58296ceaf6f6ed58602ac..c06c34574aa22a23d1307232b0fd8e65224f1983 100644 --- a/src/finn/transformation/fpgadataflow/set_fifo_depths.py +++ b/src/finn/transformation/fpgadataflow/set_fifo_depths.py @@ -29,16 +29,17 @@ import math import numpy as np import warnings + +from finn.analysis.fpgadataflow.dataflow_performance import dataflow_performance from finn.custom_op.registry import getCustomOp from finn.transformation.base import Transformation from finn.transformation.fpgadataflow.annotate_cycles import AnnotateCycles -from finn.analysis.fpgadataflow.dataflow_performance import dataflow_performance -from finn.transformation.fpgadataflow.prepare_ip import PrepareIP -from finn.transformation.fpgadataflow.hlssynth_ip import HLSSynthIP from finn.transformation.fpgadataflow.create_stitched_ip import CreateStitchedIP +from finn.transformation.fpgadataflow.hlssynth_ip import HLSSynthIP from finn.transformation.fpgadataflow.insert_dwc import InsertDWC from finn.transformation.fpgadataflow.insert_fifo import InsertFIFO -from finn.transformation.general import GiveUniqueNodeNames, GiveReadableTensorNames +from finn.transformation.fpgadataflow.prepare_ip import PrepareIP +from finn.transformation.general import GiveReadableTensorNames, GiveUniqueNodeNames from finn.util.fpgadataflow import is_fpgadataflow_node from finn.util.pyverilator import pyverilate_stitched_ip, reset_rtlsim, toggle_clk diff --git a/src/finn/transformation/fpgadataflow/set_folding.py b/src/finn/transformation/fpgadataflow/set_folding.py index bb4e0e1db51d331400e7a294890eb998c2aa4e1d..914dda9554395fc89cac8692e13339ae3ce9baf7 100644 --- a/src/finn/transformation/fpgadataflow/set_folding.py +++ b/src/finn/transformation/fpgadataflow/set_folding.py @@ -26,13 +26,14 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +import warnings + +from finn.analysis.fpgadataflow.dataflow_performance import dataflow_performance from finn.custom_op.registry import getCustomOp from finn.transformation.base import Transformation -from finn.util.fpgadataflow import is_fpgadataflow_node -from finn.analysis.fpgadataflow.dataflow_performance import dataflow_performance from finn.transformation.fpgadataflow.annotate_cycles import AnnotateCycles from finn.transformation.general import GiveUniqueNodeNames -import warnings +from finn.util.fpgadataflow import is_fpgadataflow_node def divisors(num): diff --git a/src/finn/transformation/fpgadataflow/synth_ooc.py b/src/finn/transformation/fpgadataflow/synth_ooc.py index acc20e4ad0d0f4a17b20fd77625e9954f09e69aa..6824d51fd0697003100f15d0ee74669ac0ee59c8 100644 --- a/src/finn/transformation/fpgadataflow/synth_ooc.py +++ b/src/finn/transformation/fpgadataflow/synth_ooc.py @@ -30,8 +30,8 @@ import os from shutil import copy2 from finn.transformation.base import Transformation -from finn.util.vivado import out_of_context_synth from finn.util.basic import make_build_dir +from finn.util.vivado import out_of_context_synth class SynthOutOfContext(Transformation): diff --git a/src/finn/transformation/fpgadataflow/vitis_build.py b/src/finn/transformation/fpgadataflow/vitis_build.py index c52dfcf0cde4cbbb393786809852bc965c2856db..502b6f2bffd0d64980ae911d28b845ad90633a44 100644 --- a/src/finn/transformation/fpgadataflow/vitis_build.py +++ b/src/finn/transformation/fpgadataflow/vitis_build.py @@ -26,34 +26,34 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +import json import os import subprocess -import json +from enum import Enum from finn.core.modelwrapper import ModelWrapper -from finn.transformation.base import Transformation from finn.custom_op.registry import getCustomOp - +from finn.transformation.base import Transformation from finn.transformation.fpgadataflow.create_dataflow_partition import ( CreateDataflowPartition, ) +from finn.transformation.fpgadataflow.create_stitched_ip import CreateStitchedIP +from finn.transformation.fpgadataflow.floorplan import Floorplan +from finn.transformation.fpgadataflow.hlssynth_ip import HLSSynthIP from finn.transformation.fpgadataflow.insert_dwc import InsertDWC from finn.transformation.fpgadataflow.insert_fifo import InsertFIFO from finn.transformation.fpgadataflow.insert_iodma import InsertIODMA -from finn.transformation.fpgadataflow.prepare_ip import PrepareIP -from finn.transformation.fpgadataflow.hlssynth_ip import HLSSynthIP -from finn.transformation.fpgadataflow.create_stitched_ip import CreateStitchedIP -from finn.transformation.fpgadataflow.floorplan import Floorplan from finn.transformation.fpgadataflow.make_pynq_driver import MakePYNQDriver +from finn.transformation.fpgadataflow.prepare_ip import PrepareIP from finn.transformation.general import ( GiveReadableTensorNames, GiveUniqueNodeNames, RemoveUnusedTensors, ) -from finn.util.basic import make_build_dir from finn.transformation.infer_data_layouts import InferDataLayouts +from finn.util.basic import make_build_dir + from . import templates -from enum import Enum def _check_vitis_envvars(): @@ -231,7 +231,7 @@ class VitisLink(Transformation): if producer is None or consumer is None: node_mem_port = sdp_node.get_nodeattr("mem_port") if node_mem_port == "": - #configure good defaults based on board + # configure good defaults based on board if "u50" in self.platform or "u280" in self.platform: # Use HBM where available (also U50 does not have DDR) mem_type = "HBM" @@ -251,7 +251,9 @@ class VitisLink(Transformation): mem_type = "DDR" mem_idx = 1 node_mem_port = "%s[%d]" % (mem_type, mem_idx) - config.append("sp=%s.m_axi_gmem0:%s" % (instance_names[node.name], node_mem_port)) + config.append( + "sp=%s.m_axi_gmem0:%s" % (instance_names[node.name], node_mem_port) + ) # connect streams if producer is not None: for i in range(len(node.input)): diff --git a/src/finn/transformation/move_reshape.py b/src/finn/transformation/move_reshape.py index 990b858ad62aec00be4be4e0dd30bef3eb9e3ce3..6c9a2973376be2c4744bc23db2cc975be8e7d52a 100644 --- a/src/finn/transformation/move_reshape.py +++ b/src/finn/transformation/move_reshape.py @@ -1,7 +1,8 @@ +import warnings + +from finn.custom_op.registry import getCustomOp from finn.transformation.base import Transformation from finn.util.basic import get_by_name, is_finn_op -from finn.custom_op.registry import getCustomOp -import warnings def _is_fpgadataflow_node(node): diff --git a/src/finn/transformation/streamline/__init__.py b/src/finn/transformation/streamline/__init__.py index 97cd957ce166255c1442a544f6e865b42c33a1df..ea547571677a9d90a226b55de8582145b8c298f4 100644 --- a/src/finn/transformation/streamline/__init__.py +++ b/src/finn/transformation/streamline/__init__.py @@ -31,42 +31,38 @@ from pkgutil import extend_path __path__ = extend_path(__path__, __name__) from finn.transformation.base import Transformation -from finn.transformation.infer_datatypes import InferDataTypes +from finn.transformation.batchnorm_to_affine import BatchNormToAffine from finn.transformation.general import ( - ConvertSubToAdd, ConvertDivToMul, + ConvertSubToAdd, GiveReadableTensorNames, GiveUniqueNodeNames, ) - +from finn.transformation.infer_datatypes import InferDataTypes from finn.transformation.streamline.absorb import ( + Absorb1BitMulIntoConv, + Absorb1BitMulIntoMatMul, AbsorbAddIntoMultiThreshold, AbsorbMulIntoMultiThreshold, - FactorOutMulSignMagnitude, - Absorb1BitMulIntoMatMul, - Absorb1BitMulIntoConv, AbsorbSignBiasIntoMultiThreshold, + FactorOutMulSignMagnitude, ) - from finn.transformation.streamline.collapse_repeated import ( CollapseRepeatedAdd, CollapseRepeatedMul, ) - +from finn.transformation.streamline.remove import RemoveIdentityOps from finn.transformation.streamline.reorder import ( - MoveAddPastMul, - MoveScalarMulPastMatMul, - MoveScalarAddPastMatMul, MoveAddPastConv, - MoveScalarMulPastConv, + MoveAddPastMul, MoveMulPastMaxPool, + MoveScalarAddPastMatMul, MoveScalarLinearPastInvariants, + MoveScalarMulPastConv, + MoveScalarMulPastMatMul, ) - from finn.transformation.streamline.round_thresholds import RoundAndClipThresholds from finn.transformation.streamline.sign_to_thres import ConvertSignToThres -from finn.transformation.batchnorm_to_affine import BatchNormToAffine -from finn.transformation.streamline.remove import RemoveIdentityOps class Streamline(Transformation): diff --git a/src/finn/transformation/streamline/absorb.py b/src/finn/transformation/streamline/absorb.py index 8237d8bf2f05ab93c61f4f6c58d0e049195e223d..1e2830356fe0133038caaa1dbc43f97ca98378d1 100644 --- a/src/finn/transformation/streamline/absorb.py +++ b/src/finn/transformation/streamline/absorb.py @@ -27,16 +27,16 @@ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. import numpy as np -from onnx import helper as oh import warnings +from onnx import helper as oh -from finn.core.datatype import DataType import finn.core.data_layout as DataLayout -from finn.transformation.base import Transformation -from finn.util.basic import get_by_name +from finn.core.datatype import DataType from finn.custom_op.registry import getCustomOp -from finn.transformation.infer_shapes import InferShapes +from finn.transformation.base import Transformation from finn.transformation.infer_datatypes import InferDataTypes +from finn.transformation.infer_shapes import InferShapes +from finn.util.basic import get_by_name class AbsorbSignBiasIntoMultiThreshold(Transformation): diff --git a/src/finn/transformation/streamline/collapse_repeated.py b/src/finn/transformation/streamline/collapse_repeated.py index 19f1ec3e836f3ec38aa4b716f5d6a25ca0782197..50265046d94db1e7233a45b934fd68f08431a95d 100644 --- a/src/finn/transformation/streamline/collapse_repeated.py +++ b/src/finn/transformation/streamline/collapse_repeated.py @@ -28,15 +28,15 @@ from onnx import helper as oh +from finn.core.datatype import DataType from finn.transformation.base import Transformation from finn.transformation.infer_shapes import InferShapes -from finn.core.datatype import DataType class CollapseRepeatedOp(Transformation): """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. """ + return a tensor which gives the equivalent result using a single op.""" def __init__(self, op_name, make_collapsed_param_fxn): super().__init__() diff --git a/src/finn/transformation/streamline/remove.py b/src/finn/transformation/streamline/remove.py index 0abcf441f9636a52f9194df325874d293530f78a..27e420a7936c2d9203150d2d682bf45e1aff0638 100644 --- a/src/finn/transformation/streamline/remove.py +++ b/src/finn/transformation/streamline/remove.py @@ -27,9 +27,10 @@ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +import numpy as np + from finn.transformation.base import Transformation from finn.transformation.infer_shapes import InferShapes -import numpy as np def _remove_node_and_rewire(model, node): diff --git a/src/finn/transformation/streamline/reorder.py b/src/finn/transformation/streamline/reorder.py index 4049d7bc8b555dce6f3ab6f9475f6aebf41fbc2c..1b22f474abe3f59ac91551efa3661b2612442776 100644 --- a/src/finn/transformation/streamline/reorder.py +++ b/src/finn/transformation/streamline/reorder.py @@ -28,19 +28,19 @@ import numpy as np import warnings -from onnx import helper as oh from onnx import TensorProto +from onnx import helper as oh -from finn.transformation.base import Transformation import finn.core.data_layout as DataLayout -from finn.transformation.infer_shapes import InferShapes -from finn.transformation.infer_datatypes import InferDataTypes -from finn.transformation.infer_data_layouts import InferDataLayouts from finn.core.datatype import DataType from finn.core.onnx_exec import execute_node -from finn.util.basic import get_by_name from finn.custom_op.registry import getCustomOp +from finn.transformation.base import Transformation from finn.transformation.general import SortGraph +from finn.transformation.infer_data_layouts import InferDataLayouts +from finn.transformation.infer_datatypes import InferDataTypes +from finn.transformation.infer_shapes import InferShapes +from finn.util.basic import get_by_name class MoveAddPastMul(Transformation): diff --git a/src/finn/util/imagenet.py b/src/finn/util/imagenet.py index 71ed9d9d260e2b38b5d9ec47f728ad401e526ca8..abd412e8d963cbcc80370298fb833de86a218c41 100644 --- a/src/finn/util/imagenet.py +++ b/src/finn/util/imagenet.py @@ -26,11 +26,12 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -import os import numpy as np +import os from PIL import Image + from finn.core.data_layout import NCHW, NHWC -from finn.util.test import resize_smaller_side, crop_center +from finn.util.test import crop_center, resize_smaller_side def get_val_images(n_images=100, interleave_classes=False): diff --git a/src/finn/util/pytorch.py b/src/finn/util/pytorch.py index f174c24601578cf827cb0da770f29889344e62b8..18010083f7beb8c71c3a6ae5abae075d51e57cf9 100644 --- a/src/finn/util/pytorch.py +++ b/src/finn/util/pytorch.py @@ -26,7 +26,6 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. import torch - from torch.nn import Module, Sequential diff --git a/src/finn/util/test.py b/src/finn/util/test.py index 0a34751786170a03361d6a17a24c7250c5ce49fd..9c5462ae7f3ca3122fe672f8f01e939e398963a8 100644 --- a/src/finn/util/test.py +++ b/src/finn/util/test.py @@ -26,22 +26,25 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -import onnx -import onnx.numpy_helper as nph import pkg_resources as pk -from pkgutil import get_data -from brevitas_examples import bnn_pynq, imagenet_classification -import numpy as np + import pytest + +import numpy as np +import onnx +import onnx.numpy_helper as nph +import os +import torchvision.transforms.functional as torchvision_util import warnings +from brevitas_examples import bnn_pynq, imagenet_classification +from pkgutil import get_data + from finn.core.modelwrapper import ModelWrapper -import os -from finn.util.basic import pynq_part_map, alveo_part_map, alveo_default_platform +from finn.core.onnx_exec import execute_onnx +from finn.custom_op.registry import getCustomOp from finn.transformation.fpgadataflow.make_zynq_proj import ZynqBuild from finn.transformation.fpgadataflow.vitis_build import VitisBuild, VitisOptStrategy -from finn.custom_op.registry import getCustomOp -from finn.core.onnx_exec import execute_onnx -import torchvision.transforms.functional as torchvision_util +from finn.util.basic import alveo_default_platform, alveo_part_map, pynq_part_map # map of (wbits,abits) -> model example_map = { diff --git a/src/finn/util/vcd.py b/src/finn/util/vcd.py index a4400f7bd7e75549189f081ce255fd67c49b3746..6a5a68f09930783f5a4e094ea88d6eeb9e07b99a 100644 --- a/src/finn/util/vcd.py +++ b/src/finn/util/vcd.py @@ -26,9 +26,10 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +import multiprocessing as mp from vcdvcd import VCDVCD + from finn.util.basic import get_num_default_workers -import multiprocessing as mp # string patterns to search for to find particular interfaces # streaming interfaces @@ -162,7 +163,9 @@ def _get_stats(x): return (x[0], get_stream_if_stats(x[1], x[0])) -def get_all_stream_if_stats(vcd_file, stream_ifs=None, sort_by="{'V': 1, 'R': 0}", num_workers=None): +def get_all_stream_if_stats( + vcd_file, stream_ifs=None, sort_by="{'V': 1, 'R': 0}", num_workers=None +): """Return a list of streaming interface stats, sorted by the percentage for the given sort_by key. If stream_ifs is None, all streaming interface stats will be returned, otherwise treated as a list of interface names to diff --git a/src/finn/util/visualization.py b/src/finn/util/visualization.py index d8547a32e06aa3b688601aa550abb2c50bcf77d6..ede7865eab3bc6ce48f9870c7b4e4a171e2ed133 100644 --- a/src/finn/util/visualization.py +++ b/src/finn/util/visualization.py @@ -27,8 +27,8 @@ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. import inspect -import os import netron +import os from IPython.display import IFrame diff --git a/tests/brevitas/test_brevitas_QConv2d.py b/tests/brevitas/test_brevitas_QConv2d.py index 5f124690d7c1f266f074351abe690abdd3ae5a2c..c1f790946bfa5f53194b96b1fea9c1722797a4a0 100644 --- a/tests/brevitas/test_brevitas_QConv2d.py +++ b/tests/brevitas/test_brevitas_QConv2d.py @@ -27,19 +27,20 @@ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. import pytest -import os + +import brevitas.onnx as bo import numpy as np +import os import torch -import brevitas.onnx as bo -from brevitas.nn import QuantConv2d -from brevitas.core.restrict_val import RestrictValueType from brevitas.core.quant import QuantType +from brevitas.core.restrict_val import RestrictValueType from brevitas.core.scaling import ScalingImplType from brevitas.core.stats import StatsOp +from brevitas.nn import QuantConv2d -from finn.core.modelwrapper import ModelWrapper -from finn.core.datatype import DataType import finn.core.onnx_exec as oxe +from finn.core.datatype import DataType +from finn.core.modelwrapper import ModelWrapper from finn.transformation.infer_shapes import InferShapes from finn.util.basic import gen_finn_dt_tensor diff --git a/tests/brevitas/test_brevitas_avg_pool_export.py b/tests/brevitas/test_brevitas_avg_pool_export.py index 4b88b0f787fb7780079ee82d6802d5cbff410748..68e563da6351dad6e61d5a2d1ffcbfed9859d0f5 100644 --- a/tests/brevitas/test_brevitas_avg_pool_export.py +++ b/tests/brevitas/test_brevitas_avg_pool_export.py @@ -25,22 +25,21 @@ # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -import os - -import torch -import numpy as np import pytest -import finn.core.onnx_exec as oxe -from finn.core.modelwrapper import ModelWrapper -from finn.core.datatype import DataType -from finn.transformation.infer_shapes import InferShapes -from finn.transformation.infer_datatypes import InferDataTypes -from finn.util.basic import gen_finn_dt_tensor +import numpy as np +import os +import torch from brevitas.export import FINNManager from brevitas.nn import QuantAvgPool2d from brevitas.quant_tensor import QuantTensor +import finn.core.onnx_exec as oxe +from finn.core.datatype import DataType +from finn.core.modelwrapper import ModelWrapper +from finn.transformation.infer_datatypes import InferDataTypes +from finn.transformation.infer_shapes import InferShapes +from finn.util.basic import gen_finn_dt_tensor export_onnx_path = "test_brevitas_avg_pool_export.onnx" diff --git a/tests/brevitas/test_brevitas_cnv.py b/tests/brevitas/test_brevitas_cnv.py index 4b072535bdfe102a6c59ebd4c730de9ae827c00e..8a1783ae9468244ad7e0999b59c3c7b696682dae 100644 --- a/tests/brevitas/test_brevitas_cnv.py +++ b/tests/brevitas/test_brevitas_cnv.py @@ -26,19 +26,20 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -import os import pkg_resources as pk + import pytest import brevitas.onnx as bo import numpy as np +import os import torch import finn.core.onnx_exec as oxe from finn.core.modelwrapper import ModelWrapper from finn.transformation.fold_constants import FoldConstants -from finn.transformation.infer_shapes import InferShapes from finn.transformation.general import GiveUniqueNodeNames, RemoveStaticGraphInputs +from finn.transformation.infer_shapes import InferShapes from finn.util.test import get_test_model_trained export_onnx_path = "test_brevitas_cnv.onnx" diff --git a/tests/brevitas/test_brevitas_debug.py b/tests/brevitas/test_brevitas_debug.py index 9115352796b0b90257d64ce9b14163ad372c9c98..4418368350b627644c76a7483c5c5dfaf031cda0 100644 --- a/tests/brevitas/test_brevitas_debug.py +++ b/tests/brevitas/test_brevitas_debug.py @@ -26,14 +26,13 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -from pkgutil import get_data - -import os import brevitas.onnx as bo import numpy as np import onnx import onnx.numpy_helper as nph +import os import torch +from pkgutil import get_data import finn.core.onnx_exec as oxe from finn.core.modelwrapper import ModelWrapper diff --git a/tests/brevitas/test_brevitas_fc.py b/tests/brevitas/test_brevitas_fc.py index 24a453007515ba2eba4369a6b76829099f722168..b280ab9e116f8b4735f31d16e08d8f1055470155 100644 --- a/tests/brevitas/test_brevitas_fc.py +++ b/tests/brevitas/test_brevitas_fc.py @@ -26,8 +26,6 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -from pkgutil import get_data - import pytest import brevitas.onnx as bo @@ -35,6 +33,7 @@ import numpy as np import onnx import onnx.numpy_helper as nph import torch +from pkgutil import get_data import finn.core.onnx_exec as oxe from finn.core.modelwrapper import ModelWrapper @@ -46,6 +45,7 @@ from finn.util.test import get_test_model_trained export_onnx_path = make_build_dir("test_brevitas_fc_") + # act bits @pytest.mark.parametrize("abits", [1, 2]) # weight bits diff --git a/tests/brevitas/test_brevitas_mobilenet.py b/tests/brevitas/test_brevitas_mobilenet.py index 98a18403e79366aca184559a8b868f30aa27c35e..eb642adada9bd9abb8a328518770899d3da96ada 100644 --- a/tests/brevitas/test_brevitas_mobilenet.py +++ b/tests/brevitas/test_brevitas_mobilenet.py @@ -26,29 +26,31 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -from PIL import Image -import numpy as np -import brevitas.onnx as bo import pytest + +import brevitas.onnx as bo +import numpy as np import torch -from finn.util.basic import make_build_dir -from finn.util.pytorch import NormalizePreProc -from finn.util.test import get_test_model_trained, resize_smaller_side, crop_center -from finn.core.modelwrapper import ModelWrapper +from PIL import Image + +import finn.core.onnx_exec as oxe +import finn.transformation.streamline.absorb as absorb from finn.core.datatype import DataType -from finn.transformation.infer_shapes import InferShapes -from finn.transformation.infer_data_layouts import InferDataLayouts +from finn.core.modelwrapper import ModelWrapper from finn.transformation.fold_constants import FoldConstants -from finn.transformation.infer_datatypes import InferDataTypes from finn.transformation.general import ( GiveReadableTensorNames, GiveUniqueNodeNames, GiveUniqueParameterTensors, ) -from finn.transformation.merge_onnx_models import MergeONNXModels -import finn.transformation.streamline.absorb as absorb +from finn.transformation.infer_data_layouts import InferDataLayouts +from finn.transformation.infer_datatypes import InferDataTypes +from finn.transformation.infer_shapes import InferShapes from finn.transformation.insert_topk import InsertTopK -import finn.core.onnx_exec as oxe +from finn.transformation.merge_onnx_models import MergeONNXModels +from finn.util.basic import make_build_dir +from finn.util.pytorch import NormalizePreProc +from finn.util.test import crop_center, get_test_model_trained, resize_smaller_side @pytest.mark.xfail diff --git a/tests/brevitas/test_brevitas_non_scaled_QuantHardTanh_export.py b/tests/brevitas/test_brevitas_non_scaled_QuantHardTanh_export.py index 37ea12ac0f6387b1ab6669bce4aaaaaa60e87b58..6ddf71a5cba14916e3bcb13e65b1da2f4fddc63f 100644 --- a/tests/brevitas/test_brevitas_non_scaled_QuantHardTanh_export.py +++ b/tests/brevitas/test_brevitas_non_scaled_QuantHardTanh_export.py @@ -26,19 +26,21 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -import os -import onnx # noqa +import pytest + +import brevitas.onnx as bo import numpy as np +import onnx # noqa +import os import torch -import brevitas.onnx as bo -from brevitas.nn import QuantHardTanh +from brevitas.core.quant import QuantType from brevitas.core.restrict_val import RestrictValueType from brevitas.core.scaling import ScalingImplType -import pytest -from finn.core.modelwrapper import ModelWrapper +from brevitas.nn import QuantHardTanh + import finn.core.onnx_exec as oxe +from finn.core.modelwrapper import ModelWrapper from finn.transformation.infer_shapes import InferShapes -from brevitas.core.quant import QuantType export_onnx_path = "test_brevitas_non_scaled_QuantHardTanh_export.onnx" diff --git a/tests/brevitas/test_brevitas_qlinear.py b/tests/brevitas/test_brevitas_qlinear.py index 62ed358dc9030c35e865921ca7cf9e80c34020fd..873866b37727730b7cedd035f5edd93f7c1afe32 100644 --- a/tests/brevitas/test_brevitas_qlinear.py +++ b/tests/brevitas/test_brevitas_qlinear.py @@ -27,15 +27,17 @@ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. import pytest -import os + +import brevitas.onnx as bo import numpy as np +import os import torch -import brevitas.onnx as bo -from brevitas.nn import QuantLinear from brevitas.core.quant import QuantType -from finn.core.modelwrapper import ModelWrapper -from finn.core.datatype import DataType +from brevitas.nn import QuantLinear + import finn.core.onnx_exec as oxe +from finn.core.datatype import DataType +from finn.core.modelwrapper import ModelWrapper from finn.transformation.infer_shapes import InferShapes from finn.util.basic import gen_finn_dt_tensor diff --git a/tests/brevitas/test_brevitas_relu_act_export.py b/tests/brevitas/test_brevitas_relu_act_export.py index 278f05a4a9f264d69461e555d28437cdc83e1a71..bb59a8414feffbb8362de629f8b30ac200a5227f 100644 --- a/tests/brevitas/test_brevitas_relu_act_export.py +++ b/tests/brevitas/test_brevitas_relu_act_export.py @@ -26,18 +26,20 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -import os -import onnx # noqa +import pytest + +import brevitas.onnx as bo import numpy as np +import onnx # noqa +import os import torch -import brevitas.onnx as bo -from brevitas.nn import QuantReLU from brevitas.core.quant import QuantType from brevitas.core.restrict_val import RestrictValueType from brevitas.core.scaling import ScalingImplType -import pytest -from finn.core.modelwrapper import ModelWrapper +from brevitas.nn import QuantReLU + import finn.core.onnx_exec as oxe +from finn.core.modelwrapper import ModelWrapper from finn.transformation.infer_shapes import InferShapes export_onnx_path = "test_brevitas_relu_act_export.onnx" diff --git a/tests/brevitas/test_brevitas_scaled_QHardTanh_export.py b/tests/brevitas/test_brevitas_scaled_QHardTanh_export.py index b1652c1cdce881157c6e97dcfde4257902678c8f..345fae872119c75aa8e85cb5812c94dfc15bad7f 100644 --- a/tests/brevitas/test_brevitas_scaled_QHardTanh_export.py +++ b/tests/brevitas/test_brevitas_scaled_QHardTanh_export.py @@ -26,18 +26,20 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +import pytest + +import brevitas.onnx as bo +import numpy as np import onnx # noqa import os -import numpy as np import torch -import brevitas.onnx as bo -from brevitas.nn import QuantHardTanh -from brevitas.core.restrict_val import RestrictValueType from brevitas.core.quant import QuantType +from brevitas.core.restrict_val import RestrictValueType from brevitas.core.scaling import ScalingImplType -import pytest -from finn.core.modelwrapper import ModelWrapper +from brevitas.nn import QuantHardTanh + import finn.core.onnx_exec as oxe +from finn.core.modelwrapper import ModelWrapper from finn.transformation.infer_shapes import InferShapes export_onnx_path = "test_brevitas_scaled_QHardTanh_export.onnx" diff --git a/tests/brevitas/test_brevitas_validate_mobilenet.py b/tests/brevitas/test_brevitas_validate_mobilenet.py index dd079fe2e27ace85b9a08e699fa437e93f8e7f3d..12e7e7aff2ec2ebae3e2ec7713a24046553dc5f2 100644 --- a/tests/brevitas/test_brevitas_validate_mobilenet.py +++ b/tests/brevitas/test_brevitas_validate_mobilenet.py @@ -26,33 +26,35 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -import os +import pytest + +import brevitas.onnx as bo import csv import numpy as np -import brevitas.onnx as bo +import os import torch -from finn.util.basic import make_build_dir -from finn.util.pytorch import NormalizePreProc -from finn.util.test import get_test_model_trained +import torchvision.datasets as datasets +import torchvision.transforms as transforms + +import finn.core.onnx_exec as oxe +import finn.transformation.streamline.absorb as absorb +import finn.util.imagenet as imagenet_util from finn.core.modelwrapper import ModelWrapper -from finn.transformation.infer_shapes import InferShapes -from finn.transformation.infer_data_layouts import InferDataLayouts from finn.transformation.fold_constants import FoldConstants -from finn.transformation.general import RemoveStaticGraphInputs -from finn.transformation.infer_datatypes import InferDataTypes from finn.transformation.general import ( GiveReadableTensorNames, GiveUniqueNodeNames, GiveUniqueParameterTensors, + RemoveStaticGraphInputs, ) -from finn.transformation.merge_onnx_models import MergeONNXModels -import finn.transformation.streamline.absorb as absorb +from finn.transformation.infer_data_layouts import InferDataLayouts +from finn.transformation.infer_datatypes import InferDataTypes +from finn.transformation.infer_shapes import InferShapes from finn.transformation.insert_topk import InsertTopK -import finn.core.onnx_exec as oxe -import finn.util.imagenet as imagenet_util -import pytest -import torchvision.datasets as datasets -import torchvision.transforms as transforms +from finn.transformation.merge_onnx_models import MergeONNXModels +from finn.util.basic import make_build_dir +from finn.util.pytorch import NormalizePreProc +from finn.util.test import get_test_model_trained # normalization (preprocessing) settings for MobileNet-v1 w4a4 mean = [0.485, 0.456, 0.406] diff --git a/tests/end2end/test_end2end_access_board.py b/tests/end2end/test_end2end_access_board.py index 21b495c74ca8179e1f9e1e3955e665c4c81763b8..ee15980ffb1b750c993a4b499dce57a1b8133e57 100644 --- a/tests/end2end/test_end2end_access_board.py +++ b/tests/end2end/test_end2end_access_board.py @@ -27,7 +27,9 @@ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. import pytest + import subprocess + from finn.util.test import get_build_env diff --git a/tests/end2end/test_end2end_bnn_pynq.py b/tests/end2end/test_end2end_bnn_pynq.py index a6e7ad642222936775293ec145e845ef111dd4d3..00a9fa721a320a8b70ee913e878955b9caddc3bf 100644 --- a/tests/end2end/test_end2end_bnn_pynq.py +++ b/tests/end2end/test_end2end_bnn_pynq.py @@ -26,77 +26,76 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -import os import pytest +import brevitas.onnx as bo import numpy as np # as of Feb'20 there is a bug that segfaults ONNX shape inference if we # import pytorch before onnx, so we make sure to import onnx first import onnx # NOQA +import os +import subprocess import torch -import brevitas.onnx as bo +import warnings +from collections import OrderedDict +from dataset_loading import cifar, mnist +from datetime import datetime +from scipy.stats import linregress import finn.transformation.fpgadataflow.convert_to_hls_layers as to_hls import finn.transformation.streamline.absorb as absorb +from finn.analysis.fpgadataflow.dataflow_performance import dataflow_performance +from finn.core.datatype import DataType +from finn.core.modelwrapper import ModelWrapper from finn.core.onnx_exec import execute_onnx +from finn.core.throughput_test import throughput_test_remote, throughput_test_rtlsim from finn.custom_op.registry import getCustomOp from finn.transformation.bipolar_to_xnor import ConvertBipolarMatMulToXnorPopcount from finn.transformation.fold_constants import FoldConstants - +from finn.transformation.fpgadataflow.annotate_cycles import AnnotateCycles +from finn.transformation.fpgadataflow.annotate_resources import AnnotateResources +from finn.transformation.fpgadataflow.compile_cppsim import CompileCppSim from finn.transformation.fpgadataflow.create_dataflow_partition import ( CreateDataflowPartition, ) +from finn.transformation.fpgadataflow.create_stitched_ip import CreateStitchedIP +from finn.transformation.fpgadataflow.hlssynth_ip import HLSSynthIP +from finn.transformation.fpgadataflow.insert_dwc import InsertDWC from finn.transformation.fpgadataflow.make_deployment import DeployToPYNQ +from finn.transformation.fpgadataflow.prepare_cppsim import PrepareCppSim +from finn.transformation.fpgadataflow.prepare_ip import PrepareIP +from finn.transformation.fpgadataflow.prepare_rtlsim import PrepareRTLSim +from finn.transformation.fpgadataflow.set_exec_mode import SetExecMode +from finn.transformation.fpgadataflow.set_fifo_depths import InsertAndSetFIFODepths from finn.transformation.general import ( - RemoveUnusedTensors, - RemoveStaticGraphInputs, GiveReadableTensorNames, GiveUniqueNodeNames, + RemoveStaticGraphInputs, + RemoveUnusedTensors, ) +from finn.transformation.infer_data_layouts import InferDataLayouts from finn.transformation.infer_datatypes import InferDataTypes from finn.transformation.infer_shapes import InferShapes -from finn.transformation.streamline import Streamline -from finn.util.test import ( - get_build_env, - load_test_checkpoint_or_skip, - get_example_input, - get_trained_network_and_ishape, - execute_parent, - get_topk, -) -from finn.transformation.fpgadataflow.annotate_resources import AnnotateResources -from finn.transformation.infer_data_layouts import InferDataLayouts -from finn.transformation.move_reshape import RemoveCNVtoFCFlatten +from finn.transformation.insert_topk import InsertTopK from finn.transformation.lower_convs_to_matmul import LowerConvsToMatMul +from finn.transformation.merge_onnx_models import MergeONNXModels +from finn.transformation.move_reshape import RemoveCNVtoFCFlatten +from finn.transformation.streamline import Streamline from finn.transformation.streamline.reorder import ( MakeMaxPoolNHWC, MoveScalarLinearPastInvariants, ) -import warnings -from finn.transformation.fpgadataflow.prepare_ip import PrepareIP -from finn.transformation.fpgadataflow.hlssynth_ip import HLSSynthIP -from finn.transformation.fpgadataflow.prepare_cppsim import PrepareCppSim -from finn.transformation.fpgadataflow.compile_cppsim import CompileCppSim -from finn.transformation.fpgadataflow.set_exec_mode import SetExecMode -from finn.transformation.fpgadataflow.create_stitched_ip import CreateStitchedIP -from finn.transformation.fpgadataflow.prepare_rtlsim import PrepareRTLSim -from finn.transformation.fpgadataflow.insert_dwc import InsertDWC -from finn.transformation.fpgadataflow.annotate_cycles import AnnotateCycles -from finn.transformation.fpgadataflow.set_fifo_depths import InsertAndSetFIFODepths -from finn.analysis.fpgadataflow.dataflow_performance import dataflow_performance -from finn.core.modelwrapper import ModelWrapper -from scipy.stats import linregress -from finn.core.throughput_test import throughput_test_remote, throughput_test_rtlsim -from finn.util.pytorch import ToTensor -from finn.transformation.merge_onnx_models import MergeONNXModels -from finn.transformation.insert_topk import InsertTopK -from finn.core.datatype import DataType -from dataset_loading import mnist, cifar -from datetime import datetime -import subprocess from finn.util.gdrive import upload_to_end2end_dashboard -from collections import OrderedDict +from finn.util.pytorch import ToTensor +from finn.util.test import ( + execute_parent, + get_build_env, + get_example_input, + get_topk, + get_trained_network_and_ishape, + load_test_checkpoint_or_skip, +) build_dir = os.environ["FINN_BUILD_DIR"] target_clk_ns = 10 diff --git a/tests/end2end/test_end2end_cybsec_mlp.py b/tests/end2end/test_end2end_cybsec_mlp.py index 63d6a91e37586030a15c9a7c2523679875444f3f..7b4cebb52b3e4758746d4054827c6f96e8a4d681 100644 --- a/tests/end2end/test_end2end_cybsec_mlp.py +++ b/tests/end2end/test_end2end_cybsec_mlp.py @@ -26,27 +26,29 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +import pkg_resources as pk + +import pytest + +import brevitas.onnx as bo +import json +import numpy as np +import os +import shutil +import subprocess import torch -from brevitas.nn import QuantLinear, QuantReLU -from brevitas.quant_tensor import QuantTensor import torch.nn as nn -import numpy as np +import wget from brevitas.core.quant import QuantType -from brevitas.nn import QuantIdentity -import brevitas.onnx as bo -from finn.core.modelwrapper import ModelWrapper -from finn.core.datatype import DataType +from brevitas.nn import QuantIdentity, QuantLinear, QuantReLU +from brevitas.quant_tensor import QuantTensor + import finn.builder.build_dataflow as build import finn.builder.build_dataflow_config as build_cfg -import os -import shutil -from finn.util.test import get_build_env, load_test_checkpoint_or_skip -import pytest +from finn.core.datatype import DataType +from finn.core.modelwrapper import ModelWrapper from finn.util.basic import make_build_dir -import pkg_resources as pk -import json -import wget -import subprocess +from finn.util.test import get_build_env, load_test_checkpoint_or_skip target_clk_ns = 10 build_kind = "zynq" diff --git a/tests/end2end/test_end2end_mobilenet_v1.py b/tests/end2end/test_end2end_mobilenet_v1.py index 5bfe8e1ea1b48ed77c40a584d624cc0ecdedb668..1289b02636f030397075a9f580ed0977cd465a88 100644 --- a/tests/end2end/test_end2end_mobilenet_v1.py +++ b/tests/end2end/test_end2end_mobilenet_v1.py @@ -25,57 +25,55 @@ # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -import time import pytest -from PIL import Image -import os -import numpy as np import brevitas.onnx as bo +import numpy as np +import os +import time import torch +from PIL import Image -from finn.custom_op.registry import getCustomOp -from finn.util.pytorch import NormalizePreProc -from finn.util.test import ( - get_test_model_trained, - load_test_checkpoint_or_skip, - resize_smaller_side, - crop_center, -) - -from finn.core.modelwrapper import ModelWrapper +import finn.transformation.fpgadataflow.convert_to_hls_layers as to_hls +import finn.transformation.streamline.absorb as absorb +import finn.transformation.streamline.reorder as reorder from finn.core.datatype import DataType - -from finn.transformation.infer_shapes import InferShapes -from finn.transformation.infer_data_layouts import InferDataLayouts +from finn.core.modelwrapper import ModelWrapper +from finn.core.onnx_exec import execute_onnx +from finn.custom_op.registry import getCustomOp +from finn.transformation.change_datalayout import ChangeDataLayoutQuantAvgPool2d +from finn.transformation.double_to_single_float import DoubleToSingleFloat from finn.transformation.fold_constants import FoldConstants -from finn.transformation.infer_datatypes import InferDataTypes +from finn.transformation.fpgadataflow.compile_cppsim import CompileCppSim +from finn.transformation.fpgadataflow.create_dataflow_partition import ( + CreateDataflowPartition, +) +from finn.transformation.fpgadataflow.prepare_cppsim import PrepareCppSim +from finn.transformation.fpgadataflow.set_exec_mode import SetExecMode from finn.transformation.general import ( GiveReadableTensorNames, GiveUniqueNodeNames, GiveUniqueParameterTensors, RemoveUnusedTensors, ) -from finn.transformation.merge_onnx_models import MergeONNXModels +from finn.transformation.infer_data_layouts import InferDataLayouts +from finn.transformation.infer_datatypes import InferDataTypes +from finn.transformation.infer_shapes import InferShapes from finn.transformation.insert_topk import InsertTopK -import finn.transformation.streamline.absorb as absorb -import finn.transformation.streamline.reorder as reorder +from finn.transformation.lower_convs_to_matmul import LowerConvsToMatMul +from finn.transformation.merge_onnx_models import MergeONNXModels from finn.transformation.streamline import Streamline -from finn.transformation.double_to_single_float import DoubleToSingleFloat -from finn.transformation.streamline.remove import RemoveIdentityOps from finn.transformation.streamline.collapse_repeated import CollapseRepeatedMul -from finn.transformation.change_datalayout import ChangeDataLayoutQuantAvgPool2d +from finn.transformation.streamline.remove import RemoveIdentityOps from finn.transformation.streamline.round_thresholds import RoundAndClipThresholds -from finn.transformation.lower_convs_to_matmul import LowerConvsToMatMul -import finn.transformation.fpgadataflow.convert_to_hls_layers as to_hls -from finn.transformation.fpgadataflow.create_dataflow_partition import ( - CreateDataflowPartition, +from finn.util.basic import alveo_default_platform, alveo_part_map +from finn.util.pytorch import NormalizePreProc +from finn.util.test import ( + crop_center, + get_test_model_trained, + load_test_checkpoint_or_skip, + resize_smaller_side, ) -from finn.transformation.fpgadataflow.set_exec_mode import SetExecMode -from finn.transformation.fpgadataflow.prepare_cppsim import PrepareCppSim -from finn.transformation.fpgadataflow.compile_cppsim import CompileCppSim -from finn.core.onnx_exec import execute_onnx -from finn.util.basic import alveo_part_map, alveo_default_platform build_dir = os.environ["FINN_BUILD_DIR"] diff --git a/tests/end2end/test_ext_weights.py b/tests/end2end/test_ext_weights.py index aa0ce7a6c6c6148ca28b58428ad60d7eb0347bea..550dab4d0321001547efe97487abc543271dcf2e 100644 --- a/tests/end2end/test_ext_weights.py +++ b/tests/end2end/test_ext_weights.py @@ -26,16 +26,19 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -import finn.builder.build_dataflow as build -import finn.builder.build_dataflow_config as build_cfg +import pkg_resources as pk + +import pytest + import os import shutil -from finn.util.test import get_build_env, load_test_checkpoint_or_skip -import pytest -from finn.util.basic import make_build_dir -import pkg_resources as pk -import wget import subprocess +import wget + +import finn.builder.build_dataflow as build +import finn.builder.build_dataflow_config as build_cfg +from finn.util.basic import make_build_dir +from finn.util.test import get_build_env, load_test_checkpoint_or_skip target_clk_ns = 10 build_kind = "zynq" diff --git a/tests/fpgadataflow/test_code_gen_trafo.py b/tests/fpgadataflow/test_code_gen_trafo.py index cf3e064804216e192909eae75f01880554f03d9f..89fab37d6d5225383ccb13a748c83573d6ee4516 100644 --- a/tests/fpgadataflow/test_code_gen_trafo.py +++ b/tests/fpgadataflow/test_code_gen_trafo.py @@ -26,10 +26,11 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -import os +import pytest +import os from onnx import TensorProto, helper -import pytest + import finn.util.basic as util from finn.core.datatype import DataType from finn.core.modelwrapper import ModelWrapper diff --git a/tests/fpgadataflow/test_compilation_trafo.py b/tests/fpgadataflow/test_compilation_trafo.py index a12c69285b7b335f075d8ffd7ba27e039ebc6f8c..6284748b9ccdc422b42bd9e301eb395d8dd1ad45 100644 --- a/tests/fpgadataflow/test_compilation_trafo.py +++ b/tests/fpgadataflow/test_compilation_trafo.py @@ -26,16 +26,16 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -import os +import pytest +import os from onnx import TensorProto, helper -import pytest import finn.util.basic as util from finn.core.datatype import DataType from finn.core.modelwrapper import ModelWrapper -from finn.transformation.fpgadataflow.prepare_cppsim import PrepareCppSim from finn.transformation.fpgadataflow.compile_cppsim import CompileCppSim +from finn.transformation.fpgadataflow.prepare_cppsim import PrepareCppSim @pytest.mark.vivado diff --git a/tests/fpgadataflow/test_convert_to_hls_1d_conv_layer.py b/tests/fpgadataflow/test_convert_to_hls_1d_conv_layer.py index dfdb21fa72cbbeeb503f7ecc447b659ef7934fb9..4e7030449c87b81d7a492b0e76dd05a047be3858 100644 --- a/tests/fpgadataflow/test_convert_to_hls_1d_conv_layer.py +++ b/tests/fpgadataflow/test_convert_to_hls_1d_conv_layer.py @@ -26,30 +26,29 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -from onnx import TensorProto, helper -import numpy as np import pytest -from finn.core.datatype import DataType -from finn.transformation.infer_shapes import InferShapes -from finn.transformation.infer_datatypes import InferDataTypes -from finn.transformation.general import GiveUniqueNodeNames -from finn.transformation.lower_convs_to_matmul import LowerConvsToMatMul +import numpy as np +from onnx import TensorProto, helper -from finn.transformation.fpgadataflow.prepare_ip import PrepareIP -from finn.transformation.fpgadataflow.prepare_rtlsim import PrepareRTLSim -from finn.transformation.fpgadataflow.hlssynth_ip import HLSSynthIP import finn.core.onnx_exec as oxe -from finn.core.modelwrapper import ModelWrapper -from finn.util.basic import gen_finn_dt_tensor import finn.transformation.fpgadataflow.convert_to_hls_layers as to_hls - -from finn.transformation.fpgadataflow.prepare_cppsim import PrepareCppSim -from finn.transformation.fpgadataflow.compile_cppsim import CompileCppSim -from finn.transformation.fpgadataflow.set_exec_mode import SetExecMode +from finn.analysis.fpgadataflow.exp_cycles_per_layer import exp_cycles_per_layer +from finn.core.datatype import DataType +from finn.core.modelwrapper import ModelWrapper from finn.custom_op.general.im2col import compute_conv_output_dim from finn.custom_op.registry import getCustomOp -from finn.analysis.fpgadataflow.exp_cycles_per_layer import exp_cycles_per_layer +from finn.transformation.fpgadataflow.compile_cppsim import CompileCppSim +from finn.transformation.fpgadataflow.hlssynth_ip import HLSSynthIP +from finn.transformation.fpgadataflow.prepare_cppsim import PrepareCppSim +from finn.transformation.fpgadataflow.prepare_ip import PrepareIP +from finn.transformation.fpgadataflow.prepare_rtlsim import PrepareRTLSim +from finn.transformation.fpgadataflow.set_exec_mode import SetExecMode +from finn.transformation.general import GiveUniqueNodeNames +from finn.transformation.infer_datatypes import InferDataTypes +from finn.transformation.infer_shapes import InferShapes +from finn.transformation.lower_convs_to_matmul import LowerConvsToMatMul +from finn.util.basic import gen_finn_dt_tensor # conv_config: diff --git a/tests/fpgadataflow/test_convert_to_hls_channelwise_layer.py b/tests/fpgadataflow/test_convert_to_hls_channelwise_layer.py index 40f0a620c6cd5db873a731c038a737b35c1cce9d..8dd927fa7628d1500fe644b030278fbaa3f18810 100644 --- a/tests/fpgadataflow/test_convert_to_hls_channelwise_layer.py +++ b/tests/fpgadataflow/test_convert_to_hls_channelwise_layer.py @@ -28,24 +28,23 @@ import pytest +import numpy as np from onnx import TensorProto, helper import finn.core.onnx_exec as oxe +import finn.transformation.fpgadataflow.convert_to_hls_layers as to_hls from finn.core.datatype import DataType from finn.core.modelwrapper import ModelWrapper -import finn.transformation.fpgadataflow.convert_to_hls_layers as to_hls -from finn.transformation.fpgadataflow.prepare_ip import PrepareIP -from finn.transformation.fpgadataflow.prepare_cppsim import PrepareCppSim from finn.transformation.fpgadataflow.compile_cppsim import CompileCppSim from finn.transformation.fpgadataflow.hlssynth_ip import HLSSynthIP -from finn.transformation.fpgadataflow.set_exec_mode import SetExecMode - +from finn.transformation.fpgadataflow.prepare_cppsim import PrepareCppSim +from finn.transformation.fpgadataflow.prepare_ip import PrepareIP from finn.transformation.fpgadataflow.prepare_rtlsim import PrepareRTLSim -from finn.transformation.infer_data_layouts import InferDataLayouts +from finn.transformation.fpgadataflow.set_exec_mode import SetExecMode from finn.transformation.general import GiveUniqueNodeNames -from finn.util.basic import gen_finn_dt_tensor +from finn.transformation.infer_data_layouts import InferDataLayouts from finn.transformation.infer_shapes import InferShapes -import numpy as np +from finn.util.basic import gen_finn_dt_tensor def prepare_inputs(input_tensor): diff --git a/tests/fpgadataflow/test_convert_to_hls_conv_fc_transition.py b/tests/fpgadataflow/test_convert_to_hls_conv_fc_transition.py index 8b7b0a4b6a93cde690a3d87eb3a2f1a0a55a85f8..cf2903a5789d7d3892ac549338b274268c1661b3 100755 --- a/tests/fpgadataflow/test_convert_to_hls_conv_fc_transition.py +++ b/tests/fpgadataflow/test_convert_to_hls_conv_fc_transition.py @@ -26,34 +26,30 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -from onnx import TensorProto, helper -import numpy as np import pytest -from finn.core.datatype import DataType -from finn.transformation.infer_shapes import InferShapes -from finn.transformation.infer_datatypes import InferDataTypes -from finn.transformation.general import GiveUniqueNodeNames -from finn.transformation.lower_convs_to_matmul import LowerConvsToMatMul +import numpy as np +from onnx import TensorProto, helper +import finn.core.data_layout as DataLayout import finn.core.onnx_exec as oxe -from finn.core.modelwrapper import ModelWrapper -from finn.util.basic import gen_finn_dt_tensor import finn.transformation.fpgadataflow.convert_to_hls_layers as to_hls - -from finn.transformation.fpgadataflow.prepare_cppsim import PrepareCppSim +import finn.transformation.streamline.absorb as absorb +from finn.core.datatype import DataType +from finn.core.modelwrapper import ModelWrapper +from finn.custom_op.general.im2col import compute_conv_output_dim from finn.transformation.fpgadataflow.compile_cppsim import CompileCppSim +from finn.transformation.fpgadataflow.prepare_cppsim import PrepareCppSim from finn.transformation.fpgadataflow.set_exec_mode import SetExecMode -from finn.custom_op.general.im2col import compute_conv_output_dim - -import finn.transformation.streamline.absorb as absorb -from finn.transformation.general import RemoveUnusedTensors -from finn.transformation.streamline import Streamline +from finn.transformation.general import GiveUniqueNodeNames, RemoveUnusedTensors from finn.transformation.infer_data_layouts import InferDataLayouts +from finn.transformation.infer_datatypes import InferDataTypes +from finn.transformation.infer_shapes import InferShapes +from finn.transformation.lower_convs_to_matmul import LowerConvsToMatMul from finn.transformation.move_reshape import RemoveCNVtoFCFlatten +from finn.transformation.streamline import Streamline from finn.transformation.streamline.reorder import MoveScalarLinearPastInvariants - -import finn.core.data_layout as DataLayout +from finn.util.basic import gen_finn_dt_tensor def get_multithreshold_rand_params(channels, num_of_thres, seed=None): diff --git a/tests/fpgadataflow/test_convert_to_hls_conv_layer.py b/tests/fpgadataflow/test_convert_to_hls_conv_layer.py index d88576583eaacb7579b02bc00e4e0f9b77b16f7e..deca7c96127fdf03d9feb7504d5a6daebb41a5d5 100644 --- a/tests/fpgadataflow/test_convert_to_hls_conv_layer.py +++ b/tests/fpgadataflow/test_convert_to_hls_conv_layer.py @@ -26,30 +26,29 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -from onnx import TensorProto, helper -import numpy as np import pytest -from finn.core.datatype import DataType -from finn.transformation.infer_shapes import InferShapes -from finn.transformation.infer_datatypes import InferDataTypes -from finn.transformation.general import GiveUniqueNodeNames -from finn.transformation.lower_convs_to_matmul import LowerConvsToMatMul +import numpy as np +from onnx import TensorProto, helper -from finn.transformation.fpgadataflow.prepare_ip import PrepareIP -from finn.transformation.fpgadataflow.prepare_rtlsim import PrepareRTLSim -from finn.transformation.fpgadataflow.hlssynth_ip import HLSSynthIP import finn.core.onnx_exec as oxe -from finn.core.modelwrapper import ModelWrapper -from finn.util.basic import gen_finn_dt_tensor import finn.transformation.fpgadataflow.convert_to_hls_layers as to_hls - -from finn.transformation.fpgadataflow.prepare_cppsim import PrepareCppSim -from finn.transformation.fpgadataflow.compile_cppsim import CompileCppSim -from finn.transformation.fpgadataflow.set_exec_mode import SetExecMode +from finn.analysis.fpgadataflow.exp_cycles_per_layer import exp_cycles_per_layer +from finn.core.datatype import DataType +from finn.core.modelwrapper import ModelWrapper from finn.custom_op.general.im2col import compute_conv_output_dim from finn.custom_op.registry import getCustomOp -from finn.analysis.fpgadataflow.exp_cycles_per_layer import exp_cycles_per_layer +from finn.transformation.fpgadataflow.compile_cppsim import CompileCppSim +from finn.transformation.fpgadataflow.hlssynth_ip import HLSSynthIP +from finn.transformation.fpgadataflow.prepare_cppsim import PrepareCppSim +from finn.transformation.fpgadataflow.prepare_ip import PrepareIP +from finn.transformation.fpgadataflow.prepare_rtlsim import PrepareRTLSim +from finn.transformation.fpgadataflow.set_exec_mode import SetExecMode +from finn.transformation.general import GiveUniqueNodeNames +from finn.transformation.infer_datatypes import InferDataTypes +from finn.transformation.infer_shapes import InferShapes +from finn.transformation.lower_convs_to_matmul import LowerConvsToMatMul +from finn.util.basic import gen_finn_dt_tensor # conv_config kernel_size,stride, pad diff --git a/tests/fpgadataflow/test_convert_to_hls_layers_cnv.py b/tests/fpgadataflow/test_convert_to_hls_layers_cnv.py index 15bf160799826b0d50a0f043a56dd1fc2accdd12..37a1c8d8486a535c8ff87f4b06905b3059bba35a 100644 --- a/tests/fpgadataflow/test_convert_to_hls_layers_cnv.py +++ b/tests/fpgadataflow/test_convert_to_hls_layers_cnv.py @@ -26,29 +26,31 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -import os import pkg_resources as pk +import pytest + import brevitas.onnx as bo import numpy as np -import pytest +import os + import finn.core.onnx_exec as oxe +import finn.transformation.fpgadataflow.convert_to_hls_layers as to_hls import finn.transformation.streamline.absorb as absorb -from finn.transformation.streamline.reorder import MakeMaxPoolNHWC from finn.core.modelwrapper import ModelWrapper +from finn.custom_op.registry import getCustomOp +from finn.transformation.bipolar_to_xnor import ConvertBipolarMatMulToXnorPopcount from finn.transformation.fold_constants import FoldConstants +from finn.transformation.fpgadataflow.compile_cppsim import CompileCppSim +from finn.transformation.fpgadataflow.prepare_cppsim import PrepareCppSim +from finn.transformation.fpgadataflow.set_exec_mode import SetExecMode from finn.transformation.general import GiveReadableTensorNames, GiveUniqueNodeNames -from finn.transformation.infer_shapes import InferShapes from finn.transformation.infer_data_layouts import InferDataLayouts +from finn.transformation.infer_shapes import InferShapes +from finn.transformation.lower_convs_to_matmul import LowerConvsToMatMul from finn.transformation.streamline import Streamline +from finn.transformation.streamline.reorder import MakeMaxPoolNHWC from finn.util.test import get_test_model_trained -from finn.transformation.lower_convs_to_matmul import LowerConvsToMatMul -from finn.transformation.bipolar_to_xnor import ConvertBipolarMatMulToXnorPopcount -import finn.transformation.fpgadataflow.convert_to_hls_layers as to_hls -from finn.transformation.fpgadataflow.prepare_cppsim import PrepareCppSim -from finn.transformation.fpgadataflow.compile_cppsim import CompileCppSim -from finn.transformation.fpgadataflow.set_exec_mode import SetExecMode -from finn.custom_op.registry import getCustomOp export_onnx_path_cnv = "test_convert_to_hls_layers_cnv.onnx" diff --git a/tests/fpgadataflow/test_convert_to_hls_layers_fc.py b/tests/fpgadataflow/test_convert_to_hls_layers_fc.py index cb66fa7237416579b509aa4f508c9105d386d08a..a1dc11e0eee5aab462beb0ec34b8771ced20a379 100644 --- a/tests/fpgadataflow/test_convert_to_hls_layers_fc.py +++ b/tests/fpgadataflow/test_convert_to_hls_layers_fc.py @@ -26,15 +26,16 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -import os -from pkgutil import get_data +import pytest import brevitas.onnx as bo import numpy as np import onnx import onnx.numpy_helper as nph +import os import torch -import pytest +from pkgutil import get_data + import finn.core.onnx_exec as oxe import finn.transformation.fpgadataflow.convert_to_hls_layers as to_hls import finn.transformation.streamline.absorb as absorb @@ -42,8 +43,8 @@ from finn.core.modelwrapper import ModelWrapper from finn.custom_op.registry import getCustomOp from finn.transformation.bipolar_to_xnor import ConvertBipolarMatMulToXnorPopcount from finn.transformation.fold_constants import FoldConstants -from finn.transformation.fpgadataflow.prepare_cppsim import PrepareCppSim from finn.transformation.fpgadataflow.compile_cppsim import CompileCppSim +from finn.transformation.fpgadataflow.prepare_cppsim import PrepareCppSim from finn.transformation.fpgadataflow.set_exec_mode import SetExecMode from finn.transformation.general import GiveReadableTensorNames, GiveUniqueNodeNames from finn.transformation.infer_shapes import InferShapes @@ -51,7 +52,6 @@ from finn.transformation.streamline import Streamline from finn.transformation.streamline.round_thresholds import RoundAndClipThresholds from finn.util.test import get_test_model_trained - export_onnx_path = "test_convert_to_hls_layers_fc.onnx" diff --git a/tests/fpgadataflow/test_convert_to_hls_layers_synthetic.py b/tests/fpgadataflow/test_convert_to_hls_layers_synthetic.py index 86875d2ac7f37e697c5de198e15aa3045a9e3d42..b0780c073114351ba136fefe6973114bd1a8505b 100644 --- a/tests/fpgadataflow/test_convert_to_hls_layers_synthetic.py +++ b/tests/fpgadataflow/test_convert_to_hls_layers_synthetic.py @@ -26,42 +26,43 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -import os -import numpy as np +import pytest +import numpy as np +import os from onnx import TensorProto, helper import finn.core.onnx_exec as oxe +import finn.transformation.fpgadataflow.convert_to_hls_layers as to_hls from finn.core.datatype import DataType from finn.core.modelwrapper import ModelWrapper from finn.transformation.fold_constants import FoldConstants +from finn.transformation.fpgadataflow.compile_cppsim import CompileCppSim +from finn.transformation.fpgadataflow.prepare_cppsim import PrepareCppSim +from finn.transformation.fpgadataflow.set_exec_mode import SetExecMode from finn.transformation.general import ( GiveReadableTensorNames, GiveUniqueNodeNames, SortGraph, ) -from finn.transformation.streamline.reorder import MoveScalarLinearPastInvariants -from finn.transformation.infer_shapes import InferShapes -from finn.transformation.infer_datatypes import InferDataTypes from finn.transformation.infer_data_layouts import InferDataLayouts -from finn.util.basic import gen_finn_dt_tensor -from finn.util.test import soft_verify_topk +from finn.transformation.infer_datatypes import InferDataTypes +from finn.transformation.infer_shapes import InferShapes from finn.transformation.insert_topk import InsertTopK -import finn.transformation.fpgadataflow.convert_to_hls_layers as to_hls -from finn.transformation.fpgadataflow.prepare_cppsim import PrepareCppSim -from finn.transformation.fpgadataflow.compile_cppsim import CompileCppSim -from finn.transformation.fpgadataflow.set_exec_mode import SetExecMode from finn.transformation.streamline.absorb import ( - AbsorbScalarMulAddIntoTopK, AbsorbConsecutiveTransposes, + AbsorbScalarMulAddIntoTopK, ) from finn.transformation.streamline.collapse_repeated import ( - CollapseRepeatedMul, CollapseRepeatedAdd, + CollapseRepeatedMul, ) -from finn.transformation.streamline.reorder import MoveAddPastMul - -import pytest +from finn.transformation.streamline.reorder import ( + MoveAddPastMul, + MoveScalarLinearPastInvariants, +) +from finn.util.basic import gen_finn_dt_tensor +from finn.util.test import soft_verify_topk export_onnx_path = "test_output_synthetic.onnx" diff --git a/tests/fpgadataflow/test_convert_to_hls_pool_batch.py b/tests/fpgadataflow/test_convert_to_hls_pool_batch.py index e8f3c3ae3290b5bdc23e46f7e9991222fdfac000..70716e88a4de827be37416b63a925b30d01c342a 100644 --- a/tests/fpgadataflow/test_convert_to_hls_pool_batch.py +++ b/tests/fpgadataflow/test_convert_to_hls_pool_batch.py @@ -28,23 +28,24 @@ import pytest -from onnx import TensorProto, helper import numpy as np +from onnx import TensorProto, helper + import finn.core.onnx_exec as oxe +import finn.transformation.fpgadataflow.convert_to_hls_layers as to_hls +from finn.analysis.fpgadataflow.exp_cycles_per_layer import exp_cycles_per_layer from finn.core.datatype import DataType from finn.core.modelwrapper import ModelWrapper -from finn.transformation.fpgadataflow.prepare_ip import PrepareIP -from finn.transformation.fpgadataflow.prepare_cppsim import PrepareCppSim +from finn.custom_op.registry import getCustomOp from finn.transformation.fpgadataflow.compile_cppsim import CompileCppSim from finn.transformation.fpgadataflow.hlssynth_ip import HLSSynthIP -from finn.transformation.fpgadataflow.set_exec_mode import SetExecMode +from finn.transformation.fpgadataflow.prepare_cppsim import PrepareCppSim +from finn.transformation.fpgadataflow.prepare_ip import PrepareIP from finn.transformation.fpgadataflow.prepare_rtlsim import PrepareRTLSim -import finn.transformation.fpgadataflow.convert_to_hls_layers as to_hls +from finn.transformation.fpgadataflow.set_exec_mode import SetExecMode from finn.transformation.general import GiveUniqueNodeNames -from finn.custom_op.registry import getCustomOp -from finn.util.basic import gen_finn_dt_tensor from finn.transformation.infer_shapes import InferShapes -from finn.analysis.fpgadataflow.exp_cycles_per_layer import exp_cycles_per_layer +from finn.util.basic import gen_finn_dt_tensor def make_single_maxpool_modelwrapper(k, stride, pad, ifm_ch, ifm_dim, ofm_dim, idt): diff --git a/tests/fpgadataflow/test_depthwise_convolution.py b/tests/fpgadataflow/test_depthwise_convolution.py index 3efeacb6e6875c6defa799eb7154e02ce880e16a..75ce055c0e9a093a5ddeab6b13af8d36d6152fb8 100644 --- a/tests/fpgadataflow/test_depthwise_convolution.py +++ b/tests/fpgadataflow/test_depthwise_convolution.py @@ -27,30 +27,29 @@ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. import pytest + +import numpy as np import onnx.helper as oh from onnx import TensorProto -import numpy as np -from finn.core.modelwrapper import ModelWrapper +import finn.core.onnx_exec as oxe from finn.core.datatype import DataType -from finn.transformation.infer_shapes import InferShapes +from finn.core.modelwrapper import ModelWrapper +from finn.custom_op.general.im2col import compute_conv_output_dim +from finn.custom_op.registry import getCustomOp +from finn.transformation.fpgadataflow.compile_cppsim import CompileCppSim from finn.transformation.fpgadataflow.convert_to_hls_layers import ( InferConvInpGen, InferVVAU, ) +from finn.transformation.fpgadataflow.hlssynth_ip import HLSSynthIP from finn.transformation.fpgadataflow.prepare_cppsim import PrepareCppSim -from finn.transformation.fpgadataflow.compile_cppsim import CompileCppSim -from finn.transformation.fpgadataflow.set_exec_mode import SetExecMode - -import finn.core.onnx_exec as oxe -from finn.custom_op.general.im2col import compute_conv_output_dim -from finn.util.basic import calculate_signed_dot_prod_range, gen_finn_dt_tensor -from finn.custom_op.registry import getCustomOp - from finn.transformation.fpgadataflow.prepare_ip import PrepareIP -from finn.transformation.fpgadataflow.hlssynth_ip import HLSSynthIP -from finn.transformation.general import GiveUniqueNodeNames from finn.transformation.fpgadataflow.prepare_rtlsim import PrepareRTLSim +from finn.transformation.fpgadataflow.set_exec_mode import SetExecMode +from finn.transformation.general import GiveUniqueNodeNames +from finn.transformation.infer_shapes import InferShapes +from finn.util.basic import calculate_signed_dot_prod_range, gen_finn_dt_tensor def set_up_reference_model(act, idt, wdt, k, ifm_dim, ifm_ch, stride, padding): diff --git a/tests/fpgadataflow/test_fpgadataflow_addstreams.py b/tests/fpgadataflow/test_fpgadataflow_addstreams.py index 0fa156e23b4a01270297e4e8e1fdc13a75eb5a59..021d58b4a382f2fe3d1a2c3c2a4ce8d7f3c87ae5 100644 --- a/tests/fpgadataflow/test_fpgadataflow_addstreams.py +++ b/tests/fpgadataflow/test_fpgadataflow_addstreams.py @@ -27,23 +27,23 @@ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. import pytest -import numpy as np +import numpy as np from onnx import TensorProto, helper import finn.core.onnx_exec as oxe +from finn.analysis.fpgadataflow.exp_cycles_per_layer import exp_cycles_per_layer from finn.core.datatype import DataType from finn.core.modelwrapper import ModelWrapper -from finn.transformation.fpgadataflow.prepare_ip import PrepareIP -from finn.transformation.fpgadataflow.prepare_cppsim import PrepareCppSim +from finn.custom_op.registry import getCustomOp from finn.transformation.fpgadataflow.compile_cppsim import CompileCppSim from finn.transformation.fpgadataflow.hlssynth_ip import HLSSynthIP +from finn.transformation.fpgadataflow.prepare_cppsim import PrepareCppSim +from finn.transformation.fpgadataflow.prepare_ip import PrepareIP +from finn.transformation.fpgadataflow.prepare_rtlsim import PrepareRTLSim from finn.transformation.fpgadataflow.set_exec_mode import SetExecMode from finn.transformation.general import GiveUniqueNodeNames -from finn.transformation.fpgadataflow.prepare_rtlsim import PrepareRTLSim from finn.util.basic import gen_finn_dt_tensor -from finn.custom_op.registry import getCustomOp -from finn.analysis.fpgadataflow.exp_cycles_per_layer import exp_cycles_per_layer def make_addstreams_modelwrapper(ch, pe, idt): @@ -62,7 +62,10 @@ def make_addstreams_modelwrapper(ch, pe, idt): inputDataType=idt.name, ) graph = helper.make_graph( - nodes=[addstreams_node], name="graph", inputs=[inp1, inp2], outputs=[outp], + nodes=[addstreams_node], + name="graph", + inputs=[inp1, inp2], + outputs=[outp], ) model = helper.make_model(graph, producer_name="addstreams-model") diff --git a/tests/fpgadataflow/test_fpgadataflow_channelwise_ops.py b/tests/fpgadataflow/test_fpgadataflow_channelwise_ops.py index e45dfe07c3abc0ce218dee0563055acb4458ccd0..15bcd5fa8a937aa313f2c73f253f934f6bbd332b 100644 --- a/tests/fpgadataflow/test_fpgadataflow_channelwise_ops.py +++ b/tests/fpgadataflow/test_fpgadataflow_channelwise_ops.py @@ -32,19 +32,19 @@ import numpy as np from onnx import TensorProto, helper import finn.core.onnx_exec as oxe +from finn.analysis.fpgadataflow.exp_cycles_per_layer import exp_cycles_per_layer from finn.analysis.fpgadataflow.hls_synth_res_estimation import hls_synth_res_estimation from finn.core.datatype import DataType from finn.core.modelwrapper import ModelWrapper -from finn.transformation.fpgadataflow.prepare_ip import PrepareIP -from finn.transformation.fpgadataflow.prepare_cppsim import PrepareCppSim +from finn.custom_op.registry import getCustomOp from finn.transformation.fpgadataflow.compile_cppsim import CompileCppSim from finn.transformation.fpgadataflow.hlssynth_ip import HLSSynthIP +from finn.transformation.fpgadataflow.prepare_cppsim import PrepareCppSim +from finn.transformation.fpgadataflow.prepare_ip import PrepareIP +from finn.transformation.fpgadataflow.prepare_rtlsim import PrepareRTLSim from finn.transformation.fpgadataflow.set_exec_mode import SetExecMode from finn.transformation.general import GiveUniqueNodeNames -from finn.transformation.fpgadataflow.prepare_rtlsim import PrepareRTLSim from finn.util.basic import gen_finn_dt_tensor -from finn.custom_op.registry import getCustomOp -from finn.analysis.fpgadataflow.exp_cycles_per_layer import exp_cycles_per_layer def make_modelwrapper(C, pe, idt, odt, pdt, func, vecs): diff --git a/tests/fpgadataflow/test_fpgadataflow_convinputgenerator.py b/tests/fpgadataflow/test_fpgadataflow_convinputgenerator.py index 1ec12263e22a199ac7da55fdf3418185cd38e555..86622cf6d44dbda3af417283f5ceea1d1ebc3bf0 100644 --- a/tests/fpgadataflow/test_fpgadataflow_convinputgenerator.py +++ b/tests/fpgadataflow/test_fpgadataflow_convinputgenerator.py @@ -27,25 +27,24 @@ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. import pytest -import numpy as np +import numpy as np from onnx import TensorProto, helper import finn.core.onnx_exec as oxe +from finn.analysis.fpgadataflow.exp_cycles_per_layer import exp_cycles_per_layer from finn.core.datatype import DataType from finn.core.modelwrapper import ModelWrapper -from finn.transformation.fpgadataflow.prepare_ip import PrepareIP -from finn.transformation.fpgadataflow.prepare_cppsim import PrepareCppSim +from finn.custom_op.registry import getCustomOp from finn.transformation.fpgadataflow.compile_cppsim import CompileCppSim from finn.transformation.fpgadataflow.hlssynth_ip import HLSSynthIP -from finn.transformation.fpgadataflow.set_exec_mode import SetExecMode +from finn.transformation.fpgadataflow.prepare_cppsim import PrepareCppSim +from finn.transformation.fpgadataflow.prepare_ip import PrepareIP from finn.transformation.fpgadataflow.prepare_rtlsim import PrepareRTLSim +from finn.transformation.fpgadataflow.set_exec_mode import SetExecMode from finn.transformation.general import GiveUniqueNodeNames from finn.util.basic import gen_finn_dt_tensor -from finn.custom_op.registry import getCustomOp -from finn.analysis.fpgadataflow.exp_cycles_per_layer import exp_cycles_per_layer - def make_single_im2col_modelwrapper( k, ifm_ch, ifm_dim, ofm_dim, simd, stride, dilation, idt diff --git a/tests/fpgadataflow/test_fpgadataflow_convinputgenerator1d.py b/tests/fpgadataflow/test_fpgadataflow_convinputgenerator1d.py index 6c83aab0d683cdb3888aca3c46bb339bd6330917..b3d695469b7a4fa1f4235feee29e7fc3dece0df5 100644 --- a/tests/fpgadataflow/test_fpgadataflow_convinputgenerator1d.py +++ b/tests/fpgadataflow/test_fpgadataflow_convinputgenerator1d.py @@ -27,26 +27,25 @@ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. import pytest -import numpy as np +import numpy as np from onnx import TensorProto, helper import finn.core.onnx_exec as oxe +from finn.analysis.fpgadataflow.exp_cycles_per_layer import exp_cycles_per_layer from finn.core.datatype import DataType from finn.core.modelwrapper import ModelWrapper -from finn.transformation.fpgadataflow.prepare_ip import PrepareIP -from finn.transformation.fpgadataflow.prepare_cppsim import PrepareCppSim +from finn.custom_op.general.im2col import compute_conv_output_dim +from finn.custom_op.registry import getCustomOp from finn.transformation.fpgadataflow.compile_cppsim import CompileCppSim from finn.transformation.fpgadataflow.hlssynth_ip import HLSSynthIP -from finn.transformation.fpgadataflow.set_exec_mode import SetExecMode +from finn.transformation.fpgadataflow.prepare_cppsim import PrepareCppSim +from finn.transformation.fpgadataflow.prepare_ip import PrepareIP from finn.transformation.fpgadataflow.prepare_rtlsim import PrepareRTLSim +from finn.transformation.fpgadataflow.set_exec_mode import SetExecMode from finn.transformation.general import GiveUniqueNodeNames from finn.util.basic import gen_finn_dt_tensor -from finn.custom_op.registry import getCustomOp -from finn.analysis.fpgadataflow.exp_cycles_per_layer import exp_cycles_per_layer -from finn.custom_op.general.im2col import compute_conv_output_dim - def make_single_im2col_modelwrapper( k, ifm_ch, ifm_dim, ofm_dim, simd, stride, dilation, idt diff --git a/tests/fpgadataflow/test_fpgadataflow_duplicatestreams.py b/tests/fpgadataflow/test_fpgadataflow_duplicatestreams.py index 12505fdf456aa55f881fb5f3d2d609080cc97074..6b776e8827d8e76102bd069ae8567051ed0580ba 100644 --- a/tests/fpgadataflow/test_fpgadataflow_duplicatestreams.py +++ b/tests/fpgadataflow/test_fpgadataflow_duplicatestreams.py @@ -27,25 +27,25 @@ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. import pytest -import numpy as np +import numpy as np from onnx import TensorProto, helper import finn.core.onnx_exec as oxe +from finn.analysis.fpgadataflow.exp_cycles_per_layer import exp_cycles_per_layer from finn.core.datatype import DataType from finn.core.modelwrapper import ModelWrapper -from finn.transformation.infer_shapes import InferShapes -from finn.transformation.infer_datatypes import InferDataTypes -from finn.transformation.fpgadataflow.prepare_ip import PrepareIP -from finn.transformation.fpgadataflow.prepare_cppsim import PrepareCppSim +from finn.custom_op.registry import getCustomOp from finn.transformation.fpgadataflow.compile_cppsim import CompileCppSim from finn.transformation.fpgadataflow.hlssynth_ip import HLSSynthIP +from finn.transformation.fpgadataflow.prepare_cppsim import PrepareCppSim +from finn.transformation.fpgadataflow.prepare_ip import PrepareIP +from finn.transformation.fpgadataflow.prepare_rtlsim import PrepareRTLSim from finn.transformation.fpgadataflow.set_exec_mode import SetExecMode from finn.transformation.general import GiveUniqueNodeNames -from finn.transformation.fpgadataflow.prepare_rtlsim import PrepareRTLSim +from finn.transformation.infer_datatypes import InferDataTypes +from finn.transformation.infer_shapes import InferShapes from finn.util.basic import gen_finn_dt_tensor -from finn.custom_op.registry import getCustomOp -from finn.analysis.fpgadataflow.exp_cycles_per_layer import exp_cycles_per_layer def make_dupstreams_modelwrapper(ch, pe, idim, idt): diff --git a/tests/fpgadataflow/test_fpgadataflow_dwc.py b/tests/fpgadataflow/test_fpgadataflow_dwc.py index 34930e672f3ff9816d3328da102b1bc1daa8a3b1..b0af4382383d8935c69e362b1a43db536979c784 100644 --- a/tests/fpgadataflow/test_fpgadataflow_dwc.py +++ b/tests/fpgadataflow/test_fpgadataflow_dwc.py @@ -30,15 +30,15 @@ import pytest from onnx import TensorProto, helper +import finn.core.onnx_exec as oxe from finn.core.datatype import DataType from finn.core.modelwrapper import ModelWrapper -from finn.transformation.fpgadataflow.prepare_ip import PrepareIP from finn.transformation.fpgadataflow.hlssynth_ip import HLSSynthIP -from finn.transformation.fpgadataflow.set_exec_mode import SetExecMode +from finn.transformation.fpgadataflow.prepare_ip import PrepareIP from finn.transformation.fpgadataflow.prepare_rtlsim import PrepareRTLSim +from finn.transformation.fpgadataflow.set_exec_mode import SetExecMode from finn.transformation.general import GiveUniqueNodeNames from finn.util.basic import gen_finn_dt_tensor -import finn.core.onnx_exec as oxe def make_single_dwc_modelwrapper(Shape, INWidth, OUTWidth, finn_dtype): diff --git a/tests/fpgadataflow/test_fpgadataflow_fclayer.py b/tests/fpgadataflow/test_fpgadataflow_fclayer.py index 00f1ba5d59288b1a463fadbd684ff872269d6970..49c326d2a34e7262826505ae32f2509b42ae0a35 100644 --- a/tests/fpgadataflow/test_fpgadataflow_fclayer.py +++ b/tests/fpgadataflow/test_fpgadataflow_fclayer.py @@ -31,22 +31,22 @@ import pytest import numpy as np from onnx import TensorProto, helper -from finn.custom_op.registry import getCustomOp import finn.core.onnx_exec as oxe import finn.custom_op.general.xnorpopcount as xp +from finn.analysis.fpgadataflow.exp_cycles_per_layer import exp_cycles_per_layer from finn.analysis.fpgadataflow.hls_synth_res_estimation import hls_synth_res_estimation from finn.core.datatype import DataType from finn.core.modelwrapper import ModelWrapper from finn.custom_op.general.multithreshold import multithreshold -from finn.transformation.fpgadataflow.prepare_ip import PrepareIP -from finn.transformation.fpgadataflow.prepare_cppsim import PrepareCppSim +from finn.custom_op.registry import getCustomOp from finn.transformation.fpgadataflow.compile_cppsim import CompileCppSim from finn.transformation.fpgadataflow.hlssynth_ip import HLSSynthIP +from finn.transformation.fpgadataflow.prepare_cppsim import PrepareCppSim +from finn.transformation.fpgadataflow.prepare_ip import PrepareIP +from finn.transformation.fpgadataflow.prepare_rtlsim import PrepareRTLSim from finn.transformation.fpgadataflow.set_exec_mode import SetExecMode from finn.transformation.general import GiveUniqueNodeNames -from finn.transformation.fpgadataflow.prepare_rtlsim import PrepareRTLSim from finn.util.basic import calculate_signed_dot_prod_range, gen_finn_dt_tensor -from finn.analysis.fpgadataflow.exp_cycles_per_layer import exp_cycles_per_layer def make_single_fclayer_modelwrapper(W, pe, simd, wdt, idt, odt, T=None, tdt=None): diff --git a/tests/fpgadataflow/test_fpgadataflow_fifo.py b/tests/fpgadataflow/test_fpgadataflow_fifo.py index a603fc0664b78c00354514fbdff62c94aa7b7ef3..81f66c42ca76d42fe8ee50576d72007f6ca6c12f 100644 --- a/tests/fpgadataflow/test_fpgadataflow_fifo.py +++ b/tests/fpgadataflow/test_fpgadataflow_fifo.py @@ -27,19 +27,19 @@ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. import pytest -import os +import os from onnx import TensorProto, helper + +import finn.core.onnx_exec as oxe from finn.core.datatype import DataType from finn.core.modelwrapper import ModelWrapper +from finn.transformation.fpgadataflow.hlssynth_ip import HLSSynthIP from finn.transformation.fpgadataflow.prepare_ip import PrepareIP from finn.transformation.fpgadataflow.prepare_rtlsim import PrepareRTLSim -from finn.transformation.fpgadataflow.hlssynth_ip import HLSSynthIP from finn.transformation.fpgadataflow.set_exec_mode import SetExecMode from finn.transformation.general import GiveUniqueNodeNames from finn.util.basic import gen_finn_dt_tensor -import finn.core.onnx_exec as oxe - build_dir = os.environ["FINN_BUILD_DIR"] test_fpga_part = "xc7z020clg400-1" diff --git a/tests/fpgadataflow/test_fpgadataflow_fmpadding.py b/tests/fpgadataflow/test_fpgadataflow_fmpadding.py index ab47b300136bd95622f064b30e3bbaae76a61597..5db12ee22828e43e276ed85f04f985653fe0a2dd 100644 --- a/tests/fpgadataflow/test_fpgadataflow_fmpadding.py +++ b/tests/fpgadataflow/test_fpgadataflow_fmpadding.py @@ -27,26 +27,25 @@ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. import pytest -import os -import numpy as np +import numpy as np +import os from onnx import TensorProto, helper + +import finn.core.onnx_exec as oxe +from finn.analysis.fpgadataflow.exp_cycles_per_layer import exp_cycles_per_layer from finn.core.datatype import DataType from finn.core.modelwrapper import ModelWrapper -from finn.util.basic import gen_finn_dt_tensor -import finn.core.onnx_exec as oxe -from finn.transformation.infer_shapes import InferShapes -from finn.transformation.fpgadataflow.set_exec_mode import SetExecMode -from finn.transformation.general import GiveUniqueNodeNames -from finn.transformation.fpgadataflow.prepare_cppsim import PrepareCppSim +from finn.custom_op.registry import getCustomOp from finn.transformation.fpgadataflow.compile_cppsim import CompileCppSim -from finn.transformation.fpgadataflow.prepare_ip import PrepareIP from finn.transformation.fpgadataflow.hlssynth_ip import HLSSynthIP +from finn.transformation.fpgadataflow.prepare_cppsim import PrepareCppSim +from finn.transformation.fpgadataflow.prepare_ip import PrepareIP from finn.transformation.fpgadataflow.prepare_rtlsim import PrepareRTLSim -from finn.custom_op.registry import getCustomOp -from finn.analysis.fpgadataflow.exp_cycles_per_layer import exp_cycles_per_layer - -from finn.util.basic import pynq_part_map +from finn.transformation.fpgadataflow.set_exec_mode import SetExecMode +from finn.transformation.general import GiveUniqueNodeNames +from finn.transformation.infer_shapes import InferShapes +from finn.util.basic import gen_finn_dt_tensor, pynq_part_map test_pynq_board = os.getenv("PYNQ_BOARD", default="Pynq-Z1") test_fpga_part = pynq_part_map[test_pynq_board] diff --git a/tests/fpgadataflow/test_fpgadataflow_globalaccpool.py b/tests/fpgadataflow/test_fpgadataflow_globalaccpool.py index 7fca91925a63a5da4294adb002a3cc97831a88ca..f1373123a69f4c3d02b191c0f0560b59d2c9a7b2 100644 --- a/tests/fpgadataflow/test_fpgadataflow_globalaccpool.py +++ b/tests/fpgadataflow/test_fpgadataflow_globalaccpool.py @@ -27,23 +27,23 @@ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. import pytest -import numpy as np +import numpy as np from onnx import TensorProto, helper import finn.core.onnx_exec as oxe +from finn.analysis.fpgadataflow.exp_cycles_per_layer import exp_cycles_per_layer from finn.core.datatype import DataType from finn.core.modelwrapper import ModelWrapper -from finn.transformation.fpgadataflow.prepare_ip import PrepareIP -from finn.transformation.fpgadataflow.prepare_cppsim import PrepareCppSim +from finn.custom_op.registry import getCustomOp from finn.transformation.fpgadataflow.compile_cppsim import CompileCppSim from finn.transformation.fpgadataflow.hlssynth_ip import HLSSynthIP +from finn.transformation.fpgadataflow.prepare_cppsim import PrepareCppSim +from finn.transformation.fpgadataflow.prepare_ip import PrepareIP +from finn.transformation.fpgadataflow.prepare_rtlsim import PrepareRTLSim from finn.transformation.fpgadataflow.set_exec_mode import SetExecMode from finn.transformation.general import GiveUniqueNodeNames -from finn.transformation.fpgadataflow.prepare_rtlsim import PrepareRTLSim from finn.util.basic import gen_finn_dt_tensor -from finn.custom_op.registry import getCustomOp -from finn.analysis.fpgadataflow.exp_cycles_per_layer import exp_cycles_per_layer def make_accpool_modelwrapper(ch, pe, idim, idt): diff --git a/tests/fpgadataflow/test_fpgadataflow_ipstitch.py b/tests/fpgadataflow/test_fpgadataflow_ipstitch.py index 4fa780548a544d92e02b28486ae1e325ff1f9a9b..9a6050a55dd86ca5064b293f87304cbb1365edea 100644 --- a/tests/fpgadataflow/test_fpgadataflow_ipstitch.py +++ b/tests/fpgadataflow/test_fpgadataflow_ipstitch.py @@ -26,41 +26,39 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -import os - import pytest import numpy as np +import os from onnx import TensorProto, helper from finn.core.datatype import DataType from finn.core.modelwrapper import ModelWrapper from finn.core.onnx_exec import execute_onnx from finn.custom_op.registry import getCustomOp -from finn.transformation.fpgadataflow.prepare_ip import PrepareIP -from finn.transformation.fpgadataflow.create_stitched_ip import CreateStitchedIP from finn.transformation.fpgadataflow.create_dataflow_partition import ( CreateDataflowPartition, ) +from finn.transformation.fpgadataflow.create_stitched_ip import CreateStitchedIP +from finn.transformation.fpgadataflow.floorplan import Floorplan from finn.transformation.fpgadataflow.hlssynth_ip import HLSSynthIP +from finn.transformation.fpgadataflow.insert_iodma import InsertIODMA from finn.transformation.fpgadataflow.insert_tlastmarker import InsertTLastMarker from finn.transformation.fpgadataflow.make_deployment import DeployToPYNQ +from finn.transformation.fpgadataflow.make_zynq_proj import ZynqBuild +from finn.transformation.fpgadataflow.prepare_ip import PrepareIP +from finn.transformation.fpgadataflow.synth_ooc import SynthOutOfContext +from finn.transformation.fpgadataflow.vitis_build import VitisBuild from finn.transformation.general import GiveUniqueNodeNames +from finn.transformation.infer_data_layouts import InferDataLayouts from finn.util.basic import ( + alveo_default_platform, + alveo_part_map, gen_finn_dt_tensor, pynq_part_map, - alveo_part_map, - alveo_default_platform, ) from finn.util.pyverilator import pyverilate_stitched_ip from finn.util.test import load_test_checkpoint_or_skip -from finn.transformation.fpgadataflow.synth_ooc import SynthOutOfContext -from finn.transformation.infer_data_layouts import InferDataLayouts -from finn.transformation.fpgadataflow.insert_iodma import InsertIODMA -from finn.transformation.fpgadataflow.floorplan import Floorplan -from finn.transformation.fpgadataflow.vitis_build import VitisBuild -from finn.transformation.fpgadataflow.make_zynq_proj import ZynqBuild - test_pynq_board = os.getenv("PYNQ_BOARD", default="Pynq-Z1") test_fpga_part = pynq_part_map[test_pynq_board] diff --git a/tests/fpgadataflow/test_fpgadataflow_labelselect.py b/tests/fpgadataflow/test_fpgadataflow_labelselect.py index 5d496dbb33d21c9092fb2076cac75b3ccbbaa1e9..8997208a648fa79439a882de23865496ba527858 100644 --- a/tests/fpgadataflow/test_fpgadataflow_labelselect.py +++ b/tests/fpgadataflow/test_fpgadataflow_labelselect.py @@ -27,20 +27,20 @@ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. import pytest -import numpy as np +import numpy as np from onnx import TensorProto, helper import finn.core.onnx_exec as oxe from finn.core.datatype import DataType from finn.core.modelwrapper import ModelWrapper -from finn.transformation.fpgadataflow.prepare_ip import PrepareIP -from finn.transformation.fpgadataflow.prepare_cppsim import PrepareCppSim from finn.transformation.fpgadataflow.compile_cppsim import CompileCppSim from finn.transformation.fpgadataflow.hlssynth_ip import HLSSynthIP +from finn.transformation.fpgadataflow.prepare_cppsim import PrepareCppSim +from finn.transformation.fpgadataflow.prepare_ip import PrepareIP +from finn.transformation.fpgadataflow.prepare_rtlsim import PrepareRTLSim from finn.transformation.fpgadataflow.set_exec_mode import SetExecMode from finn.transformation.general import GiveUniqueNodeNames -from finn.transformation.fpgadataflow.prepare_rtlsim import PrepareRTLSim from finn.util.basic import gen_finn_dt_tensor from finn.util.test import soft_verify_topk @@ -61,7 +61,10 @@ def make_labelselect_modelwrapper(labels, pe, k, idt): inputDataType=idt.name, ) graph = helper.make_graph( - nodes=[labelselect_node], name="graph", inputs=[inp], outputs=[outp], + nodes=[labelselect_node], + name="graph", + inputs=[inp], + outputs=[outp], ) model = helper.make_model(graph, producer_name="thresholding-model") diff --git a/tests/fpgadataflow/test_fpgadataflow_thresholding.py b/tests/fpgadataflow/test_fpgadataflow_thresholding.py index bbc7e8227d80fb9d064f484dafe91ecdcdc47144..b87241de56870cad70d08583b24292e0da91109e 100644 --- a/tests/fpgadataflow/test_fpgadataflow_thresholding.py +++ b/tests/fpgadataflow/test_fpgadataflow_thresholding.py @@ -29,27 +29,27 @@ import pytest import numpy as np +import os from onnx import TensorProto, helper import finn.core.onnx_exec as oxe +from finn.analysis.fpgadataflow.exp_cycles_per_layer import exp_cycles_per_layer from finn.analysis.fpgadataflow.hls_synth_res_estimation import hls_synth_res_estimation from finn.core.datatype import DataType from finn.core.modelwrapper import ModelWrapper +from finn.core.rtlsim_exec import rtlsim_exec from finn.custom_op.general.multithreshold import multithreshold -from finn.transformation.fpgadataflow.prepare_ip import PrepareIP -from finn.transformation.fpgadataflow.prepare_cppsim import PrepareCppSim +from finn.custom_op.registry import getCustomOp from finn.transformation.fpgadataflow.compile_cppsim import CompileCppSim +from finn.transformation.fpgadataflow.create_stitched_ip import CreateStitchedIP from finn.transformation.fpgadataflow.hlssynth_ip import HLSSynthIP +from finn.transformation.fpgadataflow.prepare_cppsim import PrepareCppSim +from finn.transformation.fpgadataflow.prepare_ip import PrepareIP +from finn.transformation.fpgadataflow.prepare_rtlsim import PrepareRTLSim from finn.transformation.fpgadataflow.set_exec_mode import SetExecMode from finn.transformation.general import GiveUniqueNodeNames -from finn.transformation.fpgadataflow.prepare_rtlsim import PrepareRTLSim from finn.util.basic import gen_finn_dt_tensor -from finn.custom_op.registry import getCustomOp -from finn.analysis.fpgadataflow.exp_cycles_per_layer import exp_cycles_per_layer -import os from finn.util.pyverilator import axilite_read, axilite_write -from finn.transformation.fpgadataflow.create_stitched_ip import CreateStitchedIP -from finn.core.rtlsim_exec import rtlsim_exec test_fpga_part = "xc7z020clg400-1" target_clk_ns = 5 diff --git a/tests/fpgadataflow/test_fpgadataflow_vvau.py b/tests/fpgadataflow/test_fpgadataflow_vvau.py index 4756d4fe18ccd4934b4041c70bf2f3a1bb577ec7..36b844deab4e28ff35290a170f713a64be839e8a 100644 --- a/tests/fpgadataflow/test_fpgadataflow_vvau.py +++ b/tests/fpgadataflow/test_fpgadataflow_vvau.py @@ -32,20 +32,19 @@ import numpy as np from onnx import TensorProto, helper import finn.core.onnx_exec as oxe +from finn.analysis.fpgadataflow.exp_cycles_per_layer import exp_cycles_per_layer from finn.core.datatype import DataType from finn.core.modelwrapper import ModelWrapper -from finn.util.basic import gen_finn_dt_tensor -from finn.transformation.fpgadataflow.set_exec_mode import SetExecMode -from finn.transformation.fpgadataflow.prepare_cppsim import PrepareCppSim +from finn.custom_op.general.multithreshold import multithreshold +from finn.custom_op.registry import getCustomOp from finn.transformation.fpgadataflow.compile_cppsim import CompileCppSim -from finn.transformation.fpgadataflow.prepare_ip import PrepareIP from finn.transformation.fpgadataflow.hlssynth_ip import HLSSynthIP +from finn.transformation.fpgadataflow.prepare_cppsim import PrepareCppSim +from finn.transformation.fpgadataflow.prepare_ip import PrepareIP from finn.transformation.fpgadataflow.prepare_rtlsim import PrepareRTLSim +from finn.transformation.fpgadataflow.set_exec_mode import SetExecMode from finn.transformation.general import GiveUniqueNodeNames -from finn.custom_op.general.multithreshold import multithreshold - -from finn.custom_op.registry import getCustomOp -from finn.analysis.fpgadataflow.exp_cycles_per_layer import exp_cycles_per_layer +from finn.util.basic import gen_finn_dt_tensor def _infer_sparse_weight_tensor(W_conv, k_h, k_w, channels): diff --git a/tests/fpgadataflow/test_layer_streaming_maxpool_batch.py b/tests/fpgadataflow/test_layer_streaming_maxpool_batch.py index ff88536f477e80e5c92a2c352f0af81488997c7f..11ca79471d4eb2642a141ecdda9b4c55714ec76c 100644 --- a/tests/fpgadataflow/test_layer_streaming_maxpool_batch.py +++ b/tests/fpgadataflow/test_layer_streaming_maxpool_batch.py @@ -28,22 +28,22 @@ import pytest +import numpy as np from onnx import TensorProto, helper import finn.core.onnx_exec as oxe +from finn.analysis.fpgadataflow.exp_cycles_per_layer import exp_cycles_per_layer from finn.core.datatype import DataType from finn.core.modelwrapper import ModelWrapper -from finn.transformation.fpgadataflow.prepare_ip import PrepareIP -from finn.transformation.fpgadataflow.prepare_cppsim import PrepareCppSim +from finn.custom_op.registry import getCustomOp from finn.transformation.fpgadataflow.compile_cppsim import CompileCppSim from finn.transformation.fpgadataflow.hlssynth_ip import HLSSynthIP -from finn.transformation.fpgadataflow.set_exec_mode import SetExecMode +from finn.transformation.fpgadataflow.prepare_cppsim import PrepareCppSim +from finn.transformation.fpgadataflow.prepare_ip import PrepareIP from finn.transformation.fpgadataflow.prepare_rtlsim import PrepareRTLSim +from finn.transformation.fpgadataflow.set_exec_mode import SetExecMode from finn.transformation.general import GiveUniqueNodeNames from finn.util.basic import gen_finn_dt_tensor -from finn.analysis.fpgadataflow.exp_cycles_per_layer import exp_cycles_per_layer -from finn.custom_op.registry import getCustomOp -import numpy as np def make_single_maxpoolnhwc_modelwrapper(k, ifm_ch, ifm_dim, ofm_dim, idt): diff --git a/tests/fpgadataflow/test_runtime_weights.py b/tests/fpgadataflow/test_runtime_weights.py index c487824964400cacbde575da2c10757985ad6e32..73b1315592af79145e1b7c6f147b3ede7e066bce 100644 --- a/tests/fpgadataflow/test_runtime_weights.py +++ b/tests/fpgadataflow/test_runtime_weights.py @@ -26,20 +26,22 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -from finn.util.create import hls_random_mlp_maker +import pytest + +import numpy as np +import os + from finn.core.datatype import DataType -from finn.transformation.general import GiveUniqueNodeNames -from finn.transformation.fpgadataflow.prepare_ip import PrepareIP -from finn.transformation.fpgadataflow.hlssynth_ip import HLSSynthIP +from finn.core.rtlsim_exec import rtlsim_exec +from finn.custom_op.registry import getCustomOp from finn.transformation.fpgadataflow.create_stitched_ip import CreateStitchedIP +from finn.transformation.fpgadataflow.hlssynth_ip import HLSSynthIP +from finn.transformation.fpgadataflow.prepare_ip import PrepareIP from finn.transformation.fpgadataflow.prepare_rtlsim import PrepareRTLSim -from finn.custom_op.registry import getCustomOp -from finn.core.rtlsim_exec import rtlsim_exec +from finn.transformation.general import GiveUniqueNodeNames from finn.util.basic import gen_finn_dt_tensor -from finn.util.pyverilator import axilite_write, axilite_read -import numpy as np -import pytest -import os +from finn.util.create import hls_random_mlp_maker +from finn.util.pyverilator import axilite_read, axilite_write test_fpga_part = "xc7z020clg400-1" target_clk_ns = 5 diff --git a/tests/fpgadataflow/test_set_folding.py b/tests/fpgadataflow/test_set_folding.py index fe3a1db8a476e33bfc0d76996917fab9ae6ed98b..f268611c296687987fffe32293b0454109bc7db4 100644 --- a/tests/fpgadataflow/test_set_folding.py +++ b/tests/fpgadataflow/test_set_folding.py @@ -27,18 +27,19 @@ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. import pytest + import numpy as np from onnx import TensorProto, helper -from finn.custom_op.registry import getCustomOp -from finn.core.datatype import DataType from finn.analysis.fpgadataflow.exp_cycles_per_layer import exp_cycles_per_layer +from finn.core.datatype import DataType from finn.core.modelwrapper import ModelWrapper -from finn.transformation.fpgadataflow.set_folding import SetFolding -from finn.transformation.general import GiveUniqueNodeNames +from finn.custom_op.registry import getCustomOp from finn.transformation.fpgadataflow.create_dataflow_partition import ( CreateDataflowPartition, ) +from finn.transformation.fpgadataflow.set_folding import SetFolding +from finn.transformation.general import GiveUniqueNodeNames from finn.util.test import load_test_checkpoint_or_skip diff --git a/tests/transformation/streamline/test_absorb_mul_into_topk.py b/tests/transformation/streamline/test_absorb_mul_into_topk.py index d0a089f9e5f894a5da635672eb58af1d8ddef3ef..bc9a31d49c7edfc20ca3e932efd00df939f1135f 100644 --- a/tests/transformation/streamline/test_absorb_mul_into_topk.py +++ b/tests/transformation/streamline/test_absorb_mul_into_topk.py @@ -30,13 +30,14 @@ import pytest import numpy as np from onnx import TensorProto, helper +import finn.core.onnx_exec as oxe from finn.core.modelwrapper import ModelWrapper -from finn.transformation.infer_shapes import InferShapes +from finn.transformation.general import GiveReadableTensorNames, GiveUniqueNodeNames from finn.transformation.infer_datatypes import InferDataTypes -from finn.transformation.general import GiveUniqueNodeNames, GiveReadableTensorNames +from finn.transformation.infer_shapes import InferShapes from finn.transformation.insert_topk import InsertTopK from finn.transformation.streamline.absorb import AbsorbScalarMulAddIntoTopK -import finn.core.onnx_exec as oxe + # parameter to indicate if mul parameter is negative or positive @pytest.mark.parametrize("mul_positive", [True, False]) diff --git a/tests/transformation/streamline/test_absorb_transp_into_flatten.py b/tests/transformation/streamline/test_absorb_transp_into_flatten.py index cbbb33b4606acf55ace662da0986105f8c456b39..1e5d5fe5806d2e3f418438b260d2257f5ae31adf 100644 --- a/tests/transformation/streamline/test_absorb_transp_into_flatten.py +++ b/tests/transformation/streamline/test_absorb_transp_into_flatten.py @@ -3,14 +3,15 @@ import pytest import numpy as np from onnx import TensorProto, helper -from finn.core.modelwrapper import ModelWrapper import finn.core.data_layout as DataLayout -from finn.transformation.infer_shapes import InferShapes -from finn.transformation.infer_datatypes import InferDataTypes +import finn.core.onnx_exec as oxe +from finn.core.modelwrapper import ModelWrapper +from finn.transformation.general import GiveReadableTensorNames, GiveUniqueNodeNames from finn.transformation.infer_data_layouts import InferDataLayouts -from finn.transformation.general import GiveUniqueNodeNames, GiveReadableTensorNames +from finn.transformation.infer_datatypes import InferDataTypes +from finn.transformation.infer_shapes import InferShapes from finn.transformation.streamline.absorb import AbsorbTransposeIntoFlatten -import finn.core.onnx_exec as oxe + # permutation of transpose node @pytest.mark.parametrize("perm", [[0, 2, 3, 1], [0, 1, 3, 2], [3, 2, 0, 1]]) diff --git a/tests/transformation/streamline/test_collapse_repeated_op.py b/tests/transformation/streamline/test_collapse_repeated_op.py index b74d868f9b921c35ff9f596c811583f45f761374..1741ab6b8f4fc1c3e806a8868f329cd7753eac4d 100644 --- a/tests/transformation/streamline/test_collapse_repeated_op.py +++ b/tests/transformation/streamline/test_collapse_repeated_op.py @@ -26,6 +26,8 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +import pytest + import numpy as np import onnx.helper as oh from onnx import TensorProto @@ -34,7 +36,6 @@ import finn.core.onnx_exec as ox from finn.core.modelwrapper import ModelWrapper from finn.transformation.infer_shapes import InferShapes from finn.transformation.streamline import CollapseRepeatedAdd, CollapseRepeatedMul -import pytest def test_collapse_repeated_op(): @@ -74,7 +75,8 @@ def test_collapse_repeated_op(): @pytest.mark.parametrize( - "test_args", [("Add", CollapseRepeatedAdd()), ("Mul", CollapseRepeatedMul())], + "test_args", + [("Add", CollapseRepeatedAdd()), ("Mul", CollapseRepeatedMul())], ) def test_collapse_repeated_only_if_linear(test_args): scalar_op = test_args[0] diff --git a/tests/transformation/streamline/test_linear_past_eltwise.py b/tests/transformation/streamline/test_linear_past_eltwise.py index f5af2307fb042879a837a26c50715c8ec1b96963..098b3f9d4f67a2cbc1a87fbb67a313d00e229777 100644 --- a/tests/transformation/streamline/test_linear_past_eltwise.py +++ b/tests/transformation/streamline/test_linear_past_eltwise.py @@ -26,19 +26,18 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -import os -import numpy as np +import pytest +import numpy as np +import os from onnx import TensorProto, helper import finn.core.onnx_exec as oxe from finn.core.modelwrapper import ModelWrapper from finn.transformation.fold_constants import FoldConstants from finn.transformation.general import GiveReadableTensorNames, GiveUniqueNodeNames -from finn.transformation.streamline.reorder import MoveLinearPastEltwiseAdd from finn.transformation.infer_shapes import InferShapes - -import pytest +from finn.transformation.streamline.reorder import MoveLinearPastEltwiseAdd export_onnx_path = "test_linear_past_eltwise.onnx" diff --git a/tests/transformation/streamline/test_move_chw_add_past_conv.py b/tests/transformation/streamline/test_move_chw_add_past_conv.py index fc64a04e40036eae7057c15f4e628155bd563e51..e4be8fc3836f18bf95eb193516937c2e9334e2ff 100644 --- a/tests/transformation/streamline/test_move_chw_add_past_conv.py +++ b/tests/transformation/streamline/test_move_chw_add_past_conv.py @@ -29,13 +29,13 @@ import pytest import numpy as np -from onnx import helper, TensorProto +from onnx import TensorProto, helper +import finn.core.onnx_exec as oxe from finn.core.modelwrapper import ModelWrapper +from finn.custom_op.general.im2col import compute_conv_output_dim from finn.transformation.infer_shapes import InferShapes from finn.transformation.streamline.reorder import MoveAddPastConv -from finn.custom_op.general.im2col import compute_conv_output_dim -import finn.core.onnx_exec as oxe # input dimension diff --git a/tests/transformation/streamline/test_move_flatten_past_affine.py b/tests/transformation/streamline/test_move_flatten_past_affine.py index b2d5e51613d41f3f2db3dabcef7b982ec2816b19..1971ecfaa181d6ee799a9191b63d2482629b1e1c 100644 --- a/tests/transformation/streamline/test_move_flatten_past_affine.py +++ b/tests/transformation/streamline/test_move_flatten_past_affine.py @@ -30,16 +30,17 @@ import pytest import numpy as np from onnx import TensorProto, helper -from finn.core.modelwrapper import ModelWrapper -from finn.core.datatype import DataType import finn.core.data_layout as DataLayout -from finn.util.basic import gen_finn_dt_tensor -from finn.transformation.infer_shapes import InferShapes -from finn.transformation.infer_datatypes import InferDataTypes +import finn.core.onnx_exec as oxe +from finn.core.datatype import DataType +from finn.core.modelwrapper import ModelWrapper +from finn.transformation.general import GiveReadableTensorNames, GiveUniqueNodeNames from finn.transformation.infer_data_layouts import InferDataLayouts -from finn.transformation.general import GiveUniqueNodeNames, GiveReadableTensorNames +from finn.transformation.infer_datatypes import InferDataTypes +from finn.transformation.infer_shapes import InferShapes from finn.transformation.streamline.reorder import MoveFlattenPastAffine -import finn.core.onnx_exec as oxe +from finn.util.basic import gen_finn_dt_tensor + # data layout @pytest.mark.parametrize("data_layout", [DataLayout.NHWC, DataLayout.NCHW]) diff --git a/tests/transformation/streamline/test_move_flatten_past_topk.py b/tests/transformation/streamline/test_move_flatten_past_topk.py index 65da92c22dbe9f6b1c5a49172ffae59fa6e98607..5e0211ad8857653ce75af2f5a7de0c6439770108 100644 --- a/tests/transformation/streamline/test_move_flatten_past_topk.py +++ b/tests/transformation/streamline/test_move_flatten_past_topk.py @@ -29,17 +29,18 @@ import pytest from onnx import TensorProto, helper -from finn.core.modelwrapper import ModelWrapper -from finn.core.datatype import DataType import finn.core.data_layout as DataLayout -from finn.util.basic import gen_finn_dt_tensor -from finn.transformation.insert_topk import InsertTopK -from finn.transformation.infer_shapes import InferShapes -from finn.transformation.infer_datatypes import InferDataTypes +import finn.core.onnx_exec as oxe +from finn.core.datatype import DataType +from finn.core.modelwrapper import ModelWrapper +from finn.transformation.general import GiveReadableTensorNames, GiveUniqueNodeNames from finn.transformation.infer_data_layouts import InferDataLayouts -from finn.transformation.general import GiveUniqueNodeNames, GiveReadableTensorNames +from finn.transformation.infer_datatypes import InferDataTypes +from finn.transformation.infer_shapes import InferShapes +from finn.transformation.insert_topk import InsertTopK from finn.transformation.streamline.reorder import MoveFlattenPastTopK -import finn.core.onnx_exec as oxe +from finn.util.basic import gen_finn_dt_tensor + # data layout @pytest.mark.parametrize("data_layout", [DataLayout.NHWC, DataLayout.NCHW]) @@ -59,7 +60,10 @@ def test_move_flatten_past_affine(data_layout, batch_size): flatten_node = helper.make_node("Flatten", ["inp"], ["outp"]) graph = helper.make_graph( - nodes=[flatten_node], name="move-flatten-graph", inputs=[inp], outputs=[outp], + nodes=[flatten_node], + name="move-flatten-graph", + inputs=[inp], + outputs=[outp], ) model = helper.make_model(graph, producer_name="move_flatten_model") diff --git a/tests/transformation/streamline/test_move_identical_op_past_join_op.py b/tests/transformation/streamline/test_move_identical_op_past_join_op.py index 94eb52835b1800a839e5a9792e9cf1d7be1e681d..60e76b8b07e06048ecf1a15c72134fecf5c97346 100644 --- a/tests/transformation/streamline/test_move_identical_op_past_join_op.py +++ b/tests/transformation/streamline/test_move_identical_op_past_join_op.py @@ -1,12 +1,12 @@ import pytest -from onnx import helper as oh from onnx import TensorProto +from onnx import helper as oh +import finn.core.onnx_exec as oxe from finn.core.modelwrapper import ModelWrapper from finn.transformation.streamline.reorder import MoveTransposePastJoinAdd from finn.util.basic import gen_finn_dt_tensor -import finn.core.onnx_exec as oxe def create_model(perm): diff --git a/tests/transformation/streamline/test_move_maxpool_past_multithreshold.py b/tests/transformation/streamline/test_move_maxpool_past_multithreshold.py index 7c49baf8cd9d5b85b3b76f3513d42483d3bbeb0c..fca05afa5b155e6a293857c14c10c4a9b80eeaf4 100644 --- a/tests/transformation/streamline/test_move_maxpool_past_multithreshold.py +++ b/tests/transformation/streamline/test_move_maxpool_past_multithreshold.py @@ -1,11 +1,11 @@ -from onnx import TensorProto, helper import numpy as np +from onnx import TensorProto, helper import finn.core.onnx_exec as oxe from finn.core.modelwrapper import ModelWrapper -from finn.transformation.streamline.reorder import MoveMaxPoolPastMultiThreshold -from finn.transformation.infer_shapes import InferShapes from finn.transformation.infer_datatypes import InferDataTypes +from finn.transformation.infer_shapes import InferShapes +from finn.transformation.streamline.reorder import MoveMaxPoolPastMultiThreshold def get_multithreshold_rand_params(channels, num_of_thres, seed=None): diff --git a/tests/transformation/streamline/test_move_mul_past_dw_conv.py b/tests/transformation/streamline/test_move_mul_past_dw_conv.py index ce0cbcd0405f8a09efabbadd5555de1bd6b89e43..cb9beed713eb448b49015a7de601a4d15edc035b 100644 --- a/tests/transformation/streamline/test_move_mul_past_dw_conv.py +++ b/tests/transformation/streamline/test_move_mul_past_dw_conv.py @@ -1,14 +1,15 @@ import pytest -from onnx import helper, TensorProto -from finn.custom_op.general.im2col import compute_conv_output_dim +from onnx import TensorProto, helper + import finn.core.onnx_exec as oxe from finn.core.datatype import DataType from finn.core.modelwrapper import ModelWrapper +from finn.custom_op.general.im2col import compute_conv_output_dim from finn.transformation.infer_datatypes import InferDataTypes from finn.transformation.infer_shapes import InferShapes -from finn.util.basic import gen_finn_dt_tensor from finn.transformation.streamline.reorder import MoveMulPastDWConv +from finn.util.basic import gen_finn_dt_tensor # input dimension diff --git a/tests/transformation/streamline/test_move_mul_past_maxpool.py b/tests/transformation/streamline/test_move_mul_past_maxpool.py index f612841020e373a3c6458ee3e9a6eb14fcea7eb5..81f18842ed8ba2b5230f3a853076244d0a0ab8d9 100755 --- a/tests/transformation/streamline/test_move_mul_past_maxpool.py +++ b/tests/transformation/streamline/test_move_mul_past_maxpool.py @@ -1,15 +1,16 @@ -import numpy as np import pytest -from onnx import helper, TensorProto -from finn.custom_op.general.maxpoolnhwc import compute_pool_output_dim +import numpy as np +from onnx import TensorProto, helper + import finn.core.onnx_exec as oxe from finn.core.datatype import DataType from finn.core.modelwrapper import ModelWrapper +from finn.custom_op.general.maxpoolnhwc import compute_pool_output_dim from finn.transformation.infer_datatypes import InferDataTypes from finn.transformation.infer_shapes import InferShapes -from finn.util.basic import gen_finn_dt_tensor from finn.transformation.streamline.reorder import MoveMulPastMaxPool +from finn.util.basic import gen_finn_dt_tensor # input dimension diff --git a/tests/transformation/streamline/test_move_past_fork.py b/tests/transformation/streamline/test_move_past_fork.py index f3d37bd60c9e2580ca4499daafa8693f39fec810..364590f933ac27539fd546d64e25325032c885c9 100644 --- a/tests/transformation/streamline/test_move_past_fork.py +++ b/tests/transformation/streamline/test_move_past_fork.py @@ -1,12 +1,12 @@ -from onnx import TensorProto, helper +import pytest + import numpy as np +from onnx import TensorProto, helper import finn.core.onnx_exec as oxe from finn.core.modelwrapper import ModelWrapper -from finn.transformation.streamline.reorder import MoveLinearPastFork from finn.transformation.infer_shapes import InferShapes - -import pytest +from finn.transformation.streamline.reorder import MoveLinearPastFork @pytest.mark.parametrize("ch", [64, 1]) diff --git a/tests/transformation/streamline/test_move_scalar_past_conv.py b/tests/transformation/streamline/test_move_scalar_past_conv.py index 94fee7907d1ed1cccbf95520e903c7d9b43d8f7d..5e2ded0174e9aa7a02551ed6b658f97ff070a523 100644 --- a/tests/transformation/streamline/test_move_scalar_past_conv.py +++ b/tests/transformation/streamline/test_move_scalar_past_conv.py @@ -1,20 +1,19 @@ +import pytest + import numpy as np import onnx.helper as oh -import pytest from onnx import TensorProto import finn.core.onnx_exec as ox from finn.core.modelwrapper import ModelWrapper from finn.transformation.infer_shapes import InferShapes -from finn.transformation.streamline import ( - MoveAddPastConv, - MoveScalarMulPastConv, -) +from finn.transformation.streamline import MoveAddPastConv, MoveScalarMulPastConv @pytest.mark.parametrize("padding", [False, True]) @pytest.mark.parametrize( - "test_args", [("Add", MoveAddPastConv()), ("Mul", MoveScalarMulPastConv())], + "test_args", + [("Add", MoveAddPastConv()), ("Mul", MoveScalarMulPastConv())], ) def test_move_scalar_past_conv(test_args, padding): scalar_op = test_args[0] @@ -92,7 +91,8 @@ def test_move_scalar_past_conv(test_args, padding): @pytest.mark.parametrize( - "test_args", [("Add", MoveAddPastConv()), ("Mul", MoveScalarMulPastConv())], + "test_args", + [("Add", MoveAddPastConv()), ("Mul", MoveScalarMulPastConv())], ) def test_move_scalar_past_conv_only_if_linear(test_args): scalar_op = test_args[0] diff --git a/tests/transformation/streamline/test_move_scalar_past_matmul.py b/tests/transformation/streamline/test_move_scalar_past_matmul.py index e432dbf4ec1a38551609e5914e2d44968a020908..b15f84303b0dc2e00bd51397543871cfeb99c1f9 100644 --- a/tests/transformation/streamline/test_move_scalar_past_matmul.py +++ b/tests/transformation/streamline/test_move_scalar_past_matmul.py @@ -26,8 +26,9 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -import numpy as np import pytest + +import numpy as np import onnx.helper as oh from onnx import TensorProto diff --git a/tests/transformation/streamline/test_move_transpose_past_scalar_mul.py b/tests/transformation/streamline/test_move_transpose_past_scalar_mul.py index e434fc7d4f683120176e18a2bfa9da99d9ee0b0e..9110ede98da81a627127767276db33362503ef84 100644 --- a/tests/transformation/streamline/test_move_transpose_past_scalar_mul.py +++ b/tests/transformation/streamline/test_move_transpose_past_scalar_mul.py @@ -3,14 +3,15 @@ import pytest import numpy as np from onnx import TensorProto, helper -from finn.core.modelwrapper import ModelWrapper import finn.core.data_layout as DataLayout -from finn.transformation.infer_shapes import InferShapes -from finn.transformation.infer_datatypes import InferDataTypes +import finn.core.onnx_exec as oxe +from finn.core.modelwrapper import ModelWrapper +from finn.transformation.general import GiveReadableTensorNames, GiveUniqueNodeNames from finn.transformation.infer_data_layouts import InferDataLayouts -from finn.transformation.general import GiveUniqueNodeNames, GiveReadableTensorNames +from finn.transformation.infer_datatypes import InferDataTypes +from finn.transformation.infer_shapes import InferShapes from finn.transformation.streamline.reorder import MoveTransposePastScalarMul -import finn.core.onnx_exec as oxe + # permutation of transpose node @pytest.mark.parametrize("perm", [[0, 2, 3, 1], [0, 1, 3, 2], [3, 2, 0, 1]]) diff --git a/tests/transformation/streamline/test_remove_identity_ops.py b/tests/transformation/streamline/test_remove_identity_ops.py index d02e1d39755bf4783cd5dbdc2b88ca0931e02874..ad7c20fb51902f22c20896bdfb3321dc74d0572d 100644 --- a/tests/transformation/streamline/test_remove_identity_ops.py +++ b/tests/transformation/streamline/test_remove_identity_ops.py @@ -1,7 +1,8 @@ import pytest import numpy as np -from onnx import helper, TensorProto +from onnx import TensorProto, helper + import finn.core.onnx_exec as oxe from finn.core.datatype import DataType from finn.core.modelwrapper import ModelWrapper diff --git a/tests/transformation/streamline/test_sign_to_thres.py b/tests/transformation/streamline/test_sign_to_thres.py index 4618dffc43f5cee848b580b77cf418c612b48f3e..2ffb5713c0363b115dee5c41484fb5826faf803a 100644 --- a/tests/transformation/streamline/test_sign_to_thres.py +++ b/tests/transformation/streamline/test_sign_to_thres.py @@ -26,12 +26,11 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -import os -from pkgutil import get_data - import brevitas.onnx as bo import onnx import onnx.numpy_helper as nph +import os +from pkgutil import get_data import finn.core.onnx_exec as oxe from finn.core.modelwrapper import ModelWrapper diff --git a/tests/transformation/streamline/test_streamline_cnv.py b/tests/transformation/streamline/test_streamline_cnv.py index ca8cf3b1ceba6943828f47bcbcf974aa5b368c4e..ed2595330323bfc8a576af36ae3fea27522ec66c 100644 --- a/tests/transformation/streamline/test_streamline_cnv.py +++ b/tests/transformation/streamline/test_streamline_cnv.py @@ -26,27 +26,30 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +import pkg_resources as pk + +import pytest + import brevitas.onnx as bo import numpy as np -import pytest -import pkg_resources as pk import finn.core.onnx_exec as oxe from finn.core.modelwrapper import ModelWrapper from finn.transformation.fold_constants import FoldConstants from finn.transformation.general import ( - RemoveUnusedTensors, - RemoveStaticGraphInputs, GiveReadableTensorNames, GiveUniqueNodeNames, + RemoveStaticGraphInputs, + RemoveUnusedTensors, ) from finn.transformation.infer_shapes import InferShapes from finn.transformation.streamline import Streamline -from finn.util.test import get_test_model_trained from finn.util.basic import make_build_dir +from finn.util.test import get_test_model_trained export_onnx_path = make_build_dir("test_streamline_cnv_") + # act bits @pytest.mark.parametrize("abits", [1, 2]) # weight bits diff --git a/tests/transformation/streamline/test_streamline_fc.py b/tests/transformation/streamline/test_streamline_fc.py index d88bf14913d2551cd7347c5617895998a7d56799..3563b87c45a7ffe99fe6e9bdfd9f54a39e89cb68 100644 --- a/tests/transformation/streamline/test_streamline_fc.py +++ b/tests/transformation/streamline/test_streamline_fc.py @@ -26,30 +26,31 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -from pkgutil import get_data +import pytest import brevitas.onnx as bo import numpy as np import onnx import onnx.numpy_helper as nph -import pytest +from pkgutil import get_data import finn.core.onnx_exec as oxe from finn.core.modelwrapper import ModelWrapper from finn.transformation.fold_constants import FoldConstants from finn.transformation.general import ( - RemoveUnusedTensors, - RemoveStaticGraphInputs, GiveReadableTensorNames, GiveUniqueNodeNames, + RemoveStaticGraphInputs, + RemoveUnusedTensors, ) from finn.transformation.infer_shapes import InferShapes from finn.transformation.streamline import Streamline -from finn.util.test import get_test_model_trained from finn.util.basic import make_build_dir +from finn.util.test import get_test_model_trained export_onnx_path = make_build_dir("test_streamline_fc_") + # act bits @pytest.mark.parametrize("abits", [1, 2]) # weight bits diff --git a/tests/transformation/test_batchnorm_to_affine_bnn_pynq.py b/tests/transformation/test_batchnorm_to_affine_bnn_pynq.py index 7e894c078b15c16f29dec60d694f8b6892e84a8a..300ef85faacf664b89c7b949ea2e462f110eef85 100644 --- a/tests/transformation/test_batchnorm_to_affine_bnn_pynq.py +++ b/tests/transformation/test_batchnorm_to_affine_bnn_pynq.py @@ -26,14 +26,14 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -import os -from pkgutil import get_data import pkg_resources as pk import brevitas.onnx as bo +import numpy as np import onnx import onnx.numpy_helper as nph -import numpy as np +import os +from pkgutil import get_data import finn.core.onnx_exec as oxe from finn.core.modelwrapper import ModelWrapper diff --git a/tests/transformation/test_infer_data_layouts_cnv.py b/tests/transformation/test_infer_data_layouts_cnv.py index a8ba81dff608994b8e5efb33ec23bd0e3f894175..10bc687d13d4a85ce64955cb38c1c0dfdc6d53da 100644 --- a/tests/transformation/test_infer_data_layouts_cnv.py +++ b/tests/transformation/test_infer_data_layouts_cnv.py @@ -26,22 +26,22 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +import brevitas.onnx as bo import os -import brevitas.onnx as bo +import finn.core.data_layout as DataLayout +import finn.transformation.fpgadataflow.convert_to_hls_layers as to_hls import finn.transformation.streamline.absorb as absorb -from finn.transformation.streamline.reorder import MakeMaxPoolNHWC from finn.core.modelwrapper import ModelWrapper +from finn.transformation.bipolar_to_xnor import ConvertBipolarMatMulToXnorPopcount from finn.transformation.fold_constants import FoldConstants from finn.transformation.general import GiveReadableTensorNames, GiveUniqueNodeNames +from finn.transformation.infer_data_layouts import InferDataLayouts from finn.transformation.infer_shapes import InferShapes +from finn.transformation.lower_convs_to_matmul import LowerConvsToMatMul from finn.transformation.streamline import Streamline +from finn.transformation.streamline.reorder import MakeMaxPoolNHWC from finn.util.test import get_test_model_trained -from finn.transformation.lower_convs_to_matmul import LowerConvsToMatMul -from finn.transformation.bipolar_to_xnor import ConvertBipolarMatMulToXnorPopcount -import finn.transformation.fpgadataflow.convert_to_hls_layers as to_hls -from finn.transformation.infer_data_layouts import InferDataLayouts -import finn.core.data_layout as DataLayout export_onnx_path_cnv = "test_infer_data_layouts.onnx" diff --git a/tests/transformation/test_infer_datatypes_lfc.py b/tests/transformation/test_infer_datatypes_lfc.py index 0802c50c7d15a649182529a4e6897b9bbe273336..00715e3e3ca3626e1b76bf3b23bae4dc1d65b053 100644 --- a/tests/transformation/test_infer_datatypes_lfc.py +++ b/tests/transformation/test_infer_datatypes_lfc.py @@ -26,9 +26,8 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -import os - import brevitas.onnx as bo +import os from finn.core.datatype import DataType from finn.core.modelwrapper import ModelWrapper diff --git a/tests/util/test_build_dataflow.py b/tests/util/test_build_dataflow.py index c8e886ddb047e932e5f03ce7d460d538c95a25f2..770553201eb86f448dcd9e22afd8e827c338c7f9 100644 --- a/tests/util/test_build_dataflow.py +++ b/tests/util/test_build_dataflow.py @@ -26,12 +26,15 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -import pytest import pkg_resources as pk + +import pytest + +import os from shutil import copytree -from finn.util.basic import make_build_dir + from finn.builder.build_dataflow import build_dataflow_directory -import os +from finn.util.basic import make_build_dir @pytest.mark.slow diff --git a/tests/util/test_data_packing_hls.py b/tests/util/test_data_packing_hls.py index a926bc4068831a552ccfb728511ddda4a8670ca8..3221eda34c85ed9d65b258b6489699cda8400517 100644 --- a/tests/util/test_data_packing_hls.py +++ b/tests/util/test_data_packing_hls.py @@ -26,13 +26,12 @@ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -import os -import shutil -import subprocess - import pytest import numpy as np +import os +import shutil +import subprocess import finn.util.basic as cutil from finn.core.datatype import DataType