From 5bfdafbfdc9e337bd9b04d832bd5d1919c56d7fa Mon Sep 17 00:00:00 2001 From: auphelia <jakobapk@web.de> Date: Mon, 24 Feb 2020 13:35:12 +0000 Subject: [PATCH] [Sphinx documentation] Delte ":hidden:" in source_code.rst toctree --- docs/finn/_build/doctrees/environment.pickle | Bin 133616 -> 133708 bytes docs/finn/_build/doctrees/source_code.doctree | Bin 2571 -> 2572 bytes .../_build/html/_sources/source_code.rst.txt | 3 +- docs/finn/_build/html/searchindex.js | 2 +- docs/finn/_build/html/source_code.html | 119 ++++++++++++++++++ docs/finn/source_code.rst | 3 +- 6 files changed, 122 insertions(+), 5 deletions(-) diff --git a/docs/finn/_build/doctrees/environment.pickle b/docs/finn/_build/doctrees/environment.pickle index a74b617d9b2e11da04db7feb028afbee5b9ac2fb..81f77314589fb488e2d0a03fa239deb04b1fb600 100644 GIT binary patch literal 133708 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 R{G=X0dT}a*zlXKT{{aii=!*aV literal 133616 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 diff --git a/docs/finn/_build/doctrees/source_code.doctree b/docs/finn/_build/doctrees/source_code.doctree index 95aec7805fb5f83d1f499492703465696a4736cb..1a925900f54cec9d6e9cf6ab5c4bee49d0548017 100644 GIT binary patch delta 27 icmeAc=@DURV42Fek;Q_Ev2(I5Q$3S6+vdGYe(V5dfd@hW delta 26 hcmeAX=@wyWV42FWk;Q_Ev176=Q$3^K=6y_l>;Pcf2R#4) diff --git a/docs/finn/_build/html/_sources/source_code.rst.txt b/docs/finn/_build/html/_sources/source_code.rst.txt index 130fff520..372c85b4c 100644 --- a/docs/finn/_build/html/_sources/source_code.rst.txt +++ b/docs/finn/_build/html/_sources/source_code.rst.txt @@ -2,6 +2,5 @@ Source Code ============ .. toctree:: - :hidden: - + source_code/finn diff --git a/docs/finn/_build/html/searchindex.js b/docs/finn/_build/html/searchindex.js index 954ffd140..4fe001cb9 100644 --- a/docs/finn/_build/html/searchindex.js +++ b/docs/finn/_build/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({docnames:["end_to_end_flow","getting_started","index","modules","source_code","source_code/finn","source_code/finn.analysis","source_code/finn.analysis.fpgadataflow","source_code/finn.core","source_code/finn.custom_op","source_code/finn.custom_op.fpgadataflow","source_code/finn.transformation","source_code/finn.transformation.fpgadataflow","source_code/finn.transformation.streamline","source_code/finn.util","source_code/modules"],envversion:{"sphinx.domains.c":1,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":1,"sphinx.domains.javascript":1,"sphinx.domains.math":2,"sphinx.domains.python":1,"sphinx.domains.rst":1,"sphinx.domains.std":1,sphinx:56},filenames:["end_to_end_flow.rst","getting_started.rst","index.rst","modules.rst","source_code.rst","source_code/finn.rst","source_code/finn.analysis.rst","source_code/finn.analysis.fpgadataflow.rst","source_code/finn.core.rst","source_code/finn.custom_op.rst","source_code/finn.custom_op.fpgadataflow.rst","source_code/finn.transformation.rst","source_code/finn.transformation.fpgadataflow.rst","source_code/finn.transformation.streamline.rst","source_code/finn.util.rst","source_code/modules.rst"],objects:{"":{finn:[5,0,0,"-"]},"finn.analysis":{fpgadataflow:[7,0,0,"-"],topology:[6,0,0,"-"],verify_custom_nodes:[6,0,0,"-"]},"finn.analysis.fpgadataflow":{hls_synth_res_estimation:[7,0,0,"-"],res_estimation:[7,0,0,"-"]},"finn.analysis.fpgadataflow.hls_synth_res_estimation":{hls_synth_res_estimation:[7,1,1,""]},"finn.analysis.fpgadataflow.res_estimation":{res_estimation:[7,1,1,""]},"finn.analysis.topology":{all_tensors_f32:[6,1,1,""],get_per_tensor_fanouts:[6,1,1,""],is_linear:[6,1,1,""],node_inputs_in_expected_order:[6,1,1,""]},"finn.analysis.verify_custom_nodes":{verify_nodes:[6,1,1,""]},"finn.core":{datatype:[8,0,0,"-"],execute_custom_node:[8,0,0,"-"],modelwrapper:[8,0,0,"-"],onnx_exec:[8,0,0,"-"],remote_exec:[8,0,0,"-"],rtlsim_exec:[8,0,0,"-"]},"finn.core.datatype":{DataType:[8,2,1,""]},"finn.core.datatype.DataType":{BINARY:[8,3,1,""],BIPOLAR:[8,3,1,""],FLOAT32:[8,3,1,""],INT16:[8,3,1,""],INT2:[8,3,1,""],INT32:[8,3,1,""],INT3:[8,3,1,""],INT4:[8,3,1,""],INT8:[8,3,1,""],TERNARY:[8,3,1,""],UINT16:[8,3,1,""],UINT2:[8,3,1,""],UINT32:[8,3,1,""],UINT3:[8,3,1,""],UINT4:[8,3,1,""],UINT8:[8,3,1,""],allowed:[8,4,1,""],bitwidth:[8,4,1,""],get_hls_datatype_str:[8,4,1,""],get_num_possible_values:[8,4,1,""],get_smallest_possible:[8,4,1,""],is_integer:[8,4,1,""],max:[8,4,1,""],min:[8,4,1,""],signed:[8,4,1,""]},"finn.core.execute_custom_node":{execute_custom_node:[8,1,1,""]},"finn.core.modelwrapper":{ModelWrapper:[8,2,1,""]},"finn.core.modelwrapper.ModelWrapper":{analysis:[8,4,1,""],check_all_tensor_shapes_specified:[8,4,1,""],check_compatibility:[8,4,1,""],find_consumer:[8,4,1,""],find_producer:[8,4,1,""],get_all_tensor_names:[8,4,1,""],get_initializer:[8,4,1,""],get_metadata_prop:[8,4,1,""],get_tensor_datatype:[8,4,1,""],get_tensor_fanout:[8,4,1,""],get_tensor_shape:[8,4,1,""],get_tensor_valueinfo:[8,4,1,""],graph:[8,4,1,""],make_empty_exec_context:[8,4,1,""],make_new_valueinfo_name:[8,4,1,""],model:[8,4,1,""],rename_tensor:[8,4,1,""],save:[8,4,1,""],set_initializer:[8,4,1,""],set_metadata_prop:[8,4,1,""],set_tensor_datatype:[8,4,1,""],set_tensor_shape:[8,4,1,""],transform:[8,4,1,""]},"finn.core.onnx_exec":{compare_execution:[8,1,1,""],execute_node:[8,1,1,""],execute_onnx:[8,1,1,""],execute_onnx_and_make_model:[8,1,1,""]},"finn.core.remote_exec":{remote_exec:[8,1,1,""]},"finn.core.rtlsim_exec":{rtlsim_exec:[8,1,1,""]},"finn.custom_op":{CustomOp:[9,2,1,""],fpgadataflow:[10,0,0,"-"],multithreshold:[9,0,0,"-"],registry:[9,0,0,"-"],streamingdataflowpartition:[9,0,0,"-"],xnorpopcount:[9,0,0,"-"]},"finn.custom_op.CustomOp":{execute_node:[9,4,1,""],get_nodeattr:[9,4,1,""],get_nodeattr_types:[9,4,1,""],infer_node_datatype:[9,4,1,""],make_shape_compatible_op:[9,4,1,""],set_nodeattr:[9,4,1,""],verify_node:[9,4,1,""]},"finn.custom_op.fpgadataflow":{HLSCustomOp:[10,2,1,""],convolutioninputgenerator:[10,0,0,"-"],streamingfclayer_batch:[10,0,0,"-"],streamingmaxpool_batch:[10,0,0,"-"],templates:[10,0,0,"-"],tlastmarker:[10,0,0,"-"]},"finn.custom_op.fpgadataflow.HLSCustomOp":{blackboxfunction:[10,4,1,""],bram_estimation:[10,4,1,""],code_generation_ipgen:[10,4,1,""],code_generation_npysim:[10,4,1,""],compile_singlenode_code:[10,4,1,""],dataoutstrm:[10,4,1,""],defines:[10,4,1,""],docompute:[10,4,1,""],dynamic_input_to_npy:[10,4,1,""],exec_precompiled_singlenode_model:[10,4,1,""],execute_node:[10,4,1,""],generate_params:[10,4,1,""],get_folded_input_shape:[10,4,1,""],get_folded_output_shape:[10,4,1,""],get_instream_width:[10,4,1,""],get_nodeattr_types:[10,4,1,""],get_number_output_values:[10,4,1,""],get_outstream_width:[10,4,1,""],global_includes:[10,4,1,""],ipgen_singlenode_code:[10,4,1,""],lut_estimation:[10,4,1,""],node_res_estimation:[10,4,1,""],npy_to_dynamic_output:[10,4,1,""],pragmas:[10,4,1,""],read_npy_data:[10,4,1,""],reset_rtlsim:[10,4,1,""],rtlsim:[10,4,1,""],save_as_npy:[10,4,1,""],strm_decl:[10,4,1,""],toggle_clk:[10,4,1,""]},"finn.custom_op.fpgadataflow.convolutioninputgenerator":{ConvolutionInputGenerator:[10,2,1,""]},"finn.custom_op.fpgadataflow.convolutioninputgenerator.ConvolutionInputGenerator":{blackboxfunction:[10,4,1,""],bram_estimation:[10,4,1,""],dataoutstrm:[10,4,1,""],defines:[10,4,1,""],docompute:[10,4,1,""],execute_node:[10,4,1,""],get_input_datatype:[10,4,1,""],get_nodeattr_types:[10,4,1,""],get_number_output_values:[10,4,1,""],get_output_datatype:[10,4,1,""],get_stream_width:[10,4,1,""],global_includes:[10,4,1,""],infer_node_datatype:[10,4,1,""],lut_estimation:[10,4,1,""],make_shape_compatible_op:[10,4,1,""],pragmas:[10,4,1,""],read_npy_data:[10,4,1,""],save_as_npy:[10,4,1,""],strm_decl:[10,4,1,""],verify_node:[10,4,1,""]},"finn.custom_op.fpgadataflow.streamingfclayer_batch":{StreamingFCLayer_Batch:[10,2,1,""]},"finn.custom_op.fpgadataflow.streamingfclayer_batch.StreamingFCLayer_Batch":{blackboxfunction:[10,4,1,""],bram_estimation:[10,4,1,""],calc_tmem:[10,4,1,""],calc_wmem:[10,4,1,""],dataoutstrm:[10,4,1,""],defines:[10,4,1,""],docompute:[10,4,1,""],execute_node:[10,4,1,""],generate_params:[10,4,1,""],get_folded_input_shape:[10,4,1,""],get_folded_output_shape:[10,4,1,""],get_hls_compatible_threshold_tensor:[10,4,1,""],get_hls_compatible_weight_tensor:[10,4,1,""],get_input_datatype:[10,4,1,""],get_instream_width:[10,4,1,""],get_nodeattr_types:[10,4,1,""],get_number_output_values:[10,4,1,""],get_output_datatype:[10,4,1,""],get_outstream_width:[10,4,1,""],get_template_param_values:[10,4,1,""],get_weight_datatype:[10,4,1,""],global_includes:[10,4,1,""],infer_node_datatype:[10,4,1,""],lut_estimation:[10,4,1,""],make_shape_compatible_op:[10,4,1,""],pragmas:[10,4,1,""],read_npy_data:[10,4,1,""],save_as_npy:[10,4,1,""],strm_decl:[10,4,1,""],verify_node:[10,4,1,""]},"finn.custom_op.fpgadataflow.streamingmaxpool_batch":{StreamingMaxPool_Batch:[10,2,1,""]},"finn.custom_op.fpgadataflow.streamingmaxpool_batch.StreamingMaxPool_Batch":{blackboxfunction:[10,4,1,""],bram_estimation:[10,4,1,""],dataoutstrm:[10,4,1,""],defines:[10,4,1,""],docompute:[10,4,1,""],get_nodeattr_types:[10,4,1,""],get_number_output_values:[10,4,1,""],global_includes:[10,4,1,""],infer_node_datatype:[10,4,1,""],lut_estimation:[10,4,1,""],make_shape_compatible_op:[10,4,1,""],pragmas:[10,4,1,""],read_npy_data:[10,4,1,""],save_as_npy:[10,4,1,""],strm_decl:[10,4,1,""],verify_node:[10,4,1,""]},"finn.custom_op.fpgadataflow.tlastmarker":{TLastMarker:[10,2,1,""]},"finn.custom_op.fpgadataflow.tlastmarker.TLastMarker":{blackboxfunction:[10,4,1,""],dataoutstrm:[10,4,1,""],defines:[10,4,1,""],docompute:[10,4,1,""],execute_node:[10,4,1,""],get_folded_input_shape:[10,4,1,""],get_folded_output_shape:[10,4,1,""],get_instream_width:[10,4,1,""],get_nodeattr_types:[10,4,1,""],get_number_output_values:[10,4,1,""],get_outstream_width:[10,4,1,""],global_includes:[10,4,1,""],infer_node_datatype:[10,4,1,""],make_shape_compatible_op:[10,4,1,""],pragmas:[10,4,1,""],read_npy_data:[10,4,1,""],save_as_npy:[10,4,1,""],strm_decl:[10,4,1,""],verify_node:[10,4,1,""]},"finn.custom_op.multithreshold":{MultiThreshold:[9,2,1,""],compare:[9,1,1,""],multithreshold:[9,1,1,""]},"finn.custom_op.multithreshold.MultiThreshold":{execute_node:[9,4,1,""],get_nodeattr_types:[9,4,1,""],infer_node_datatype:[9,4,1,""],make_shape_compatible_op:[9,4,1,""],verify_node:[9,4,1,""]},"finn.custom_op.registry":{getCustomOp:[9,1,1,""]},"finn.custom_op.streamingdataflowpartition":{StreamingDataflowPartition:[9,2,1,""]},"finn.custom_op.streamingdataflowpartition.StreamingDataflowPartition":{execute_node:[9,4,1,""],get_nodeattr_types:[9,4,1,""],infer_node_datatype:[9,4,1,""],make_shape_compatible_op:[9,4,1,""],verify_node:[9,4,1,""]},"finn.custom_op.xnorpopcount":{XnorPopcountMatMul:[9,2,1,""],xnorpopcountmatmul:[9,1,1,""]},"finn.custom_op.xnorpopcount.XnorPopcountMatMul":{execute_node:[9,4,1,""],get_nodeattr_types:[9,4,1,""],infer_node_datatype:[9,4,1,""],make_shape_compatible_op:[9,4,1,""],verify_node:[9,4,1,""]},"finn.transformation":{Transformation:[11,2,1,""],batchnorm_to_affine:[11,0,0,"-"],bipolar_to_xnor:[11,0,0,"-"],fold_constants:[11,0,0,"-"],fpgadataflow:[12,0,0,"-"],general:[11,0,0,"-"],infer_datatypes:[11,0,0,"-"],infer_shapes:[11,0,0,"-"],streamline:[13,0,0,"-"]},"finn.transformation.Transformation":{apply:[11,4,1,""]},"finn.transformation.batchnorm_to_affine":{BatchNormToAffine:[11,2,1,""]},"finn.transformation.batchnorm_to_affine.BatchNormToAffine":{apply:[11,4,1,""]},"finn.transformation.bipolar_to_xnor":{ConvertBipolarMatMulToXnorPopcount:[11,2,1,""]},"finn.transformation.bipolar_to_xnor.ConvertBipolarMatMulToXnorPopcount":{apply:[11,4,1,""]},"finn.transformation.fold_constants":{FoldConstants:[11,2,1,""]},"finn.transformation.fold_constants.FoldConstants":{apply:[11,4,1,""]},"finn.transformation.fpgadataflow":{cleanup:[12,0,0,"-"],codegen_ipgen:[12,0,0,"-"],codegen_ipstitch:[12,0,0,"-"],codegen_npysim:[12,0,0,"-"],compile:[12,0,0,"-"],convert_to_hls_layers:[12,0,0,"-"],create_dataflow_partition:[12,0,0,"-"],hlssynth_ipgen:[12,0,0,"-"],insert_tlastmarker:[12,0,0,"-"],make_deployment:[12,0,0,"-"],make_pynq_driver:[12,0,0,"-"],make_pynq_proj:[12,0,0,"-"],set_exec_mode:[12,0,0,"-"],synth_pynq_proj:[12,0,0,"-"],templates:[12,0,0,"-"]},"finn.transformation.fpgadataflow.cleanup":{CleanUp:[12,2,1,""]},"finn.transformation.fpgadataflow.cleanup.CleanUp":{apply:[12,4,1,""]},"finn.transformation.fpgadataflow.codegen_ipgen":{CodeGen_ipgen:[12,2,1,""]},"finn.transformation.fpgadataflow.codegen_ipgen.CodeGen_ipgen":{apply:[12,4,1,""]},"finn.transformation.fpgadataflow.codegen_ipstitch":{CodeGen_ipstitch:[12,2,1,""]},"finn.transformation.fpgadataflow.codegen_ipstitch.CodeGen_ipstitch":{apply:[12,4,1,""]},"finn.transformation.fpgadataflow.codegen_npysim":{CodeGen_npysim:[12,2,1,""]},"finn.transformation.fpgadataflow.codegen_npysim.CodeGen_npysim":{apply:[12,4,1,""]},"finn.transformation.fpgadataflow.compile":{Compile:[12,2,1,""]},"finn.transformation.fpgadataflow.compile.Compile":{apply:[12,4,1,""]},"finn.transformation.fpgadataflow.convert_to_hls_layers":{InferBinaryStreamingFCLayer:[12,2,1,""]},"finn.transformation.fpgadataflow.convert_to_hls_layers.InferBinaryStreamingFCLayer":{apply:[12,4,1,""]},"finn.transformation.fpgadataflow.create_dataflow_partition":{CreateDataflowPartition:[12,2,1,""]},"finn.transformation.fpgadataflow.create_dataflow_partition.CreateDataflowPartition":{apply:[12,4,1,""]},"finn.transformation.fpgadataflow.hlssynth_ipgen":{HLSSynth_IPGen:[12,2,1,""]},"finn.transformation.fpgadataflow.hlssynth_ipgen.HLSSynth_IPGen":{apply:[12,4,1,""]},"finn.transformation.fpgadataflow.insert_tlastmarker":{InsertTLastMarker:[12,2,1,""]},"finn.transformation.fpgadataflow.insert_tlastmarker.InsertTLastMarker":{apply:[12,4,1,""]},"finn.transformation.fpgadataflow.make_deployment":{DeployToPYNQ:[12,2,1,""]},"finn.transformation.fpgadataflow.make_deployment.DeployToPYNQ":{apply:[12,4,1,""]},"finn.transformation.fpgadataflow.make_pynq_driver":{MakePYNQDriver:[12,2,1,""]},"finn.transformation.fpgadataflow.make_pynq_driver.MakePYNQDriver":{apply:[12,4,1,""]},"finn.transformation.fpgadataflow.make_pynq_proj":{MakePYNQProject:[12,2,1,""]},"finn.transformation.fpgadataflow.make_pynq_proj.MakePYNQProject":{apply:[12,4,1,""]},"finn.transformation.fpgadataflow.set_exec_mode":{SetExecMode:[12,2,1,""]},"finn.transformation.fpgadataflow.set_exec_mode.SetExecMode":{apply:[12,4,1,""]},"finn.transformation.fpgadataflow.synth_pynq_proj":{SynthPYNQProject:[12,2,1,""]},"finn.transformation.fpgadataflow.synth_pynq_proj.SynthPYNQProject":{apply:[12,4,1,""]},"finn.transformation.general":{ConvertSubToAdd:[11,2,1,""],GiveRandomTensorNames:[11,2,1,""],GiveReadableTensorNames:[11,2,1,""],GiveUniqueNodeNames:[11,2,1,""]},"finn.transformation.general.ConvertSubToAdd":{apply:[11,4,1,""]},"finn.transformation.general.GiveRandomTensorNames":{apply:[11,4,1,""]},"finn.transformation.general.GiveReadableTensorNames":{apply:[11,4,1,""]},"finn.transformation.general.GiveUniqueNodeNames":{apply:[11,4,1,""]},"finn.transformation.infer_datatypes":{InferDataTypes:[11,2,1,""]},"finn.transformation.infer_datatypes.InferDataTypes":{apply:[11,4,1,""]},"finn.transformation.infer_shapes":{InferShapes:[11,2,1,""]},"finn.transformation.infer_shapes.InferShapes":{apply:[11,4,1,""]},"finn.transformation.streamline":{Streamline:[13,2,1,""],absorb:[13,0,0,"-"],collapse_repeated:[13,0,0,"-"],reorder:[13,0,0,"-"],round_thresholds:[13,0,0,"-"],sign_to_thres:[13,0,0,"-"]},"finn.transformation.streamline.Streamline":{apply:[13,4,1,""]},"finn.transformation.streamline.absorb":{Absorb1BitMulIntoMatMul:[13,2,1,""],AbsorbAddIntoMultiThreshold:[13,2,1,""],AbsorbMulIntoMultiThreshold:[13,2,1,""],FactorOutMulSignMagnitude:[13,2,1,""]},"finn.transformation.streamline.absorb.Absorb1BitMulIntoMatMul":{apply:[13,4,1,""]},"finn.transformation.streamline.absorb.AbsorbAddIntoMultiThreshold":{apply:[13,4,1,""]},"finn.transformation.streamline.absorb.AbsorbMulIntoMultiThreshold":{apply:[13,4,1,""]},"finn.transformation.streamline.absorb.FactorOutMulSignMagnitude":{apply:[13,4,1,""]},"finn.transformation.streamline.collapse_repeated":{CollapseRepeatedAdd:[13,2,1,""],CollapseRepeatedMul:[13,2,1,""],CollapseRepeatedOp:[13,2,1,""]},"finn.transformation.streamline.collapse_repeated.CollapseRepeatedOp":{apply:[13,4,1,""]},"finn.transformation.streamline.reorder":{MoveAddPastMul:[13,2,1,""],MoveScalarAddPastMatMul:[13,2,1,""],MoveScalarMulPastMatMul:[13,2,1,""]},"finn.transformation.streamline.reorder.MoveAddPastMul":{apply:[13,4,1,""]},"finn.transformation.streamline.reorder.MoveScalarAddPastMatMul":{apply:[13,4,1,""]},"finn.transformation.streamline.reorder.MoveScalarMulPastMatMul":{apply:[13,4,1,""]},"finn.transformation.streamline.round_thresholds":{RoundAndClipThresholds:[13,2,1,""]},"finn.transformation.streamline.round_thresholds.RoundAndClipThresholds":{apply:[13,4,1,""]},"finn.transformation.streamline.sign_to_thres":{ConvertSignToThres:[13,2,1,""]},"finn.transformation.streamline.sign_to_thres.ConvertSignToThres":{apply:[13,4,1,""]},"finn.util":{basic:[14,0,0,"-"],data_packing:[14,0,0,"-"],fpgadataflow:[14,0,0,"-"],onnx:[14,0,0,"-"],test:[14,0,0,"-"]},"finn.util.basic":{CppBuilder:[14,2,1,""],calculate_signed_dot_prod_range:[14,1,1,""],gen_finn_dt_tensor:[14,1,1,""],get_by_name:[14,1,1,""],get_finn_root:[14,1,1,""],interleave_matrix_outer_dim_from_partitions:[14,1,1,""],make_build_dir:[14,1,1,""],pad_tensor_to_multiple_of:[14,1,1,""],random_string:[14,1,1,""],remove_by_name:[14,1,1,""],roundup_to_integer_multiple:[14,1,1,""]},"finn.util.basic.CppBuilder":{append_includes:[14,4,1,""],append_sources:[14,4,1,""],build:[14,4,1,""],set_executable_path:[14,4,1,""]},"finn.util.data_packing":{array2hexstring:[14,1,1,""],finnpy_to_packed_bytearray:[14,1,1,""],hexstring2npbytearray:[14,1,1,""],npbytearray2hexstring:[14,1,1,""],npy_to_rtlsim_input:[14,1,1,""],numpy_to_hls_code:[14,1,1,""],pack_innermost_dim_as_hex_string:[14,1,1,""],packed_bytearray_to_finnpy:[14,1,1,""],rtlsim_output_to_npy:[14,1,1,""],unpack_innermost_dim_from_hex_string:[14,1,1,""]},"finn.util.fpgadataflow":{IPGenBuilder:[14,2,1,""],pyverilate_stitched_ip:[14,1,1,""]},"finn.util.fpgadataflow.IPGenBuilder":{append_tcl:[14,4,1,""],build:[14,4,1,""],set_ipgen_path:[14,4,1,""]},"finn.util.onnx":{valueinfo_to_tensor:[14,1,1,""]},"finn.util.test":{get_test_model_def_fxn:[14,1,1,""],get_test_model_trained:[14,1,1,""],get_test_model_untrained:[14,1,1,""],get_trained_checkpoint:[14,1,1,""]},finn:{analysis:[6,0,0,"-"],core:[8,0,0,"-"],custom_op:[9,0,0,"-"],transformation:[11,0,0,"-"],util:[14,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","function","Python function"],"2":["py","class","Python class"],"3":["py","attribute","Python attribute"],"4":["py","method","Python method"]},objtypes:{"0":"py:module","1":"py:function","2":"py:class","3":"py:attribute","4":"py:method"},terms:{"0f01":14,"0x07":14,"0x0e":14,"0x0f01":14,"0xb":14,"0xe":14,"abstract":[9,10,11],"boolean":8,"class":[8,9,10,11,12,13,14],"const":11,"default":[9,10,11],"enum":8,"final":8,"float":14,"function":[1,8,11,14],"import":1,"new":[1,2,8],"return":[6,7,8,9,10,11,13,14],"static":6,"true":[8,14],"try":1,"var":10,For:13,HLS:[2,8],IPs:12,PEs:10,The:[1,2,6,8,11,12,13,14],There:1,Use:[8,14],abc:[9,11],abit:14,about:[2,6,12],abov:1,absorb1bitmulintomatmul:13,absorb:[5,11,12],absorbaddintomultithreshold:13,absorbmulintomultithreshold:13,acceler:[1,12],account:8,action:12,activ:8,add:[11,13],adding:1,addit:1,addition:13,address:12,after:14,aim:13,all:[1,6,8,9,10,11,12,14],all_tensors_f32:6,allow:8,alreadi:12,also:[9,10,12],amount:14,analysi:[3,5,8,15],analysis_fxn:8,anaylsis_fxn:8,ani:[1,8,11,12,14],annot:[6,9,10],anoth:12,append_includ:14,append_sourc:14,append_tcl:14,appli:[8,11,12,13],apply_rep:11,appropri:[1,11],arbitrari:14,architectur:2,argument:1,around:8,arrai:14,array2hexstr:14,arxiv:13,assign:8,associ:[8,11],assum:14,attribut:[6,9,10,12],attribute_nam:[9,10],attributeproto:[9,10],back:1,backend:12,base:[8,9,10,11,12,13,14],basic:[3,5,15],batchnorm:11,batchnorm_to_affin:[3,5,15],batchnormtoaffin:11,been:12,befor:14,between:[10,14],binari:[8,10,12,13,14],bipolar:[8,10,11,13,14],bipolar_to_xnor:[3,5,15],bit:[8,14],bitfil:1,bitwidth:8,blackboxfunct:10,block:12,blott:10,board:12,bool:[6,11],both:14,bram_estim:10,brevita:2,brien:10,browser:1,build:14,built:6,calc_tmem:10,calc_wmem:10,calcul:10,calculate_signed_dot_prod_rang:14,call:[1,8,10,11,12],can:[1,2,8,11,12,13,14],cannot:11,centerpiec:2,certain:6,chang:[1,8,11],check:[6,8,9,10],check_all_tensor_shapes_specifi:8,check_compat:8,cleanup:[5,11],clk:[10,12],clone:[1,14],code:[12,14],code_gen_dir:14,code_generation_ipgen:10,code_generation_npysim:10,codegen_ipgen:[5,11],codegen_ipstitch:[5,11],codegen_npysim:[5,11],collaps:13,collapse_rep:[5,11],collapserepeatedadd:13,collapserepeatedmul:13,collapserepeatedop:13,collect:[1,12],colloqui:2,come:[1,6],command:1,commun:2,compar:[8,9],compare_execut:8,compare_fxn:8,compat:[8,9,10],compil:[2,5,11],compile_singlenode_cod:10,complet:1,compon:2,comput:[1,8],consecut:13,constant:[6,8,13],construct:2,consum:8,contain:[1,2,8,9,12,14],content:[3,15],context:[8,9,10],contribut:2,convent:6,convert:[1,10,11,12,13,14],convert_to_hls_lay:[5,11],convertbipolarmatmultoxnorpopcount:11,convertsigntothr:13,convertsubtoadd:11,convolutioninputgener:[5,9],copi:[8,11,12],core:[3,5,15],corner:2,correct:11,correctli:[1,6,9,10,12],correspond:[2,8,9,10],count:10,cpp_file:14,cppbuilder:14,creat:[1,8,12,14],create_dataflow_partit:[5,11],createdataflowpartit:12,current:[2,8],custom:[1,2,6,8],custom_op:[3,5,15],customop:[9,10],data:[9,12,14],data_pack:[3,5,15],dataflow:[2,8,12],dataoutstrm:10,datatyp:[3,5,9,10,11,14,15],debug:8,declar:11,deep:[2,8,10,11],default_v:[9,10],default_valu:[9,10],defin:10,depend:1,deploi:1,deploy:12,deploytopynq:12,design:[1,12],detail:2,develop:2,dict:[8,9,10],dictionari:[6,8],differ:1,digit:14,dimens:14,dimension:14,dir:[12,14],directori:[1,12,14],distr_pad:14,divis:14,doc:2,docker:14,dockerfil:1,docomput:10,doe:1,don:11,done:6,dot:14,down:1,driver:12,dt_a:14,dt_b:14,dtype:[6,8,9,10,14],dynam:6,dynamic_input_to_npi:10,each:[2,6,8,11,13,14],editor:1,effect:11,either:1,element:14,embed:8,emit:14,emphasi:2,empti:8,end:10,ensur:[10,11,12,14],entir:1,enumer:[8,11],environ:1,equal:[9,10],equival:13,estim:7,even:11,evenli:14,everi:11,everyth:1,exampl:[1,14],excel:1,exec_precompiled_singlenode_model:10,execut:[8,9,10],execute_custom_nod:[3,5,15],execute_nod:[8,9,10],execute_onnx:8,execute_onnx_and_make_model:8,execution_context:8,exist:[9,14],exit:14,expect:[6,8,9,10,12],experi:2,experiment:2,explor:[2,8,10],expos:8,extens:1,extra:[1,6,14],extract:[6,7],f5c6bd32ae93ec103a88152214baedff4ce1850d81065bfc:1,factor:14,factoroutmulsignmagnitud:13,fals:[8,11,14],familiar:1,fan:6,fast:10,fewest:8,field:[12,14],file:[1,8,12,14],filenam:[8,12],find:8,find_consum:8,find_produc:8,finn:[],finn_dt:14,finnpy_to_packed_bytearrai:14,first:[6,13],fix:[11,14],flatten:14,float32:[6,8],fold_const:[3,5,15],foldconst:11,folder:[1,12,14],follow:[1,2,6,12],form:10,forward:1,found:[2,12],four:14,fpga:[1,2],fpgadataflow:[3,5,6,9,11,15],fpgapart:[10,12],framework:[2,10],fraser:10,from:[1,2,7,8,12,14],full:8,further:11,gambardella:10,gen_finn_dt_tensor:14,gener:[2,3,5,12,14,15],generate_param:10,get:[8,9],get_all_tensor_nam:8,get_by_nam:14,get_finn_root:14,get_folded_input_shap:10,get_folded_output_shap:10,get_hls_compatible_threshold_tensor:10,get_hls_compatible_weight_tensor:10,get_hls_datatype_str:8,get_initi:8,get_input_datatyp:10,get_instream_width:10,get_metadata_prop:8,get_nodeattr:9,get_nodeattr_typ:[9,10],get_num_possible_valu:8,get_number_output_valu:10,get_output_datatyp:10,get_outstream_width:10,get_per_tensor_fanout:6,get_smallest_poss:8,get_stream_width:10,get_template_param_valu:10,get_tensor_datatyp:8,get_tensor_fanout:8,get_tensor_shap:8,get_tensor_valueinfo:8,get_test_model_def_fxn:14,get_test_model_train:14,get_test_model_untrain:14,get_trained_checkpoint:14,get_weight_datatyp:10,getcustomop:9,github:2,give:[1,11,13],give_unique_node_nam:11,given:[6,7,8,9,10,14],giverandomtensornam:11,givereadabletensornam:11,giveuniquenodenam:11,global_includ:10,graph:[6,8,9,10,11,12],graphic:2,guarante:11,guid:5,hand:2,has:[6,8,11,12,14],have:[1,6,8,11,12,13],help:1,hex:14,hexstr:14,hexstring2npbytearrai:14,high:1,highli:2,hls_synth_res_estim:[5,6],hls_var_nam:14,hlscustomop:10,hlslib:[2,10],hlssynth_ipgen:[5,11],homepag:2,host:[1,14],how:[5,14],http:1,human:11,immedi:12,implement:8,includ:[2,8,12],indic:[8,9,10,11,12],infer:[1,2,8,9,10,11,14],infer_datatyp:[3,5,15],infer_node_datatyp:[9,10],infer_shap:[3,5,15],inferbinarystreamingfclay:12,inferdatatyp:11,infershap:11,infinit:11,info:[11,14],info_messag:6,inform:[6,12],infrastructur:12,inherit:11,initi:[6,8],innermost:14,inp0:9,inp1:9,inp:10,input:[6,8,9,10,11,13,14],input_dict:8,input_dtyp:14,input_fil:14,insert:[12,14],insert_tlastmark:[5,11],inserttlastmark:12,insid:[1,9],instal:1,instanc:[8,9,10,13],instanti:12,instead:14,int16:8,int2:8,int32:8,int3:8,int4:8,int8:8,integ:[8,13,14],interfac:12,interleav:10,interleave_matrix_outer_dim_from_partit:14,intermedi:[8,11],intern:11,involv:1,ipgen_singlenode_cod:10,ipgenbuild:14,is_integ:8,is_linear:6,item:14,jupyt:2,kei:8,know:11,lab:2,lambda:8,largest:8,launch:1,layer:[11,12],lead:14,learn:[2,10],leeser:10,len:14,let:11,letter:14,librari:2,library_path:14,like:1,linear:[6,8],link:[1,2],list:[6,8],locat:1,look:[1,6],loop:11,lut_estim:10,made:[8,11],magnitud:13,mai:1,make:[1,11,12],make_build_dir:14,make_collapsed_param_fxn:13,make_deepcopi:8,make_deploy:[5,11],make_empty_exec_context:8,make_new_valueinfo_nam:8,make_project:12,make_pynq_driv:[5,11],make_pynq_proj:[5,11],make_shape_compatible_op:[9,10],makepynqdriv:12,makepynqproject:12,mani:1,manipul:8,manual:11,matmul:[11,13],matrix:[10,13,14],max:[8,14],mean:14,meant:11,member:[9,10],metadata_prop:[8,12],min:[8,14],minimum:14,mixtur:6,mkdtemp:14,mode:[1,12],model:[6,7,8,9,10,11,12,13,14],model_a:8,model_b:8,model_was_chang:11,modelproto:[8,12],modelwrapp:[3,5,6,11,15],modul:[3,15],modular:2,more:[2,8,11,14],mount:1,move:13,moveaddpastmul:13,movescalaraddpastmatmul:13,movescalarmulpastmatmul:13,mul:[11,13],multidimension:14,multipl:[11,13,14],multipli:13,multithreshold:[3,5,12,13,15],must:[9,11,12,13,14],mvtu:12,n_partit:14,n_thres_step:10,name:[6,7,8,9,11,14],name_field:14,ndarrai:14,nearest:[13,14],necessari:12,need:[7,9,10,11],neg:[8,13],netnam:14,netron:1,network:[1,2,10],neural:[2,10],new_nam:8,next:13,no_decl:14,node:[6,7,8,9,10,11,12,13],node_inputs_in_expected_ord:6,node_res_estim:10,non:12,none:[8,9,14],note:1,notebook:2,notwithstand:6,now:[6,8],npbytearrai:14,npbytearray2hexstr:14,npy:14,npy_to_dynamic_output:10,npy_to_rtlsim_input:14,number:[8,9,10,14],numpi:[10,14],numpy_to_hls_cod:14,object:[8,14],old_nam:8,onc:11,one:[6,8,12,14],ones:1,onli:[6,8,11,12,13],onlin:1,onnx:[3,5,8,9,10,12,15],onnx_exec:[3,5,15],onnx_model_proto:8,onnx_nod:[9,10],onnxruntim:8,op_nam:13,op_typ:6,open:1,oper:[8,13],ops:[6,13],option:1,order:6,orig_thres_matrix:10,orig_weight_matrix:10,origin:10,other:[8,13],otherwis:[1,8,11,14],out:6,out_bia:9,out_scal:9,out_shap:14,outcom:12,output:[8,9,10,11,14],output_shap:14,overlai:12,overview:2,own:1,pack:[12,14],pack_innermost_dim:14,pack_innermost_dim_as_hex_str:14,packag:[3,15],packed_bytearrai:14,packed_bytearray_to_finnpi:14,packedbit:14,pad:14,pad_tensor_to_multiple_of:14,pad_to_dim:14,pad_to_nbit:14,pair:12,paramet:13,part:[9,14],particular:[9,10,14],partit:8,pass:[5,10],password:12,past:13,path:[10,14],per:12,perform:[1,9,10],permit:[9,10],place:12,platform:12,point:[1,11],port:1,posit:[10,13,14],possibl:[8,12],pragma:10,preced:13,precid:13,precis:14,precomput:11,prefer:8,prefix:14,prepend:14,preusser:10,previous:12,print:1,prior:[11,12,14],process:1,produc:[6,8],product:14,project:[2,12],properti:[6,8],provid:[1,8],pushbutton:1,pynq:12,pynq_driver_dir:12,python:[1,12,14],pyveril:[8,14],pyverilate_stitched_ip:14,qnn:[1,2],quantiz:[2,6,10],random:[11,14],random_str:14,randomli:14,rather:1,reach:11,read:2,read_npy_data:10,readabl:11,recommend:11,refer:2,reflect:1,registri:[3,5,15],relat:2,remot:8,remote_exec:[3,5,15],remov:[12,14],remove_by_nam:14,remove_prefix:14,renam:8,rename_tensor:8,reorder:[5,11],repeat:[11,13],repeatedli:8,replac:11,repo:1,repositori:[1,2],repres:[8,14],represent:14,requir:[8,9,10],res_estim:[5,6],research:2,reset_rtlsim:10,reshap:10,resourc:[1,7],respect:14,result:[6,7,8,11,12,13,14],return_full_exec_context:8,returned_dict:[9,10],revers:14,reverse_endian:14,reverse_inn:14,right:2,root:[1,14],round:[13,14],round_threshold:[5,11],roundandclipthreshold:13,roundup_to_integer_multipl:14,row:10,rtlsim:[8,10],rtlsim_exec:[3,5,15],rtlsim_output_to_npi:14,run:[8,12],run_dock:1,same:[12,14],save:[8,14],save_as_npi:10,scalar:13,scp:12,script:[1,12],second:[12,13],see:[13,14],seen:2,sep:10,separ:2,sequenc:14,server:1,set:[1,8,9,10,12,13,14],set_exec_mod:[5,11],set_executable_path:14,set_initi:8,set_ipgen_path:14,set_metadata_prop:8,set_nodeattr:9,set_tensor_datatyp:8,set_tensor_shap:8,setexecmod:12,settings64:1,sever:1,shape:[8,9,10,11,14],shell:12,should:[1,6,8,11],sign:[8,11,13,14],sign_to_thr:[5,11],sim:[10,14],sim_mod:12,simd:10,simpli:1,sinc:[8,14],singl:[1,8,13,14],small:6,smallest:8,some:[1,2,8,11],someth:1,spawn:1,specif:2,specifi:[8,11,14],split:[12,13,14],stai:2,standard:[8,9,10],stitch:[8,12,14],store:[9,12,14],streamingdataflowpartit:[3,5,12,15],streamingfclayer_batch:[5,9,12],streamingmaxpool_batch:[5,9],streamlin:[5,11],string:[6,14],stringlength:14,strm_decl:10,structur:6,style:2,sub:11,subdirectori:12,subgraph:8,submodul:[3,5,15],subpackag:[3,15],subset:6,success:12,suitabl:10,sure:1,surviv:14,synth_pynq_proj:[5,11],synthesi:[7,12],synthpynqproject:12,take:[1,6,8,11,13,14],taken:[2,8,12],target:[2,12],target_dir:12,targetbit:14,tcl:12,tcl_script:14,tempfil:14,templat:[5,9,11],temporari:14,tensor:[6,8,11,13,14],tensor_fanout:6,tensor_nam:[6,8],tensor_shap:[8,14],tensor_valu:8,termin:[1,12],ternari:8,test:[3,5,11,15],text:1,thei:13,them:[6,12,13],thi:[1,2,6,8,9,10,11,12,14],thing:2,thought:1,threshold:[9,10,13],time:[1,11],tlastmark:[5,9,12],tmem:10,togeth:12,toggle_clk:10,token:1,tool:[1,2],topolog:[3,5,15],train:[1,2],transform:[3,5,8,15],transformed_model:11,travers:6,tune:2,tupl:11,two:[2,8,12,13,14],type:[8,11,14],ubuntu:1,uint16:8,uint2:[8,14],uint32:8,uint3:8,uint4:8,uint8:[8,14],umuroglu:10,under:[2,12],uniqu:11,unpack:[12,14],unpack_innermost_dim_from_hex_str:14,unsign:[8,13],until:8,updat:[2,13],upper:2,use:2,used:[2,8,9,10,14],useful:8,user:11,usernam:12,using:[2,8,11,13,14],util:[3,5,8,9,10,15],val:14,valu:[8,9,10,12,13,14],value_info:8,valueinfo:[8,11],valueinfo_to_tensor:14,valueinfoproto:[8,14],variabl:[1,14],vector:[13,14],verif:6,verifi:[6,9,10],verify_custom_nod:[3,5,15],verify_nod:[6,9,10],version:2,via:8,view:2,visser:10,vivado:[1,2,7,8,12],vivado_path:1,vivado_pynq_proj:12,vivado_stitch_proj:12,wai:[1,6],want:13,wbit:14,websit:2,weight:[8,10],welcom:2,well:1,when:[6,11],where:[1,8,9,10,12,13],whether:[6,8,9,10,11],which:[1,2,8,9,10,12,13,14],width:14,without:1,wmem:10,work:[1,8,14],workspac:1,wrapper:8,write:[1,5],xilinx:2,xnorpopcount:[3,5,15],xnorpopcountmatmul:[9,11,12],you:[1,11],your:[1,11],zero:[8,13,14]},titles:["FINN - End-to-End Flow","Getting Started","FINN","finn","Source Code","finn package","finn.analysis package","finn.analysis.fpgadataflow package","finn.core package","finn.custom_op package","finn.custom_op.fpgadataflow package","finn.transformation package","finn.transformation.fpgadataflow package","finn.transformation.streamline package","finn.util package","finn"],titleterms:{absorb:13,analysi:[6,7],basic:14,batchnorm_to_affin:11,bipolar_to_xnor:11,cleanup:12,code:4,codegen_ipgen:12,codegen_ipstitch:12,codegen_npysim:12,collapse_rep:13,compil:[1,12],content:[5,6,7,8,9,10,11,12,13,14],convert_to_hls_lay:12,convolutioninputgener:10,core:8,create_dataflow_partit:12,custom_op:[9,10],data_pack:14,datatyp:8,develop:1,directli:1,docker:1,end:0,execute_custom_nod:8,experiment:1,finn:[0,1,2,3,5,6,7,8,9,10,11,12,13,14,15],flow:0,fold_const:11,fpgadataflow:[7,10,12,14],gener:11,get:1,guid:11,hls_synth_res_estim:7,hlssynth_ipgen:12,how:[1,6],infer_datatyp:11,infer_shap:11,insert_tlastmark:12,interact:1,jenkin:1,jupyt:1,make_deploy:12,make_pynq_driv:12,make_pynq_proj:12,modelwrapp:8,modul:[5,6,7,8,9,10,11,12,13,14],multithreshold:9,notebook:1,onnx:14,onnx_exec:8,packag:[5,6,7,8,9,10,11,12,13,14],pass:6,registri:9,remote_exec:8,reorder:13,requir:1,res_estim:7,round_threshold:13,rtlsim_exec:8,run:1,set_exec_mod:12,shell:1,sign_to_thr:13,sourc:4,src:[],start:1,streamingdataflowpartit:9,streamingfclayer_batch:10,streamingmaxpool_batch:10,streamlin:13,submodul:[6,7,8,9,10,11,12,13,14],subpackag:[5,6,9,11],suit:1,synth_pynq_proj:12,templat:[10,12],test:[1,14],tlastmark:10,topolog:6,transform:[11,12,13],use:1,using:1,util:14,verify_custom_nod:6,what:2,write:[6,11],xnorpopcount:9}}) \ No newline at end of file +Search.setIndex({docnames:["end_to_end_flow","getting_started","index","modules","source_code","source_code/finn","source_code/finn.analysis","source_code/finn.analysis.fpgadataflow","source_code/finn.core","source_code/finn.custom_op","source_code/finn.custom_op.fpgadataflow","source_code/finn.transformation","source_code/finn.transformation.fpgadataflow","source_code/finn.transformation.streamline","source_code/finn.util","source_code/modules"],envversion:{"sphinx.domains.c":1,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":1,"sphinx.domains.javascript":1,"sphinx.domains.math":2,"sphinx.domains.python":1,"sphinx.domains.rst":1,"sphinx.domains.std":1,sphinx:56},filenames:["end_to_end_flow.rst","getting_started.rst","index.rst","modules.rst","source_code.rst","source_code/finn.rst","source_code/finn.analysis.rst","source_code/finn.analysis.fpgadataflow.rst","source_code/finn.core.rst","source_code/finn.custom_op.rst","source_code/finn.custom_op.fpgadataflow.rst","source_code/finn.transformation.rst","source_code/finn.transformation.fpgadataflow.rst","source_code/finn.transformation.streamline.rst","source_code/finn.util.rst","source_code/modules.rst"],objects:{"":{finn:[5,0,0,"-"]},"finn.analysis":{fpgadataflow:[7,0,0,"-"],topology:[6,0,0,"-"],verify_custom_nodes:[6,0,0,"-"]},"finn.analysis.fpgadataflow":{hls_synth_res_estimation:[7,0,0,"-"],res_estimation:[7,0,0,"-"]},"finn.analysis.fpgadataflow.hls_synth_res_estimation":{hls_synth_res_estimation:[7,1,1,""]},"finn.analysis.fpgadataflow.res_estimation":{res_estimation:[7,1,1,""]},"finn.analysis.topology":{all_tensors_f32:[6,1,1,""],get_per_tensor_fanouts:[6,1,1,""],is_linear:[6,1,1,""],node_inputs_in_expected_order:[6,1,1,""]},"finn.analysis.verify_custom_nodes":{verify_nodes:[6,1,1,""]},"finn.core":{datatype:[8,0,0,"-"],execute_custom_node:[8,0,0,"-"],modelwrapper:[8,0,0,"-"],onnx_exec:[8,0,0,"-"],remote_exec:[8,0,0,"-"],rtlsim_exec:[8,0,0,"-"]},"finn.core.datatype":{DataType:[8,2,1,""]},"finn.core.datatype.DataType":{BINARY:[8,3,1,""],BIPOLAR:[8,3,1,""],FLOAT32:[8,3,1,""],INT16:[8,3,1,""],INT2:[8,3,1,""],INT32:[8,3,1,""],INT3:[8,3,1,""],INT4:[8,3,1,""],INT8:[8,3,1,""],TERNARY:[8,3,1,""],UINT16:[8,3,1,""],UINT2:[8,3,1,""],UINT32:[8,3,1,""],UINT3:[8,3,1,""],UINT4:[8,3,1,""],UINT8:[8,3,1,""],allowed:[8,4,1,""],bitwidth:[8,4,1,""],get_hls_datatype_str:[8,4,1,""],get_num_possible_values:[8,4,1,""],get_smallest_possible:[8,4,1,""],is_integer:[8,4,1,""],max:[8,4,1,""],min:[8,4,1,""],signed:[8,4,1,""]},"finn.core.execute_custom_node":{execute_custom_node:[8,1,1,""]},"finn.core.modelwrapper":{ModelWrapper:[8,2,1,""]},"finn.core.modelwrapper.ModelWrapper":{analysis:[8,4,1,""],check_all_tensor_shapes_specified:[8,4,1,""],check_compatibility:[8,4,1,""],find_consumer:[8,4,1,""],find_producer:[8,4,1,""],get_all_tensor_names:[8,4,1,""],get_initializer:[8,4,1,""],get_metadata_prop:[8,4,1,""],get_tensor_datatype:[8,4,1,""],get_tensor_fanout:[8,4,1,""],get_tensor_shape:[8,4,1,""],get_tensor_valueinfo:[8,4,1,""],graph:[8,4,1,""],make_empty_exec_context:[8,4,1,""],make_new_valueinfo_name:[8,4,1,""],model:[8,4,1,""],rename_tensor:[8,4,1,""],save:[8,4,1,""],set_initializer:[8,4,1,""],set_metadata_prop:[8,4,1,""],set_tensor_datatype:[8,4,1,""],set_tensor_shape:[8,4,1,""],transform:[8,4,1,""]},"finn.core.onnx_exec":{compare_execution:[8,1,1,""],execute_node:[8,1,1,""],execute_onnx:[8,1,1,""],execute_onnx_and_make_model:[8,1,1,""]},"finn.core.remote_exec":{remote_exec:[8,1,1,""]},"finn.core.rtlsim_exec":{rtlsim_exec:[8,1,1,""]},"finn.custom_op":{CustomOp:[9,2,1,""],fpgadataflow:[10,0,0,"-"],multithreshold:[9,0,0,"-"],registry:[9,0,0,"-"],streamingdataflowpartition:[9,0,0,"-"],xnorpopcount:[9,0,0,"-"]},"finn.custom_op.CustomOp":{execute_node:[9,4,1,""],get_nodeattr:[9,4,1,""],get_nodeattr_types:[9,4,1,""],infer_node_datatype:[9,4,1,""],make_shape_compatible_op:[9,4,1,""],set_nodeattr:[9,4,1,""],verify_node:[9,4,1,""]},"finn.custom_op.fpgadataflow":{HLSCustomOp:[10,2,1,""],convolutioninputgenerator:[10,0,0,"-"],streamingfclayer_batch:[10,0,0,"-"],streamingmaxpool_batch:[10,0,0,"-"],templates:[10,0,0,"-"],tlastmarker:[10,0,0,"-"]},"finn.custom_op.fpgadataflow.HLSCustomOp":{blackboxfunction:[10,4,1,""],bram_estimation:[10,4,1,""],code_generation_ipgen:[10,4,1,""],code_generation_npysim:[10,4,1,""],compile_singlenode_code:[10,4,1,""],dataoutstrm:[10,4,1,""],defines:[10,4,1,""],docompute:[10,4,1,""],dynamic_input_to_npy:[10,4,1,""],exec_precompiled_singlenode_model:[10,4,1,""],execute_node:[10,4,1,""],generate_params:[10,4,1,""],get_folded_input_shape:[10,4,1,""],get_folded_output_shape:[10,4,1,""],get_instream_width:[10,4,1,""],get_nodeattr_types:[10,4,1,""],get_number_output_values:[10,4,1,""],get_outstream_width:[10,4,1,""],global_includes:[10,4,1,""],ipgen_singlenode_code:[10,4,1,""],lut_estimation:[10,4,1,""],node_res_estimation:[10,4,1,""],npy_to_dynamic_output:[10,4,1,""],pragmas:[10,4,1,""],read_npy_data:[10,4,1,""],reset_rtlsim:[10,4,1,""],rtlsim:[10,4,1,""],save_as_npy:[10,4,1,""],strm_decl:[10,4,1,""],toggle_clk:[10,4,1,""]},"finn.custom_op.fpgadataflow.convolutioninputgenerator":{ConvolutionInputGenerator:[10,2,1,""]},"finn.custom_op.fpgadataflow.convolutioninputgenerator.ConvolutionInputGenerator":{blackboxfunction:[10,4,1,""],bram_estimation:[10,4,1,""],dataoutstrm:[10,4,1,""],defines:[10,4,1,""],docompute:[10,4,1,""],execute_node:[10,4,1,""],get_input_datatype:[10,4,1,""],get_nodeattr_types:[10,4,1,""],get_number_output_values:[10,4,1,""],get_output_datatype:[10,4,1,""],get_stream_width:[10,4,1,""],global_includes:[10,4,1,""],infer_node_datatype:[10,4,1,""],lut_estimation:[10,4,1,""],make_shape_compatible_op:[10,4,1,""],pragmas:[10,4,1,""],read_npy_data:[10,4,1,""],save_as_npy:[10,4,1,""],strm_decl:[10,4,1,""],verify_node:[10,4,1,""]},"finn.custom_op.fpgadataflow.streamingfclayer_batch":{StreamingFCLayer_Batch:[10,2,1,""]},"finn.custom_op.fpgadataflow.streamingfclayer_batch.StreamingFCLayer_Batch":{blackboxfunction:[10,4,1,""],bram_estimation:[10,4,1,""],calc_tmem:[10,4,1,""],calc_wmem:[10,4,1,""],dataoutstrm:[10,4,1,""],defines:[10,4,1,""],docompute:[10,4,1,""],execute_node:[10,4,1,""],generate_params:[10,4,1,""],get_folded_input_shape:[10,4,1,""],get_folded_output_shape:[10,4,1,""],get_hls_compatible_threshold_tensor:[10,4,1,""],get_hls_compatible_weight_tensor:[10,4,1,""],get_input_datatype:[10,4,1,""],get_instream_width:[10,4,1,""],get_nodeattr_types:[10,4,1,""],get_number_output_values:[10,4,1,""],get_output_datatype:[10,4,1,""],get_outstream_width:[10,4,1,""],get_template_param_values:[10,4,1,""],get_weight_datatype:[10,4,1,""],global_includes:[10,4,1,""],infer_node_datatype:[10,4,1,""],lut_estimation:[10,4,1,""],make_shape_compatible_op:[10,4,1,""],pragmas:[10,4,1,""],read_npy_data:[10,4,1,""],save_as_npy:[10,4,1,""],strm_decl:[10,4,1,""],verify_node:[10,4,1,""]},"finn.custom_op.fpgadataflow.streamingmaxpool_batch":{StreamingMaxPool_Batch:[10,2,1,""]},"finn.custom_op.fpgadataflow.streamingmaxpool_batch.StreamingMaxPool_Batch":{blackboxfunction:[10,4,1,""],bram_estimation:[10,4,1,""],dataoutstrm:[10,4,1,""],defines:[10,4,1,""],docompute:[10,4,1,""],get_nodeattr_types:[10,4,1,""],get_number_output_values:[10,4,1,""],global_includes:[10,4,1,""],infer_node_datatype:[10,4,1,""],lut_estimation:[10,4,1,""],make_shape_compatible_op:[10,4,1,""],pragmas:[10,4,1,""],read_npy_data:[10,4,1,""],save_as_npy:[10,4,1,""],strm_decl:[10,4,1,""],verify_node:[10,4,1,""]},"finn.custom_op.fpgadataflow.tlastmarker":{TLastMarker:[10,2,1,""]},"finn.custom_op.fpgadataflow.tlastmarker.TLastMarker":{blackboxfunction:[10,4,1,""],dataoutstrm:[10,4,1,""],defines:[10,4,1,""],docompute:[10,4,1,""],execute_node:[10,4,1,""],get_folded_input_shape:[10,4,1,""],get_folded_output_shape:[10,4,1,""],get_instream_width:[10,4,1,""],get_nodeattr_types:[10,4,1,""],get_number_output_values:[10,4,1,""],get_outstream_width:[10,4,1,""],global_includes:[10,4,1,""],infer_node_datatype:[10,4,1,""],make_shape_compatible_op:[10,4,1,""],pragmas:[10,4,1,""],read_npy_data:[10,4,1,""],save_as_npy:[10,4,1,""],strm_decl:[10,4,1,""],verify_node:[10,4,1,""]},"finn.custom_op.multithreshold":{MultiThreshold:[9,2,1,""],compare:[9,1,1,""],multithreshold:[9,1,1,""]},"finn.custom_op.multithreshold.MultiThreshold":{execute_node:[9,4,1,""],get_nodeattr_types:[9,4,1,""],infer_node_datatype:[9,4,1,""],make_shape_compatible_op:[9,4,1,""],verify_node:[9,4,1,""]},"finn.custom_op.registry":{getCustomOp:[9,1,1,""]},"finn.custom_op.streamingdataflowpartition":{StreamingDataflowPartition:[9,2,1,""]},"finn.custom_op.streamingdataflowpartition.StreamingDataflowPartition":{execute_node:[9,4,1,""],get_nodeattr_types:[9,4,1,""],infer_node_datatype:[9,4,1,""],make_shape_compatible_op:[9,4,1,""],verify_node:[9,4,1,""]},"finn.custom_op.xnorpopcount":{XnorPopcountMatMul:[9,2,1,""],xnorpopcountmatmul:[9,1,1,""]},"finn.custom_op.xnorpopcount.XnorPopcountMatMul":{execute_node:[9,4,1,""],get_nodeattr_types:[9,4,1,""],infer_node_datatype:[9,4,1,""],make_shape_compatible_op:[9,4,1,""],verify_node:[9,4,1,""]},"finn.transformation":{Transformation:[11,2,1,""],batchnorm_to_affine:[11,0,0,"-"],bipolar_to_xnor:[11,0,0,"-"],fold_constants:[11,0,0,"-"],fpgadataflow:[12,0,0,"-"],general:[11,0,0,"-"],infer_datatypes:[11,0,0,"-"],infer_shapes:[11,0,0,"-"],streamline:[13,0,0,"-"]},"finn.transformation.Transformation":{apply:[11,4,1,""]},"finn.transformation.batchnorm_to_affine":{BatchNormToAffine:[11,2,1,""]},"finn.transformation.batchnorm_to_affine.BatchNormToAffine":{apply:[11,4,1,""]},"finn.transformation.bipolar_to_xnor":{ConvertBipolarMatMulToXnorPopcount:[11,2,1,""]},"finn.transformation.bipolar_to_xnor.ConvertBipolarMatMulToXnorPopcount":{apply:[11,4,1,""]},"finn.transformation.fold_constants":{FoldConstants:[11,2,1,""]},"finn.transformation.fold_constants.FoldConstants":{apply:[11,4,1,""]},"finn.transformation.fpgadataflow":{cleanup:[12,0,0,"-"],codegen_ipgen:[12,0,0,"-"],codegen_ipstitch:[12,0,0,"-"],codegen_npysim:[12,0,0,"-"],compile:[12,0,0,"-"],convert_to_hls_layers:[12,0,0,"-"],create_dataflow_partition:[12,0,0,"-"],hlssynth_ipgen:[12,0,0,"-"],insert_tlastmarker:[12,0,0,"-"],make_deployment:[12,0,0,"-"],make_pynq_driver:[12,0,0,"-"],make_pynq_proj:[12,0,0,"-"],set_exec_mode:[12,0,0,"-"],synth_pynq_proj:[12,0,0,"-"],templates:[12,0,0,"-"]},"finn.transformation.fpgadataflow.cleanup":{CleanUp:[12,2,1,""]},"finn.transformation.fpgadataflow.cleanup.CleanUp":{apply:[12,4,1,""]},"finn.transformation.fpgadataflow.codegen_ipgen":{CodeGen_ipgen:[12,2,1,""]},"finn.transformation.fpgadataflow.codegen_ipgen.CodeGen_ipgen":{apply:[12,4,1,""]},"finn.transformation.fpgadataflow.codegen_ipstitch":{CodeGen_ipstitch:[12,2,1,""]},"finn.transformation.fpgadataflow.codegen_ipstitch.CodeGen_ipstitch":{apply:[12,4,1,""]},"finn.transformation.fpgadataflow.codegen_npysim":{CodeGen_npysim:[12,2,1,""]},"finn.transformation.fpgadataflow.codegen_npysim.CodeGen_npysim":{apply:[12,4,1,""]},"finn.transformation.fpgadataflow.compile":{Compile:[12,2,1,""]},"finn.transformation.fpgadataflow.compile.Compile":{apply:[12,4,1,""]},"finn.transformation.fpgadataflow.convert_to_hls_layers":{InferBinaryStreamingFCLayer:[12,2,1,""]},"finn.transformation.fpgadataflow.convert_to_hls_layers.InferBinaryStreamingFCLayer":{apply:[12,4,1,""]},"finn.transformation.fpgadataflow.create_dataflow_partition":{CreateDataflowPartition:[12,2,1,""]},"finn.transformation.fpgadataflow.create_dataflow_partition.CreateDataflowPartition":{apply:[12,4,1,""]},"finn.transformation.fpgadataflow.hlssynth_ipgen":{HLSSynth_IPGen:[12,2,1,""]},"finn.transformation.fpgadataflow.hlssynth_ipgen.HLSSynth_IPGen":{apply:[12,4,1,""]},"finn.transformation.fpgadataflow.insert_tlastmarker":{InsertTLastMarker:[12,2,1,""]},"finn.transformation.fpgadataflow.insert_tlastmarker.InsertTLastMarker":{apply:[12,4,1,""]},"finn.transformation.fpgadataflow.make_deployment":{DeployToPYNQ:[12,2,1,""]},"finn.transformation.fpgadataflow.make_deployment.DeployToPYNQ":{apply:[12,4,1,""]},"finn.transformation.fpgadataflow.make_pynq_driver":{MakePYNQDriver:[12,2,1,""]},"finn.transformation.fpgadataflow.make_pynq_driver.MakePYNQDriver":{apply:[12,4,1,""]},"finn.transformation.fpgadataflow.make_pynq_proj":{MakePYNQProject:[12,2,1,""]},"finn.transformation.fpgadataflow.make_pynq_proj.MakePYNQProject":{apply:[12,4,1,""]},"finn.transformation.fpgadataflow.set_exec_mode":{SetExecMode:[12,2,1,""]},"finn.transformation.fpgadataflow.set_exec_mode.SetExecMode":{apply:[12,4,1,""]},"finn.transformation.fpgadataflow.synth_pynq_proj":{SynthPYNQProject:[12,2,1,""]},"finn.transformation.fpgadataflow.synth_pynq_proj.SynthPYNQProject":{apply:[12,4,1,""]},"finn.transformation.general":{ConvertSubToAdd:[11,2,1,""],GiveRandomTensorNames:[11,2,1,""],GiveReadableTensorNames:[11,2,1,""],GiveUniqueNodeNames:[11,2,1,""]},"finn.transformation.general.ConvertSubToAdd":{apply:[11,4,1,""]},"finn.transformation.general.GiveRandomTensorNames":{apply:[11,4,1,""]},"finn.transformation.general.GiveReadableTensorNames":{apply:[11,4,1,""]},"finn.transformation.general.GiveUniqueNodeNames":{apply:[11,4,1,""]},"finn.transformation.infer_datatypes":{InferDataTypes:[11,2,1,""]},"finn.transformation.infer_datatypes.InferDataTypes":{apply:[11,4,1,""]},"finn.transformation.infer_shapes":{InferShapes:[11,2,1,""]},"finn.transformation.infer_shapes.InferShapes":{apply:[11,4,1,""]},"finn.transformation.streamline":{Streamline:[13,2,1,""],absorb:[13,0,0,"-"],collapse_repeated:[13,0,0,"-"],reorder:[13,0,0,"-"],round_thresholds:[13,0,0,"-"],sign_to_thres:[13,0,0,"-"]},"finn.transformation.streamline.Streamline":{apply:[13,4,1,""]},"finn.transformation.streamline.absorb":{Absorb1BitMulIntoMatMul:[13,2,1,""],AbsorbAddIntoMultiThreshold:[13,2,1,""],AbsorbMulIntoMultiThreshold:[13,2,1,""],FactorOutMulSignMagnitude:[13,2,1,""]},"finn.transformation.streamline.absorb.Absorb1BitMulIntoMatMul":{apply:[13,4,1,""]},"finn.transformation.streamline.absorb.AbsorbAddIntoMultiThreshold":{apply:[13,4,1,""]},"finn.transformation.streamline.absorb.AbsorbMulIntoMultiThreshold":{apply:[13,4,1,""]},"finn.transformation.streamline.absorb.FactorOutMulSignMagnitude":{apply:[13,4,1,""]},"finn.transformation.streamline.collapse_repeated":{CollapseRepeatedAdd:[13,2,1,""],CollapseRepeatedMul:[13,2,1,""],CollapseRepeatedOp:[13,2,1,""]},"finn.transformation.streamline.collapse_repeated.CollapseRepeatedOp":{apply:[13,4,1,""]},"finn.transformation.streamline.reorder":{MoveAddPastMul:[13,2,1,""],MoveScalarAddPastMatMul:[13,2,1,""],MoveScalarMulPastMatMul:[13,2,1,""]},"finn.transformation.streamline.reorder.MoveAddPastMul":{apply:[13,4,1,""]},"finn.transformation.streamline.reorder.MoveScalarAddPastMatMul":{apply:[13,4,1,""]},"finn.transformation.streamline.reorder.MoveScalarMulPastMatMul":{apply:[13,4,1,""]},"finn.transformation.streamline.round_thresholds":{RoundAndClipThresholds:[13,2,1,""]},"finn.transformation.streamline.round_thresholds.RoundAndClipThresholds":{apply:[13,4,1,""]},"finn.transformation.streamline.sign_to_thres":{ConvertSignToThres:[13,2,1,""]},"finn.transformation.streamline.sign_to_thres.ConvertSignToThres":{apply:[13,4,1,""]},"finn.util":{basic:[14,0,0,"-"],data_packing:[14,0,0,"-"],fpgadataflow:[14,0,0,"-"],onnx:[14,0,0,"-"],test:[14,0,0,"-"]},"finn.util.basic":{CppBuilder:[14,2,1,""],calculate_signed_dot_prod_range:[14,1,1,""],gen_finn_dt_tensor:[14,1,1,""],get_by_name:[14,1,1,""],get_finn_root:[14,1,1,""],interleave_matrix_outer_dim_from_partitions:[14,1,1,""],make_build_dir:[14,1,1,""],pad_tensor_to_multiple_of:[14,1,1,""],random_string:[14,1,1,""],remove_by_name:[14,1,1,""],roundup_to_integer_multiple:[14,1,1,""]},"finn.util.basic.CppBuilder":{append_includes:[14,4,1,""],append_sources:[14,4,1,""],build:[14,4,1,""],set_executable_path:[14,4,1,""]},"finn.util.data_packing":{array2hexstring:[14,1,1,""],finnpy_to_packed_bytearray:[14,1,1,""],hexstring2npbytearray:[14,1,1,""],npbytearray2hexstring:[14,1,1,""],npy_to_rtlsim_input:[14,1,1,""],numpy_to_hls_code:[14,1,1,""],pack_innermost_dim_as_hex_string:[14,1,1,""],packed_bytearray_to_finnpy:[14,1,1,""],rtlsim_output_to_npy:[14,1,1,""],unpack_innermost_dim_from_hex_string:[14,1,1,""]},"finn.util.fpgadataflow":{IPGenBuilder:[14,2,1,""],pyverilate_stitched_ip:[14,1,1,""]},"finn.util.fpgadataflow.IPGenBuilder":{append_tcl:[14,4,1,""],build:[14,4,1,""],set_ipgen_path:[14,4,1,""]},"finn.util.onnx":{valueinfo_to_tensor:[14,1,1,""]},"finn.util.test":{get_test_model_def_fxn:[14,1,1,""],get_test_model_trained:[14,1,1,""],get_test_model_untrained:[14,1,1,""],get_trained_checkpoint:[14,1,1,""]},finn:{analysis:[6,0,0,"-"],core:[8,0,0,"-"],custom_op:[9,0,0,"-"],transformation:[11,0,0,"-"],util:[14,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","function","Python function"],"2":["py","class","Python class"],"3":["py","attribute","Python attribute"],"4":["py","method","Python method"]},objtypes:{"0":"py:module","1":"py:function","2":"py:class","3":"py:attribute","4":"py:method"},terms:{"0f01":14,"0x07":14,"0x0e":14,"0x0f01":14,"0xb":14,"0xe":14,"abstract":[9,10,11],"boolean":8,"class":[8,9,10,11,12,13,14],"const":11,"default":[9,10,11],"enum":8,"final":8,"float":14,"function":[1,8,11,14],"import":1,"new":[1,2,8],"return":[6,7,8,9,10,11,13,14],"static":6,"true":[8,14],"try":1,"var":10,For:13,HLS:[2,8],IPs:12,PEs:10,The:[1,2,6,8,11,12,13,14],There:1,Use:[8,14],abc:[9,11],abit:14,about:[2,6,12],abov:1,absorb1bitmulintomatmul:13,absorb:[4,5,11,12],absorbaddintomultithreshold:13,absorbmulintomultithreshold:13,acceler:[1,12],account:8,action:12,activ:8,add:[11,13],adding:1,addit:1,addition:13,address:12,after:14,aim:13,all:[1,6,8,9,10,11,12,14],all_tensors_f32:6,allow:8,alreadi:12,also:[9,10,12],amount:14,analysi:[3,4,5,8,15],analysis_fxn:8,anaylsis_fxn:8,ani:[1,8,11,12,14],annot:[6,9,10],anoth:12,append_includ:14,append_sourc:14,append_tcl:14,appli:[8,11,12,13],apply_rep:11,appropri:[1,11],arbitrari:14,architectur:2,argument:1,around:8,arrai:14,array2hexstr:14,arxiv:13,assign:8,associ:[8,11],assum:14,attribut:[6,9,10,12],attribute_nam:[9,10],attributeproto:[9,10],back:1,backend:12,base:[8,9,10,11,12,13,14],basic:[3,4,5,15],batchnorm:11,batchnorm_to_affin:[3,4,5,15],batchnormtoaffin:11,been:12,befor:14,between:[10,14],binari:[8,10,12,13,14],bipolar:[8,10,11,13,14],bipolar_to_xnor:[3,4,5,15],bit:[8,14],bitfil:1,bitwidth:8,blackboxfunct:10,block:12,blott:10,board:12,bool:[6,11],both:14,bram_estim:10,brevita:2,brien:10,browser:1,build:14,built:6,calc_tmem:10,calc_wmem:10,calcul:10,calculate_signed_dot_prod_rang:14,call:[1,8,10,11,12],can:[1,2,8,11,12,13,14],cannot:11,centerpiec:2,certain:6,chang:[1,8,11],check:[6,8,9,10],check_all_tensor_shapes_specifi:8,check_compat:8,cleanup:[4,5,11],clk:[10,12],clone:[1,14],code:[12,14],code_gen_dir:14,code_generation_ipgen:10,code_generation_npysim:10,codegen_ipgen:[4,5,11],codegen_ipstitch:[4,5,11],codegen_npysim:[4,5,11],collaps:13,collapse_rep:[4,5,11],collapserepeatedadd:13,collapserepeatedmul:13,collapserepeatedop:13,collect:[1,12],colloqui:2,come:[1,6],command:1,commun:2,compar:[8,9],compare_execut:8,compare_fxn:8,compat:[8,9,10],compil:[2,4,5,11],compile_singlenode_cod:10,complet:1,compon:2,comput:[1,8],consecut:13,constant:[6,8,13],construct:2,consum:8,contain:[1,2,8,9,12,14],content:[3,4,15],context:[8,9,10],contribut:2,convent:6,convert:[1,10,11,12,13,14],convert_to_hls_lay:[4,5,11],convertbipolarmatmultoxnorpopcount:11,convertsigntothr:13,convertsubtoadd:11,convolutioninputgener:[4,5,9],copi:[8,11,12],core:[3,4,5,15],corner:2,correct:11,correctli:[1,6,9,10,12],correspond:[2,8,9,10],count:10,cpp_file:14,cppbuilder:14,creat:[1,8,12,14],create_dataflow_partit:[4,5,11],createdataflowpartit:12,current:[2,8],custom:[1,2,6,8],custom_op:[3,4,5,15],customop:[9,10],data:[9,12,14],data_pack:[3,4,5,15],dataflow:[2,8,12],dataoutstrm:10,datatyp:[3,4,5,9,10,11,14,15],debug:8,declar:11,deep:[2,8,10,11],default_v:[9,10],default_valu:[9,10],defin:10,depend:1,deploi:1,deploy:12,deploytopynq:12,design:[1,12],detail:2,develop:2,dict:[8,9,10],dictionari:[6,8],differ:1,digit:14,dimens:14,dimension:14,dir:[12,14],directori:[1,12,14],distr_pad:14,divis:14,doc:2,docker:14,dockerfil:1,docomput:10,doe:1,don:11,done:6,dot:14,down:1,driver:12,dt_a:14,dt_b:14,dtype:[6,8,9,10,14],dynam:6,dynamic_input_to_npi:10,each:[2,6,8,11,13,14],editor:1,effect:11,either:1,element:14,embed:8,emit:14,emphasi:2,empti:8,end:10,ensur:[10,11,12,14],entir:1,enumer:[8,11],environ:1,equal:[9,10],equival:13,estim:7,even:11,evenli:14,everi:11,everyth:1,exampl:[1,14],excel:1,exec_precompiled_singlenode_model:10,execut:[8,9,10],execute_custom_nod:[3,4,5,15],execute_nod:[8,9,10],execute_onnx:8,execute_onnx_and_make_model:8,execution_context:8,exist:[9,14],exit:14,expect:[6,8,9,10,12],experi:2,experiment:2,explor:[2,8,10],expos:8,extens:1,extra:[1,6,14],extract:[6,7],f5c6bd32ae93ec103a88152214baedff4ce1850d81065bfc:1,factor:14,factoroutmulsignmagnitud:13,fals:[8,11,14],familiar:1,fan:6,fast:10,fewest:8,field:[12,14],file:[1,8,12,14],filenam:[8,12],find:8,find_consum:8,find_produc:8,finn:4,finn_dt:14,finnpy_to_packed_bytearrai:14,first:[6,13],fix:[11,14],flatten:14,float32:[6,8],fold_const:[3,4,5,15],foldconst:11,folder:[1,12,14],follow:[1,2,6,12],form:10,forward:1,found:[2,12],four:14,fpga:[1,2],fpgadataflow:[3,4,5,6,9,11,15],fpgapart:[10,12],framework:[2,10],fraser:10,from:[1,2,7,8,12,14],full:8,further:11,gambardella:10,gen_finn_dt_tensor:14,gener:[2,3,4,5,12,14,15],generate_param:10,get:[8,9],get_all_tensor_nam:8,get_by_nam:14,get_finn_root:14,get_folded_input_shap:10,get_folded_output_shap:10,get_hls_compatible_threshold_tensor:10,get_hls_compatible_weight_tensor:10,get_hls_datatype_str:8,get_initi:8,get_input_datatyp:10,get_instream_width:10,get_metadata_prop:8,get_nodeattr:9,get_nodeattr_typ:[9,10],get_num_possible_valu:8,get_number_output_valu:10,get_output_datatyp:10,get_outstream_width:10,get_per_tensor_fanout:6,get_smallest_poss:8,get_stream_width:10,get_template_param_valu:10,get_tensor_datatyp:8,get_tensor_fanout:8,get_tensor_shap:8,get_tensor_valueinfo:8,get_test_model_def_fxn:14,get_test_model_train:14,get_test_model_untrain:14,get_trained_checkpoint:14,get_weight_datatyp:10,getcustomop:9,github:2,give:[1,11,13],give_unique_node_nam:11,given:[6,7,8,9,10,14],giverandomtensornam:11,givereadabletensornam:11,giveuniquenodenam:11,global_includ:10,graph:[6,8,9,10,11,12],graphic:2,guarante:11,guid:[4,5],hand:2,has:[6,8,11,12,14],have:[1,6,8,11,12,13],help:1,hex:14,hexstr:14,hexstring2npbytearrai:14,high:1,highli:2,hls_synth_res_estim:[4,5,6],hls_var_nam:14,hlscustomop:10,hlslib:[2,10],hlssynth_ipgen:[4,5,11],homepag:2,host:[1,14],how:[4,5,14],http:1,human:11,immedi:12,implement:8,includ:[2,8,12],indic:[8,9,10,11,12],infer:[1,2,8,9,10,11,14],infer_datatyp:[3,4,5,15],infer_node_datatyp:[9,10],infer_shap:[3,4,5,15],inferbinarystreamingfclay:12,inferdatatyp:11,infershap:11,infinit:11,info:[11,14],info_messag:6,inform:[6,12],infrastructur:12,inherit:11,initi:[6,8],innermost:14,inp0:9,inp1:9,inp:10,input:[6,8,9,10,11,13,14],input_dict:8,input_dtyp:14,input_fil:14,insert:[12,14],insert_tlastmark:[4,5,11],inserttlastmark:12,insid:[1,9],instal:1,instanc:[8,9,10,13],instanti:12,instead:14,int16:8,int2:8,int32:8,int3:8,int4:8,int8:8,integ:[8,13,14],interfac:12,interleav:10,interleave_matrix_outer_dim_from_partit:14,intermedi:[8,11],intern:11,involv:1,ipgen_singlenode_cod:10,ipgenbuild:14,is_integ:8,is_linear:6,item:14,jupyt:2,kei:8,know:11,lab:2,lambda:8,largest:8,launch:1,layer:[11,12],lead:14,learn:[2,10],leeser:10,len:14,let:11,letter:14,librari:2,library_path:14,like:1,linear:[6,8],link:[1,2],list:[6,8],locat:1,look:[1,6],loop:11,lut_estim:10,made:[8,11],magnitud:13,mai:1,make:[1,11,12],make_build_dir:14,make_collapsed_param_fxn:13,make_deepcopi:8,make_deploy:[4,5,11],make_empty_exec_context:8,make_new_valueinfo_nam:8,make_project:12,make_pynq_driv:[4,5,11],make_pynq_proj:[4,5,11],make_shape_compatible_op:[9,10],makepynqdriv:12,makepynqproject:12,mani:1,manipul:8,manual:11,matmul:[11,13],matrix:[10,13,14],max:[8,14],mean:14,meant:11,member:[9,10],metadata_prop:[8,12],min:[8,14],minimum:14,mixtur:6,mkdtemp:14,mode:[1,12],model:[6,7,8,9,10,11,12,13,14],model_a:8,model_b:8,model_was_chang:11,modelproto:[8,12],modelwrapp:[3,4,5,6,11,15],modul:[3,4,15],modular:2,more:[2,8,11,14],mount:1,move:13,moveaddpastmul:13,movescalaraddpastmatmul:13,movescalarmulpastmatmul:13,mul:[11,13],multidimension:14,multipl:[11,13,14],multipli:13,multithreshold:[3,4,5,12,13,15],must:[9,11,12,13,14],mvtu:12,n_partit:14,n_thres_step:10,name:[6,7,8,9,11,14],name_field:14,ndarrai:14,nearest:[13,14],necessari:12,need:[7,9,10,11],neg:[8,13],netnam:14,netron:1,network:[1,2,10],neural:[2,10],new_nam:8,next:13,no_decl:14,node:[6,7,8,9,10,11,12,13],node_inputs_in_expected_ord:6,node_res_estim:10,non:12,none:[8,9,14],note:1,notebook:2,notwithstand:6,now:[6,8],npbytearrai:14,npbytearray2hexstr:14,npy:14,npy_to_dynamic_output:10,npy_to_rtlsim_input:14,number:[8,9,10,14],numpi:[10,14],numpy_to_hls_cod:14,object:[8,14],old_nam:8,onc:11,one:[6,8,12,14],ones:1,onli:[6,8,11,12,13],onlin:1,onnx:[3,4,5,8,9,10,12,15],onnx_exec:[3,4,5,15],onnx_model_proto:8,onnx_nod:[9,10],onnxruntim:8,op_nam:13,op_typ:6,open:1,oper:[8,13],ops:[6,13],option:1,order:6,orig_thres_matrix:10,orig_weight_matrix:10,origin:10,other:[8,13],otherwis:[1,8,11,14],out:6,out_bia:9,out_scal:9,out_shap:14,outcom:12,output:[8,9,10,11,14],output_shap:14,overlai:12,overview:2,own:1,pack:[12,14],pack_innermost_dim:14,pack_innermost_dim_as_hex_str:14,packag:[3,4,15],packed_bytearrai:14,packed_bytearray_to_finnpi:14,packedbit:14,pad:14,pad_tensor_to_multiple_of:14,pad_to_dim:14,pad_to_nbit:14,pair:12,paramet:13,part:[9,14],particular:[9,10,14],partit:8,pass:[4,5,10],password:12,past:13,path:[10,14],per:12,perform:[1,9,10],permit:[9,10],place:12,platform:12,point:[1,11],port:1,posit:[10,13,14],possibl:[8,12],pragma:10,preced:13,precid:13,precis:14,precomput:11,prefer:8,prefix:14,prepend:14,preusser:10,previous:12,print:1,prior:[11,12,14],process:1,produc:[6,8],product:14,project:[2,12],properti:[6,8],provid:[1,8],pushbutton:1,pynq:12,pynq_driver_dir:12,python:[1,12,14],pyveril:[8,14],pyverilate_stitched_ip:14,qnn:[1,2],quantiz:[2,6,10],random:[11,14],random_str:14,randomli:14,rather:1,reach:11,read:2,read_npy_data:10,readabl:11,recommend:11,refer:2,reflect:1,registri:[3,4,5,15],relat:2,remot:8,remote_exec:[3,4,5,15],remov:[12,14],remove_by_nam:14,remove_prefix:14,renam:8,rename_tensor:8,reorder:[4,5,11],repeat:[11,13],repeatedli:8,replac:11,repo:1,repositori:[1,2],repres:[8,14],represent:14,requir:[8,9,10],res_estim:[4,5,6],research:2,reset_rtlsim:10,reshap:10,resourc:[1,7],respect:14,result:[6,7,8,11,12,13,14],return_full_exec_context:8,returned_dict:[9,10],revers:14,reverse_endian:14,reverse_inn:14,right:2,root:[1,14],round:[13,14],round_threshold:[4,5,11],roundandclipthreshold:13,roundup_to_integer_multipl:14,row:10,rtlsim:[8,10],rtlsim_exec:[3,4,5,15],rtlsim_output_to_npi:14,run:[8,12],run_dock:1,same:[12,14],save:[8,14],save_as_npi:10,scalar:13,scp:12,script:[1,12],second:[12,13],see:[13,14],seen:2,sep:10,separ:2,sequenc:14,server:1,set:[1,8,9,10,12,13,14],set_exec_mod:[4,5,11],set_executable_path:14,set_initi:8,set_ipgen_path:14,set_metadata_prop:8,set_nodeattr:9,set_tensor_datatyp:8,set_tensor_shap:8,setexecmod:12,settings64:1,sever:1,shape:[8,9,10,11,14],shell:12,should:[1,6,8,11],sign:[8,11,13,14],sign_to_thr:[4,5,11],sim:[10,14],sim_mod:12,simd:10,simpli:1,sinc:[8,14],singl:[1,8,13,14],small:6,smallest:8,some:[1,2,8,11],someth:1,spawn:1,specif:2,specifi:[8,11,14],split:[12,13,14],stai:2,standard:[8,9,10],stitch:[8,12,14],store:[9,12,14],streamingdataflowpartit:[3,4,5,12,15],streamingfclayer_batch:[4,5,9,12],streamingmaxpool_batch:[4,5,9],streamlin:[4,5,11],string:[6,14],stringlength:14,strm_decl:10,structur:6,style:2,sub:11,subdirectori:12,subgraph:8,submodul:[3,4,5,15],subpackag:[3,4,15],subset:6,success:12,suitabl:10,sure:1,surviv:14,synth_pynq_proj:[4,5,11],synthesi:[7,12],synthpynqproject:12,take:[1,6,8,11,13,14],taken:[2,8,12],target:[2,12],target_dir:12,targetbit:14,tcl:12,tcl_script:14,tempfil:14,templat:[4,5,9,11],temporari:14,tensor:[6,8,11,13,14],tensor_fanout:6,tensor_nam:[6,8],tensor_shap:[8,14],tensor_valu:8,termin:[1,12],ternari:8,test:[3,4,5,11,15],text:1,thei:13,them:[6,12,13],thi:[1,2,6,8,9,10,11,12,14],thing:2,thought:1,threshold:[9,10,13],time:[1,11],tlastmark:[4,5,9,12],tmem:10,togeth:12,toggle_clk:10,token:1,tool:[1,2],topolog:[3,4,5,15],train:[1,2],transform:[3,4,5,8,15],transformed_model:11,travers:6,tune:2,tupl:11,two:[2,8,12,13,14],type:[8,11,14],ubuntu:1,uint16:8,uint2:[8,14],uint32:8,uint3:8,uint4:8,uint8:[8,14],umuroglu:10,under:[2,12],uniqu:11,unpack:[12,14],unpack_innermost_dim_from_hex_str:14,unsign:[8,13],until:8,updat:[2,13],upper:2,use:2,used:[2,8,9,10,14],useful:8,user:11,usernam:12,using:[2,8,11,13,14],util:[3,4,5,8,9,10,15],val:14,valu:[8,9,10,12,13,14],value_info:8,valueinfo:[8,11],valueinfo_to_tensor:14,valueinfoproto:[8,14],variabl:[1,14],vector:[13,14],verif:6,verifi:[6,9,10],verify_custom_nod:[3,4,5,15],verify_nod:[6,9,10],version:2,via:8,view:2,visser:10,vivado:[1,2,7,8,12],vivado_path:1,vivado_pynq_proj:12,vivado_stitch_proj:12,wai:[1,6],want:13,wbit:14,websit:2,weight:[8,10],welcom:2,well:1,when:[6,11],where:[1,8,9,10,12,13],whether:[6,8,9,10,11],which:[1,2,8,9,10,12,13,14],width:14,without:1,wmem:10,work:[1,8,14],workspac:1,wrapper:8,write:[1,4,5],xilinx:2,xnorpopcount:[3,4,5,15],xnorpopcountmatmul:[9,11,12],you:[1,11],your:[1,11],zero:[8,13,14]},titles:["FINN - End-to-End Flow","Getting Started","FINN","finn","Source Code","finn package","finn.analysis package","finn.analysis.fpgadataflow package","finn.core package","finn.custom_op package","finn.custom_op.fpgadataflow package","finn.transformation package","finn.transformation.fpgadataflow package","finn.transformation.streamline package","finn.util package","finn"],titleterms:{absorb:13,analysi:[6,7],basic:14,batchnorm_to_affin:11,bipolar_to_xnor:11,cleanup:12,code:4,codegen_ipgen:12,codegen_ipstitch:12,codegen_npysim:12,collapse_rep:13,compil:[1,12],content:[5,6,7,8,9,10,11,12,13,14],convert_to_hls_lay:12,convolutioninputgener:10,core:8,create_dataflow_partit:12,custom_op:[9,10],data_pack:14,datatyp:8,develop:1,directli:1,docker:1,end:0,execute_custom_nod:8,experiment:1,finn:[0,1,2,3,5,6,7,8,9,10,11,12,13,14,15],flow:0,fold_const:11,fpgadataflow:[7,10,12,14],gener:11,get:1,guid:11,hls_synth_res_estim:7,hlssynth_ipgen:12,how:[1,6],infer_datatyp:11,infer_shap:11,insert_tlastmark:12,interact:1,jenkin:1,jupyt:1,make_deploy:12,make_pynq_driv:12,make_pynq_proj:12,modelwrapp:8,modul:[5,6,7,8,9,10,11,12,13,14],multithreshold:9,notebook:1,onnx:14,onnx_exec:8,packag:[5,6,7,8,9,10,11,12,13,14],pass:6,registri:9,remote_exec:8,reorder:13,requir:1,res_estim:7,round_threshold:13,rtlsim_exec:8,run:1,set_exec_mod:12,shell:1,sign_to_thr:13,sourc:4,src:[],start:1,streamingdataflowpartit:9,streamingfclayer_batch:10,streamingmaxpool_batch:10,streamlin:13,submodul:[6,7,8,9,10,11,12,13,14],subpackag:[5,6,9,11],suit:1,synth_pynq_proj:12,templat:[10,12],test:[1,14],tlastmark:10,topolog:6,transform:[11,12,13],use:1,using:1,util:14,verify_custom_nod:6,what:2,write:[6,11],xnorpopcount:9}}) \ No newline at end of file diff --git a/docs/finn/_build/html/source_code.html b/docs/finn/_build/html/source_code.html index 06554f2b5..6662fd362 100644 --- a/docs/finn/_build/html/source_code.html +++ b/docs/finn/_build/html/source_code.html @@ -154,6 +154,125 @@ <div class="section" id="source-code"> <h1>Source Code<a class="headerlink" href="#source-code" title="Permalink to this headline">¶</a></h1> <div class="toctree-wrapper compound"> +<ul> +<li class="toctree-l1"><a class="reference internal" href="source_code/finn.html">finn package</a><ul> +<li class="toctree-l2"><a class="reference internal" href="source_code/finn.html#subpackages">Subpackages</a><ul> +<li class="toctree-l3"><a class="reference internal" href="source_code/finn.analysis.html">finn.analysis package</a><ul> +<li class="toctree-l4"><a class="reference internal" href="source_code/finn.analysis.html#subpackages">Subpackages</a><ul> +<li class="toctree-l5"><a class="reference internal" href="source_code/finn.analysis.fpgadataflow.html">finn.analysis.fpgadataflow package</a><ul> +<li class="toctree-l6"><a class="reference internal" href="source_code/finn.analysis.fpgadataflow.html#submodules">Submodules</a></li> +<li class="toctree-l6"><a class="reference internal" href="source_code/finn.analysis.fpgadataflow.html#module-finn.analysis.fpgadataflow.hls_synth_res_estimation">finn.analysis.fpgadataflow.hls_synth_res_estimation module</a></li> +<li class="toctree-l6"><a class="reference internal" href="source_code/finn.analysis.fpgadataflow.html#module-finn.analysis.fpgadataflow.res_estimation">finn.analysis.fpgadataflow.res_estimation module</a></li> +<li class="toctree-l6"><a class="reference internal" href="source_code/finn.analysis.fpgadataflow.html#module-finn.analysis.fpgadataflow">Module contents</a></li> +</ul> +</li> +</ul> +</li> +<li class="toctree-l4"><a class="reference internal" href="source_code/finn.analysis.html#submodules">Submodules</a></li> +<li class="toctree-l4"><a class="reference internal" href="source_code/finn.analysis.html#module-finn.analysis.topology">finn.analysis.topology module</a></li> +<li class="toctree-l4"><a class="reference internal" href="source_code/finn.analysis.html#module-finn.analysis.verify_custom_nodes">finn.analysis.verify_custom_nodes module</a></li> +<li class="toctree-l4"><a class="reference internal" href="source_code/finn.analysis.html#module-finn.analysis">Module contents</a><ul> +<li class="toctree-l5"><a class="reference internal" href="source_code/finn.analysis.html#how-to-write-an-analysis-pass-for-finn">How to write an analysis pass for FINN</a></li> +</ul> +</li> +</ul> +</li> +<li class="toctree-l3"><a class="reference internal" href="source_code/finn.core.html">finn.core package</a><ul> +<li class="toctree-l4"><a class="reference internal" href="source_code/finn.core.html#submodules">Submodules</a></li> +<li class="toctree-l4"><a class="reference internal" href="source_code/finn.core.html#module-finn.core.datatype">finn.core.datatype module</a></li> +<li class="toctree-l4"><a class="reference internal" href="source_code/finn.core.html#module-finn.core.execute_custom_node">finn.core.execute_custom_node module</a></li> +<li class="toctree-l4"><a class="reference internal" href="source_code/finn.core.html#module-finn.core.modelwrapper">finn.core.modelwrapper module</a></li> +<li class="toctree-l4"><a class="reference internal" href="source_code/finn.core.html#module-finn.core.onnx_exec">finn.core.onnx_exec module</a></li> +<li class="toctree-l4"><a class="reference internal" href="source_code/finn.core.html#module-finn.core.remote_exec">finn.core.remote_exec module</a></li> +<li class="toctree-l4"><a class="reference internal" href="source_code/finn.core.html#module-finn.core.rtlsim_exec">finn.core.rtlsim_exec module</a></li> +<li class="toctree-l4"><a class="reference internal" href="source_code/finn.core.html#module-finn.core">Module contents</a></li> +</ul> +</li> +<li class="toctree-l3"><a class="reference internal" href="source_code/finn.custom_op.html">finn.custom_op package</a><ul> +<li class="toctree-l4"><a class="reference internal" href="source_code/finn.custom_op.html#subpackages">Subpackages</a><ul> +<li class="toctree-l5"><a class="reference internal" href="source_code/finn.custom_op.fpgadataflow.html">finn.custom_op.fpgadataflow package</a><ul> +<li class="toctree-l6"><a class="reference internal" href="source_code/finn.custom_op.fpgadataflow.html#submodules">Submodules</a></li> +<li class="toctree-l6"><a class="reference internal" href="source_code/finn.custom_op.fpgadataflow.html#module-finn.custom_op.fpgadataflow.convolutioninputgenerator">finn.custom_op.fpgadataflow.convolutioninputgenerator module</a></li> +<li class="toctree-l6"><a class="reference internal" href="source_code/finn.custom_op.fpgadataflow.html#module-finn.custom_op.fpgadataflow.streamingfclayer_batch">finn.custom_op.fpgadataflow.streamingfclayer_batch module</a></li> +<li class="toctree-l6"><a class="reference internal" href="source_code/finn.custom_op.fpgadataflow.html#module-finn.custom_op.fpgadataflow.streamingmaxpool_batch">finn.custom_op.fpgadataflow.streamingmaxpool_batch module</a></li> +<li class="toctree-l6"><a class="reference internal" href="source_code/finn.custom_op.fpgadataflow.html#module-finn.custom_op.fpgadataflow.templates">finn.custom_op.fpgadataflow.templates module</a></li> +<li class="toctree-l6"><a class="reference internal" href="source_code/finn.custom_op.fpgadataflow.html#module-finn.custom_op.fpgadataflow.tlastmarker">finn.custom_op.fpgadataflow.tlastmarker module</a></li> +<li class="toctree-l6"><a class="reference internal" href="source_code/finn.custom_op.fpgadataflow.html#module-finn.custom_op.fpgadataflow">Module contents</a></li> +</ul> +</li> +</ul> +</li> +<li class="toctree-l4"><a class="reference internal" href="source_code/finn.custom_op.html#submodules">Submodules</a></li> +<li class="toctree-l4"><a class="reference internal" href="source_code/finn.custom_op.html#module-finn.custom_op.multithreshold">finn.custom_op.multithreshold module</a></li> +<li class="toctree-l4"><a class="reference internal" href="source_code/finn.custom_op.html#module-finn.custom_op.registry">finn.custom_op.registry module</a></li> +<li class="toctree-l4"><a class="reference internal" href="source_code/finn.custom_op.html#module-finn.custom_op.streamingdataflowpartition">finn.custom_op.streamingdataflowpartition module</a></li> +<li class="toctree-l4"><a class="reference internal" href="source_code/finn.custom_op.html#module-finn.custom_op.xnorpopcount">finn.custom_op.xnorpopcount module</a></li> +<li class="toctree-l4"><a class="reference internal" href="source_code/finn.custom_op.html#module-finn.custom_op">Module contents</a></li> +</ul> +</li> +<li class="toctree-l3"><a class="reference internal" href="source_code/finn.transformation.html">finn.transformation package</a><ul> +<li class="toctree-l4"><a class="reference internal" href="source_code/finn.transformation.html#subpackages">Subpackages</a><ul> +<li class="toctree-l5"><a class="reference internal" href="source_code/finn.transformation.fpgadataflow.html">finn.transformation.fpgadataflow package</a><ul> +<li class="toctree-l6"><a class="reference internal" href="source_code/finn.transformation.fpgadataflow.html#submodules">Submodules</a></li> +<li class="toctree-l6"><a class="reference internal" href="source_code/finn.transformation.fpgadataflow.html#module-finn.transformation.fpgadataflow.cleanup">finn.transformation.fpgadataflow.cleanup module</a></li> +<li class="toctree-l6"><a class="reference internal" href="source_code/finn.transformation.fpgadataflow.html#module-finn.transformation.fpgadataflow.codegen_ipgen">finn.transformation.fpgadataflow.codegen_ipgen module</a></li> +<li class="toctree-l6"><a class="reference internal" href="source_code/finn.transformation.fpgadataflow.html#module-finn.transformation.fpgadataflow.codegen_ipstitch">finn.transformation.fpgadataflow.codegen_ipstitch module</a></li> +<li class="toctree-l6"><a class="reference internal" href="source_code/finn.transformation.fpgadataflow.html#module-finn.transformation.fpgadataflow.codegen_npysim">finn.transformation.fpgadataflow.codegen_npysim module</a></li> +<li class="toctree-l6"><a class="reference internal" href="source_code/finn.transformation.fpgadataflow.html#module-finn.transformation.fpgadataflow.compile">finn.transformation.fpgadataflow.compile module</a></li> +<li class="toctree-l6"><a class="reference internal" href="source_code/finn.transformation.fpgadataflow.html#module-finn.transformation.fpgadataflow.convert_to_hls_layers">finn.transformation.fpgadataflow.convert_to_hls_layers module</a></li> +<li class="toctree-l6"><a class="reference internal" href="source_code/finn.transformation.fpgadataflow.html#module-finn.transformation.fpgadataflow.create_dataflow_partition">finn.transformation.fpgadataflow.create_dataflow_partition module</a></li> +<li class="toctree-l6"><a class="reference internal" href="source_code/finn.transformation.fpgadataflow.html#module-finn.transformation.fpgadataflow.hlssynth_ipgen">finn.transformation.fpgadataflow.hlssynth_ipgen module</a></li> +<li class="toctree-l6"><a class="reference internal" href="source_code/finn.transformation.fpgadataflow.html#module-finn.transformation.fpgadataflow.insert_tlastmarker">finn.transformation.fpgadataflow.insert_tlastmarker module</a></li> +<li class="toctree-l6"><a class="reference internal" href="source_code/finn.transformation.fpgadataflow.html#module-finn.transformation.fpgadataflow.make_deployment">finn.transformation.fpgadataflow.make_deployment module</a></li> +<li class="toctree-l6"><a class="reference internal" href="source_code/finn.transformation.fpgadataflow.html#module-finn.transformation.fpgadataflow.make_pynq_driver">finn.transformation.fpgadataflow.make_pynq_driver module</a></li> +<li class="toctree-l6"><a class="reference internal" href="source_code/finn.transformation.fpgadataflow.html#module-finn.transformation.fpgadataflow.make_pynq_proj">finn.transformation.fpgadataflow.make_pynq_proj module</a></li> +<li class="toctree-l6"><a class="reference internal" href="source_code/finn.transformation.fpgadataflow.html#module-finn.transformation.fpgadataflow.set_exec_mode">finn.transformation.fpgadataflow.set_exec_mode module</a></li> +<li class="toctree-l6"><a class="reference internal" href="source_code/finn.transformation.fpgadataflow.html#module-finn.transformation.fpgadataflow.synth_pynq_proj">finn.transformation.fpgadataflow.synth_pynq_proj module</a></li> +<li class="toctree-l6"><a class="reference internal" href="source_code/finn.transformation.fpgadataflow.html#module-finn.transformation.fpgadataflow.templates">finn.transformation.fpgadataflow.templates module</a></li> +<li class="toctree-l6"><a class="reference internal" href="source_code/finn.transformation.fpgadataflow.html#module-finn.transformation.fpgadataflow">Module contents</a></li> +</ul> +</li> +<li class="toctree-l5"><a class="reference internal" href="source_code/finn.transformation.streamline.html">finn.transformation.streamline package</a><ul> +<li class="toctree-l6"><a class="reference internal" href="source_code/finn.transformation.streamline.html#submodules">Submodules</a></li> +<li class="toctree-l6"><a class="reference internal" href="source_code/finn.transformation.streamline.html#module-finn.transformation.streamline.absorb">finn.transformation.streamline.absorb module</a></li> +<li class="toctree-l6"><a class="reference internal" href="source_code/finn.transformation.streamline.html#module-finn.transformation.streamline.collapse_repeated">finn.transformation.streamline.collapse_repeated module</a></li> +<li class="toctree-l6"><a class="reference internal" href="source_code/finn.transformation.streamline.html#module-finn.transformation.streamline.reorder">finn.transformation.streamline.reorder module</a></li> +<li class="toctree-l6"><a class="reference internal" href="source_code/finn.transformation.streamline.html#module-finn.transformation.streamline.round_thresholds">finn.transformation.streamline.round_thresholds module</a></li> +<li class="toctree-l6"><a class="reference internal" href="source_code/finn.transformation.streamline.html#module-finn.transformation.streamline.sign_to_thres">finn.transformation.streamline.sign_to_thres module</a></li> +<li class="toctree-l6"><a class="reference internal" href="source_code/finn.transformation.streamline.html#module-finn.transformation.streamline">Module contents</a></li> +</ul> +</li> +</ul> +</li> +<li class="toctree-l4"><a class="reference internal" href="source_code/finn.transformation.html#submodules">Submodules</a></li> +<li class="toctree-l4"><a class="reference internal" href="source_code/finn.transformation.html#module-finn.transformation.batchnorm_to_affine">finn.transformation.batchnorm_to_affine module</a></li> +<li class="toctree-l4"><a class="reference internal" href="source_code/finn.transformation.html#module-finn.transformation.bipolar_to_xnor">finn.transformation.bipolar_to_xnor module</a></li> +<li class="toctree-l4"><a class="reference internal" href="source_code/finn.transformation.html#module-finn.transformation.fold_constants">finn.transformation.fold_constants module</a></li> +<li class="toctree-l4"><a class="reference internal" href="source_code/finn.transformation.html#module-finn.transformation.general">finn.transformation.general module</a></li> +<li class="toctree-l4"><a class="reference internal" href="source_code/finn.transformation.html#module-finn.transformation.infer_datatypes">finn.transformation.infer_datatypes module</a></li> +<li class="toctree-l4"><a class="reference internal" href="source_code/finn.transformation.html#module-finn.transformation.infer_shapes">finn.transformation.infer_shapes module</a></li> +<li class="toctree-l4"><a class="reference internal" href="source_code/finn.transformation.html#module-finn.transformation">Module contents</a><ul> +<li class="toctree-l5"><a class="reference internal" href="source_code/finn.transformation.html#guide-to-writing-finn-transformations">Guide to writing FINN transformations</a></li> +</ul> +</li> +</ul> +</li> +<li class="toctree-l3"><a class="reference internal" href="source_code/finn.util.html">finn.util package</a><ul> +<li class="toctree-l4"><a class="reference internal" href="source_code/finn.util.html#submodules">Submodules</a></li> +<li class="toctree-l4"><a class="reference internal" href="source_code/finn.util.html#module-finn.util.basic">finn.util.basic module</a></li> +<li class="toctree-l4"><a class="reference internal" href="source_code/finn.util.html#module-finn.util.data_packing">finn.util.data_packing module</a></li> +<li class="toctree-l4"><a class="reference internal" href="source_code/finn.util.html#module-finn.util.fpgadataflow">finn.util.fpgadataflow module</a></li> +<li class="toctree-l4"><a class="reference internal" href="source_code/finn.util.html#module-finn.util.onnx">finn.util.onnx module</a></li> +<li class="toctree-l4"><a class="reference internal" href="source_code/finn.util.html#module-finn.util.test">finn.util.test module</a></li> +<li class="toctree-l4"><a class="reference internal" href="source_code/finn.util.html#module-finn.util">Module contents</a></li> +</ul> +</li> +</ul> +</li> +<li class="toctree-l2"><a class="reference internal" href="source_code/finn.html#module-finn">Module contents</a></li> +</ul> +</li> +</ul> </div> </div> diff --git a/docs/finn/source_code.rst b/docs/finn/source_code.rst index 130fff520..372c85b4c 100644 --- a/docs/finn/source_code.rst +++ b/docs/finn/source_code.rst @@ -2,6 +2,5 @@ Source Code ============ .. toctree:: - :hidden: - + source_code/finn -- GitLab